xref: /openbmc/linux/sound/pci/hda/patch_realtek.c (revision c4c3c32d)
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 <linux/ctype.h>
22 #include <sound/core.h>
23 #include <sound/jack.h>
24 #include <sound/hda_codec.h>
25 #include "hda_local.h"
26 #include "hda_auto_parser.h"
27 #include "hda_jack.h"
28 #include "hda_generic.h"
29 #include "hda_component.h"
30 
31 /* keep halting ALC5505 DSP, for power saving */
32 #define HALT_REALTEK_ALC5505
33 
34 /* extra amp-initialization sequence types */
35 enum {
36 	ALC_INIT_UNDEFINED,
37 	ALC_INIT_NONE,
38 	ALC_INIT_DEFAULT,
39 };
40 
41 enum {
42 	ALC_HEADSET_MODE_UNKNOWN,
43 	ALC_HEADSET_MODE_UNPLUGGED,
44 	ALC_HEADSET_MODE_HEADSET,
45 	ALC_HEADSET_MODE_MIC,
46 	ALC_HEADSET_MODE_HEADPHONE,
47 };
48 
49 enum {
50 	ALC_HEADSET_TYPE_UNKNOWN,
51 	ALC_HEADSET_TYPE_CTIA,
52 	ALC_HEADSET_TYPE_OMTP,
53 };
54 
55 enum {
56 	ALC_KEY_MICMUTE_INDEX,
57 };
58 
59 struct alc_customize_define {
60 	unsigned int  sku_cfg;
61 	unsigned char port_connectivity;
62 	unsigned char check_sum;
63 	unsigned char customization;
64 	unsigned char external_amp;
65 	unsigned int  enable_pcbeep:1;
66 	unsigned int  platform_type:1;
67 	unsigned int  swap:1;
68 	unsigned int  override:1;
69 	unsigned int  fixup:1; /* Means that this sku is set by driver, not read from hw */
70 };
71 
72 struct alc_coef_led {
73 	unsigned int idx;
74 	unsigned int mask;
75 	unsigned int on;
76 	unsigned int off;
77 };
78 
79 struct alc_spec {
80 	struct hda_gen_spec gen; /* must be at head */
81 
82 	/* codec parameterization */
83 	struct alc_customize_define cdefine;
84 	unsigned int parse_flags; /* flag for snd_hda_parse_pin_defcfg() */
85 
86 	/* GPIO bits */
87 	unsigned int gpio_mask;
88 	unsigned int gpio_dir;
89 	unsigned int gpio_data;
90 	bool gpio_write_delay;	/* add a delay before writing gpio_data */
91 
92 	/* mute LED for HP laptops, see vref_mute_led_set() */
93 	int mute_led_polarity;
94 	int micmute_led_polarity;
95 	hda_nid_t mute_led_nid;
96 	hda_nid_t cap_mute_led_nid;
97 
98 	unsigned int gpio_mute_led_mask;
99 	unsigned int gpio_mic_led_mask;
100 	struct alc_coef_led mute_led_coef;
101 	struct alc_coef_led mic_led_coef;
102 	struct mutex coef_mutex;
103 
104 	hda_nid_t headset_mic_pin;
105 	hda_nid_t headphone_mic_pin;
106 	int current_headset_mode;
107 	int current_headset_type;
108 
109 	/* hooks */
110 	void (*init_hook)(struct hda_codec *codec);
111 #ifdef CONFIG_PM
112 	void (*power_hook)(struct hda_codec *codec);
113 #endif
114 	void (*shutup)(struct hda_codec *codec);
115 
116 	int init_amp;
117 	int codec_variant;	/* flag for other variants */
118 	unsigned int has_alc5505_dsp:1;
119 	unsigned int no_depop_delay:1;
120 	unsigned int done_hp_init:1;
121 	unsigned int no_shutup_pins:1;
122 	unsigned int ultra_low_power:1;
123 	unsigned int has_hs_key:1;
124 	unsigned int no_internal_mic_pin:1;
125 	unsigned int en_3kpull_low:1;
126 
127 	/* for PLL fix */
128 	hda_nid_t pll_nid;
129 	unsigned int pll_coef_idx, pll_coef_bit;
130 	unsigned int coef0;
131 	struct input_dev *kb_dev;
132 	u8 alc_mute_keycode_map[1];
133 
134 	/* component binding */
135 	struct component_match *match;
136 	struct hda_component comps[HDA_MAX_COMPONENTS];
137 };
138 
139 /*
140  * COEF access helper functions
141  */
142 
143 static void coef_mutex_lock(struct hda_codec *codec)
144 {
145 	struct alc_spec *spec = codec->spec;
146 
147 	snd_hda_power_up_pm(codec);
148 	mutex_lock(&spec->coef_mutex);
149 }
150 
151 static void coef_mutex_unlock(struct hda_codec *codec)
152 {
153 	struct alc_spec *spec = codec->spec;
154 
155 	mutex_unlock(&spec->coef_mutex);
156 	snd_hda_power_down_pm(codec);
157 }
158 
159 static int __alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
160 				 unsigned int coef_idx)
161 {
162 	unsigned int val;
163 
164 	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
165 	val = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PROC_COEF, 0);
166 	return val;
167 }
168 
169 static int alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
170 			       unsigned int coef_idx)
171 {
172 	unsigned int val;
173 
174 	coef_mutex_lock(codec);
175 	val = __alc_read_coefex_idx(codec, nid, coef_idx);
176 	coef_mutex_unlock(codec);
177 	return val;
178 }
179 
180 #define alc_read_coef_idx(codec, coef_idx) \
181 	alc_read_coefex_idx(codec, 0x20, coef_idx)
182 
183 static void __alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
184 				   unsigned int coef_idx, unsigned int coef_val)
185 {
186 	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
187 	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PROC_COEF, coef_val);
188 }
189 
190 static void alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
191 				 unsigned int coef_idx, unsigned int coef_val)
192 {
193 	coef_mutex_lock(codec);
194 	__alc_write_coefex_idx(codec, nid, coef_idx, coef_val);
195 	coef_mutex_unlock(codec);
196 }
197 
198 #define alc_write_coef_idx(codec, coef_idx, coef_val) \
199 	alc_write_coefex_idx(codec, 0x20, coef_idx, coef_val)
200 
201 static void __alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
202 				    unsigned int coef_idx, unsigned int mask,
203 				    unsigned int bits_set)
204 {
205 	unsigned int val = __alc_read_coefex_idx(codec, nid, coef_idx);
206 
207 	if (val != -1)
208 		__alc_write_coefex_idx(codec, nid, coef_idx,
209 				       (val & ~mask) | bits_set);
210 }
211 
212 static void alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
213 				  unsigned int coef_idx, unsigned int mask,
214 				  unsigned int bits_set)
215 {
216 	coef_mutex_lock(codec);
217 	__alc_update_coefex_idx(codec, nid, coef_idx, mask, bits_set);
218 	coef_mutex_unlock(codec);
219 }
220 
221 #define alc_update_coef_idx(codec, coef_idx, mask, bits_set)	\
222 	alc_update_coefex_idx(codec, 0x20, coef_idx, mask, bits_set)
223 
224 /* a special bypass for COEF 0; read the cached value at the second time */
225 static unsigned int alc_get_coef0(struct hda_codec *codec)
226 {
227 	struct alc_spec *spec = codec->spec;
228 
229 	if (!spec->coef0)
230 		spec->coef0 = alc_read_coef_idx(codec, 0);
231 	return spec->coef0;
232 }
233 
234 /* coef writes/updates batch */
235 struct coef_fw {
236 	unsigned char nid;
237 	unsigned char idx;
238 	unsigned short mask;
239 	unsigned short val;
240 };
241 
242 #define UPDATE_COEFEX(_nid, _idx, _mask, _val) \
243 	{ .nid = (_nid), .idx = (_idx), .mask = (_mask), .val = (_val) }
244 #define WRITE_COEFEX(_nid, _idx, _val) UPDATE_COEFEX(_nid, _idx, -1, _val)
245 #define WRITE_COEF(_idx, _val) WRITE_COEFEX(0x20, _idx, _val)
246 #define UPDATE_COEF(_idx, _mask, _val) UPDATE_COEFEX(0x20, _idx, _mask, _val)
247 
248 static void alc_process_coef_fw(struct hda_codec *codec,
249 				const struct coef_fw *fw)
250 {
251 	coef_mutex_lock(codec);
252 	for (; fw->nid; fw++) {
253 		if (fw->mask == (unsigned short)-1)
254 			__alc_write_coefex_idx(codec, fw->nid, fw->idx, fw->val);
255 		else
256 			__alc_update_coefex_idx(codec, fw->nid, fw->idx,
257 						fw->mask, fw->val);
258 	}
259 	coef_mutex_unlock(codec);
260 }
261 
262 /*
263  * GPIO setup tables, used in initialization
264  */
265 
266 /* Enable GPIO mask and set output */
267 static void alc_setup_gpio(struct hda_codec *codec, unsigned int mask)
268 {
269 	struct alc_spec *spec = codec->spec;
270 
271 	spec->gpio_mask |= mask;
272 	spec->gpio_dir |= mask;
273 	spec->gpio_data |= mask;
274 }
275 
276 static void alc_write_gpio_data(struct hda_codec *codec)
277 {
278 	struct alc_spec *spec = codec->spec;
279 
280 	snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
281 			    spec->gpio_data);
282 }
283 
284 static void alc_update_gpio_data(struct hda_codec *codec, unsigned int mask,
285 				 bool on)
286 {
287 	struct alc_spec *spec = codec->spec;
288 	unsigned int oldval = spec->gpio_data;
289 
290 	if (on)
291 		spec->gpio_data |= mask;
292 	else
293 		spec->gpio_data &= ~mask;
294 	if (oldval != spec->gpio_data)
295 		alc_write_gpio_data(codec);
296 }
297 
298 static void alc_write_gpio(struct hda_codec *codec)
299 {
300 	struct alc_spec *spec = codec->spec;
301 
302 	if (!spec->gpio_mask)
303 		return;
304 
305 	snd_hda_codec_write(codec, codec->core.afg, 0,
306 			    AC_VERB_SET_GPIO_MASK, spec->gpio_mask);
307 	snd_hda_codec_write(codec, codec->core.afg, 0,
308 			    AC_VERB_SET_GPIO_DIRECTION, spec->gpio_dir);
309 	if (spec->gpio_write_delay)
310 		msleep(1);
311 	alc_write_gpio_data(codec);
312 }
313 
314 static void alc_fixup_gpio(struct hda_codec *codec, int action,
315 			   unsigned int mask)
316 {
317 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
318 		alc_setup_gpio(codec, mask);
319 }
320 
321 static void alc_fixup_gpio1(struct hda_codec *codec,
322 			    const struct hda_fixup *fix, int action)
323 {
324 	alc_fixup_gpio(codec, action, 0x01);
325 }
326 
327 static void alc_fixup_gpio2(struct hda_codec *codec,
328 			    const struct hda_fixup *fix, int action)
329 {
330 	alc_fixup_gpio(codec, action, 0x02);
331 }
332 
333 static void alc_fixup_gpio3(struct hda_codec *codec,
334 			    const struct hda_fixup *fix, int action)
335 {
336 	alc_fixup_gpio(codec, action, 0x03);
337 }
338 
339 static void alc_fixup_gpio4(struct hda_codec *codec,
340 			    const struct hda_fixup *fix, int action)
341 {
342 	alc_fixup_gpio(codec, action, 0x04);
343 }
344 
345 static void alc_fixup_micmute_led(struct hda_codec *codec,
346 				  const struct hda_fixup *fix, int action)
347 {
348 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
349 		snd_hda_gen_add_micmute_led_cdev(codec, NULL);
350 }
351 
352 /*
353  * Fix hardware PLL issue
354  * On some codecs, the analog PLL gating control must be off while
355  * the default value is 1.
356  */
357 static void alc_fix_pll(struct hda_codec *codec)
358 {
359 	struct alc_spec *spec = codec->spec;
360 
361 	if (spec->pll_nid)
362 		alc_update_coefex_idx(codec, spec->pll_nid, spec->pll_coef_idx,
363 				      1 << spec->pll_coef_bit, 0);
364 }
365 
366 static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
367 			     unsigned int coef_idx, unsigned int coef_bit)
368 {
369 	struct alc_spec *spec = codec->spec;
370 	spec->pll_nid = nid;
371 	spec->pll_coef_idx = coef_idx;
372 	spec->pll_coef_bit = coef_bit;
373 	alc_fix_pll(codec);
374 }
375 
376 /* update the master volume per volume-knob's unsol event */
377 static void alc_update_knob_master(struct hda_codec *codec,
378 				   struct hda_jack_callback *jack)
379 {
380 	unsigned int val;
381 	struct snd_kcontrol *kctl;
382 	struct snd_ctl_elem_value *uctl;
383 
384 	kctl = snd_hda_find_mixer_ctl(codec, "Master Playback Volume");
385 	if (!kctl)
386 		return;
387 	uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
388 	if (!uctl)
389 		return;
390 	val = snd_hda_codec_read(codec, jack->nid, 0,
391 				 AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
392 	val &= HDA_AMP_VOLMASK;
393 	uctl->value.integer.value[0] = val;
394 	uctl->value.integer.value[1] = val;
395 	kctl->put(kctl, uctl);
396 	kfree(uctl);
397 }
398 
399 static void alc880_unsol_event(struct hda_codec *codec, unsigned int res)
400 {
401 	/* For some reason, the res given from ALC880 is broken.
402 	   Here we adjust it properly. */
403 	snd_hda_jack_unsol_event(codec, res >> 2);
404 }
405 
406 /* Change EAPD to verb control */
407 static void alc_fill_eapd_coef(struct hda_codec *codec)
408 {
409 	int coef;
410 
411 	coef = alc_get_coef0(codec);
412 
413 	switch (codec->core.vendor_id) {
414 	case 0x10ec0262:
415 		alc_update_coef_idx(codec, 0x7, 0, 1<<5);
416 		break;
417 	case 0x10ec0267:
418 	case 0x10ec0268:
419 		alc_update_coef_idx(codec, 0x7, 0, 1<<13);
420 		break;
421 	case 0x10ec0269:
422 		if ((coef & 0x00f0) == 0x0010)
423 			alc_update_coef_idx(codec, 0xd, 0, 1<<14);
424 		if ((coef & 0x00f0) == 0x0020)
425 			alc_update_coef_idx(codec, 0x4, 1<<15, 0);
426 		if ((coef & 0x00f0) == 0x0030)
427 			alc_update_coef_idx(codec, 0x10, 1<<9, 0);
428 		break;
429 	case 0x10ec0280:
430 	case 0x10ec0284:
431 	case 0x10ec0290:
432 	case 0x10ec0292:
433 		alc_update_coef_idx(codec, 0x4, 1<<15, 0);
434 		break;
435 	case 0x10ec0225:
436 	case 0x10ec0295:
437 	case 0x10ec0299:
438 		alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
439 		fallthrough;
440 	case 0x10ec0215:
441 	case 0x10ec0230:
442 	case 0x10ec0233:
443 	case 0x10ec0235:
444 	case 0x10ec0236:
445 	case 0x10ec0245:
446 	case 0x10ec0255:
447 	case 0x10ec0256:
448 	case 0x19e58326:
449 	case 0x10ec0257:
450 	case 0x10ec0282:
451 	case 0x10ec0283:
452 	case 0x10ec0286:
453 	case 0x10ec0288:
454 	case 0x10ec0285:
455 	case 0x10ec0298:
456 	case 0x10ec0289:
457 	case 0x10ec0300:
458 		alc_update_coef_idx(codec, 0x10, 1<<9, 0);
459 		break;
460 	case 0x10ec0275:
461 		alc_update_coef_idx(codec, 0xe, 0, 1<<0);
462 		break;
463 	case 0x10ec0287:
464 		alc_update_coef_idx(codec, 0x10, 1<<9, 0);
465 		alc_write_coef_idx(codec, 0x8, 0x4ab7);
466 		break;
467 	case 0x10ec0293:
468 		alc_update_coef_idx(codec, 0xa, 1<<13, 0);
469 		break;
470 	case 0x10ec0234:
471 	case 0x10ec0274:
472 	case 0x10ec0294:
473 	case 0x10ec0700:
474 	case 0x10ec0701:
475 	case 0x10ec0703:
476 	case 0x10ec0711:
477 		alc_update_coef_idx(codec, 0x10, 1<<15, 0);
478 		break;
479 	case 0x10ec0662:
480 		if ((coef & 0x00f0) == 0x0030)
481 			alc_update_coef_idx(codec, 0x4, 1<<10, 0); /* EAPD Ctrl */
482 		break;
483 	case 0x10ec0272:
484 	case 0x10ec0273:
485 	case 0x10ec0663:
486 	case 0x10ec0665:
487 	case 0x10ec0670:
488 	case 0x10ec0671:
489 	case 0x10ec0672:
490 		alc_update_coef_idx(codec, 0xd, 0, 1<<14); /* EAPD Ctrl */
491 		break;
492 	case 0x10ec0222:
493 	case 0x10ec0623:
494 		alc_update_coef_idx(codec, 0x19, 1<<13, 0);
495 		break;
496 	case 0x10ec0668:
497 		alc_update_coef_idx(codec, 0x7, 3<<13, 0);
498 		break;
499 	case 0x10ec0867:
500 		alc_update_coef_idx(codec, 0x4, 1<<10, 0);
501 		break;
502 	case 0x10ec0888:
503 		if ((coef & 0x00f0) == 0x0020 || (coef & 0x00f0) == 0x0030)
504 			alc_update_coef_idx(codec, 0x7, 1<<5, 0);
505 		break;
506 	case 0x10ec0892:
507 	case 0x10ec0897:
508 		alc_update_coef_idx(codec, 0x7, 1<<5, 0);
509 		break;
510 	case 0x10ec0899:
511 	case 0x10ec0900:
512 	case 0x10ec0b00:
513 	case 0x10ec1168:
514 	case 0x10ec1220:
515 		alc_update_coef_idx(codec, 0x7, 1<<1, 0);
516 		break;
517 	}
518 }
519 
520 /* additional initialization for ALC888 variants */
521 static void alc888_coef_init(struct hda_codec *codec)
522 {
523 	switch (alc_get_coef0(codec) & 0x00f0) {
524 	/* alc888-VA */
525 	case 0x00:
526 	/* alc888-VB */
527 	case 0x10:
528 		alc_update_coef_idx(codec, 7, 0, 0x2030); /* Turn EAPD to High */
529 		break;
530 	}
531 }
532 
533 /* turn on/off EAPD control (only if available) */
534 static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
535 {
536 	if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
537 		return;
538 	if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
539 		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
540 				    on ? 2 : 0);
541 }
542 
543 /* turn on/off EAPD controls of the codec */
544 static void alc_auto_setup_eapd(struct hda_codec *codec, bool on)
545 {
546 	/* We currently only handle front, HP */
547 	static const hda_nid_t pins[] = {
548 		0x0f, 0x10, 0x14, 0x15, 0x17, 0
549 	};
550 	const hda_nid_t *p;
551 	for (p = pins; *p; p++)
552 		set_eapd(codec, *p, on);
553 }
554 
555 static int find_ext_mic_pin(struct hda_codec *codec);
556 
557 static void alc_headset_mic_no_shutup(struct hda_codec *codec)
558 {
559 	const struct hda_pincfg *pin;
560 	int mic_pin = find_ext_mic_pin(codec);
561 	int i;
562 
563 	/* don't shut up pins when unloading the driver; otherwise it breaks
564 	 * the default pin setup at the next load of the driver
565 	 */
566 	if (codec->bus->shutdown)
567 		return;
568 
569 	snd_array_for_each(&codec->init_pins, i, pin) {
570 		/* use read here for syncing after issuing each verb */
571 		if (pin->nid != mic_pin)
572 			snd_hda_codec_read(codec, pin->nid, 0,
573 					AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
574 	}
575 
576 	codec->pins_shutup = 1;
577 }
578 
579 static void alc_shutup_pins(struct hda_codec *codec)
580 {
581 	struct alc_spec *spec = codec->spec;
582 
583 	switch (codec->core.vendor_id) {
584 	case 0x10ec0236:
585 	case 0x10ec0256:
586 	case 0x19e58326:
587 	case 0x10ec0283:
588 	case 0x10ec0286:
589 	case 0x10ec0288:
590 	case 0x10ec0298:
591 		alc_headset_mic_no_shutup(codec);
592 		break;
593 	default:
594 		if (!spec->no_shutup_pins)
595 			snd_hda_shutup_pins(codec);
596 		break;
597 	}
598 }
599 
600 /* generic shutup callback;
601  * just turning off EAPD and a little pause for avoiding pop-noise
602  */
603 static void alc_eapd_shutup(struct hda_codec *codec)
604 {
605 	struct alc_spec *spec = codec->spec;
606 
607 	alc_auto_setup_eapd(codec, false);
608 	if (!spec->no_depop_delay)
609 		msleep(200);
610 	alc_shutup_pins(codec);
611 }
612 
613 /* generic EAPD initialization */
614 static void alc_auto_init_amp(struct hda_codec *codec, int type)
615 {
616 	alc_auto_setup_eapd(codec, true);
617 	alc_write_gpio(codec);
618 	switch (type) {
619 	case ALC_INIT_DEFAULT:
620 		switch (codec->core.vendor_id) {
621 		case 0x10ec0260:
622 			alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x2010);
623 			break;
624 		case 0x10ec0880:
625 		case 0x10ec0882:
626 		case 0x10ec0883:
627 		case 0x10ec0885:
628 			alc_update_coef_idx(codec, 7, 0, 0x2030);
629 			break;
630 		case 0x10ec0888:
631 			alc888_coef_init(codec);
632 			break;
633 		}
634 		break;
635 	}
636 }
637 
638 /* get a primary headphone pin if available */
639 static hda_nid_t alc_get_hp_pin(struct alc_spec *spec)
640 {
641 	if (spec->gen.autocfg.hp_pins[0])
642 		return spec->gen.autocfg.hp_pins[0];
643 	if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
644 		return spec->gen.autocfg.line_out_pins[0];
645 	return 0;
646 }
647 
648 /*
649  * Realtek SSID verification
650  */
651 
652 /* Could be any non-zero and even value. When used as fixup, tells
653  * the driver to ignore any present sku defines.
654  */
655 #define ALC_FIXUP_SKU_IGNORE (2)
656 
657 static void alc_fixup_sku_ignore(struct hda_codec *codec,
658 				 const struct hda_fixup *fix, int action)
659 {
660 	struct alc_spec *spec = codec->spec;
661 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
662 		spec->cdefine.fixup = 1;
663 		spec->cdefine.sku_cfg = ALC_FIXUP_SKU_IGNORE;
664 	}
665 }
666 
667 static void alc_fixup_no_depop_delay(struct hda_codec *codec,
668 				    const struct hda_fixup *fix, int action)
669 {
670 	struct alc_spec *spec = codec->spec;
671 
672 	if (action == HDA_FIXUP_ACT_PROBE) {
673 		spec->no_depop_delay = 1;
674 		codec->depop_delay = 0;
675 	}
676 }
677 
678 static int alc_auto_parse_customize_define(struct hda_codec *codec)
679 {
680 	unsigned int ass, tmp, i;
681 	unsigned nid = 0;
682 	struct alc_spec *spec = codec->spec;
683 
684 	spec->cdefine.enable_pcbeep = 1; /* assume always enabled */
685 
686 	if (spec->cdefine.fixup) {
687 		ass = spec->cdefine.sku_cfg;
688 		if (ass == ALC_FIXUP_SKU_IGNORE)
689 			return -1;
690 		goto do_sku;
691 	}
692 
693 	if (!codec->bus->pci)
694 		return -1;
695 	ass = codec->core.subsystem_id & 0xffff;
696 	if (ass != codec->bus->pci->subsystem_device && (ass & 1))
697 		goto do_sku;
698 
699 	nid = 0x1d;
700 	if (codec->core.vendor_id == 0x10ec0260)
701 		nid = 0x17;
702 	ass = snd_hda_codec_get_pincfg(codec, nid);
703 
704 	if (!(ass & 1)) {
705 		codec_info(codec, "%s: SKU not ready 0x%08x\n",
706 			   codec->core.chip_name, ass);
707 		return -1;
708 	}
709 
710 	/* check sum */
711 	tmp = 0;
712 	for (i = 1; i < 16; i++) {
713 		if ((ass >> i) & 1)
714 			tmp++;
715 	}
716 	if (((ass >> 16) & 0xf) != tmp)
717 		return -1;
718 
719 	spec->cdefine.port_connectivity = ass >> 30;
720 	spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
721 	spec->cdefine.check_sum = (ass >> 16) & 0xf;
722 	spec->cdefine.customization = ass >> 8;
723 do_sku:
724 	spec->cdefine.sku_cfg = ass;
725 	spec->cdefine.external_amp = (ass & 0x38) >> 3;
726 	spec->cdefine.platform_type = (ass & 0x4) >> 2;
727 	spec->cdefine.swap = (ass & 0x2) >> 1;
728 	spec->cdefine.override = ass & 0x1;
729 
730 	codec_dbg(codec, "SKU: Nid=0x%x sku_cfg=0x%08x\n",
731 		   nid, spec->cdefine.sku_cfg);
732 	codec_dbg(codec, "SKU: port_connectivity=0x%x\n",
733 		   spec->cdefine.port_connectivity);
734 	codec_dbg(codec, "SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
735 	codec_dbg(codec, "SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
736 	codec_dbg(codec, "SKU: customization=0x%08x\n", spec->cdefine.customization);
737 	codec_dbg(codec, "SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
738 	codec_dbg(codec, "SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
739 	codec_dbg(codec, "SKU: swap=0x%x\n", spec->cdefine.swap);
740 	codec_dbg(codec, "SKU: override=0x%x\n", spec->cdefine.override);
741 
742 	return 0;
743 }
744 
745 /* return the position of NID in the list, or -1 if not found */
746 static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
747 {
748 	int i;
749 	for (i = 0; i < nums; i++)
750 		if (list[i] == nid)
751 			return i;
752 	return -1;
753 }
754 /* return true if the given NID is found in the list */
755 static bool found_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
756 {
757 	return find_idx_in_nid_list(nid, list, nums) >= 0;
758 }
759 
760 /* check subsystem ID and set up device-specific initialization;
761  * return 1 if initialized, 0 if invalid SSID
762  */
763 /* 32-bit subsystem ID for BIOS loading in HD Audio codec.
764  *	31 ~ 16 :	Manufacture ID
765  *	15 ~ 8	:	SKU ID
766  *	7  ~ 0	:	Assembly ID
767  *	port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
768  */
769 static int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports)
770 {
771 	unsigned int ass, tmp, i;
772 	unsigned nid;
773 	struct alc_spec *spec = codec->spec;
774 
775 	if (spec->cdefine.fixup) {
776 		ass = spec->cdefine.sku_cfg;
777 		if (ass == ALC_FIXUP_SKU_IGNORE)
778 			return 0;
779 		goto do_sku;
780 	}
781 
782 	ass = codec->core.subsystem_id & 0xffff;
783 	if (codec->bus->pci &&
784 	    ass != codec->bus->pci->subsystem_device && (ass & 1))
785 		goto do_sku;
786 
787 	/* invalid SSID, check the special NID pin defcfg instead */
788 	/*
789 	 * 31~30	: port connectivity
790 	 * 29~21	: reserve
791 	 * 20		: PCBEEP input
792 	 * 19~16	: Check sum (15:1)
793 	 * 15~1		: Custom
794 	 * 0		: override
795 	*/
796 	nid = 0x1d;
797 	if (codec->core.vendor_id == 0x10ec0260)
798 		nid = 0x17;
799 	ass = snd_hda_codec_get_pincfg(codec, nid);
800 	codec_dbg(codec,
801 		  "realtek: No valid SSID, checking pincfg 0x%08x for NID 0x%x\n",
802 		   ass, nid);
803 	if (!(ass & 1))
804 		return 0;
805 	if ((ass >> 30) != 1)	/* no physical connection */
806 		return 0;
807 
808 	/* check sum */
809 	tmp = 0;
810 	for (i = 1; i < 16; i++) {
811 		if ((ass >> i) & 1)
812 			tmp++;
813 	}
814 	if (((ass >> 16) & 0xf) != tmp)
815 		return 0;
816 do_sku:
817 	codec_dbg(codec, "realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
818 		   ass & 0xffff, codec->core.vendor_id);
819 	/*
820 	 * 0 : override
821 	 * 1 :	Swap Jack
822 	 * 2 : 0 --> Desktop, 1 --> Laptop
823 	 * 3~5 : External Amplifier control
824 	 * 7~6 : Reserved
825 	*/
826 	tmp = (ass & 0x38) >> 3;	/* external Amp control */
827 	if (spec->init_amp == ALC_INIT_UNDEFINED) {
828 		switch (tmp) {
829 		case 1:
830 			alc_setup_gpio(codec, 0x01);
831 			break;
832 		case 3:
833 			alc_setup_gpio(codec, 0x02);
834 			break;
835 		case 7:
836 			alc_setup_gpio(codec, 0x04);
837 			break;
838 		case 5:
839 		default:
840 			spec->init_amp = ALC_INIT_DEFAULT;
841 			break;
842 		}
843 	}
844 
845 	/* is laptop or Desktop and enable the function "Mute internal speaker
846 	 * when the external headphone out jack is plugged"
847 	 */
848 	if (!(ass & 0x8000))
849 		return 1;
850 	/*
851 	 * 10~8 : Jack location
852 	 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
853 	 * 14~13: Resvered
854 	 * 15   : 1 --> enable the function "Mute internal speaker
855 	 *	        when the external headphone out jack is plugged"
856 	 */
857 	if (!alc_get_hp_pin(spec)) {
858 		hda_nid_t nid;
859 		tmp = (ass >> 11) & 0x3;	/* HP to chassis */
860 		nid = ports[tmp];
861 		if (found_in_nid_list(nid, spec->gen.autocfg.line_out_pins,
862 				      spec->gen.autocfg.line_outs))
863 			return 1;
864 		spec->gen.autocfg.hp_pins[0] = nid;
865 	}
866 	return 1;
867 }
868 
869 /* Check the validity of ALC subsystem-id
870  * ports contains an array of 4 pin NIDs for port-A, E, D and I */
871 static void alc_ssid_check(struct hda_codec *codec, const hda_nid_t *ports)
872 {
873 	if (!alc_subsystem_id(codec, ports)) {
874 		struct alc_spec *spec = codec->spec;
875 		if (spec->init_amp == ALC_INIT_UNDEFINED) {
876 			codec_dbg(codec,
877 				  "realtek: Enable default setup for auto mode as fallback\n");
878 			spec->init_amp = ALC_INIT_DEFAULT;
879 		}
880 	}
881 }
882 
883 /*
884  */
885 
886 static void alc_fixup_inv_dmic(struct hda_codec *codec,
887 			       const struct hda_fixup *fix, int action)
888 {
889 	struct alc_spec *spec = codec->spec;
890 
891 	spec->gen.inv_dmic_split = 1;
892 }
893 
894 
895 static int alc_build_controls(struct hda_codec *codec)
896 {
897 	int err;
898 
899 	err = snd_hda_gen_build_controls(codec);
900 	if (err < 0)
901 		return err;
902 
903 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_BUILD);
904 	return 0;
905 }
906 
907 
908 /*
909  * Common callbacks
910  */
911 
912 static void alc_pre_init(struct hda_codec *codec)
913 {
914 	alc_fill_eapd_coef(codec);
915 }
916 
917 #define is_s3_resume(codec) \
918 	((codec)->core.dev.power.power_state.event == PM_EVENT_RESUME)
919 #define is_s4_resume(codec) \
920 	((codec)->core.dev.power.power_state.event == PM_EVENT_RESTORE)
921 
922 static int alc_init(struct hda_codec *codec)
923 {
924 	struct alc_spec *spec = codec->spec;
925 
926 	/* hibernation resume needs the full chip initialization */
927 	if (is_s4_resume(codec))
928 		alc_pre_init(codec);
929 
930 	if (spec->init_hook)
931 		spec->init_hook(codec);
932 
933 	spec->gen.skip_verbs = 1; /* applied in below */
934 	snd_hda_gen_init(codec);
935 	alc_fix_pll(codec);
936 	alc_auto_init_amp(codec, spec->init_amp);
937 	snd_hda_apply_verbs(codec); /* apply verbs here after own init */
938 
939 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT);
940 
941 	return 0;
942 }
943 
944 #define alc_free	snd_hda_gen_free
945 
946 #ifdef CONFIG_PM
947 static inline void alc_shutup(struct hda_codec *codec)
948 {
949 	struct alc_spec *spec = codec->spec;
950 
951 	if (!snd_hda_get_bool_hint(codec, "shutup"))
952 		return; /* disabled explicitly by hints */
953 
954 	if (spec && spec->shutup)
955 		spec->shutup(codec);
956 	else
957 		alc_shutup_pins(codec);
958 }
959 
960 static void alc_power_eapd(struct hda_codec *codec)
961 {
962 	alc_auto_setup_eapd(codec, false);
963 }
964 
965 static int alc_suspend(struct hda_codec *codec)
966 {
967 	struct alc_spec *spec = codec->spec;
968 	alc_shutup(codec);
969 	if (spec && spec->power_hook)
970 		spec->power_hook(codec);
971 	return 0;
972 }
973 
974 static int alc_resume(struct hda_codec *codec)
975 {
976 	struct alc_spec *spec = codec->spec;
977 
978 	if (!spec->no_depop_delay)
979 		msleep(150); /* to avoid pop noise */
980 	codec->patch_ops.init(codec);
981 	snd_hda_regmap_sync(codec);
982 	hda_call_check_power_status(codec, 0x01);
983 	return 0;
984 }
985 #endif
986 
987 /*
988  */
989 static const struct hda_codec_ops alc_patch_ops = {
990 	.build_controls = alc_build_controls,
991 	.build_pcms = snd_hda_gen_build_pcms,
992 	.init = alc_init,
993 	.free = alc_free,
994 	.unsol_event = snd_hda_jack_unsol_event,
995 #ifdef CONFIG_PM
996 	.resume = alc_resume,
997 	.suspend = alc_suspend,
998 	.check_power_status = snd_hda_gen_check_power_status,
999 #endif
1000 };
1001 
1002 
1003 #define alc_codec_rename(codec, name) snd_hda_codec_set_name(codec, name)
1004 
1005 /*
1006  * Rename codecs appropriately from COEF value or subvendor id
1007  */
1008 struct alc_codec_rename_table {
1009 	unsigned int vendor_id;
1010 	unsigned short coef_mask;
1011 	unsigned short coef_bits;
1012 	const char *name;
1013 };
1014 
1015 struct alc_codec_rename_pci_table {
1016 	unsigned int codec_vendor_id;
1017 	unsigned short pci_subvendor;
1018 	unsigned short pci_subdevice;
1019 	const char *name;
1020 };
1021 
1022 static const struct alc_codec_rename_table rename_tbl[] = {
1023 	{ 0x10ec0221, 0xf00f, 0x1003, "ALC231" },
1024 	{ 0x10ec0269, 0xfff0, 0x3010, "ALC277" },
1025 	{ 0x10ec0269, 0xf0f0, 0x2010, "ALC259" },
1026 	{ 0x10ec0269, 0xf0f0, 0x3010, "ALC258" },
1027 	{ 0x10ec0269, 0x00f0, 0x0010, "ALC269VB" },
1028 	{ 0x10ec0269, 0xffff, 0xa023, "ALC259" },
1029 	{ 0x10ec0269, 0xffff, 0x6023, "ALC281X" },
1030 	{ 0x10ec0269, 0x00f0, 0x0020, "ALC269VC" },
1031 	{ 0x10ec0269, 0x00f0, 0x0030, "ALC269VD" },
1032 	{ 0x10ec0662, 0xffff, 0x4020, "ALC656" },
1033 	{ 0x10ec0887, 0x00f0, 0x0030, "ALC887-VD" },
1034 	{ 0x10ec0888, 0x00f0, 0x0030, "ALC888-VD" },
1035 	{ 0x10ec0888, 0xf0f0, 0x3020, "ALC886" },
1036 	{ 0x10ec0899, 0x2000, 0x2000, "ALC899" },
1037 	{ 0x10ec0892, 0xffff, 0x8020, "ALC661" },
1038 	{ 0x10ec0892, 0xffff, 0x8011, "ALC661" },
1039 	{ 0x10ec0892, 0xffff, 0x4011, "ALC656" },
1040 	{ } /* terminator */
1041 };
1042 
1043 static const struct alc_codec_rename_pci_table rename_pci_tbl[] = {
1044 	{ 0x10ec0280, 0x1028, 0, "ALC3220" },
1045 	{ 0x10ec0282, 0x1028, 0, "ALC3221" },
1046 	{ 0x10ec0283, 0x1028, 0, "ALC3223" },
1047 	{ 0x10ec0288, 0x1028, 0, "ALC3263" },
1048 	{ 0x10ec0292, 0x1028, 0, "ALC3226" },
1049 	{ 0x10ec0293, 0x1028, 0, "ALC3235" },
1050 	{ 0x10ec0255, 0x1028, 0, "ALC3234" },
1051 	{ 0x10ec0668, 0x1028, 0, "ALC3661" },
1052 	{ 0x10ec0275, 0x1028, 0, "ALC3260" },
1053 	{ 0x10ec0899, 0x1028, 0, "ALC3861" },
1054 	{ 0x10ec0298, 0x1028, 0, "ALC3266" },
1055 	{ 0x10ec0236, 0x1028, 0, "ALC3204" },
1056 	{ 0x10ec0256, 0x1028, 0, "ALC3246" },
1057 	{ 0x10ec0225, 0x1028, 0, "ALC3253" },
1058 	{ 0x10ec0295, 0x1028, 0, "ALC3254" },
1059 	{ 0x10ec0299, 0x1028, 0, "ALC3271" },
1060 	{ 0x10ec0670, 0x1025, 0, "ALC669X" },
1061 	{ 0x10ec0676, 0x1025, 0, "ALC679X" },
1062 	{ 0x10ec0282, 0x1043, 0, "ALC3229" },
1063 	{ 0x10ec0233, 0x1043, 0, "ALC3236" },
1064 	{ 0x10ec0280, 0x103c, 0, "ALC3228" },
1065 	{ 0x10ec0282, 0x103c, 0, "ALC3227" },
1066 	{ 0x10ec0286, 0x103c, 0, "ALC3242" },
1067 	{ 0x10ec0290, 0x103c, 0, "ALC3241" },
1068 	{ 0x10ec0668, 0x103c, 0, "ALC3662" },
1069 	{ 0x10ec0283, 0x17aa, 0, "ALC3239" },
1070 	{ 0x10ec0292, 0x17aa, 0, "ALC3232" },
1071 	{ } /* terminator */
1072 };
1073 
1074 static int alc_codec_rename_from_preset(struct hda_codec *codec)
1075 {
1076 	const struct alc_codec_rename_table *p;
1077 	const struct alc_codec_rename_pci_table *q;
1078 
1079 	for (p = rename_tbl; p->vendor_id; p++) {
1080 		if (p->vendor_id != codec->core.vendor_id)
1081 			continue;
1082 		if ((alc_get_coef0(codec) & p->coef_mask) == p->coef_bits)
1083 			return alc_codec_rename(codec, p->name);
1084 	}
1085 
1086 	if (!codec->bus->pci)
1087 		return 0;
1088 	for (q = rename_pci_tbl; q->codec_vendor_id; q++) {
1089 		if (q->codec_vendor_id != codec->core.vendor_id)
1090 			continue;
1091 		if (q->pci_subvendor != codec->bus->pci->subsystem_vendor)
1092 			continue;
1093 		if (!q->pci_subdevice ||
1094 		    q->pci_subdevice == codec->bus->pci->subsystem_device)
1095 			return alc_codec_rename(codec, q->name);
1096 	}
1097 
1098 	return 0;
1099 }
1100 
1101 
1102 /*
1103  * Digital-beep handlers
1104  */
1105 #ifdef CONFIG_SND_HDA_INPUT_BEEP
1106 
1107 /* additional beep mixers; private_value will be overwritten */
1108 static const struct snd_kcontrol_new alc_beep_mixer[] = {
1109 	HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
1110 	HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
1111 };
1112 
1113 /* set up and create beep controls */
1114 static int set_beep_amp(struct alc_spec *spec, hda_nid_t nid,
1115 			int idx, int dir)
1116 {
1117 	struct snd_kcontrol_new *knew;
1118 	unsigned int beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir);
1119 	int i;
1120 
1121 	for (i = 0; i < ARRAY_SIZE(alc_beep_mixer); i++) {
1122 		knew = snd_hda_gen_add_kctl(&spec->gen, NULL,
1123 					    &alc_beep_mixer[i]);
1124 		if (!knew)
1125 			return -ENOMEM;
1126 		knew->private_value = beep_amp;
1127 	}
1128 	return 0;
1129 }
1130 
1131 static const struct snd_pci_quirk beep_allow_list[] = {
1132 	SND_PCI_QUIRK(0x1043, 0x103c, "ASUS", 1),
1133 	SND_PCI_QUIRK(0x1043, 0x115d, "ASUS", 1),
1134 	SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),
1135 	SND_PCI_QUIRK(0x1043, 0x8376, "EeePC", 1),
1136 	SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1),
1137 	SND_PCI_QUIRK(0x1043, 0x831a, "EeePC", 1),
1138 	SND_PCI_QUIRK(0x1043, 0x834a, "EeePC", 1),
1139 	SND_PCI_QUIRK(0x1458, 0xa002, "GA-MA790X", 1),
1140 	SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),
1141 	/* denylist -- no beep available */
1142 	SND_PCI_QUIRK(0x17aa, 0x309e, "Lenovo ThinkCentre M73", 0),
1143 	SND_PCI_QUIRK(0x17aa, 0x30a3, "Lenovo ThinkCentre M93", 0),
1144 	{}
1145 };
1146 
1147 static inline int has_cdefine_beep(struct hda_codec *codec)
1148 {
1149 	struct alc_spec *spec = codec->spec;
1150 	const struct snd_pci_quirk *q;
1151 	q = snd_pci_quirk_lookup(codec->bus->pci, beep_allow_list);
1152 	if (q)
1153 		return q->value;
1154 	return spec->cdefine.enable_pcbeep;
1155 }
1156 #else
1157 #define set_beep_amp(spec, nid, idx, dir)	0
1158 #define has_cdefine_beep(codec)		0
1159 #endif
1160 
1161 /* parse the BIOS configuration and set up the alc_spec */
1162 /* return 1 if successful, 0 if the proper config is not found,
1163  * or a negative error code
1164  */
1165 static int alc_parse_auto_config(struct hda_codec *codec,
1166 				 const hda_nid_t *ignore_nids,
1167 				 const hda_nid_t *ssid_nids)
1168 {
1169 	struct alc_spec *spec = codec->spec;
1170 	struct auto_pin_cfg *cfg = &spec->gen.autocfg;
1171 	int err;
1172 
1173 	err = snd_hda_parse_pin_defcfg(codec, cfg, ignore_nids,
1174 				       spec->parse_flags);
1175 	if (err < 0)
1176 		return err;
1177 
1178 	if (ssid_nids)
1179 		alc_ssid_check(codec, ssid_nids);
1180 
1181 	err = snd_hda_gen_parse_auto_config(codec, cfg);
1182 	if (err < 0)
1183 		return err;
1184 
1185 	return 1;
1186 }
1187 
1188 /* common preparation job for alc_spec */
1189 static int alc_alloc_spec(struct hda_codec *codec, hda_nid_t mixer_nid)
1190 {
1191 	struct alc_spec *spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1192 	int err;
1193 
1194 	if (!spec)
1195 		return -ENOMEM;
1196 	codec->spec = spec;
1197 	snd_hda_gen_spec_init(&spec->gen);
1198 	spec->gen.mixer_nid = mixer_nid;
1199 	spec->gen.own_eapd_ctl = 1;
1200 	codec->single_adc_amp = 1;
1201 	/* FIXME: do we need this for all Realtek codec models? */
1202 	codec->spdif_status_reset = 1;
1203 	codec->forced_resume = 1;
1204 	codec->patch_ops = alc_patch_ops;
1205 	mutex_init(&spec->coef_mutex);
1206 
1207 	err = alc_codec_rename_from_preset(codec);
1208 	if (err < 0) {
1209 		kfree(spec);
1210 		return err;
1211 	}
1212 	return 0;
1213 }
1214 
1215 static int alc880_parse_auto_config(struct hda_codec *codec)
1216 {
1217 	static const hda_nid_t alc880_ignore[] = { 0x1d, 0 };
1218 	static const hda_nid_t alc880_ssids[] = { 0x15, 0x1b, 0x14, 0 };
1219 	return alc_parse_auto_config(codec, alc880_ignore, alc880_ssids);
1220 }
1221 
1222 /*
1223  * ALC880 fix-ups
1224  */
1225 enum {
1226 	ALC880_FIXUP_GPIO1,
1227 	ALC880_FIXUP_GPIO2,
1228 	ALC880_FIXUP_MEDION_RIM,
1229 	ALC880_FIXUP_LG,
1230 	ALC880_FIXUP_LG_LW25,
1231 	ALC880_FIXUP_W810,
1232 	ALC880_FIXUP_EAPD_COEF,
1233 	ALC880_FIXUP_TCL_S700,
1234 	ALC880_FIXUP_VOL_KNOB,
1235 	ALC880_FIXUP_FUJITSU,
1236 	ALC880_FIXUP_F1734,
1237 	ALC880_FIXUP_UNIWILL,
1238 	ALC880_FIXUP_UNIWILL_DIG,
1239 	ALC880_FIXUP_Z71V,
1240 	ALC880_FIXUP_ASUS_W5A,
1241 	ALC880_FIXUP_3ST_BASE,
1242 	ALC880_FIXUP_3ST,
1243 	ALC880_FIXUP_3ST_DIG,
1244 	ALC880_FIXUP_5ST_BASE,
1245 	ALC880_FIXUP_5ST,
1246 	ALC880_FIXUP_5ST_DIG,
1247 	ALC880_FIXUP_6ST_BASE,
1248 	ALC880_FIXUP_6ST,
1249 	ALC880_FIXUP_6ST_DIG,
1250 	ALC880_FIXUP_6ST_AUTOMUTE,
1251 };
1252 
1253 /* enable the volume-knob widget support on NID 0x21 */
1254 static void alc880_fixup_vol_knob(struct hda_codec *codec,
1255 				  const struct hda_fixup *fix, int action)
1256 {
1257 	if (action == HDA_FIXUP_ACT_PROBE)
1258 		snd_hda_jack_detect_enable_callback(codec, 0x21,
1259 						    alc_update_knob_master);
1260 }
1261 
1262 static const struct hda_fixup alc880_fixups[] = {
1263 	[ALC880_FIXUP_GPIO1] = {
1264 		.type = HDA_FIXUP_FUNC,
1265 		.v.func = alc_fixup_gpio1,
1266 	},
1267 	[ALC880_FIXUP_GPIO2] = {
1268 		.type = HDA_FIXUP_FUNC,
1269 		.v.func = alc_fixup_gpio2,
1270 	},
1271 	[ALC880_FIXUP_MEDION_RIM] = {
1272 		.type = HDA_FIXUP_VERBS,
1273 		.v.verbs = (const struct hda_verb[]) {
1274 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1275 			{ 0x20, AC_VERB_SET_PROC_COEF,  0x3060 },
1276 			{ }
1277 		},
1278 		.chained = true,
1279 		.chain_id = ALC880_FIXUP_GPIO2,
1280 	},
1281 	[ALC880_FIXUP_LG] = {
1282 		.type = HDA_FIXUP_PINS,
1283 		.v.pins = (const struct hda_pintbl[]) {
1284 			/* disable bogus unused pins */
1285 			{ 0x16, 0x411111f0 },
1286 			{ 0x18, 0x411111f0 },
1287 			{ 0x1a, 0x411111f0 },
1288 			{ }
1289 		}
1290 	},
1291 	[ALC880_FIXUP_LG_LW25] = {
1292 		.type = HDA_FIXUP_PINS,
1293 		.v.pins = (const struct hda_pintbl[]) {
1294 			{ 0x1a, 0x0181344f }, /* line-in */
1295 			{ 0x1b, 0x0321403f }, /* headphone */
1296 			{ }
1297 		}
1298 	},
1299 	[ALC880_FIXUP_W810] = {
1300 		.type = HDA_FIXUP_PINS,
1301 		.v.pins = (const struct hda_pintbl[]) {
1302 			/* disable bogus unused pins */
1303 			{ 0x17, 0x411111f0 },
1304 			{ }
1305 		},
1306 		.chained = true,
1307 		.chain_id = ALC880_FIXUP_GPIO2,
1308 	},
1309 	[ALC880_FIXUP_EAPD_COEF] = {
1310 		.type = HDA_FIXUP_VERBS,
1311 		.v.verbs = (const struct hda_verb[]) {
1312 			/* change to EAPD mode */
1313 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1314 			{ 0x20, AC_VERB_SET_PROC_COEF,  0x3060 },
1315 			{}
1316 		},
1317 	},
1318 	[ALC880_FIXUP_TCL_S700] = {
1319 		.type = HDA_FIXUP_VERBS,
1320 		.v.verbs = (const struct hda_verb[]) {
1321 			/* change to EAPD mode */
1322 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1323 			{ 0x20, AC_VERB_SET_PROC_COEF,  0x3070 },
1324 			{}
1325 		},
1326 		.chained = true,
1327 		.chain_id = ALC880_FIXUP_GPIO2,
1328 	},
1329 	[ALC880_FIXUP_VOL_KNOB] = {
1330 		.type = HDA_FIXUP_FUNC,
1331 		.v.func = alc880_fixup_vol_knob,
1332 	},
1333 	[ALC880_FIXUP_FUJITSU] = {
1334 		/* override all pins as BIOS on old Amilo is broken */
1335 		.type = HDA_FIXUP_PINS,
1336 		.v.pins = (const struct hda_pintbl[]) {
1337 			{ 0x14, 0x0121401f }, /* HP */
1338 			{ 0x15, 0x99030120 }, /* speaker */
1339 			{ 0x16, 0x99030130 }, /* bass speaker */
1340 			{ 0x17, 0x411111f0 }, /* N/A */
1341 			{ 0x18, 0x411111f0 }, /* N/A */
1342 			{ 0x19, 0x01a19950 }, /* mic-in */
1343 			{ 0x1a, 0x411111f0 }, /* N/A */
1344 			{ 0x1b, 0x411111f0 }, /* N/A */
1345 			{ 0x1c, 0x411111f0 }, /* N/A */
1346 			{ 0x1d, 0x411111f0 }, /* N/A */
1347 			{ 0x1e, 0x01454140 }, /* SPDIF out */
1348 			{ }
1349 		},
1350 		.chained = true,
1351 		.chain_id = ALC880_FIXUP_VOL_KNOB,
1352 	},
1353 	[ALC880_FIXUP_F1734] = {
1354 		/* almost compatible with FUJITSU, but no bass and SPDIF */
1355 		.type = HDA_FIXUP_PINS,
1356 		.v.pins = (const struct hda_pintbl[]) {
1357 			{ 0x14, 0x0121401f }, /* HP */
1358 			{ 0x15, 0x99030120 }, /* speaker */
1359 			{ 0x16, 0x411111f0 }, /* N/A */
1360 			{ 0x17, 0x411111f0 }, /* N/A */
1361 			{ 0x18, 0x411111f0 }, /* N/A */
1362 			{ 0x19, 0x01a19950 }, /* mic-in */
1363 			{ 0x1a, 0x411111f0 }, /* N/A */
1364 			{ 0x1b, 0x411111f0 }, /* N/A */
1365 			{ 0x1c, 0x411111f0 }, /* N/A */
1366 			{ 0x1d, 0x411111f0 }, /* N/A */
1367 			{ 0x1e, 0x411111f0 }, /* N/A */
1368 			{ }
1369 		},
1370 		.chained = true,
1371 		.chain_id = ALC880_FIXUP_VOL_KNOB,
1372 	},
1373 	[ALC880_FIXUP_UNIWILL] = {
1374 		/* need to fix HP and speaker pins to be parsed correctly */
1375 		.type = HDA_FIXUP_PINS,
1376 		.v.pins = (const struct hda_pintbl[]) {
1377 			{ 0x14, 0x0121411f }, /* HP */
1378 			{ 0x15, 0x99030120 }, /* speaker */
1379 			{ 0x16, 0x99030130 }, /* bass speaker */
1380 			{ }
1381 		},
1382 	},
1383 	[ALC880_FIXUP_UNIWILL_DIG] = {
1384 		.type = HDA_FIXUP_PINS,
1385 		.v.pins = (const struct hda_pintbl[]) {
1386 			/* disable bogus unused pins */
1387 			{ 0x17, 0x411111f0 },
1388 			{ 0x19, 0x411111f0 },
1389 			{ 0x1b, 0x411111f0 },
1390 			{ 0x1f, 0x411111f0 },
1391 			{ }
1392 		}
1393 	},
1394 	[ALC880_FIXUP_Z71V] = {
1395 		.type = HDA_FIXUP_PINS,
1396 		.v.pins = (const struct hda_pintbl[]) {
1397 			/* set up the whole pins as BIOS is utterly broken */
1398 			{ 0x14, 0x99030120 }, /* speaker */
1399 			{ 0x15, 0x0121411f }, /* HP */
1400 			{ 0x16, 0x411111f0 }, /* N/A */
1401 			{ 0x17, 0x411111f0 }, /* N/A */
1402 			{ 0x18, 0x01a19950 }, /* mic-in */
1403 			{ 0x19, 0x411111f0 }, /* N/A */
1404 			{ 0x1a, 0x01813031 }, /* line-in */
1405 			{ 0x1b, 0x411111f0 }, /* N/A */
1406 			{ 0x1c, 0x411111f0 }, /* N/A */
1407 			{ 0x1d, 0x411111f0 }, /* N/A */
1408 			{ 0x1e, 0x0144111e }, /* SPDIF */
1409 			{ }
1410 		}
1411 	},
1412 	[ALC880_FIXUP_ASUS_W5A] = {
1413 		.type = HDA_FIXUP_PINS,
1414 		.v.pins = (const struct hda_pintbl[]) {
1415 			/* set up the whole pins as BIOS is utterly broken */
1416 			{ 0x14, 0x0121411f }, /* HP */
1417 			{ 0x15, 0x411111f0 }, /* N/A */
1418 			{ 0x16, 0x411111f0 }, /* N/A */
1419 			{ 0x17, 0x411111f0 }, /* N/A */
1420 			{ 0x18, 0x90a60160 }, /* mic */
1421 			{ 0x19, 0x411111f0 }, /* N/A */
1422 			{ 0x1a, 0x411111f0 }, /* N/A */
1423 			{ 0x1b, 0x411111f0 }, /* N/A */
1424 			{ 0x1c, 0x411111f0 }, /* N/A */
1425 			{ 0x1d, 0x411111f0 }, /* N/A */
1426 			{ 0x1e, 0xb743111e }, /* SPDIF out */
1427 			{ }
1428 		},
1429 		.chained = true,
1430 		.chain_id = ALC880_FIXUP_GPIO1,
1431 	},
1432 	[ALC880_FIXUP_3ST_BASE] = {
1433 		.type = HDA_FIXUP_PINS,
1434 		.v.pins = (const struct hda_pintbl[]) {
1435 			{ 0x14, 0x01014010 }, /* line-out */
1436 			{ 0x15, 0x411111f0 }, /* N/A */
1437 			{ 0x16, 0x411111f0 }, /* N/A */
1438 			{ 0x17, 0x411111f0 }, /* N/A */
1439 			{ 0x18, 0x01a19c30 }, /* mic-in */
1440 			{ 0x19, 0x0121411f }, /* HP */
1441 			{ 0x1a, 0x01813031 }, /* line-in */
1442 			{ 0x1b, 0x02a19c40 }, /* front-mic */
1443 			{ 0x1c, 0x411111f0 }, /* N/A */
1444 			{ 0x1d, 0x411111f0 }, /* N/A */
1445 			/* 0x1e is filled in below */
1446 			{ 0x1f, 0x411111f0 }, /* N/A */
1447 			{ }
1448 		}
1449 	},
1450 	[ALC880_FIXUP_3ST] = {
1451 		.type = HDA_FIXUP_PINS,
1452 		.v.pins = (const struct hda_pintbl[]) {
1453 			{ 0x1e, 0x411111f0 }, /* N/A */
1454 			{ }
1455 		},
1456 		.chained = true,
1457 		.chain_id = ALC880_FIXUP_3ST_BASE,
1458 	},
1459 	[ALC880_FIXUP_3ST_DIG] = {
1460 		.type = HDA_FIXUP_PINS,
1461 		.v.pins = (const struct hda_pintbl[]) {
1462 			{ 0x1e, 0x0144111e }, /* SPDIF */
1463 			{ }
1464 		},
1465 		.chained = true,
1466 		.chain_id = ALC880_FIXUP_3ST_BASE,
1467 	},
1468 	[ALC880_FIXUP_5ST_BASE] = {
1469 		.type = HDA_FIXUP_PINS,
1470 		.v.pins = (const struct hda_pintbl[]) {
1471 			{ 0x14, 0x01014010 }, /* front */
1472 			{ 0x15, 0x411111f0 }, /* N/A */
1473 			{ 0x16, 0x01011411 }, /* CLFE */
1474 			{ 0x17, 0x01016412 }, /* surr */
1475 			{ 0x18, 0x01a19c30 }, /* mic-in */
1476 			{ 0x19, 0x0121411f }, /* HP */
1477 			{ 0x1a, 0x01813031 }, /* line-in */
1478 			{ 0x1b, 0x02a19c40 }, /* front-mic */
1479 			{ 0x1c, 0x411111f0 }, /* N/A */
1480 			{ 0x1d, 0x411111f0 }, /* N/A */
1481 			/* 0x1e is filled in below */
1482 			{ 0x1f, 0x411111f0 }, /* N/A */
1483 			{ }
1484 		}
1485 	},
1486 	[ALC880_FIXUP_5ST] = {
1487 		.type = HDA_FIXUP_PINS,
1488 		.v.pins = (const struct hda_pintbl[]) {
1489 			{ 0x1e, 0x411111f0 }, /* N/A */
1490 			{ }
1491 		},
1492 		.chained = true,
1493 		.chain_id = ALC880_FIXUP_5ST_BASE,
1494 	},
1495 	[ALC880_FIXUP_5ST_DIG] = {
1496 		.type = HDA_FIXUP_PINS,
1497 		.v.pins = (const struct hda_pintbl[]) {
1498 			{ 0x1e, 0x0144111e }, /* SPDIF */
1499 			{ }
1500 		},
1501 		.chained = true,
1502 		.chain_id = ALC880_FIXUP_5ST_BASE,
1503 	},
1504 	[ALC880_FIXUP_6ST_BASE] = {
1505 		.type = HDA_FIXUP_PINS,
1506 		.v.pins = (const struct hda_pintbl[]) {
1507 			{ 0x14, 0x01014010 }, /* front */
1508 			{ 0x15, 0x01016412 }, /* surr */
1509 			{ 0x16, 0x01011411 }, /* CLFE */
1510 			{ 0x17, 0x01012414 }, /* side */
1511 			{ 0x18, 0x01a19c30 }, /* mic-in */
1512 			{ 0x19, 0x02a19c40 }, /* front-mic */
1513 			{ 0x1a, 0x01813031 }, /* line-in */
1514 			{ 0x1b, 0x0121411f }, /* HP */
1515 			{ 0x1c, 0x411111f0 }, /* N/A */
1516 			{ 0x1d, 0x411111f0 }, /* N/A */
1517 			/* 0x1e is filled in below */
1518 			{ 0x1f, 0x411111f0 }, /* N/A */
1519 			{ }
1520 		}
1521 	},
1522 	[ALC880_FIXUP_6ST] = {
1523 		.type = HDA_FIXUP_PINS,
1524 		.v.pins = (const struct hda_pintbl[]) {
1525 			{ 0x1e, 0x411111f0 }, /* N/A */
1526 			{ }
1527 		},
1528 		.chained = true,
1529 		.chain_id = ALC880_FIXUP_6ST_BASE,
1530 	},
1531 	[ALC880_FIXUP_6ST_DIG] = {
1532 		.type = HDA_FIXUP_PINS,
1533 		.v.pins = (const struct hda_pintbl[]) {
1534 			{ 0x1e, 0x0144111e }, /* SPDIF */
1535 			{ }
1536 		},
1537 		.chained = true,
1538 		.chain_id = ALC880_FIXUP_6ST_BASE,
1539 	},
1540 	[ALC880_FIXUP_6ST_AUTOMUTE] = {
1541 		.type = HDA_FIXUP_PINS,
1542 		.v.pins = (const struct hda_pintbl[]) {
1543 			{ 0x1b, 0x0121401f }, /* HP with jack detect */
1544 			{ }
1545 		},
1546 		.chained_before = true,
1547 		.chain_id = ALC880_FIXUP_6ST_BASE,
1548 	},
1549 };
1550 
1551 static const struct snd_pci_quirk alc880_fixup_tbl[] = {
1552 	SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_FIXUP_W810),
1553 	SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS W5A", ALC880_FIXUP_ASUS_W5A),
1554 	SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_FIXUP_Z71V),
1555 	SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_FIXUP_GPIO1),
1556 	SND_PCI_QUIRK(0x147b, 0x1045, "ABit AA8XE", ALC880_FIXUP_6ST_AUTOMUTE),
1557 	SND_PCI_QUIRK(0x1558, 0x5401, "Clevo GPIO2", ALC880_FIXUP_GPIO2),
1558 	SND_PCI_QUIRK_VENDOR(0x1558, "Clevo", ALC880_FIXUP_EAPD_COEF),
1559 	SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_FIXUP_UNIWILL_DIG),
1560 	SND_PCI_QUIRK(0x1584, 0x9054, "Uniwill", ALC880_FIXUP_F1734),
1561 	SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_FIXUP_UNIWILL),
1562 	SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_FIXUP_VOL_KNOB),
1563 	SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_FIXUP_W810),
1564 	SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_FIXUP_MEDION_RIM),
1565 	SND_PCI_QUIRK(0x1631, 0xe011, "PB 13201056", ALC880_FIXUP_6ST_AUTOMUTE),
1566 	SND_PCI_QUIRK(0x1734, 0x107c, "FSC Amilo M1437", ALC880_FIXUP_FUJITSU),
1567 	SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FIXUP_FUJITSU),
1568 	SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_FIXUP_F1734),
1569 	SND_PCI_QUIRK(0x1734, 0x10b0, "FSC Amilo Pi1556", ALC880_FIXUP_FUJITSU),
1570 	SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_FIXUP_LG),
1571 	SND_PCI_QUIRK(0x1854, 0x005f, "LG P1 Express", ALC880_FIXUP_LG),
1572 	SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_FIXUP_LG),
1573 	SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_FIXUP_LG_LW25),
1574 	SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_FIXUP_TCL_S700),
1575 
1576 	/* Below is the copied entries from alc880_quirks.c.
1577 	 * It's not quite sure whether BIOS sets the correct pin-config table
1578 	 * on these machines, thus they are kept to be compatible with
1579 	 * the old static quirks.  Once when it's confirmed to work without
1580 	 * these overrides, it'd be better to remove.
1581 	 */
1582 	SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_FIXUP_5ST_DIG),
1583 	SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_FIXUP_6ST),
1584 	SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_FIXUP_3ST_DIG),
1585 	SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_FIXUP_6ST_DIG),
1586 	SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_FIXUP_6ST_DIG),
1587 	SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_FIXUP_6ST_DIG),
1588 	SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_FIXUP_3ST_DIG),
1589 	SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_FIXUP_3ST),
1590 	SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_FIXUP_6ST_DIG),
1591 	SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_FIXUP_3ST),
1592 	SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_FIXUP_3ST),
1593 	SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_FIXUP_5ST),
1594 	SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_FIXUP_5ST),
1595 	SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_FIXUP_5ST),
1596 	SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_FIXUP_6ST_DIG),
1597 	SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_FIXUP_6ST_DIG),
1598 	SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_FIXUP_6ST_DIG),
1599 	SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_FIXUP_6ST_DIG),
1600 	SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_FIXUP_5ST_DIG),
1601 	SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_FIXUP_5ST_DIG),
1602 	SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_FIXUP_5ST_DIG),
1603 	SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_FIXUP_6ST_DIG), /* broken BIOS */
1604 	SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_FIXUP_6ST_DIG),
1605 	SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1606 	SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1607 	SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1608 	SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1609 	SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1610 	SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1611 	SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1612 	SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1613 	SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1614 	SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1615 	/* default Intel */
1616 	SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_FIXUP_3ST),
1617 	SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_FIXUP_5ST_DIG),
1618 	SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_FIXUP_6ST_DIG),
1619 	{}
1620 };
1621 
1622 static const struct hda_model_fixup alc880_fixup_models[] = {
1623 	{.id = ALC880_FIXUP_3ST, .name = "3stack"},
1624 	{.id = ALC880_FIXUP_3ST_DIG, .name = "3stack-digout"},
1625 	{.id = ALC880_FIXUP_5ST, .name = "5stack"},
1626 	{.id = ALC880_FIXUP_5ST_DIG, .name = "5stack-digout"},
1627 	{.id = ALC880_FIXUP_6ST, .name = "6stack"},
1628 	{.id = ALC880_FIXUP_6ST_DIG, .name = "6stack-digout"},
1629 	{.id = ALC880_FIXUP_6ST_AUTOMUTE, .name = "6stack-automute"},
1630 	{}
1631 };
1632 
1633 
1634 /*
1635  * OK, here we have finally the patch for ALC880
1636  */
1637 static int patch_alc880(struct hda_codec *codec)
1638 {
1639 	struct alc_spec *spec;
1640 	int err;
1641 
1642 	err = alc_alloc_spec(codec, 0x0b);
1643 	if (err < 0)
1644 		return err;
1645 
1646 	spec = codec->spec;
1647 	spec->gen.need_dac_fix = 1;
1648 	spec->gen.beep_nid = 0x01;
1649 
1650 	codec->patch_ops.unsol_event = alc880_unsol_event;
1651 
1652 	alc_pre_init(codec);
1653 
1654 	snd_hda_pick_fixup(codec, alc880_fixup_models, alc880_fixup_tbl,
1655 		       alc880_fixups);
1656 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1657 
1658 	/* automatic parse from the BIOS config */
1659 	err = alc880_parse_auto_config(codec);
1660 	if (err < 0)
1661 		goto error;
1662 
1663 	if (!spec->gen.no_analog) {
1664 		err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
1665 		if (err < 0)
1666 			goto error;
1667 	}
1668 
1669 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
1670 
1671 	return 0;
1672 
1673  error:
1674 	alc_free(codec);
1675 	return err;
1676 }
1677 
1678 
1679 /*
1680  * ALC260 support
1681  */
1682 static int alc260_parse_auto_config(struct hda_codec *codec)
1683 {
1684 	static const hda_nid_t alc260_ignore[] = { 0x17, 0 };
1685 	static const hda_nid_t alc260_ssids[] = { 0x10, 0x15, 0x0f, 0 };
1686 	return alc_parse_auto_config(codec, alc260_ignore, alc260_ssids);
1687 }
1688 
1689 /*
1690  * Pin config fixes
1691  */
1692 enum {
1693 	ALC260_FIXUP_HP_DC5750,
1694 	ALC260_FIXUP_HP_PIN_0F,
1695 	ALC260_FIXUP_COEF,
1696 	ALC260_FIXUP_GPIO1,
1697 	ALC260_FIXUP_GPIO1_TOGGLE,
1698 	ALC260_FIXUP_REPLACER,
1699 	ALC260_FIXUP_HP_B1900,
1700 	ALC260_FIXUP_KN1,
1701 	ALC260_FIXUP_FSC_S7020,
1702 	ALC260_FIXUP_FSC_S7020_JWSE,
1703 	ALC260_FIXUP_VAIO_PINS,
1704 };
1705 
1706 static void alc260_gpio1_automute(struct hda_codec *codec)
1707 {
1708 	struct alc_spec *spec = codec->spec;
1709 
1710 	alc_update_gpio_data(codec, 0x01, spec->gen.hp_jack_present);
1711 }
1712 
1713 static void alc260_fixup_gpio1_toggle(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_PROBE) {
1718 		/* although the machine has only one output pin, we need to
1719 		 * toggle GPIO1 according to the jack state
1720 		 */
1721 		spec->gen.automute_hook = alc260_gpio1_automute;
1722 		spec->gen.detect_hp = 1;
1723 		spec->gen.automute_speaker = 1;
1724 		spec->gen.autocfg.hp_pins[0] = 0x0f; /* copy it for automute */
1725 		snd_hda_jack_detect_enable_callback(codec, 0x0f,
1726 						    snd_hda_gen_hp_automute);
1727 		alc_setup_gpio(codec, 0x01);
1728 	}
1729 }
1730 
1731 static void alc260_fixup_kn1(struct hda_codec *codec,
1732 			     const struct hda_fixup *fix, int action)
1733 {
1734 	struct alc_spec *spec = codec->spec;
1735 	static const struct hda_pintbl pincfgs[] = {
1736 		{ 0x0f, 0x02214000 }, /* HP/speaker */
1737 		{ 0x12, 0x90a60160 }, /* int mic */
1738 		{ 0x13, 0x02a19000 }, /* ext mic */
1739 		{ 0x18, 0x01446000 }, /* SPDIF out */
1740 		/* disable bogus I/O pins */
1741 		{ 0x10, 0x411111f0 },
1742 		{ 0x11, 0x411111f0 },
1743 		{ 0x14, 0x411111f0 },
1744 		{ 0x15, 0x411111f0 },
1745 		{ 0x16, 0x411111f0 },
1746 		{ 0x17, 0x411111f0 },
1747 		{ 0x19, 0x411111f0 },
1748 		{ }
1749 	};
1750 
1751 	switch (action) {
1752 	case HDA_FIXUP_ACT_PRE_PROBE:
1753 		snd_hda_apply_pincfgs(codec, pincfgs);
1754 		spec->init_amp = ALC_INIT_NONE;
1755 		break;
1756 	}
1757 }
1758 
1759 static void alc260_fixup_fsc_s7020(struct hda_codec *codec,
1760 				   const struct hda_fixup *fix, int action)
1761 {
1762 	struct alc_spec *spec = codec->spec;
1763 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
1764 		spec->init_amp = ALC_INIT_NONE;
1765 }
1766 
1767 static void alc260_fixup_fsc_s7020_jwse(struct hda_codec *codec,
1768 				   const struct hda_fixup *fix, int action)
1769 {
1770 	struct alc_spec *spec = codec->spec;
1771 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1772 		spec->gen.add_jack_modes = 1;
1773 		spec->gen.hp_mic = 1;
1774 	}
1775 }
1776 
1777 static const struct hda_fixup alc260_fixups[] = {
1778 	[ALC260_FIXUP_HP_DC5750] = {
1779 		.type = HDA_FIXUP_PINS,
1780 		.v.pins = (const struct hda_pintbl[]) {
1781 			{ 0x11, 0x90130110 }, /* speaker */
1782 			{ }
1783 		}
1784 	},
1785 	[ALC260_FIXUP_HP_PIN_0F] = {
1786 		.type = HDA_FIXUP_PINS,
1787 		.v.pins = (const struct hda_pintbl[]) {
1788 			{ 0x0f, 0x01214000 }, /* HP */
1789 			{ }
1790 		}
1791 	},
1792 	[ALC260_FIXUP_COEF] = {
1793 		.type = HDA_FIXUP_VERBS,
1794 		.v.verbs = (const struct hda_verb[]) {
1795 			{ 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1796 			{ 0x1a, AC_VERB_SET_PROC_COEF,  0x3040 },
1797 			{ }
1798 		},
1799 	},
1800 	[ALC260_FIXUP_GPIO1] = {
1801 		.type = HDA_FIXUP_FUNC,
1802 		.v.func = alc_fixup_gpio1,
1803 	},
1804 	[ALC260_FIXUP_GPIO1_TOGGLE] = {
1805 		.type = HDA_FIXUP_FUNC,
1806 		.v.func = alc260_fixup_gpio1_toggle,
1807 		.chained = true,
1808 		.chain_id = ALC260_FIXUP_HP_PIN_0F,
1809 	},
1810 	[ALC260_FIXUP_REPLACER] = {
1811 		.type = HDA_FIXUP_VERBS,
1812 		.v.verbs = (const struct hda_verb[]) {
1813 			{ 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1814 			{ 0x1a, AC_VERB_SET_PROC_COEF,  0x3050 },
1815 			{ }
1816 		},
1817 		.chained = true,
1818 		.chain_id = ALC260_FIXUP_GPIO1_TOGGLE,
1819 	},
1820 	[ALC260_FIXUP_HP_B1900] = {
1821 		.type = HDA_FIXUP_FUNC,
1822 		.v.func = alc260_fixup_gpio1_toggle,
1823 		.chained = true,
1824 		.chain_id = ALC260_FIXUP_COEF,
1825 	},
1826 	[ALC260_FIXUP_KN1] = {
1827 		.type = HDA_FIXUP_FUNC,
1828 		.v.func = alc260_fixup_kn1,
1829 	},
1830 	[ALC260_FIXUP_FSC_S7020] = {
1831 		.type = HDA_FIXUP_FUNC,
1832 		.v.func = alc260_fixup_fsc_s7020,
1833 	},
1834 	[ALC260_FIXUP_FSC_S7020_JWSE] = {
1835 		.type = HDA_FIXUP_FUNC,
1836 		.v.func = alc260_fixup_fsc_s7020_jwse,
1837 		.chained = true,
1838 		.chain_id = ALC260_FIXUP_FSC_S7020,
1839 	},
1840 	[ALC260_FIXUP_VAIO_PINS] = {
1841 		.type = HDA_FIXUP_PINS,
1842 		.v.pins = (const struct hda_pintbl[]) {
1843 			/* Pin configs are missing completely on some VAIOs */
1844 			{ 0x0f, 0x01211020 },
1845 			{ 0x10, 0x0001003f },
1846 			{ 0x11, 0x411111f0 },
1847 			{ 0x12, 0x01a15930 },
1848 			{ 0x13, 0x411111f0 },
1849 			{ 0x14, 0x411111f0 },
1850 			{ 0x15, 0x411111f0 },
1851 			{ 0x16, 0x411111f0 },
1852 			{ 0x17, 0x411111f0 },
1853 			{ 0x18, 0x411111f0 },
1854 			{ 0x19, 0x411111f0 },
1855 			{ }
1856 		}
1857 	},
1858 };
1859 
1860 static const struct snd_pci_quirk alc260_fixup_tbl[] = {
1861 	SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_FIXUP_GPIO1),
1862 	SND_PCI_QUIRK(0x1025, 0x007f, "Acer Aspire 9500", ALC260_FIXUP_COEF),
1863 	SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_FIXUP_GPIO1),
1864 	SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", ALC260_FIXUP_HP_DC5750),
1865 	SND_PCI_QUIRK(0x103c, 0x30ba, "HP Presario B1900", ALC260_FIXUP_HP_B1900),
1866 	SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_FIXUP_VAIO_PINS),
1867 	SND_PCI_QUIRK(0x104d, 0x81e2, "Sony VAIO TX", ALC260_FIXUP_HP_PIN_0F),
1868 	SND_PCI_QUIRK(0x10cf, 0x1326, "FSC LifeBook S7020", ALC260_FIXUP_FSC_S7020),
1869 	SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FIXUP_GPIO1),
1870 	SND_PCI_QUIRK(0x152d, 0x0729, "Quanta KN1", ALC260_FIXUP_KN1),
1871 	SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_FIXUP_REPLACER),
1872 	SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_FIXUP_COEF),
1873 	{}
1874 };
1875 
1876 static const struct hda_model_fixup alc260_fixup_models[] = {
1877 	{.id = ALC260_FIXUP_GPIO1, .name = "gpio1"},
1878 	{.id = ALC260_FIXUP_COEF, .name = "coef"},
1879 	{.id = ALC260_FIXUP_FSC_S7020, .name = "fujitsu"},
1880 	{.id = ALC260_FIXUP_FSC_S7020_JWSE, .name = "fujitsu-jwse"},
1881 	{}
1882 };
1883 
1884 /*
1885  */
1886 static int patch_alc260(struct hda_codec *codec)
1887 {
1888 	struct alc_spec *spec;
1889 	int err;
1890 
1891 	err = alc_alloc_spec(codec, 0x07);
1892 	if (err < 0)
1893 		return err;
1894 
1895 	spec = codec->spec;
1896 	/* as quite a few machines require HP amp for speaker outputs,
1897 	 * it's easier to enable it unconditionally; even if it's unneeded,
1898 	 * it's almost harmless.
1899 	 */
1900 	spec->gen.prefer_hp_amp = 1;
1901 	spec->gen.beep_nid = 0x01;
1902 
1903 	spec->shutup = alc_eapd_shutup;
1904 
1905 	alc_pre_init(codec);
1906 
1907 	snd_hda_pick_fixup(codec, alc260_fixup_models, alc260_fixup_tbl,
1908 			   alc260_fixups);
1909 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1910 
1911 	/* automatic parse from the BIOS config */
1912 	err = alc260_parse_auto_config(codec);
1913 	if (err < 0)
1914 		goto error;
1915 
1916 	if (!spec->gen.no_analog) {
1917 		err = set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
1918 		if (err < 0)
1919 			goto error;
1920 	}
1921 
1922 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
1923 
1924 	return 0;
1925 
1926  error:
1927 	alc_free(codec);
1928 	return err;
1929 }
1930 
1931 
1932 /*
1933  * ALC882/883/885/888/889 support
1934  *
1935  * ALC882 is almost identical with ALC880 but has cleaner and more flexible
1936  * configuration.  Each pin widget can choose any input DACs and a mixer.
1937  * Each ADC is connected from a mixer of all inputs.  This makes possible
1938  * 6-channel independent captures.
1939  *
1940  * In addition, an independent DAC for the multi-playback (not used in this
1941  * driver yet).
1942  */
1943 
1944 /*
1945  * Pin config fixes
1946  */
1947 enum {
1948 	ALC882_FIXUP_ABIT_AW9D_MAX,
1949 	ALC882_FIXUP_LENOVO_Y530,
1950 	ALC882_FIXUP_PB_M5210,
1951 	ALC882_FIXUP_ACER_ASPIRE_7736,
1952 	ALC882_FIXUP_ASUS_W90V,
1953 	ALC889_FIXUP_CD,
1954 	ALC889_FIXUP_FRONT_HP_NO_PRESENCE,
1955 	ALC889_FIXUP_VAIO_TT,
1956 	ALC888_FIXUP_EEE1601,
1957 	ALC886_FIXUP_EAPD,
1958 	ALC882_FIXUP_EAPD,
1959 	ALC883_FIXUP_EAPD,
1960 	ALC883_FIXUP_ACER_EAPD,
1961 	ALC882_FIXUP_GPIO1,
1962 	ALC882_FIXUP_GPIO2,
1963 	ALC882_FIXUP_GPIO3,
1964 	ALC889_FIXUP_COEF,
1965 	ALC882_FIXUP_ASUS_W2JC,
1966 	ALC882_FIXUP_ACER_ASPIRE_4930G,
1967 	ALC882_FIXUP_ACER_ASPIRE_8930G,
1968 	ALC882_FIXUP_ASPIRE_8930G_VERBS,
1969 	ALC885_FIXUP_MACPRO_GPIO,
1970 	ALC889_FIXUP_DAC_ROUTE,
1971 	ALC889_FIXUP_MBP_VREF,
1972 	ALC889_FIXUP_IMAC91_VREF,
1973 	ALC889_FIXUP_MBA11_VREF,
1974 	ALC889_FIXUP_MBA21_VREF,
1975 	ALC889_FIXUP_MP11_VREF,
1976 	ALC889_FIXUP_MP41_VREF,
1977 	ALC882_FIXUP_INV_DMIC,
1978 	ALC882_FIXUP_NO_PRIMARY_HP,
1979 	ALC887_FIXUP_ASUS_BASS,
1980 	ALC887_FIXUP_BASS_CHMAP,
1981 	ALC1220_FIXUP_GB_DUAL_CODECS,
1982 	ALC1220_FIXUP_GB_X570,
1983 	ALC1220_FIXUP_CLEVO_P950,
1984 	ALC1220_FIXUP_CLEVO_PB51ED,
1985 	ALC1220_FIXUP_CLEVO_PB51ED_PINS,
1986 	ALC887_FIXUP_ASUS_AUDIO,
1987 	ALC887_FIXUP_ASUS_HMIC,
1988 	ALCS1200A_FIXUP_MIC_VREF,
1989 };
1990 
1991 static void alc889_fixup_coef(struct hda_codec *codec,
1992 			      const struct hda_fixup *fix, int action)
1993 {
1994 	if (action != HDA_FIXUP_ACT_INIT)
1995 		return;
1996 	alc_update_coef_idx(codec, 7, 0, 0x2030);
1997 }
1998 
1999 /* set up GPIO at initialization */
2000 static void alc885_fixup_macpro_gpio(struct hda_codec *codec,
2001 				     const struct hda_fixup *fix, int action)
2002 {
2003 	struct alc_spec *spec = codec->spec;
2004 
2005 	spec->gpio_write_delay = true;
2006 	alc_fixup_gpio3(codec, fix, action);
2007 }
2008 
2009 /* Fix the connection of some pins for ALC889:
2010  * At least, Acer Aspire 5935 shows the connections to DAC3/4 don't
2011  * work correctly (bko#42740)
2012  */
2013 static void alc889_fixup_dac_route(struct hda_codec *codec,
2014 				   const struct hda_fixup *fix, int action)
2015 {
2016 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2017 		/* fake the connections during parsing the tree */
2018 		static const hda_nid_t conn1[] = { 0x0c, 0x0d };
2019 		static const hda_nid_t conn2[] = { 0x0e, 0x0f };
2020 		snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2021 		snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
2022 		snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn2), conn2);
2023 		snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn2), conn2);
2024 	} else if (action == HDA_FIXUP_ACT_PROBE) {
2025 		/* restore the connections */
2026 		static const hda_nid_t conn[] = { 0x0c, 0x0d, 0x0e, 0x0f, 0x26 };
2027 		snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
2028 		snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn), conn);
2029 		snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn), conn);
2030 		snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn), conn);
2031 	}
2032 }
2033 
2034 /* Set VREF on HP pin */
2035 static void alc889_fixup_mbp_vref(struct hda_codec *codec,
2036 				  const struct hda_fixup *fix, int action)
2037 {
2038 	static const hda_nid_t nids[] = { 0x14, 0x15, 0x19 };
2039 	struct alc_spec *spec = codec->spec;
2040 	int i;
2041 
2042 	if (action != HDA_FIXUP_ACT_INIT)
2043 		return;
2044 	for (i = 0; i < ARRAY_SIZE(nids); i++) {
2045 		unsigned int val = snd_hda_codec_get_pincfg(codec, nids[i]);
2046 		if (get_defcfg_device(val) != AC_JACK_HP_OUT)
2047 			continue;
2048 		val = snd_hda_codec_get_pin_target(codec, nids[i]);
2049 		val |= AC_PINCTL_VREF_80;
2050 		snd_hda_set_pin_ctl(codec, nids[i], val);
2051 		spec->gen.keep_vref_in_automute = 1;
2052 		break;
2053 	}
2054 }
2055 
2056 static void alc889_fixup_mac_pins(struct hda_codec *codec,
2057 				  const hda_nid_t *nids, int num_nids)
2058 {
2059 	struct alc_spec *spec = codec->spec;
2060 	int i;
2061 
2062 	for (i = 0; i < num_nids; i++) {
2063 		unsigned int val;
2064 		val = snd_hda_codec_get_pin_target(codec, nids[i]);
2065 		val |= AC_PINCTL_VREF_50;
2066 		snd_hda_set_pin_ctl(codec, nids[i], val);
2067 	}
2068 	spec->gen.keep_vref_in_automute = 1;
2069 }
2070 
2071 /* Set VREF on speaker pins on imac91 */
2072 static void alc889_fixup_imac91_vref(struct hda_codec *codec,
2073 				     const struct hda_fixup *fix, int action)
2074 {
2075 	static const hda_nid_t nids[] = { 0x18, 0x1a };
2076 
2077 	if (action == HDA_FIXUP_ACT_INIT)
2078 		alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2079 }
2080 
2081 /* Set VREF on speaker pins on mba11 */
2082 static void alc889_fixup_mba11_vref(struct hda_codec *codec,
2083 				    const struct hda_fixup *fix, int action)
2084 {
2085 	static const hda_nid_t nids[] = { 0x18 };
2086 
2087 	if (action == HDA_FIXUP_ACT_INIT)
2088 		alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2089 }
2090 
2091 /* Set VREF on speaker pins on mba21 */
2092 static void alc889_fixup_mba21_vref(struct hda_codec *codec,
2093 				    const struct hda_fixup *fix, int action)
2094 {
2095 	static const hda_nid_t nids[] = { 0x18, 0x19 };
2096 
2097 	if (action == HDA_FIXUP_ACT_INIT)
2098 		alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2099 }
2100 
2101 /* Don't take HP output as primary
2102  * Strangely, the speaker output doesn't work on Vaio Z and some Vaio
2103  * all-in-one desktop PCs (for example VGC-LN51JGB) through DAC 0x05
2104  */
2105 static void alc882_fixup_no_primary_hp(struct hda_codec *codec,
2106 				       const struct hda_fixup *fix, int action)
2107 {
2108 	struct alc_spec *spec = codec->spec;
2109 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2110 		spec->gen.no_primary_hp = 1;
2111 		spec->gen.no_multi_io = 1;
2112 	}
2113 }
2114 
2115 static void alc_fixup_bass_chmap(struct hda_codec *codec,
2116 				 const struct hda_fixup *fix, int action);
2117 
2118 /* For dual-codec configuration, we need to disable some features to avoid
2119  * conflicts of kctls and PCM streams
2120  */
2121 static void alc_fixup_dual_codecs(struct hda_codec *codec,
2122 				  const struct hda_fixup *fix, int action)
2123 {
2124 	struct alc_spec *spec = codec->spec;
2125 
2126 	if (action != HDA_FIXUP_ACT_PRE_PROBE)
2127 		return;
2128 	/* disable vmaster */
2129 	spec->gen.suppress_vmaster = 1;
2130 	/* auto-mute and auto-mic switch don't work with multiple codecs */
2131 	spec->gen.suppress_auto_mute = 1;
2132 	spec->gen.suppress_auto_mic = 1;
2133 	/* disable aamix as well */
2134 	spec->gen.mixer_nid = 0;
2135 	/* add location prefix to avoid conflicts */
2136 	codec->force_pin_prefix = 1;
2137 }
2138 
2139 static void rename_ctl(struct hda_codec *codec, const char *oldname,
2140 		       const char *newname)
2141 {
2142 	struct snd_kcontrol *kctl;
2143 
2144 	kctl = snd_hda_find_mixer_ctl(codec, oldname);
2145 	if (kctl)
2146 		snd_ctl_rename(codec->card, kctl, newname);
2147 }
2148 
2149 static void alc1220_fixup_gb_dual_codecs(struct hda_codec *codec,
2150 					 const struct hda_fixup *fix,
2151 					 int action)
2152 {
2153 	alc_fixup_dual_codecs(codec, fix, action);
2154 	switch (action) {
2155 	case HDA_FIXUP_ACT_PRE_PROBE:
2156 		/* override card longname to provide a unique UCM profile */
2157 		strcpy(codec->card->longname, "HDAudio-Gigabyte-ALC1220DualCodecs");
2158 		break;
2159 	case HDA_FIXUP_ACT_BUILD:
2160 		/* rename Capture controls depending on the codec */
2161 		rename_ctl(codec, "Capture Volume",
2162 			   codec->addr == 0 ?
2163 			   "Rear-Panel Capture Volume" :
2164 			   "Front-Panel Capture Volume");
2165 		rename_ctl(codec, "Capture Switch",
2166 			   codec->addr == 0 ?
2167 			   "Rear-Panel Capture Switch" :
2168 			   "Front-Panel Capture Switch");
2169 		break;
2170 	}
2171 }
2172 
2173 static void alc1220_fixup_gb_x570(struct hda_codec *codec,
2174 				     const struct hda_fixup *fix,
2175 				     int action)
2176 {
2177 	static const hda_nid_t conn1[] = { 0x0c };
2178 	static const struct coef_fw gb_x570_coefs[] = {
2179 		WRITE_COEF(0x07, 0x03c0),
2180 		WRITE_COEF(0x1a, 0x01c1),
2181 		WRITE_COEF(0x1b, 0x0202),
2182 		WRITE_COEF(0x43, 0x3005),
2183 		{}
2184 	};
2185 
2186 	switch (action) {
2187 	case HDA_FIXUP_ACT_PRE_PROBE:
2188 		snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2189 		snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
2190 		break;
2191 	case HDA_FIXUP_ACT_INIT:
2192 		alc_process_coef_fw(codec, gb_x570_coefs);
2193 		break;
2194 	}
2195 }
2196 
2197 static void alc1220_fixup_clevo_p950(struct hda_codec *codec,
2198 				     const struct hda_fixup *fix,
2199 				     int action)
2200 {
2201 	static const hda_nid_t conn1[] = { 0x0c };
2202 
2203 	if (action != HDA_FIXUP_ACT_PRE_PROBE)
2204 		return;
2205 
2206 	alc_update_coef_idx(codec, 0x7, 0, 0x3c3);
2207 	/* We therefore want to make sure 0x14 (front headphone) and
2208 	 * 0x1b (speakers) use the stereo DAC 0x02
2209 	 */
2210 	snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2211 	snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
2212 }
2213 
2214 static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
2215 				const struct hda_fixup *fix, int action);
2216 
2217 static void alc1220_fixup_clevo_pb51ed(struct hda_codec *codec,
2218 				     const struct hda_fixup *fix,
2219 				     int action)
2220 {
2221 	alc1220_fixup_clevo_p950(codec, fix, action);
2222 	alc_fixup_headset_mode_no_hp_mic(codec, fix, action);
2223 }
2224 
2225 static void alc887_asus_hp_automute_hook(struct hda_codec *codec,
2226 					 struct hda_jack_callback *jack)
2227 {
2228 	struct alc_spec *spec = codec->spec;
2229 	unsigned int vref;
2230 
2231 	snd_hda_gen_hp_automute(codec, jack);
2232 
2233 	if (spec->gen.hp_jack_present)
2234 		vref = AC_PINCTL_VREF_80;
2235 	else
2236 		vref = AC_PINCTL_VREF_HIZ;
2237 	snd_hda_set_pin_ctl(codec, 0x19, PIN_HP | vref);
2238 }
2239 
2240 static void alc887_fixup_asus_jack(struct hda_codec *codec,
2241 				     const struct hda_fixup *fix, int action)
2242 {
2243 	struct alc_spec *spec = codec->spec;
2244 	if (action != HDA_FIXUP_ACT_PROBE)
2245 		return;
2246 	snd_hda_set_pin_ctl_cache(codec, 0x1b, PIN_HP);
2247 	spec->gen.hp_automute_hook = alc887_asus_hp_automute_hook;
2248 }
2249 
2250 static const struct hda_fixup alc882_fixups[] = {
2251 	[ALC882_FIXUP_ABIT_AW9D_MAX] = {
2252 		.type = HDA_FIXUP_PINS,
2253 		.v.pins = (const struct hda_pintbl[]) {
2254 			{ 0x15, 0x01080104 }, /* side */
2255 			{ 0x16, 0x01011012 }, /* rear */
2256 			{ 0x17, 0x01016011 }, /* clfe */
2257 			{ }
2258 		}
2259 	},
2260 	[ALC882_FIXUP_LENOVO_Y530] = {
2261 		.type = HDA_FIXUP_PINS,
2262 		.v.pins = (const struct hda_pintbl[]) {
2263 			{ 0x15, 0x99130112 }, /* rear int speakers */
2264 			{ 0x16, 0x99130111 }, /* subwoofer */
2265 			{ }
2266 		}
2267 	},
2268 	[ALC882_FIXUP_PB_M5210] = {
2269 		.type = HDA_FIXUP_PINCTLS,
2270 		.v.pins = (const struct hda_pintbl[]) {
2271 			{ 0x19, PIN_VREF50 },
2272 			{}
2273 		}
2274 	},
2275 	[ALC882_FIXUP_ACER_ASPIRE_7736] = {
2276 		.type = HDA_FIXUP_FUNC,
2277 		.v.func = alc_fixup_sku_ignore,
2278 	},
2279 	[ALC882_FIXUP_ASUS_W90V] = {
2280 		.type = HDA_FIXUP_PINS,
2281 		.v.pins = (const struct hda_pintbl[]) {
2282 			{ 0x16, 0x99130110 }, /* fix sequence for CLFE */
2283 			{ }
2284 		}
2285 	},
2286 	[ALC889_FIXUP_CD] = {
2287 		.type = HDA_FIXUP_PINS,
2288 		.v.pins = (const struct hda_pintbl[]) {
2289 			{ 0x1c, 0x993301f0 }, /* CD */
2290 			{ }
2291 		}
2292 	},
2293 	[ALC889_FIXUP_FRONT_HP_NO_PRESENCE] = {
2294 		.type = HDA_FIXUP_PINS,
2295 		.v.pins = (const struct hda_pintbl[]) {
2296 			{ 0x1b, 0x02214120 }, /* Front HP jack is flaky, disable jack detect */
2297 			{ }
2298 		},
2299 		.chained = true,
2300 		.chain_id = ALC889_FIXUP_CD,
2301 	},
2302 	[ALC889_FIXUP_VAIO_TT] = {
2303 		.type = HDA_FIXUP_PINS,
2304 		.v.pins = (const struct hda_pintbl[]) {
2305 			{ 0x17, 0x90170111 }, /* hidden surround speaker */
2306 			{ }
2307 		}
2308 	},
2309 	[ALC888_FIXUP_EEE1601] = {
2310 		.type = HDA_FIXUP_VERBS,
2311 		.v.verbs = (const struct hda_verb[]) {
2312 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2313 			{ 0x20, AC_VERB_SET_PROC_COEF,  0x0838 },
2314 			{ }
2315 		}
2316 	},
2317 	[ALC886_FIXUP_EAPD] = {
2318 		.type = HDA_FIXUP_VERBS,
2319 		.v.verbs = (const struct hda_verb[]) {
2320 			/* change to EAPD mode */
2321 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2322 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0068 },
2323 			{ }
2324 		}
2325 	},
2326 	[ALC882_FIXUP_EAPD] = {
2327 		.type = HDA_FIXUP_VERBS,
2328 		.v.verbs = (const struct hda_verb[]) {
2329 			/* change to EAPD mode */
2330 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2331 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
2332 			{ }
2333 		}
2334 	},
2335 	[ALC883_FIXUP_EAPD] = {
2336 		.type = HDA_FIXUP_VERBS,
2337 		.v.verbs = (const struct hda_verb[]) {
2338 			/* change to EAPD mode */
2339 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2340 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2341 			{ }
2342 		}
2343 	},
2344 	[ALC883_FIXUP_ACER_EAPD] = {
2345 		.type = HDA_FIXUP_VERBS,
2346 		.v.verbs = (const struct hda_verb[]) {
2347 			/* eanable EAPD on Acer laptops */
2348 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2349 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2350 			{ }
2351 		}
2352 	},
2353 	[ALC882_FIXUP_GPIO1] = {
2354 		.type = HDA_FIXUP_FUNC,
2355 		.v.func = alc_fixup_gpio1,
2356 	},
2357 	[ALC882_FIXUP_GPIO2] = {
2358 		.type = HDA_FIXUP_FUNC,
2359 		.v.func = alc_fixup_gpio2,
2360 	},
2361 	[ALC882_FIXUP_GPIO3] = {
2362 		.type = HDA_FIXUP_FUNC,
2363 		.v.func = alc_fixup_gpio3,
2364 	},
2365 	[ALC882_FIXUP_ASUS_W2JC] = {
2366 		.type = HDA_FIXUP_FUNC,
2367 		.v.func = alc_fixup_gpio1,
2368 		.chained = true,
2369 		.chain_id = ALC882_FIXUP_EAPD,
2370 	},
2371 	[ALC889_FIXUP_COEF] = {
2372 		.type = HDA_FIXUP_FUNC,
2373 		.v.func = alc889_fixup_coef,
2374 	},
2375 	[ALC882_FIXUP_ACER_ASPIRE_4930G] = {
2376 		.type = HDA_FIXUP_PINS,
2377 		.v.pins = (const struct hda_pintbl[]) {
2378 			{ 0x16, 0x99130111 }, /* CLFE speaker */
2379 			{ 0x17, 0x99130112 }, /* surround speaker */
2380 			{ }
2381 		},
2382 		.chained = true,
2383 		.chain_id = ALC882_FIXUP_GPIO1,
2384 	},
2385 	[ALC882_FIXUP_ACER_ASPIRE_8930G] = {
2386 		.type = HDA_FIXUP_PINS,
2387 		.v.pins = (const struct hda_pintbl[]) {
2388 			{ 0x16, 0x99130111 }, /* CLFE speaker */
2389 			{ 0x1b, 0x99130112 }, /* surround speaker */
2390 			{ }
2391 		},
2392 		.chained = true,
2393 		.chain_id = ALC882_FIXUP_ASPIRE_8930G_VERBS,
2394 	},
2395 	[ALC882_FIXUP_ASPIRE_8930G_VERBS] = {
2396 		/* additional init verbs for Acer Aspire 8930G */
2397 		.type = HDA_FIXUP_VERBS,
2398 		.v.verbs = (const struct hda_verb[]) {
2399 			/* Enable all DACs */
2400 			/* DAC DISABLE/MUTE 1? */
2401 			/*  setting bits 1-5 disables DAC nids 0x02-0x06
2402 			 *  apparently. Init=0x38 */
2403 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x03 },
2404 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2405 			/* DAC DISABLE/MUTE 2? */
2406 			/*  some bit here disables the other DACs.
2407 			 *  Init=0x4900 */
2408 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x08 },
2409 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2410 			/* DMIC fix
2411 			 * This laptop has a stereo digital microphone.
2412 			 * The mics are only 1cm apart which makes the stereo
2413 			 * useless. However, either the mic or the ALC889
2414 			 * makes the signal become a difference/sum signal
2415 			 * instead of standard stereo, which is annoying.
2416 			 * So instead we flip this bit which makes the
2417 			 * codec replicate the sum signal to both channels,
2418 			 * turning it into a normal mono mic.
2419 			 */
2420 			/* DMIC_CONTROL? Init value = 0x0001 */
2421 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2422 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0003 },
2423 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2424 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2425 			{ }
2426 		},
2427 		.chained = true,
2428 		.chain_id = ALC882_FIXUP_GPIO1,
2429 	},
2430 	[ALC885_FIXUP_MACPRO_GPIO] = {
2431 		.type = HDA_FIXUP_FUNC,
2432 		.v.func = alc885_fixup_macpro_gpio,
2433 	},
2434 	[ALC889_FIXUP_DAC_ROUTE] = {
2435 		.type = HDA_FIXUP_FUNC,
2436 		.v.func = alc889_fixup_dac_route,
2437 	},
2438 	[ALC889_FIXUP_MBP_VREF] = {
2439 		.type = HDA_FIXUP_FUNC,
2440 		.v.func = alc889_fixup_mbp_vref,
2441 		.chained = true,
2442 		.chain_id = ALC882_FIXUP_GPIO1,
2443 	},
2444 	[ALC889_FIXUP_IMAC91_VREF] = {
2445 		.type = HDA_FIXUP_FUNC,
2446 		.v.func = alc889_fixup_imac91_vref,
2447 		.chained = true,
2448 		.chain_id = ALC882_FIXUP_GPIO1,
2449 	},
2450 	[ALC889_FIXUP_MBA11_VREF] = {
2451 		.type = HDA_FIXUP_FUNC,
2452 		.v.func = alc889_fixup_mba11_vref,
2453 		.chained = true,
2454 		.chain_id = ALC889_FIXUP_MBP_VREF,
2455 	},
2456 	[ALC889_FIXUP_MBA21_VREF] = {
2457 		.type = HDA_FIXUP_FUNC,
2458 		.v.func = alc889_fixup_mba21_vref,
2459 		.chained = true,
2460 		.chain_id = ALC889_FIXUP_MBP_VREF,
2461 	},
2462 	[ALC889_FIXUP_MP11_VREF] = {
2463 		.type = HDA_FIXUP_FUNC,
2464 		.v.func = alc889_fixup_mba11_vref,
2465 		.chained = true,
2466 		.chain_id = ALC885_FIXUP_MACPRO_GPIO,
2467 	},
2468 	[ALC889_FIXUP_MP41_VREF] = {
2469 		.type = HDA_FIXUP_FUNC,
2470 		.v.func = alc889_fixup_mbp_vref,
2471 		.chained = true,
2472 		.chain_id = ALC885_FIXUP_MACPRO_GPIO,
2473 	},
2474 	[ALC882_FIXUP_INV_DMIC] = {
2475 		.type = HDA_FIXUP_FUNC,
2476 		.v.func = alc_fixup_inv_dmic,
2477 	},
2478 	[ALC882_FIXUP_NO_PRIMARY_HP] = {
2479 		.type = HDA_FIXUP_FUNC,
2480 		.v.func = alc882_fixup_no_primary_hp,
2481 	},
2482 	[ALC887_FIXUP_ASUS_BASS] = {
2483 		.type = HDA_FIXUP_PINS,
2484 		.v.pins = (const struct hda_pintbl[]) {
2485 			{0x16, 0x99130130}, /* bass speaker */
2486 			{}
2487 		},
2488 		.chained = true,
2489 		.chain_id = ALC887_FIXUP_BASS_CHMAP,
2490 	},
2491 	[ALC887_FIXUP_BASS_CHMAP] = {
2492 		.type = HDA_FIXUP_FUNC,
2493 		.v.func = alc_fixup_bass_chmap,
2494 	},
2495 	[ALC1220_FIXUP_GB_DUAL_CODECS] = {
2496 		.type = HDA_FIXUP_FUNC,
2497 		.v.func = alc1220_fixup_gb_dual_codecs,
2498 	},
2499 	[ALC1220_FIXUP_GB_X570] = {
2500 		.type = HDA_FIXUP_FUNC,
2501 		.v.func = alc1220_fixup_gb_x570,
2502 	},
2503 	[ALC1220_FIXUP_CLEVO_P950] = {
2504 		.type = HDA_FIXUP_FUNC,
2505 		.v.func = alc1220_fixup_clevo_p950,
2506 	},
2507 	[ALC1220_FIXUP_CLEVO_PB51ED] = {
2508 		.type = HDA_FIXUP_FUNC,
2509 		.v.func = alc1220_fixup_clevo_pb51ed,
2510 	},
2511 	[ALC1220_FIXUP_CLEVO_PB51ED_PINS] = {
2512 		.type = HDA_FIXUP_PINS,
2513 		.v.pins = (const struct hda_pintbl[]) {
2514 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
2515 			{}
2516 		},
2517 		.chained = true,
2518 		.chain_id = ALC1220_FIXUP_CLEVO_PB51ED,
2519 	},
2520 	[ALC887_FIXUP_ASUS_AUDIO] = {
2521 		.type = HDA_FIXUP_PINS,
2522 		.v.pins = (const struct hda_pintbl[]) {
2523 			{ 0x15, 0x02a14150 }, /* use as headset mic, without its own jack detect */
2524 			{ 0x19, 0x22219420 },
2525 			{}
2526 		},
2527 	},
2528 	[ALC887_FIXUP_ASUS_HMIC] = {
2529 		.type = HDA_FIXUP_FUNC,
2530 		.v.func = alc887_fixup_asus_jack,
2531 		.chained = true,
2532 		.chain_id = ALC887_FIXUP_ASUS_AUDIO,
2533 	},
2534 	[ALCS1200A_FIXUP_MIC_VREF] = {
2535 		.type = HDA_FIXUP_PINCTLS,
2536 		.v.pins = (const struct hda_pintbl[]) {
2537 			{ 0x18, PIN_VREF50 }, /* rear mic */
2538 			{ 0x19, PIN_VREF50 }, /* front mic */
2539 			{}
2540 		}
2541 	},
2542 };
2543 
2544 static const struct snd_pci_quirk alc882_fixup_tbl[] = {
2545 	SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD),
2546 	SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2547 	SND_PCI_QUIRK(0x1025, 0x0107, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2548 	SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD),
2549 	SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2550 	SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD),
2551 	SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_FIXUP_ACER_EAPD),
2552 	SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
2553 		      ALC882_FIXUP_ACER_ASPIRE_4930G),
2554 	SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
2555 		      ALC882_FIXUP_ACER_ASPIRE_4930G),
2556 	SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
2557 		      ALC882_FIXUP_ACER_ASPIRE_8930G),
2558 	SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
2559 		      ALC882_FIXUP_ACER_ASPIRE_8930G),
2560 	SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
2561 		      ALC882_FIXUP_ACER_ASPIRE_4930G),
2562 	SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
2563 	SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
2564 		      ALC882_FIXUP_ACER_ASPIRE_4930G),
2565 	SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
2566 		      ALC882_FIXUP_ACER_ASPIRE_4930G),
2567 	SND_PCI_QUIRK(0x1025, 0x021e, "Acer Aspire 5739G",
2568 		      ALC882_FIXUP_ACER_ASPIRE_4930G),
2569 	SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),
2570 	SND_PCI_QUIRK(0x1025, 0x026b, "Acer Aspire 8940G", ALC882_FIXUP_ACER_ASPIRE_8930G),
2571 	SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736),
2572 	SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD),
2573 	SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),
2574 	SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_FIXUP_ASUS_W2JC),
2575 	SND_PCI_QUIRK(0x1043, 0x2390, "Asus D700SA", ALC887_FIXUP_ASUS_HMIC),
2576 	SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601),
2577 	SND_PCI_QUIRK(0x1043, 0x84bc, "ASUS ET2700", ALC887_FIXUP_ASUS_BASS),
2578 	SND_PCI_QUIRK(0x1043, 0x8691, "ASUS ROG Ranger VIII", ALC882_FIXUP_GPIO3),
2579 	SND_PCI_QUIRK(0x1043, 0x8797, "ASUS TUF B550M-PLUS", ALCS1200A_FIXUP_MIC_VREF),
2580 	SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP),
2581 	SND_PCI_QUIRK(0x104d, 0x9044, "Sony VAIO AiO", ALC882_FIXUP_NO_PRIMARY_HP),
2582 	SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT),
2583 	SND_PCI_QUIRK(0x104d, 0x905a, "Sony Vaio Z", ALC882_FIXUP_NO_PRIMARY_HP),
2584 	SND_PCI_QUIRK(0x104d, 0x9060, "Sony Vaio VPCL14M1R", ALC882_FIXUP_NO_PRIMARY_HP),
2585 
2586 	/* All Apple entries are in codec SSIDs */
2587 	SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF),
2588 	SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC889_FIXUP_MBP_VREF),
2589 	SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
2590 	SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC889_FIXUP_MP11_VREF),
2591 	SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_FIXUP_MACPRO_GPIO),
2592 	SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_FIXUP_MACPRO_GPIO),
2593 	SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC889_FIXUP_MBP_VREF),
2594 	SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889_FIXUP_MBP_VREF),
2595 	SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD),
2596 	SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC889_FIXUP_MBA11_VREF),
2597 	SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBA21_VREF),
2598 	SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889_FIXUP_MBP_VREF),
2599 	SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
2600 	SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO),
2601 	SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF),
2602 	SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF),
2603 	SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF),
2604 	SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 4,1/5,1", ALC889_FIXUP_MP41_VREF),
2605 	SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF),
2606 	SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),
2607 	SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),
2608 	SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_MBA11_VREF),
2609 
2610 	SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),
2611 	SND_PCI_QUIRK(0x13fe, 0x1009, "Advantech MIT-W101", ALC886_FIXUP_EAPD),
2612 	SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE),
2613 	SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
2614 	SND_PCI_QUIRK(0x1458, 0xa0cd, "Gigabyte X570 Aorus Master", ALC1220_FIXUP_GB_X570),
2615 	SND_PCI_QUIRK(0x1458, 0xa0ce, "Gigabyte X570 Aorus Xtreme", ALC1220_FIXUP_GB_X570),
2616 	SND_PCI_QUIRK(0x1458, 0xa0d5, "Gigabyte X570S Aorus Master", ALC1220_FIXUP_GB_X570),
2617 	SND_PCI_QUIRK(0x1462, 0x11f7, "MSI-GE63", ALC1220_FIXUP_CLEVO_P950),
2618 	SND_PCI_QUIRK(0x1462, 0x1228, "MSI-GP63", ALC1220_FIXUP_CLEVO_P950),
2619 	SND_PCI_QUIRK(0x1462, 0x1229, "MSI-GP73", ALC1220_FIXUP_CLEVO_P950),
2620 	SND_PCI_QUIRK(0x1462, 0x1275, "MSI-GL63", ALC1220_FIXUP_CLEVO_P950),
2621 	SND_PCI_QUIRK(0x1462, 0x1276, "MSI-GL73", ALC1220_FIXUP_CLEVO_P950),
2622 	SND_PCI_QUIRK(0x1462, 0x1293, "MSI-GP65", ALC1220_FIXUP_CLEVO_P950),
2623 	SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),
2624 	SND_PCI_QUIRK(0x1462, 0xcc34, "MSI Godlike X570", ALC1220_FIXUP_GB_DUAL_CODECS),
2625 	SND_PCI_QUIRK(0x1462, 0xda57, "MSI Z270-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
2626 	SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
2627 	SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
2628 	SND_PCI_QUIRK(0x1558, 0x3702, "Clevo X370SN[VW]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2629 	SND_PCI_QUIRK(0x1558, 0x50d3, "Clevo PC50[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2630 	SND_PCI_QUIRK(0x1558, 0x65d1, "Clevo PB51[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2631 	SND_PCI_QUIRK(0x1558, 0x65d2, "Clevo PB51R[CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2632 	SND_PCI_QUIRK(0x1558, 0x65e1, "Clevo PB51[ED][DF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2633 	SND_PCI_QUIRK(0x1558, 0x65e5, "Clevo PC50D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2634 	SND_PCI_QUIRK(0x1558, 0x65f1, "Clevo PC50HS", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2635 	SND_PCI_QUIRK(0x1558, 0x65f5, "Clevo PD50PN[NRT]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2636 	SND_PCI_QUIRK(0x1558, 0x66a2, "Clevo PE60RNE", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2637 	SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2638 	SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2639 	SND_PCI_QUIRK(0x1558, 0x67e5, "Clevo PC70D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2640 	SND_PCI_QUIRK(0x1558, 0x67f1, "Clevo PC70H[PRS]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2641 	SND_PCI_QUIRK(0x1558, 0x67f5, "Clevo PD70PN[NRT]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2642 	SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2643 	SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170SM", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2644 	SND_PCI_QUIRK(0x1558, 0x7715, "Clevo X170KM-G", ALC1220_FIXUP_CLEVO_PB51ED),
2645 	SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),
2646 	SND_PCI_QUIRK(0x1558, 0x9506, "Clevo P955HQ", ALC1220_FIXUP_CLEVO_P950),
2647 	SND_PCI_QUIRK(0x1558, 0x950a, "Clevo P955H[PR]", ALC1220_FIXUP_CLEVO_P950),
2648 	SND_PCI_QUIRK(0x1558, 0x95e1, "Clevo P95xER", ALC1220_FIXUP_CLEVO_P950),
2649 	SND_PCI_QUIRK(0x1558, 0x95e2, "Clevo P950ER", ALC1220_FIXUP_CLEVO_P950),
2650 	SND_PCI_QUIRK(0x1558, 0x95e3, "Clevo P955[ER]T", ALC1220_FIXUP_CLEVO_P950),
2651 	SND_PCI_QUIRK(0x1558, 0x95e4, "Clevo P955ER", ALC1220_FIXUP_CLEVO_P950),
2652 	SND_PCI_QUIRK(0x1558, 0x95e5, "Clevo P955EE6", ALC1220_FIXUP_CLEVO_P950),
2653 	SND_PCI_QUIRK(0x1558, 0x95e6, "Clevo P950R[CDF]", ALC1220_FIXUP_CLEVO_P950),
2654 	SND_PCI_QUIRK(0x1558, 0x96e1, "Clevo P960[ER][CDFN]-K", ALC1220_FIXUP_CLEVO_P950),
2655 	SND_PCI_QUIRK(0x1558, 0x97e1, "Clevo P970[ER][CDFN]", ALC1220_FIXUP_CLEVO_P950),
2656 	SND_PCI_QUIRK(0x1558, 0x97e2, "Clevo P970RC-M", ALC1220_FIXUP_CLEVO_P950),
2657 	SND_PCI_QUIRK(0x1558, 0xd502, "Clevo PD50SNE", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2658 	SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
2659 	SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),
2660 	SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),
2661 	SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_FIXUP_COEF),
2662 	{}
2663 };
2664 
2665 static const struct hda_model_fixup alc882_fixup_models[] = {
2666 	{.id = ALC882_FIXUP_ABIT_AW9D_MAX, .name = "abit-aw9d"},
2667 	{.id = ALC882_FIXUP_LENOVO_Y530, .name = "lenovo-y530"},
2668 	{.id = ALC882_FIXUP_ACER_ASPIRE_7736, .name = "acer-aspire-7736"},
2669 	{.id = ALC882_FIXUP_ASUS_W90V, .name = "asus-w90v"},
2670 	{.id = ALC889_FIXUP_CD, .name = "cd"},
2671 	{.id = ALC889_FIXUP_FRONT_HP_NO_PRESENCE, .name = "no-front-hp"},
2672 	{.id = ALC889_FIXUP_VAIO_TT, .name = "vaio-tt"},
2673 	{.id = ALC888_FIXUP_EEE1601, .name = "eee1601"},
2674 	{.id = ALC882_FIXUP_EAPD, .name = "alc882-eapd"},
2675 	{.id = ALC883_FIXUP_EAPD, .name = "alc883-eapd"},
2676 	{.id = ALC882_FIXUP_GPIO1, .name = "gpio1"},
2677 	{.id = ALC882_FIXUP_GPIO2, .name = "gpio2"},
2678 	{.id = ALC882_FIXUP_GPIO3, .name = "gpio3"},
2679 	{.id = ALC889_FIXUP_COEF, .name = "alc889-coef"},
2680 	{.id = ALC882_FIXUP_ASUS_W2JC, .name = "asus-w2jc"},
2681 	{.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name = "acer-aspire-4930g"},
2682 	{.id = ALC882_FIXUP_ACER_ASPIRE_8930G, .name = "acer-aspire-8930g"},
2683 	{.id = ALC883_FIXUP_ACER_EAPD, .name = "acer-aspire"},
2684 	{.id = ALC885_FIXUP_MACPRO_GPIO, .name = "macpro-gpio"},
2685 	{.id = ALC889_FIXUP_DAC_ROUTE, .name = "dac-route"},
2686 	{.id = ALC889_FIXUP_MBP_VREF, .name = "mbp-vref"},
2687 	{.id = ALC889_FIXUP_IMAC91_VREF, .name = "imac91-vref"},
2688 	{.id = ALC889_FIXUP_MBA11_VREF, .name = "mba11-vref"},
2689 	{.id = ALC889_FIXUP_MBA21_VREF, .name = "mba21-vref"},
2690 	{.id = ALC889_FIXUP_MP11_VREF, .name = "mp11-vref"},
2691 	{.id = ALC889_FIXUP_MP41_VREF, .name = "mp41-vref"},
2692 	{.id = ALC882_FIXUP_INV_DMIC, .name = "inv-dmic"},
2693 	{.id = ALC882_FIXUP_NO_PRIMARY_HP, .name = "no-primary-hp"},
2694 	{.id = ALC887_FIXUP_ASUS_BASS, .name = "asus-bass"},
2695 	{.id = ALC1220_FIXUP_GB_DUAL_CODECS, .name = "dual-codecs"},
2696 	{.id = ALC1220_FIXUP_GB_X570, .name = "gb-x570"},
2697 	{.id = ALC1220_FIXUP_CLEVO_P950, .name = "clevo-p950"},
2698 	{}
2699 };
2700 
2701 static const struct snd_hda_pin_quirk alc882_pin_fixup_tbl[] = {
2702 	SND_HDA_PIN_QUIRK(0x10ec1220, 0x1043, "ASUS", ALC1220_FIXUP_CLEVO_P950,
2703 		{0x14, 0x01014010},
2704 		{0x15, 0x01011012},
2705 		{0x16, 0x01016011},
2706 		{0x18, 0x01a19040},
2707 		{0x19, 0x02a19050},
2708 		{0x1a, 0x0181304f},
2709 		{0x1b, 0x0221401f},
2710 		{0x1e, 0x01456130}),
2711 	SND_HDA_PIN_QUIRK(0x10ec1220, 0x1462, "MS-7C35", ALC1220_FIXUP_CLEVO_P950,
2712 		{0x14, 0x01015010},
2713 		{0x15, 0x01011012},
2714 		{0x16, 0x01011011},
2715 		{0x18, 0x01a11040},
2716 		{0x19, 0x02a19050},
2717 		{0x1a, 0x0181104f},
2718 		{0x1b, 0x0221401f},
2719 		{0x1e, 0x01451130}),
2720 	{}
2721 };
2722 
2723 /*
2724  * BIOS auto configuration
2725  */
2726 /* almost identical with ALC880 parser... */
2727 static int alc882_parse_auto_config(struct hda_codec *codec)
2728 {
2729 	static const hda_nid_t alc882_ignore[] = { 0x1d, 0 };
2730 	static const hda_nid_t alc882_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2731 	return alc_parse_auto_config(codec, alc882_ignore, alc882_ssids);
2732 }
2733 
2734 /*
2735  */
2736 static int patch_alc882(struct hda_codec *codec)
2737 {
2738 	struct alc_spec *spec;
2739 	int err;
2740 
2741 	err = alc_alloc_spec(codec, 0x0b);
2742 	if (err < 0)
2743 		return err;
2744 
2745 	spec = codec->spec;
2746 
2747 	switch (codec->core.vendor_id) {
2748 	case 0x10ec0882:
2749 	case 0x10ec0885:
2750 	case 0x10ec0900:
2751 	case 0x10ec0b00:
2752 	case 0x10ec1220:
2753 		break;
2754 	default:
2755 		/* ALC883 and variants */
2756 		alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2757 		break;
2758 	}
2759 
2760 	alc_pre_init(codec);
2761 
2762 	snd_hda_pick_fixup(codec, alc882_fixup_models, alc882_fixup_tbl,
2763 		       alc882_fixups);
2764 	snd_hda_pick_pin_fixup(codec, alc882_pin_fixup_tbl, alc882_fixups, true);
2765 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2766 
2767 	alc_auto_parse_customize_define(codec);
2768 
2769 	if (has_cdefine_beep(codec))
2770 		spec->gen.beep_nid = 0x01;
2771 
2772 	/* automatic parse from the BIOS config */
2773 	err = alc882_parse_auto_config(codec);
2774 	if (err < 0)
2775 		goto error;
2776 
2777 	if (!spec->gen.no_analog && spec->gen.beep_nid) {
2778 		err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2779 		if (err < 0)
2780 			goto error;
2781 	}
2782 
2783 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2784 
2785 	return 0;
2786 
2787  error:
2788 	alc_free(codec);
2789 	return err;
2790 }
2791 
2792 
2793 /*
2794  * ALC262 support
2795  */
2796 static int alc262_parse_auto_config(struct hda_codec *codec)
2797 {
2798 	static const hda_nid_t alc262_ignore[] = { 0x1d, 0 };
2799 	static const hda_nid_t alc262_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2800 	return alc_parse_auto_config(codec, alc262_ignore, alc262_ssids);
2801 }
2802 
2803 /*
2804  * Pin config fixes
2805  */
2806 enum {
2807 	ALC262_FIXUP_FSC_H270,
2808 	ALC262_FIXUP_FSC_S7110,
2809 	ALC262_FIXUP_HP_Z200,
2810 	ALC262_FIXUP_TYAN,
2811 	ALC262_FIXUP_LENOVO_3000,
2812 	ALC262_FIXUP_BENQ,
2813 	ALC262_FIXUP_BENQ_T31,
2814 	ALC262_FIXUP_INV_DMIC,
2815 	ALC262_FIXUP_INTEL_BAYLEYBAY,
2816 };
2817 
2818 static const struct hda_fixup alc262_fixups[] = {
2819 	[ALC262_FIXUP_FSC_H270] = {
2820 		.type = HDA_FIXUP_PINS,
2821 		.v.pins = (const struct hda_pintbl[]) {
2822 			{ 0x14, 0x99130110 }, /* speaker */
2823 			{ 0x15, 0x0221142f }, /* front HP */
2824 			{ 0x1b, 0x0121141f }, /* rear HP */
2825 			{ }
2826 		}
2827 	},
2828 	[ALC262_FIXUP_FSC_S7110] = {
2829 		.type = HDA_FIXUP_PINS,
2830 		.v.pins = (const struct hda_pintbl[]) {
2831 			{ 0x15, 0x90170110 }, /* speaker */
2832 			{ }
2833 		},
2834 		.chained = true,
2835 		.chain_id = ALC262_FIXUP_BENQ,
2836 	},
2837 	[ALC262_FIXUP_HP_Z200] = {
2838 		.type = HDA_FIXUP_PINS,
2839 		.v.pins = (const struct hda_pintbl[]) {
2840 			{ 0x16, 0x99130120 }, /* internal speaker */
2841 			{ }
2842 		}
2843 	},
2844 	[ALC262_FIXUP_TYAN] = {
2845 		.type = HDA_FIXUP_PINS,
2846 		.v.pins = (const struct hda_pintbl[]) {
2847 			{ 0x14, 0x1993e1f0 }, /* int AUX */
2848 			{ }
2849 		}
2850 	},
2851 	[ALC262_FIXUP_LENOVO_3000] = {
2852 		.type = HDA_FIXUP_PINCTLS,
2853 		.v.pins = (const struct hda_pintbl[]) {
2854 			{ 0x19, PIN_VREF50 },
2855 			{}
2856 		},
2857 		.chained = true,
2858 		.chain_id = ALC262_FIXUP_BENQ,
2859 	},
2860 	[ALC262_FIXUP_BENQ] = {
2861 		.type = HDA_FIXUP_VERBS,
2862 		.v.verbs = (const struct hda_verb[]) {
2863 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2864 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2865 			{}
2866 		}
2867 	},
2868 	[ALC262_FIXUP_BENQ_T31] = {
2869 		.type = HDA_FIXUP_VERBS,
2870 		.v.verbs = (const struct hda_verb[]) {
2871 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2872 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2873 			{}
2874 		}
2875 	},
2876 	[ALC262_FIXUP_INV_DMIC] = {
2877 		.type = HDA_FIXUP_FUNC,
2878 		.v.func = alc_fixup_inv_dmic,
2879 	},
2880 	[ALC262_FIXUP_INTEL_BAYLEYBAY] = {
2881 		.type = HDA_FIXUP_FUNC,
2882 		.v.func = alc_fixup_no_depop_delay,
2883 	},
2884 };
2885 
2886 static const struct snd_pci_quirk alc262_fixup_tbl[] = {
2887 	SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", ALC262_FIXUP_HP_Z200),
2888 	SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu Lifebook S7110", ALC262_FIXUP_FSC_S7110),
2889 	SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ),
2890 	SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN),
2891 	SND_PCI_QUIRK(0x1734, 0x1141, "FSC ESPRIMO U9210", ALC262_FIXUP_FSC_H270),
2892 	SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270),
2893 	SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000),
2894 	SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ),
2895 	SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_FIXUP_BENQ_T31),
2896 	SND_PCI_QUIRK(0x8086, 0x7270, "BayleyBay", ALC262_FIXUP_INTEL_BAYLEYBAY),
2897 	{}
2898 };
2899 
2900 static const struct hda_model_fixup alc262_fixup_models[] = {
2901 	{.id = ALC262_FIXUP_INV_DMIC, .name = "inv-dmic"},
2902 	{.id = ALC262_FIXUP_FSC_H270, .name = "fsc-h270"},
2903 	{.id = ALC262_FIXUP_FSC_S7110, .name = "fsc-s7110"},
2904 	{.id = ALC262_FIXUP_HP_Z200, .name = "hp-z200"},
2905 	{.id = ALC262_FIXUP_TYAN, .name = "tyan"},
2906 	{.id = ALC262_FIXUP_LENOVO_3000, .name = "lenovo-3000"},
2907 	{.id = ALC262_FIXUP_BENQ, .name = "benq"},
2908 	{.id = ALC262_FIXUP_BENQ_T31, .name = "benq-t31"},
2909 	{.id = ALC262_FIXUP_INTEL_BAYLEYBAY, .name = "bayleybay"},
2910 	{}
2911 };
2912 
2913 /*
2914  */
2915 static int patch_alc262(struct hda_codec *codec)
2916 {
2917 	struct alc_spec *spec;
2918 	int err;
2919 
2920 	err = alc_alloc_spec(codec, 0x0b);
2921 	if (err < 0)
2922 		return err;
2923 
2924 	spec = codec->spec;
2925 	spec->gen.shared_mic_vref_pin = 0x18;
2926 
2927 	spec->shutup = alc_eapd_shutup;
2928 
2929 #if 0
2930 	/* pshou 07/11/05  set a zero PCM sample to DAC when FIFO is
2931 	 * under-run
2932 	 */
2933 	alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x80);
2934 #endif
2935 	alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2936 
2937 	alc_pre_init(codec);
2938 
2939 	snd_hda_pick_fixup(codec, alc262_fixup_models, alc262_fixup_tbl,
2940 		       alc262_fixups);
2941 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2942 
2943 	alc_auto_parse_customize_define(codec);
2944 
2945 	if (has_cdefine_beep(codec))
2946 		spec->gen.beep_nid = 0x01;
2947 
2948 	/* automatic parse from the BIOS config */
2949 	err = alc262_parse_auto_config(codec);
2950 	if (err < 0)
2951 		goto error;
2952 
2953 	if (!spec->gen.no_analog && spec->gen.beep_nid) {
2954 		err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2955 		if (err < 0)
2956 			goto error;
2957 	}
2958 
2959 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2960 
2961 	return 0;
2962 
2963  error:
2964 	alc_free(codec);
2965 	return err;
2966 }
2967 
2968 /*
2969  *  ALC268
2970  */
2971 /* bind Beep switches of both NID 0x0f and 0x10 */
2972 static int alc268_beep_switch_put(struct snd_kcontrol *kcontrol,
2973 				  struct snd_ctl_elem_value *ucontrol)
2974 {
2975 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2976 	unsigned long pval;
2977 	int err;
2978 
2979 	mutex_lock(&codec->control_mutex);
2980 	pval = kcontrol->private_value;
2981 	kcontrol->private_value = (pval & ~0xff) | 0x0f;
2982 	err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2983 	if (err >= 0) {
2984 		kcontrol->private_value = (pval & ~0xff) | 0x10;
2985 		err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2986 	}
2987 	kcontrol->private_value = pval;
2988 	mutex_unlock(&codec->control_mutex);
2989 	return err;
2990 }
2991 
2992 static const struct snd_kcontrol_new alc268_beep_mixer[] = {
2993 	HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
2994 	{
2995 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2996 		.name = "Beep Playback Switch",
2997 		.subdevice = HDA_SUBDEV_AMP_FLAG,
2998 		.info = snd_hda_mixer_amp_switch_info,
2999 		.get = snd_hda_mixer_amp_switch_get,
3000 		.put = alc268_beep_switch_put,
3001 		.private_value = HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT)
3002 	},
3003 };
3004 
3005 /* set PCBEEP vol = 0, mute connections */
3006 static const struct hda_verb alc268_beep_init_verbs[] = {
3007 	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3008 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3009 	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3010 	{ }
3011 };
3012 
3013 enum {
3014 	ALC268_FIXUP_INV_DMIC,
3015 	ALC268_FIXUP_HP_EAPD,
3016 	ALC268_FIXUP_SPDIF,
3017 };
3018 
3019 static const struct hda_fixup alc268_fixups[] = {
3020 	[ALC268_FIXUP_INV_DMIC] = {
3021 		.type = HDA_FIXUP_FUNC,
3022 		.v.func = alc_fixup_inv_dmic,
3023 	},
3024 	[ALC268_FIXUP_HP_EAPD] = {
3025 		.type = HDA_FIXUP_VERBS,
3026 		.v.verbs = (const struct hda_verb[]) {
3027 			{0x15, AC_VERB_SET_EAPD_BTLENABLE, 0},
3028 			{}
3029 		}
3030 	},
3031 	[ALC268_FIXUP_SPDIF] = {
3032 		.type = HDA_FIXUP_PINS,
3033 		.v.pins = (const struct hda_pintbl[]) {
3034 			{ 0x1e, 0x014b1180 }, /* enable SPDIF out */
3035 			{}
3036 		}
3037 	},
3038 };
3039 
3040 static const struct hda_model_fixup alc268_fixup_models[] = {
3041 	{.id = ALC268_FIXUP_INV_DMIC, .name = "inv-dmic"},
3042 	{.id = ALC268_FIXUP_HP_EAPD, .name = "hp-eapd"},
3043 	{.id = ALC268_FIXUP_SPDIF, .name = "spdif"},
3044 	{}
3045 };
3046 
3047 static const struct snd_pci_quirk alc268_fixup_tbl[] = {
3048 	SND_PCI_QUIRK(0x1025, 0x0139, "Acer TravelMate 6293", ALC268_FIXUP_SPDIF),
3049 	SND_PCI_QUIRK(0x1025, 0x015b, "Acer AOA 150 (ZG5)", ALC268_FIXUP_INV_DMIC),
3050 	/* below is codec SSID since multiple Toshiba laptops have the
3051 	 * same PCI SSID 1179:ff00
3052 	 */
3053 	SND_PCI_QUIRK(0x1179, 0xff06, "Toshiba P200", ALC268_FIXUP_HP_EAPD),
3054 	{}
3055 };
3056 
3057 /*
3058  * BIOS auto configuration
3059  */
3060 static int alc268_parse_auto_config(struct hda_codec *codec)
3061 {
3062 	static const hda_nid_t alc268_ssids[] = { 0x15, 0x1b, 0x14, 0 };
3063 	return alc_parse_auto_config(codec, NULL, alc268_ssids);
3064 }
3065 
3066 /*
3067  */
3068 static int patch_alc268(struct hda_codec *codec)
3069 {
3070 	struct alc_spec *spec;
3071 	int i, err;
3072 
3073 	/* ALC268 has no aa-loopback mixer */
3074 	err = alc_alloc_spec(codec, 0);
3075 	if (err < 0)
3076 		return err;
3077 
3078 	spec = codec->spec;
3079 	if (has_cdefine_beep(codec))
3080 		spec->gen.beep_nid = 0x01;
3081 
3082 	spec->shutup = alc_eapd_shutup;
3083 
3084 	alc_pre_init(codec);
3085 
3086 	snd_hda_pick_fixup(codec, alc268_fixup_models, alc268_fixup_tbl, alc268_fixups);
3087 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
3088 
3089 	/* automatic parse from the BIOS config */
3090 	err = alc268_parse_auto_config(codec);
3091 	if (err < 0)
3092 		goto error;
3093 
3094 	if (err > 0 && !spec->gen.no_analog &&
3095 	    spec->gen.autocfg.speaker_pins[0] != 0x1d) {
3096 		for (i = 0; i < ARRAY_SIZE(alc268_beep_mixer); i++) {
3097 			if (!snd_hda_gen_add_kctl(&spec->gen, NULL,
3098 						  &alc268_beep_mixer[i])) {
3099 				err = -ENOMEM;
3100 				goto error;
3101 			}
3102 		}
3103 		snd_hda_add_verbs(codec, alc268_beep_init_verbs);
3104 		if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
3105 			/* override the amp caps for beep generator */
3106 			snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
3107 					  (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
3108 					  (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
3109 					  (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
3110 					  (0 << AC_AMPCAP_MUTE_SHIFT));
3111 	}
3112 
3113 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
3114 
3115 	return 0;
3116 
3117  error:
3118 	alc_free(codec);
3119 	return err;
3120 }
3121 
3122 /*
3123  * ALC269
3124  */
3125 
3126 static const struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
3127 	.rates = SNDRV_PCM_RATE_44100, /* fixed rate */
3128 };
3129 
3130 static const struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
3131 	.rates = SNDRV_PCM_RATE_44100, /* fixed rate */
3132 };
3133 
3134 /* different alc269-variants */
3135 enum {
3136 	ALC269_TYPE_ALC269VA,
3137 	ALC269_TYPE_ALC269VB,
3138 	ALC269_TYPE_ALC269VC,
3139 	ALC269_TYPE_ALC269VD,
3140 	ALC269_TYPE_ALC280,
3141 	ALC269_TYPE_ALC282,
3142 	ALC269_TYPE_ALC283,
3143 	ALC269_TYPE_ALC284,
3144 	ALC269_TYPE_ALC293,
3145 	ALC269_TYPE_ALC286,
3146 	ALC269_TYPE_ALC298,
3147 	ALC269_TYPE_ALC255,
3148 	ALC269_TYPE_ALC256,
3149 	ALC269_TYPE_ALC257,
3150 	ALC269_TYPE_ALC215,
3151 	ALC269_TYPE_ALC225,
3152 	ALC269_TYPE_ALC245,
3153 	ALC269_TYPE_ALC287,
3154 	ALC269_TYPE_ALC294,
3155 	ALC269_TYPE_ALC300,
3156 	ALC269_TYPE_ALC623,
3157 	ALC269_TYPE_ALC700,
3158 };
3159 
3160 /*
3161  * BIOS auto configuration
3162  */
3163 static int alc269_parse_auto_config(struct hda_codec *codec)
3164 {
3165 	static const hda_nid_t alc269_ignore[] = { 0x1d, 0 };
3166 	static const hda_nid_t alc269_ssids[] = { 0, 0x1b, 0x14, 0x21 };
3167 	static const hda_nid_t alc269va_ssids[] = { 0x15, 0x1b, 0x14, 0 };
3168 	struct alc_spec *spec = codec->spec;
3169 	const hda_nid_t *ssids;
3170 
3171 	switch (spec->codec_variant) {
3172 	case ALC269_TYPE_ALC269VA:
3173 	case ALC269_TYPE_ALC269VC:
3174 	case ALC269_TYPE_ALC280:
3175 	case ALC269_TYPE_ALC284:
3176 	case ALC269_TYPE_ALC293:
3177 		ssids = alc269va_ssids;
3178 		break;
3179 	case ALC269_TYPE_ALC269VB:
3180 	case ALC269_TYPE_ALC269VD:
3181 	case ALC269_TYPE_ALC282:
3182 	case ALC269_TYPE_ALC283:
3183 	case ALC269_TYPE_ALC286:
3184 	case ALC269_TYPE_ALC298:
3185 	case ALC269_TYPE_ALC255:
3186 	case ALC269_TYPE_ALC256:
3187 	case ALC269_TYPE_ALC257:
3188 	case ALC269_TYPE_ALC215:
3189 	case ALC269_TYPE_ALC225:
3190 	case ALC269_TYPE_ALC245:
3191 	case ALC269_TYPE_ALC287:
3192 	case ALC269_TYPE_ALC294:
3193 	case ALC269_TYPE_ALC300:
3194 	case ALC269_TYPE_ALC623:
3195 	case ALC269_TYPE_ALC700:
3196 		ssids = alc269_ssids;
3197 		break;
3198 	default:
3199 		ssids = alc269_ssids;
3200 		break;
3201 	}
3202 
3203 	return alc_parse_auto_config(codec, alc269_ignore, ssids);
3204 }
3205 
3206 static const struct hda_jack_keymap alc_headset_btn_keymap[] = {
3207 	{ SND_JACK_BTN_0, KEY_PLAYPAUSE },
3208 	{ SND_JACK_BTN_1, KEY_VOICECOMMAND },
3209 	{ SND_JACK_BTN_2, KEY_VOLUMEUP },
3210 	{ SND_JACK_BTN_3, KEY_VOLUMEDOWN },
3211 	{}
3212 };
3213 
3214 static void alc_headset_btn_callback(struct hda_codec *codec,
3215 				     struct hda_jack_callback *jack)
3216 {
3217 	int report = 0;
3218 
3219 	if (jack->unsol_res & (7 << 13))
3220 		report |= SND_JACK_BTN_0;
3221 
3222 	if (jack->unsol_res  & (1 << 16 | 3 << 8))
3223 		report |= SND_JACK_BTN_1;
3224 
3225 	/* Volume up key */
3226 	if (jack->unsol_res & (7 << 23))
3227 		report |= SND_JACK_BTN_2;
3228 
3229 	/* Volume down key */
3230 	if (jack->unsol_res & (7 << 10))
3231 		report |= SND_JACK_BTN_3;
3232 
3233 	snd_hda_jack_set_button_state(codec, jack->nid, report);
3234 }
3235 
3236 static void alc_disable_headset_jack_key(struct hda_codec *codec)
3237 {
3238 	struct alc_spec *spec = codec->spec;
3239 
3240 	if (!spec->has_hs_key)
3241 		return;
3242 
3243 	switch (codec->core.vendor_id) {
3244 	case 0x10ec0215:
3245 	case 0x10ec0225:
3246 	case 0x10ec0285:
3247 	case 0x10ec0287:
3248 	case 0x10ec0295:
3249 	case 0x10ec0289:
3250 	case 0x10ec0299:
3251 		alc_write_coef_idx(codec, 0x48, 0x0);
3252 		alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3253 		alc_update_coef_idx(codec, 0x44, 0x0045 << 8, 0x0);
3254 		break;
3255 	case 0x10ec0230:
3256 	case 0x10ec0236:
3257 	case 0x10ec0256:
3258 	case 0x19e58326:
3259 		alc_write_coef_idx(codec, 0x48, 0x0);
3260 		alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3261 		break;
3262 	}
3263 }
3264 
3265 static void alc_enable_headset_jack_key(struct hda_codec *codec)
3266 {
3267 	struct alc_spec *spec = codec->spec;
3268 
3269 	if (!spec->has_hs_key)
3270 		return;
3271 
3272 	switch (codec->core.vendor_id) {
3273 	case 0x10ec0215:
3274 	case 0x10ec0225:
3275 	case 0x10ec0285:
3276 	case 0x10ec0287:
3277 	case 0x10ec0295:
3278 	case 0x10ec0289:
3279 	case 0x10ec0299:
3280 		alc_write_coef_idx(codec, 0x48, 0xd011);
3281 		alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3282 		alc_update_coef_idx(codec, 0x44, 0x007f << 8, 0x0045 << 8);
3283 		break;
3284 	case 0x10ec0230:
3285 	case 0x10ec0236:
3286 	case 0x10ec0256:
3287 	case 0x19e58326:
3288 		alc_write_coef_idx(codec, 0x48, 0xd011);
3289 		alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3290 		break;
3291 	}
3292 }
3293 
3294 static void alc_fixup_headset_jack(struct hda_codec *codec,
3295 				    const struct hda_fixup *fix, int action)
3296 {
3297 	struct alc_spec *spec = codec->spec;
3298 	hda_nid_t hp_pin;
3299 
3300 	switch (action) {
3301 	case HDA_FIXUP_ACT_PRE_PROBE:
3302 		spec->has_hs_key = 1;
3303 		snd_hda_jack_detect_enable_callback(codec, 0x55,
3304 						    alc_headset_btn_callback);
3305 		break;
3306 	case HDA_FIXUP_ACT_BUILD:
3307 		hp_pin = alc_get_hp_pin(spec);
3308 		if (!hp_pin || snd_hda_jack_bind_keymap(codec, 0x55,
3309 							alc_headset_btn_keymap,
3310 							hp_pin))
3311 			snd_hda_jack_add_kctl(codec, 0x55, "Headset Jack",
3312 					      false, SND_JACK_HEADSET,
3313 					      alc_headset_btn_keymap);
3314 
3315 		alc_enable_headset_jack_key(codec);
3316 		break;
3317 	}
3318 }
3319 
3320 static void alc269vb_toggle_power_output(struct hda_codec *codec, int power_up)
3321 {
3322 	alc_update_coef_idx(codec, 0x04, 1 << 11, power_up ? (1 << 11) : 0);
3323 }
3324 
3325 static void alc269_shutup(struct hda_codec *codec)
3326 {
3327 	struct alc_spec *spec = codec->spec;
3328 
3329 	if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3330 		alc269vb_toggle_power_output(codec, 0);
3331 	if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
3332 			(alc_get_coef0(codec) & 0x00ff) == 0x018) {
3333 		msleep(150);
3334 	}
3335 	alc_shutup_pins(codec);
3336 }
3337 
3338 static const struct coef_fw alc282_coefs[] = {
3339 	WRITE_COEF(0x03, 0x0002), /* Power Down Control */
3340 	UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
3341 	WRITE_COEF(0x07, 0x0200), /* DMIC control */
3342 	UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
3343 	UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
3344 	WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
3345 	WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
3346 	WRITE_COEF(0x0e, 0x6e00), /* LDO1/2/3, DAC/ADC */
3347 	UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
3348 	UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
3349 	WRITE_COEF(0x6f, 0x0), /* Class D test 4 */
3350 	UPDATE_COEF(0x0c, 0xfe00, 0), /* IO power down directly */
3351 	WRITE_COEF(0x34, 0xa0c0), /* ANC */
3352 	UPDATE_COEF(0x16, 0x0008, 0), /* AGC MUX */
3353 	UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
3354 	UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
3355 	WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
3356 	WRITE_COEF(0x63, 0x2902), /* PLL */
3357 	WRITE_COEF(0x68, 0xa080), /* capless control 2 */
3358 	WRITE_COEF(0x69, 0x3400), /* capless control 3 */
3359 	WRITE_COEF(0x6a, 0x2f3e), /* capless control 4 */
3360 	WRITE_COEF(0x6b, 0x0), /* capless control 5 */
3361 	UPDATE_COEF(0x6d, 0x0fff, 0x0900), /* class D test 2 */
3362 	WRITE_COEF(0x6e, 0x110a), /* class D test 3 */
3363 	UPDATE_COEF(0x70, 0x00f8, 0x00d8), /* class D test 5 */
3364 	WRITE_COEF(0x71, 0x0014), /* class D test 6 */
3365 	WRITE_COEF(0x72, 0xc2ba), /* classD OCP */
3366 	UPDATE_COEF(0x77, 0x0f80, 0), /* classD pure DC test */
3367 	WRITE_COEF(0x6c, 0xfc06), /* Class D amp control */
3368 	{}
3369 };
3370 
3371 static void alc282_restore_default_value(struct hda_codec *codec)
3372 {
3373 	alc_process_coef_fw(codec, alc282_coefs);
3374 }
3375 
3376 static void alc282_init(struct hda_codec *codec)
3377 {
3378 	struct alc_spec *spec = codec->spec;
3379 	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3380 	bool hp_pin_sense;
3381 	int coef78;
3382 
3383 	alc282_restore_default_value(codec);
3384 
3385 	if (!hp_pin)
3386 		return;
3387 	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3388 	coef78 = alc_read_coef_idx(codec, 0x78);
3389 
3390 	/* Index 0x78 Direct Drive HP AMP LPM Control 1 */
3391 	/* Headphone capless set to high power mode */
3392 	alc_write_coef_idx(codec, 0x78, 0x9004);
3393 
3394 	if (hp_pin_sense)
3395 		msleep(2);
3396 
3397 	snd_hda_codec_write(codec, hp_pin, 0,
3398 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3399 
3400 	if (hp_pin_sense)
3401 		msleep(85);
3402 
3403 	snd_hda_codec_write(codec, hp_pin, 0,
3404 			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3405 
3406 	if (hp_pin_sense)
3407 		msleep(100);
3408 
3409 	/* Headphone capless set to normal mode */
3410 	alc_write_coef_idx(codec, 0x78, coef78);
3411 }
3412 
3413 static void alc282_shutup(struct hda_codec *codec)
3414 {
3415 	struct alc_spec *spec = codec->spec;
3416 	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3417 	bool hp_pin_sense;
3418 	int coef78;
3419 
3420 	if (!hp_pin) {
3421 		alc269_shutup(codec);
3422 		return;
3423 	}
3424 
3425 	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3426 	coef78 = alc_read_coef_idx(codec, 0x78);
3427 	alc_write_coef_idx(codec, 0x78, 0x9004);
3428 
3429 	if (hp_pin_sense)
3430 		msleep(2);
3431 
3432 	snd_hda_codec_write(codec, hp_pin, 0,
3433 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3434 
3435 	if (hp_pin_sense)
3436 		msleep(85);
3437 
3438 	if (!spec->no_shutup_pins)
3439 		snd_hda_codec_write(codec, hp_pin, 0,
3440 				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3441 
3442 	if (hp_pin_sense)
3443 		msleep(100);
3444 
3445 	alc_auto_setup_eapd(codec, false);
3446 	alc_shutup_pins(codec);
3447 	alc_write_coef_idx(codec, 0x78, coef78);
3448 }
3449 
3450 static const struct coef_fw alc283_coefs[] = {
3451 	WRITE_COEF(0x03, 0x0002), /* Power Down Control */
3452 	UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
3453 	WRITE_COEF(0x07, 0x0200), /* DMIC control */
3454 	UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
3455 	UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
3456 	WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
3457 	WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
3458 	WRITE_COEF(0x0e, 0x6fc0), /* LDO1/2/3, DAC/ADC */
3459 	UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
3460 	UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
3461 	WRITE_COEF(0x3a, 0x0), /* Class D test 4 */
3462 	UPDATE_COEF(0x0c, 0xfe00, 0x0), /* IO power down directly */
3463 	WRITE_COEF(0x22, 0xa0c0), /* ANC */
3464 	UPDATE_COEFEX(0x53, 0x01, 0x000f, 0x0008), /* AGC MUX */
3465 	UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
3466 	UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
3467 	WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
3468 	WRITE_COEF(0x2e, 0x2902), /* PLL */
3469 	WRITE_COEF(0x33, 0xa080), /* capless control 2 */
3470 	WRITE_COEF(0x34, 0x3400), /* capless control 3 */
3471 	WRITE_COEF(0x35, 0x2f3e), /* capless control 4 */
3472 	WRITE_COEF(0x36, 0x0), /* capless control 5 */
3473 	UPDATE_COEF(0x38, 0x0fff, 0x0900), /* class D test 2 */
3474 	WRITE_COEF(0x39, 0x110a), /* class D test 3 */
3475 	UPDATE_COEF(0x3b, 0x00f8, 0x00d8), /* class D test 5 */
3476 	WRITE_COEF(0x3c, 0x0014), /* class D test 6 */
3477 	WRITE_COEF(0x3d, 0xc2ba), /* classD OCP */
3478 	UPDATE_COEF(0x42, 0x0f80, 0x0), /* classD pure DC test */
3479 	WRITE_COEF(0x49, 0x0), /* test mode */
3480 	UPDATE_COEF(0x40, 0xf800, 0x9800), /* Class D DC enable */
3481 	UPDATE_COEF(0x42, 0xf000, 0x2000), /* DC offset */
3482 	WRITE_COEF(0x37, 0xfc06), /* Class D amp control */
3483 	UPDATE_COEF(0x1b, 0x8000, 0), /* HP JD control */
3484 	{}
3485 };
3486 
3487 static void alc283_restore_default_value(struct hda_codec *codec)
3488 {
3489 	alc_process_coef_fw(codec, alc283_coefs);
3490 }
3491 
3492 static void alc283_init(struct hda_codec *codec)
3493 {
3494 	struct alc_spec *spec = codec->spec;
3495 	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3496 	bool hp_pin_sense;
3497 
3498 	alc283_restore_default_value(codec);
3499 
3500 	if (!hp_pin)
3501 		return;
3502 
3503 	msleep(30);
3504 	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3505 
3506 	/* Index 0x43 Direct Drive HP AMP LPM Control 1 */
3507 	/* Headphone capless set to high power mode */
3508 	alc_write_coef_idx(codec, 0x43, 0x9004);
3509 
3510 	snd_hda_codec_write(codec, hp_pin, 0,
3511 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3512 
3513 	if (hp_pin_sense)
3514 		msleep(85);
3515 
3516 	snd_hda_codec_write(codec, hp_pin, 0,
3517 			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3518 
3519 	if (hp_pin_sense)
3520 		msleep(85);
3521 	/* Index 0x46 Combo jack auto switch control 2 */
3522 	/* 3k pull low control for Headset jack. */
3523 	alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
3524 	/* Headphone capless set to normal mode */
3525 	alc_write_coef_idx(codec, 0x43, 0x9614);
3526 }
3527 
3528 static void alc283_shutup(struct hda_codec *codec)
3529 {
3530 	struct alc_spec *spec = codec->spec;
3531 	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3532 	bool hp_pin_sense;
3533 
3534 	if (!hp_pin) {
3535 		alc269_shutup(codec);
3536 		return;
3537 	}
3538 
3539 	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3540 
3541 	alc_write_coef_idx(codec, 0x43, 0x9004);
3542 
3543 	/*depop hp during suspend*/
3544 	alc_write_coef_idx(codec, 0x06, 0x2100);
3545 
3546 	snd_hda_codec_write(codec, hp_pin, 0,
3547 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3548 
3549 	if (hp_pin_sense)
3550 		msleep(100);
3551 
3552 	if (!spec->no_shutup_pins)
3553 		snd_hda_codec_write(codec, hp_pin, 0,
3554 				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3555 
3556 	alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
3557 
3558 	if (hp_pin_sense)
3559 		msleep(100);
3560 	alc_auto_setup_eapd(codec, false);
3561 	alc_shutup_pins(codec);
3562 	alc_write_coef_idx(codec, 0x43, 0x9614);
3563 }
3564 
3565 static void alc256_init(struct hda_codec *codec)
3566 {
3567 	struct alc_spec *spec = codec->spec;
3568 	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3569 	bool hp_pin_sense;
3570 
3571 	if (spec->ultra_low_power) {
3572 		alc_update_coef_idx(codec, 0x03, 1<<1, 1<<1);
3573 		alc_update_coef_idx(codec, 0x08, 3<<2, 3<<2);
3574 		alc_update_coef_idx(codec, 0x08, 7<<4, 0);
3575 		alc_update_coef_idx(codec, 0x3b, 1<<15, 0);
3576 		alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3577 		msleep(30);
3578 	}
3579 
3580 	if (!hp_pin)
3581 		hp_pin = 0x21;
3582 
3583 	msleep(30);
3584 
3585 	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3586 
3587 	if (hp_pin_sense)
3588 		msleep(2);
3589 
3590 	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
3591 
3592 	snd_hda_codec_write(codec, hp_pin, 0,
3593 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3594 
3595 	if (hp_pin_sense || spec->ultra_low_power)
3596 		msleep(85);
3597 
3598 	snd_hda_codec_write(codec, hp_pin, 0,
3599 			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3600 
3601 	if (hp_pin_sense || spec->ultra_low_power)
3602 		msleep(100);
3603 
3604 	alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
3605 	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
3606 	alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15); /* Clear bit */
3607 	alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15);
3608 	/*
3609 	 * Expose headphone mic (or possibly Line In on some machines) instead
3610 	 * of PC Beep on 1Ah, and disable 1Ah loopback for all outputs. See
3611 	 * Documentation/sound/hd-audio/realtek-pc-beep.rst for details of
3612 	 * this register.
3613 	 */
3614 	alc_write_coef_idx(codec, 0x36, 0x5757);
3615 }
3616 
3617 static void alc256_shutup(struct hda_codec *codec)
3618 {
3619 	struct alc_spec *spec = codec->spec;
3620 	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3621 	bool hp_pin_sense;
3622 
3623 	if (!hp_pin)
3624 		hp_pin = 0x21;
3625 
3626 	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
3627 	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3628 
3629 	if (hp_pin_sense)
3630 		msleep(2);
3631 
3632 	snd_hda_codec_write(codec, hp_pin, 0,
3633 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3634 
3635 	if (hp_pin_sense || spec->ultra_low_power)
3636 		msleep(85);
3637 
3638 	/* 3k pull low control for Headset jack. */
3639 	/* NOTE: call this before clearing the pin, otherwise codec stalls */
3640 	/* If disable 3k pulldown control for alc257, the Mic detection will not work correctly
3641 	 * when booting with headset plugged. So skip setting it for the codec alc257
3642 	 */
3643 	if (spec->en_3kpull_low)
3644 		alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
3645 
3646 	if (!spec->no_shutup_pins)
3647 		snd_hda_codec_write(codec, hp_pin, 0,
3648 				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3649 
3650 	if (hp_pin_sense || spec->ultra_low_power)
3651 		msleep(100);
3652 
3653 	alc_auto_setup_eapd(codec, false);
3654 	alc_shutup_pins(codec);
3655 	if (spec->ultra_low_power) {
3656 		msleep(50);
3657 		alc_update_coef_idx(codec, 0x03, 1<<1, 0);
3658 		alc_update_coef_idx(codec, 0x08, 7<<4, 7<<4);
3659 		alc_update_coef_idx(codec, 0x08, 3<<2, 0);
3660 		alc_update_coef_idx(codec, 0x3b, 1<<15, 1<<15);
3661 		alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3662 		msleep(30);
3663 	}
3664 }
3665 
3666 static void alc285_hp_init(struct hda_codec *codec)
3667 {
3668 	struct alc_spec *spec = codec->spec;
3669 	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3670 	int i, val;
3671 	int coef38, coef0d, coef36;
3672 
3673 	alc_update_coef_idx(codec, 0x4a, 1<<15, 1<<15); /* Reset HP JD */
3674 	coef38 = alc_read_coef_idx(codec, 0x38); /* Amp control */
3675 	coef0d = alc_read_coef_idx(codec, 0x0d); /* Digital Misc control */
3676 	coef36 = alc_read_coef_idx(codec, 0x36); /* Passthrough Control */
3677 	alc_update_coef_idx(codec, 0x38, 1<<4, 0x0);
3678 	alc_update_coef_idx(codec, 0x0d, 0x110, 0x0);
3679 
3680 	alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
3681 
3682 	if (hp_pin)
3683 		snd_hda_codec_write(codec, hp_pin, 0,
3684 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3685 
3686 	msleep(130);
3687 	alc_update_coef_idx(codec, 0x36, 1<<14, 1<<14);
3688 	alc_update_coef_idx(codec, 0x36, 1<<13, 0x0);
3689 
3690 	if (hp_pin)
3691 		snd_hda_codec_write(codec, hp_pin, 0,
3692 			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3693 	msleep(10);
3694 	alc_write_coef_idx(codec, 0x67, 0x0); /* Set HP depop to manual mode */
3695 	alc_write_coefex_idx(codec, 0x58, 0x00, 0x7880);
3696 	alc_write_coefex_idx(codec, 0x58, 0x0f, 0xf049);
3697 	alc_update_coefex_idx(codec, 0x58, 0x03, 0x00f0, 0x00c0);
3698 
3699 	alc_write_coefex_idx(codec, 0x58, 0x00, 0xf888); /* HP depop procedure start */
3700 	val = alc_read_coefex_idx(codec, 0x58, 0x00);
3701 	for (i = 0; i < 20 && val & 0x8000; i++) {
3702 		msleep(50);
3703 		val = alc_read_coefex_idx(codec, 0x58, 0x00);
3704 	} /* Wait for depop procedure finish  */
3705 
3706 	alc_write_coefex_idx(codec, 0x58, 0x00, val); /* write back the result */
3707 	alc_update_coef_idx(codec, 0x38, 1<<4, coef38);
3708 	alc_update_coef_idx(codec, 0x0d, 0x110, coef0d);
3709 	alc_update_coef_idx(codec, 0x36, 3<<13, coef36);
3710 
3711 	msleep(50);
3712 	alc_update_coef_idx(codec, 0x4a, 1<<15, 0);
3713 }
3714 
3715 static void alc225_init(struct hda_codec *codec)
3716 {
3717 	struct alc_spec *spec = codec->spec;
3718 	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3719 	bool hp1_pin_sense, hp2_pin_sense;
3720 
3721 	if (spec->ultra_low_power) {
3722 		alc_update_coef_idx(codec, 0x08, 0x0f << 2, 3<<2);
3723 		alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3724 		alc_update_coef_idx(codec, 0x33, 1<<11, 0);
3725 		msleep(30);
3726 	}
3727 
3728 	if (spec->codec_variant != ALC269_TYPE_ALC287 &&
3729 		spec->codec_variant != ALC269_TYPE_ALC245)
3730 		/* required only at boot or S3 and S4 resume time */
3731 		if (!spec->done_hp_init ||
3732 			is_s3_resume(codec) ||
3733 			is_s4_resume(codec)) {
3734 			alc285_hp_init(codec);
3735 			spec->done_hp_init = true;
3736 		}
3737 
3738 	if (!hp_pin)
3739 		hp_pin = 0x21;
3740 	msleep(30);
3741 
3742 	hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3743 	hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3744 
3745 	if (hp1_pin_sense || hp2_pin_sense)
3746 		msleep(2);
3747 
3748 	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
3749 
3750 	if (hp1_pin_sense || spec->ultra_low_power)
3751 		snd_hda_codec_write(codec, hp_pin, 0,
3752 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3753 	if (hp2_pin_sense)
3754 		snd_hda_codec_write(codec, 0x16, 0,
3755 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3756 
3757 	if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3758 		msleep(85);
3759 
3760 	if (hp1_pin_sense || spec->ultra_low_power)
3761 		snd_hda_codec_write(codec, hp_pin, 0,
3762 			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3763 	if (hp2_pin_sense)
3764 		snd_hda_codec_write(codec, 0x16, 0,
3765 			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3766 
3767 	if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3768 		msleep(100);
3769 
3770 	alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3771 	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
3772 }
3773 
3774 static void alc225_shutup(struct hda_codec *codec)
3775 {
3776 	struct alc_spec *spec = codec->spec;
3777 	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3778 	bool hp1_pin_sense, hp2_pin_sense;
3779 
3780 	if (!hp_pin)
3781 		hp_pin = 0x21;
3782 
3783 	alc_disable_headset_jack_key(codec);
3784 	/* 3k pull low control for Headset jack. */
3785 	alc_update_coef_idx(codec, 0x4a, 0, 3 << 10);
3786 
3787 	hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3788 	hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3789 
3790 	if (hp1_pin_sense || hp2_pin_sense)
3791 		msleep(2);
3792 
3793 	if (hp1_pin_sense || spec->ultra_low_power)
3794 		snd_hda_codec_write(codec, hp_pin, 0,
3795 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3796 	if (hp2_pin_sense)
3797 		snd_hda_codec_write(codec, 0x16, 0,
3798 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3799 
3800 	if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3801 		msleep(85);
3802 
3803 	if (hp1_pin_sense || spec->ultra_low_power)
3804 		snd_hda_codec_write(codec, hp_pin, 0,
3805 			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3806 	if (hp2_pin_sense)
3807 		snd_hda_codec_write(codec, 0x16, 0,
3808 			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3809 
3810 	if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3811 		msleep(100);
3812 
3813 	alc_auto_setup_eapd(codec, false);
3814 	alc_shutup_pins(codec);
3815 	if (spec->ultra_low_power) {
3816 		msleep(50);
3817 		alc_update_coef_idx(codec, 0x08, 0x0f << 2, 0x0c << 2);
3818 		alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3819 		alc_update_coef_idx(codec, 0x33, 1<<11, 1<<11);
3820 		alc_update_coef_idx(codec, 0x4a, 3<<4, 2<<4);
3821 		msleep(30);
3822 	}
3823 
3824 	alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3825 	alc_enable_headset_jack_key(codec);
3826 }
3827 
3828 static void alc_default_init(struct hda_codec *codec)
3829 {
3830 	struct alc_spec *spec = codec->spec;
3831 	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3832 	bool hp_pin_sense;
3833 
3834 	if (!hp_pin)
3835 		return;
3836 
3837 	msleep(30);
3838 
3839 	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3840 
3841 	if (hp_pin_sense)
3842 		msleep(2);
3843 
3844 	snd_hda_codec_write(codec, hp_pin, 0,
3845 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3846 
3847 	if (hp_pin_sense)
3848 		msleep(85);
3849 
3850 	snd_hda_codec_write(codec, hp_pin, 0,
3851 			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3852 
3853 	if (hp_pin_sense)
3854 		msleep(100);
3855 }
3856 
3857 static void alc_default_shutup(struct hda_codec *codec)
3858 {
3859 	struct alc_spec *spec = codec->spec;
3860 	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3861 	bool hp_pin_sense;
3862 
3863 	if (!hp_pin) {
3864 		alc269_shutup(codec);
3865 		return;
3866 	}
3867 
3868 	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3869 
3870 	if (hp_pin_sense)
3871 		msleep(2);
3872 
3873 	snd_hda_codec_write(codec, hp_pin, 0,
3874 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3875 
3876 	if (hp_pin_sense)
3877 		msleep(85);
3878 
3879 	if (!spec->no_shutup_pins)
3880 		snd_hda_codec_write(codec, hp_pin, 0,
3881 				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3882 
3883 	if (hp_pin_sense)
3884 		msleep(100);
3885 
3886 	alc_auto_setup_eapd(codec, false);
3887 	alc_shutup_pins(codec);
3888 }
3889 
3890 static void alc294_hp_init(struct hda_codec *codec)
3891 {
3892 	struct alc_spec *spec = codec->spec;
3893 	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3894 	int i, val;
3895 
3896 	if (!hp_pin)
3897 		return;
3898 
3899 	snd_hda_codec_write(codec, hp_pin, 0,
3900 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3901 
3902 	msleep(100);
3903 
3904 	if (!spec->no_shutup_pins)
3905 		snd_hda_codec_write(codec, hp_pin, 0,
3906 				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3907 
3908 	alc_update_coef_idx(codec, 0x6f, 0x000f, 0);/* Set HP depop to manual mode */
3909 	alc_update_coefex_idx(codec, 0x58, 0x00, 0x8000, 0x8000); /* HP depop procedure start */
3910 
3911 	/* Wait for depop procedure finish  */
3912 	val = alc_read_coefex_idx(codec, 0x58, 0x01);
3913 	for (i = 0; i < 20 && val & 0x0080; i++) {
3914 		msleep(50);
3915 		val = alc_read_coefex_idx(codec, 0x58, 0x01);
3916 	}
3917 	/* Set HP depop to auto mode */
3918 	alc_update_coef_idx(codec, 0x6f, 0x000f, 0x000b);
3919 	msleep(50);
3920 }
3921 
3922 static void alc294_init(struct hda_codec *codec)
3923 {
3924 	struct alc_spec *spec = codec->spec;
3925 
3926 	/* required only at boot or S4 resume time */
3927 	if (!spec->done_hp_init ||
3928 	    codec->core.dev.power.power_state.event == PM_EVENT_RESTORE) {
3929 		alc294_hp_init(codec);
3930 		spec->done_hp_init = true;
3931 	}
3932 	alc_default_init(codec);
3933 }
3934 
3935 static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg,
3936 			     unsigned int val)
3937 {
3938 	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3939 	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val & 0xffff); /* LSB */
3940 	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val >> 16); /* MSB */
3941 }
3942 
3943 static int alc5505_coef_get(struct hda_codec *codec, unsigned int index_reg)
3944 {
3945 	unsigned int val;
3946 
3947 	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3948 	val = snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3949 		& 0xffff;
3950 	val |= snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3951 		<< 16;
3952 	return val;
3953 }
3954 
3955 static void alc5505_dsp_halt(struct hda_codec *codec)
3956 {
3957 	unsigned int val;
3958 
3959 	alc5505_coef_set(codec, 0x3000, 0x000c); /* DSP CPU stop */
3960 	alc5505_coef_set(codec, 0x880c, 0x0008); /* DDR enter self refresh */
3961 	alc5505_coef_set(codec, 0x61c0, 0x11110080); /* Clock control for PLL and CPU */
3962 	alc5505_coef_set(codec, 0x6230, 0xfc0d4011); /* Disable Input OP */
3963 	alc5505_coef_set(codec, 0x61b4, 0x040a2b03); /* Stop PLL2 */
3964 	alc5505_coef_set(codec, 0x61b0, 0x00005b17); /* Stop PLL1 */
3965 	alc5505_coef_set(codec, 0x61b8, 0x04133303); /* Stop PLL3 */
3966 	val = alc5505_coef_get(codec, 0x6220);
3967 	alc5505_coef_set(codec, 0x6220, (val | 0x3000)); /* switch Ringbuffer clock to DBUS clock */
3968 }
3969 
3970 static void alc5505_dsp_back_from_halt(struct hda_codec *codec)
3971 {
3972 	alc5505_coef_set(codec, 0x61b8, 0x04133302);
3973 	alc5505_coef_set(codec, 0x61b0, 0x00005b16);
3974 	alc5505_coef_set(codec, 0x61b4, 0x040a2b02);
3975 	alc5505_coef_set(codec, 0x6230, 0xf80d4011);
3976 	alc5505_coef_set(codec, 0x6220, 0x2002010f);
3977 	alc5505_coef_set(codec, 0x880c, 0x00000004);
3978 }
3979 
3980 static void alc5505_dsp_init(struct hda_codec *codec)
3981 {
3982 	unsigned int val;
3983 
3984 	alc5505_dsp_halt(codec);
3985 	alc5505_dsp_back_from_halt(codec);
3986 	alc5505_coef_set(codec, 0x61b0, 0x5b14); /* PLL1 control */
3987 	alc5505_coef_set(codec, 0x61b0, 0x5b16);
3988 	alc5505_coef_set(codec, 0x61b4, 0x04132b00); /* PLL2 control */
3989 	alc5505_coef_set(codec, 0x61b4, 0x04132b02);
3990 	alc5505_coef_set(codec, 0x61b8, 0x041f3300); /* PLL3 control*/
3991 	alc5505_coef_set(codec, 0x61b8, 0x041f3302);
3992 	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_CODEC_RESET, 0); /* Function reset */
3993 	alc5505_coef_set(codec, 0x61b8, 0x041b3302);
3994 	alc5505_coef_set(codec, 0x61b8, 0x04173302);
3995 	alc5505_coef_set(codec, 0x61b8, 0x04163302);
3996 	alc5505_coef_set(codec, 0x8800, 0x348b328b); /* DRAM control */
3997 	alc5505_coef_set(codec, 0x8808, 0x00020022); /* DRAM control */
3998 	alc5505_coef_set(codec, 0x8818, 0x00000400); /* DRAM control */
3999 
4000 	val = alc5505_coef_get(codec, 0x6200) >> 16; /* Read revision ID */
4001 	if (val <= 3)
4002 		alc5505_coef_set(codec, 0x6220, 0x2002010f); /* I/O PAD Configuration */
4003 	else
4004 		alc5505_coef_set(codec, 0x6220, 0x6002018f);
4005 
4006 	alc5505_coef_set(codec, 0x61ac, 0x055525f0); /**/
4007 	alc5505_coef_set(codec, 0x61c0, 0x12230080); /* Clock control */
4008 	alc5505_coef_set(codec, 0x61b4, 0x040e2b02); /* PLL2 control */
4009 	alc5505_coef_set(codec, 0x61bc, 0x010234f8); /* OSC Control */
4010 	alc5505_coef_set(codec, 0x880c, 0x00000004); /* DRAM Function control */
4011 	alc5505_coef_set(codec, 0x880c, 0x00000003);
4012 	alc5505_coef_set(codec, 0x880c, 0x00000010);
4013 
4014 #ifdef HALT_REALTEK_ALC5505
4015 	alc5505_dsp_halt(codec);
4016 #endif
4017 }
4018 
4019 #ifdef HALT_REALTEK_ALC5505
4020 #define alc5505_dsp_suspend(codec)	do { } while (0) /* NOP */
4021 #define alc5505_dsp_resume(codec)	do { } while (0) /* NOP */
4022 #else
4023 #define alc5505_dsp_suspend(codec)	alc5505_dsp_halt(codec)
4024 #define alc5505_dsp_resume(codec)	alc5505_dsp_back_from_halt(codec)
4025 #endif
4026 
4027 #ifdef CONFIG_PM
4028 static int alc269_suspend(struct hda_codec *codec)
4029 {
4030 	struct alc_spec *spec = codec->spec;
4031 
4032 	if (spec->has_alc5505_dsp)
4033 		alc5505_dsp_suspend(codec);
4034 
4035 	return alc_suspend(codec);
4036 }
4037 
4038 static int alc269_resume(struct hda_codec *codec)
4039 {
4040 	struct alc_spec *spec = codec->spec;
4041 
4042 	if (spec->codec_variant == ALC269_TYPE_ALC269VB)
4043 		alc269vb_toggle_power_output(codec, 0);
4044 	if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
4045 			(alc_get_coef0(codec) & 0x00ff) == 0x018) {
4046 		msleep(150);
4047 	}
4048 
4049 	codec->patch_ops.init(codec);
4050 
4051 	if (spec->codec_variant == ALC269_TYPE_ALC269VB)
4052 		alc269vb_toggle_power_output(codec, 1);
4053 	if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
4054 			(alc_get_coef0(codec) & 0x00ff) == 0x017) {
4055 		msleep(200);
4056 	}
4057 
4058 	snd_hda_regmap_sync(codec);
4059 	hda_call_check_power_status(codec, 0x01);
4060 
4061 	/* on some machine, the BIOS will clear the codec gpio data when enter
4062 	 * suspend, and won't restore the data after resume, so we restore it
4063 	 * in the driver.
4064 	 */
4065 	if (spec->gpio_data)
4066 		alc_write_gpio_data(codec);
4067 
4068 	if (spec->has_alc5505_dsp)
4069 		alc5505_dsp_resume(codec);
4070 
4071 	return 0;
4072 }
4073 #endif /* CONFIG_PM */
4074 
4075 static void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec,
4076 						 const struct hda_fixup *fix, int action)
4077 {
4078 	struct alc_spec *spec = codec->spec;
4079 
4080 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
4081 		spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
4082 }
4083 
4084 static void alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec *codec,
4085 						 const struct hda_fixup *fix,
4086 						 int action)
4087 {
4088 	unsigned int cfg_headphone = snd_hda_codec_get_pincfg(codec, 0x21);
4089 	unsigned int cfg_headset_mic = snd_hda_codec_get_pincfg(codec, 0x19);
4090 
4091 	if (cfg_headphone && cfg_headset_mic == 0x411111f0)
4092 		snd_hda_codec_set_pincfg(codec, 0x19,
4093 			(cfg_headphone & ~AC_DEFCFG_DEVICE) |
4094 			(AC_JACK_MIC_IN << AC_DEFCFG_DEVICE_SHIFT));
4095 }
4096 
4097 static void alc269_fixup_hweq(struct hda_codec *codec,
4098 			       const struct hda_fixup *fix, int action)
4099 {
4100 	if (action == HDA_FIXUP_ACT_INIT)
4101 		alc_update_coef_idx(codec, 0x1e, 0, 0x80);
4102 }
4103 
4104 static void alc269_fixup_headset_mic(struct hda_codec *codec,
4105 				       const struct hda_fixup *fix, int action)
4106 {
4107 	struct alc_spec *spec = codec->spec;
4108 
4109 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
4110 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
4111 }
4112 
4113 static void alc271_fixup_dmic(struct hda_codec *codec,
4114 			      const struct hda_fixup *fix, int action)
4115 {
4116 	static const struct hda_verb verbs[] = {
4117 		{0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
4118 		{0x20, AC_VERB_SET_PROC_COEF, 0x4000},
4119 		{}
4120 	};
4121 	unsigned int cfg;
4122 
4123 	if (strcmp(codec->core.chip_name, "ALC271X") &&
4124 	    strcmp(codec->core.chip_name, "ALC269VB"))
4125 		return;
4126 	cfg = snd_hda_codec_get_pincfg(codec, 0x12);
4127 	if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED)
4128 		snd_hda_sequence_write(codec, verbs);
4129 }
4130 
4131 /* Fix the speaker amp after resume, etc */
4132 static void alc269vb_fixup_aspire_e1_coef(struct hda_codec *codec,
4133 					  const struct hda_fixup *fix,
4134 					  int action)
4135 {
4136 	if (action == HDA_FIXUP_ACT_INIT)
4137 		alc_update_coef_idx(codec, 0x0d, 0x6000, 0x6000);
4138 }
4139 
4140 static void alc269_fixup_pcm_44k(struct hda_codec *codec,
4141 				 const struct hda_fixup *fix, int action)
4142 {
4143 	struct alc_spec *spec = codec->spec;
4144 
4145 	if (action != HDA_FIXUP_ACT_PROBE)
4146 		return;
4147 
4148 	/* Due to a hardware problem on Lenovo Ideadpad, we need to
4149 	 * fix the sample rate of analog I/O to 44.1kHz
4150 	 */
4151 	spec->gen.stream_analog_playback = &alc269_44k_pcm_analog_playback;
4152 	spec->gen.stream_analog_capture = &alc269_44k_pcm_analog_capture;
4153 }
4154 
4155 static void alc269_fixup_stereo_dmic(struct hda_codec *codec,
4156 				     const struct hda_fixup *fix, int action)
4157 {
4158 	/* The digital-mic unit sends PDM (differential signal) instead of
4159 	 * the standard PCM, thus you can't record a valid mono stream as is.
4160 	 * Below is a workaround specific to ALC269 to control the dmic
4161 	 * signal source as mono.
4162 	 */
4163 	if (action == HDA_FIXUP_ACT_INIT)
4164 		alc_update_coef_idx(codec, 0x07, 0, 0x80);
4165 }
4166 
4167 static void alc269_quanta_automute(struct hda_codec *codec)
4168 {
4169 	snd_hda_gen_update_outputs(codec);
4170 
4171 	alc_write_coef_idx(codec, 0x0c, 0x680);
4172 	alc_write_coef_idx(codec, 0x0c, 0x480);
4173 }
4174 
4175 static void alc269_fixup_quanta_mute(struct hda_codec *codec,
4176 				     const struct hda_fixup *fix, int action)
4177 {
4178 	struct alc_spec *spec = codec->spec;
4179 	if (action != HDA_FIXUP_ACT_PROBE)
4180 		return;
4181 	spec->gen.automute_hook = alc269_quanta_automute;
4182 }
4183 
4184 static void alc269_x101_hp_automute_hook(struct hda_codec *codec,
4185 					 struct hda_jack_callback *jack)
4186 {
4187 	struct alc_spec *spec = codec->spec;
4188 	int vref;
4189 	msleep(200);
4190 	snd_hda_gen_hp_automute(codec, jack);
4191 
4192 	vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
4193 	msleep(100);
4194 	snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4195 			    vref);
4196 	msleep(500);
4197 	snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4198 			    vref);
4199 }
4200 
4201 /*
4202  * Magic sequence to make Huawei Matebook X right speaker working (bko#197801)
4203  */
4204 struct hda_alc298_mbxinit {
4205 	unsigned char value_0x23;
4206 	unsigned char value_0x25;
4207 };
4208 
4209 static void alc298_huawei_mbx_stereo_seq(struct hda_codec *codec,
4210 					 const struct hda_alc298_mbxinit *initval,
4211 					 bool first)
4212 {
4213 	snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x0);
4214 	alc_write_coef_idx(codec, 0x26, 0xb000);
4215 
4216 	if (first)
4217 		snd_hda_codec_write(codec, 0x21, 0, AC_VERB_GET_PIN_SENSE, 0x0);
4218 
4219 	snd_hda_codec_write(codec, 0x6, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
4220 	alc_write_coef_idx(codec, 0x26, 0xf000);
4221 	alc_write_coef_idx(codec, 0x23, initval->value_0x23);
4222 
4223 	if (initval->value_0x23 != 0x1e)
4224 		alc_write_coef_idx(codec, 0x25, initval->value_0x25);
4225 
4226 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
4227 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
4228 }
4229 
4230 static void alc298_fixup_huawei_mbx_stereo(struct hda_codec *codec,
4231 					   const struct hda_fixup *fix,
4232 					   int action)
4233 {
4234 	/* Initialization magic */
4235 	static const struct hda_alc298_mbxinit dac_init[] = {
4236 		{0x0c, 0x00}, {0x0d, 0x00}, {0x0e, 0x00}, {0x0f, 0x00},
4237 		{0x10, 0x00}, {0x1a, 0x40}, {0x1b, 0x82}, {0x1c, 0x00},
4238 		{0x1d, 0x00}, {0x1e, 0x00}, {0x1f, 0x00},
4239 		{0x20, 0xc2}, {0x21, 0xc8}, {0x22, 0x26}, {0x23, 0x24},
4240 		{0x27, 0xff}, {0x28, 0xff}, {0x29, 0xff}, {0x2a, 0x8f},
4241 		{0x2b, 0x02}, {0x2c, 0x48}, {0x2d, 0x34}, {0x2e, 0x00},
4242 		{0x2f, 0x00},
4243 		{0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00},
4244 		{0x34, 0x00}, {0x35, 0x01}, {0x36, 0x93}, {0x37, 0x0c},
4245 		{0x38, 0x00}, {0x39, 0x00}, {0x3a, 0xf8}, {0x38, 0x80},
4246 		{}
4247 	};
4248 	const struct hda_alc298_mbxinit *seq;
4249 
4250 	if (action != HDA_FIXUP_ACT_INIT)
4251 		return;
4252 
4253 	/* Start */
4254 	snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x00);
4255 	snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
4256 	alc_write_coef_idx(codec, 0x26, 0xf000);
4257 	alc_write_coef_idx(codec, 0x22, 0x31);
4258 	alc_write_coef_idx(codec, 0x23, 0x0b);
4259 	alc_write_coef_idx(codec, 0x25, 0x00);
4260 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
4261 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
4262 
4263 	for (seq = dac_init; seq->value_0x23; seq++)
4264 		alc298_huawei_mbx_stereo_seq(codec, seq, seq == dac_init);
4265 }
4266 
4267 static void alc269_fixup_x101_headset_mic(struct hda_codec *codec,
4268 				     const struct hda_fixup *fix, int action)
4269 {
4270 	struct alc_spec *spec = codec->spec;
4271 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4272 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
4273 		spec->gen.hp_automute_hook = alc269_x101_hp_automute_hook;
4274 	}
4275 }
4276 
4277 static void alc_update_vref_led(struct hda_codec *codec, hda_nid_t pin,
4278 				bool polarity, bool on)
4279 {
4280 	unsigned int pinval;
4281 
4282 	if (!pin)
4283 		return;
4284 	if (polarity)
4285 		on = !on;
4286 	pinval = snd_hda_codec_get_pin_target(codec, pin);
4287 	pinval &= ~AC_PINCTL_VREFEN;
4288 	pinval |= on ? AC_PINCTL_VREF_80 : AC_PINCTL_VREF_HIZ;
4289 	/* temporarily power up/down for setting VREF */
4290 	snd_hda_power_up_pm(codec);
4291 	snd_hda_set_pin_ctl_cache(codec, pin, pinval);
4292 	snd_hda_power_down_pm(codec);
4293 }
4294 
4295 /* update mute-LED according to the speaker mute state via mic VREF pin */
4296 static int vref_mute_led_set(struct led_classdev *led_cdev,
4297 			     enum led_brightness brightness)
4298 {
4299 	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4300 	struct alc_spec *spec = codec->spec;
4301 
4302 	alc_update_vref_led(codec, spec->mute_led_nid,
4303 			    spec->mute_led_polarity, brightness);
4304 	return 0;
4305 }
4306 
4307 /* Make sure the led works even in runtime suspend */
4308 static unsigned int led_power_filter(struct hda_codec *codec,
4309 						  hda_nid_t nid,
4310 						  unsigned int power_state)
4311 {
4312 	struct alc_spec *spec = codec->spec;
4313 
4314 	if (power_state != AC_PWRST_D3 || nid == 0 ||
4315 	    (nid != spec->mute_led_nid && nid != spec->cap_mute_led_nid))
4316 		return power_state;
4317 
4318 	/* Set pin ctl again, it might have just been set to 0 */
4319 	snd_hda_set_pin_ctl(codec, nid,
4320 			    snd_hda_codec_get_pin_target(codec, nid));
4321 
4322 	return snd_hda_gen_path_power_filter(codec, nid, power_state);
4323 }
4324 
4325 static void alc269_fixup_hp_mute_led(struct hda_codec *codec,
4326 				     const struct hda_fixup *fix, int action)
4327 {
4328 	struct alc_spec *spec = codec->spec;
4329 	const struct dmi_device *dev = NULL;
4330 
4331 	if (action != HDA_FIXUP_ACT_PRE_PROBE)
4332 		return;
4333 
4334 	while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) {
4335 		int pol, pin;
4336 		if (sscanf(dev->name, "HP_Mute_LED_%d_%x", &pol, &pin) != 2)
4337 			continue;
4338 		if (pin < 0x0a || pin >= 0x10)
4339 			break;
4340 		spec->mute_led_polarity = pol;
4341 		spec->mute_led_nid = pin - 0x0a + 0x18;
4342 		snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
4343 		codec->power_filter = led_power_filter;
4344 		codec_dbg(codec,
4345 			  "Detected mute LED for %x:%d\n", spec->mute_led_nid,
4346 			   spec->mute_led_polarity);
4347 		break;
4348 	}
4349 }
4350 
4351 static void alc269_fixup_hp_mute_led_micx(struct hda_codec *codec,
4352 					  const struct hda_fixup *fix,
4353 					  int action, hda_nid_t pin)
4354 {
4355 	struct alc_spec *spec = codec->spec;
4356 
4357 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4358 		spec->mute_led_polarity = 0;
4359 		spec->mute_led_nid = pin;
4360 		snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
4361 		codec->power_filter = led_power_filter;
4362 	}
4363 }
4364 
4365 static void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec,
4366 				const struct hda_fixup *fix, int action)
4367 {
4368 	alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x18);
4369 }
4370 
4371 static void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec,
4372 				const struct hda_fixup *fix, int action)
4373 {
4374 	alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x19);
4375 }
4376 
4377 static void alc269_fixup_hp_mute_led_mic3(struct hda_codec *codec,
4378 				const struct hda_fixup *fix, int action)
4379 {
4380 	alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1b);
4381 }
4382 
4383 /* update LED status via GPIO */
4384 static void alc_update_gpio_led(struct hda_codec *codec, unsigned int mask,
4385 				int polarity, bool enabled)
4386 {
4387 	if (polarity)
4388 		enabled = !enabled;
4389 	alc_update_gpio_data(codec, mask, !enabled); /* muted -> LED on */
4390 }
4391 
4392 /* turn on/off mute LED via GPIO per vmaster hook */
4393 static int gpio_mute_led_set(struct led_classdev *led_cdev,
4394 			     enum led_brightness brightness)
4395 {
4396 	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4397 	struct alc_spec *spec = codec->spec;
4398 
4399 	alc_update_gpio_led(codec, spec->gpio_mute_led_mask,
4400 			    spec->mute_led_polarity, !brightness);
4401 	return 0;
4402 }
4403 
4404 /* turn on/off mic-mute LED via GPIO per capture hook */
4405 static int micmute_led_set(struct led_classdev *led_cdev,
4406 			   enum led_brightness brightness)
4407 {
4408 	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4409 	struct alc_spec *spec = codec->spec;
4410 
4411 	alc_update_gpio_led(codec, spec->gpio_mic_led_mask,
4412 			    spec->micmute_led_polarity, !brightness);
4413 	return 0;
4414 }
4415 
4416 /* setup mute and mic-mute GPIO bits, add hooks appropriately */
4417 static void alc_fixup_hp_gpio_led(struct hda_codec *codec,
4418 				  int action,
4419 				  unsigned int mute_mask,
4420 				  unsigned int micmute_mask)
4421 {
4422 	struct alc_spec *spec = codec->spec;
4423 
4424 	alc_fixup_gpio(codec, action, mute_mask | micmute_mask);
4425 
4426 	if (action != HDA_FIXUP_ACT_PRE_PROBE)
4427 		return;
4428 	if (mute_mask) {
4429 		spec->gpio_mute_led_mask = mute_mask;
4430 		snd_hda_gen_add_mute_led_cdev(codec, gpio_mute_led_set);
4431 	}
4432 	if (micmute_mask) {
4433 		spec->gpio_mic_led_mask = micmute_mask;
4434 		snd_hda_gen_add_micmute_led_cdev(codec, micmute_led_set);
4435 	}
4436 }
4437 
4438 static void alc236_fixup_hp_gpio_led(struct hda_codec *codec,
4439 				const struct hda_fixup *fix, int action)
4440 {
4441 	alc_fixup_hp_gpio_led(codec, action, 0x02, 0x01);
4442 }
4443 
4444 static void alc269_fixup_hp_gpio_led(struct hda_codec *codec,
4445 				const struct hda_fixup *fix, int action)
4446 {
4447 	alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
4448 }
4449 
4450 static void alc285_fixup_hp_gpio_led(struct hda_codec *codec,
4451 				const struct hda_fixup *fix, int action)
4452 {
4453 	alc_fixup_hp_gpio_led(codec, action, 0x04, 0x01);
4454 }
4455 
4456 static void alc286_fixup_hp_gpio_led(struct hda_codec *codec,
4457 				const struct hda_fixup *fix, int action)
4458 {
4459 	alc_fixup_hp_gpio_led(codec, action, 0x02, 0x20);
4460 }
4461 
4462 static void alc287_fixup_hp_gpio_led(struct hda_codec *codec,
4463 				const struct hda_fixup *fix, int action)
4464 {
4465 	alc_fixup_hp_gpio_led(codec, action, 0x10, 0);
4466 }
4467 
4468 static void alc245_fixup_hp_gpio_led(struct hda_codec *codec,
4469 				const struct hda_fixup *fix, int action)
4470 {
4471 	struct alc_spec *spec = codec->spec;
4472 
4473 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
4474 		spec->micmute_led_polarity = 1;
4475 	alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
4476 }
4477 
4478 /* turn on/off mic-mute LED per capture hook via VREF change */
4479 static int vref_micmute_led_set(struct led_classdev *led_cdev,
4480 				enum led_brightness brightness)
4481 {
4482 	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4483 	struct alc_spec *spec = codec->spec;
4484 
4485 	alc_update_vref_led(codec, spec->cap_mute_led_nid,
4486 			    spec->micmute_led_polarity, brightness);
4487 	return 0;
4488 }
4489 
4490 static void alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec,
4491 				const struct hda_fixup *fix, int action)
4492 {
4493 	struct alc_spec *spec = codec->spec;
4494 
4495 	alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
4496 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4497 		/* Like hp_gpio_mic1_led, but also needs GPIO4 low to
4498 		 * enable headphone amp
4499 		 */
4500 		spec->gpio_mask |= 0x10;
4501 		spec->gpio_dir |= 0x10;
4502 		spec->cap_mute_led_nid = 0x18;
4503 		snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4504 		codec->power_filter = led_power_filter;
4505 	}
4506 }
4507 
4508 static void alc280_fixup_hp_gpio4(struct hda_codec *codec,
4509 				   const struct hda_fixup *fix, int action)
4510 {
4511 	struct alc_spec *spec = codec->spec;
4512 
4513 	alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
4514 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4515 		spec->cap_mute_led_nid = 0x18;
4516 		snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4517 		codec->power_filter = led_power_filter;
4518 	}
4519 }
4520 
4521 /* HP Spectre x360 14 model needs a unique workaround for enabling the amp;
4522  * it needs to toggle the GPIO0 once on and off at each time (bko#210633)
4523  */
4524 static void alc245_fixup_hp_x360_amp(struct hda_codec *codec,
4525 				     const struct hda_fixup *fix, int action)
4526 {
4527 	struct alc_spec *spec = codec->spec;
4528 
4529 	switch (action) {
4530 	case HDA_FIXUP_ACT_PRE_PROBE:
4531 		spec->gpio_mask |= 0x01;
4532 		spec->gpio_dir |= 0x01;
4533 		break;
4534 	case HDA_FIXUP_ACT_INIT:
4535 		/* need to toggle GPIO to enable the amp */
4536 		alc_update_gpio_data(codec, 0x01, true);
4537 		msleep(100);
4538 		alc_update_gpio_data(codec, 0x01, false);
4539 		break;
4540 	}
4541 }
4542 
4543 /* toggle GPIO2 at each time stream is started; we use PREPARE state instead */
4544 static void alc274_hp_envy_pcm_hook(struct hda_pcm_stream *hinfo,
4545 				    struct hda_codec *codec,
4546 				    struct snd_pcm_substream *substream,
4547 				    int action)
4548 {
4549 	switch (action) {
4550 	case HDA_GEN_PCM_ACT_PREPARE:
4551 		alc_update_gpio_data(codec, 0x04, true);
4552 		break;
4553 	case HDA_GEN_PCM_ACT_CLEANUP:
4554 		alc_update_gpio_data(codec, 0x04, false);
4555 		break;
4556 	}
4557 }
4558 
4559 static void alc274_fixup_hp_envy_gpio(struct hda_codec *codec,
4560 				      const struct hda_fixup *fix,
4561 				      int action)
4562 {
4563 	struct alc_spec *spec = codec->spec;
4564 
4565 	if (action == HDA_FIXUP_ACT_PROBE) {
4566 		spec->gpio_mask |= 0x04;
4567 		spec->gpio_dir |= 0x04;
4568 		spec->gen.pcm_playback_hook = alc274_hp_envy_pcm_hook;
4569 	}
4570 }
4571 
4572 static void alc_update_coef_led(struct hda_codec *codec,
4573 				struct alc_coef_led *led,
4574 				bool polarity, bool on)
4575 {
4576 	if (polarity)
4577 		on = !on;
4578 	/* temporarily power up/down for setting COEF bit */
4579 	alc_update_coef_idx(codec, led->idx, led->mask,
4580 			    on ? led->on : led->off);
4581 }
4582 
4583 /* update mute-LED according to the speaker mute state via COEF bit */
4584 static int coef_mute_led_set(struct led_classdev *led_cdev,
4585 			     enum led_brightness brightness)
4586 {
4587 	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4588 	struct alc_spec *spec = codec->spec;
4589 
4590 	alc_update_coef_led(codec, &spec->mute_led_coef,
4591 			    spec->mute_led_polarity, brightness);
4592 	return 0;
4593 }
4594 
4595 static void alc285_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4596 					  const struct hda_fixup *fix,
4597 					  int action)
4598 {
4599 	struct alc_spec *spec = codec->spec;
4600 
4601 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4602 		spec->mute_led_polarity = 0;
4603 		spec->mute_led_coef.idx = 0x0b;
4604 		spec->mute_led_coef.mask = 1 << 3;
4605 		spec->mute_led_coef.on = 1 << 3;
4606 		spec->mute_led_coef.off = 0;
4607 		snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4608 	}
4609 }
4610 
4611 static void alc236_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4612 					  const struct hda_fixup *fix,
4613 					  int action)
4614 {
4615 	struct alc_spec *spec = codec->spec;
4616 
4617 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4618 		spec->mute_led_polarity = 0;
4619 		spec->mute_led_coef.idx = 0x34;
4620 		spec->mute_led_coef.mask = 1 << 5;
4621 		spec->mute_led_coef.on = 0;
4622 		spec->mute_led_coef.off = 1 << 5;
4623 		snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4624 	}
4625 }
4626 
4627 static void alc236_fixup_hp_mute_led_coefbit2(struct hda_codec *codec,
4628 					  const struct hda_fixup *fix, int action)
4629 {
4630 	struct alc_spec *spec = codec->spec;
4631 
4632 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4633 		spec->mute_led_polarity = 0;
4634 		spec->mute_led_coef.idx = 0x07;
4635 		spec->mute_led_coef.mask = 1;
4636 		spec->mute_led_coef.on = 1;
4637 		spec->mute_led_coef.off = 0;
4638 		snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4639 	}
4640 }
4641 
4642 /* turn on/off mic-mute LED per capture hook by coef bit */
4643 static int coef_micmute_led_set(struct led_classdev *led_cdev,
4644 				enum led_brightness brightness)
4645 {
4646 	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4647 	struct alc_spec *spec = codec->spec;
4648 
4649 	alc_update_coef_led(codec, &spec->mic_led_coef,
4650 			    spec->micmute_led_polarity, brightness);
4651 	return 0;
4652 }
4653 
4654 static void alc285_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4655 				const struct hda_fixup *fix, int action)
4656 {
4657 	struct alc_spec *spec = codec->spec;
4658 
4659 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4660 		spec->mic_led_coef.idx = 0x19;
4661 		spec->mic_led_coef.mask = 1 << 13;
4662 		spec->mic_led_coef.on = 1 << 13;
4663 		spec->mic_led_coef.off = 0;
4664 		snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
4665 	}
4666 }
4667 
4668 static void alc285_fixup_hp_gpio_micmute_led(struct hda_codec *codec,
4669 				const struct hda_fixup *fix, int action)
4670 {
4671 	struct alc_spec *spec = codec->spec;
4672 
4673 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
4674 		spec->micmute_led_polarity = 1;
4675 	alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
4676 }
4677 
4678 static void alc236_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4679 				const struct hda_fixup *fix, int action)
4680 {
4681 	struct alc_spec *spec = codec->spec;
4682 
4683 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4684 		spec->mic_led_coef.idx = 0x35;
4685 		spec->mic_led_coef.mask = 3 << 2;
4686 		spec->mic_led_coef.on = 2 << 2;
4687 		spec->mic_led_coef.off = 1 << 2;
4688 		snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
4689 	}
4690 }
4691 
4692 static void alc285_fixup_hp_mute_led(struct hda_codec *codec,
4693 				const struct hda_fixup *fix, int action)
4694 {
4695 	alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
4696 	alc285_fixup_hp_coef_micmute_led(codec, fix, action);
4697 }
4698 
4699 static void alc285_fixup_hp_spectre_x360_mute_led(struct hda_codec *codec,
4700 				const struct hda_fixup *fix, int action)
4701 {
4702 	alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
4703 	alc285_fixup_hp_gpio_micmute_led(codec, fix, action);
4704 }
4705 
4706 static void alc236_fixup_hp_mute_led(struct hda_codec *codec,
4707 				const struct hda_fixup *fix, int action)
4708 {
4709 	alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
4710 	alc236_fixup_hp_coef_micmute_led(codec, fix, action);
4711 }
4712 
4713 static void alc236_fixup_hp_micmute_led_vref(struct hda_codec *codec,
4714 				const struct hda_fixup *fix, int action)
4715 {
4716 	struct alc_spec *spec = codec->spec;
4717 
4718 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4719 		spec->cap_mute_led_nid = 0x1a;
4720 		snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4721 		codec->power_filter = led_power_filter;
4722 	}
4723 }
4724 
4725 static void alc236_fixup_hp_mute_led_micmute_vref(struct hda_codec *codec,
4726 				const struct hda_fixup *fix, int action)
4727 {
4728 	alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
4729 	alc236_fixup_hp_micmute_led_vref(codec, fix, action);
4730 }
4731 
4732 static inline void alc298_samsung_write_coef_pack(struct hda_codec *codec,
4733 						  const unsigned short coefs[2])
4734 {
4735 	alc_write_coef_idx(codec, 0x23, coefs[0]);
4736 	alc_write_coef_idx(codec, 0x25, coefs[1]);
4737 	alc_write_coef_idx(codec, 0x26, 0xb011);
4738 }
4739 
4740 struct alc298_samsung_amp_desc {
4741 	unsigned char nid;
4742 	unsigned short init_seq[2][2];
4743 };
4744 
4745 static void alc298_fixup_samsung_amp(struct hda_codec *codec,
4746 				     const struct hda_fixup *fix, int action)
4747 {
4748 	int i, j;
4749 	static const unsigned short init_seq[][2] = {
4750 		{ 0x19, 0x00 }, { 0x20, 0xc0 }, { 0x22, 0x44 }, { 0x23, 0x08 },
4751 		{ 0x24, 0x85 }, { 0x25, 0x41 }, { 0x35, 0x40 }, { 0x36, 0x01 },
4752 		{ 0x38, 0x81 }, { 0x3a, 0x03 }, { 0x3b, 0x81 }, { 0x40, 0x3e },
4753 		{ 0x41, 0x07 }, { 0x400, 0x1 }
4754 	};
4755 	static const struct alc298_samsung_amp_desc amps[] = {
4756 		{ 0x3a, { { 0x18, 0x1 }, { 0x26, 0x0 } } },
4757 		{ 0x39, { { 0x18, 0x2 }, { 0x26, 0x1 } } }
4758 	};
4759 
4760 	if (action != HDA_FIXUP_ACT_INIT)
4761 		return;
4762 
4763 	for (i = 0; i < ARRAY_SIZE(amps); i++) {
4764 		alc_write_coef_idx(codec, 0x22, amps[i].nid);
4765 
4766 		for (j = 0; j < ARRAY_SIZE(amps[i].init_seq); j++)
4767 			alc298_samsung_write_coef_pack(codec, amps[i].init_seq[j]);
4768 
4769 		for (j = 0; j < ARRAY_SIZE(init_seq); j++)
4770 			alc298_samsung_write_coef_pack(codec, init_seq[j]);
4771 	}
4772 }
4773 
4774 #if IS_REACHABLE(CONFIG_INPUT)
4775 static void gpio2_mic_hotkey_event(struct hda_codec *codec,
4776 				   struct hda_jack_callback *event)
4777 {
4778 	struct alc_spec *spec = codec->spec;
4779 
4780 	/* GPIO2 just toggles on a keypress/keyrelease cycle. Therefore
4781 	   send both key on and key off event for every interrupt. */
4782 	input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 1);
4783 	input_sync(spec->kb_dev);
4784 	input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 0);
4785 	input_sync(spec->kb_dev);
4786 }
4787 
4788 static int alc_register_micmute_input_device(struct hda_codec *codec)
4789 {
4790 	struct alc_spec *spec = codec->spec;
4791 	int i;
4792 
4793 	spec->kb_dev = input_allocate_device();
4794 	if (!spec->kb_dev) {
4795 		codec_err(codec, "Out of memory (input_allocate_device)\n");
4796 		return -ENOMEM;
4797 	}
4798 
4799 	spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX] = KEY_MICMUTE;
4800 
4801 	spec->kb_dev->name = "Microphone Mute Button";
4802 	spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY);
4803 	spec->kb_dev->keycodesize = sizeof(spec->alc_mute_keycode_map[0]);
4804 	spec->kb_dev->keycodemax = ARRAY_SIZE(spec->alc_mute_keycode_map);
4805 	spec->kb_dev->keycode = spec->alc_mute_keycode_map;
4806 	for (i = 0; i < ARRAY_SIZE(spec->alc_mute_keycode_map); i++)
4807 		set_bit(spec->alc_mute_keycode_map[i], spec->kb_dev->keybit);
4808 
4809 	if (input_register_device(spec->kb_dev)) {
4810 		codec_err(codec, "input_register_device failed\n");
4811 		input_free_device(spec->kb_dev);
4812 		spec->kb_dev = NULL;
4813 		return -ENOMEM;
4814 	}
4815 
4816 	return 0;
4817 }
4818 
4819 /* GPIO1 = set according to SKU external amp
4820  * GPIO2 = mic mute hotkey
4821  * GPIO3 = mute LED
4822  * GPIO4 = mic mute LED
4823  */
4824 static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec,
4825 					     const struct hda_fixup *fix, int action)
4826 {
4827 	struct alc_spec *spec = codec->spec;
4828 
4829 	alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
4830 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4831 		spec->init_amp = ALC_INIT_DEFAULT;
4832 		if (alc_register_micmute_input_device(codec) != 0)
4833 			return;
4834 
4835 		spec->gpio_mask |= 0x06;
4836 		spec->gpio_dir |= 0x02;
4837 		spec->gpio_data |= 0x02;
4838 		snd_hda_codec_write_cache(codec, codec->core.afg, 0,
4839 					  AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x04);
4840 		snd_hda_jack_detect_enable_callback(codec, codec->core.afg,
4841 						    gpio2_mic_hotkey_event);
4842 		return;
4843 	}
4844 
4845 	if (!spec->kb_dev)
4846 		return;
4847 
4848 	switch (action) {
4849 	case HDA_FIXUP_ACT_FREE:
4850 		input_unregister_device(spec->kb_dev);
4851 		spec->kb_dev = NULL;
4852 	}
4853 }
4854 
4855 /* Line2 = mic mute hotkey
4856  * GPIO2 = mic mute LED
4857  */
4858 static void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec,
4859 					     const struct hda_fixup *fix, int action)
4860 {
4861 	struct alc_spec *spec = codec->spec;
4862 
4863 	alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
4864 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4865 		spec->init_amp = ALC_INIT_DEFAULT;
4866 		if (alc_register_micmute_input_device(codec) != 0)
4867 			return;
4868 
4869 		snd_hda_jack_detect_enable_callback(codec, 0x1b,
4870 						    gpio2_mic_hotkey_event);
4871 		return;
4872 	}
4873 
4874 	if (!spec->kb_dev)
4875 		return;
4876 
4877 	switch (action) {
4878 	case HDA_FIXUP_ACT_FREE:
4879 		input_unregister_device(spec->kb_dev);
4880 		spec->kb_dev = NULL;
4881 	}
4882 }
4883 #else /* INPUT */
4884 #define alc280_fixup_hp_gpio2_mic_hotkey	NULL
4885 #define alc233_fixup_lenovo_line2_mic_hotkey	NULL
4886 #endif /* INPUT */
4887 
4888 static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec,
4889 				const struct hda_fixup *fix, int action)
4890 {
4891 	struct alc_spec *spec = codec->spec;
4892 
4893 	alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1a);
4894 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4895 		spec->cap_mute_led_nid = 0x18;
4896 		snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4897 	}
4898 }
4899 
4900 static const struct coef_fw alc225_pre_hsmode[] = {
4901 	UPDATE_COEF(0x4a, 1<<8, 0),
4902 	UPDATE_COEFEX(0x57, 0x05, 1<<14, 0),
4903 	UPDATE_COEF(0x63, 3<<14, 3<<14),
4904 	UPDATE_COEF(0x4a, 3<<4, 2<<4),
4905 	UPDATE_COEF(0x4a, 3<<10, 3<<10),
4906 	UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10),
4907 	UPDATE_COEF(0x4a, 3<<10, 0),
4908 	{}
4909 };
4910 
4911 static void alc_headset_mode_unplugged(struct hda_codec *codec)
4912 {
4913 	struct alc_spec *spec = codec->spec;
4914 	static const struct coef_fw coef0255[] = {
4915 		WRITE_COEF(0x1b, 0x0c0b), /* LDO and MISC control */
4916 		WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
4917 		UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
4918 		WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
4919 		WRITE_COEFEX(0x57, 0x03, 0x8aa6), /* Direct Drive HP Amp control */
4920 		{}
4921 	};
4922 	static const struct coef_fw coef0256[] = {
4923 		WRITE_COEF(0x1b, 0x0c4b), /* LDO and MISC control */
4924 		WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
4925 		WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
4926 		WRITE_COEFEX(0x57, 0x03, 0x09a3), /* Direct Drive HP Amp control */
4927 		UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
4928 		{}
4929 	};
4930 	static const struct coef_fw coef0233[] = {
4931 		WRITE_COEF(0x1b, 0x0c0b),
4932 		WRITE_COEF(0x45, 0xc429),
4933 		UPDATE_COEF(0x35, 0x4000, 0),
4934 		WRITE_COEF(0x06, 0x2104),
4935 		WRITE_COEF(0x1a, 0x0001),
4936 		WRITE_COEF(0x26, 0x0004),
4937 		WRITE_COEF(0x32, 0x42a3),
4938 		{}
4939 	};
4940 	static const struct coef_fw coef0288[] = {
4941 		UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
4942 		UPDATE_COEF(0x50, 0x2000, 0x2000),
4943 		UPDATE_COEF(0x56, 0x0006, 0x0006),
4944 		UPDATE_COEF(0x66, 0x0008, 0),
4945 		UPDATE_COEF(0x67, 0x2000, 0),
4946 		{}
4947 	};
4948 	static const struct coef_fw coef0298[] = {
4949 		UPDATE_COEF(0x19, 0x1300, 0x0300),
4950 		{}
4951 	};
4952 	static const struct coef_fw coef0292[] = {
4953 		WRITE_COEF(0x76, 0x000e),
4954 		WRITE_COEF(0x6c, 0x2400),
4955 		WRITE_COEF(0x18, 0x7308),
4956 		WRITE_COEF(0x6b, 0xc429),
4957 		{}
4958 	};
4959 	static const struct coef_fw coef0293[] = {
4960 		UPDATE_COEF(0x10, 7<<8, 6<<8), /* SET Line1 JD to 0 */
4961 		UPDATE_COEFEX(0x57, 0x05, 1<<15|1<<13, 0x0), /* SET charge pump by verb */
4962 		UPDATE_COEFEX(0x57, 0x03, 1<<10, 1<<10), /* SET EN_OSW to 1 */
4963 		UPDATE_COEF(0x1a, 1<<3, 1<<3), /* Combo JD gating with LINE1-VREFO */
4964 		WRITE_COEF(0x45, 0xc429), /* Set to TRS type */
4965 		UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
4966 		{}
4967 	};
4968 	static const struct coef_fw coef0668[] = {
4969 		WRITE_COEF(0x15, 0x0d40),
4970 		WRITE_COEF(0xb7, 0x802b),
4971 		{}
4972 	};
4973 	static const struct coef_fw coef0225[] = {
4974 		UPDATE_COEF(0x63, 3<<14, 0),
4975 		{}
4976 	};
4977 	static const struct coef_fw coef0274[] = {
4978 		UPDATE_COEF(0x4a, 0x0100, 0),
4979 		UPDATE_COEFEX(0x57, 0x05, 0x4000, 0),
4980 		UPDATE_COEF(0x6b, 0xf000, 0x5000),
4981 		UPDATE_COEF(0x4a, 0x0010, 0),
4982 		UPDATE_COEF(0x4a, 0x0c00, 0x0c00),
4983 		WRITE_COEF(0x45, 0x5289),
4984 		UPDATE_COEF(0x4a, 0x0c00, 0),
4985 		{}
4986 	};
4987 
4988 	if (spec->no_internal_mic_pin) {
4989 		alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
4990 		return;
4991 	}
4992 
4993 	switch (codec->core.vendor_id) {
4994 	case 0x10ec0255:
4995 		alc_process_coef_fw(codec, coef0255);
4996 		break;
4997 	case 0x10ec0230:
4998 	case 0x10ec0236:
4999 	case 0x10ec0256:
5000 	case 0x19e58326:
5001 		alc_process_coef_fw(codec, coef0256);
5002 		break;
5003 	case 0x10ec0234:
5004 	case 0x10ec0274:
5005 	case 0x10ec0294:
5006 		alc_process_coef_fw(codec, coef0274);
5007 		break;
5008 	case 0x10ec0233:
5009 	case 0x10ec0283:
5010 		alc_process_coef_fw(codec, coef0233);
5011 		break;
5012 	case 0x10ec0286:
5013 	case 0x10ec0288:
5014 		alc_process_coef_fw(codec, coef0288);
5015 		break;
5016 	case 0x10ec0298:
5017 		alc_process_coef_fw(codec, coef0298);
5018 		alc_process_coef_fw(codec, coef0288);
5019 		break;
5020 	case 0x10ec0292:
5021 		alc_process_coef_fw(codec, coef0292);
5022 		break;
5023 	case 0x10ec0293:
5024 		alc_process_coef_fw(codec, coef0293);
5025 		break;
5026 	case 0x10ec0668:
5027 		alc_process_coef_fw(codec, coef0668);
5028 		break;
5029 	case 0x10ec0215:
5030 	case 0x10ec0225:
5031 	case 0x10ec0285:
5032 	case 0x10ec0295:
5033 	case 0x10ec0289:
5034 	case 0x10ec0299:
5035 		alc_process_coef_fw(codec, alc225_pre_hsmode);
5036 		alc_process_coef_fw(codec, coef0225);
5037 		break;
5038 	case 0x10ec0867:
5039 		alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5040 		break;
5041 	}
5042 	codec_dbg(codec, "Headset jack set to unplugged mode.\n");
5043 }
5044 
5045 
5046 static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
5047 				    hda_nid_t mic_pin)
5048 {
5049 	static const struct coef_fw coef0255[] = {
5050 		WRITE_COEFEX(0x57, 0x03, 0x8aa6),
5051 		WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
5052 		{}
5053 	};
5054 	static const struct coef_fw coef0256[] = {
5055 		UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14), /* Direct Drive HP Amp control(Set to verb control)*/
5056 		WRITE_COEFEX(0x57, 0x03, 0x09a3),
5057 		WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
5058 		{}
5059 	};
5060 	static const struct coef_fw coef0233[] = {
5061 		UPDATE_COEF(0x35, 0, 1<<14),
5062 		WRITE_COEF(0x06, 0x2100),
5063 		WRITE_COEF(0x1a, 0x0021),
5064 		WRITE_COEF(0x26, 0x008c),
5065 		{}
5066 	};
5067 	static const struct coef_fw coef0288[] = {
5068 		UPDATE_COEF(0x4f, 0x00c0, 0),
5069 		UPDATE_COEF(0x50, 0x2000, 0),
5070 		UPDATE_COEF(0x56, 0x0006, 0),
5071 		UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
5072 		UPDATE_COEF(0x66, 0x0008, 0x0008),
5073 		UPDATE_COEF(0x67, 0x2000, 0x2000),
5074 		{}
5075 	};
5076 	static const struct coef_fw coef0292[] = {
5077 		WRITE_COEF(0x19, 0xa208),
5078 		WRITE_COEF(0x2e, 0xacf0),
5079 		{}
5080 	};
5081 	static const struct coef_fw coef0293[] = {
5082 		UPDATE_COEFEX(0x57, 0x05, 0, 1<<15|1<<13), /* SET charge pump by verb */
5083 		UPDATE_COEFEX(0x57, 0x03, 1<<10, 0), /* SET EN_OSW to 0 */
5084 		UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
5085 		{}
5086 	};
5087 	static const struct coef_fw coef0688[] = {
5088 		WRITE_COEF(0xb7, 0x802b),
5089 		WRITE_COEF(0xb5, 0x1040),
5090 		UPDATE_COEF(0xc3, 0, 1<<12),
5091 		{}
5092 	};
5093 	static const struct coef_fw coef0225[] = {
5094 		UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14),
5095 		UPDATE_COEF(0x4a, 3<<4, 2<<4),
5096 		UPDATE_COEF(0x63, 3<<14, 0),
5097 		{}
5098 	};
5099 	static const struct coef_fw coef0274[] = {
5100 		UPDATE_COEFEX(0x57, 0x05, 0x4000, 0x4000),
5101 		UPDATE_COEF(0x4a, 0x0010, 0),
5102 		UPDATE_COEF(0x6b, 0xf000, 0),
5103 		{}
5104 	};
5105 
5106 	switch (codec->core.vendor_id) {
5107 	case 0x10ec0255:
5108 		alc_write_coef_idx(codec, 0x45, 0xc489);
5109 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5110 		alc_process_coef_fw(codec, coef0255);
5111 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5112 		break;
5113 	case 0x10ec0230:
5114 	case 0x10ec0236:
5115 	case 0x10ec0256:
5116 	case 0x19e58326:
5117 		alc_write_coef_idx(codec, 0x45, 0xc489);
5118 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5119 		alc_process_coef_fw(codec, coef0256);
5120 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5121 		break;
5122 	case 0x10ec0234:
5123 	case 0x10ec0274:
5124 	case 0x10ec0294:
5125 		alc_write_coef_idx(codec, 0x45, 0x4689);
5126 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5127 		alc_process_coef_fw(codec, coef0274);
5128 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5129 		break;
5130 	case 0x10ec0233:
5131 	case 0x10ec0283:
5132 		alc_write_coef_idx(codec, 0x45, 0xc429);
5133 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5134 		alc_process_coef_fw(codec, coef0233);
5135 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5136 		break;
5137 	case 0x10ec0286:
5138 	case 0x10ec0288:
5139 	case 0x10ec0298:
5140 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5141 		alc_process_coef_fw(codec, coef0288);
5142 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5143 		break;
5144 	case 0x10ec0292:
5145 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5146 		alc_process_coef_fw(codec, coef0292);
5147 		break;
5148 	case 0x10ec0293:
5149 		/* Set to TRS mode */
5150 		alc_write_coef_idx(codec, 0x45, 0xc429);
5151 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5152 		alc_process_coef_fw(codec, coef0293);
5153 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5154 		break;
5155 	case 0x10ec0867:
5156 		alc_update_coefex_idx(codec, 0x57, 0x5, 0, 1<<14);
5157 		fallthrough;
5158 	case 0x10ec0221:
5159 	case 0x10ec0662:
5160 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5161 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5162 		break;
5163 	case 0x10ec0668:
5164 		alc_write_coef_idx(codec, 0x11, 0x0001);
5165 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5166 		alc_process_coef_fw(codec, coef0688);
5167 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5168 		break;
5169 	case 0x10ec0215:
5170 	case 0x10ec0225:
5171 	case 0x10ec0285:
5172 	case 0x10ec0295:
5173 	case 0x10ec0289:
5174 	case 0x10ec0299:
5175 		alc_process_coef_fw(codec, alc225_pre_hsmode);
5176 		alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x31<<10);
5177 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5178 		alc_process_coef_fw(codec, coef0225);
5179 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5180 		break;
5181 	}
5182 	codec_dbg(codec, "Headset jack set to mic-in mode.\n");
5183 }
5184 
5185 static void alc_headset_mode_default(struct hda_codec *codec)
5186 {
5187 	static const struct coef_fw coef0225[] = {
5188 		UPDATE_COEF(0x45, 0x3f<<10, 0x30<<10),
5189 		UPDATE_COEF(0x45, 0x3f<<10, 0x31<<10),
5190 		UPDATE_COEF(0x49, 3<<8, 0<<8),
5191 		UPDATE_COEF(0x4a, 3<<4, 3<<4),
5192 		UPDATE_COEF(0x63, 3<<14, 0),
5193 		UPDATE_COEF(0x67, 0xf000, 0x3000),
5194 		{}
5195 	};
5196 	static const struct coef_fw coef0255[] = {
5197 		WRITE_COEF(0x45, 0xc089),
5198 		WRITE_COEF(0x45, 0xc489),
5199 		WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5200 		WRITE_COEF(0x49, 0x0049),
5201 		{}
5202 	};
5203 	static const struct coef_fw coef0256[] = {
5204 		WRITE_COEF(0x45, 0xc489),
5205 		WRITE_COEFEX(0x57, 0x03, 0x0da3),
5206 		WRITE_COEF(0x49, 0x0049),
5207 		UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
5208 		WRITE_COEF(0x06, 0x6100),
5209 		{}
5210 	};
5211 	static const struct coef_fw coef0233[] = {
5212 		WRITE_COEF(0x06, 0x2100),
5213 		WRITE_COEF(0x32, 0x4ea3),
5214 		{}
5215 	};
5216 	static const struct coef_fw coef0288[] = {
5217 		UPDATE_COEF(0x4f, 0xfcc0, 0xc400), /* Set to TRS type */
5218 		UPDATE_COEF(0x50, 0x2000, 0x2000),
5219 		UPDATE_COEF(0x56, 0x0006, 0x0006),
5220 		UPDATE_COEF(0x66, 0x0008, 0),
5221 		UPDATE_COEF(0x67, 0x2000, 0),
5222 		{}
5223 	};
5224 	static const struct coef_fw coef0292[] = {
5225 		WRITE_COEF(0x76, 0x000e),
5226 		WRITE_COEF(0x6c, 0x2400),
5227 		WRITE_COEF(0x6b, 0xc429),
5228 		WRITE_COEF(0x18, 0x7308),
5229 		{}
5230 	};
5231 	static const struct coef_fw coef0293[] = {
5232 		UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
5233 		WRITE_COEF(0x45, 0xC429), /* Set to TRS type */
5234 		UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
5235 		{}
5236 	};
5237 	static const struct coef_fw coef0688[] = {
5238 		WRITE_COEF(0x11, 0x0041),
5239 		WRITE_COEF(0x15, 0x0d40),
5240 		WRITE_COEF(0xb7, 0x802b),
5241 		{}
5242 	};
5243 	static const struct coef_fw coef0274[] = {
5244 		WRITE_COEF(0x45, 0x4289),
5245 		UPDATE_COEF(0x4a, 0x0010, 0x0010),
5246 		UPDATE_COEF(0x6b, 0x0f00, 0),
5247 		UPDATE_COEF(0x49, 0x0300, 0x0300),
5248 		{}
5249 	};
5250 
5251 	switch (codec->core.vendor_id) {
5252 	case 0x10ec0215:
5253 	case 0x10ec0225:
5254 	case 0x10ec0285:
5255 	case 0x10ec0295:
5256 	case 0x10ec0289:
5257 	case 0x10ec0299:
5258 		alc_process_coef_fw(codec, alc225_pre_hsmode);
5259 		alc_process_coef_fw(codec, coef0225);
5260 		break;
5261 	case 0x10ec0255:
5262 		alc_process_coef_fw(codec, coef0255);
5263 		break;
5264 	case 0x10ec0230:
5265 	case 0x10ec0236:
5266 	case 0x10ec0256:
5267 	case 0x19e58326:
5268 		alc_write_coef_idx(codec, 0x1b, 0x0e4b);
5269 		alc_write_coef_idx(codec, 0x45, 0xc089);
5270 		msleep(50);
5271 		alc_process_coef_fw(codec, coef0256);
5272 		break;
5273 	case 0x10ec0234:
5274 	case 0x10ec0274:
5275 	case 0x10ec0294:
5276 		alc_process_coef_fw(codec, coef0274);
5277 		break;
5278 	case 0x10ec0233:
5279 	case 0x10ec0283:
5280 		alc_process_coef_fw(codec, coef0233);
5281 		break;
5282 	case 0x10ec0286:
5283 	case 0x10ec0288:
5284 	case 0x10ec0298:
5285 		alc_process_coef_fw(codec, coef0288);
5286 		break;
5287 	case 0x10ec0292:
5288 		alc_process_coef_fw(codec, coef0292);
5289 		break;
5290 	case 0x10ec0293:
5291 		alc_process_coef_fw(codec, coef0293);
5292 		break;
5293 	case 0x10ec0668:
5294 		alc_process_coef_fw(codec, coef0688);
5295 		break;
5296 	case 0x10ec0867:
5297 		alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5298 		break;
5299 	}
5300 	codec_dbg(codec, "Headset jack set to headphone (default) mode.\n");
5301 }
5302 
5303 /* Iphone type */
5304 static void alc_headset_mode_ctia(struct hda_codec *codec)
5305 {
5306 	int val;
5307 
5308 	static const struct coef_fw coef0255[] = {
5309 		WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
5310 		WRITE_COEF(0x1b, 0x0c2b),
5311 		WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5312 		{}
5313 	};
5314 	static const struct coef_fw coef0256[] = {
5315 		WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
5316 		WRITE_COEF(0x1b, 0x0e6b),
5317 		{}
5318 	};
5319 	static const struct coef_fw coef0233[] = {
5320 		WRITE_COEF(0x45, 0xd429),
5321 		WRITE_COEF(0x1b, 0x0c2b),
5322 		WRITE_COEF(0x32, 0x4ea3),
5323 		{}
5324 	};
5325 	static const struct coef_fw coef0288[] = {
5326 		UPDATE_COEF(0x50, 0x2000, 0x2000),
5327 		UPDATE_COEF(0x56, 0x0006, 0x0006),
5328 		UPDATE_COEF(0x66, 0x0008, 0),
5329 		UPDATE_COEF(0x67, 0x2000, 0),
5330 		{}
5331 	};
5332 	static const struct coef_fw coef0292[] = {
5333 		WRITE_COEF(0x6b, 0xd429),
5334 		WRITE_COEF(0x76, 0x0008),
5335 		WRITE_COEF(0x18, 0x7388),
5336 		{}
5337 	};
5338 	static const struct coef_fw coef0293[] = {
5339 		WRITE_COEF(0x45, 0xd429), /* Set to ctia type */
5340 		UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
5341 		{}
5342 	};
5343 	static const struct coef_fw coef0688[] = {
5344 		WRITE_COEF(0x11, 0x0001),
5345 		WRITE_COEF(0x15, 0x0d60),
5346 		WRITE_COEF(0xc3, 0x0000),
5347 		{}
5348 	};
5349 	static const struct coef_fw coef0225_1[] = {
5350 		UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
5351 		UPDATE_COEF(0x63, 3<<14, 2<<14),
5352 		{}
5353 	};
5354 	static const struct coef_fw coef0225_2[] = {
5355 		UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
5356 		UPDATE_COEF(0x63, 3<<14, 1<<14),
5357 		{}
5358 	};
5359 
5360 	switch (codec->core.vendor_id) {
5361 	case 0x10ec0255:
5362 		alc_process_coef_fw(codec, coef0255);
5363 		break;
5364 	case 0x10ec0230:
5365 	case 0x10ec0236:
5366 	case 0x10ec0256:
5367 	case 0x19e58326:
5368 		alc_process_coef_fw(codec, coef0256);
5369 		break;
5370 	case 0x10ec0234:
5371 	case 0x10ec0274:
5372 	case 0x10ec0294:
5373 		alc_write_coef_idx(codec, 0x45, 0xd689);
5374 		break;
5375 	case 0x10ec0233:
5376 	case 0x10ec0283:
5377 		alc_process_coef_fw(codec, coef0233);
5378 		break;
5379 	case 0x10ec0298:
5380 		val = alc_read_coef_idx(codec, 0x50);
5381 		if (val & (1 << 12)) {
5382 			alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
5383 			alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5384 			msleep(300);
5385 		} else {
5386 			alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
5387 			alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5388 			msleep(300);
5389 		}
5390 		break;
5391 	case 0x10ec0286:
5392 	case 0x10ec0288:
5393 		alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5394 		msleep(300);
5395 		alc_process_coef_fw(codec, coef0288);
5396 		break;
5397 	case 0x10ec0292:
5398 		alc_process_coef_fw(codec, coef0292);
5399 		break;
5400 	case 0x10ec0293:
5401 		alc_process_coef_fw(codec, coef0293);
5402 		break;
5403 	case 0x10ec0668:
5404 		alc_process_coef_fw(codec, coef0688);
5405 		break;
5406 	case 0x10ec0215:
5407 	case 0x10ec0225:
5408 	case 0x10ec0285:
5409 	case 0x10ec0295:
5410 	case 0x10ec0289:
5411 	case 0x10ec0299:
5412 		val = alc_read_coef_idx(codec, 0x45);
5413 		if (val & (1 << 9))
5414 			alc_process_coef_fw(codec, coef0225_2);
5415 		else
5416 			alc_process_coef_fw(codec, coef0225_1);
5417 		break;
5418 	case 0x10ec0867:
5419 		alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5420 		break;
5421 	}
5422 	codec_dbg(codec, "Headset jack set to iPhone-style headset mode.\n");
5423 }
5424 
5425 /* Nokia type */
5426 static void alc_headset_mode_omtp(struct hda_codec *codec)
5427 {
5428 	static const struct coef_fw coef0255[] = {
5429 		WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
5430 		WRITE_COEF(0x1b, 0x0c2b),
5431 		WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5432 		{}
5433 	};
5434 	static const struct coef_fw coef0256[] = {
5435 		WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
5436 		WRITE_COEF(0x1b, 0x0e6b),
5437 		{}
5438 	};
5439 	static const struct coef_fw coef0233[] = {
5440 		WRITE_COEF(0x45, 0xe429),
5441 		WRITE_COEF(0x1b, 0x0c2b),
5442 		WRITE_COEF(0x32, 0x4ea3),
5443 		{}
5444 	};
5445 	static const struct coef_fw coef0288[] = {
5446 		UPDATE_COEF(0x50, 0x2000, 0x2000),
5447 		UPDATE_COEF(0x56, 0x0006, 0x0006),
5448 		UPDATE_COEF(0x66, 0x0008, 0),
5449 		UPDATE_COEF(0x67, 0x2000, 0),
5450 		{}
5451 	};
5452 	static const struct coef_fw coef0292[] = {
5453 		WRITE_COEF(0x6b, 0xe429),
5454 		WRITE_COEF(0x76, 0x0008),
5455 		WRITE_COEF(0x18, 0x7388),
5456 		{}
5457 	};
5458 	static const struct coef_fw coef0293[] = {
5459 		WRITE_COEF(0x45, 0xe429), /* Set to omtp type */
5460 		UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
5461 		{}
5462 	};
5463 	static const struct coef_fw coef0688[] = {
5464 		WRITE_COEF(0x11, 0x0001),
5465 		WRITE_COEF(0x15, 0x0d50),
5466 		WRITE_COEF(0xc3, 0x0000),
5467 		{}
5468 	};
5469 	static const struct coef_fw coef0225[] = {
5470 		UPDATE_COEF(0x45, 0x3f<<10, 0x39<<10),
5471 		UPDATE_COEF(0x63, 3<<14, 2<<14),
5472 		{}
5473 	};
5474 
5475 	switch (codec->core.vendor_id) {
5476 	case 0x10ec0255:
5477 		alc_process_coef_fw(codec, coef0255);
5478 		break;
5479 	case 0x10ec0230:
5480 	case 0x10ec0236:
5481 	case 0x10ec0256:
5482 	case 0x19e58326:
5483 		alc_process_coef_fw(codec, coef0256);
5484 		break;
5485 	case 0x10ec0234:
5486 	case 0x10ec0274:
5487 	case 0x10ec0294:
5488 		alc_write_coef_idx(codec, 0x45, 0xe689);
5489 		break;
5490 	case 0x10ec0233:
5491 	case 0x10ec0283:
5492 		alc_process_coef_fw(codec, coef0233);
5493 		break;
5494 	case 0x10ec0298:
5495 		alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);/* Headset output enable */
5496 		alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5497 		msleep(300);
5498 		break;
5499 	case 0x10ec0286:
5500 	case 0x10ec0288:
5501 		alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5502 		msleep(300);
5503 		alc_process_coef_fw(codec, coef0288);
5504 		break;
5505 	case 0x10ec0292:
5506 		alc_process_coef_fw(codec, coef0292);
5507 		break;
5508 	case 0x10ec0293:
5509 		alc_process_coef_fw(codec, coef0293);
5510 		break;
5511 	case 0x10ec0668:
5512 		alc_process_coef_fw(codec, coef0688);
5513 		break;
5514 	case 0x10ec0215:
5515 	case 0x10ec0225:
5516 	case 0x10ec0285:
5517 	case 0x10ec0295:
5518 	case 0x10ec0289:
5519 	case 0x10ec0299:
5520 		alc_process_coef_fw(codec, coef0225);
5521 		break;
5522 	}
5523 	codec_dbg(codec, "Headset jack set to Nokia-style headset mode.\n");
5524 }
5525 
5526 static void alc_determine_headset_type(struct hda_codec *codec)
5527 {
5528 	int val;
5529 	bool is_ctia = false;
5530 	struct alc_spec *spec = codec->spec;
5531 	static const struct coef_fw coef0255[] = {
5532 		WRITE_COEF(0x45, 0xd089), /* combo jack auto switch control(Check type)*/
5533 		WRITE_COEF(0x49, 0x0149), /* combo jack auto switch control(Vref
5534  conteol) */
5535 		{}
5536 	};
5537 	static const struct coef_fw coef0288[] = {
5538 		UPDATE_COEF(0x4f, 0xfcc0, 0xd400), /* Check Type */
5539 		{}
5540 	};
5541 	static const struct coef_fw coef0298[] = {
5542 		UPDATE_COEF(0x50, 0x2000, 0x2000),
5543 		UPDATE_COEF(0x56, 0x0006, 0x0006),
5544 		UPDATE_COEF(0x66, 0x0008, 0),
5545 		UPDATE_COEF(0x67, 0x2000, 0),
5546 		UPDATE_COEF(0x19, 0x1300, 0x1300),
5547 		{}
5548 	};
5549 	static const struct coef_fw coef0293[] = {
5550 		UPDATE_COEF(0x4a, 0x000f, 0x0008), /* Combo Jack auto detect */
5551 		WRITE_COEF(0x45, 0xD429), /* Set to ctia type */
5552 		{}
5553 	};
5554 	static const struct coef_fw coef0688[] = {
5555 		WRITE_COEF(0x11, 0x0001),
5556 		WRITE_COEF(0xb7, 0x802b),
5557 		WRITE_COEF(0x15, 0x0d60),
5558 		WRITE_COEF(0xc3, 0x0c00),
5559 		{}
5560 	};
5561 	static const struct coef_fw coef0274[] = {
5562 		UPDATE_COEF(0x4a, 0x0010, 0),
5563 		UPDATE_COEF(0x4a, 0x8000, 0),
5564 		WRITE_COEF(0x45, 0xd289),
5565 		UPDATE_COEF(0x49, 0x0300, 0x0300),
5566 		{}
5567 	};
5568 
5569 	if (spec->no_internal_mic_pin) {
5570 		alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
5571 		return;
5572 	}
5573 
5574 	switch (codec->core.vendor_id) {
5575 	case 0x10ec0255:
5576 		alc_process_coef_fw(codec, coef0255);
5577 		msleep(300);
5578 		val = alc_read_coef_idx(codec, 0x46);
5579 		is_ctia = (val & 0x0070) == 0x0070;
5580 		break;
5581 	case 0x10ec0230:
5582 	case 0x10ec0236:
5583 	case 0x10ec0256:
5584 	case 0x19e58326:
5585 		alc_write_coef_idx(codec, 0x1b, 0x0e4b);
5586 		alc_write_coef_idx(codec, 0x06, 0x6104);
5587 		alc_write_coefex_idx(codec, 0x57, 0x3, 0x09a3);
5588 
5589 		snd_hda_codec_write(codec, 0x21, 0,
5590 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5591 		msleep(80);
5592 		snd_hda_codec_write(codec, 0x21, 0,
5593 			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5594 
5595 		alc_process_coef_fw(codec, coef0255);
5596 		msleep(300);
5597 		val = alc_read_coef_idx(codec, 0x46);
5598 		is_ctia = (val & 0x0070) == 0x0070;
5599 
5600 		alc_write_coefex_idx(codec, 0x57, 0x3, 0x0da3);
5601 		alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5602 
5603 		snd_hda_codec_write(codec, 0x21, 0,
5604 			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5605 		msleep(80);
5606 		snd_hda_codec_write(codec, 0x21, 0,
5607 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5608 		break;
5609 	case 0x10ec0234:
5610 	case 0x10ec0274:
5611 	case 0x10ec0294:
5612 		alc_process_coef_fw(codec, coef0274);
5613 		msleep(850);
5614 		val = alc_read_coef_idx(codec, 0x46);
5615 		is_ctia = (val & 0x00f0) == 0x00f0;
5616 		break;
5617 	case 0x10ec0233:
5618 	case 0x10ec0283:
5619 		alc_write_coef_idx(codec, 0x45, 0xd029);
5620 		msleep(300);
5621 		val = alc_read_coef_idx(codec, 0x46);
5622 		is_ctia = (val & 0x0070) == 0x0070;
5623 		break;
5624 	case 0x10ec0298:
5625 		snd_hda_codec_write(codec, 0x21, 0,
5626 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5627 		msleep(100);
5628 		snd_hda_codec_write(codec, 0x21, 0,
5629 			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5630 		msleep(200);
5631 
5632 		val = alc_read_coef_idx(codec, 0x50);
5633 		if (val & (1 << 12)) {
5634 			alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
5635 			alc_process_coef_fw(codec, coef0288);
5636 			msleep(350);
5637 			val = alc_read_coef_idx(codec, 0x50);
5638 			is_ctia = (val & 0x0070) == 0x0070;
5639 		} else {
5640 			alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
5641 			alc_process_coef_fw(codec, coef0288);
5642 			msleep(350);
5643 			val = alc_read_coef_idx(codec, 0x50);
5644 			is_ctia = (val & 0x0070) == 0x0070;
5645 		}
5646 		alc_process_coef_fw(codec, coef0298);
5647 		snd_hda_codec_write(codec, 0x21, 0,
5648 			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP);
5649 		msleep(75);
5650 		snd_hda_codec_write(codec, 0x21, 0,
5651 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5652 		break;
5653 	case 0x10ec0286:
5654 	case 0x10ec0288:
5655 		alc_process_coef_fw(codec, coef0288);
5656 		msleep(350);
5657 		val = alc_read_coef_idx(codec, 0x50);
5658 		is_ctia = (val & 0x0070) == 0x0070;
5659 		break;
5660 	case 0x10ec0292:
5661 		alc_write_coef_idx(codec, 0x6b, 0xd429);
5662 		msleep(300);
5663 		val = alc_read_coef_idx(codec, 0x6c);
5664 		is_ctia = (val & 0x001c) == 0x001c;
5665 		break;
5666 	case 0x10ec0293:
5667 		alc_process_coef_fw(codec, coef0293);
5668 		msleep(300);
5669 		val = alc_read_coef_idx(codec, 0x46);
5670 		is_ctia = (val & 0x0070) == 0x0070;
5671 		break;
5672 	case 0x10ec0668:
5673 		alc_process_coef_fw(codec, coef0688);
5674 		msleep(300);
5675 		val = alc_read_coef_idx(codec, 0xbe);
5676 		is_ctia = (val & 0x1c02) == 0x1c02;
5677 		break;
5678 	case 0x10ec0215:
5679 	case 0x10ec0225:
5680 	case 0x10ec0285:
5681 	case 0x10ec0295:
5682 	case 0x10ec0289:
5683 	case 0x10ec0299:
5684 		snd_hda_codec_write(codec, 0x21, 0,
5685 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5686 		msleep(80);
5687 		snd_hda_codec_write(codec, 0x21, 0,
5688 			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5689 
5690 		alc_process_coef_fw(codec, alc225_pre_hsmode);
5691 		alc_update_coef_idx(codec, 0x67, 0xf000, 0x1000);
5692 		val = alc_read_coef_idx(codec, 0x45);
5693 		if (val & (1 << 9)) {
5694 			alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5695 			alc_update_coef_idx(codec, 0x49, 3<<8, 2<<8);
5696 			msleep(800);
5697 			val = alc_read_coef_idx(codec, 0x46);
5698 			is_ctia = (val & 0x00f0) == 0x00f0;
5699 		} else {
5700 			alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5701 			alc_update_coef_idx(codec, 0x49, 3<<8, 1<<8);
5702 			msleep(800);
5703 			val = alc_read_coef_idx(codec, 0x46);
5704 			is_ctia = (val & 0x00f0) == 0x00f0;
5705 		}
5706 		alc_update_coef_idx(codec, 0x4a, 7<<6, 7<<6);
5707 		alc_update_coef_idx(codec, 0x4a, 3<<4, 3<<4);
5708 		alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
5709 
5710 		snd_hda_codec_write(codec, 0x21, 0,
5711 			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5712 		msleep(80);
5713 		snd_hda_codec_write(codec, 0x21, 0,
5714 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5715 		break;
5716 	case 0x10ec0867:
5717 		is_ctia = true;
5718 		break;
5719 	}
5720 
5721 	codec_dbg(codec, "Headset jack detected iPhone-style headset: %s\n",
5722 		    is_ctia ? "yes" : "no");
5723 	spec->current_headset_type = is_ctia ? ALC_HEADSET_TYPE_CTIA : ALC_HEADSET_TYPE_OMTP;
5724 }
5725 
5726 static void alc_update_headset_mode(struct hda_codec *codec)
5727 {
5728 	struct alc_spec *spec = codec->spec;
5729 
5730 	hda_nid_t mux_pin = spec->gen.imux_pins[spec->gen.cur_mux[0]];
5731 	hda_nid_t hp_pin = alc_get_hp_pin(spec);
5732 
5733 	int new_headset_mode;
5734 
5735 	if (!snd_hda_jack_detect(codec, hp_pin))
5736 		new_headset_mode = ALC_HEADSET_MODE_UNPLUGGED;
5737 	else if (mux_pin == spec->headset_mic_pin)
5738 		new_headset_mode = ALC_HEADSET_MODE_HEADSET;
5739 	else if (mux_pin == spec->headphone_mic_pin)
5740 		new_headset_mode = ALC_HEADSET_MODE_MIC;
5741 	else
5742 		new_headset_mode = ALC_HEADSET_MODE_HEADPHONE;
5743 
5744 	if (new_headset_mode == spec->current_headset_mode) {
5745 		snd_hda_gen_update_outputs(codec);
5746 		return;
5747 	}
5748 
5749 	switch (new_headset_mode) {
5750 	case ALC_HEADSET_MODE_UNPLUGGED:
5751 		alc_headset_mode_unplugged(codec);
5752 		spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5753 		spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
5754 		spec->gen.hp_jack_present = false;
5755 		break;
5756 	case ALC_HEADSET_MODE_HEADSET:
5757 		if (spec->current_headset_type == ALC_HEADSET_TYPE_UNKNOWN)
5758 			alc_determine_headset_type(codec);
5759 		if (spec->current_headset_type == ALC_HEADSET_TYPE_CTIA)
5760 			alc_headset_mode_ctia(codec);
5761 		else if (spec->current_headset_type == ALC_HEADSET_TYPE_OMTP)
5762 			alc_headset_mode_omtp(codec);
5763 		spec->gen.hp_jack_present = true;
5764 		break;
5765 	case ALC_HEADSET_MODE_MIC:
5766 		alc_headset_mode_mic_in(codec, hp_pin, spec->headphone_mic_pin);
5767 		spec->gen.hp_jack_present = false;
5768 		break;
5769 	case ALC_HEADSET_MODE_HEADPHONE:
5770 		alc_headset_mode_default(codec);
5771 		spec->gen.hp_jack_present = true;
5772 		break;
5773 	}
5774 	if (new_headset_mode != ALC_HEADSET_MODE_MIC) {
5775 		snd_hda_set_pin_ctl_cache(codec, hp_pin,
5776 					  AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
5777 		if (spec->headphone_mic_pin && spec->headphone_mic_pin != hp_pin)
5778 			snd_hda_set_pin_ctl_cache(codec, spec->headphone_mic_pin,
5779 						  PIN_VREFHIZ);
5780 	}
5781 	spec->current_headset_mode = new_headset_mode;
5782 
5783 	snd_hda_gen_update_outputs(codec);
5784 }
5785 
5786 static void alc_update_headset_mode_hook(struct hda_codec *codec,
5787 					 struct snd_kcontrol *kcontrol,
5788 					 struct snd_ctl_elem_value *ucontrol)
5789 {
5790 	alc_update_headset_mode(codec);
5791 }
5792 
5793 static void alc_update_headset_jack_cb(struct hda_codec *codec,
5794 				       struct hda_jack_callback *jack)
5795 {
5796 	snd_hda_gen_hp_automute(codec, jack);
5797 	alc_update_headset_mode(codec);
5798 }
5799 
5800 static void alc_probe_headset_mode(struct hda_codec *codec)
5801 {
5802 	int i;
5803 	struct alc_spec *spec = codec->spec;
5804 	struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5805 
5806 	/* Find mic pins */
5807 	for (i = 0; i < cfg->num_inputs; i++) {
5808 		if (cfg->inputs[i].is_headset_mic && !spec->headset_mic_pin)
5809 			spec->headset_mic_pin = cfg->inputs[i].pin;
5810 		if (cfg->inputs[i].is_headphone_mic && !spec->headphone_mic_pin)
5811 			spec->headphone_mic_pin = cfg->inputs[i].pin;
5812 	}
5813 
5814 	WARN_ON(spec->gen.cap_sync_hook);
5815 	spec->gen.cap_sync_hook = alc_update_headset_mode_hook;
5816 	spec->gen.automute_hook = alc_update_headset_mode;
5817 	spec->gen.hp_automute_hook = alc_update_headset_jack_cb;
5818 }
5819 
5820 static void alc_fixup_headset_mode(struct hda_codec *codec,
5821 				const struct hda_fixup *fix, int action)
5822 {
5823 	struct alc_spec *spec = codec->spec;
5824 
5825 	switch (action) {
5826 	case HDA_FIXUP_ACT_PRE_PROBE:
5827 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC | HDA_PINCFG_HEADPHONE_MIC;
5828 		break;
5829 	case HDA_FIXUP_ACT_PROBE:
5830 		alc_probe_headset_mode(codec);
5831 		break;
5832 	case HDA_FIXUP_ACT_INIT:
5833 		if (is_s3_resume(codec) || is_s4_resume(codec)) {
5834 			spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5835 			spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
5836 		}
5837 		alc_update_headset_mode(codec);
5838 		break;
5839 	}
5840 }
5841 
5842 static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
5843 				const struct hda_fixup *fix, int action)
5844 {
5845 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5846 		struct alc_spec *spec = codec->spec;
5847 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5848 	}
5849 	else
5850 		alc_fixup_headset_mode(codec, fix, action);
5851 }
5852 
5853 static void alc255_set_default_jack_type(struct hda_codec *codec)
5854 {
5855 	/* Set to iphone type */
5856 	static const struct coef_fw alc255fw[] = {
5857 		WRITE_COEF(0x1b, 0x880b),
5858 		WRITE_COEF(0x45, 0xd089),
5859 		WRITE_COEF(0x1b, 0x080b),
5860 		WRITE_COEF(0x46, 0x0004),
5861 		WRITE_COEF(0x1b, 0x0c0b),
5862 		{}
5863 	};
5864 	static const struct coef_fw alc256fw[] = {
5865 		WRITE_COEF(0x1b, 0x884b),
5866 		WRITE_COEF(0x45, 0xd089),
5867 		WRITE_COEF(0x1b, 0x084b),
5868 		WRITE_COEF(0x46, 0x0004),
5869 		WRITE_COEF(0x1b, 0x0c4b),
5870 		{}
5871 	};
5872 	switch (codec->core.vendor_id) {
5873 	case 0x10ec0255:
5874 		alc_process_coef_fw(codec, alc255fw);
5875 		break;
5876 	case 0x10ec0230:
5877 	case 0x10ec0236:
5878 	case 0x10ec0256:
5879 	case 0x19e58326:
5880 		alc_process_coef_fw(codec, alc256fw);
5881 		break;
5882 	}
5883 	msleep(30);
5884 }
5885 
5886 static void alc_fixup_headset_mode_alc255(struct hda_codec *codec,
5887 				const struct hda_fixup *fix, int action)
5888 {
5889 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5890 		alc255_set_default_jack_type(codec);
5891 	}
5892 	alc_fixup_headset_mode(codec, fix, action);
5893 }
5894 
5895 static void alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec,
5896 				const struct hda_fixup *fix, int action)
5897 {
5898 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5899 		struct alc_spec *spec = codec->spec;
5900 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5901 		alc255_set_default_jack_type(codec);
5902 	}
5903 	else
5904 		alc_fixup_headset_mode(codec, fix, action);
5905 }
5906 
5907 static void alc288_update_headset_jack_cb(struct hda_codec *codec,
5908 				       struct hda_jack_callback *jack)
5909 {
5910 	struct alc_spec *spec = codec->spec;
5911 
5912 	alc_update_headset_jack_cb(codec, jack);
5913 	/* Headset Mic enable or disable, only for Dell Dino */
5914 	alc_update_gpio_data(codec, 0x40, spec->gen.hp_jack_present);
5915 }
5916 
5917 static void alc_fixup_headset_mode_dell_alc288(struct hda_codec *codec,
5918 				const struct hda_fixup *fix, int action)
5919 {
5920 	alc_fixup_headset_mode(codec, fix, action);
5921 	if (action == HDA_FIXUP_ACT_PROBE) {
5922 		struct alc_spec *spec = codec->spec;
5923 		/* toggled via hp_automute_hook */
5924 		spec->gpio_mask |= 0x40;
5925 		spec->gpio_dir |= 0x40;
5926 		spec->gen.hp_automute_hook = alc288_update_headset_jack_cb;
5927 	}
5928 }
5929 
5930 static void alc_fixup_auto_mute_via_amp(struct hda_codec *codec,
5931 					const struct hda_fixup *fix, int action)
5932 {
5933 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5934 		struct alc_spec *spec = codec->spec;
5935 		spec->gen.auto_mute_via_amp = 1;
5936 	}
5937 }
5938 
5939 static void alc_fixup_no_shutup(struct hda_codec *codec,
5940 				const struct hda_fixup *fix, int action)
5941 {
5942 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5943 		struct alc_spec *spec = codec->spec;
5944 		spec->no_shutup_pins = 1;
5945 	}
5946 }
5947 
5948 static void alc_fixup_disable_aamix(struct hda_codec *codec,
5949 				    const struct hda_fixup *fix, int action)
5950 {
5951 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5952 		struct alc_spec *spec = codec->spec;
5953 		/* Disable AA-loopback as it causes white noise */
5954 		spec->gen.mixer_nid = 0;
5955 	}
5956 }
5957 
5958 /* fixup for Thinkpad docks: add dock pins, avoid HP parser fixup */
5959 static void alc_fixup_tpt440_dock(struct hda_codec *codec,
5960 				  const struct hda_fixup *fix, int action)
5961 {
5962 	static const struct hda_pintbl pincfgs[] = {
5963 		{ 0x16, 0x21211010 }, /* dock headphone */
5964 		{ 0x19, 0x21a11010 }, /* dock mic */
5965 		{ }
5966 	};
5967 	struct alc_spec *spec = codec->spec;
5968 
5969 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5970 		spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
5971 		codec->power_save_node = 0; /* avoid click noises */
5972 		snd_hda_apply_pincfgs(codec, pincfgs);
5973 	}
5974 }
5975 
5976 static void alc_fixup_tpt470_dock(struct hda_codec *codec,
5977 				  const struct hda_fixup *fix, int action)
5978 {
5979 	static const struct hda_pintbl pincfgs[] = {
5980 		{ 0x17, 0x21211010 }, /* dock headphone */
5981 		{ 0x19, 0x21a11010 }, /* dock mic */
5982 		{ }
5983 	};
5984 	struct alc_spec *spec = codec->spec;
5985 
5986 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5987 		spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
5988 		snd_hda_apply_pincfgs(codec, pincfgs);
5989 	} else if (action == HDA_FIXUP_ACT_INIT) {
5990 		/* Enable DOCK device */
5991 		snd_hda_codec_write(codec, 0x17, 0,
5992 			    AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
5993 		/* Enable DOCK device */
5994 		snd_hda_codec_write(codec, 0x19, 0,
5995 			    AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
5996 	}
5997 }
5998 
5999 static void alc_fixup_tpt470_dacs(struct hda_codec *codec,
6000 				  const struct hda_fixup *fix, int action)
6001 {
6002 	/* Assure the speaker pin to be coupled with DAC NID 0x03; otherwise
6003 	 * the speaker output becomes too low by some reason on Thinkpads with
6004 	 * ALC298 codec
6005 	 */
6006 	static const hda_nid_t preferred_pairs[] = {
6007 		0x14, 0x03, 0x17, 0x02, 0x21, 0x02,
6008 		0
6009 	};
6010 	struct alc_spec *spec = codec->spec;
6011 
6012 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
6013 		spec->gen.preferred_dacs = preferred_pairs;
6014 }
6015 
6016 static void alc295_fixup_asus_dacs(struct hda_codec *codec,
6017 				   const struct hda_fixup *fix, int action)
6018 {
6019 	static const hda_nid_t preferred_pairs[] = {
6020 		0x17, 0x02, 0x21, 0x03, 0
6021 	};
6022 	struct alc_spec *spec = codec->spec;
6023 
6024 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
6025 		spec->gen.preferred_dacs = preferred_pairs;
6026 }
6027 
6028 static void alc_shutup_dell_xps13(struct hda_codec *codec)
6029 {
6030 	struct alc_spec *spec = codec->spec;
6031 	int hp_pin = alc_get_hp_pin(spec);
6032 
6033 	/* Prevent pop noises when headphones are plugged in */
6034 	snd_hda_codec_write(codec, hp_pin, 0,
6035 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
6036 	msleep(20);
6037 }
6038 
6039 static void alc_fixup_dell_xps13(struct hda_codec *codec,
6040 				const struct hda_fixup *fix, int action)
6041 {
6042 	struct alc_spec *spec = codec->spec;
6043 	struct hda_input_mux *imux = &spec->gen.input_mux;
6044 	int i;
6045 
6046 	switch (action) {
6047 	case HDA_FIXUP_ACT_PRE_PROBE:
6048 		/* mic pin 0x19 must be initialized with Vref Hi-Z, otherwise
6049 		 * it causes a click noise at start up
6050 		 */
6051 		snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
6052 		spec->shutup = alc_shutup_dell_xps13;
6053 		break;
6054 	case HDA_FIXUP_ACT_PROBE:
6055 		/* Make the internal mic the default input source. */
6056 		for (i = 0; i < imux->num_items; i++) {
6057 			if (spec->gen.imux_pins[i] == 0x12) {
6058 				spec->gen.cur_mux[0] = i;
6059 				break;
6060 			}
6061 		}
6062 		break;
6063 	}
6064 }
6065 
6066 static void alc_fixup_headset_mode_alc662(struct hda_codec *codec,
6067 				const struct hda_fixup *fix, int action)
6068 {
6069 	struct alc_spec *spec = codec->spec;
6070 
6071 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6072 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
6073 		spec->gen.hp_mic = 1; /* Mic-in is same pin as headphone */
6074 
6075 		/* Disable boost for mic-in permanently. (This code is only called
6076 		   from quirks that guarantee that the headphone is at NID 0x1b.) */
6077 		snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000);
6078 		snd_hda_override_wcaps(codec, 0x1b, get_wcaps(codec, 0x1b) & ~AC_WCAP_IN_AMP);
6079 	} else
6080 		alc_fixup_headset_mode(codec, fix, action);
6081 }
6082 
6083 static void alc_fixup_headset_mode_alc668(struct hda_codec *codec,
6084 				const struct hda_fixup *fix, int action)
6085 {
6086 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6087 		alc_write_coef_idx(codec, 0xc4, 0x8000);
6088 		alc_update_coef_idx(codec, 0xc2, ~0xfe, 0);
6089 		snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
6090 	}
6091 	alc_fixup_headset_mode(codec, fix, action);
6092 }
6093 
6094 /* Returns the nid of the external mic input pin, or 0 if it cannot be found. */
6095 static int find_ext_mic_pin(struct hda_codec *codec)
6096 {
6097 	struct alc_spec *spec = codec->spec;
6098 	struct auto_pin_cfg *cfg = &spec->gen.autocfg;
6099 	hda_nid_t nid;
6100 	unsigned int defcfg;
6101 	int i;
6102 
6103 	for (i = 0; i < cfg->num_inputs; i++) {
6104 		if (cfg->inputs[i].type != AUTO_PIN_MIC)
6105 			continue;
6106 		nid = cfg->inputs[i].pin;
6107 		defcfg = snd_hda_codec_get_pincfg(codec, nid);
6108 		if (snd_hda_get_input_pin_attr(defcfg) == INPUT_PIN_ATTR_INT)
6109 			continue;
6110 		return nid;
6111 	}
6112 
6113 	return 0;
6114 }
6115 
6116 static void alc271_hp_gate_mic_jack(struct hda_codec *codec,
6117 				    const struct hda_fixup *fix,
6118 				    int action)
6119 {
6120 	struct alc_spec *spec = codec->spec;
6121 
6122 	if (action == HDA_FIXUP_ACT_PROBE) {
6123 		int mic_pin = find_ext_mic_pin(codec);
6124 		int hp_pin = alc_get_hp_pin(spec);
6125 
6126 		if (snd_BUG_ON(!mic_pin || !hp_pin))
6127 			return;
6128 		snd_hda_jack_set_gating_jack(codec, mic_pin, hp_pin);
6129 	}
6130 }
6131 
6132 static void alc269_fixup_limit_int_mic_boost(struct hda_codec *codec,
6133 					     const struct hda_fixup *fix,
6134 					     int action)
6135 {
6136 	struct alc_spec *spec = codec->spec;
6137 	struct auto_pin_cfg *cfg = &spec->gen.autocfg;
6138 	int i;
6139 
6140 	/* The mic boosts on level 2 and 3 are too noisy
6141 	   on the internal mic input.
6142 	   Therefore limit the boost to 0 or 1. */
6143 
6144 	if (action != HDA_FIXUP_ACT_PROBE)
6145 		return;
6146 
6147 	for (i = 0; i < cfg->num_inputs; i++) {
6148 		hda_nid_t nid = cfg->inputs[i].pin;
6149 		unsigned int defcfg;
6150 		if (cfg->inputs[i].type != AUTO_PIN_MIC)
6151 			continue;
6152 		defcfg = snd_hda_codec_get_pincfg(codec, nid);
6153 		if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
6154 			continue;
6155 
6156 		snd_hda_override_amp_caps(codec, nid, HDA_INPUT,
6157 					  (0x00 << AC_AMPCAP_OFFSET_SHIFT) |
6158 					  (0x01 << AC_AMPCAP_NUM_STEPS_SHIFT) |
6159 					  (0x2f << AC_AMPCAP_STEP_SIZE_SHIFT) |
6160 					  (0 << AC_AMPCAP_MUTE_SHIFT));
6161 	}
6162 }
6163 
6164 static void alc283_hp_automute_hook(struct hda_codec *codec,
6165 				    struct hda_jack_callback *jack)
6166 {
6167 	struct alc_spec *spec = codec->spec;
6168 	int vref;
6169 
6170 	msleep(200);
6171 	snd_hda_gen_hp_automute(codec, jack);
6172 
6173 	vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
6174 
6175 	msleep(600);
6176 	snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
6177 			    vref);
6178 }
6179 
6180 static void alc283_fixup_chromebook(struct hda_codec *codec,
6181 				    const struct hda_fixup *fix, int action)
6182 {
6183 	struct alc_spec *spec = codec->spec;
6184 
6185 	switch (action) {
6186 	case HDA_FIXUP_ACT_PRE_PROBE:
6187 		snd_hda_override_wcaps(codec, 0x03, 0);
6188 		/* Disable AA-loopback as it causes white noise */
6189 		spec->gen.mixer_nid = 0;
6190 		break;
6191 	case HDA_FIXUP_ACT_INIT:
6192 		/* MIC2-VREF control */
6193 		/* Set to manual mode */
6194 		alc_update_coef_idx(codec, 0x06, 0x000c, 0);
6195 		/* Enable Line1 input control by verb */
6196 		alc_update_coef_idx(codec, 0x1a, 0, 1 << 4);
6197 		break;
6198 	}
6199 }
6200 
6201 static void alc283_fixup_sense_combo_jack(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->gen.hp_automute_hook = alc283_hp_automute_hook;
6209 		break;
6210 	case HDA_FIXUP_ACT_INIT:
6211 		/* MIC2-VREF control */
6212 		/* Set to manual mode */
6213 		alc_update_coef_idx(codec, 0x06, 0x000c, 0);
6214 		break;
6215 	}
6216 }
6217 
6218 /* mute tablet speaker pin (0x14) via dock plugging in addition */
6219 static void asus_tx300_automute(struct hda_codec *codec)
6220 {
6221 	struct alc_spec *spec = codec->spec;
6222 	snd_hda_gen_update_outputs(codec);
6223 	if (snd_hda_jack_detect(codec, 0x1b))
6224 		spec->gen.mute_bits |= (1ULL << 0x14);
6225 }
6226 
6227 static void alc282_fixup_asus_tx300(struct hda_codec *codec,
6228 				    const struct hda_fixup *fix, int action)
6229 {
6230 	struct alc_spec *spec = codec->spec;
6231 	static const struct hda_pintbl dock_pins[] = {
6232 		{ 0x1b, 0x21114000 }, /* dock speaker pin */
6233 		{}
6234 	};
6235 
6236 	switch (action) {
6237 	case HDA_FIXUP_ACT_PRE_PROBE:
6238 		spec->init_amp = ALC_INIT_DEFAULT;
6239 		/* TX300 needs to set up GPIO2 for the speaker amp */
6240 		alc_setup_gpio(codec, 0x04);
6241 		snd_hda_apply_pincfgs(codec, dock_pins);
6242 		spec->gen.auto_mute_via_amp = 1;
6243 		spec->gen.automute_hook = asus_tx300_automute;
6244 		snd_hda_jack_detect_enable_callback(codec, 0x1b,
6245 						    snd_hda_gen_hp_automute);
6246 		break;
6247 	case HDA_FIXUP_ACT_PROBE:
6248 		spec->init_amp = ALC_INIT_DEFAULT;
6249 		break;
6250 	case HDA_FIXUP_ACT_BUILD:
6251 		/* this is a bit tricky; give more sane names for the main
6252 		 * (tablet) speaker and the dock speaker, respectively
6253 		 */
6254 		rename_ctl(codec, "Speaker Playback Switch",
6255 			   "Dock Speaker Playback Switch");
6256 		rename_ctl(codec, "Bass Speaker Playback Switch",
6257 			   "Speaker Playback Switch");
6258 		break;
6259 	}
6260 }
6261 
6262 static void alc290_fixup_mono_speakers(struct hda_codec *codec,
6263 				       const struct hda_fixup *fix, int action)
6264 {
6265 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6266 		/* DAC node 0x03 is giving mono output. We therefore want to
6267 		   make sure 0x14 (front speaker) and 0x15 (headphones) use the
6268 		   stereo DAC, while leaving 0x17 (bass speaker) for node 0x03. */
6269 		static const hda_nid_t conn1[] = { 0x0c };
6270 		snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
6271 		snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
6272 	}
6273 }
6274 
6275 static void alc298_fixup_speaker_volume(struct hda_codec *codec,
6276 					const struct hda_fixup *fix, int action)
6277 {
6278 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6279 		/* The speaker is routed to the Node 0x06 by a mistake, as a result
6280 		   we can't adjust the speaker's volume since this node does not has
6281 		   Amp-out capability. we change the speaker's route to:
6282 		   Node 0x02 (Audio Output) -> Node 0x0c (Audio Mixer) -> Node 0x17 (
6283 		   Pin Complex), since Node 0x02 has Amp-out caps, we can adjust
6284 		   speaker's volume now. */
6285 
6286 		static const hda_nid_t conn1[] = { 0x0c };
6287 		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn1), conn1);
6288 	}
6289 }
6290 
6291 /* disable DAC3 (0x06) selection on NID 0x17 as it has no volume amp control */
6292 static void alc295_fixup_disable_dac3(struct hda_codec *codec,
6293 				      const struct hda_fixup *fix, int action)
6294 {
6295 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6296 		static const hda_nid_t conn[] = { 0x02, 0x03 };
6297 		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6298 	}
6299 }
6300 
6301 /* force NID 0x17 (Bass Speaker) to DAC1 to share it with the main speaker */
6302 static void alc285_fixup_speaker2_to_dac1(struct hda_codec *codec,
6303 					  const struct hda_fixup *fix, int action)
6304 {
6305 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6306 		static const hda_nid_t conn[] = { 0x02 };
6307 		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6308 	}
6309 }
6310 
6311 /* Hook to update amp GPIO4 for automute */
6312 static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec,
6313 					  struct hda_jack_callback *jack)
6314 {
6315 	struct alc_spec *spec = codec->spec;
6316 
6317 	snd_hda_gen_hp_automute(codec, jack);
6318 	/* mute_led_polarity is set to 0, so we pass inverted value here */
6319 	alc_update_gpio_led(codec, 0x10, spec->mute_led_polarity,
6320 			    !spec->gen.hp_jack_present);
6321 }
6322 
6323 /* Manage GPIOs for HP EliteBook Folio 9480m.
6324  *
6325  * GPIO4 is the headphone amplifier power control
6326  * GPIO3 is the audio output mute indicator LED
6327  */
6328 
6329 static void alc280_fixup_hp_9480m(struct hda_codec *codec,
6330 				  const struct hda_fixup *fix,
6331 				  int action)
6332 {
6333 	struct alc_spec *spec = codec->spec;
6334 
6335 	alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
6336 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6337 		/* amp at GPIO4; toggled via alc280_hp_gpio4_automute_hook() */
6338 		spec->gpio_mask |= 0x10;
6339 		spec->gpio_dir |= 0x10;
6340 		spec->gen.hp_automute_hook = alc280_hp_gpio4_automute_hook;
6341 	}
6342 }
6343 
6344 static void alc275_fixup_gpio4_off(struct hda_codec *codec,
6345 				   const struct hda_fixup *fix,
6346 				   int action)
6347 {
6348 	struct alc_spec *spec = codec->spec;
6349 
6350 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6351 		spec->gpio_mask |= 0x04;
6352 		spec->gpio_dir |= 0x04;
6353 		/* set data bit low */
6354 	}
6355 }
6356 
6357 /* Quirk for Thinkpad X1 7th and 8th Gen
6358  * The following fixed routing needed
6359  * DAC1 (NID 0x02) -> Speaker (NID 0x14); some eq applied secretly
6360  * DAC2 (NID 0x03) -> Bass (NID 0x17) & Headphone (NID 0x21); sharing a DAC
6361  * DAC3 (NID 0x06) -> Unused, due to the lack of volume amp
6362  */
6363 static void alc285_fixup_thinkpad_x1_gen7(struct hda_codec *codec,
6364 					  const struct hda_fixup *fix, int action)
6365 {
6366 	static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */
6367 	static const hda_nid_t preferred_pairs[] = {
6368 		0x14, 0x02, 0x17, 0x03, 0x21, 0x03, 0
6369 	};
6370 	struct alc_spec *spec = codec->spec;
6371 
6372 	switch (action) {
6373 	case HDA_FIXUP_ACT_PRE_PROBE:
6374 		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6375 		spec->gen.preferred_dacs = preferred_pairs;
6376 		break;
6377 	case HDA_FIXUP_ACT_BUILD:
6378 		/* The generic parser creates somewhat unintuitive volume ctls
6379 		 * with the fixed routing above, and the shared DAC2 may be
6380 		 * confusing for PA.
6381 		 * Rename those to unique names so that PA doesn't touch them
6382 		 * and use only Master volume.
6383 		 */
6384 		rename_ctl(codec, "Front Playback Volume", "DAC1 Playback Volume");
6385 		rename_ctl(codec, "Bass Speaker Playback Volume", "DAC2 Playback Volume");
6386 		break;
6387 	}
6388 }
6389 
6390 static void alc233_alc662_fixup_lenovo_dual_codecs(struct hda_codec *codec,
6391 					 const struct hda_fixup *fix,
6392 					 int action)
6393 {
6394 	alc_fixup_dual_codecs(codec, fix, action);
6395 	switch (action) {
6396 	case HDA_FIXUP_ACT_PRE_PROBE:
6397 		/* override card longname to provide a unique UCM profile */
6398 		strcpy(codec->card->longname, "HDAudio-Lenovo-DualCodecs");
6399 		break;
6400 	case HDA_FIXUP_ACT_BUILD:
6401 		/* rename Capture controls depending on the codec */
6402 		rename_ctl(codec, "Capture Volume",
6403 			   codec->addr == 0 ?
6404 			   "Rear-Panel Capture Volume" :
6405 			   "Front-Panel Capture Volume");
6406 		rename_ctl(codec, "Capture Switch",
6407 			   codec->addr == 0 ?
6408 			   "Rear-Panel Capture Switch" :
6409 			   "Front-Panel Capture Switch");
6410 		break;
6411 	}
6412 }
6413 
6414 static void alc225_fixup_s3_pop_noise(struct hda_codec *codec,
6415 				      const struct hda_fixup *fix, int action)
6416 {
6417 	if (action != HDA_FIXUP_ACT_PRE_PROBE)
6418 		return;
6419 
6420 	codec->power_save_node = 1;
6421 }
6422 
6423 /* Forcibly assign NID 0x03 to HP/LO while NID 0x02 to SPK for EQ */
6424 static void alc274_fixup_bind_dacs(struct hda_codec *codec,
6425 				    const struct hda_fixup *fix, int action)
6426 {
6427 	struct alc_spec *spec = codec->spec;
6428 	static const hda_nid_t preferred_pairs[] = {
6429 		0x21, 0x03, 0x1b, 0x03, 0x16, 0x02,
6430 		0
6431 	};
6432 
6433 	if (action != HDA_FIXUP_ACT_PRE_PROBE)
6434 		return;
6435 
6436 	spec->gen.preferred_dacs = preferred_pairs;
6437 	spec->gen.auto_mute_via_amp = 1;
6438 	codec->power_save_node = 0;
6439 }
6440 
6441 /* avoid DAC 0x06 for bass speaker 0x17; it has no volume control */
6442 static void alc289_fixup_asus_ga401(struct hda_codec *codec,
6443 				    const struct hda_fixup *fix, int action)
6444 {
6445 	static const hda_nid_t preferred_pairs[] = {
6446 		0x14, 0x02, 0x17, 0x02, 0x21, 0x03, 0
6447 	};
6448 	struct alc_spec *spec = codec->spec;
6449 
6450 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6451 		spec->gen.preferred_dacs = preferred_pairs;
6452 		spec->gen.obey_preferred_dacs = 1;
6453 	}
6454 }
6455 
6456 /* The DAC of NID 0x3 will introduce click/pop noise on headphones, so invalidate it */
6457 static void alc285_fixup_invalidate_dacs(struct hda_codec *codec,
6458 			      const struct hda_fixup *fix, int action)
6459 {
6460 	if (action != HDA_FIXUP_ACT_PRE_PROBE)
6461 		return;
6462 
6463 	snd_hda_override_wcaps(codec, 0x03, 0);
6464 }
6465 
6466 static void alc_combo_jack_hp_jd_restart(struct hda_codec *codec)
6467 {
6468 	switch (codec->core.vendor_id) {
6469 	case 0x10ec0274:
6470 	case 0x10ec0294:
6471 	case 0x10ec0225:
6472 	case 0x10ec0295:
6473 	case 0x10ec0299:
6474 		alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15); /* Reset HP JD */
6475 		alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15);
6476 		break;
6477 	case 0x10ec0230:
6478 	case 0x10ec0235:
6479 	case 0x10ec0236:
6480 	case 0x10ec0255:
6481 	case 0x10ec0256:
6482 	case 0x19e58326:
6483 		alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15); /* Reset HP JD */
6484 		alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15);
6485 		break;
6486 	}
6487 }
6488 
6489 static void alc295_fixup_chromebook(struct hda_codec *codec,
6490 				    const struct hda_fixup *fix, int action)
6491 {
6492 	struct alc_spec *spec = codec->spec;
6493 
6494 	switch (action) {
6495 	case HDA_FIXUP_ACT_PRE_PROBE:
6496 		spec->ultra_low_power = true;
6497 		break;
6498 	case HDA_FIXUP_ACT_INIT:
6499 		alc_combo_jack_hp_jd_restart(codec);
6500 		break;
6501 	}
6502 }
6503 
6504 static void alc_fixup_disable_mic_vref(struct hda_codec *codec,
6505 				  const struct hda_fixup *fix, int action)
6506 {
6507 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
6508 		snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
6509 }
6510 
6511 
6512 static void alc294_gx502_toggle_output(struct hda_codec *codec,
6513 					struct hda_jack_callback *cb)
6514 {
6515 	/* The Windows driver sets the codec up in a very different way where
6516 	 * it appears to leave 0x10 = 0x8a20 set. For Linux we need to toggle it
6517 	 */
6518 	if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
6519 		alc_write_coef_idx(codec, 0x10, 0x8a20);
6520 	else
6521 		alc_write_coef_idx(codec, 0x10, 0x0a20);
6522 }
6523 
6524 static void alc294_fixup_gx502_hp(struct hda_codec *codec,
6525 					const struct hda_fixup *fix, int action)
6526 {
6527 	/* Pin 0x21: headphones/headset mic */
6528 	if (!is_jack_detectable(codec, 0x21))
6529 		return;
6530 
6531 	switch (action) {
6532 	case HDA_FIXUP_ACT_PRE_PROBE:
6533 		snd_hda_jack_detect_enable_callback(codec, 0x21,
6534 				alc294_gx502_toggle_output);
6535 		break;
6536 	case HDA_FIXUP_ACT_INIT:
6537 		/* Make sure to start in a correct state, i.e. if
6538 		 * headphones have been plugged in before powering up the system
6539 		 */
6540 		alc294_gx502_toggle_output(codec, NULL);
6541 		break;
6542 	}
6543 }
6544 
6545 static void alc294_gu502_toggle_output(struct hda_codec *codec,
6546 				       struct hda_jack_callback *cb)
6547 {
6548 	/* Windows sets 0x10 to 0x8420 for Node 0x20 which is
6549 	 * responsible from changes between speakers and headphones
6550 	 */
6551 	if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
6552 		alc_write_coef_idx(codec, 0x10, 0x8420);
6553 	else
6554 		alc_write_coef_idx(codec, 0x10, 0x0a20);
6555 }
6556 
6557 static void alc294_fixup_gu502_hp(struct hda_codec *codec,
6558 				  const struct hda_fixup *fix, int action)
6559 {
6560 	if (!is_jack_detectable(codec, 0x21))
6561 		return;
6562 
6563 	switch (action) {
6564 	case HDA_FIXUP_ACT_PRE_PROBE:
6565 		snd_hda_jack_detect_enable_callback(codec, 0x21,
6566 				alc294_gu502_toggle_output);
6567 		break;
6568 	case HDA_FIXUP_ACT_INIT:
6569 		alc294_gu502_toggle_output(codec, NULL);
6570 		break;
6571 	}
6572 }
6573 
6574 static void  alc285_fixup_hp_gpio_amp_init(struct hda_codec *codec,
6575 			      const struct hda_fixup *fix, int action)
6576 {
6577 	if (action != HDA_FIXUP_ACT_INIT)
6578 		return;
6579 
6580 	msleep(100);
6581 	alc_write_coef_idx(codec, 0x65, 0x0);
6582 }
6583 
6584 static void alc274_fixup_hp_headset_mic(struct hda_codec *codec,
6585 				    const struct hda_fixup *fix, int action)
6586 {
6587 	switch (action) {
6588 	case HDA_FIXUP_ACT_INIT:
6589 		alc_combo_jack_hp_jd_restart(codec);
6590 		break;
6591 	}
6592 }
6593 
6594 static void alc_fixup_no_int_mic(struct hda_codec *codec,
6595 				    const struct hda_fixup *fix, int action)
6596 {
6597 	struct alc_spec *spec = codec->spec;
6598 
6599 	switch (action) {
6600 	case HDA_FIXUP_ACT_PRE_PROBE:
6601 		/* Mic RING SLEEVE swap for combo jack */
6602 		alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
6603 		spec->no_internal_mic_pin = true;
6604 		break;
6605 	case HDA_FIXUP_ACT_INIT:
6606 		alc_combo_jack_hp_jd_restart(codec);
6607 		break;
6608 	}
6609 }
6610 
6611 /* GPIO1 = amplifier on/off
6612  * GPIO3 = mic mute LED
6613  */
6614 static void alc285_fixup_hp_spectre_x360_eb1(struct hda_codec *codec,
6615 					  const struct hda_fixup *fix, int action)
6616 {
6617 	static const hda_nid_t conn[] = { 0x02 };
6618 
6619 	struct alc_spec *spec = codec->spec;
6620 	static const struct hda_pintbl pincfgs[] = {
6621 		{ 0x14, 0x90170110 },  /* front/high speakers */
6622 		{ 0x17, 0x90170130 },  /* back/bass speakers */
6623 		{ }
6624 	};
6625 
6626 	//enable micmute led
6627 	alc_fixup_hp_gpio_led(codec, action, 0x00, 0x04);
6628 
6629 	switch (action) {
6630 	case HDA_FIXUP_ACT_PRE_PROBE:
6631 		spec->micmute_led_polarity = 1;
6632 		/* needed for amp of back speakers */
6633 		spec->gpio_mask |= 0x01;
6634 		spec->gpio_dir |= 0x01;
6635 		snd_hda_apply_pincfgs(codec, pincfgs);
6636 		/* share DAC to have unified volume control */
6637 		snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
6638 		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6639 		break;
6640 	case HDA_FIXUP_ACT_INIT:
6641 		/* need to toggle GPIO to enable the amp of back speakers */
6642 		alc_update_gpio_data(codec, 0x01, true);
6643 		msleep(100);
6644 		alc_update_gpio_data(codec, 0x01, false);
6645 		break;
6646 	}
6647 }
6648 
6649 static void alc285_fixup_hp_spectre_x360(struct hda_codec *codec,
6650 					  const struct hda_fixup *fix, int action)
6651 {
6652 	static const hda_nid_t conn[] = { 0x02 };
6653 	static const struct hda_pintbl pincfgs[] = {
6654 		{ 0x14, 0x90170110 },  /* rear speaker */
6655 		{ }
6656 	};
6657 
6658 	switch (action) {
6659 	case HDA_FIXUP_ACT_PRE_PROBE:
6660 		snd_hda_apply_pincfgs(codec, pincfgs);
6661 		/* force front speaker to DAC1 */
6662 		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6663 		break;
6664 	}
6665 }
6666 
6667 /* for hda_fixup_thinkpad_acpi() */
6668 #include "thinkpad_helper.c"
6669 
6670 static void alc_fixup_thinkpad_acpi(struct hda_codec *codec,
6671 				    const struct hda_fixup *fix, int action)
6672 {
6673 	alc_fixup_no_shutup(codec, fix, action); /* reduce click noise */
6674 	hda_fixup_thinkpad_acpi(codec, fix, action);
6675 }
6676 
6677 /* Fixup for Lenovo Legion 15IMHg05 speaker output on headset removal. */
6678 static void alc287_fixup_legion_15imhg05_speakers(struct hda_codec *codec,
6679 						  const struct hda_fixup *fix,
6680 						  int action)
6681 {
6682 	struct alc_spec *spec = codec->spec;
6683 
6684 	switch (action) {
6685 	case HDA_FIXUP_ACT_PRE_PROBE:
6686 		spec->gen.suppress_auto_mute = 1;
6687 		break;
6688 	}
6689 }
6690 
6691 static int comp_bind(struct device *dev)
6692 {
6693 	struct hda_codec *cdc = dev_to_hda_codec(dev);
6694 	struct alc_spec *spec = cdc->spec;
6695 
6696 	return component_bind_all(dev, spec->comps);
6697 }
6698 
6699 static void comp_unbind(struct device *dev)
6700 {
6701 	struct hda_codec *cdc = dev_to_hda_codec(dev);
6702 	struct alc_spec *spec = cdc->spec;
6703 
6704 	component_unbind_all(dev, spec->comps);
6705 }
6706 
6707 static const struct component_master_ops comp_master_ops = {
6708 	.bind = comp_bind,
6709 	.unbind = comp_unbind,
6710 };
6711 
6712 static void comp_generic_playback_hook(struct hda_pcm_stream *hinfo, struct hda_codec *cdc,
6713 				       struct snd_pcm_substream *sub, int action)
6714 {
6715 	struct alc_spec *spec = cdc->spec;
6716 	int i;
6717 
6718 	for (i = 0; i < HDA_MAX_COMPONENTS; i++) {
6719 		if (spec->comps[i].dev)
6720 			spec->comps[i].playback_hook(spec->comps[i].dev, action);
6721 	}
6722 }
6723 
6724 struct cs35l41_dev_name {
6725 	const char *bus;
6726 	const char *hid;
6727 	int index;
6728 };
6729 
6730 /* match the device name in a slightly relaxed manner */
6731 static int comp_match_cs35l41_dev_name(struct device *dev, void *data)
6732 {
6733 	struct cs35l41_dev_name *p = data;
6734 	const char *d = dev_name(dev);
6735 	int n = strlen(p->bus);
6736 	char tmp[32];
6737 
6738 	/* check the bus name */
6739 	if (strncmp(d, p->bus, n))
6740 		return 0;
6741 	/* skip the bus number */
6742 	if (isdigit(d[n]))
6743 		n++;
6744 	/* the rest must be exact matching */
6745 	snprintf(tmp, sizeof(tmp), "-%s:00-cs35l41-hda.%d", p->hid, p->index);
6746 	return !strcmp(d + n, tmp);
6747 }
6748 
6749 static void cs35l41_generic_fixup(struct hda_codec *cdc, int action, const char *bus,
6750 				  const char *hid, int count)
6751 {
6752 	struct device *dev = hda_codec_dev(cdc);
6753 	struct alc_spec *spec = cdc->spec;
6754 	struct cs35l41_dev_name *rec;
6755 	int ret, i;
6756 
6757 	switch (action) {
6758 	case HDA_FIXUP_ACT_PRE_PROBE:
6759 		for (i = 0; i < count; i++) {
6760 			rec = devm_kmalloc(dev, sizeof(*rec), GFP_KERNEL);
6761 			if (!rec)
6762 				return;
6763 			rec->bus = bus;
6764 			rec->hid = hid;
6765 			rec->index = i;
6766 			spec->comps[i].codec = cdc;
6767 			component_match_add(dev, &spec->match,
6768 					    comp_match_cs35l41_dev_name, rec);
6769 		}
6770 		ret = component_master_add_with_match(dev, &comp_master_ops, spec->match);
6771 		if (ret)
6772 			codec_err(cdc, "Fail to register component aggregator %d\n", ret);
6773 		else
6774 			spec->gen.pcm_playback_hook = comp_generic_playback_hook;
6775 		break;
6776 	case HDA_FIXUP_ACT_FREE:
6777 		component_master_del(dev, &comp_master_ops);
6778 		break;
6779 	}
6780 }
6781 
6782 static void cs35l41_fixup_i2c_two(struct hda_codec *cdc, const struct hda_fixup *fix, int action)
6783 {
6784 	cs35l41_generic_fixup(cdc, action, "i2c", "CSC3551", 2);
6785 }
6786 
6787 static void cs35l41_fixup_spi_two(struct hda_codec *codec, const struct hda_fixup *fix, int action)
6788 {
6789 	cs35l41_generic_fixup(codec, action, "spi", "CSC3551", 2);
6790 }
6791 
6792 static void cs35l41_fixup_spi_four(struct hda_codec *codec, const struct hda_fixup *fix, int action)
6793 {
6794 	cs35l41_generic_fixup(codec, action, "spi", "CSC3551", 4);
6795 }
6796 
6797 static void alc287_fixup_legion_16achg6_speakers(struct hda_codec *cdc, const struct hda_fixup *fix,
6798 						 int action)
6799 {
6800 	cs35l41_generic_fixup(cdc, action, "i2c", "CLSA0100", 2);
6801 }
6802 
6803 static void alc287_fixup_legion_16ithg6_speakers(struct hda_codec *cdc, const struct hda_fixup *fix,
6804 						 int action)
6805 {
6806 	cs35l41_generic_fixup(cdc, action, "i2c", "CLSA0101", 2);
6807 }
6808 
6809 /* for alc295_fixup_hp_top_speakers */
6810 #include "hp_x360_helper.c"
6811 
6812 /* for alc285_fixup_ideapad_s740_coef() */
6813 #include "ideapad_s740_helper.c"
6814 
6815 static const struct coef_fw alc256_fixup_set_coef_defaults_coefs[] = {
6816 	WRITE_COEF(0x10, 0x0020), WRITE_COEF(0x24, 0x0000),
6817 	WRITE_COEF(0x26, 0x0000), WRITE_COEF(0x29, 0x3000),
6818 	WRITE_COEF(0x37, 0xfe05), WRITE_COEF(0x45, 0x5089),
6819 	{}
6820 };
6821 
6822 static void alc256_fixup_set_coef_defaults(struct hda_codec *codec,
6823 					   const struct hda_fixup *fix,
6824 					   int action)
6825 {
6826 	/*
6827 	 * A certain other OS sets these coeffs to different values. On at least
6828 	 * one TongFang barebone these settings might survive even a cold
6829 	 * reboot. So to restore a clean slate the values are explicitly reset
6830 	 * to default here. Without this, the external microphone is always in a
6831 	 * plugged-in state, while the internal microphone is always in an
6832 	 * unplugged state, breaking the ability to use the internal microphone.
6833 	 */
6834 	alc_process_coef_fw(codec, alc256_fixup_set_coef_defaults_coefs);
6835 }
6836 
6837 static const struct coef_fw alc233_fixup_no_audio_jack_coefs[] = {
6838 	WRITE_COEF(0x1a, 0x9003), WRITE_COEF(0x1b, 0x0e2b), WRITE_COEF(0x37, 0xfe06),
6839 	WRITE_COEF(0x38, 0x4981), WRITE_COEF(0x45, 0xd489), WRITE_COEF(0x46, 0x0074),
6840 	WRITE_COEF(0x49, 0x0149),
6841 	{}
6842 };
6843 
6844 static void alc233_fixup_no_audio_jack(struct hda_codec *codec,
6845 				       const struct hda_fixup *fix,
6846 				       int action)
6847 {
6848 	/*
6849 	 * The audio jack input and output is not detected on the ASRock NUC Box
6850 	 * 1100 series when cold booting without this fix. Warm rebooting from a
6851 	 * certain other OS makes the audio functional, as COEF settings are
6852 	 * preserved in this case. This fix sets these altered COEF values as
6853 	 * the default.
6854 	 */
6855 	alc_process_coef_fw(codec, alc233_fixup_no_audio_jack_coefs);
6856 }
6857 
6858 static void alc256_fixup_mic_no_presence_and_resume(struct hda_codec *codec,
6859 						    const struct hda_fixup *fix,
6860 						    int action)
6861 {
6862 	/*
6863 	 * The Clevo NJ51CU comes either with the ALC293 or the ALC256 codec,
6864 	 * but uses the 0x8686 subproduct id in both cases. The ALC256 codec
6865 	 * needs an additional quirk for sound working after suspend and resume.
6866 	 */
6867 	if (codec->core.vendor_id == 0x10ec0256) {
6868 		alc_update_coef_idx(codec, 0x10, 1<<9, 0);
6869 		snd_hda_codec_set_pincfg(codec, 0x19, 0x04a11120);
6870 	} else {
6871 		snd_hda_codec_set_pincfg(codec, 0x1a, 0x04a1113c);
6872 	}
6873 }
6874 
6875 static void alc_fixup_dell4_mic_no_presence_quiet(struct hda_codec *codec,
6876 						  const struct hda_fixup *fix,
6877 						  int action)
6878 {
6879 	struct alc_spec *spec = codec->spec;
6880 	struct hda_input_mux *imux = &spec->gen.input_mux;
6881 	int i;
6882 
6883 	alc269_fixup_limit_int_mic_boost(codec, fix, action);
6884 
6885 	switch (action) {
6886 	case HDA_FIXUP_ACT_PRE_PROBE:
6887 		/**
6888 		 * Set the vref of pin 0x19 (Headset Mic) and pin 0x1b (Headphone Mic)
6889 		 * to Hi-Z to avoid pop noises at startup and when plugging and
6890 		 * unplugging headphones.
6891 		 */
6892 		snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
6893 		snd_hda_codec_set_pin_target(codec, 0x1b, PIN_VREFHIZ);
6894 		break;
6895 	case HDA_FIXUP_ACT_PROBE:
6896 		/**
6897 		 * Make the internal mic (0x12) the default input source to
6898 		 * prevent pop noises on cold boot.
6899 		 */
6900 		for (i = 0; i < imux->num_items; i++) {
6901 			if (spec->gen.imux_pins[i] == 0x12) {
6902 				spec->gen.cur_mux[0] = i;
6903 				break;
6904 			}
6905 		}
6906 		break;
6907 	}
6908 }
6909 
6910 static void alc287_fixup_yoga9_14iap7_bass_spk_pin(struct hda_codec *codec,
6911 					  const struct hda_fixup *fix, int action)
6912 {
6913 	/*
6914 	 * The Pin Complex 0x17 for the bass speakers is wrongly reported as
6915 	 * unconnected.
6916 	 */
6917 	static const struct hda_pintbl pincfgs[] = {
6918 		{ 0x17, 0x90170121 },
6919 		{ }
6920 	};
6921 	/*
6922 	 * Avoid DAC 0x06 and 0x08, as they have no volume controls.
6923 	 * DAC 0x02 and 0x03 would be fine.
6924 	 */
6925 	static const hda_nid_t conn[] = { 0x02, 0x03 };
6926 	/*
6927 	 * Prefer both speakerbar (0x14) and bass speakers (0x17) connected to DAC 0x02.
6928 	 * Headphones (0x21) are connected to DAC 0x03.
6929 	 */
6930 	static const hda_nid_t preferred_pairs[] = {
6931 		0x14, 0x02,
6932 		0x17, 0x02,
6933 		0x21, 0x03,
6934 		0
6935 	};
6936 	struct alc_spec *spec = codec->spec;
6937 
6938 	switch (action) {
6939 	case HDA_FIXUP_ACT_PRE_PROBE:
6940 		snd_hda_apply_pincfgs(codec, pincfgs);
6941 		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6942 		spec->gen.preferred_dacs = preferred_pairs;
6943 		break;
6944 	}
6945 }
6946 
6947 static void alc295_fixup_dell_inspiron_top_speakers(struct hda_codec *codec,
6948 					  const struct hda_fixup *fix, int action)
6949 {
6950 	static const struct hda_pintbl pincfgs[] = {
6951 		{ 0x14, 0x90170151 },
6952 		{ 0x17, 0x90170150 },
6953 		{ }
6954 	};
6955 	static const hda_nid_t conn[] = { 0x02, 0x03 };
6956 	static const hda_nid_t preferred_pairs[] = {
6957 		0x14, 0x02,
6958 		0x17, 0x03,
6959 		0x21, 0x02,
6960 		0
6961 	};
6962 	struct alc_spec *spec = codec->spec;
6963 
6964 	alc_fixup_no_shutup(codec, fix, action);
6965 
6966 	switch (action) {
6967 	case HDA_FIXUP_ACT_PRE_PROBE:
6968 		snd_hda_apply_pincfgs(codec, pincfgs);
6969 		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6970 		spec->gen.preferred_dacs = preferred_pairs;
6971 		break;
6972 	}
6973 }
6974 
6975 enum {
6976 	ALC269_FIXUP_GPIO2,
6977 	ALC269_FIXUP_SONY_VAIO,
6978 	ALC275_FIXUP_SONY_VAIO_GPIO2,
6979 	ALC269_FIXUP_DELL_M101Z,
6980 	ALC269_FIXUP_SKU_IGNORE,
6981 	ALC269_FIXUP_ASUS_G73JW,
6982 	ALC269_FIXUP_ASUS_N7601ZM_PINS,
6983 	ALC269_FIXUP_ASUS_N7601ZM,
6984 	ALC269_FIXUP_LENOVO_EAPD,
6985 	ALC275_FIXUP_SONY_HWEQ,
6986 	ALC275_FIXUP_SONY_DISABLE_AAMIX,
6987 	ALC271_FIXUP_DMIC,
6988 	ALC269_FIXUP_PCM_44K,
6989 	ALC269_FIXUP_STEREO_DMIC,
6990 	ALC269_FIXUP_HEADSET_MIC,
6991 	ALC269_FIXUP_QUANTA_MUTE,
6992 	ALC269_FIXUP_LIFEBOOK,
6993 	ALC269_FIXUP_LIFEBOOK_EXTMIC,
6994 	ALC269_FIXUP_LIFEBOOK_HP_PIN,
6995 	ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT,
6996 	ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC,
6997 	ALC269_FIXUP_AMIC,
6998 	ALC269_FIXUP_DMIC,
6999 	ALC269VB_FIXUP_AMIC,
7000 	ALC269VB_FIXUP_DMIC,
7001 	ALC269_FIXUP_HP_MUTE_LED,
7002 	ALC269_FIXUP_HP_MUTE_LED_MIC1,
7003 	ALC269_FIXUP_HP_MUTE_LED_MIC2,
7004 	ALC269_FIXUP_HP_MUTE_LED_MIC3,
7005 	ALC269_FIXUP_HP_GPIO_LED,
7006 	ALC269_FIXUP_HP_GPIO_MIC1_LED,
7007 	ALC269_FIXUP_HP_LINE1_MIC1_LED,
7008 	ALC269_FIXUP_INV_DMIC,
7009 	ALC269_FIXUP_LENOVO_DOCK,
7010 	ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST,
7011 	ALC269_FIXUP_NO_SHUTUP,
7012 	ALC286_FIXUP_SONY_MIC_NO_PRESENCE,
7013 	ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
7014 	ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
7015 	ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
7016 	ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
7017 	ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
7018 	ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET,
7019 	ALC269_FIXUP_HEADSET_MODE,
7020 	ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
7021 	ALC269_FIXUP_ASPIRE_HEADSET_MIC,
7022 	ALC269_FIXUP_ASUS_X101_FUNC,
7023 	ALC269_FIXUP_ASUS_X101_VERB,
7024 	ALC269_FIXUP_ASUS_X101,
7025 	ALC271_FIXUP_AMIC_MIC2,
7026 	ALC271_FIXUP_HP_GATE_MIC_JACK,
7027 	ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572,
7028 	ALC269_FIXUP_ACER_AC700,
7029 	ALC269_FIXUP_LIMIT_INT_MIC_BOOST,
7030 	ALC269VB_FIXUP_ASUS_ZENBOOK,
7031 	ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A,
7032 	ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE,
7033 	ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED,
7034 	ALC269VB_FIXUP_ORDISSIMO_EVE2,
7035 	ALC283_FIXUP_CHROME_BOOK,
7036 	ALC283_FIXUP_SENSE_COMBO_JACK,
7037 	ALC282_FIXUP_ASUS_TX300,
7038 	ALC283_FIXUP_INT_MIC,
7039 	ALC290_FIXUP_MONO_SPEAKERS,
7040 	ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
7041 	ALC290_FIXUP_SUBWOOFER,
7042 	ALC290_FIXUP_SUBWOOFER_HSJACK,
7043 	ALC269_FIXUP_THINKPAD_ACPI,
7044 	ALC269_FIXUP_DMIC_THINKPAD_ACPI,
7045 	ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
7046 	ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
7047 	ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7048 	ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
7049 	ALC255_FIXUP_HEADSET_MODE,
7050 	ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,
7051 	ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
7052 	ALC292_FIXUP_TPT440_DOCK,
7053 	ALC292_FIXUP_TPT440,
7054 	ALC283_FIXUP_HEADSET_MIC,
7055 	ALC255_FIXUP_MIC_MUTE_LED,
7056 	ALC282_FIXUP_ASPIRE_V5_PINS,
7057 	ALC269VB_FIXUP_ASPIRE_E1_COEF,
7058 	ALC280_FIXUP_HP_GPIO4,
7059 	ALC286_FIXUP_HP_GPIO_LED,
7060 	ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY,
7061 	ALC280_FIXUP_HP_DOCK_PINS,
7062 	ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED,
7063 	ALC280_FIXUP_HP_9480M,
7064 	ALC245_FIXUP_HP_X360_AMP,
7065 	ALC285_FIXUP_HP_SPECTRE_X360_EB1,
7066 	ALC288_FIXUP_DELL_HEADSET_MODE,
7067 	ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
7068 	ALC288_FIXUP_DELL_XPS_13,
7069 	ALC288_FIXUP_DISABLE_AAMIX,
7070 	ALC292_FIXUP_DELL_E7X_AAMIX,
7071 	ALC292_FIXUP_DELL_E7X,
7072 	ALC292_FIXUP_DISABLE_AAMIX,
7073 	ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK,
7074 	ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
7075 	ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
7076 	ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
7077 	ALC275_FIXUP_DELL_XPS,
7078 	ALC293_FIXUP_LENOVO_SPK_NOISE,
7079 	ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
7080 	ALC255_FIXUP_DELL_SPK_NOISE,
7081 	ALC225_FIXUP_DISABLE_MIC_VREF,
7082 	ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
7083 	ALC295_FIXUP_DISABLE_DAC3,
7084 	ALC285_FIXUP_SPEAKER2_TO_DAC1,
7085 	ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1,
7086 	ALC285_FIXUP_ASUS_HEADSET_MIC,
7087 	ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS,
7088 	ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1,
7089 	ALC285_FIXUP_ASUS_I2C_HEADSET_MIC,
7090 	ALC280_FIXUP_HP_HEADSET_MIC,
7091 	ALC221_FIXUP_HP_FRONT_MIC,
7092 	ALC292_FIXUP_TPT460,
7093 	ALC298_FIXUP_SPK_VOLUME,
7094 	ALC298_FIXUP_LENOVO_SPK_VOLUME,
7095 	ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER,
7096 	ALC269_FIXUP_ATIV_BOOK_8,
7097 	ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE,
7098 	ALC221_FIXUP_HP_MIC_NO_PRESENCE,
7099 	ALC256_FIXUP_ASUS_HEADSET_MODE,
7100 	ALC256_FIXUP_ASUS_MIC,
7101 	ALC256_FIXUP_ASUS_AIO_GPIO2,
7102 	ALC233_FIXUP_ASUS_MIC_NO_PRESENCE,
7103 	ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE,
7104 	ALC233_FIXUP_LENOVO_MULTI_CODECS,
7105 	ALC233_FIXUP_ACER_HEADSET_MIC,
7106 	ALC294_FIXUP_LENOVO_MIC_LOCATION,
7107 	ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE,
7108 	ALC225_FIXUP_S3_POP_NOISE,
7109 	ALC700_FIXUP_INTEL_REFERENCE,
7110 	ALC274_FIXUP_DELL_BIND_DACS,
7111 	ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
7112 	ALC298_FIXUP_TPT470_DOCK_FIX,
7113 	ALC298_FIXUP_TPT470_DOCK,
7114 	ALC255_FIXUP_DUMMY_LINEOUT_VERB,
7115 	ALC255_FIXUP_DELL_HEADSET_MIC,
7116 	ALC256_FIXUP_HUAWEI_MACH_WX9_PINS,
7117 	ALC298_FIXUP_HUAWEI_MBX_STEREO,
7118 	ALC295_FIXUP_HP_X360,
7119 	ALC221_FIXUP_HP_HEADSET_MIC,
7120 	ALC285_FIXUP_LENOVO_HEADPHONE_NOISE,
7121 	ALC295_FIXUP_HP_AUTO_MUTE,
7122 	ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
7123 	ALC294_FIXUP_ASUS_MIC,
7124 	ALC294_FIXUP_ASUS_HEADSET_MIC,
7125 	ALC294_FIXUP_ASUS_SPK,
7126 	ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
7127 	ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
7128 	ALC255_FIXUP_ACER_HEADSET_MIC,
7129 	ALC295_FIXUP_CHROME_BOOK,
7130 	ALC225_FIXUP_HEADSET_JACK,
7131 	ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE,
7132 	ALC225_FIXUP_WYSE_AUTO_MUTE,
7133 	ALC225_FIXUP_WYSE_DISABLE_MIC_VREF,
7134 	ALC286_FIXUP_ACER_AIO_HEADSET_MIC,
7135 	ALC256_FIXUP_ASUS_HEADSET_MIC,
7136 	ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
7137 	ALC299_FIXUP_PREDATOR_SPK,
7138 	ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE,
7139 	ALC289_FIXUP_DELL_SPK2,
7140 	ALC289_FIXUP_DUAL_SPK,
7141 	ALC294_FIXUP_SPK2_TO_DAC1,
7142 	ALC294_FIXUP_ASUS_DUAL_SPK,
7143 	ALC285_FIXUP_THINKPAD_X1_GEN7,
7144 	ALC285_FIXUP_THINKPAD_HEADSET_JACK,
7145 	ALC294_FIXUP_ASUS_ALLY,
7146 	ALC294_FIXUP_ASUS_ALLY_PINS,
7147 	ALC294_FIXUP_ASUS_ALLY_VERBS,
7148 	ALC294_FIXUP_ASUS_ALLY_SPEAKER,
7149 	ALC294_FIXUP_ASUS_HPE,
7150 	ALC294_FIXUP_ASUS_COEF_1B,
7151 	ALC294_FIXUP_ASUS_GX502_HP,
7152 	ALC294_FIXUP_ASUS_GX502_PINS,
7153 	ALC294_FIXUP_ASUS_GX502_VERBS,
7154 	ALC294_FIXUP_ASUS_GU502_HP,
7155 	ALC294_FIXUP_ASUS_GU502_PINS,
7156 	ALC294_FIXUP_ASUS_GU502_VERBS,
7157 	ALC294_FIXUP_ASUS_G513_PINS,
7158 	ALC285_FIXUP_ASUS_G533Z_PINS,
7159 	ALC285_FIXUP_HP_GPIO_LED,
7160 	ALC285_FIXUP_HP_MUTE_LED,
7161 	ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED,
7162 	ALC236_FIXUP_HP_MUTE_LED_COEFBIT2,
7163 	ALC236_FIXUP_HP_GPIO_LED,
7164 	ALC236_FIXUP_HP_MUTE_LED,
7165 	ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,
7166 	ALC298_FIXUP_SAMSUNG_AMP,
7167 	ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
7168 	ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
7169 	ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
7170 	ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS,
7171 	ALC269VC_FIXUP_ACER_HEADSET_MIC,
7172 	ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE,
7173 	ALC289_FIXUP_ASUS_GA401,
7174 	ALC289_FIXUP_ASUS_GA502,
7175 	ALC256_FIXUP_ACER_MIC_NO_PRESENCE,
7176 	ALC285_FIXUP_HP_GPIO_AMP_INIT,
7177 	ALC269_FIXUP_CZC_B20,
7178 	ALC269_FIXUP_CZC_TMI,
7179 	ALC269_FIXUP_CZC_L101,
7180 	ALC269_FIXUP_LEMOTE_A1802,
7181 	ALC269_FIXUP_LEMOTE_A190X,
7182 	ALC256_FIXUP_INTEL_NUC8_RUGGED,
7183 	ALC233_FIXUP_INTEL_NUC8_DMIC,
7184 	ALC233_FIXUP_INTEL_NUC8_BOOST,
7185 	ALC256_FIXUP_INTEL_NUC10,
7186 	ALC255_FIXUP_XIAOMI_HEADSET_MIC,
7187 	ALC274_FIXUP_HP_MIC,
7188 	ALC274_FIXUP_HP_HEADSET_MIC,
7189 	ALC274_FIXUP_HP_ENVY_GPIO,
7190 	ALC256_FIXUP_ASUS_HPE,
7191 	ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
7192 	ALC287_FIXUP_HP_GPIO_LED,
7193 	ALC256_FIXUP_HP_HEADSET_MIC,
7194 	ALC245_FIXUP_HP_GPIO_LED,
7195 	ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
7196 	ALC282_FIXUP_ACER_DISABLE_LINEOUT,
7197 	ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST,
7198 	ALC256_FIXUP_ACER_HEADSET_MIC,
7199 	ALC285_FIXUP_IDEAPAD_S740_COEF,
7200 	ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST,
7201 	ALC295_FIXUP_ASUS_DACS,
7202 	ALC295_FIXUP_HP_OMEN,
7203 	ALC285_FIXUP_HP_SPECTRE_X360,
7204 	ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP,
7205 	ALC623_FIXUP_LENOVO_THINKSTATION_P340,
7206 	ALC255_FIXUP_ACER_HEADPHONE_AND_MIC,
7207 	ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST,
7208 	ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS,
7209 	ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,
7210 	ALC287_FIXUP_YOGA7_14ITL_SPEAKERS,
7211 	ALC298_FIXUP_LENOVO_C940_DUET7,
7212 	ALC287_FIXUP_13S_GEN2_SPEAKERS,
7213 	ALC256_FIXUP_SET_COEF_DEFAULTS,
7214 	ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
7215 	ALC233_FIXUP_NO_AUDIO_JACK,
7216 	ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME,
7217 	ALC285_FIXUP_LEGION_Y9000X_SPEAKERS,
7218 	ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,
7219 	ALC287_FIXUP_LEGION_16ACHG6,
7220 	ALC287_FIXUP_CS35L41_I2C_2,
7221 	ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED,
7222 	ALC245_FIXUP_CS35L41_SPI_2,
7223 	ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED,
7224 	ALC245_FIXUP_CS35L41_SPI_4,
7225 	ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED,
7226 	ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED,
7227 	ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE,
7228 	ALC287_FIXUP_LEGION_16ITHG6,
7229 	ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK,
7230 	ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN,
7231 	ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS,
7232 	ALC236_FIXUP_DELL_DUAL_CODECS,
7233 	ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI,
7234 };
7235 
7236 /* A special fixup for Lenovo C940 and Yoga Duet 7;
7237  * both have the very same PCI SSID, and we need to apply different fixups
7238  * depending on the codec ID
7239  */
7240 static void alc298_fixup_lenovo_c940_duet7(struct hda_codec *codec,
7241 					   const struct hda_fixup *fix,
7242 					   int action)
7243 {
7244 	int id;
7245 
7246 	if (codec->core.vendor_id == 0x10ec0298)
7247 		id = ALC298_FIXUP_LENOVO_SPK_VOLUME; /* C940 */
7248 	else
7249 		id = ALC287_FIXUP_YOGA7_14ITL_SPEAKERS; /* Duet 7 */
7250 	__snd_hda_apply_fixup(codec, id, action, 0);
7251 }
7252 
7253 static const struct hda_fixup alc269_fixups[] = {
7254 	[ALC269_FIXUP_GPIO2] = {
7255 		.type = HDA_FIXUP_FUNC,
7256 		.v.func = alc_fixup_gpio2,
7257 	},
7258 	[ALC269_FIXUP_SONY_VAIO] = {
7259 		.type = HDA_FIXUP_PINCTLS,
7260 		.v.pins = (const struct hda_pintbl[]) {
7261 			{0x19, PIN_VREFGRD},
7262 			{}
7263 		}
7264 	},
7265 	[ALC275_FIXUP_SONY_VAIO_GPIO2] = {
7266 		.type = HDA_FIXUP_FUNC,
7267 		.v.func = alc275_fixup_gpio4_off,
7268 		.chained = true,
7269 		.chain_id = ALC269_FIXUP_SONY_VAIO
7270 	},
7271 	[ALC269_FIXUP_DELL_M101Z] = {
7272 		.type = HDA_FIXUP_VERBS,
7273 		.v.verbs = (const struct hda_verb[]) {
7274 			/* Enables internal speaker */
7275 			{0x20, AC_VERB_SET_COEF_INDEX, 13},
7276 			{0x20, AC_VERB_SET_PROC_COEF, 0x4040},
7277 			{}
7278 		}
7279 	},
7280 	[ALC269_FIXUP_SKU_IGNORE] = {
7281 		.type = HDA_FIXUP_FUNC,
7282 		.v.func = alc_fixup_sku_ignore,
7283 	},
7284 	[ALC269_FIXUP_ASUS_G73JW] = {
7285 		.type = HDA_FIXUP_PINS,
7286 		.v.pins = (const struct hda_pintbl[]) {
7287 			{ 0x17, 0x99130111 }, /* subwoofer */
7288 			{ }
7289 		}
7290 	},
7291 	[ALC269_FIXUP_ASUS_N7601ZM_PINS] = {
7292 		.type = HDA_FIXUP_PINS,
7293 		.v.pins = (const struct hda_pintbl[]) {
7294 			{ 0x19, 0x03A11050 },
7295 			{ 0x1a, 0x03A11C30 },
7296 			{ 0x21, 0x03211420 },
7297 			{ }
7298 		}
7299 	},
7300 	[ALC269_FIXUP_ASUS_N7601ZM] = {
7301 		.type = HDA_FIXUP_VERBS,
7302 		.v.verbs = (const struct hda_verb[]) {
7303 			{0x20, AC_VERB_SET_COEF_INDEX, 0x62},
7304 			{0x20, AC_VERB_SET_PROC_COEF, 0xa007},
7305 			{0x20, AC_VERB_SET_COEF_INDEX, 0x10},
7306 			{0x20, AC_VERB_SET_PROC_COEF, 0x8420},
7307 			{0x20, AC_VERB_SET_COEF_INDEX, 0x0f},
7308 			{0x20, AC_VERB_SET_PROC_COEF, 0x7774},
7309 			{ }
7310 		},
7311 		.chained = true,
7312 		.chain_id = ALC269_FIXUP_ASUS_N7601ZM_PINS,
7313 	},
7314 	[ALC269_FIXUP_LENOVO_EAPD] = {
7315 		.type = HDA_FIXUP_VERBS,
7316 		.v.verbs = (const struct hda_verb[]) {
7317 			{0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
7318 			{}
7319 		}
7320 	},
7321 	[ALC275_FIXUP_SONY_HWEQ] = {
7322 		.type = HDA_FIXUP_FUNC,
7323 		.v.func = alc269_fixup_hweq,
7324 		.chained = true,
7325 		.chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
7326 	},
7327 	[ALC275_FIXUP_SONY_DISABLE_AAMIX] = {
7328 		.type = HDA_FIXUP_FUNC,
7329 		.v.func = alc_fixup_disable_aamix,
7330 		.chained = true,
7331 		.chain_id = ALC269_FIXUP_SONY_VAIO
7332 	},
7333 	[ALC271_FIXUP_DMIC] = {
7334 		.type = HDA_FIXUP_FUNC,
7335 		.v.func = alc271_fixup_dmic,
7336 	},
7337 	[ALC269_FIXUP_PCM_44K] = {
7338 		.type = HDA_FIXUP_FUNC,
7339 		.v.func = alc269_fixup_pcm_44k,
7340 		.chained = true,
7341 		.chain_id = ALC269_FIXUP_QUANTA_MUTE
7342 	},
7343 	[ALC269_FIXUP_STEREO_DMIC] = {
7344 		.type = HDA_FIXUP_FUNC,
7345 		.v.func = alc269_fixup_stereo_dmic,
7346 	},
7347 	[ALC269_FIXUP_HEADSET_MIC] = {
7348 		.type = HDA_FIXUP_FUNC,
7349 		.v.func = alc269_fixup_headset_mic,
7350 	},
7351 	[ALC269_FIXUP_QUANTA_MUTE] = {
7352 		.type = HDA_FIXUP_FUNC,
7353 		.v.func = alc269_fixup_quanta_mute,
7354 	},
7355 	[ALC269_FIXUP_LIFEBOOK] = {
7356 		.type = HDA_FIXUP_PINS,
7357 		.v.pins = (const struct hda_pintbl[]) {
7358 			{ 0x1a, 0x2101103f }, /* dock line-out */
7359 			{ 0x1b, 0x23a11040 }, /* dock mic-in */
7360 			{ }
7361 		},
7362 		.chained = true,
7363 		.chain_id = ALC269_FIXUP_QUANTA_MUTE
7364 	},
7365 	[ALC269_FIXUP_LIFEBOOK_EXTMIC] = {
7366 		.type = HDA_FIXUP_PINS,
7367 		.v.pins = (const struct hda_pintbl[]) {
7368 			{ 0x19, 0x01a1903c }, /* headset mic, with jack detect */
7369 			{ }
7370 		},
7371 	},
7372 	[ALC269_FIXUP_LIFEBOOK_HP_PIN] = {
7373 		.type = HDA_FIXUP_PINS,
7374 		.v.pins = (const struct hda_pintbl[]) {
7375 			{ 0x21, 0x0221102f }, /* HP out */
7376 			{ }
7377 		},
7378 	},
7379 	[ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT] = {
7380 		.type = HDA_FIXUP_FUNC,
7381 		.v.func = alc269_fixup_pincfg_no_hp_to_lineout,
7382 	},
7383 	[ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC] = {
7384 		.type = HDA_FIXUP_FUNC,
7385 		.v.func = alc269_fixup_pincfg_U7x7_headset_mic,
7386 	},
7387 	[ALC269_FIXUP_AMIC] = {
7388 		.type = HDA_FIXUP_PINS,
7389 		.v.pins = (const struct hda_pintbl[]) {
7390 			{ 0x14, 0x99130110 }, /* speaker */
7391 			{ 0x15, 0x0121401f }, /* HP out */
7392 			{ 0x18, 0x01a19c20 }, /* mic */
7393 			{ 0x19, 0x99a3092f }, /* int-mic */
7394 			{ }
7395 		},
7396 	},
7397 	[ALC269_FIXUP_DMIC] = {
7398 		.type = HDA_FIXUP_PINS,
7399 		.v.pins = (const struct hda_pintbl[]) {
7400 			{ 0x12, 0x99a3092f }, /* int-mic */
7401 			{ 0x14, 0x99130110 }, /* speaker */
7402 			{ 0x15, 0x0121401f }, /* HP out */
7403 			{ 0x18, 0x01a19c20 }, /* mic */
7404 			{ }
7405 		},
7406 	},
7407 	[ALC269VB_FIXUP_AMIC] = {
7408 		.type = HDA_FIXUP_PINS,
7409 		.v.pins = (const struct hda_pintbl[]) {
7410 			{ 0x14, 0x99130110 }, /* speaker */
7411 			{ 0x18, 0x01a19c20 }, /* mic */
7412 			{ 0x19, 0x99a3092f }, /* int-mic */
7413 			{ 0x21, 0x0121401f }, /* HP out */
7414 			{ }
7415 		},
7416 	},
7417 	[ALC269VB_FIXUP_DMIC] = {
7418 		.type = HDA_FIXUP_PINS,
7419 		.v.pins = (const struct hda_pintbl[]) {
7420 			{ 0x12, 0x99a3092f }, /* int-mic */
7421 			{ 0x14, 0x99130110 }, /* speaker */
7422 			{ 0x18, 0x01a19c20 }, /* mic */
7423 			{ 0x21, 0x0121401f }, /* HP out */
7424 			{ }
7425 		},
7426 	},
7427 	[ALC269_FIXUP_HP_MUTE_LED] = {
7428 		.type = HDA_FIXUP_FUNC,
7429 		.v.func = alc269_fixup_hp_mute_led,
7430 	},
7431 	[ALC269_FIXUP_HP_MUTE_LED_MIC1] = {
7432 		.type = HDA_FIXUP_FUNC,
7433 		.v.func = alc269_fixup_hp_mute_led_mic1,
7434 	},
7435 	[ALC269_FIXUP_HP_MUTE_LED_MIC2] = {
7436 		.type = HDA_FIXUP_FUNC,
7437 		.v.func = alc269_fixup_hp_mute_led_mic2,
7438 	},
7439 	[ALC269_FIXUP_HP_MUTE_LED_MIC3] = {
7440 		.type = HDA_FIXUP_FUNC,
7441 		.v.func = alc269_fixup_hp_mute_led_mic3,
7442 		.chained = true,
7443 		.chain_id = ALC295_FIXUP_HP_AUTO_MUTE
7444 	},
7445 	[ALC269_FIXUP_HP_GPIO_LED] = {
7446 		.type = HDA_FIXUP_FUNC,
7447 		.v.func = alc269_fixup_hp_gpio_led,
7448 	},
7449 	[ALC269_FIXUP_HP_GPIO_MIC1_LED] = {
7450 		.type = HDA_FIXUP_FUNC,
7451 		.v.func = alc269_fixup_hp_gpio_mic1_led,
7452 	},
7453 	[ALC269_FIXUP_HP_LINE1_MIC1_LED] = {
7454 		.type = HDA_FIXUP_FUNC,
7455 		.v.func = alc269_fixup_hp_line1_mic1_led,
7456 	},
7457 	[ALC269_FIXUP_INV_DMIC] = {
7458 		.type = HDA_FIXUP_FUNC,
7459 		.v.func = alc_fixup_inv_dmic,
7460 	},
7461 	[ALC269_FIXUP_NO_SHUTUP] = {
7462 		.type = HDA_FIXUP_FUNC,
7463 		.v.func = alc_fixup_no_shutup,
7464 	},
7465 	[ALC269_FIXUP_LENOVO_DOCK] = {
7466 		.type = HDA_FIXUP_PINS,
7467 		.v.pins = (const struct hda_pintbl[]) {
7468 			{ 0x19, 0x23a11040 }, /* dock mic */
7469 			{ 0x1b, 0x2121103f }, /* dock headphone */
7470 			{ }
7471 		},
7472 		.chained = true,
7473 		.chain_id = ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT
7474 	},
7475 	[ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST] = {
7476 		.type = HDA_FIXUP_FUNC,
7477 		.v.func = alc269_fixup_limit_int_mic_boost,
7478 		.chained = true,
7479 		.chain_id = ALC269_FIXUP_LENOVO_DOCK,
7480 	},
7481 	[ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT] = {
7482 		.type = HDA_FIXUP_FUNC,
7483 		.v.func = alc269_fixup_pincfg_no_hp_to_lineout,
7484 		.chained = true,
7485 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
7486 	},
7487 	[ALC269_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7488 		.type = HDA_FIXUP_PINS,
7489 		.v.pins = (const struct hda_pintbl[]) {
7490 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7491 			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7492 			{ }
7493 		},
7494 		.chained = true,
7495 		.chain_id = ALC269_FIXUP_HEADSET_MODE
7496 	},
7497 	[ALC269_FIXUP_DELL2_MIC_NO_PRESENCE] = {
7498 		.type = HDA_FIXUP_PINS,
7499 		.v.pins = (const struct hda_pintbl[]) {
7500 			{ 0x16, 0x21014020 }, /* dock line out */
7501 			{ 0x19, 0x21a19030 }, /* dock mic */
7502 			{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7503 			{ }
7504 		},
7505 		.chained = true,
7506 		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7507 	},
7508 	[ALC269_FIXUP_DELL3_MIC_NO_PRESENCE] = {
7509 		.type = HDA_FIXUP_PINS,
7510 		.v.pins = (const struct hda_pintbl[]) {
7511 			{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7512 			{ }
7513 		},
7514 		.chained = true,
7515 		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7516 	},
7517 	[ALC269_FIXUP_DELL4_MIC_NO_PRESENCE] = {
7518 		.type = HDA_FIXUP_PINS,
7519 		.v.pins = (const struct hda_pintbl[]) {
7520 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7521 			{ 0x1b, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7522 			{ }
7523 		},
7524 		.chained = true,
7525 		.chain_id = ALC269_FIXUP_HEADSET_MODE
7526 	},
7527 	[ALC269_FIXUP_HEADSET_MODE] = {
7528 		.type = HDA_FIXUP_FUNC,
7529 		.v.func = alc_fixup_headset_mode,
7530 		.chained = true,
7531 		.chain_id = ALC255_FIXUP_MIC_MUTE_LED
7532 	},
7533 	[ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
7534 		.type = HDA_FIXUP_FUNC,
7535 		.v.func = alc_fixup_headset_mode_no_hp_mic,
7536 	},
7537 	[ALC269_FIXUP_ASPIRE_HEADSET_MIC] = {
7538 		.type = HDA_FIXUP_PINS,
7539 		.v.pins = (const struct hda_pintbl[]) {
7540 			{ 0x19, 0x01a1913c }, /* headset mic w/o jack detect */
7541 			{ }
7542 		},
7543 		.chained = true,
7544 		.chain_id = ALC269_FIXUP_HEADSET_MODE,
7545 	},
7546 	[ALC286_FIXUP_SONY_MIC_NO_PRESENCE] = {
7547 		.type = HDA_FIXUP_PINS,
7548 		.v.pins = (const struct hda_pintbl[]) {
7549 			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7550 			{ }
7551 		},
7552 		.chained = true,
7553 		.chain_id = ALC269_FIXUP_HEADSET_MIC
7554 	},
7555 	[ALC256_FIXUP_HUAWEI_MACH_WX9_PINS] = {
7556 		.type = HDA_FIXUP_PINS,
7557 		.v.pins = (const struct hda_pintbl[]) {
7558 			{0x12, 0x90a60130},
7559 			{0x13, 0x40000000},
7560 			{0x14, 0x90170110},
7561 			{0x18, 0x411111f0},
7562 			{0x19, 0x04a11040},
7563 			{0x1a, 0x411111f0},
7564 			{0x1b, 0x90170112},
7565 			{0x1d, 0x40759a05},
7566 			{0x1e, 0x411111f0},
7567 			{0x21, 0x04211020},
7568 			{ }
7569 		},
7570 		.chained = true,
7571 		.chain_id = ALC255_FIXUP_MIC_MUTE_LED
7572 	},
7573 	[ALC298_FIXUP_HUAWEI_MBX_STEREO] = {
7574 		.type = HDA_FIXUP_FUNC,
7575 		.v.func = alc298_fixup_huawei_mbx_stereo,
7576 		.chained = true,
7577 		.chain_id = ALC255_FIXUP_MIC_MUTE_LED
7578 	},
7579 	[ALC269_FIXUP_ASUS_X101_FUNC] = {
7580 		.type = HDA_FIXUP_FUNC,
7581 		.v.func = alc269_fixup_x101_headset_mic,
7582 	},
7583 	[ALC269_FIXUP_ASUS_X101_VERB] = {
7584 		.type = HDA_FIXUP_VERBS,
7585 		.v.verbs = (const struct hda_verb[]) {
7586 			{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
7587 			{0x20, AC_VERB_SET_COEF_INDEX, 0x08},
7588 			{0x20, AC_VERB_SET_PROC_COEF,  0x0310},
7589 			{ }
7590 		},
7591 		.chained = true,
7592 		.chain_id = ALC269_FIXUP_ASUS_X101_FUNC
7593 	},
7594 	[ALC269_FIXUP_ASUS_X101] = {
7595 		.type = HDA_FIXUP_PINS,
7596 		.v.pins = (const struct hda_pintbl[]) {
7597 			{ 0x18, 0x04a1182c }, /* Headset mic */
7598 			{ }
7599 		},
7600 		.chained = true,
7601 		.chain_id = ALC269_FIXUP_ASUS_X101_VERB
7602 	},
7603 	[ALC271_FIXUP_AMIC_MIC2] = {
7604 		.type = HDA_FIXUP_PINS,
7605 		.v.pins = (const struct hda_pintbl[]) {
7606 			{ 0x14, 0x99130110 }, /* speaker */
7607 			{ 0x19, 0x01a19c20 }, /* mic */
7608 			{ 0x1b, 0x99a7012f }, /* int-mic */
7609 			{ 0x21, 0x0121401f }, /* HP out */
7610 			{ }
7611 		},
7612 	},
7613 	[ALC271_FIXUP_HP_GATE_MIC_JACK] = {
7614 		.type = HDA_FIXUP_FUNC,
7615 		.v.func = alc271_hp_gate_mic_jack,
7616 		.chained = true,
7617 		.chain_id = ALC271_FIXUP_AMIC_MIC2,
7618 	},
7619 	[ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572] = {
7620 		.type = HDA_FIXUP_FUNC,
7621 		.v.func = alc269_fixup_limit_int_mic_boost,
7622 		.chained = true,
7623 		.chain_id = ALC271_FIXUP_HP_GATE_MIC_JACK,
7624 	},
7625 	[ALC269_FIXUP_ACER_AC700] = {
7626 		.type = HDA_FIXUP_PINS,
7627 		.v.pins = (const struct hda_pintbl[]) {
7628 			{ 0x12, 0x99a3092f }, /* int-mic */
7629 			{ 0x14, 0x99130110 }, /* speaker */
7630 			{ 0x18, 0x03a11c20 }, /* mic */
7631 			{ 0x1e, 0x0346101e }, /* SPDIF1 */
7632 			{ 0x21, 0x0321101f }, /* HP out */
7633 			{ }
7634 		},
7635 		.chained = true,
7636 		.chain_id = ALC271_FIXUP_DMIC,
7637 	},
7638 	[ALC269_FIXUP_LIMIT_INT_MIC_BOOST] = {
7639 		.type = HDA_FIXUP_FUNC,
7640 		.v.func = alc269_fixup_limit_int_mic_boost,
7641 		.chained = true,
7642 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
7643 	},
7644 	[ALC269VB_FIXUP_ASUS_ZENBOOK] = {
7645 		.type = HDA_FIXUP_FUNC,
7646 		.v.func = alc269_fixup_limit_int_mic_boost,
7647 		.chained = true,
7648 		.chain_id = ALC269VB_FIXUP_DMIC,
7649 	},
7650 	[ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A] = {
7651 		.type = HDA_FIXUP_VERBS,
7652 		.v.verbs = (const struct hda_verb[]) {
7653 			/* class-D output amp +5dB */
7654 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x12 },
7655 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2800 },
7656 			{}
7657 		},
7658 		.chained = true,
7659 		.chain_id = ALC269VB_FIXUP_ASUS_ZENBOOK,
7660 	},
7661 	[ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7662 		.type = HDA_FIXUP_PINS,
7663 		.v.pins = (const struct hda_pintbl[]) {
7664 			{ 0x18, 0x01a110f0 },  /* use as headset mic */
7665 			{ }
7666 		},
7667 		.chained = true,
7668 		.chain_id = ALC269_FIXUP_HEADSET_MIC
7669 	},
7670 	[ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED] = {
7671 		.type = HDA_FIXUP_FUNC,
7672 		.v.func = alc269_fixup_limit_int_mic_boost,
7673 		.chained = true,
7674 		.chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC1,
7675 	},
7676 	[ALC269VB_FIXUP_ORDISSIMO_EVE2] = {
7677 		.type = HDA_FIXUP_PINS,
7678 		.v.pins = (const struct hda_pintbl[]) {
7679 			{ 0x12, 0x99a3092f }, /* int-mic */
7680 			{ 0x18, 0x03a11d20 }, /* mic */
7681 			{ 0x19, 0x411111f0 }, /* Unused bogus pin */
7682 			{ }
7683 		},
7684 	},
7685 	[ALC283_FIXUP_CHROME_BOOK] = {
7686 		.type = HDA_FIXUP_FUNC,
7687 		.v.func = alc283_fixup_chromebook,
7688 	},
7689 	[ALC283_FIXUP_SENSE_COMBO_JACK] = {
7690 		.type = HDA_FIXUP_FUNC,
7691 		.v.func = alc283_fixup_sense_combo_jack,
7692 		.chained = true,
7693 		.chain_id = ALC283_FIXUP_CHROME_BOOK,
7694 	},
7695 	[ALC282_FIXUP_ASUS_TX300] = {
7696 		.type = HDA_FIXUP_FUNC,
7697 		.v.func = alc282_fixup_asus_tx300,
7698 	},
7699 	[ALC283_FIXUP_INT_MIC] = {
7700 		.type = HDA_FIXUP_VERBS,
7701 		.v.verbs = (const struct hda_verb[]) {
7702 			{0x20, AC_VERB_SET_COEF_INDEX, 0x1a},
7703 			{0x20, AC_VERB_SET_PROC_COEF, 0x0011},
7704 			{ }
7705 		},
7706 		.chained = true,
7707 		.chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
7708 	},
7709 	[ALC290_FIXUP_SUBWOOFER_HSJACK] = {
7710 		.type = HDA_FIXUP_PINS,
7711 		.v.pins = (const struct hda_pintbl[]) {
7712 			{ 0x17, 0x90170112 }, /* subwoofer */
7713 			{ }
7714 		},
7715 		.chained = true,
7716 		.chain_id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
7717 	},
7718 	[ALC290_FIXUP_SUBWOOFER] = {
7719 		.type = HDA_FIXUP_PINS,
7720 		.v.pins = (const struct hda_pintbl[]) {
7721 			{ 0x17, 0x90170112 }, /* subwoofer */
7722 			{ }
7723 		},
7724 		.chained = true,
7725 		.chain_id = ALC290_FIXUP_MONO_SPEAKERS,
7726 	},
7727 	[ALC290_FIXUP_MONO_SPEAKERS] = {
7728 		.type = HDA_FIXUP_FUNC,
7729 		.v.func = alc290_fixup_mono_speakers,
7730 	},
7731 	[ALC290_FIXUP_MONO_SPEAKERS_HSJACK] = {
7732 		.type = HDA_FIXUP_FUNC,
7733 		.v.func = alc290_fixup_mono_speakers,
7734 		.chained = true,
7735 		.chain_id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
7736 	},
7737 	[ALC269_FIXUP_THINKPAD_ACPI] = {
7738 		.type = HDA_FIXUP_FUNC,
7739 		.v.func = alc_fixup_thinkpad_acpi,
7740 		.chained = true,
7741 		.chain_id = ALC269_FIXUP_SKU_IGNORE,
7742 	},
7743 	[ALC269_FIXUP_DMIC_THINKPAD_ACPI] = {
7744 		.type = HDA_FIXUP_FUNC,
7745 		.v.func = alc_fixup_inv_dmic,
7746 		.chained = true,
7747 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
7748 	},
7749 	[ALC255_FIXUP_ACER_MIC_NO_PRESENCE] = {
7750 		.type = HDA_FIXUP_PINS,
7751 		.v.pins = (const struct hda_pintbl[]) {
7752 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7753 			{ }
7754 		},
7755 		.chained = true,
7756 		.chain_id = ALC255_FIXUP_HEADSET_MODE
7757 	},
7758 	[ALC255_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7759 		.type = HDA_FIXUP_PINS,
7760 		.v.pins = (const struct hda_pintbl[]) {
7761 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7762 			{ }
7763 		},
7764 		.chained = true,
7765 		.chain_id = ALC255_FIXUP_HEADSET_MODE
7766 	},
7767 	[ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7768 		.type = HDA_FIXUP_PINS,
7769 		.v.pins = (const struct hda_pintbl[]) {
7770 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7771 			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7772 			{ }
7773 		},
7774 		.chained = true,
7775 		.chain_id = ALC255_FIXUP_HEADSET_MODE
7776 	},
7777 	[ALC255_FIXUP_DELL2_MIC_NO_PRESENCE] = {
7778 		.type = HDA_FIXUP_PINS,
7779 		.v.pins = (const struct hda_pintbl[]) {
7780 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7781 			{ }
7782 		},
7783 		.chained = true,
7784 		.chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
7785 	},
7786 	[ALC255_FIXUP_HEADSET_MODE] = {
7787 		.type = HDA_FIXUP_FUNC,
7788 		.v.func = alc_fixup_headset_mode_alc255,
7789 		.chained = true,
7790 		.chain_id = ALC255_FIXUP_MIC_MUTE_LED
7791 	},
7792 	[ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
7793 		.type = HDA_FIXUP_FUNC,
7794 		.v.func = alc_fixup_headset_mode_alc255_no_hp_mic,
7795 	},
7796 	[ALC293_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7797 		.type = HDA_FIXUP_PINS,
7798 		.v.pins = (const struct hda_pintbl[]) {
7799 			{ 0x18, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7800 			{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7801 			{ }
7802 		},
7803 		.chained = true,
7804 		.chain_id = ALC269_FIXUP_HEADSET_MODE
7805 	},
7806 	[ALC292_FIXUP_TPT440_DOCK] = {
7807 		.type = HDA_FIXUP_FUNC,
7808 		.v.func = alc_fixup_tpt440_dock,
7809 		.chained = true,
7810 		.chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
7811 	},
7812 	[ALC292_FIXUP_TPT440] = {
7813 		.type = HDA_FIXUP_FUNC,
7814 		.v.func = alc_fixup_disable_aamix,
7815 		.chained = true,
7816 		.chain_id = ALC292_FIXUP_TPT440_DOCK,
7817 	},
7818 	[ALC283_FIXUP_HEADSET_MIC] = {
7819 		.type = HDA_FIXUP_PINS,
7820 		.v.pins = (const struct hda_pintbl[]) {
7821 			{ 0x19, 0x04a110f0 },
7822 			{ },
7823 		},
7824 	},
7825 	[ALC255_FIXUP_MIC_MUTE_LED] = {
7826 		.type = HDA_FIXUP_FUNC,
7827 		.v.func = alc_fixup_micmute_led,
7828 	},
7829 	[ALC282_FIXUP_ASPIRE_V5_PINS] = {
7830 		.type = HDA_FIXUP_PINS,
7831 		.v.pins = (const struct hda_pintbl[]) {
7832 			{ 0x12, 0x90a60130 },
7833 			{ 0x14, 0x90170110 },
7834 			{ 0x17, 0x40000008 },
7835 			{ 0x18, 0x411111f0 },
7836 			{ 0x19, 0x01a1913c },
7837 			{ 0x1a, 0x411111f0 },
7838 			{ 0x1b, 0x411111f0 },
7839 			{ 0x1d, 0x40f89b2d },
7840 			{ 0x1e, 0x411111f0 },
7841 			{ 0x21, 0x0321101f },
7842 			{ },
7843 		},
7844 	},
7845 	[ALC269VB_FIXUP_ASPIRE_E1_COEF] = {
7846 		.type = HDA_FIXUP_FUNC,
7847 		.v.func = alc269vb_fixup_aspire_e1_coef,
7848 	},
7849 	[ALC280_FIXUP_HP_GPIO4] = {
7850 		.type = HDA_FIXUP_FUNC,
7851 		.v.func = alc280_fixup_hp_gpio4,
7852 	},
7853 	[ALC286_FIXUP_HP_GPIO_LED] = {
7854 		.type = HDA_FIXUP_FUNC,
7855 		.v.func = alc286_fixup_hp_gpio_led,
7856 	},
7857 	[ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY] = {
7858 		.type = HDA_FIXUP_FUNC,
7859 		.v.func = alc280_fixup_hp_gpio2_mic_hotkey,
7860 	},
7861 	[ALC280_FIXUP_HP_DOCK_PINS] = {
7862 		.type = HDA_FIXUP_PINS,
7863 		.v.pins = (const struct hda_pintbl[]) {
7864 			{ 0x1b, 0x21011020 }, /* line-out */
7865 			{ 0x1a, 0x01a1903c }, /* headset mic */
7866 			{ 0x18, 0x2181103f }, /* line-in */
7867 			{ },
7868 		},
7869 		.chained = true,
7870 		.chain_id = ALC280_FIXUP_HP_GPIO4
7871 	},
7872 	[ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED] = {
7873 		.type = HDA_FIXUP_PINS,
7874 		.v.pins = (const struct hda_pintbl[]) {
7875 			{ 0x1b, 0x21011020 }, /* line-out */
7876 			{ 0x18, 0x2181103f }, /* line-in */
7877 			{ },
7878 		},
7879 		.chained = true,
7880 		.chain_id = ALC269_FIXUP_HP_GPIO_MIC1_LED
7881 	},
7882 	[ALC280_FIXUP_HP_9480M] = {
7883 		.type = HDA_FIXUP_FUNC,
7884 		.v.func = alc280_fixup_hp_9480m,
7885 	},
7886 	[ALC245_FIXUP_HP_X360_AMP] = {
7887 		.type = HDA_FIXUP_FUNC,
7888 		.v.func = alc245_fixup_hp_x360_amp,
7889 		.chained = true,
7890 		.chain_id = ALC245_FIXUP_HP_GPIO_LED
7891 	},
7892 	[ALC288_FIXUP_DELL_HEADSET_MODE] = {
7893 		.type = HDA_FIXUP_FUNC,
7894 		.v.func = alc_fixup_headset_mode_dell_alc288,
7895 		.chained = true,
7896 		.chain_id = ALC255_FIXUP_MIC_MUTE_LED
7897 	},
7898 	[ALC288_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7899 		.type = HDA_FIXUP_PINS,
7900 		.v.pins = (const struct hda_pintbl[]) {
7901 			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7902 			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7903 			{ }
7904 		},
7905 		.chained = true,
7906 		.chain_id = ALC288_FIXUP_DELL_HEADSET_MODE
7907 	},
7908 	[ALC288_FIXUP_DISABLE_AAMIX] = {
7909 		.type = HDA_FIXUP_FUNC,
7910 		.v.func = alc_fixup_disable_aamix,
7911 		.chained = true,
7912 		.chain_id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE
7913 	},
7914 	[ALC288_FIXUP_DELL_XPS_13] = {
7915 		.type = HDA_FIXUP_FUNC,
7916 		.v.func = alc_fixup_dell_xps13,
7917 		.chained = true,
7918 		.chain_id = ALC288_FIXUP_DISABLE_AAMIX
7919 	},
7920 	[ALC292_FIXUP_DISABLE_AAMIX] = {
7921 		.type = HDA_FIXUP_FUNC,
7922 		.v.func = alc_fixup_disable_aamix,
7923 		.chained = true,
7924 		.chain_id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE
7925 	},
7926 	[ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK] = {
7927 		.type = HDA_FIXUP_FUNC,
7928 		.v.func = alc_fixup_disable_aamix,
7929 		.chained = true,
7930 		.chain_id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE
7931 	},
7932 	[ALC292_FIXUP_DELL_E7X_AAMIX] = {
7933 		.type = HDA_FIXUP_FUNC,
7934 		.v.func = alc_fixup_dell_xps13,
7935 		.chained = true,
7936 		.chain_id = ALC292_FIXUP_DISABLE_AAMIX
7937 	},
7938 	[ALC292_FIXUP_DELL_E7X] = {
7939 		.type = HDA_FIXUP_FUNC,
7940 		.v.func = alc_fixup_micmute_led,
7941 		/* micmute fixup must be applied at last */
7942 		.chained_before = true,
7943 		.chain_id = ALC292_FIXUP_DELL_E7X_AAMIX,
7944 	},
7945 	[ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE] = {
7946 		.type = HDA_FIXUP_PINS,
7947 		.v.pins = (const struct hda_pintbl[]) {
7948 			{ 0x18, 0x01a1913c }, /* headset mic w/o jack detect */
7949 			{ }
7950 		},
7951 		.chained_before = true,
7952 		.chain_id = ALC269_FIXUP_HEADSET_MODE,
7953 	},
7954 	[ALC298_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7955 		.type = HDA_FIXUP_PINS,
7956 		.v.pins = (const struct hda_pintbl[]) {
7957 			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7958 			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7959 			{ }
7960 		},
7961 		.chained = true,
7962 		.chain_id = ALC269_FIXUP_HEADSET_MODE
7963 	},
7964 	[ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE] = {
7965 		.type = HDA_FIXUP_PINS,
7966 		.v.pins = (const struct hda_pintbl[]) {
7967 			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7968 			{ }
7969 		},
7970 		.chained = true,
7971 		.chain_id = ALC269_FIXUP_HEADSET_MODE
7972 	},
7973 	[ALC275_FIXUP_DELL_XPS] = {
7974 		.type = HDA_FIXUP_VERBS,
7975 		.v.verbs = (const struct hda_verb[]) {
7976 			/* Enables internal speaker */
7977 			{0x20, AC_VERB_SET_COEF_INDEX, 0x1f},
7978 			{0x20, AC_VERB_SET_PROC_COEF, 0x00c0},
7979 			{0x20, AC_VERB_SET_COEF_INDEX, 0x30},
7980 			{0x20, AC_VERB_SET_PROC_COEF, 0x00b1},
7981 			{}
7982 		}
7983 	},
7984 	[ALC293_FIXUP_LENOVO_SPK_NOISE] = {
7985 		.type = HDA_FIXUP_FUNC,
7986 		.v.func = alc_fixup_disable_aamix,
7987 		.chained = true,
7988 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI
7989 	},
7990 	[ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY] = {
7991 		.type = HDA_FIXUP_FUNC,
7992 		.v.func = alc233_fixup_lenovo_line2_mic_hotkey,
7993 	},
7994 	[ALC233_FIXUP_INTEL_NUC8_DMIC] = {
7995 		.type = HDA_FIXUP_FUNC,
7996 		.v.func = alc_fixup_inv_dmic,
7997 		.chained = true,
7998 		.chain_id = ALC233_FIXUP_INTEL_NUC8_BOOST,
7999 	},
8000 	[ALC233_FIXUP_INTEL_NUC8_BOOST] = {
8001 		.type = HDA_FIXUP_FUNC,
8002 		.v.func = alc269_fixup_limit_int_mic_boost
8003 	},
8004 	[ALC255_FIXUP_DELL_SPK_NOISE] = {
8005 		.type = HDA_FIXUP_FUNC,
8006 		.v.func = alc_fixup_disable_aamix,
8007 		.chained = true,
8008 		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
8009 	},
8010 	[ALC225_FIXUP_DISABLE_MIC_VREF] = {
8011 		.type = HDA_FIXUP_FUNC,
8012 		.v.func = alc_fixup_disable_mic_vref,
8013 		.chained = true,
8014 		.chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
8015 	},
8016 	[ALC225_FIXUP_DELL1_MIC_NO_PRESENCE] = {
8017 		.type = HDA_FIXUP_VERBS,
8018 		.v.verbs = (const struct hda_verb[]) {
8019 			/* Disable pass-through path for FRONT 14h */
8020 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
8021 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
8022 			{}
8023 		},
8024 		.chained = true,
8025 		.chain_id = ALC225_FIXUP_DISABLE_MIC_VREF
8026 	},
8027 	[ALC280_FIXUP_HP_HEADSET_MIC] = {
8028 		.type = HDA_FIXUP_FUNC,
8029 		.v.func = alc_fixup_disable_aamix,
8030 		.chained = true,
8031 		.chain_id = ALC269_FIXUP_HEADSET_MIC,
8032 	},
8033 	[ALC221_FIXUP_HP_FRONT_MIC] = {
8034 		.type = HDA_FIXUP_PINS,
8035 		.v.pins = (const struct hda_pintbl[]) {
8036 			{ 0x19, 0x02a19020 }, /* Front Mic */
8037 			{ }
8038 		},
8039 	},
8040 	[ALC292_FIXUP_TPT460] = {
8041 		.type = HDA_FIXUP_FUNC,
8042 		.v.func = alc_fixup_tpt440_dock,
8043 		.chained = true,
8044 		.chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE,
8045 	},
8046 	[ALC298_FIXUP_SPK_VOLUME] = {
8047 		.type = HDA_FIXUP_FUNC,
8048 		.v.func = alc298_fixup_speaker_volume,
8049 		.chained = true,
8050 		.chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
8051 	},
8052 	[ALC298_FIXUP_LENOVO_SPK_VOLUME] = {
8053 		.type = HDA_FIXUP_FUNC,
8054 		.v.func = alc298_fixup_speaker_volume,
8055 	},
8056 	[ALC295_FIXUP_DISABLE_DAC3] = {
8057 		.type = HDA_FIXUP_FUNC,
8058 		.v.func = alc295_fixup_disable_dac3,
8059 	},
8060 	[ALC285_FIXUP_SPEAKER2_TO_DAC1] = {
8061 		.type = HDA_FIXUP_FUNC,
8062 		.v.func = alc285_fixup_speaker2_to_dac1,
8063 		.chained = true,
8064 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI
8065 	},
8066 	[ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1] = {
8067 		.type = HDA_FIXUP_FUNC,
8068 		.v.func = alc285_fixup_speaker2_to_dac1,
8069 		.chained = true,
8070 		.chain_id = ALC245_FIXUP_CS35L41_SPI_2
8071 	},
8072 	[ALC285_FIXUP_ASUS_HEADSET_MIC] = {
8073 		.type = HDA_FIXUP_PINS,
8074 		.v.pins = (const struct hda_pintbl[]) {
8075 			{ 0x19, 0x03a11050 },
8076 			{ 0x1b, 0x03a11c30 },
8077 			{ }
8078 		},
8079 		.chained = true,
8080 		.chain_id = ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1
8081 	},
8082 	[ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS] = {
8083 		.type = HDA_FIXUP_PINS,
8084 		.v.pins = (const struct hda_pintbl[]) {
8085 			{ 0x14, 0x90170120 },
8086 			{ }
8087 		},
8088 		.chained = true,
8089 		.chain_id = ALC285_FIXUP_ASUS_HEADSET_MIC
8090 	},
8091 	[ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1] = {
8092 		.type = HDA_FIXUP_FUNC,
8093 		.v.func = alc285_fixup_speaker2_to_dac1,
8094 		.chained = true,
8095 		.chain_id = ALC287_FIXUP_CS35L41_I2C_2
8096 	},
8097 	[ALC285_FIXUP_ASUS_I2C_HEADSET_MIC] = {
8098 		.type = HDA_FIXUP_PINS,
8099 		.v.pins = (const struct hda_pintbl[]) {
8100 			{ 0x19, 0x03a11050 },
8101 			{ 0x1b, 0x03a11c30 },
8102 			{ }
8103 		},
8104 		.chained = true,
8105 		.chain_id = ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1
8106 	},
8107 	[ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {
8108 		.type = HDA_FIXUP_PINS,
8109 		.v.pins = (const struct hda_pintbl[]) {
8110 			{ 0x1b, 0x90170151 },
8111 			{ }
8112 		},
8113 		.chained = true,
8114 		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
8115 	},
8116 	[ALC269_FIXUP_ATIV_BOOK_8] = {
8117 		.type = HDA_FIXUP_FUNC,
8118 		.v.func = alc_fixup_auto_mute_via_amp,
8119 		.chained = true,
8120 		.chain_id = ALC269_FIXUP_NO_SHUTUP
8121 	},
8122 	[ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE] = {
8123 		.type = HDA_FIXUP_PINS,
8124 		.v.pins = (const struct hda_pintbl[]) {
8125 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8126 			{ 0x1a, 0x01813030 }, /* use as headphone mic, without its own jack detect */
8127 			{ }
8128 		},
8129 		.chained = true,
8130 		.chain_id = ALC269_FIXUP_HEADSET_MODE
8131 	},
8132 	[ALC221_FIXUP_HP_MIC_NO_PRESENCE] = {
8133 		.type = HDA_FIXUP_PINS,
8134 		.v.pins = (const struct hda_pintbl[]) {
8135 			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8136 			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
8137 			{ }
8138 		},
8139 		.chained = true,
8140 		.chain_id = ALC269_FIXUP_HEADSET_MODE
8141 	},
8142 	[ALC256_FIXUP_ASUS_HEADSET_MODE] = {
8143 		.type = HDA_FIXUP_FUNC,
8144 		.v.func = alc_fixup_headset_mode,
8145 	},
8146 	[ALC256_FIXUP_ASUS_MIC] = {
8147 		.type = HDA_FIXUP_PINS,
8148 		.v.pins = (const struct hda_pintbl[]) {
8149 			{ 0x13, 0x90a60160 }, /* use as internal mic */
8150 			{ 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
8151 			{ }
8152 		},
8153 		.chained = true,
8154 		.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8155 	},
8156 	[ALC256_FIXUP_ASUS_AIO_GPIO2] = {
8157 		.type = HDA_FIXUP_FUNC,
8158 		/* Set up GPIO2 for the speaker amp */
8159 		.v.func = alc_fixup_gpio4,
8160 	},
8161 	[ALC233_FIXUP_ASUS_MIC_NO_PRESENCE] = {
8162 		.type = HDA_FIXUP_PINS,
8163 		.v.pins = (const struct hda_pintbl[]) {
8164 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8165 			{ }
8166 		},
8167 		.chained = true,
8168 		.chain_id = ALC269_FIXUP_HEADSET_MIC
8169 	},
8170 	[ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE] = {
8171 		.type = HDA_FIXUP_VERBS,
8172 		.v.verbs = (const struct hda_verb[]) {
8173 			/* Enables internal speaker */
8174 			{0x20, AC_VERB_SET_COEF_INDEX, 0x40},
8175 			{0x20, AC_VERB_SET_PROC_COEF, 0x8800},
8176 			{}
8177 		},
8178 		.chained = true,
8179 		.chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
8180 	},
8181 	[ALC233_FIXUP_LENOVO_MULTI_CODECS] = {
8182 		.type = HDA_FIXUP_FUNC,
8183 		.v.func = alc233_alc662_fixup_lenovo_dual_codecs,
8184 		.chained = true,
8185 		.chain_id = ALC269_FIXUP_GPIO2
8186 	},
8187 	[ALC233_FIXUP_ACER_HEADSET_MIC] = {
8188 		.type = HDA_FIXUP_VERBS,
8189 		.v.verbs = (const struct hda_verb[]) {
8190 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
8191 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
8192 			{ }
8193 		},
8194 		.chained = true,
8195 		.chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
8196 	},
8197 	[ALC294_FIXUP_LENOVO_MIC_LOCATION] = {
8198 		.type = HDA_FIXUP_PINS,
8199 		.v.pins = (const struct hda_pintbl[]) {
8200 			/* Change the mic location from front to right, otherwise there are
8201 			   two front mics with the same name, pulseaudio can't handle them.
8202 			   This is just a temporary workaround, after applying this fixup,
8203 			   there will be one "Front Mic" and one "Mic" in this machine.
8204 			 */
8205 			{ 0x1a, 0x04a19040 },
8206 			{ }
8207 		},
8208 	},
8209 	[ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE] = {
8210 		.type = HDA_FIXUP_PINS,
8211 		.v.pins = (const struct hda_pintbl[]) {
8212 			{ 0x16, 0x0101102f }, /* Rear Headset HP */
8213 			{ 0x19, 0x02a1913c }, /* use as Front headset mic, without its own jack detect */
8214 			{ 0x1a, 0x01a19030 }, /* Rear Headset MIC */
8215 			{ 0x1b, 0x02011020 },
8216 			{ }
8217 		},
8218 		.chained = true,
8219 		.chain_id = ALC225_FIXUP_S3_POP_NOISE
8220 	},
8221 	[ALC225_FIXUP_S3_POP_NOISE] = {
8222 		.type = HDA_FIXUP_FUNC,
8223 		.v.func = alc225_fixup_s3_pop_noise,
8224 		.chained = true,
8225 		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8226 	},
8227 	[ALC700_FIXUP_INTEL_REFERENCE] = {
8228 		.type = HDA_FIXUP_VERBS,
8229 		.v.verbs = (const struct hda_verb[]) {
8230 			/* Enables internal speaker */
8231 			{0x20, AC_VERB_SET_COEF_INDEX, 0x45},
8232 			{0x20, AC_VERB_SET_PROC_COEF, 0x5289},
8233 			{0x20, AC_VERB_SET_COEF_INDEX, 0x4A},
8234 			{0x20, AC_VERB_SET_PROC_COEF, 0x001b},
8235 			{0x58, AC_VERB_SET_COEF_INDEX, 0x00},
8236 			{0x58, AC_VERB_SET_PROC_COEF, 0x3888},
8237 			{0x20, AC_VERB_SET_COEF_INDEX, 0x6f},
8238 			{0x20, AC_VERB_SET_PROC_COEF, 0x2c0b},
8239 			{}
8240 		}
8241 	},
8242 	[ALC274_FIXUP_DELL_BIND_DACS] = {
8243 		.type = HDA_FIXUP_FUNC,
8244 		.v.func = alc274_fixup_bind_dacs,
8245 		.chained = true,
8246 		.chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
8247 	},
8248 	[ALC274_FIXUP_DELL_AIO_LINEOUT_VERB] = {
8249 		.type = HDA_FIXUP_PINS,
8250 		.v.pins = (const struct hda_pintbl[]) {
8251 			{ 0x1b, 0x0401102f },
8252 			{ }
8253 		},
8254 		.chained = true,
8255 		.chain_id = ALC274_FIXUP_DELL_BIND_DACS
8256 	},
8257 	[ALC298_FIXUP_TPT470_DOCK_FIX] = {
8258 		.type = HDA_FIXUP_FUNC,
8259 		.v.func = alc_fixup_tpt470_dock,
8260 		.chained = true,
8261 		.chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE
8262 	},
8263 	[ALC298_FIXUP_TPT470_DOCK] = {
8264 		.type = HDA_FIXUP_FUNC,
8265 		.v.func = alc_fixup_tpt470_dacs,
8266 		.chained = true,
8267 		.chain_id = ALC298_FIXUP_TPT470_DOCK_FIX
8268 	},
8269 	[ALC255_FIXUP_DUMMY_LINEOUT_VERB] = {
8270 		.type = HDA_FIXUP_PINS,
8271 		.v.pins = (const struct hda_pintbl[]) {
8272 			{ 0x14, 0x0201101f },
8273 			{ }
8274 		},
8275 		.chained = true,
8276 		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
8277 	},
8278 	[ALC255_FIXUP_DELL_HEADSET_MIC] = {
8279 		.type = HDA_FIXUP_PINS,
8280 		.v.pins = (const struct hda_pintbl[]) {
8281 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8282 			{ }
8283 		},
8284 		.chained = true,
8285 		.chain_id = ALC269_FIXUP_HEADSET_MIC
8286 	},
8287 	[ALC295_FIXUP_HP_X360] = {
8288 		.type = HDA_FIXUP_FUNC,
8289 		.v.func = alc295_fixup_hp_top_speakers,
8290 		.chained = true,
8291 		.chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC3
8292 	},
8293 	[ALC221_FIXUP_HP_HEADSET_MIC] = {
8294 		.type = HDA_FIXUP_PINS,
8295 		.v.pins = (const struct hda_pintbl[]) {
8296 			{ 0x19, 0x0181313f},
8297 			{ }
8298 		},
8299 		.chained = true,
8300 		.chain_id = ALC269_FIXUP_HEADSET_MIC
8301 	},
8302 	[ALC285_FIXUP_LENOVO_HEADPHONE_NOISE] = {
8303 		.type = HDA_FIXUP_FUNC,
8304 		.v.func = alc285_fixup_invalidate_dacs,
8305 		.chained = true,
8306 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI
8307 	},
8308 	[ALC295_FIXUP_HP_AUTO_MUTE] = {
8309 		.type = HDA_FIXUP_FUNC,
8310 		.v.func = alc_fixup_auto_mute_via_amp,
8311 	},
8312 	[ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE] = {
8313 		.type = HDA_FIXUP_PINS,
8314 		.v.pins = (const struct hda_pintbl[]) {
8315 			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8316 			{ }
8317 		},
8318 		.chained = true,
8319 		.chain_id = ALC269_FIXUP_HEADSET_MIC
8320 	},
8321 	[ALC294_FIXUP_ASUS_MIC] = {
8322 		.type = HDA_FIXUP_PINS,
8323 		.v.pins = (const struct hda_pintbl[]) {
8324 			{ 0x13, 0x90a60160 }, /* use as internal mic */
8325 			{ 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
8326 			{ }
8327 		},
8328 		.chained = true,
8329 		.chain_id = ALC269_FIXUP_HEADSET_MIC
8330 	},
8331 	[ALC294_FIXUP_ASUS_HEADSET_MIC] = {
8332 		.type = HDA_FIXUP_PINS,
8333 		.v.pins = (const struct hda_pintbl[]) {
8334 			{ 0x19, 0x01a1103c }, /* use as headset mic */
8335 			{ }
8336 		},
8337 		.chained = true,
8338 		.chain_id = ALC269_FIXUP_HEADSET_MIC
8339 	},
8340 	[ALC294_FIXUP_ASUS_SPK] = {
8341 		.type = HDA_FIXUP_VERBS,
8342 		.v.verbs = (const struct hda_verb[]) {
8343 			/* Set EAPD high */
8344 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x40 },
8345 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x8800 },
8346 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
8347 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
8348 			{ }
8349 		},
8350 		.chained = true,
8351 		.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8352 	},
8353 	[ALC295_FIXUP_CHROME_BOOK] = {
8354 		.type = HDA_FIXUP_FUNC,
8355 		.v.func = alc295_fixup_chromebook,
8356 		.chained = true,
8357 		.chain_id = ALC225_FIXUP_HEADSET_JACK
8358 	},
8359 	[ALC225_FIXUP_HEADSET_JACK] = {
8360 		.type = HDA_FIXUP_FUNC,
8361 		.v.func = alc_fixup_headset_jack,
8362 	},
8363 	[ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
8364 		.type = HDA_FIXUP_PINS,
8365 		.v.pins = (const struct hda_pintbl[]) {
8366 			{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8367 			{ }
8368 		},
8369 		.chained = true,
8370 		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8371 	},
8372 	[ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE] = {
8373 		.type = HDA_FIXUP_VERBS,
8374 		.v.verbs = (const struct hda_verb[]) {
8375 			/* Disable PCBEEP-IN passthrough */
8376 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
8377 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
8378 			{ }
8379 		},
8380 		.chained = true,
8381 		.chain_id = ALC285_FIXUP_LENOVO_HEADPHONE_NOISE
8382 	},
8383 	[ALC255_FIXUP_ACER_HEADSET_MIC] = {
8384 		.type = HDA_FIXUP_PINS,
8385 		.v.pins = (const struct hda_pintbl[]) {
8386 			{ 0x19, 0x03a11130 },
8387 			{ 0x1a, 0x90a60140 }, /* use as internal mic */
8388 			{ }
8389 		},
8390 		.chained = true,
8391 		.chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
8392 	},
8393 	[ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE] = {
8394 		.type = HDA_FIXUP_PINS,
8395 		.v.pins = (const struct hda_pintbl[]) {
8396 			{ 0x16, 0x01011020 }, /* Rear Line out */
8397 			{ 0x19, 0x01a1913c }, /* use as Front headset mic, without its own jack detect */
8398 			{ }
8399 		},
8400 		.chained = true,
8401 		.chain_id = ALC225_FIXUP_WYSE_AUTO_MUTE
8402 	},
8403 	[ALC225_FIXUP_WYSE_AUTO_MUTE] = {
8404 		.type = HDA_FIXUP_FUNC,
8405 		.v.func = alc_fixup_auto_mute_via_amp,
8406 		.chained = true,
8407 		.chain_id = ALC225_FIXUP_WYSE_DISABLE_MIC_VREF
8408 	},
8409 	[ALC225_FIXUP_WYSE_DISABLE_MIC_VREF] = {
8410 		.type = HDA_FIXUP_FUNC,
8411 		.v.func = alc_fixup_disable_mic_vref,
8412 		.chained = true,
8413 		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8414 	},
8415 	[ALC286_FIXUP_ACER_AIO_HEADSET_MIC] = {
8416 		.type = HDA_FIXUP_VERBS,
8417 		.v.verbs = (const struct hda_verb[]) {
8418 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x4f },
8419 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x5029 },
8420 			{ }
8421 		},
8422 		.chained = true,
8423 		.chain_id = ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE
8424 	},
8425 	[ALC256_FIXUP_ASUS_HEADSET_MIC] = {
8426 		.type = HDA_FIXUP_PINS,
8427 		.v.pins = (const struct hda_pintbl[]) {
8428 			{ 0x19, 0x03a11020 }, /* headset mic with jack detect */
8429 			{ }
8430 		},
8431 		.chained = true,
8432 		.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8433 	},
8434 	[ALC256_FIXUP_ASUS_MIC_NO_PRESENCE] = {
8435 		.type = HDA_FIXUP_PINS,
8436 		.v.pins = (const struct hda_pintbl[]) {
8437 			{ 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
8438 			{ }
8439 		},
8440 		.chained = true,
8441 		.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8442 	},
8443 	[ALC299_FIXUP_PREDATOR_SPK] = {
8444 		.type = HDA_FIXUP_PINS,
8445 		.v.pins = (const struct hda_pintbl[]) {
8446 			{ 0x21, 0x90170150 }, /* use as headset mic, without its own jack detect */
8447 			{ }
8448 		}
8449 	},
8450 	[ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE] = {
8451 		.type = HDA_FIXUP_PINS,
8452 		.v.pins = (const struct hda_pintbl[]) {
8453 			{ 0x19, 0x04a11040 },
8454 			{ 0x21, 0x04211020 },
8455 			{ }
8456 		},
8457 		.chained = true,
8458 		.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8459 	},
8460 	[ALC289_FIXUP_DELL_SPK2] = {
8461 		.type = HDA_FIXUP_PINS,
8462 		.v.pins = (const struct hda_pintbl[]) {
8463 			{ 0x17, 0x90170130 }, /* bass spk */
8464 			{ }
8465 		},
8466 		.chained = true,
8467 		.chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE
8468 	},
8469 	[ALC289_FIXUP_DUAL_SPK] = {
8470 		.type = HDA_FIXUP_FUNC,
8471 		.v.func = alc285_fixup_speaker2_to_dac1,
8472 		.chained = true,
8473 		.chain_id = ALC289_FIXUP_DELL_SPK2
8474 	},
8475 	[ALC294_FIXUP_SPK2_TO_DAC1] = {
8476 		.type = HDA_FIXUP_FUNC,
8477 		.v.func = alc285_fixup_speaker2_to_dac1,
8478 		.chained = true,
8479 		.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8480 	},
8481 	[ALC294_FIXUP_ASUS_DUAL_SPK] = {
8482 		.type = HDA_FIXUP_FUNC,
8483 		/* The GPIO must be pulled to initialize the AMP */
8484 		.v.func = alc_fixup_gpio4,
8485 		.chained = true,
8486 		.chain_id = ALC294_FIXUP_SPK2_TO_DAC1
8487 	},
8488 	[ALC294_FIXUP_ASUS_ALLY] = {
8489 		.type = HDA_FIXUP_FUNC,
8490 		.v.func = cs35l41_fixup_i2c_two,
8491 		.chained = true,
8492 		.chain_id = ALC294_FIXUP_ASUS_ALLY_PINS
8493 	},
8494 	[ALC294_FIXUP_ASUS_ALLY_PINS] = {
8495 		.type = HDA_FIXUP_PINS,
8496 		.v.pins = (const struct hda_pintbl[]) {
8497 			{ 0x19, 0x03a11050 },
8498 			{ 0x1a, 0x03a11c30 },
8499 			{ 0x21, 0x03211420 },
8500 			{ }
8501 		},
8502 		.chained = true,
8503 		.chain_id = ALC294_FIXUP_ASUS_ALLY_VERBS
8504 	},
8505 	[ALC294_FIXUP_ASUS_ALLY_VERBS] = {
8506 		.type = HDA_FIXUP_VERBS,
8507 		.v.verbs = (const struct hda_verb[]) {
8508 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
8509 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
8510 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x46 },
8511 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0004 },
8512 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x47 },
8513 			{ 0x20, AC_VERB_SET_PROC_COEF, 0xa47a },
8514 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x49 },
8515 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0049},
8516 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x4a },
8517 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x201b },
8518 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x6b },
8519 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x4278},
8520 			{ }
8521 		},
8522 		.chained = true,
8523 		.chain_id = ALC294_FIXUP_ASUS_ALLY_SPEAKER
8524 	},
8525 	[ALC294_FIXUP_ASUS_ALLY_SPEAKER] = {
8526 		.type = HDA_FIXUP_FUNC,
8527 		.v.func = alc285_fixup_speaker2_to_dac1,
8528 	},
8529 	[ALC285_FIXUP_THINKPAD_X1_GEN7] = {
8530 		.type = HDA_FIXUP_FUNC,
8531 		.v.func = alc285_fixup_thinkpad_x1_gen7,
8532 		.chained = true,
8533 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI
8534 	},
8535 	[ALC285_FIXUP_THINKPAD_HEADSET_JACK] = {
8536 		.type = HDA_FIXUP_FUNC,
8537 		.v.func = alc_fixup_headset_jack,
8538 		.chained = true,
8539 		.chain_id = ALC285_FIXUP_THINKPAD_X1_GEN7
8540 	},
8541 	[ALC294_FIXUP_ASUS_HPE] = {
8542 		.type = HDA_FIXUP_VERBS,
8543 		.v.verbs = (const struct hda_verb[]) {
8544 			/* Set EAPD high */
8545 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
8546 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
8547 			{ }
8548 		},
8549 		.chained = true,
8550 		.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8551 	},
8552 	[ALC294_FIXUP_ASUS_GX502_PINS] = {
8553 		.type = HDA_FIXUP_PINS,
8554 		.v.pins = (const struct hda_pintbl[]) {
8555 			{ 0x19, 0x03a11050 }, /* front HP mic */
8556 			{ 0x1a, 0x01a11830 }, /* rear external mic */
8557 			{ 0x21, 0x03211020 }, /* front HP out */
8558 			{ }
8559 		},
8560 		.chained = true,
8561 		.chain_id = ALC294_FIXUP_ASUS_GX502_VERBS
8562 	},
8563 	[ALC294_FIXUP_ASUS_GX502_VERBS] = {
8564 		.type = HDA_FIXUP_VERBS,
8565 		.v.verbs = (const struct hda_verb[]) {
8566 			/* set 0x15 to HP-OUT ctrl */
8567 			{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
8568 			/* unmute the 0x15 amp */
8569 			{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
8570 			{ }
8571 		},
8572 		.chained = true,
8573 		.chain_id = ALC294_FIXUP_ASUS_GX502_HP
8574 	},
8575 	[ALC294_FIXUP_ASUS_GX502_HP] = {
8576 		.type = HDA_FIXUP_FUNC,
8577 		.v.func = alc294_fixup_gx502_hp,
8578 	},
8579 	[ALC294_FIXUP_ASUS_GU502_PINS] = {
8580 		.type = HDA_FIXUP_PINS,
8581 		.v.pins = (const struct hda_pintbl[]) {
8582 			{ 0x19, 0x01a11050 }, /* rear HP mic */
8583 			{ 0x1a, 0x01a11830 }, /* rear external mic */
8584 			{ 0x21, 0x012110f0 }, /* rear HP out */
8585 			{ }
8586 		},
8587 		.chained = true,
8588 		.chain_id = ALC294_FIXUP_ASUS_GU502_VERBS
8589 	},
8590 	[ALC294_FIXUP_ASUS_GU502_VERBS] = {
8591 		.type = HDA_FIXUP_VERBS,
8592 		.v.verbs = (const struct hda_verb[]) {
8593 			/* set 0x15 to HP-OUT ctrl */
8594 			{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
8595 			/* unmute the 0x15 amp */
8596 			{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
8597 			/* set 0x1b to HP-OUT */
8598 			{ 0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
8599 			{ }
8600 		},
8601 		.chained = true,
8602 		.chain_id = ALC294_FIXUP_ASUS_GU502_HP
8603 	},
8604 	[ALC294_FIXUP_ASUS_GU502_HP] = {
8605 		.type = HDA_FIXUP_FUNC,
8606 		.v.func = alc294_fixup_gu502_hp,
8607 	},
8608 	 [ALC294_FIXUP_ASUS_G513_PINS] = {
8609 		.type = HDA_FIXUP_PINS,
8610 		.v.pins = (const struct hda_pintbl[]) {
8611 				{ 0x19, 0x03a11050 }, /* front HP mic */
8612 				{ 0x1a, 0x03a11c30 }, /* rear external mic */
8613 				{ 0x21, 0x03211420 }, /* front HP out */
8614 				{ }
8615 		},
8616 	},
8617 	[ALC285_FIXUP_ASUS_G533Z_PINS] = {
8618 		.type = HDA_FIXUP_PINS,
8619 		.v.pins = (const struct hda_pintbl[]) {
8620 			{ 0x14, 0x90170152 }, /* Speaker Surround Playback Switch */
8621 			{ 0x19, 0x03a19020 }, /* Mic Boost Volume */
8622 			{ 0x1a, 0x03a11c30 }, /* Mic Boost Volume */
8623 			{ 0x1e, 0x90170151 }, /* Rear jack, IN OUT EAPD Detect */
8624 			{ 0x21, 0x03211420 },
8625 			{ }
8626 		},
8627 	},
8628 	[ALC294_FIXUP_ASUS_COEF_1B] = {
8629 		.type = HDA_FIXUP_VERBS,
8630 		.v.verbs = (const struct hda_verb[]) {
8631 			/* Set bit 10 to correct noisy output after reboot from
8632 			 * Windows 10 (due to pop noise reduction?)
8633 			 */
8634 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x1b },
8635 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x4e4b },
8636 			{ }
8637 		},
8638 		.chained = true,
8639 		.chain_id = ALC289_FIXUP_ASUS_GA401,
8640 	},
8641 	[ALC285_FIXUP_HP_GPIO_LED] = {
8642 		.type = HDA_FIXUP_FUNC,
8643 		.v.func = alc285_fixup_hp_gpio_led,
8644 	},
8645 	[ALC285_FIXUP_HP_MUTE_LED] = {
8646 		.type = HDA_FIXUP_FUNC,
8647 		.v.func = alc285_fixup_hp_mute_led,
8648 	},
8649 	[ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED] = {
8650 		.type = HDA_FIXUP_FUNC,
8651 		.v.func = alc285_fixup_hp_spectre_x360_mute_led,
8652 	},
8653 	[ALC236_FIXUP_HP_MUTE_LED_COEFBIT2] = {
8654 	    .type = HDA_FIXUP_FUNC,
8655 	    .v.func = alc236_fixup_hp_mute_led_coefbit2,
8656 	},
8657 	[ALC236_FIXUP_HP_GPIO_LED] = {
8658 		.type = HDA_FIXUP_FUNC,
8659 		.v.func = alc236_fixup_hp_gpio_led,
8660 	},
8661 	[ALC236_FIXUP_HP_MUTE_LED] = {
8662 		.type = HDA_FIXUP_FUNC,
8663 		.v.func = alc236_fixup_hp_mute_led,
8664 	},
8665 	[ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF] = {
8666 		.type = HDA_FIXUP_FUNC,
8667 		.v.func = alc236_fixup_hp_mute_led_micmute_vref,
8668 	},
8669 	[ALC298_FIXUP_SAMSUNG_AMP] = {
8670 		.type = HDA_FIXUP_FUNC,
8671 		.v.func = alc298_fixup_samsung_amp,
8672 		.chained = true,
8673 		.chain_id = ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET
8674 	},
8675 	[ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
8676 		.type = HDA_FIXUP_VERBS,
8677 		.v.verbs = (const struct hda_verb[]) {
8678 			{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc5 },
8679 			{ }
8680 		},
8681 	},
8682 	[ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
8683 		.type = HDA_FIXUP_VERBS,
8684 		.v.verbs = (const struct hda_verb[]) {
8685 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x08},
8686 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2fcf},
8687 			{ }
8688 		},
8689 	},
8690 	[ALC295_FIXUP_ASUS_MIC_NO_PRESENCE] = {
8691 		.type = HDA_FIXUP_PINS,
8692 		.v.pins = (const struct hda_pintbl[]) {
8693 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8694 			{ }
8695 		},
8696 		.chained = true,
8697 		.chain_id = ALC269_FIXUP_HEADSET_MODE
8698 	},
8699 	[ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS] = {
8700 		.type = HDA_FIXUP_PINS,
8701 		.v.pins = (const struct hda_pintbl[]) {
8702 			{ 0x14, 0x90100120 }, /* use as internal speaker */
8703 			{ 0x18, 0x02a111f0 }, /* use as headset mic, without its own jack detect */
8704 			{ 0x1a, 0x01011020 }, /* use as line out */
8705 			{ },
8706 		},
8707 		.chained = true,
8708 		.chain_id = ALC269_FIXUP_HEADSET_MIC
8709 	},
8710 	[ALC269VC_FIXUP_ACER_HEADSET_MIC] = {
8711 		.type = HDA_FIXUP_PINS,
8712 		.v.pins = (const struct hda_pintbl[]) {
8713 			{ 0x18, 0x02a11030 }, /* use as headset mic */
8714 			{ }
8715 		},
8716 		.chained = true,
8717 		.chain_id = ALC269_FIXUP_HEADSET_MIC
8718 	},
8719 	[ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE] = {
8720 		.type = HDA_FIXUP_PINS,
8721 		.v.pins = (const struct hda_pintbl[]) {
8722 			{ 0x18, 0x01a11130 }, /* use as headset mic, without its own jack detect */
8723 			{ }
8724 		},
8725 		.chained = true,
8726 		.chain_id = ALC269_FIXUP_HEADSET_MIC
8727 	},
8728 	[ALC289_FIXUP_ASUS_GA401] = {
8729 		.type = HDA_FIXUP_FUNC,
8730 		.v.func = alc289_fixup_asus_ga401,
8731 		.chained = true,
8732 		.chain_id = ALC289_FIXUP_ASUS_GA502,
8733 	},
8734 	[ALC289_FIXUP_ASUS_GA502] = {
8735 		.type = HDA_FIXUP_PINS,
8736 		.v.pins = (const struct hda_pintbl[]) {
8737 			{ 0x19, 0x03a11020 }, /* headset mic with jack detect */
8738 			{ }
8739 		},
8740 	},
8741 	[ALC256_FIXUP_ACER_MIC_NO_PRESENCE] = {
8742 		.type = HDA_FIXUP_PINS,
8743 		.v.pins = (const struct hda_pintbl[]) {
8744 			{ 0x19, 0x02a11120 }, /* use as headset mic, without its own jack detect */
8745 			{ }
8746 		},
8747 		.chained = true,
8748 		.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8749 	},
8750 	[ALC285_FIXUP_HP_GPIO_AMP_INIT] = {
8751 		.type = HDA_FIXUP_FUNC,
8752 		.v.func = alc285_fixup_hp_gpio_amp_init,
8753 		.chained = true,
8754 		.chain_id = ALC285_FIXUP_HP_GPIO_LED
8755 	},
8756 	[ALC269_FIXUP_CZC_B20] = {
8757 		.type = HDA_FIXUP_PINS,
8758 		.v.pins = (const struct hda_pintbl[]) {
8759 			{ 0x12, 0x411111f0 },
8760 			{ 0x14, 0x90170110 }, /* speaker */
8761 			{ 0x15, 0x032f1020 }, /* HP out */
8762 			{ 0x17, 0x411111f0 },
8763 			{ 0x18, 0x03ab1040 }, /* mic */
8764 			{ 0x19, 0xb7a7013f },
8765 			{ 0x1a, 0x0181305f },
8766 			{ 0x1b, 0x411111f0 },
8767 			{ 0x1d, 0x411111f0 },
8768 			{ 0x1e, 0x411111f0 },
8769 			{ }
8770 		},
8771 		.chain_id = ALC269_FIXUP_DMIC,
8772 	},
8773 	[ALC269_FIXUP_CZC_TMI] = {
8774 		.type = HDA_FIXUP_PINS,
8775 		.v.pins = (const struct hda_pintbl[]) {
8776 			{ 0x12, 0x4000c000 },
8777 			{ 0x14, 0x90170110 }, /* speaker */
8778 			{ 0x15, 0x0421401f }, /* HP out */
8779 			{ 0x17, 0x411111f0 },
8780 			{ 0x18, 0x04a19020 }, /* mic */
8781 			{ 0x19, 0x411111f0 },
8782 			{ 0x1a, 0x411111f0 },
8783 			{ 0x1b, 0x411111f0 },
8784 			{ 0x1d, 0x40448505 },
8785 			{ 0x1e, 0x411111f0 },
8786 			{ 0x20, 0x8000ffff },
8787 			{ }
8788 		},
8789 		.chain_id = ALC269_FIXUP_DMIC,
8790 	},
8791 	[ALC269_FIXUP_CZC_L101] = {
8792 		.type = HDA_FIXUP_PINS,
8793 		.v.pins = (const struct hda_pintbl[]) {
8794 			{ 0x12, 0x40000000 },
8795 			{ 0x14, 0x01014010 }, /* speaker */
8796 			{ 0x15, 0x411111f0 }, /* HP out */
8797 			{ 0x16, 0x411111f0 },
8798 			{ 0x18, 0x01a19020 }, /* mic */
8799 			{ 0x19, 0x02a19021 },
8800 			{ 0x1a, 0x0181302f },
8801 			{ 0x1b, 0x0221401f },
8802 			{ 0x1c, 0x411111f0 },
8803 			{ 0x1d, 0x4044c601 },
8804 			{ 0x1e, 0x411111f0 },
8805 			{ }
8806 		},
8807 		.chain_id = ALC269_FIXUP_DMIC,
8808 	},
8809 	[ALC269_FIXUP_LEMOTE_A1802] = {
8810 		.type = HDA_FIXUP_PINS,
8811 		.v.pins = (const struct hda_pintbl[]) {
8812 			{ 0x12, 0x40000000 },
8813 			{ 0x14, 0x90170110 }, /* speaker */
8814 			{ 0x17, 0x411111f0 },
8815 			{ 0x18, 0x03a19040 }, /* mic1 */
8816 			{ 0x19, 0x90a70130 }, /* mic2 */
8817 			{ 0x1a, 0x411111f0 },
8818 			{ 0x1b, 0x411111f0 },
8819 			{ 0x1d, 0x40489d2d },
8820 			{ 0x1e, 0x411111f0 },
8821 			{ 0x20, 0x0003ffff },
8822 			{ 0x21, 0x03214020 },
8823 			{ }
8824 		},
8825 		.chain_id = ALC269_FIXUP_DMIC,
8826 	},
8827 	[ALC269_FIXUP_LEMOTE_A190X] = {
8828 		.type = HDA_FIXUP_PINS,
8829 		.v.pins = (const struct hda_pintbl[]) {
8830 			{ 0x14, 0x99130110 }, /* speaker */
8831 			{ 0x15, 0x0121401f }, /* HP out */
8832 			{ 0x18, 0x01a19c20 }, /* rear  mic */
8833 			{ 0x19, 0x99a3092f }, /* front mic */
8834 			{ 0x1b, 0x0201401f }, /* front lineout */
8835 			{ }
8836 		},
8837 		.chain_id = ALC269_FIXUP_DMIC,
8838 	},
8839 	[ALC256_FIXUP_INTEL_NUC8_RUGGED] = {
8840 		.type = HDA_FIXUP_PINS,
8841 		.v.pins = (const struct hda_pintbl[]) {
8842 			{ 0x1b, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8843 			{ }
8844 		},
8845 		.chained = true,
8846 		.chain_id = ALC269_FIXUP_HEADSET_MODE
8847 	},
8848 	[ALC256_FIXUP_INTEL_NUC10] = {
8849 		.type = HDA_FIXUP_PINS,
8850 		.v.pins = (const struct hda_pintbl[]) {
8851 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8852 			{ }
8853 		},
8854 		.chained = true,
8855 		.chain_id = ALC269_FIXUP_HEADSET_MODE
8856 	},
8857 	[ALC255_FIXUP_XIAOMI_HEADSET_MIC] = {
8858 		.type = HDA_FIXUP_VERBS,
8859 		.v.verbs = (const struct hda_verb[]) {
8860 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
8861 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
8862 			{ }
8863 		},
8864 		.chained = true,
8865 		.chain_id = ALC289_FIXUP_ASUS_GA502
8866 	},
8867 	[ALC274_FIXUP_HP_MIC] = {
8868 		.type = HDA_FIXUP_VERBS,
8869 		.v.verbs = (const struct hda_verb[]) {
8870 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
8871 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
8872 			{ }
8873 		},
8874 	},
8875 	[ALC274_FIXUP_HP_HEADSET_MIC] = {
8876 		.type = HDA_FIXUP_FUNC,
8877 		.v.func = alc274_fixup_hp_headset_mic,
8878 		.chained = true,
8879 		.chain_id = ALC274_FIXUP_HP_MIC
8880 	},
8881 	[ALC274_FIXUP_HP_ENVY_GPIO] = {
8882 		.type = HDA_FIXUP_FUNC,
8883 		.v.func = alc274_fixup_hp_envy_gpio,
8884 	},
8885 	[ALC256_FIXUP_ASUS_HPE] = {
8886 		.type = HDA_FIXUP_VERBS,
8887 		.v.verbs = (const struct hda_verb[]) {
8888 			/* Set EAPD high */
8889 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
8890 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x7778 },
8891 			{ }
8892 		},
8893 		.chained = true,
8894 		.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8895 	},
8896 	[ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK] = {
8897 		.type = HDA_FIXUP_FUNC,
8898 		.v.func = alc_fixup_headset_jack,
8899 		.chained = true,
8900 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI
8901 	},
8902 	[ALC287_FIXUP_HP_GPIO_LED] = {
8903 		.type = HDA_FIXUP_FUNC,
8904 		.v.func = alc287_fixup_hp_gpio_led,
8905 	},
8906 	[ALC256_FIXUP_HP_HEADSET_MIC] = {
8907 		.type = HDA_FIXUP_FUNC,
8908 		.v.func = alc274_fixup_hp_headset_mic,
8909 	},
8910 	[ALC236_FIXUP_DELL_AIO_HEADSET_MIC] = {
8911 		.type = HDA_FIXUP_FUNC,
8912 		.v.func = alc_fixup_no_int_mic,
8913 		.chained = true,
8914 		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
8915 	},
8916 	[ALC282_FIXUP_ACER_DISABLE_LINEOUT] = {
8917 		.type = HDA_FIXUP_PINS,
8918 		.v.pins = (const struct hda_pintbl[]) {
8919 			{ 0x1b, 0x411111f0 },
8920 			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8921 			{ },
8922 		},
8923 		.chained = true,
8924 		.chain_id = ALC269_FIXUP_HEADSET_MODE
8925 	},
8926 	[ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST] = {
8927 		.type = HDA_FIXUP_FUNC,
8928 		.v.func = alc269_fixup_limit_int_mic_boost,
8929 		.chained = true,
8930 		.chain_id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
8931 	},
8932 	[ALC256_FIXUP_ACER_HEADSET_MIC] = {
8933 		.type = HDA_FIXUP_PINS,
8934 		.v.pins = (const struct hda_pintbl[]) {
8935 			{ 0x19, 0x02a1113c }, /* use as headset mic, without its own jack detect */
8936 			{ 0x1a, 0x90a1092f }, /* use as internal mic */
8937 			{ }
8938 		},
8939 		.chained = true,
8940 		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8941 	},
8942 	[ALC285_FIXUP_IDEAPAD_S740_COEF] = {
8943 		.type = HDA_FIXUP_FUNC,
8944 		.v.func = alc285_fixup_ideapad_s740_coef,
8945 		.chained = true,
8946 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
8947 	},
8948 	[ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST] = {
8949 		.type = HDA_FIXUP_FUNC,
8950 		.v.func = alc269_fixup_limit_int_mic_boost,
8951 		.chained = true,
8952 		.chain_id = ALC285_FIXUP_HP_MUTE_LED,
8953 	},
8954 	[ALC295_FIXUP_ASUS_DACS] = {
8955 		.type = HDA_FIXUP_FUNC,
8956 		.v.func = alc295_fixup_asus_dacs,
8957 	},
8958 	[ALC295_FIXUP_HP_OMEN] = {
8959 		.type = HDA_FIXUP_PINS,
8960 		.v.pins = (const struct hda_pintbl[]) {
8961 			{ 0x12, 0xb7a60130 },
8962 			{ 0x13, 0x40000000 },
8963 			{ 0x14, 0x411111f0 },
8964 			{ 0x16, 0x411111f0 },
8965 			{ 0x17, 0x90170110 },
8966 			{ 0x18, 0x411111f0 },
8967 			{ 0x19, 0x02a11030 },
8968 			{ 0x1a, 0x411111f0 },
8969 			{ 0x1b, 0x04a19030 },
8970 			{ 0x1d, 0x40600001 },
8971 			{ 0x1e, 0x411111f0 },
8972 			{ 0x21, 0x03211020 },
8973 			{}
8974 		},
8975 		.chained = true,
8976 		.chain_id = ALC269_FIXUP_HP_LINE1_MIC1_LED,
8977 	},
8978 	[ALC285_FIXUP_HP_SPECTRE_X360] = {
8979 		.type = HDA_FIXUP_FUNC,
8980 		.v.func = alc285_fixup_hp_spectre_x360,
8981 	},
8982 	[ALC285_FIXUP_HP_SPECTRE_X360_EB1] = {
8983 		.type = HDA_FIXUP_FUNC,
8984 		.v.func = alc285_fixup_hp_spectre_x360_eb1
8985 	},
8986 	[ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP] = {
8987 		.type = HDA_FIXUP_FUNC,
8988 		.v.func = alc285_fixup_ideapad_s740_coef,
8989 		.chained = true,
8990 		.chain_id = ALC285_FIXUP_THINKPAD_HEADSET_JACK,
8991 	},
8992 	[ALC623_FIXUP_LENOVO_THINKSTATION_P340] = {
8993 		.type = HDA_FIXUP_FUNC,
8994 		.v.func = alc_fixup_no_shutup,
8995 		.chained = true,
8996 		.chain_id = ALC283_FIXUP_HEADSET_MIC,
8997 	},
8998 	[ALC255_FIXUP_ACER_HEADPHONE_AND_MIC] = {
8999 		.type = HDA_FIXUP_PINS,
9000 		.v.pins = (const struct hda_pintbl[]) {
9001 			{ 0x21, 0x03211030 }, /* Change the Headphone location to Left */
9002 			{ }
9003 		},
9004 		.chained = true,
9005 		.chain_id = ALC255_FIXUP_XIAOMI_HEADSET_MIC
9006 	},
9007 	[ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST] = {
9008 		.type = HDA_FIXUP_FUNC,
9009 		.v.func = alc269_fixup_limit_int_mic_boost,
9010 		.chained = true,
9011 		.chain_id = ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,
9012 	},
9013 	[ALC285_FIXUP_LEGION_Y9000X_SPEAKERS] = {
9014 		.type = HDA_FIXUP_FUNC,
9015 		.v.func = alc285_fixup_ideapad_s740_coef,
9016 		.chained = true,
9017 		.chain_id = ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,
9018 	},
9019 	[ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE] = {
9020 		.type = HDA_FIXUP_FUNC,
9021 		.v.func = alc287_fixup_legion_15imhg05_speakers,
9022 		.chained = true,
9023 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
9024 	},
9025 	[ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS] = {
9026 		.type = HDA_FIXUP_VERBS,
9027 		//.v.verbs = legion_15imhg05_coefs,
9028 		.v.verbs = (const struct hda_verb[]) {
9029 			 // set left speaker Legion 7i.
9030 			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9031 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
9032 
9033 			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9034 			 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9035 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9036 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
9037 			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9038 
9039 			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9040 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9041 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9042 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9043 			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9044 
9045 			 // set right speaker Legion 7i.
9046 			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9047 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
9048 
9049 			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9050 			 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9051 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9052 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
9053 			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9054 
9055 			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9056 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9057 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9058 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9059 			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9060 			 {}
9061 		},
9062 		.chained = true,
9063 		.chain_id = ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,
9064 	},
9065 	[ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE] = {
9066 		.type = HDA_FIXUP_FUNC,
9067 		.v.func = alc287_fixup_legion_15imhg05_speakers,
9068 		.chained = true,
9069 		.chain_id = ALC269_FIXUP_HEADSET_MODE,
9070 	},
9071 	[ALC287_FIXUP_YOGA7_14ITL_SPEAKERS] = {
9072 		.type = HDA_FIXUP_VERBS,
9073 		.v.verbs = (const struct hda_verb[]) {
9074 			 // set left speaker Yoga 7i.
9075 			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9076 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
9077 
9078 			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9079 			 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9080 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9081 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
9082 			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9083 
9084 			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9085 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9086 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9087 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9088 			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9089 
9090 			 // set right speaker Yoga 7i.
9091 			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9092 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
9093 
9094 			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9095 			 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9096 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9097 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
9098 			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9099 
9100 			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9101 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9102 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9103 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9104 			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9105 			 {}
9106 		},
9107 		.chained = true,
9108 		.chain_id = ALC269_FIXUP_HEADSET_MODE,
9109 	},
9110 	[ALC298_FIXUP_LENOVO_C940_DUET7] = {
9111 		.type = HDA_FIXUP_FUNC,
9112 		.v.func = alc298_fixup_lenovo_c940_duet7,
9113 	},
9114 	[ALC287_FIXUP_13S_GEN2_SPEAKERS] = {
9115 		.type = HDA_FIXUP_VERBS,
9116 		.v.verbs = (const struct hda_verb[]) {
9117 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9118 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
9119 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9120 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9121 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9122 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9123 			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9124 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9125 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
9126 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9127 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9128 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9129 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9130 			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9131 			{}
9132 		},
9133 		.chained = true,
9134 		.chain_id = ALC269_FIXUP_HEADSET_MODE,
9135 	},
9136 	[ALC256_FIXUP_SET_COEF_DEFAULTS] = {
9137 		.type = HDA_FIXUP_FUNC,
9138 		.v.func = alc256_fixup_set_coef_defaults,
9139 	},
9140 	[ALC245_FIXUP_HP_GPIO_LED] = {
9141 		.type = HDA_FIXUP_FUNC,
9142 		.v.func = alc245_fixup_hp_gpio_led,
9143 	},
9144 	[ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
9145 		.type = HDA_FIXUP_PINS,
9146 		.v.pins = (const struct hda_pintbl[]) {
9147 			{ 0x19, 0x03a11120 }, /* use as headset mic, without its own jack detect */
9148 			{ }
9149 		},
9150 		.chained = true,
9151 		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
9152 	},
9153 	[ALC233_FIXUP_NO_AUDIO_JACK] = {
9154 		.type = HDA_FIXUP_FUNC,
9155 		.v.func = alc233_fixup_no_audio_jack,
9156 	},
9157 	[ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME] = {
9158 		.type = HDA_FIXUP_FUNC,
9159 		.v.func = alc256_fixup_mic_no_presence_and_resume,
9160 		.chained = true,
9161 		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
9162 	},
9163 	[ALC287_FIXUP_LEGION_16ACHG6] = {
9164 		.type = HDA_FIXUP_FUNC,
9165 		.v.func = alc287_fixup_legion_16achg6_speakers,
9166 	},
9167 	[ALC287_FIXUP_CS35L41_I2C_2] = {
9168 		.type = HDA_FIXUP_FUNC,
9169 		.v.func = cs35l41_fixup_i2c_two,
9170 	},
9171 	[ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED] = {
9172 		.type = HDA_FIXUP_FUNC,
9173 		.v.func = cs35l41_fixup_i2c_two,
9174 		.chained = true,
9175 		.chain_id = ALC285_FIXUP_HP_MUTE_LED,
9176 	},
9177 	[ALC245_FIXUP_CS35L41_SPI_2] = {
9178 		.type = HDA_FIXUP_FUNC,
9179 		.v.func = cs35l41_fixup_spi_two,
9180 	},
9181 	[ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED] = {
9182 		.type = HDA_FIXUP_FUNC,
9183 		.v.func = cs35l41_fixup_spi_two,
9184 		.chained = true,
9185 		.chain_id = ALC285_FIXUP_HP_GPIO_LED,
9186 	},
9187 	[ALC245_FIXUP_CS35L41_SPI_4] = {
9188 		.type = HDA_FIXUP_FUNC,
9189 		.v.func = cs35l41_fixup_spi_four,
9190 	},
9191 	[ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED] = {
9192 		.type = HDA_FIXUP_FUNC,
9193 		.v.func = cs35l41_fixup_spi_four,
9194 		.chained = true,
9195 		.chain_id = ALC285_FIXUP_HP_GPIO_LED,
9196 	},
9197 	[ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED] = {
9198 		.type = HDA_FIXUP_VERBS,
9199 		.v.verbs = (const struct hda_verb[]) {
9200 			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x19 },
9201 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x8e11 },
9202 			 { }
9203 		},
9204 		.chained = true,
9205 		.chain_id = ALC285_FIXUP_HP_MUTE_LED,
9206 	},
9207 	[ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET] = {
9208 		.type = HDA_FIXUP_FUNC,
9209 		.v.func = alc_fixup_dell4_mic_no_presence_quiet,
9210 		.chained = true,
9211 		.chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
9212 	},
9213 	[ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE] = {
9214 		.type = HDA_FIXUP_PINS,
9215 		.v.pins = (const struct hda_pintbl[]) {
9216 			{ 0x19, 0x02a1112c }, /* use as headset mic, without its own jack detect */
9217 			{ }
9218 		},
9219 		.chained = true,
9220 		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
9221 	},
9222 	[ALC287_FIXUP_LEGION_16ITHG6] = {
9223 		.type = HDA_FIXUP_FUNC,
9224 		.v.func = alc287_fixup_legion_16ithg6_speakers,
9225 	},
9226 	[ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK] = {
9227 		.type = HDA_FIXUP_VERBS,
9228 		.v.verbs = (const struct hda_verb[]) {
9229 			// enable left speaker
9230 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9231 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
9232 
9233 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9234 			{ 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9235 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9236 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
9237 			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9238 
9239 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9240 			{ 0x20, AC_VERB_SET_PROC_COEF, 0xf },
9241 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9242 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
9243 			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9244 
9245 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9246 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x10 },
9247 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9248 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x40 },
9249 			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9250 
9251 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9252 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9253 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9254 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9255 			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9256 
9257 			// enable right speaker
9258 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9259 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
9260 
9261 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9262 			{ 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9263 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9264 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
9265 			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9266 
9267 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9268 			{ 0x20, AC_VERB_SET_PROC_COEF, 0xf },
9269 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9270 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
9271 			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9272 
9273 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9274 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x10 },
9275 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9276 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x44 },
9277 			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9278 
9279 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9280 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9281 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9282 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9283 			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9284 
9285 			{ },
9286 		},
9287 	},
9288 	[ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN] = {
9289 		.type = HDA_FIXUP_FUNC,
9290 		.v.func = alc287_fixup_yoga9_14iap7_bass_spk_pin,
9291 		.chained = true,
9292 		.chain_id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK,
9293 	},
9294 	[ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS] = {
9295 		.type = HDA_FIXUP_FUNC,
9296 		.v.func = alc295_fixup_dell_inspiron_top_speakers,
9297 		.chained = true,
9298 		.chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
9299 	},
9300 	[ALC236_FIXUP_DELL_DUAL_CODECS] = {
9301 		.type = HDA_FIXUP_PINS,
9302 		.v.func = alc1220_fixup_gb_dual_codecs,
9303 		.chained = true,
9304 		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9305 	},
9306 	[ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI] = {
9307 		.type = HDA_FIXUP_FUNC,
9308 		.v.func = cs35l41_fixup_i2c_two,
9309 		.chained = true,
9310 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
9311 	},
9312 };
9313 
9314 static const struct snd_pci_quirk alc269_fixup_tbl[] = {
9315 	SND_PCI_QUIRK(0x1025, 0x0283, "Acer TravelMate 8371", ALC269_FIXUP_INV_DMIC),
9316 	SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC),
9317 	SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC),
9318 	SND_PCI_QUIRK(0x1025, 0x047c, "Acer AC700", ALC269_FIXUP_ACER_AC700),
9319 	SND_PCI_QUIRK(0x1025, 0x072d, "Acer Aspire V5-571G", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
9320 	SND_PCI_QUIRK(0x1025, 0x0740, "Acer AO725", ALC271_FIXUP_HP_GATE_MIC_JACK),
9321 	SND_PCI_QUIRK(0x1025, 0x0742, "Acer AO756", ALC271_FIXUP_HP_GATE_MIC_JACK),
9322 	SND_PCI_QUIRK(0x1025, 0x0762, "Acer Aspire E1-472", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
9323 	SND_PCI_QUIRK(0x1025, 0x0775, "Acer Aspire E1-572", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
9324 	SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS),
9325 	SND_PCI_QUIRK(0x1025, 0x080d, "Acer Aspire V5-122P", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
9326 	SND_PCI_QUIRK(0x1025, 0x0840, "Acer Aspire E1", ALC269VB_FIXUP_ASPIRE_E1_COEF),
9327 	SND_PCI_QUIRK(0x1025, 0x101c, "Acer Veriton N2510G", ALC269_FIXUP_LIFEBOOK),
9328 	SND_PCI_QUIRK(0x1025, 0x102b, "Acer Aspire C24-860", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE),
9329 	SND_PCI_QUIRK(0x1025, 0x1065, "Acer Aspire C20-820", ALC269VC_FIXUP_ACER_HEADSET_MIC),
9330 	SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK),
9331 	SND_PCI_QUIRK(0x1025, 0x1094, "Acer Aspire E5-575T", ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST),
9332 	SND_PCI_QUIRK(0x1025, 0x1099, "Acer Aspire E5-523G", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9333 	SND_PCI_QUIRK(0x1025, 0x110e, "Acer Aspire ES1-432", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9334 	SND_PCI_QUIRK(0x1025, 0x1166, "Acer Veriton N4640G", ALC269_FIXUP_LIFEBOOK),
9335 	SND_PCI_QUIRK(0x1025, 0x1167, "Acer Veriton N6640G", ALC269_FIXUP_LIFEBOOK),
9336 	SND_PCI_QUIRK(0x1025, 0x1246, "Acer Predator Helios 500", ALC299_FIXUP_PREDATOR_SPK),
9337 	SND_PCI_QUIRK(0x1025, 0x1247, "Acer vCopperbox", ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS),
9338 	SND_PCI_QUIRK(0x1025, 0x1248, "Acer Veriton N4660G", ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE),
9339 	SND_PCI_QUIRK(0x1025, 0x1269, "Acer SWIFT SF314-54", ALC256_FIXUP_ACER_HEADSET_MIC),
9340 	SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
9341 	SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
9342 	SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
9343 	SND_PCI_QUIRK(0x1025, 0x129c, "Acer SWIFT SF314-55", ALC256_FIXUP_ACER_HEADSET_MIC),
9344 	SND_PCI_QUIRK(0x1025, 0x129d, "Acer SWIFT SF313-51", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
9345 	SND_PCI_QUIRK(0x1025, 0x1300, "Acer SWIFT SF314-56", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
9346 	SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
9347 	SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", ALC233_FIXUP_ACER_HEADSET_MIC),
9348 	SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC),
9349 	SND_PCI_QUIRK(0x1025, 0x141f, "Acer Spin SP513-54N", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9350 	SND_PCI_QUIRK(0x1025, 0x142b, "Acer Swift SF314-42", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9351 	SND_PCI_QUIRK(0x1025, 0x1430, "Acer TravelMate B311R-31", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
9352 	SND_PCI_QUIRK(0x1025, 0x1466, "Acer Aspire A515-56", ALC255_FIXUP_ACER_HEADPHONE_AND_MIC),
9353 	SND_PCI_QUIRK(0x1025, 0x1534, "Acer Predator PH315-54", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9354 	SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
9355 	SND_PCI_QUIRK(0x1028, 0x053c, "Dell Latitude E5430", ALC292_FIXUP_DELL_E7X),
9356 	SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS),
9357 	SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X),
9358 	SND_PCI_QUIRK(0x1028, 0x05be, "Dell Latitude E6540", ALC292_FIXUP_DELL_E7X),
9359 	SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X),
9360 	SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X),
9361 	SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER),
9362 	SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
9363 	SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
9364 	SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
9365 	SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
9366 	SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
9367 	SND_PCI_QUIRK(0x1028, 0x062c, "Dell Latitude E5550", ALC292_FIXUP_DELL_E7X),
9368 	SND_PCI_QUIRK(0x1028, 0x062e, "Dell Latitude E7450", ALC292_FIXUP_DELL_E7X),
9369 	SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),
9370 	SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9371 	SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9372 	SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13),
9373 	SND_PCI_QUIRK(0x1028, 0x0669, "Dell Optiplex 9020m", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
9374 	SND_PCI_QUIRK(0x1028, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK),
9375 	SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
9376 	SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9377 	SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9378 	SND_PCI_QUIRK(0x1028, 0x06db, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9379 	SND_PCI_QUIRK(0x1028, 0x06dd, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9380 	SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9381 	SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9382 	SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9383 	SND_PCI_QUIRK(0x1028, 0x0706, "Dell Inspiron 7559", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
9384 	SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE),
9385 	SND_PCI_QUIRK(0x1028, 0x0738, "Dell Precision 5820", ALC269_FIXUP_NO_SHUTUP),
9386 	SND_PCI_QUIRK(0x1028, 0x075c, "Dell XPS 27 7760", ALC298_FIXUP_SPK_VOLUME),
9387 	SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME),
9388 	SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
9389 	SND_PCI_QUIRK(0x1028, 0x07b0, "Dell Precision 7520", ALC295_FIXUP_DISABLE_DAC3),
9390 	SND_PCI_QUIRK(0x1028, 0x080c, "Dell WYSE", ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE),
9391 	SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
9392 	SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
9393 	SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
9394 	SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
9395 	SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB),
9396 	SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE),
9397 	SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE),
9398 	SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
9399 	SND_PCI_QUIRK(0x1028, 0x097d, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
9400 	SND_PCI_QUIRK(0x1028, 0x097e, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
9401 	SND_PCI_QUIRK(0x1028, 0x098d, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
9402 	SND_PCI_QUIRK(0x1028, 0x09bf, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
9403 	SND_PCI_QUIRK(0x1028, 0x0a2e, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
9404 	SND_PCI_QUIRK(0x1028, 0x0a30, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
9405 	SND_PCI_QUIRK(0x1028, 0x0a38, "Dell Latitude 7520", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET),
9406 	SND_PCI_QUIRK(0x1028, 0x0a58, "Dell", ALC255_FIXUP_DELL_HEADSET_MIC),
9407 	SND_PCI_QUIRK(0x1028, 0x0a61, "Dell XPS 15 9510", ALC289_FIXUP_DUAL_SPK),
9408 	SND_PCI_QUIRK(0x1028, 0x0a62, "Dell Precision 5560", ALC289_FIXUP_DUAL_SPK),
9409 	SND_PCI_QUIRK(0x1028, 0x0a9d, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
9410 	SND_PCI_QUIRK(0x1028, 0x0a9e, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
9411 	SND_PCI_QUIRK(0x1028, 0x0b19, "Dell XPS 15 9520", ALC289_FIXUP_DUAL_SPK),
9412 	SND_PCI_QUIRK(0x1028, 0x0b1a, "Dell Precision 5570", ALC289_FIXUP_DUAL_SPK),
9413 	SND_PCI_QUIRK(0x1028, 0x0b37, "Dell Inspiron 16 Plus 7620 2-in-1", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS),
9414 	SND_PCI_QUIRK(0x1028, 0x0b71, "Dell Inspiron 16 Plus 7620", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS),
9415 	SND_PCI_QUIRK(0x1028, 0x0c03, "Dell Precision 5340", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
9416 	SND_PCI_QUIRK(0x1028, 0x0c19, "Dell Precision 3340", ALC236_FIXUP_DELL_DUAL_CODECS),
9417 	SND_PCI_QUIRK(0x1028, 0x0c1a, "Dell Precision 3340", ALC236_FIXUP_DELL_DUAL_CODECS),
9418 	SND_PCI_QUIRK(0x1028, 0x0c1b, "Dell Precision 3440", ALC236_FIXUP_DELL_DUAL_CODECS),
9419 	SND_PCI_QUIRK(0x1028, 0x0c1c, "Dell Precision 3540", ALC236_FIXUP_DELL_DUAL_CODECS),
9420 	SND_PCI_QUIRK(0x1028, 0x0c1d, "Dell Precision 3440", ALC236_FIXUP_DELL_DUAL_CODECS),
9421 	SND_PCI_QUIRK(0x1028, 0x0c1e, "Dell Precision 3540", ALC236_FIXUP_DELL_DUAL_CODECS),
9422 	SND_PCI_QUIRK(0x1028, 0x0cbd, "Dell Oasis 13 CS MTL-U", ALC245_FIXUP_CS35L41_SPI_2),
9423 	SND_PCI_QUIRK(0x1028, 0x0cbe, "Dell Oasis 13 2-IN-1 MTL-U", ALC245_FIXUP_CS35L41_SPI_2),
9424 	SND_PCI_QUIRK(0x1028, 0x0cbf, "Dell Oasis 13 Low Weight MTU-L", ALC245_FIXUP_CS35L41_SPI_2),
9425 	SND_PCI_QUIRK(0x1028, 0x0cc1, "Dell Oasis 14 MTL-H/U", ALC287_FIXUP_CS35L41_I2C_2),
9426 	SND_PCI_QUIRK(0x1028, 0x0cc2, "Dell Oasis 14 2-in-1 MTL-H/U", ALC287_FIXUP_CS35L41_I2C_2),
9427 	SND_PCI_QUIRK(0x1028, 0x0cc3, "Dell Oasis 14 Low Weight MTL-U", ALC287_FIXUP_CS35L41_I2C_2),
9428 	SND_PCI_QUIRK(0x1028, 0x0cc4, "Dell Oasis 16 MTL-H/U", ALC287_FIXUP_CS35L41_I2C_2),
9429 	SND_PCI_QUIRK(0x1028, 0x0cc5, "Dell Oasis MLK 14 RPL-P", ALC287_FIXUP_CS35L41_I2C_2),
9430 	SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9431 	SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9432 	SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
9433 	SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),
9434 	SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED),
9435 	SND_PCI_QUIRK(0x103c, 0x21f9, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9436 	SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9437 	SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9438 	SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9439 	SND_PCI_QUIRK(0x103c, 0x221c, "HP EliteBook 755 G2", ALC280_FIXUP_HP_HEADSET_MIC),
9440 	SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9441 	SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9442 	SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9443 	SND_PCI_QUIRK(0x103c, 0x2237, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9444 	SND_PCI_QUIRK(0x103c, 0x2238, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9445 	SND_PCI_QUIRK(0x103c, 0x2239, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9446 	SND_PCI_QUIRK(0x103c, 0x224b, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9447 	SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9448 	SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9449 	SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9450 	SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9451 	SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9452 	SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9453 	SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED),
9454 	SND_PCI_QUIRK(0x103c, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY),
9455 	SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9456 	SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9457 	SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9458 	SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9459 	SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9460 	SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9461 	SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9462 	SND_PCI_QUIRK(0x103c, 0x226e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9463 	SND_PCI_QUIRK(0x103c, 0x2271, "HP", ALC286_FIXUP_HP_GPIO_LED),
9464 	SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9465 	SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC280_FIXUP_HP_DOCK_PINS),
9466 	SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9467 	SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC280_FIXUP_HP_DOCK_PINS),
9468 	SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9469 	SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9470 	SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9471 	SND_PCI_QUIRK(0x103c, 0x228b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9472 	SND_PCI_QUIRK(0x103c, 0x228e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9473 	SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9474 	SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9475 	SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9476 	SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9477 	SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9478 	SND_PCI_QUIRK(0x103c, 0x22c5, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9479 	SND_PCI_QUIRK(0x103c, 0x22c7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9480 	SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9481 	SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9482 	SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC280_FIXUP_HP_9480M),
9483 	SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9484 	SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9485 	SND_PCI_QUIRK(0x103c, 0x2334, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9486 	SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9487 	SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9488 	SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9489 	SND_PCI_QUIRK(0x103c, 0x2b5e, "HP 288 Pro G2 MT", ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE),
9490 	SND_PCI_QUIRK(0x103c, 0x802e, "HP Z240 SFF", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9491 	SND_PCI_QUIRK(0x103c, 0x802f, "HP Z240", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9492 	SND_PCI_QUIRK(0x103c, 0x8077, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
9493 	SND_PCI_QUIRK(0x103c, 0x8158, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
9494 	SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC295_FIXUP_HP_X360),
9495 	SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC),
9496 	SND_PCI_QUIRK(0x103c, 0x827e, "HP x360", ALC295_FIXUP_HP_X360),
9497 	SND_PCI_QUIRK(0x103c, 0x827f, "HP x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9498 	SND_PCI_QUIRK(0x103c, 0x82bf, "HP G3 mini", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9499 	SND_PCI_QUIRK(0x103c, 0x82c0, "HP G3 mini premium", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9500 	SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9501 	SND_PCI_QUIRK(0x103c, 0x841c, "HP Pavilion 15-CK0xx", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9502 	SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9503 	SND_PCI_QUIRK(0x103c, 0x84da, "HP OMEN dc0019-ur", ALC295_FIXUP_HP_OMEN),
9504 	SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9505 	SND_PCI_QUIRK(0x103c, 0x8519, "HP Spectre x360 15-df0xxx", ALC285_FIXUP_HP_SPECTRE_X360),
9506 	SND_PCI_QUIRK(0x103c, 0x860f, "HP ZBook 15 G6", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9507 	SND_PCI_QUIRK(0x103c, 0x861f, "HP Elite Dragonfly G1", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9508 	SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED),
9509 	SND_PCI_QUIRK(0x103c, 0x86c7, "HP Envy AiO 32", ALC274_FIXUP_HP_ENVY_GPIO),
9510 	SND_PCI_QUIRK(0x103c, 0x86e7, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
9511 	SND_PCI_QUIRK(0x103c, 0x86e8, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
9512 	SND_PCI_QUIRK(0x103c, 0x86f9, "HP Spectre x360 13-aw0xxx", ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED),
9513 	SND_PCI_QUIRK(0x103c, 0x8716, "HP Elite Dragonfly G2 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9514 	SND_PCI_QUIRK(0x103c, 0x8720, "HP EliteBook x360 1040 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9515 	SND_PCI_QUIRK(0x103c, 0x8724, "HP EliteBook 850 G7", ALC285_FIXUP_HP_GPIO_LED),
9516 	SND_PCI_QUIRK(0x103c, 0x8728, "HP EliteBook 840 G7", ALC285_FIXUP_HP_GPIO_LED),
9517 	SND_PCI_QUIRK(0x103c, 0x8729, "HP", ALC285_FIXUP_HP_GPIO_LED),
9518 	SND_PCI_QUIRK(0x103c, 0x8730, "HP ProBook 445 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9519 	SND_PCI_QUIRK(0x103c, 0x8735, "HP ProBook 435 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9520 	SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9521 	SND_PCI_QUIRK(0x103c, 0x8760, "HP", ALC285_FIXUP_HP_MUTE_LED),
9522 	SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED),
9523 	SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED),
9524 	SND_PCI_QUIRK(0x103c, 0x8780, "HP ZBook Fury 17 G7 Mobile Workstation",
9525 		      ALC285_FIXUP_HP_GPIO_AMP_INIT),
9526 	SND_PCI_QUIRK(0x103c, 0x8783, "HP ZBook Fury 15 G7 Mobile Workstation",
9527 		      ALC285_FIXUP_HP_GPIO_AMP_INIT),
9528 	SND_PCI_QUIRK(0x103c, 0x8786, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
9529 	SND_PCI_QUIRK(0x103c, 0x8787, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
9530 	SND_PCI_QUIRK(0x103c, 0x8788, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
9531 	SND_PCI_QUIRK(0x103c, 0x87c8, "HP", ALC287_FIXUP_HP_GPIO_LED),
9532 	SND_PCI_QUIRK(0x103c, 0x87e5, "HP ProBook 440 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9533 	SND_PCI_QUIRK(0x103c, 0x87e7, "HP ProBook 450 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9534 	SND_PCI_QUIRK(0x103c, 0x87f1, "HP ProBook 630 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9535 	SND_PCI_QUIRK(0x103c, 0x87f2, "HP ProBook 640 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9536 	SND_PCI_QUIRK(0x103c, 0x87f4, "HP", ALC287_FIXUP_HP_GPIO_LED),
9537 	SND_PCI_QUIRK(0x103c, 0x87f5, "HP", ALC287_FIXUP_HP_GPIO_LED),
9538 	SND_PCI_QUIRK(0x103c, 0x87f6, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
9539 	SND_PCI_QUIRK(0x103c, 0x87f7, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
9540 	SND_PCI_QUIRK(0x103c, 0x8805, "HP ProBook 650 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9541 	SND_PCI_QUIRK(0x103c, 0x880d, "HP EliteBook 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9542 	SND_PCI_QUIRK(0x103c, 0x8811, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
9543 	SND_PCI_QUIRK(0x103c, 0x8812, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
9544 	SND_PCI_QUIRK(0x103c, 0x881d, "HP 250 G8 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
9545 	SND_PCI_QUIRK(0x103c, 0x8846, "HP EliteBook 850 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9546 	SND_PCI_QUIRK(0x103c, 0x8847, "HP EliteBook x360 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9547 	SND_PCI_QUIRK(0x103c, 0x884b, "HP EliteBook 840 Aero G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9548 	SND_PCI_QUIRK(0x103c, 0x884c, "HP EliteBook 840 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9549 	SND_PCI_QUIRK(0x103c, 0x8862, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST),
9550 	SND_PCI_QUIRK(0x103c, 0x8863, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST),
9551 	SND_PCI_QUIRK(0x103c, 0x886d, "HP ZBook Fury 17.3 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9552 	SND_PCI_QUIRK(0x103c, 0x8870, "HP ZBook Fury 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9553 	SND_PCI_QUIRK(0x103c, 0x8873, "HP ZBook Studio 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9554 	SND_PCI_QUIRK(0x103c, 0x887a, "HP Laptop 15s-eq2xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
9555 	SND_PCI_QUIRK(0x103c, 0x888d, "HP ZBook Power 15.6 inch G8 Mobile Workstation PC", ALC236_FIXUP_HP_GPIO_LED),
9556 	SND_PCI_QUIRK(0x103c, 0x8895, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED),
9557 	SND_PCI_QUIRK(0x103c, 0x8896, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_MUTE_LED),
9558 	SND_PCI_QUIRK(0x103c, 0x8898, "HP EliteBook 845 G8 Notebook PC", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),
9559 	SND_PCI_QUIRK(0x103c, 0x88d0, "HP Pavilion 15-eh1xxx (mainboard 88D0)", ALC287_FIXUP_HP_GPIO_LED),
9560 	SND_PCI_QUIRK(0x103c, 0x8902, "HP OMEN 16", ALC285_FIXUP_HP_MUTE_LED),
9561 	SND_PCI_QUIRK(0x103c, 0x8919, "HP Pavilion Aero Laptop 13-be0xxx", ALC287_FIXUP_HP_GPIO_LED),
9562 	SND_PCI_QUIRK(0x103c, 0x896d, "HP ZBook Firefly 16 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9563 	SND_PCI_QUIRK(0x103c, 0x896e, "HP EliteBook x360 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9564 	SND_PCI_QUIRK(0x103c, 0x8971, "HP EliteBook 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9565 	SND_PCI_QUIRK(0x103c, 0x8972, "HP EliteBook 840 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9566 	SND_PCI_QUIRK(0x103c, 0x8973, "HP EliteBook 860 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9567 	SND_PCI_QUIRK(0x103c, 0x8974, "HP EliteBook 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9568 	SND_PCI_QUIRK(0x103c, 0x8975, "HP EliteBook x360 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9569 	SND_PCI_QUIRK(0x103c, 0x8981, "HP Elite Dragonfly G3", ALC245_FIXUP_CS35L41_SPI_4),
9570 	SND_PCI_QUIRK(0x103c, 0x898e, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2),
9571 	SND_PCI_QUIRK(0x103c, 0x898f, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2),
9572 	SND_PCI_QUIRK(0x103c, 0x8991, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9573 	SND_PCI_QUIRK(0x103c, 0x8992, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2),
9574 	SND_PCI_QUIRK(0x103c, 0x8994, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9575 	SND_PCI_QUIRK(0x103c, 0x8995, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2),
9576 	SND_PCI_QUIRK(0x103c, 0x89a4, "HP ProBook 440 G9", ALC236_FIXUP_HP_GPIO_LED),
9577 	SND_PCI_QUIRK(0x103c, 0x89a6, "HP ProBook 450 G9", ALC236_FIXUP_HP_GPIO_LED),
9578 	SND_PCI_QUIRK(0x103c, 0x89aa, "HP EliteBook 630 G9", ALC236_FIXUP_HP_GPIO_LED),
9579 	SND_PCI_QUIRK(0x103c, 0x89ac, "HP EliteBook 640 G9", ALC236_FIXUP_HP_GPIO_LED),
9580 	SND_PCI_QUIRK(0x103c, 0x89ae, "HP EliteBook 650 G9", ALC236_FIXUP_HP_GPIO_LED),
9581 	SND_PCI_QUIRK(0x103c, 0x89c0, "HP ZBook Power 15.6 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9582 	SND_PCI_QUIRK(0x103c, 0x89c3, "Zbook Studio G9", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
9583 	SND_PCI_QUIRK(0x103c, 0x89c6, "Zbook Fury 17 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9584 	SND_PCI_QUIRK(0x103c, 0x89ca, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9585 	SND_PCI_QUIRK(0x103c, 0x89d3, "HP EliteBook 645 G9 (MB 89D2)", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9586 	SND_PCI_QUIRK(0x103c, 0x8a78, "HP Dev One", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),
9587 	SND_PCI_QUIRK(0x103c, 0x8aa0, "HP ProBook 440 G9 (MB 8A9E)", ALC236_FIXUP_HP_GPIO_LED),
9588 	SND_PCI_QUIRK(0x103c, 0x8aa3, "HP ProBook 450 G9 (MB 8AA1)", ALC236_FIXUP_HP_GPIO_LED),
9589 	SND_PCI_QUIRK(0x103c, 0x8aa8, "HP EliteBook 640 G9 (MB 8AA6)", ALC236_FIXUP_HP_GPIO_LED),
9590 	SND_PCI_QUIRK(0x103c, 0x8aab, "HP EliteBook 650 G9 (MB 8AA9)", ALC236_FIXUP_HP_GPIO_LED),
9591 	SND_PCI_QUIRK(0x103c, 0x8abb, "HP ZBook Firefly 14 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9592 	SND_PCI_QUIRK(0x103c, 0x8ad1, "HP EliteBook 840 14 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9593 	SND_PCI_QUIRK(0x103c, 0x8ad2, "HP EliteBook 860 16 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9594 	SND_PCI_QUIRK(0x103c, 0x8b42, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9595 	SND_PCI_QUIRK(0x103c, 0x8b43, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9596 	SND_PCI_QUIRK(0x103c, 0x8b44, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9597 	SND_PCI_QUIRK(0x103c, 0x8b45, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9598 	SND_PCI_QUIRK(0x103c, 0x8b46, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9599 	SND_PCI_QUIRK(0x103c, 0x8b47, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9600 	SND_PCI_QUIRK(0x103c, 0x8b5d, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9601 	SND_PCI_QUIRK(0x103c, 0x8b5e, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9602 	SND_PCI_QUIRK(0x103c, 0x8b63, "HP Elite Dragonfly 13.5 inch G4", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
9603 	SND_PCI_QUIRK(0x103c, 0x8b65, "HP ProBook 455 15.6 inch G10 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9604 	SND_PCI_QUIRK(0x103c, 0x8b66, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9605 	SND_PCI_QUIRK(0x103c, 0x8b70, "HP EliteBook 835 G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9606 	SND_PCI_QUIRK(0x103c, 0x8b72, "HP EliteBook 845 G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9607 	SND_PCI_QUIRK(0x103c, 0x8b74, "HP EliteBook 845W G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9608 	SND_PCI_QUIRK(0x103c, 0x8b77, "HP ElieBook 865 G10", ALC287_FIXUP_CS35L41_I2C_2),
9609 	SND_PCI_QUIRK(0x103c, 0x8b7a, "HP", ALC236_FIXUP_HP_GPIO_LED),
9610 	SND_PCI_QUIRK(0x103c, 0x8b7d, "HP", ALC236_FIXUP_HP_GPIO_LED),
9611 	SND_PCI_QUIRK(0x103c, 0x8b87, "HP", ALC236_FIXUP_HP_GPIO_LED),
9612 	SND_PCI_QUIRK(0x103c, 0x8b8a, "HP", ALC236_FIXUP_HP_GPIO_LED),
9613 	SND_PCI_QUIRK(0x103c, 0x8b8b, "HP", ALC236_FIXUP_HP_GPIO_LED),
9614 	SND_PCI_QUIRK(0x103c, 0x8b8d, "HP", ALC236_FIXUP_HP_GPIO_LED),
9615 	SND_PCI_QUIRK(0x103c, 0x8b8f, "HP", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
9616 	SND_PCI_QUIRK(0x103c, 0x8b92, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9617 	SND_PCI_QUIRK(0x103c, 0x8b96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9618 	SND_PCI_QUIRK(0x103c, 0x8b97, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9619 	SND_PCI_QUIRK(0x103c, 0x8bf0, "HP", ALC236_FIXUP_HP_GPIO_LED),
9620 	SND_PCI_QUIRK(0x103c, 0x8c26, "HP HP EliteBook 800G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9621 	SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
9622 	SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
9623 	SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9624 	SND_PCI_QUIRK(0x1043, 0x10a1, "ASUS UX391UA", ALC294_FIXUP_ASUS_SPK),
9625 	SND_PCI_QUIRK(0x1043, 0x10c0, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
9626 	SND_PCI_QUIRK(0x1043, 0x10d0, "ASUS X540LA/X540LJ", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
9627 	SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9628 	SND_PCI_QUIRK(0x1043, 0x11c0, "ASUS X556UR", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
9629 	SND_PCI_QUIRK(0x1043, 0x125e, "ASUS Q524UQK", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
9630 	SND_PCI_QUIRK(0x1043, 0x1271, "ASUS X430UN", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
9631 	SND_PCI_QUIRK(0x1043, 0x1290, "ASUS X441SA", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
9632 	SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
9633 	SND_PCI_QUIRK(0x1043, 0x12a3, "Asus N7691ZM", ALC269_FIXUP_ASUS_N7601ZM),
9634 	SND_PCI_QUIRK(0x1043, 0x12af, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2),
9635 	SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),
9636 	SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC),
9637 	SND_PCI_QUIRK(0x1043, 0x1313, "Asus K42JZ", ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE),
9638 	SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
9639 	SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
9640 	SND_PCI_QUIRK(0x1043, 0x1433, "ASUS GX650P", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
9641 	SND_PCI_QUIRK(0x1043, 0x1463, "Asus GA402X", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
9642 	SND_PCI_QUIRK(0x1043, 0x1473, "ASUS GU604V", ALC285_FIXUP_ASUS_HEADSET_MIC),
9643 	SND_PCI_QUIRK(0x1043, 0x1483, "ASUS GU603V", ALC285_FIXUP_ASUS_HEADSET_MIC),
9644 	SND_PCI_QUIRK(0x1043, 0x1493, "ASUS GV601V", ALC285_FIXUP_ASUS_HEADSET_MIC),
9645 	SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
9646 	SND_PCI_QUIRK(0x1043, 0x1573, "ASUS GZ301V", ALC285_FIXUP_ASUS_HEADSET_MIC),
9647 	SND_PCI_QUIRK(0x1043, 0x1662, "ASUS GV301QH", ALC294_FIXUP_ASUS_DUAL_SPK),
9648 	SND_PCI_QUIRK(0x1043, 0x1683, "ASUS UM3402YAR", ALC287_FIXUP_CS35L41_I2C_2),
9649 	SND_PCI_QUIRK(0x1043, 0x16b2, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),
9650 	SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
9651 	SND_PCI_QUIRK(0x1043, 0x1740, "ASUS UX430UA", ALC295_FIXUP_ASUS_DACS),
9652 	SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_DUAL_SPK),
9653 	SND_PCI_QUIRK(0x1043, 0x17f3, "ROG Ally RC71L_RC71L", ALC294_FIXUP_ASUS_ALLY),
9654 	SND_PCI_QUIRK(0x1043, 0x1881, "ASUS Zephyrus S/M", ALC294_FIXUP_ASUS_GX502_PINS),
9655 	SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC),
9656 	SND_PCI_QUIRK(0x1043, 0x18f1, "Asus FX505DT", ALC256_FIXUP_ASUS_HEADSET_MIC),
9657 	SND_PCI_QUIRK(0x1043, 0x194e, "ASUS UX563FD", ALC294_FIXUP_ASUS_HPE),
9658 	SND_PCI_QUIRK(0x1043, 0x1970, "ASUS UX550VE", ALC289_FIXUP_ASUS_GA401),
9659 	SND_PCI_QUIRK(0x1043, 0x1982, "ASUS B1400CEPE", ALC256_FIXUP_ASUS_HPE),
9660 	SND_PCI_QUIRK(0x1043, 0x19ce, "ASUS B9450FA", ALC294_FIXUP_ASUS_HPE),
9661 	SND_PCI_QUIRK(0x1043, 0x19e1, "ASUS UX581LV", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE),
9662 	SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
9663 	SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC),
9664 	SND_PCI_QUIRK(0x1043, 0x1a8f, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2),
9665 	SND_PCI_QUIRK(0x1043, 0x1b11, "ASUS UX431DA", ALC294_FIXUP_ASUS_COEF_1B),
9666 	SND_PCI_QUIRK(0x1043, 0x1b13, "Asus U41SV", ALC269_FIXUP_INV_DMIC),
9667 	SND_PCI_QUIRK(0x1043, 0x1b93, "ASUS G614JVR/JIR", ALC245_FIXUP_CS35L41_SPI_2),
9668 	SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
9669 	SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9670 	SND_PCI_QUIRK(0x1043, 0x1c62, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),
9671 	SND_PCI_QUIRK(0x1043, 0x1c92, "ASUS ROG Strix G15", ALC285_FIXUP_ASUS_G533Z_PINS),
9672 	SND_PCI_QUIRK(0x1043, 0x1c9f, "ASUS G614JI", ALC285_FIXUP_ASUS_HEADSET_MIC),
9673 	SND_PCI_QUIRK(0x1043, 0x1caf, "ASUS G634JYR/JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
9674 	SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
9675 	SND_PCI_QUIRK(0x1043, 0x1d1f, "ASUS ROG Strix G17 2023 (G713PV)", ALC287_FIXUP_CS35L41_I2C_2),
9676 	SND_PCI_QUIRK(0x1043, 0x1d42, "ASUS Zephyrus G14 2022", ALC289_FIXUP_ASUS_GA401),
9677 	SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE),
9678 	SND_PCI_QUIRK(0x1043, 0x1e02, "ASUS UX3402", ALC245_FIXUP_CS35L41_SPI_2),
9679 	SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502),
9680 	SND_PCI_QUIRK(0x1043, 0x1e12, "ASUS UM3402", ALC287_FIXUP_CS35L41_I2C_2),
9681 	SND_PCI_QUIRK(0x1043, 0x1e51, "ASUS Zephyrus M15", ALC294_FIXUP_ASUS_GU502_PINS),
9682 	SND_PCI_QUIRK(0x1043, 0x1e5e, "ASUS ROG Strix G513", ALC294_FIXUP_ASUS_G513_PINS),
9683 	SND_PCI_QUIRK(0x1043, 0x1e8e, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA401),
9684 	SND_PCI_QUIRK(0x1043, 0x1c52, "ASUS Zephyrus G15 2022", ALC289_FIXUP_ASUS_GA401),
9685 	SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401),
9686 	SND_PCI_QUIRK(0x1043, 0x1f12, "ASUS UM5302", ALC287_FIXUP_CS35L41_I2C_2),
9687 	SND_PCI_QUIRK(0x1043, 0x1f92, "ASUS ROG Flow X16", ALC289_FIXUP_ASUS_GA401),
9688 	SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
9689 	SND_PCI_QUIRK(0x1043, 0x3a20, "ASUS G614JZR", ALC245_FIXUP_CS35L41_SPI_2),
9690 	SND_PCI_QUIRK(0x1043, 0x3a30, "ASUS G814JVR/JIR", ALC245_FIXUP_CS35L41_SPI_2),
9691 	SND_PCI_QUIRK(0x1043, 0x3a40, "ASUS G814JZR", ALC245_FIXUP_CS35L41_SPI_2),
9692 	SND_PCI_QUIRK(0x1043, 0x3a50, "ASUS G834JYR/JZR", ALC245_FIXUP_CS35L41_SPI_2),
9693 	SND_PCI_QUIRK(0x1043, 0x3a60, "ASUS G634JYR/JZR", ALC245_FIXUP_CS35L41_SPI_2),
9694 	SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
9695 	SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
9696 	SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
9697 	SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
9698 	SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
9699 	SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
9700 	SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
9701 	SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
9702 	SND_PCI_QUIRK(0x104d, 0x9099, "Sony VAIO S13", ALC275_FIXUP_SONY_DISABLE_AAMIX),
9703 	SND_PCI_QUIRK(0x104d, 0x90b5, "Sony VAIO Pro 11", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
9704 	SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
9705 	SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),
9706 	SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT),
9707 	SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN),
9708 	SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC),
9709 	SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN),
9710 	SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),
9711 	SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE),
9712 	SND_PCI_QUIRK(0x10ec, 0x118c, "Medion EE4254 MD62100", ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE),
9713 	SND_PCI_QUIRK(0x10ec, 0x1230, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
9714 	SND_PCI_QUIRK(0x10ec, 0x124c, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
9715 	SND_PCI_QUIRK(0x10ec, 0x1252, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
9716 	SND_PCI_QUIRK(0x10ec, 0x1254, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
9717 	SND_PCI_QUIRK(0x10ec, 0x12cc, "Intel Reference board", ALC225_FIXUP_HEADSET_JACK),
9718 	SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-SZ6", ALC269_FIXUP_HEADSET_MODE),
9719 	SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
9720 	SND_PCI_QUIRK(0x144d, 0xc169, "Samsung Notebook 9 Pen (NP930SBE-K01US)", ALC298_FIXUP_SAMSUNG_AMP),
9721 	SND_PCI_QUIRK(0x144d, 0xc176, "Samsung Notebook 9 Pro (NP930MBE-K04US)", ALC298_FIXUP_SAMSUNG_AMP),
9722 	SND_PCI_QUIRK(0x144d, 0xc189, "Samsung Galaxy Flex Book (NT950QCG-X716)", ALC298_FIXUP_SAMSUNG_AMP),
9723 	SND_PCI_QUIRK(0x144d, 0xc18a, "Samsung Galaxy Book Ion (NP930XCJ-K01US)", ALC298_FIXUP_SAMSUNG_AMP),
9724 	SND_PCI_QUIRK(0x144d, 0xc1a3, "Samsung Galaxy Book Pro (NP935XDB-KC1SE)", ALC298_FIXUP_SAMSUNG_AMP),
9725 	SND_PCI_QUIRK(0x144d, 0xc1a6, "Samsung Galaxy Book Pro 360 (NP930QBD)", ALC298_FIXUP_SAMSUNG_AMP),
9726 	SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
9727 	SND_PCI_QUIRK(0x144d, 0xc812, "Samsung Notebook Pen S (NT950SBE-X58)", ALC298_FIXUP_SAMSUNG_AMP),
9728 	SND_PCI_QUIRK(0x144d, 0xc830, "Samsung Galaxy Book Ion (NT950XCJ-X716A)", ALC298_FIXUP_SAMSUNG_AMP),
9729 	SND_PCI_QUIRK(0x144d, 0xc832, "Samsung Galaxy Book Flex Alpha (NP730QCJ)", ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
9730 	SND_PCI_QUIRK(0x144d, 0xca03, "Samsung Galaxy Book2 Pro 360 (NP930QED)", ALC298_FIXUP_SAMSUNG_AMP),
9731 	SND_PCI_QUIRK(0x144d, 0xc868, "Samsung Galaxy Book2 Pro (NP930XED)", ALC298_FIXUP_SAMSUNG_AMP),
9732 	SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
9733 	SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),
9734 	SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC),
9735 	SND_PCI_QUIRK(0x152d, 0x1082, "Quanta NL3", ALC269_FIXUP_LIFEBOOK),
9736 	SND_PCI_QUIRK(0x1558, 0x1323, "Clevo N130ZU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9737 	SND_PCI_QUIRK(0x1558, 0x1325, "Clevo N15[01][CW]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9738 	SND_PCI_QUIRK(0x1558, 0x1401, "Clevo L140[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9739 	SND_PCI_QUIRK(0x1558, 0x1403, "Clevo N140CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9740 	SND_PCI_QUIRK(0x1558, 0x1404, "Clevo N150CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9741 	SND_PCI_QUIRK(0x1558, 0x14a1, "Clevo L141MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9742 	SND_PCI_QUIRK(0x1558, 0x4018, "Clevo NV40M[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9743 	SND_PCI_QUIRK(0x1558, 0x4019, "Clevo NV40MZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9744 	SND_PCI_QUIRK(0x1558, 0x4020, "Clevo NV40MB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9745 	SND_PCI_QUIRK(0x1558, 0x4041, "Clevo NV4[15]PZ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9746 	SND_PCI_QUIRK(0x1558, 0x40a1, "Clevo NL40GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9747 	SND_PCI_QUIRK(0x1558, 0x40c1, "Clevo NL40[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9748 	SND_PCI_QUIRK(0x1558, 0x40d1, "Clevo NL41DU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9749 	SND_PCI_QUIRK(0x1558, 0x5015, "Clevo NH5[58]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9750 	SND_PCI_QUIRK(0x1558, 0x5017, "Clevo NH7[79]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9751 	SND_PCI_QUIRK(0x1558, 0x50a3, "Clevo NJ51GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9752 	SND_PCI_QUIRK(0x1558, 0x50b3, "Clevo NK50S[BEZ]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9753 	SND_PCI_QUIRK(0x1558, 0x50b6, "Clevo NK50S5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9754 	SND_PCI_QUIRK(0x1558, 0x50b8, "Clevo NK50SZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9755 	SND_PCI_QUIRK(0x1558, 0x50d5, "Clevo NP50D5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9756 	SND_PCI_QUIRK(0x1558, 0x50e1, "Clevo NH5[58]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9757 	SND_PCI_QUIRK(0x1558, 0x50e2, "Clevo NH7[79]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9758 	SND_PCI_QUIRK(0x1558, 0x50f0, "Clevo NH50A[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9759 	SND_PCI_QUIRK(0x1558, 0x50f2, "Clevo NH50E[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9760 	SND_PCI_QUIRK(0x1558, 0x50f3, "Clevo NH58DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9761 	SND_PCI_QUIRK(0x1558, 0x50f5, "Clevo NH55EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9762 	SND_PCI_QUIRK(0x1558, 0x50f6, "Clevo NH55DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9763 	SND_PCI_QUIRK(0x1558, 0x5101, "Clevo S510WU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9764 	SND_PCI_QUIRK(0x1558, 0x5157, "Clevo W517GU1", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9765 	SND_PCI_QUIRK(0x1558, 0x51a1, "Clevo NS50MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9766 	SND_PCI_QUIRK(0x1558, 0x51b1, "Clevo NS50AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9767 	SND_PCI_QUIRK(0x1558, 0x51b3, "Clevo NS70AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9768 	SND_PCI_QUIRK(0x1558, 0x5630, "Clevo NP50RNJS", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9769 	SND_PCI_QUIRK(0x1558, 0x70a1, "Clevo NB70T[HJK]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9770 	SND_PCI_QUIRK(0x1558, 0x70b3, "Clevo NK70SB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9771 	SND_PCI_QUIRK(0x1558, 0x70f2, "Clevo NH79EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9772 	SND_PCI_QUIRK(0x1558, 0x70f3, "Clevo NH77DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9773 	SND_PCI_QUIRK(0x1558, 0x70f4, "Clevo NH77EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9774 	SND_PCI_QUIRK(0x1558, 0x70f6, "Clevo NH77DPQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9775 	SND_PCI_QUIRK(0x1558, 0x7716, "Clevo NS50PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9776 	SND_PCI_QUIRK(0x1558, 0x7717, "Clevo NS70PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9777 	SND_PCI_QUIRK(0x1558, 0x7718, "Clevo L140PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9778 	SND_PCI_QUIRK(0x1558, 0x7724, "Clevo L140AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9779 	SND_PCI_QUIRK(0x1558, 0x8228, "Clevo NR40BU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9780 	SND_PCI_QUIRK(0x1558, 0x8520, "Clevo NH50D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9781 	SND_PCI_QUIRK(0x1558, 0x8521, "Clevo NH77D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9782 	SND_PCI_QUIRK(0x1558, 0x8535, "Clevo NH50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9783 	SND_PCI_QUIRK(0x1558, 0x8536, "Clevo NH79D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9784 	SND_PCI_QUIRK(0x1558, 0x8550, "Clevo NH[57][0-9][ER][ACDH]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9785 	SND_PCI_QUIRK(0x1558, 0x8551, "Clevo NH[57][0-9][ER][ACDH]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9786 	SND_PCI_QUIRK(0x1558, 0x8560, "Clevo NH[57][0-9][ER][ACDH]Q", ALC269_FIXUP_HEADSET_MIC),
9787 	SND_PCI_QUIRK(0x1558, 0x8561, "Clevo NH[57][0-9][ER][ACDH]Q", ALC269_FIXUP_HEADSET_MIC),
9788 	SND_PCI_QUIRK(0x1558, 0x8562, "Clevo NH[57][0-9]RZ[Q]", ALC269_FIXUP_DMIC),
9789 	SND_PCI_QUIRK(0x1558, 0x8668, "Clevo NP50B[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9790 	SND_PCI_QUIRK(0x1558, 0x866d, "Clevo NP5[05]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9791 	SND_PCI_QUIRK(0x1558, 0x867c, "Clevo NP7[01]PNP", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9792 	SND_PCI_QUIRK(0x1558, 0x867d, "Clevo NP7[01]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9793 	SND_PCI_QUIRK(0x1558, 0x8680, "Clevo NJ50LU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9794 	SND_PCI_QUIRK(0x1558, 0x8686, "Clevo NH50[CZ]U", ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME),
9795 	SND_PCI_QUIRK(0x1558, 0x8a20, "Clevo NH55DCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9796 	SND_PCI_QUIRK(0x1558, 0x8a51, "Clevo NH70RCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9797 	SND_PCI_QUIRK(0x1558, 0x8d50, "Clevo NH55RCQ-M", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9798 	SND_PCI_QUIRK(0x1558, 0x951d, "Clevo N950T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9799 	SND_PCI_QUIRK(0x1558, 0x9600, "Clevo N960K[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9800 	SND_PCI_QUIRK(0x1558, 0x961d, "Clevo N960S[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9801 	SND_PCI_QUIRK(0x1558, 0x971d, "Clevo N970T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9802 	SND_PCI_QUIRK(0x1558, 0xa500, "Clevo NL5[03]RU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9803 	SND_PCI_QUIRK(0x1558, 0xa600, "Clevo NL50NU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9804 	SND_PCI_QUIRK(0x1558, 0xa650, "Clevo NP[567]0SN[CD]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9805 	SND_PCI_QUIRK(0x1558, 0xa671, "Clevo NP70SN[CDE]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9806 	SND_PCI_QUIRK(0x1558, 0xb018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9807 	SND_PCI_QUIRK(0x1558, 0xb019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9808 	SND_PCI_QUIRK(0x1558, 0xb022, "Clevo NH77D[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9809 	SND_PCI_QUIRK(0x1558, 0xc018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9810 	SND_PCI_QUIRK(0x1558, 0xc019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9811 	SND_PCI_QUIRK(0x1558, 0xc022, "Clevo NH77[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9812 	SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
9813 	SND_PCI_QUIRK(0x17aa, 0x1048, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),
9814 	SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
9815 	SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
9816 	SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
9817 	SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
9818 	SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
9819 	SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),
9820 	SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST),
9821 	SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK),
9822 	SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),
9823 	SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK),
9824 	SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK),
9825 	SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440),
9826 	SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK),
9827 	SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK),
9828 	SND_PCI_QUIRK(0x17aa, 0x2211, "Thinkpad W541", ALC292_FIXUP_TPT440_DOCK),
9829 	SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK),
9830 	SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK),
9831 	SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9832 	SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK),
9833 	SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK),
9834 	SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK),
9835 	SND_PCI_QUIRK(0x17aa, 0x222d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9836 	SND_PCI_QUIRK(0x17aa, 0x222e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9837 	SND_PCI_QUIRK(0x17aa, 0x2231, "Thinkpad T560", ALC292_FIXUP_TPT460),
9838 	SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460),
9839 	SND_PCI_QUIRK(0x17aa, 0x2245, "Thinkpad T470", ALC298_FIXUP_TPT470_DOCK),
9840 	SND_PCI_QUIRK(0x17aa, 0x2246, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9841 	SND_PCI_QUIRK(0x17aa, 0x2247, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9842 	SND_PCI_QUIRK(0x17aa, 0x2249, "Thinkpad", ALC292_FIXUP_TPT460),
9843 	SND_PCI_QUIRK(0x17aa, 0x224b, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9844 	SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9845 	SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9846 	SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9847 	SND_PCI_QUIRK(0x17aa, 0x2292, "Thinkpad X1 Carbon 7th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
9848 	SND_PCI_QUIRK(0x17aa, 0x22be, "Thinkpad X1 Carbon 8th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
9849 	SND_PCI_QUIRK(0x17aa, 0x22c1, "Thinkpad P1 Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
9850 	SND_PCI_QUIRK(0x17aa, 0x22c2, "Thinkpad X1 Extreme Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
9851 	SND_PCI_QUIRK(0x17aa, 0x22f1, "Thinkpad", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI),
9852 	SND_PCI_QUIRK(0x17aa, 0x22f2, "Thinkpad", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI),
9853 	SND_PCI_QUIRK(0x17aa, 0x22f3, "Thinkpad", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI),
9854 	SND_PCI_QUIRK(0x17aa, 0x2316, "Thinkpad P1 Gen 6", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI),
9855 	SND_PCI_QUIRK(0x17aa, 0x2317, "Thinkpad P1 Gen 6", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI),
9856 	SND_PCI_QUIRK(0x17aa, 0x2318, "Thinkpad Z13 Gen2", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI),
9857 	SND_PCI_QUIRK(0x17aa, 0x2319, "Thinkpad Z16 Gen2", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI),
9858 	SND_PCI_QUIRK(0x17aa, 0x231a, "Thinkpad Z16 Gen2", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI),
9859 	SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
9860 	SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
9861 	SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
9862 	SND_PCI_QUIRK(0x17aa, 0x3111, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
9863 	SND_PCI_QUIRK(0x17aa, 0x312a, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
9864 	SND_PCI_QUIRK(0x17aa, 0x312f, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
9865 	SND_PCI_QUIRK(0x17aa, 0x313c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
9866 	SND_PCI_QUIRK(0x17aa, 0x3151, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
9867 	SND_PCI_QUIRK(0x17aa, 0x3176, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
9868 	SND_PCI_QUIRK(0x17aa, 0x3178, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
9869 	SND_PCI_QUIRK(0x17aa, 0x31af, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),
9870 	SND_PCI_QUIRK(0x17aa, 0x3801, "Lenovo Yoga9 14IAP7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
9871 	SND_PCI_QUIRK(0x17aa, 0x3802, "Lenovo Yoga DuetITL 2021", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
9872 	SND_PCI_QUIRK(0x17aa, 0x3813, "Legion 7i 15IMHG05", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
9873 	SND_PCI_QUIRK(0x17aa, 0x3818, "Lenovo C940 / Yoga Duet 7", ALC298_FIXUP_LENOVO_C940_DUET7),
9874 	SND_PCI_QUIRK(0x17aa, 0x3819, "Lenovo 13s Gen2 ITL", ALC287_FIXUP_13S_GEN2_SPEAKERS),
9875 	SND_PCI_QUIRK(0x17aa, 0x3820, "Yoga Duet 7 13ITL6", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
9876 	SND_PCI_QUIRK(0x17aa, 0x3824, "Legion Y9000X 2020", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),
9877 	SND_PCI_QUIRK(0x17aa, 0x3827, "Ideapad S740", ALC285_FIXUP_IDEAPAD_S740_COEF),
9878 	SND_PCI_QUIRK(0x17aa, 0x3834, "Lenovo IdeaPad Slim 9i 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
9879 	SND_PCI_QUIRK(0x17aa, 0x383d, "Legion Y9000X 2019", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),
9880 	SND_PCI_QUIRK(0x17aa, 0x3843, "Yoga 9i", ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP),
9881 	SND_PCI_QUIRK(0x17aa, 0x3847, "Legion 7 16ACHG6", ALC287_FIXUP_LEGION_16ACHG6),
9882 	SND_PCI_QUIRK(0x17aa, 0x384a, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
9883 	SND_PCI_QUIRK(0x17aa, 0x3852, "Lenovo Yoga 7 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
9884 	SND_PCI_QUIRK(0x17aa, 0x3853, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
9885 	SND_PCI_QUIRK(0x17aa, 0x3855, "Legion 7 16ITHG6", ALC287_FIXUP_LEGION_16ITHG6),
9886 	SND_PCI_QUIRK(0x17aa, 0x3869, "Lenovo Yoga7 14IAL7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
9887 	SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
9888 	SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
9889 	SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
9890 	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
9891 	SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9892 	SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC),
9893 	SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK),
9894 	SND_PCI_QUIRK(0x17aa, 0x5026, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9895 	SND_PCI_QUIRK(0x17aa, 0x5034, "Thinkpad T450", ALC292_FIXUP_TPT440_DOCK),
9896 	SND_PCI_QUIRK(0x17aa, 0x5036, "Thinkpad T450s", ALC292_FIXUP_TPT440_DOCK),
9897 	SND_PCI_QUIRK(0x17aa, 0x503c, "Thinkpad L450", ALC292_FIXUP_TPT440_DOCK),
9898 	SND_PCI_QUIRK(0x17aa, 0x504a, "ThinkPad X260", ALC292_FIXUP_TPT440_DOCK),
9899 	SND_PCI_QUIRK(0x17aa, 0x504b, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
9900 	SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460),
9901 	SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460),
9902 	SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460),
9903 	SND_PCI_QUIRK(0x17aa, 0x505d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9904 	SND_PCI_QUIRK(0x17aa, 0x505f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9905 	SND_PCI_QUIRK(0x17aa, 0x5062, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9906 	SND_PCI_QUIRK(0x17aa, 0x508b, "Thinkpad X12 Gen 1", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
9907 	SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9908 	SND_PCI_QUIRK(0x17aa, 0x511e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9909 	SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9910 	SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
9911 	SND_PCI_QUIRK(0x17aa, 0x9e56, "Lenovo ZhaoYang CF4620Z", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
9912 	SND_PCI_QUIRK(0x1849, 0x1233, "ASRock NUC Box 1100", ALC233_FIXUP_NO_AUDIO_JACK),
9913 	SND_PCI_QUIRK(0x1849, 0xa233, "Positivo Master C6300", ALC269_FIXUP_HEADSET_MIC),
9914 	SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS),
9915 	SND_PCI_QUIRK(0x19e5, 0x320f, "Huawei WRT-WX9 ", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
9916 	SND_PCI_QUIRK(0x1b35, 0x1235, "CZC B20", ALC269_FIXUP_CZC_B20),
9917 	SND_PCI_QUIRK(0x1b35, 0x1236, "CZC TMI", ALC269_FIXUP_CZC_TMI),
9918 	SND_PCI_QUIRK(0x1b35, 0x1237, "CZC L101", ALC269_FIXUP_CZC_L101),
9919 	SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */
9920 	SND_PCI_QUIRK(0x1c06, 0x2013, "Lemote A1802", ALC269_FIXUP_LEMOTE_A1802),
9921 	SND_PCI_QUIRK(0x1c06, 0x2015, "Lemote A190X", ALC269_FIXUP_LEMOTE_A190X),
9922 	SND_PCI_QUIRK(0x1c6c, 0x1251, "Positivo N14KP6-TG", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE),
9923 	SND_PCI_QUIRK(0x1d05, 0x1132, "TongFang PHxTxX1", ALC256_FIXUP_SET_COEF_DEFAULTS),
9924 	SND_PCI_QUIRK(0x1d05, 0x1096, "TongFang GMxMRxx", ALC269_FIXUP_NO_SHUTUP),
9925 	SND_PCI_QUIRK(0x1d05, 0x1100, "TongFang GKxNRxx", ALC269_FIXUP_NO_SHUTUP),
9926 	SND_PCI_QUIRK(0x1d05, 0x1111, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
9927 	SND_PCI_QUIRK(0x1d05, 0x1119, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
9928 	SND_PCI_QUIRK(0x1d05, 0x1129, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
9929 	SND_PCI_QUIRK(0x1d05, 0x1147, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP),
9930 	SND_PCI_QUIRK(0x1d05, 0x115c, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP),
9931 	SND_PCI_QUIRK(0x1d05, 0x121b, "TongFang GMxAGxx", ALC269_FIXUP_NO_SHUTUP),
9932 	SND_PCI_QUIRK(0x1d72, 0x1602, "RedmiBook", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
9933 	SND_PCI_QUIRK(0x1d72, 0x1701, "XiaomiNotebook Pro", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE),
9934 	SND_PCI_QUIRK(0x1d72, 0x1901, "RedmiBook 14", ALC256_FIXUP_ASUS_HEADSET_MIC),
9935 	SND_PCI_QUIRK(0x1d72, 0x1945, "Redmi G", ALC256_FIXUP_ASUS_HEADSET_MIC),
9936 	SND_PCI_QUIRK(0x1d72, 0x1947, "RedmiBook Air", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
9937 	SND_PCI_QUIRK(0x8086, 0x2074, "Intel NUC 8", ALC233_FIXUP_INTEL_NUC8_DMIC),
9938 	SND_PCI_QUIRK(0x8086, 0x2080, "Intel NUC 8 Rugged", ALC256_FIXUP_INTEL_NUC8_RUGGED),
9939 	SND_PCI_QUIRK(0x8086, 0x2081, "Intel NUC 10", ALC256_FIXUP_INTEL_NUC10),
9940 	SND_PCI_QUIRK(0x8086, 0x3038, "Intel NUC 13", ALC225_FIXUP_HEADSET_JACK),
9941 	SND_PCI_QUIRK(0xf111, 0x0001, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
9942 
9943 #if 0
9944 	/* Below is a quirk table taken from the old code.
9945 	 * Basically the device should work as is without the fixup table.
9946 	 * If BIOS doesn't give a proper info, enable the corresponding
9947 	 * fixup entry.
9948 	 */
9949 	SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
9950 		      ALC269_FIXUP_AMIC),
9951 	SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC),
9952 	SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC),
9953 	SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC),
9954 	SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC),
9955 	SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269_FIXUP_AMIC),
9956 	SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269_FIXUP_AMIC),
9957 	SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269_FIXUP_AMIC),
9958 	SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_FIXUP_AMIC),
9959 	SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269_FIXUP_AMIC),
9960 	SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_FIXUP_AMIC),
9961 	SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_FIXUP_AMIC),
9962 	SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_FIXUP_AMIC),
9963 	SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_FIXUP_AMIC),
9964 	SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_FIXUP_AMIC),
9965 	SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_FIXUP_AMIC),
9966 	SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_FIXUP_AMIC),
9967 	SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_FIXUP_AMIC),
9968 	SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_FIXUP_AMIC),
9969 	SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_FIXUP_AMIC),
9970 	SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_FIXUP_AMIC),
9971 	SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_FIXUP_AMIC),
9972 	SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_FIXUP_AMIC),
9973 	SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_FIXUP_AMIC),
9974 	SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_FIXUP_AMIC),
9975 	SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_FIXUP_AMIC),
9976 	SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_FIXUP_AMIC),
9977 	SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_FIXUP_AMIC),
9978 	SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_FIXUP_AMIC),
9979 	SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_FIXUP_AMIC),
9980 	SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_FIXUP_AMIC),
9981 	SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_FIXUP_AMIC),
9982 	SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_FIXUP_AMIC),
9983 	SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_FIXUP_AMIC),
9984 	SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_FIXUP_AMIC),
9985 	SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_FIXUP_DMIC),
9986 	SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_FIXUP_AMIC),
9987 	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_AMIC),
9988 	SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_FIXUP_DMIC),
9989 	SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_FIXUP_DMIC),
9990 #endif
9991 	{}
9992 };
9993 
9994 static const struct snd_pci_quirk alc269_fixup_vendor_tbl[] = {
9995 	SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
9996 	SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED),
9997 	SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
9998 	SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", ALC269_FIXUP_THINKPAD_ACPI),
9999 	SND_PCI_QUIRK_VENDOR(0x19e5, "Huawei Matebook", ALC255_FIXUP_MIC_MUTE_LED),
10000 	{}
10001 };
10002 
10003 static const struct hda_model_fixup alc269_fixup_models[] = {
10004 	{.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"},
10005 	{.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"},
10006 	{.id = ALC269_FIXUP_STEREO_DMIC, .name = "alc269-dmic"},
10007 	{.id = ALC271_FIXUP_DMIC, .name = "alc271-dmic"},
10008 	{.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"},
10009 	{.id = ALC269_FIXUP_HEADSET_MIC, .name = "headset-mic"},
10010 	{.id = ALC269_FIXUP_HEADSET_MODE, .name = "headset-mode"},
10011 	{.id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, .name = "headset-mode-no-hp-mic"},
10012 	{.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
10013 	{.id = ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST, .name = "lenovo-dock-limit-boost"},
10014 	{.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
10015 	{.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic1-led"},
10016 	{.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
10017 	{.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
10018 	{.id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, .name = "dell-headset3"},
10019 	{.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, .name = "dell-headset4"},
10020 	{.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},
10021 	{.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"},
10022 	{.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
10023 	{.id = ALC292_FIXUP_TPT440, .name = "tpt440"},
10024 	{.id = ALC292_FIXUP_TPT460, .name = "tpt460"},
10025 	{.id = ALC298_FIXUP_TPT470_DOCK_FIX, .name = "tpt470-dock-fix"},
10026 	{.id = ALC298_FIXUP_TPT470_DOCK, .name = "tpt470-dock"},
10027 	{.id = ALC233_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
10028 	{.id = ALC700_FIXUP_INTEL_REFERENCE, .name = "alc700-ref"},
10029 	{.id = ALC269_FIXUP_SONY_VAIO, .name = "vaio"},
10030 	{.id = ALC269_FIXUP_DELL_M101Z, .name = "dell-m101z"},
10031 	{.id = ALC269_FIXUP_ASUS_G73JW, .name = "asus-g73jw"},
10032 	{.id = ALC269_FIXUP_LENOVO_EAPD, .name = "lenovo-eapd"},
10033 	{.id = ALC275_FIXUP_SONY_HWEQ, .name = "sony-hweq"},
10034 	{.id = ALC269_FIXUP_PCM_44K, .name = "pcm44k"},
10035 	{.id = ALC269_FIXUP_LIFEBOOK, .name = "lifebook"},
10036 	{.id = ALC269_FIXUP_LIFEBOOK_EXTMIC, .name = "lifebook-extmic"},
10037 	{.id = ALC269_FIXUP_LIFEBOOK_HP_PIN, .name = "lifebook-hp-pin"},
10038 	{.id = ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC, .name = "lifebook-u7x7"},
10039 	{.id = ALC269VB_FIXUP_AMIC, .name = "alc269vb-amic"},
10040 	{.id = ALC269VB_FIXUP_DMIC, .name = "alc269vb-dmic"},
10041 	{.id = ALC269_FIXUP_HP_MUTE_LED_MIC1, .name = "hp-mute-led-mic1"},
10042 	{.id = ALC269_FIXUP_HP_MUTE_LED_MIC2, .name = "hp-mute-led-mic2"},
10043 	{.id = ALC269_FIXUP_HP_MUTE_LED_MIC3, .name = "hp-mute-led-mic3"},
10044 	{.id = ALC269_FIXUP_HP_GPIO_MIC1_LED, .name = "hp-gpio-mic1"},
10045 	{.id = ALC269_FIXUP_HP_LINE1_MIC1_LED, .name = "hp-line1-mic1"},
10046 	{.id = ALC269_FIXUP_NO_SHUTUP, .name = "noshutup"},
10047 	{.id = ALC286_FIXUP_SONY_MIC_NO_PRESENCE, .name = "sony-nomic"},
10048 	{.id = ALC269_FIXUP_ASPIRE_HEADSET_MIC, .name = "aspire-headset-mic"},
10049 	{.id = ALC269_FIXUP_ASUS_X101, .name = "asus-x101"},
10050 	{.id = ALC271_FIXUP_HP_GATE_MIC_JACK, .name = "acer-ao7xx"},
10051 	{.id = ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572, .name = "acer-aspire-e1"},
10052 	{.id = ALC269_FIXUP_ACER_AC700, .name = "acer-ac700"},
10053 	{.id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST, .name = "limit-mic-boost"},
10054 	{.id = ALC269VB_FIXUP_ASUS_ZENBOOK, .name = "asus-zenbook"},
10055 	{.id = ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A, .name = "asus-zenbook-ux31a"},
10056 	{.id = ALC269VB_FIXUP_ORDISSIMO_EVE2, .name = "ordissimo"},
10057 	{.id = ALC282_FIXUP_ASUS_TX300, .name = "asus-tx300"},
10058 	{.id = ALC283_FIXUP_INT_MIC, .name = "alc283-int-mic"},
10059 	{.id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK, .name = "mono-speakers"},
10060 	{.id = ALC290_FIXUP_SUBWOOFER_HSJACK, .name = "alc290-subwoofer"},
10061 	{.id = ALC269_FIXUP_THINKPAD_ACPI, .name = "thinkpad"},
10062 	{.id = ALC269_FIXUP_DMIC_THINKPAD_ACPI, .name = "dmic-thinkpad"},
10063 	{.id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE, .name = "alc255-acer"},
10064 	{.id = ALC255_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc255-asus"},
10065 	{.id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc255-dell1"},
10066 	{.id = ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "alc255-dell2"},
10067 	{.id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc293-dell1"},
10068 	{.id = ALC283_FIXUP_HEADSET_MIC, .name = "alc283-headset"},
10069 	{.id = ALC255_FIXUP_MIC_MUTE_LED, .name = "alc255-dell-mute"},
10070 	{.id = ALC282_FIXUP_ASPIRE_V5_PINS, .name = "aspire-v5"},
10071 	{.id = ALC269VB_FIXUP_ASPIRE_E1_COEF, .name = "aspire-e1-coef"},
10072 	{.id = ALC280_FIXUP_HP_GPIO4, .name = "hp-gpio4"},
10073 	{.id = ALC286_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
10074 	{.id = ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY, .name = "hp-gpio2-hotkey"},
10075 	{.id = ALC280_FIXUP_HP_DOCK_PINS, .name = "hp-dock-pins"},
10076 	{.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic"},
10077 	{.id = ALC280_FIXUP_HP_9480M, .name = "hp-9480m"},
10078 	{.id = ALC288_FIXUP_DELL_HEADSET_MODE, .name = "alc288-dell-headset"},
10079 	{.id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc288-dell1"},
10080 	{.id = ALC288_FIXUP_DELL_XPS_13, .name = "alc288-dell-xps13"},
10081 	{.id = ALC292_FIXUP_DELL_E7X, .name = "dell-e7x"},
10082 	{.id = ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK, .name = "alc293-dell"},
10083 	{.id = ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc298-dell1"},
10084 	{.id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, .name = "alc298-dell-aio"},
10085 	{.id = ALC275_FIXUP_DELL_XPS, .name = "alc275-dell-xps"},
10086 	{.id = ALC293_FIXUP_LENOVO_SPK_NOISE, .name = "lenovo-spk-noise"},
10087 	{.id = ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, .name = "lenovo-hotkey"},
10088 	{.id = ALC255_FIXUP_DELL_SPK_NOISE, .name = "dell-spk-noise"},
10089 	{.id = ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc225-dell1"},
10090 	{.id = ALC295_FIXUP_DISABLE_DAC3, .name = "alc295-disable-dac3"},
10091 	{.id = ALC285_FIXUP_SPEAKER2_TO_DAC1, .name = "alc285-speaker2-to-dac1"},
10092 	{.id = ALC280_FIXUP_HP_HEADSET_MIC, .name = "alc280-hp-headset"},
10093 	{.id = ALC221_FIXUP_HP_FRONT_MIC, .name = "alc221-hp-mic"},
10094 	{.id = ALC298_FIXUP_SPK_VOLUME, .name = "alc298-spk-volume"},
10095 	{.id = ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER, .name = "dell-inspiron-7559"},
10096 	{.id = ALC269_FIXUP_ATIV_BOOK_8, .name = "ativ-book"},
10097 	{.id = ALC221_FIXUP_HP_MIC_NO_PRESENCE, .name = "alc221-hp-mic"},
10098 	{.id = ALC256_FIXUP_ASUS_HEADSET_MODE, .name = "alc256-asus-headset"},
10099 	{.id = ALC256_FIXUP_ASUS_MIC, .name = "alc256-asus-mic"},
10100 	{.id = ALC256_FIXUP_ASUS_AIO_GPIO2, .name = "alc256-asus-aio"},
10101 	{.id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc233-asus"},
10102 	{.id = ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE, .name = "alc233-eapd"},
10103 	{.id = ALC294_FIXUP_LENOVO_MIC_LOCATION, .name = "alc294-lenovo-mic"},
10104 	{.id = ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE, .name = "alc225-wyse"},
10105 	{.id = ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, .name = "alc274-dell-aio"},
10106 	{.id = ALC255_FIXUP_DUMMY_LINEOUT_VERB, .name = "alc255-dummy-lineout"},
10107 	{.id = ALC255_FIXUP_DELL_HEADSET_MIC, .name = "alc255-dell-headset"},
10108 	{.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"},
10109 	{.id = ALC225_FIXUP_HEADSET_JACK, .name = "alc-headset-jack"},
10110 	{.id = ALC295_FIXUP_CHROME_BOOK, .name = "alc-chrome-book"},
10111 	{.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"},
10112 	{.id = ALC298_FIXUP_HUAWEI_MBX_STEREO, .name = "huawei-mbx-stereo"},
10113 	{.id = ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, .name = "alc256-medion-headset"},
10114 	{.id = ALC298_FIXUP_SAMSUNG_AMP, .name = "alc298-samsung-amp"},
10115 	{.id = ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET, .name = "alc256-samsung-headphone"},
10116 	{.id = ALC255_FIXUP_XIAOMI_HEADSET_MIC, .name = "alc255-xiaomi-headset"},
10117 	{.id = ALC274_FIXUP_HP_MIC, .name = "alc274-hp-mic-detect"},
10118 	{.id = ALC245_FIXUP_HP_X360_AMP, .name = "alc245-hp-x360-amp"},
10119 	{.id = ALC295_FIXUP_HP_OMEN, .name = "alc295-hp-omen"},
10120 	{.id = ALC285_FIXUP_HP_SPECTRE_X360, .name = "alc285-hp-spectre-x360"},
10121 	{.id = ALC285_FIXUP_HP_SPECTRE_X360_EB1, .name = "alc285-hp-spectre-x360-eb1"},
10122 	{.id = ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP, .name = "alc287-ideapad-bass-spk-amp"},
10123 	{.id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN, .name = "alc287-yoga9-bass-spk-pin"},
10124 	{.id = ALC623_FIXUP_LENOVO_THINKSTATION_P340, .name = "alc623-lenovo-thinkstation-p340"},
10125 	{.id = ALC255_FIXUP_ACER_HEADPHONE_AND_MIC, .name = "alc255-acer-headphone-and-mic"},
10126 	{.id = ALC285_FIXUP_HP_GPIO_AMP_INIT, .name = "alc285-hp-amp-init"},
10127 	{}
10128 };
10129 #define ALC225_STANDARD_PINS \
10130 	{0x21, 0x04211020}
10131 
10132 #define ALC256_STANDARD_PINS \
10133 	{0x12, 0x90a60140}, \
10134 	{0x14, 0x90170110}, \
10135 	{0x21, 0x02211020}
10136 
10137 #define ALC282_STANDARD_PINS \
10138 	{0x14, 0x90170110}
10139 
10140 #define ALC290_STANDARD_PINS \
10141 	{0x12, 0x99a30130}
10142 
10143 #define ALC292_STANDARD_PINS \
10144 	{0x14, 0x90170110}, \
10145 	{0x15, 0x0221401f}
10146 
10147 #define ALC295_STANDARD_PINS \
10148 	{0x12, 0xb7a60130}, \
10149 	{0x14, 0x90170110}, \
10150 	{0x21, 0x04211020}
10151 
10152 #define ALC298_STANDARD_PINS \
10153 	{0x12, 0x90a60130}, \
10154 	{0x21, 0x03211020}
10155 
10156 static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
10157 	SND_HDA_PIN_QUIRK(0x10ec0221, 0x103c, "HP Workstation", ALC221_FIXUP_HP_HEADSET_MIC,
10158 		{0x14, 0x01014020},
10159 		{0x17, 0x90170110},
10160 		{0x18, 0x02a11030},
10161 		{0x19, 0x0181303F},
10162 		{0x21, 0x0221102f}),
10163 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1025, "Acer", ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
10164 		{0x12, 0x90a601c0},
10165 		{0x14, 0x90171120},
10166 		{0x21, 0x02211030}),
10167 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
10168 		{0x14, 0x90170110},
10169 		{0x1b, 0x90a70130},
10170 		{0x21, 0x03211020}),
10171 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
10172 		{0x1a, 0x90a70130},
10173 		{0x1b, 0x90170110},
10174 		{0x21, 0x03211020}),
10175 	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10176 		ALC225_STANDARD_PINS,
10177 		{0x12, 0xb7a60130},
10178 		{0x14, 0x901701a0}),
10179 	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10180 		ALC225_STANDARD_PINS,
10181 		{0x12, 0xb7a60130},
10182 		{0x14, 0x901701b0}),
10183 	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10184 		ALC225_STANDARD_PINS,
10185 		{0x12, 0xb7a60150},
10186 		{0x14, 0x901701a0}),
10187 	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10188 		ALC225_STANDARD_PINS,
10189 		{0x12, 0xb7a60150},
10190 		{0x14, 0x901701b0}),
10191 	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10192 		ALC225_STANDARD_PINS,
10193 		{0x12, 0xb7a60130},
10194 		{0x1b, 0x90170110}),
10195 	SND_HDA_PIN_QUIRK(0x10ec0233, 0x8086, "Intel NUC Skull Canyon", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10196 		{0x1b, 0x01111010},
10197 		{0x1e, 0x01451130},
10198 		{0x21, 0x02211020}),
10199 	SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
10200 		{0x12, 0x90a60140},
10201 		{0x14, 0x90170110},
10202 		{0x19, 0x02a11030},
10203 		{0x21, 0x02211020}),
10204 	SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
10205 		{0x14, 0x90170110},
10206 		{0x19, 0x02a11030},
10207 		{0x1a, 0x02a11040},
10208 		{0x1b, 0x01014020},
10209 		{0x21, 0x0221101f}),
10210 	SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
10211 		{0x14, 0x90170110},
10212 		{0x19, 0x02a11030},
10213 		{0x1a, 0x02a11040},
10214 		{0x1b, 0x01011020},
10215 		{0x21, 0x0221101f}),
10216 	SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
10217 		{0x14, 0x90170110},
10218 		{0x19, 0x02a11020},
10219 		{0x1a, 0x02a11030},
10220 		{0x21, 0x0221101f}),
10221 	SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
10222 		{0x21, 0x02211010}),
10223 	SND_HDA_PIN_QUIRK(0x10ec0236, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
10224 		{0x14, 0x90170110},
10225 		{0x19, 0x02a11020},
10226 		{0x21, 0x02211030}),
10227 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
10228 		{0x14, 0x90170110},
10229 		{0x21, 0x02211020}),
10230 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10231 		{0x14, 0x90170130},
10232 		{0x21, 0x02211040}),
10233 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10234 		{0x12, 0x90a60140},
10235 		{0x14, 0x90170110},
10236 		{0x21, 0x02211020}),
10237 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10238 		{0x12, 0x90a60160},
10239 		{0x14, 0x90170120},
10240 		{0x21, 0x02211030}),
10241 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10242 		{0x14, 0x90170110},
10243 		{0x1b, 0x02011020},
10244 		{0x21, 0x0221101f}),
10245 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10246 		{0x14, 0x90170110},
10247 		{0x1b, 0x01011020},
10248 		{0x21, 0x0221101f}),
10249 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10250 		{0x14, 0x90170130},
10251 		{0x1b, 0x01014020},
10252 		{0x21, 0x0221103f}),
10253 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10254 		{0x14, 0x90170130},
10255 		{0x1b, 0x01011020},
10256 		{0x21, 0x0221103f}),
10257 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10258 		{0x14, 0x90170130},
10259 		{0x1b, 0x02011020},
10260 		{0x21, 0x0221103f}),
10261 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10262 		{0x14, 0x90170150},
10263 		{0x1b, 0x02011020},
10264 		{0x21, 0x0221105f}),
10265 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10266 		{0x14, 0x90170110},
10267 		{0x1b, 0x01014020},
10268 		{0x21, 0x0221101f}),
10269 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10270 		{0x12, 0x90a60160},
10271 		{0x14, 0x90170120},
10272 		{0x17, 0x90170140},
10273 		{0x21, 0x0321102f}),
10274 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10275 		{0x12, 0x90a60160},
10276 		{0x14, 0x90170130},
10277 		{0x21, 0x02211040}),
10278 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10279 		{0x12, 0x90a60160},
10280 		{0x14, 0x90170140},
10281 		{0x21, 0x02211050}),
10282 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10283 		{0x12, 0x90a60170},
10284 		{0x14, 0x90170120},
10285 		{0x21, 0x02211030}),
10286 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10287 		{0x12, 0x90a60170},
10288 		{0x14, 0x90170130},
10289 		{0x21, 0x02211040}),
10290 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10291 		{0x12, 0x90a60170},
10292 		{0x14, 0x90171130},
10293 		{0x21, 0x02211040}),
10294 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10295 		{0x12, 0x90a60170},
10296 		{0x14, 0x90170140},
10297 		{0x21, 0x02211050}),
10298 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5548", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10299 		{0x12, 0x90a60180},
10300 		{0x14, 0x90170130},
10301 		{0x21, 0x02211040}),
10302 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5565", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10303 		{0x12, 0x90a60180},
10304 		{0x14, 0x90170120},
10305 		{0x21, 0x02211030}),
10306 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10307 		{0x1b, 0x01011020},
10308 		{0x21, 0x02211010}),
10309 	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
10310 		{0x14, 0x90170110},
10311 		{0x1b, 0x90a70130},
10312 		{0x21, 0x04211020}),
10313 	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
10314 		{0x14, 0x90170110},
10315 		{0x1b, 0x90a70130},
10316 		{0x21, 0x03211020}),
10317 	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
10318 		{0x12, 0x90a60130},
10319 		{0x14, 0x90170110},
10320 		{0x21, 0x03211020}),
10321 	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
10322 		{0x12, 0x90a60130},
10323 		{0x14, 0x90170110},
10324 		{0x21, 0x04211020}),
10325 	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
10326 		{0x1a, 0x90a70130},
10327 		{0x1b, 0x90170110},
10328 		{0x21, 0x03211020}),
10329        SND_HDA_PIN_QUIRK(0x10ec0256, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
10330 		{0x14, 0x90170110},
10331 		{0x19, 0x02a11020},
10332 		{0x21, 0x0221101f}),
10333        SND_HDA_PIN_QUIRK(0x10ec0274, 0x103c, "HP", ALC274_FIXUP_HP_HEADSET_MIC,
10334 		{0x17, 0x90170110},
10335 		{0x19, 0x03a11030},
10336 		{0x21, 0x03211020}),
10337 	SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
10338 		{0x12, 0x90a60130},
10339 		{0x14, 0x90170110},
10340 		{0x15, 0x0421101f},
10341 		{0x1a, 0x04a11020}),
10342 	SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED,
10343 		{0x12, 0x90a60140},
10344 		{0x14, 0x90170110},
10345 		{0x15, 0x0421101f},
10346 		{0x18, 0x02811030},
10347 		{0x1a, 0x04a1103f},
10348 		{0x1b, 0x02011020}),
10349 	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP 15 Touchsmart", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10350 		ALC282_STANDARD_PINS,
10351 		{0x12, 0x99a30130},
10352 		{0x19, 0x03a11020},
10353 		{0x21, 0x0321101f}),
10354 	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10355 		ALC282_STANDARD_PINS,
10356 		{0x12, 0x99a30130},
10357 		{0x19, 0x03a11020},
10358 		{0x21, 0x03211040}),
10359 	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10360 		ALC282_STANDARD_PINS,
10361 		{0x12, 0x99a30130},
10362 		{0x19, 0x03a11030},
10363 		{0x21, 0x03211020}),
10364 	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10365 		ALC282_STANDARD_PINS,
10366 		{0x12, 0x99a30130},
10367 		{0x19, 0x04a11020},
10368 		{0x21, 0x0421101f}),
10369 	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED,
10370 		ALC282_STANDARD_PINS,
10371 		{0x12, 0x90a60140},
10372 		{0x19, 0x04a11030},
10373 		{0x21, 0x04211020}),
10374 	SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
10375 		ALC282_STANDARD_PINS,
10376 		{0x12, 0x90a609c0},
10377 		{0x18, 0x03a11830},
10378 		{0x19, 0x04a19831},
10379 		{0x1a, 0x0481303f},
10380 		{0x1b, 0x04211020},
10381 		{0x21, 0x0321101f}),
10382 	SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
10383 		ALC282_STANDARD_PINS,
10384 		{0x12, 0x90a60940},
10385 		{0x18, 0x03a11830},
10386 		{0x19, 0x04a19831},
10387 		{0x1a, 0x0481303f},
10388 		{0x1b, 0x04211020},
10389 		{0x21, 0x0321101f}),
10390 	SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10391 		ALC282_STANDARD_PINS,
10392 		{0x12, 0x90a60130},
10393 		{0x21, 0x0321101f}),
10394 	SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10395 		{0x12, 0x90a60160},
10396 		{0x14, 0x90170120},
10397 		{0x21, 0x02211030}),
10398 	SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10399 		ALC282_STANDARD_PINS,
10400 		{0x12, 0x90a60130},
10401 		{0x19, 0x03a11020},
10402 		{0x21, 0x0321101f}),
10403 	SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
10404 		{0x12, 0x90a60130},
10405 		{0x14, 0x90170110},
10406 		{0x19, 0x04a11040},
10407 		{0x21, 0x04211020}),
10408 	SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
10409 		{0x14, 0x90170110},
10410 		{0x19, 0x04a11040},
10411 		{0x1d, 0x40600001},
10412 		{0x21, 0x04211020}),
10413 	SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
10414 		{0x14, 0x90170110},
10415 		{0x19, 0x04a11040},
10416 		{0x21, 0x04211020}),
10417 	SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_HEADSET_JACK,
10418 		{0x14, 0x90170110},
10419 		{0x17, 0x90170111},
10420 		{0x19, 0x03a11030},
10421 		{0x21, 0x03211020}),
10422 	SND_HDA_PIN_QUIRK(0x10ec0286, 0x1025, "Acer", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
10423 		{0x12, 0x90a60130},
10424 		{0x17, 0x90170110},
10425 		{0x21, 0x02211020}),
10426 	SND_HDA_PIN_QUIRK(0x10ec0288, 0x1028, "Dell", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
10427 		{0x12, 0x90a60120},
10428 		{0x14, 0x90170110},
10429 		{0x21, 0x0321101f}),
10430 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10431 		ALC290_STANDARD_PINS,
10432 		{0x15, 0x04211040},
10433 		{0x18, 0x90170112},
10434 		{0x1a, 0x04a11020}),
10435 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10436 		ALC290_STANDARD_PINS,
10437 		{0x15, 0x04211040},
10438 		{0x18, 0x90170110},
10439 		{0x1a, 0x04a11020}),
10440 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10441 		ALC290_STANDARD_PINS,
10442 		{0x15, 0x0421101f},
10443 		{0x1a, 0x04a11020}),
10444 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10445 		ALC290_STANDARD_PINS,
10446 		{0x15, 0x04211020},
10447 		{0x1a, 0x04a11040}),
10448 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10449 		ALC290_STANDARD_PINS,
10450 		{0x14, 0x90170110},
10451 		{0x15, 0x04211020},
10452 		{0x1a, 0x04a11040}),
10453 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10454 		ALC290_STANDARD_PINS,
10455 		{0x14, 0x90170110},
10456 		{0x15, 0x04211020},
10457 		{0x1a, 0x04a11020}),
10458 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10459 		ALC290_STANDARD_PINS,
10460 		{0x14, 0x90170110},
10461 		{0x15, 0x0421101f},
10462 		{0x1a, 0x04a11020}),
10463 	SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
10464 		ALC292_STANDARD_PINS,
10465 		{0x12, 0x90a60140},
10466 		{0x16, 0x01014020},
10467 		{0x19, 0x01a19030}),
10468 	SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
10469 		ALC292_STANDARD_PINS,
10470 		{0x12, 0x90a60140},
10471 		{0x16, 0x01014020},
10472 		{0x18, 0x02a19031},
10473 		{0x19, 0x01a1903e}),
10474 	SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
10475 		ALC292_STANDARD_PINS,
10476 		{0x12, 0x90a60140}),
10477 	SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
10478 		ALC292_STANDARD_PINS,
10479 		{0x13, 0x90a60140},
10480 		{0x16, 0x21014020},
10481 		{0x19, 0x21a19030}),
10482 	SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
10483 		ALC292_STANDARD_PINS,
10484 		{0x13, 0x90a60140}),
10485 	SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_HPE,
10486 		{0x17, 0x90170110},
10487 		{0x21, 0x04211020}),
10488 	SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_MIC,
10489 		{0x14, 0x90170110},
10490 		{0x1b, 0x90a70130},
10491 		{0x21, 0x04211020}),
10492 	SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
10493 		{0x12, 0x90a60130},
10494 		{0x17, 0x90170110},
10495 		{0x21, 0x03211020}),
10496 	SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
10497 		{0x12, 0x90a60130},
10498 		{0x17, 0x90170110},
10499 		{0x21, 0x04211020}),
10500 	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
10501 		{0x12, 0x90a60130},
10502 		{0x17, 0x90170110},
10503 		{0x21, 0x03211020}),
10504 	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
10505 		{0x12, 0x90a60120},
10506 		{0x17, 0x90170110},
10507 		{0x21, 0x04211030}),
10508 	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
10509 		{0x12, 0x90a60130},
10510 		{0x17, 0x90170110},
10511 		{0x21, 0x03211020}),
10512 	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
10513 		{0x12, 0x90a60130},
10514 		{0x17, 0x90170110},
10515 		{0x21, 0x03211020}),
10516 	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
10517 		{0x14, 0x90170110},
10518 		{0x21, 0x04211020}),
10519 	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
10520 		{0x14, 0x90170110},
10521 		{0x21, 0x04211030}),
10522 	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10523 		ALC295_STANDARD_PINS,
10524 		{0x17, 0x21014020},
10525 		{0x18, 0x21a19030}),
10526 	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10527 		ALC295_STANDARD_PINS,
10528 		{0x17, 0x21014040},
10529 		{0x18, 0x21a19050}),
10530 	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10531 		ALC295_STANDARD_PINS),
10532 	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
10533 		ALC298_STANDARD_PINS,
10534 		{0x17, 0x90170110}),
10535 	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
10536 		ALC298_STANDARD_PINS,
10537 		{0x17, 0x90170140}),
10538 	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
10539 		ALC298_STANDARD_PINS,
10540 		{0x17, 0x90170150}),
10541 	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_SPK_VOLUME,
10542 		{0x12, 0xb7a60140},
10543 		{0x13, 0xb7a60150},
10544 		{0x17, 0x90170110},
10545 		{0x1a, 0x03011020},
10546 		{0x21, 0x03211030}),
10547 	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
10548 		{0x12, 0xb7a60140},
10549 		{0x17, 0x90170110},
10550 		{0x1a, 0x03a11030},
10551 		{0x21, 0x03211020}),
10552 	SND_HDA_PIN_QUIRK(0x10ec0299, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
10553 		ALC225_STANDARD_PINS,
10554 		{0x12, 0xb7a60130},
10555 		{0x17, 0x90170110}),
10556 	SND_HDA_PIN_QUIRK(0x10ec0623, 0x17aa, "Lenovo", ALC283_FIXUP_HEADSET_MIC,
10557 		{0x14, 0x01014010},
10558 		{0x17, 0x90170120},
10559 		{0x18, 0x02a11030},
10560 		{0x19, 0x02a1103f},
10561 		{0x21, 0x0221101f}),
10562 	{}
10563 };
10564 
10565 /* This is the fallback pin_fixup_tbl for alc269 family, to make the tbl match
10566  * more machines, don't need to match all valid pins, just need to match
10567  * all the pins defined in the tbl. Just because of this reason, it is possible
10568  * that a single machine matches multiple tbls, so there is one limitation:
10569  *   at most one tbl is allowed to define for the same vendor and same codec
10570  */
10571 static const struct snd_hda_pin_quirk alc269_fallback_pin_fixup_tbl[] = {
10572 	SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
10573 		{0x19, 0x40000000},
10574 		{0x1b, 0x40000000}),
10575 	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10576 		{0x19, 0x40000000},
10577 		{0x1a, 0x40000000}),
10578 	SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10579 		{0x19, 0x40000000},
10580 		{0x1a, 0x40000000}),
10581 	SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
10582 		{0x19, 0x40000000},
10583 		{0x1a, 0x40000000}),
10584 	{}
10585 };
10586 
10587 static void alc269_fill_coef(struct hda_codec *codec)
10588 {
10589 	struct alc_spec *spec = codec->spec;
10590 	int val;
10591 
10592 	if (spec->codec_variant != ALC269_TYPE_ALC269VB)
10593 		return;
10594 
10595 	if ((alc_get_coef0(codec) & 0x00ff) < 0x015) {
10596 		alc_write_coef_idx(codec, 0xf, 0x960b);
10597 		alc_write_coef_idx(codec, 0xe, 0x8817);
10598 	}
10599 
10600 	if ((alc_get_coef0(codec) & 0x00ff) == 0x016) {
10601 		alc_write_coef_idx(codec, 0xf, 0x960b);
10602 		alc_write_coef_idx(codec, 0xe, 0x8814);
10603 	}
10604 
10605 	if ((alc_get_coef0(codec) & 0x00ff) == 0x017) {
10606 		/* Power up output pin */
10607 		alc_update_coef_idx(codec, 0x04, 0, 1<<11);
10608 	}
10609 
10610 	if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {
10611 		val = alc_read_coef_idx(codec, 0xd);
10612 		if (val != -1 && (val & 0x0c00) >> 10 != 0x1) {
10613 			/* Capless ramp up clock control */
10614 			alc_write_coef_idx(codec, 0xd, val | (1<<10));
10615 		}
10616 		val = alc_read_coef_idx(codec, 0x17);
10617 		if (val != -1 && (val & 0x01c0) >> 6 != 0x4) {
10618 			/* Class D power on reset */
10619 			alc_write_coef_idx(codec, 0x17, val | (1<<7));
10620 		}
10621 	}
10622 
10623 	/* HP */
10624 	alc_update_coef_idx(codec, 0x4, 0, 1<<11);
10625 }
10626 
10627 /*
10628  */
10629 static int patch_alc269(struct hda_codec *codec)
10630 {
10631 	struct alc_spec *spec;
10632 	int err;
10633 
10634 	err = alc_alloc_spec(codec, 0x0b);
10635 	if (err < 0)
10636 		return err;
10637 
10638 	spec = codec->spec;
10639 	spec->gen.shared_mic_vref_pin = 0x18;
10640 	codec->power_save_node = 0;
10641 
10642 #ifdef CONFIG_PM
10643 	codec->patch_ops.suspend = alc269_suspend;
10644 	codec->patch_ops.resume = alc269_resume;
10645 #endif
10646 	spec->shutup = alc_default_shutup;
10647 	spec->init_hook = alc_default_init;
10648 
10649 	switch (codec->core.vendor_id) {
10650 	case 0x10ec0269:
10651 		spec->codec_variant = ALC269_TYPE_ALC269VA;
10652 		switch (alc_get_coef0(codec) & 0x00f0) {
10653 		case 0x0010:
10654 			if (codec->bus->pci &&
10655 			    codec->bus->pci->subsystem_vendor == 0x1025 &&
10656 			    spec->cdefine.platform_type == 1)
10657 				err = alc_codec_rename(codec, "ALC271X");
10658 			spec->codec_variant = ALC269_TYPE_ALC269VB;
10659 			break;
10660 		case 0x0020:
10661 			if (codec->bus->pci &&
10662 			    codec->bus->pci->subsystem_vendor == 0x17aa &&
10663 			    codec->bus->pci->subsystem_device == 0x21f3)
10664 				err = alc_codec_rename(codec, "ALC3202");
10665 			spec->codec_variant = ALC269_TYPE_ALC269VC;
10666 			break;
10667 		case 0x0030:
10668 			spec->codec_variant = ALC269_TYPE_ALC269VD;
10669 			break;
10670 		default:
10671 			alc_fix_pll_init(codec, 0x20, 0x04, 15);
10672 		}
10673 		if (err < 0)
10674 			goto error;
10675 		spec->shutup = alc269_shutup;
10676 		spec->init_hook = alc269_fill_coef;
10677 		alc269_fill_coef(codec);
10678 		break;
10679 
10680 	case 0x10ec0280:
10681 	case 0x10ec0290:
10682 		spec->codec_variant = ALC269_TYPE_ALC280;
10683 		break;
10684 	case 0x10ec0282:
10685 		spec->codec_variant = ALC269_TYPE_ALC282;
10686 		spec->shutup = alc282_shutup;
10687 		spec->init_hook = alc282_init;
10688 		break;
10689 	case 0x10ec0233:
10690 	case 0x10ec0283:
10691 		spec->codec_variant = ALC269_TYPE_ALC283;
10692 		spec->shutup = alc283_shutup;
10693 		spec->init_hook = alc283_init;
10694 		break;
10695 	case 0x10ec0284:
10696 	case 0x10ec0292:
10697 		spec->codec_variant = ALC269_TYPE_ALC284;
10698 		break;
10699 	case 0x10ec0293:
10700 		spec->codec_variant = ALC269_TYPE_ALC293;
10701 		break;
10702 	case 0x10ec0286:
10703 	case 0x10ec0288:
10704 		spec->codec_variant = ALC269_TYPE_ALC286;
10705 		break;
10706 	case 0x10ec0298:
10707 		spec->codec_variant = ALC269_TYPE_ALC298;
10708 		break;
10709 	case 0x10ec0235:
10710 	case 0x10ec0255:
10711 		spec->codec_variant = ALC269_TYPE_ALC255;
10712 		spec->shutup = alc256_shutup;
10713 		spec->init_hook = alc256_init;
10714 		break;
10715 	case 0x10ec0230:
10716 	case 0x10ec0236:
10717 	case 0x10ec0256:
10718 	case 0x19e58326:
10719 		spec->codec_variant = ALC269_TYPE_ALC256;
10720 		spec->shutup = alc256_shutup;
10721 		spec->init_hook = alc256_init;
10722 		spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */
10723 		if (codec->bus->pci->vendor == PCI_VENDOR_ID_AMD)
10724 			spec->en_3kpull_low = true;
10725 		break;
10726 	case 0x10ec0257:
10727 		spec->codec_variant = ALC269_TYPE_ALC257;
10728 		spec->shutup = alc256_shutup;
10729 		spec->init_hook = alc256_init;
10730 		spec->gen.mixer_nid = 0;
10731 		break;
10732 	case 0x10ec0215:
10733 	case 0x10ec0245:
10734 	case 0x10ec0285:
10735 	case 0x10ec0289:
10736 		if (alc_get_coef0(codec) & 0x0010)
10737 			spec->codec_variant = ALC269_TYPE_ALC245;
10738 		else
10739 			spec->codec_variant = ALC269_TYPE_ALC215;
10740 		spec->shutup = alc225_shutup;
10741 		spec->init_hook = alc225_init;
10742 		spec->gen.mixer_nid = 0;
10743 		break;
10744 	case 0x10ec0225:
10745 	case 0x10ec0295:
10746 	case 0x10ec0299:
10747 		spec->codec_variant = ALC269_TYPE_ALC225;
10748 		spec->shutup = alc225_shutup;
10749 		spec->init_hook = alc225_init;
10750 		spec->gen.mixer_nid = 0; /* no loopback on ALC225, ALC295 and ALC299 */
10751 		break;
10752 	case 0x10ec0287:
10753 		spec->codec_variant = ALC269_TYPE_ALC287;
10754 		spec->shutup = alc225_shutup;
10755 		spec->init_hook = alc225_init;
10756 		spec->gen.mixer_nid = 0; /* no loopback on ALC287 */
10757 		break;
10758 	case 0x10ec0234:
10759 	case 0x10ec0274:
10760 	case 0x10ec0294:
10761 		spec->codec_variant = ALC269_TYPE_ALC294;
10762 		spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */
10763 		alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */
10764 		spec->init_hook = alc294_init;
10765 		break;
10766 	case 0x10ec0300:
10767 		spec->codec_variant = ALC269_TYPE_ALC300;
10768 		spec->gen.mixer_nid = 0; /* no loopback on ALC300 */
10769 		break;
10770 	case 0x10ec0623:
10771 		spec->codec_variant = ALC269_TYPE_ALC623;
10772 		break;
10773 	case 0x10ec0700:
10774 	case 0x10ec0701:
10775 	case 0x10ec0703:
10776 	case 0x10ec0711:
10777 		spec->codec_variant = ALC269_TYPE_ALC700;
10778 		spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */
10779 		alc_update_coef_idx(codec, 0x4a, 1 << 15, 0); /* Combo jack auto trigger control */
10780 		spec->init_hook = alc294_init;
10781 		break;
10782 
10783 	}
10784 
10785 	if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) {
10786 		spec->has_alc5505_dsp = 1;
10787 		spec->init_hook = alc5505_dsp_init;
10788 	}
10789 
10790 	alc_pre_init(codec);
10791 
10792 	snd_hda_pick_fixup(codec, alc269_fixup_models,
10793 		       alc269_fixup_tbl, alc269_fixups);
10794 	/* FIXME: both TX300 and ROG Strix G17 have the same SSID, and
10795 	 * the quirk breaks the latter (bko#214101).
10796 	 * Clear the wrong entry.
10797 	 */
10798 	if (codec->fixup_id == ALC282_FIXUP_ASUS_TX300 &&
10799 	    codec->core.vendor_id == 0x10ec0294) {
10800 		codec_dbg(codec, "Clear wrong fixup for ASUS ROG Strix G17\n");
10801 		codec->fixup_id = HDA_FIXUP_ID_NOT_SET;
10802 	}
10803 
10804 	snd_hda_pick_pin_fixup(codec, alc269_pin_fixup_tbl, alc269_fixups, true);
10805 	snd_hda_pick_pin_fixup(codec, alc269_fallback_pin_fixup_tbl, alc269_fixups, false);
10806 	snd_hda_pick_fixup(codec, NULL,	alc269_fixup_vendor_tbl,
10807 			   alc269_fixups);
10808 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
10809 
10810 	alc_auto_parse_customize_define(codec);
10811 
10812 	if (has_cdefine_beep(codec))
10813 		spec->gen.beep_nid = 0x01;
10814 
10815 	/* automatic parse from the BIOS config */
10816 	err = alc269_parse_auto_config(codec);
10817 	if (err < 0)
10818 		goto error;
10819 
10820 	if (!spec->gen.no_analog && spec->gen.beep_nid && spec->gen.mixer_nid) {
10821 		err = set_beep_amp(spec, spec->gen.mixer_nid, 0x04, HDA_INPUT);
10822 		if (err < 0)
10823 			goto error;
10824 	}
10825 
10826 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
10827 
10828 	return 0;
10829 
10830  error:
10831 	alc_free(codec);
10832 	return err;
10833 }
10834 
10835 /*
10836  * ALC861
10837  */
10838 
10839 static int alc861_parse_auto_config(struct hda_codec *codec)
10840 {
10841 	static const hda_nid_t alc861_ignore[] = { 0x1d, 0 };
10842 	static const hda_nid_t alc861_ssids[] = { 0x0e, 0x0f, 0x0b, 0 };
10843 	return alc_parse_auto_config(codec, alc861_ignore, alc861_ssids);
10844 }
10845 
10846 /* Pin config fixes */
10847 enum {
10848 	ALC861_FIXUP_FSC_AMILO_PI1505,
10849 	ALC861_FIXUP_AMP_VREF_0F,
10850 	ALC861_FIXUP_NO_JACK_DETECT,
10851 	ALC861_FIXUP_ASUS_A6RP,
10852 	ALC660_FIXUP_ASUS_W7J,
10853 };
10854 
10855 /* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */
10856 static void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec,
10857 			const struct hda_fixup *fix, int action)
10858 {
10859 	struct alc_spec *spec = codec->spec;
10860 	unsigned int val;
10861 
10862 	if (action != HDA_FIXUP_ACT_INIT)
10863 		return;
10864 	val = snd_hda_codec_get_pin_target(codec, 0x0f);
10865 	if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)))
10866 		val |= AC_PINCTL_IN_EN;
10867 	val |= AC_PINCTL_VREF_50;
10868 	snd_hda_set_pin_ctl(codec, 0x0f, val);
10869 	spec->gen.keep_vref_in_automute = 1;
10870 }
10871 
10872 /* suppress the jack-detection */
10873 static void alc_fixup_no_jack_detect(struct hda_codec *codec,
10874 				     const struct hda_fixup *fix, int action)
10875 {
10876 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
10877 		codec->no_jack_detect = 1;
10878 }
10879 
10880 static const struct hda_fixup alc861_fixups[] = {
10881 	[ALC861_FIXUP_FSC_AMILO_PI1505] = {
10882 		.type = HDA_FIXUP_PINS,
10883 		.v.pins = (const struct hda_pintbl[]) {
10884 			{ 0x0b, 0x0221101f }, /* HP */
10885 			{ 0x0f, 0x90170310 }, /* speaker */
10886 			{ }
10887 		}
10888 	},
10889 	[ALC861_FIXUP_AMP_VREF_0F] = {
10890 		.type = HDA_FIXUP_FUNC,
10891 		.v.func = alc861_fixup_asus_amp_vref_0f,
10892 	},
10893 	[ALC861_FIXUP_NO_JACK_DETECT] = {
10894 		.type = HDA_FIXUP_FUNC,
10895 		.v.func = alc_fixup_no_jack_detect,
10896 	},
10897 	[ALC861_FIXUP_ASUS_A6RP] = {
10898 		.type = HDA_FIXUP_FUNC,
10899 		.v.func = alc861_fixup_asus_amp_vref_0f,
10900 		.chained = true,
10901 		.chain_id = ALC861_FIXUP_NO_JACK_DETECT,
10902 	},
10903 	[ALC660_FIXUP_ASUS_W7J] = {
10904 		.type = HDA_FIXUP_VERBS,
10905 		.v.verbs = (const struct hda_verb[]) {
10906 			/* ASUS W7J needs a magic pin setup on unused NID 0x10
10907 			 * for enabling outputs
10908 			 */
10909 			{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
10910 			{ }
10911 		},
10912 	}
10913 };
10914 
10915 static const struct snd_pci_quirk alc861_fixup_tbl[] = {
10916 	SND_PCI_QUIRK(0x1043, 0x1253, "ASUS W7J", ALC660_FIXUP_ASUS_W7J),
10917 	SND_PCI_QUIRK(0x1043, 0x1263, "ASUS Z35HL", ALC660_FIXUP_ASUS_W7J),
10918 	SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP),
10919 	SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", ALC861_FIXUP_AMP_VREF_0F),
10920 	SND_PCI_QUIRK(0x1462, 0x7254, "HP DX2200", ALC861_FIXUP_NO_JACK_DETECT),
10921 	SND_PCI_QUIRK_VENDOR(0x1584, "Haier/Uniwill", ALC861_FIXUP_AMP_VREF_0F),
10922 	SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", ALC861_FIXUP_FSC_AMILO_PI1505),
10923 	{}
10924 };
10925 
10926 /*
10927  */
10928 static int patch_alc861(struct hda_codec *codec)
10929 {
10930 	struct alc_spec *spec;
10931 	int err;
10932 
10933 	err = alc_alloc_spec(codec, 0x15);
10934 	if (err < 0)
10935 		return err;
10936 
10937 	spec = codec->spec;
10938 	if (has_cdefine_beep(codec))
10939 		spec->gen.beep_nid = 0x23;
10940 
10941 #ifdef CONFIG_PM
10942 	spec->power_hook = alc_power_eapd;
10943 #endif
10944 
10945 	alc_pre_init(codec);
10946 
10947 	snd_hda_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);
10948 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
10949 
10950 	/* automatic parse from the BIOS config */
10951 	err = alc861_parse_auto_config(codec);
10952 	if (err < 0)
10953 		goto error;
10954 
10955 	if (!spec->gen.no_analog) {
10956 		err = set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
10957 		if (err < 0)
10958 			goto error;
10959 	}
10960 
10961 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
10962 
10963 	return 0;
10964 
10965  error:
10966 	alc_free(codec);
10967 	return err;
10968 }
10969 
10970 /*
10971  * ALC861-VD support
10972  *
10973  * Based on ALC882
10974  *
10975  * In addition, an independent DAC
10976  */
10977 static int alc861vd_parse_auto_config(struct hda_codec *codec)
10978 {
10979 	static const hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
10980 	static const hda_nid_t alc861vd_ssids[] = { 0x15, 0x1b, 0x14, 0 };
10981 	return alc_parse_auto_config(codec, alc861vd_ignore, alc861vd_ssids);
10982 }
10983 
10984 enum {
10985 	ALC660VD_FIX_ASUS_GPIO1,
10986 	ALC861VD_FIX_DALLAS,
10987 };
10988 
10989 /* exclude VREF80 */
10990 static void alc861vd_fixup_dallas(struct hda_codec *codec,
10991 				  const struct hda_fixup *fix, int action)
10992 {
10993 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
10994 		snd_hda_override_pin_caps(codec, 0x18, 0x00000734);
10995 		snd_hda_override_pin_caps(codec, 0x19, 0x0000073c);
10996 	}
10997 }
10998 
10999 /* reset GPIO1 */
11000 static void alc660vd_fixup_asus_gpio1(struct hda_codec *codec,
11001 				      const struct hda_fixup *fix, int action)
11002 {
11003 	struct alc_spec *spec = codec->spec;
11004 
11005 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
11006 		spec->gpio_mask |= 0x02;
11007 	alc_fixup_gpio(codec, action, 0x01);
11008 }
11009 
11010 static const struct hda_fixup alc861vd_fixups[] = {
11011 	[ALC660VD_FIX_ASUS_GPIO1] = {
11012 		.type = HDA_FIXUP_FUNC,
11013 		.v.func = alc660vd_fixup_asus_gpio1,
11014 	},
11015 	[ALC861VD_FIX_DALLAS] = {
11016 		.type = HDA_FIXUP_FUNC,
11017 		.v.func = alc861vd_fixup_dallas,
11018 	},
11019 };
11020 
11021 static const struct snd_pci_quirk alc861vd_fixup_tbl[] = {
11022 	SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_FIX_DALLAS),
11023 	SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
11024 	SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_FIX_DALLAS),
11025 	{}
11026 };
11027 
11028 /*
11029  */
11030 static int patch_alc861vd(struct hda_codec *codec)
11031 {
11032 	struct alc_spec *spec;
11033 	int err;
11034 
11035 	err = alc_alloc_spec(codec, 0x0b);
11036 	if (err < 0)
11037 		return err;
11038 
11039 	spec = codec->spec;
11040 	if (has_cdefine_beep(codec))
11041 		spec->gen.beep_nid = 0x23;
11042 
11043 	spec->shutup = alc_eapd_shutup;
11044 
11045 	alc_pre_init(codec);
11046 
11047 	snd_hda_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);
11048 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
11049 
11050 	/* automatic parse from the BIOS config */
11051 	err = alc861vd_parse_auto_config(codec);
11052 	if (err < 0)
11053 		goto error;
11054 
11055 	if (!spec->gen.no_analog) {
11056 		err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
11057 		if (err < 0)
11058 			goto error;
11059 	}
11060 
11061 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
11062 
11063 	return 0;
11064 
11065  error:
11066 	alc_free(codec);
11067 	return err;
11068 }
11069 
11070 /*
11071  * ALC662 support
11072  *
11073  * ALC662 is almost identical with ALC880 but has cleaner and more flexible
11074  * configuration.  Each pin widget can choose any input DACs and a mixer.
11075  * Each ADC is connected from a mixer of all inputs.  This makes possible
11076  * 6-channel independent captures.
11077  *
11078  * In addition, an independent DAC for the multi-playback (not used in this
11079  * driver yet).
11080  */
11081 
11082 /*
11083  * BIOS auto configuration
11084  */
11085 
11086 static int alc662_parse_auto_config(struct hda_codec *codec)
11087 {
11088 	static const hda_nid_t alc662_ignore[] = { 0x1d, 0 };
11089 	static const hda_nid_t alc663_ssids[] = { 0x15, 0x1b, 0x14, 0x21 };
11090 	static const hda_nid_t alc662_ssids[] = { 0x15, 0x1b, 0x14, 0 };
11091 	const hda_nid_t *ssids;
11092 
11093 	if (codec->core.vendor_id == 0x10ec0272 || codec->core.vendor_id == 0x10ec0663 ||
11094 	    codec->core.vendor_id == 0x10ec0665 || codec->core.vendor_id == 0x10ec0670 ||
11095 	    codec->core.vendor_id == 0x10ec0671)
11096 		ssids = alc663_ssids;
11097 	else
11098 		ssids = alc662_ssids;
11099 	return alc_parse_auto_config(codec, alc662_ignore, ssids);
11100 }
11101 
11102 static void alc272_fixup_mario(struct hda_codec *codec,
11103 			       const struct hda_fixup *fix, int action)
11104 {
11105 	if (action != HDA_FIXUP_ACT_PRE_PROBE)
11106 		return;
11107 	if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
11108 				      (0x3b << AC_AMPCAP_OFFSET_SHIFT) |
11109 				      (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |
11110 				      (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |
11111 				      (0 << AC_AMPCAP_MUTE_SHIFT)))
11112 		codec_warn(codec, "failed to override amp caps for NID 0x2\n");
11113 }
11114 
11115 static const struct snd_pcm_chmap_elem asus_pcm_2_1_chmaps[] = {
11116 	{ .channels = 2,
11117 	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
11118 	{ .channels = 4,
11119 	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
11120 		   SNDRV_CHMAP_NA, SNDRV_CHMAP_LFE } }, /* LFE only on right */
11121 	{ }
11122 };
11123 
11124 /* override the 2.1 chmap */
11125 static void alc_fixup_bass_chmap(struct hda_codec *codec,
11126 				    const struct hda_fixup *fix, int action)
11127 {
11128 	if (action == HDA_FIXUP_ACT_BUILD) {
11129 		struct alc_spec *spec = codec->spec;
11130 		spec->gen.pcm_rec[0]->stream[0].chmap = asus_pcm_2_1_chmaps;
11131 	}
11132 }
11133 
11134 /* avoid D3 for keeping GPIO up */
11135 static unsigned int gpio_led_power_filter(struct hda_codec *codec,
11136 					  hda_nid_t nid,
11137 					  unsigned int power_state)
11138 {
11139 	struct alc_spec *spec = codec->spec;
11140 	if (nid == codec->core.afg && power_state == AC_PWRST_D3 && spec->gpio_data)
11141 		return AC_PWRST_D0;
11142 	return power_state;
11143 }
11144 
11145 static void alc662_fixup_led_gpio1(struct hda_codec *codec,
11146 				   const struct hda_fixup *fix, int action)
11147 {
11148 	struct alc_spec *spec = codec->spec;
11149 
11150 	alc_fixup_hp_gpio_led(codec, action, 0x01, 0);
11151 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
11152 		spec->mute_led_polarity = 1;
11153 		codec->power_filter = gpio_led_power_filter;
11154 	}
11155 }
11156 
11157 static void alc662_usi_automute_hook(struct hda_codec *codec,
11158 					 struct hda_jack_callback *jack)
11159 {
11160 	struct alc_spec *spec = codec->spec;
11161 	int vref;
11162 	msleep(200);
11163 	snd_hda_gen_hp_automute(codec, jack);
11164 
11165 	vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
11166 	msleep(100);
11167 	snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
11168 			    vref);
11169 }
11170 
11171 static void alc662_fixup_usi_headset_mic(struct hda_codec *codec,
11172 				     const struct hda_fixup *fix, int action)
11173 {
11174 	struct alc_spec *spec = codec->spec;
11175 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
11176 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
11177 		spec->gen.hp_automute_hook = alc662_usi_automute_hook;
11178 	}
11179 }
11180 
11181 static void alc662_aspire_ethos_mute_speakers(struct hda_codec *codec,
11182 					struct hda_jack_callback *cb)
11183 {
11184 	/* surround speakers at 0x1b already get muted automatically when
11185 	 * headphones are plugged in, but we have to mute/unmute the remaining
11186 	 * channels manually:
11187 	 * 0x15 - front left/front right
11188 	 * 0x18 - front center/ LFE
11189 	 */
11190 	if (snd_hda_jack_detect_state(codec, 0x1b) == HDA_JACK_PRESENT) {
11191 		snd_hda_set_pin_ctl_cache(codec, 0x15, 0);
11192 		snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
11193 	} else {
11194 		snd_hda_set_pin_ctl_cache(codec, 0x15, PIN_OUT);
11195 		snd_hda_set_pin_ctl_cache(codec, 0x18, PIN_OUT);
11196 	}
11197 }
11198 
11199 static void alc662_fixup_aspire_ethos_hp(struct hda_codec *codec,
11200 					const struct hda_fixup *fix, int action)
11201 {
11202     /* Pin 0x1b: shared headphones jack and surround speakers */
11203 	if (!is_jack_detectable(codec, 0x1b))
11204 		return;
11205 
11206 	switch (action) {
11207 	case HDA_FIXUP_ACT_PRE_PROBE:
11208 		snd_hda_jack_detect_enable_callback(codec, 0x1b,
11209 				alc662_aspire_ethos_mute_speakers);
11210 		/* subwoofer needs an extra GPIO setting to become audible */
11211 		alc_setup_gpio(codec, 0x02);
11212 		break;
11213 	case HDA_FIXUP_ACT_INIT:
11214 		/* Make sure to start in a correct state, i.e. if
11215 		 * headphones have been plugged in before powering up the system
11216 		 */
11217 		alc662_aspire_ethos_mute_speakers(codec, NULL);
11218 		break;
11219 	}
11220 }
11221 
11222 static void alc671_fixup_hp_headset_mic2(struct hda_codec *codec,
11223 					     const struct hda_fixup *fix, int action)
11224 {
11225 	struct alc_spec *spec = codec->spec;
11226 
11227 	static const struct hda_pintbl pincfgs[] = {
11228 		{ 0x19, 0x02a11040 }, /* use as headset mic, with its own jack detect */
11229 		{ 0x1b, 0x0181304f },
11230 		{ }
11231 	};
11232 
11233 	switch (action) {
11234 	case HDA_FIXUP_ACT_PRE_PROBE:
11235 		spec->gen.mixer_nid = 0;
11236 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
11237 		snd_hda_apply_pincfgs(codec, pincfgs);
11238 		break;
11239 	case HDA_FIXUP_ACT_INIT:
11240 		alc_write_coef_idx(codec, 0x19, 0xa054);
11241 		break;
11242 	}
11243 }
11244 
11245 static void alc897_hp_automute_hook(struct hda_codec *codec,
11246 					 struct hda_jack_callback *jack)
11247 {
11248 	struct alc_spec *spec = codec->spec;
11249 	int vref;
11250 
11251 	snd_hda_gen_hp_automute(codec, jack);
11252 	vref = spec->gen.hp_jack_present ? (PIN_HP | AC_PINCTL_VREF_100) : PIN_HP;
11253 	snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
11254 			    vref);
11255 }
11256 
11257 static void alc897_fixup_lenovo_headset_mic(struct hda_codec *codec,
11258 				     const struct hda_fixup *fix, int action)
11259 {
11260 	struct alc_spec *spec = codec->spec;
11261 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
11262 		spec->gen.hp_automute_hook = alc897_hp_automute_hook;
11263 	}
11264 }
11265 
11266 static void alc897_fixup_lenovo_headset_mode(struct hda_codec *codec,
11267 				     const struct hda_fixup *fix, int action)
11268 {
11269 	struct alc_spec *spec = codec->spec;
11270 
11271 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
11272 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
11273 		spec->gen.hp_automute_hook = alc897_hp_automute_hook;
11274 	}
11275 }
11276 
11277 static const struct coef_fw alc668_coefs[] = {
11278 	WRITE_COEF(0x01, 0xbebe), WRITE_COEF(0x02, 0xaaaa), WRITE_COEF(0x03,    0x0),
11279 	WRITE_COEF(0x04, 0x0180), WRITE_COEF(0x06,    0x0), WRITE_COEF(0x07, 0x0f80),
11280 	WRITE_COEF(0x08, 0x0031), WRITE_COEF(0x0a, 0x0060), WRITE_COEF(0x0b,    0x0),
11281 	WRITE_COEF(0x0c, 0x7cf7), WRITE_COEF(0x0d, 0x1080), WRITE_COEF(0x0e, 0x7f7f),
11282 	WRITE_COEF(0x0f, 0xcccc), WRITE_COEF(0x10, 0xddcc), WRITE_COEF(0x11, 0x0001),
11283 	WRITE_COEF(0x13,    0x0), WRITE_COEF(0x14, 0x2aa0), WRITE_COEF(0x17, 0xa940),
11284 	WRITE_COEF(0x19,    0x0), WRITE_COEF(0x1a,    0x0), WRITE_COEF(0x1b,    0x0),
11285 	WRITE_COEF(0x1c,    0x0), WRITE_COEF(0x1d,    0x0), WRITE_COEF(0x1e, 0x7418),
11286 	WRITE_COEF(0x1f, 0x0804), WRITE_COEF(0x20, 0x4200), WRITE_COEF(0x21, 0x0468),
11287 	WRITE_COEF(0x22, 0x8ccc), WRITE_COEF(0x23, 0x0250), WRITE_COEF(0x24, 0x7418),
11288 	WRITE_COEF(0x27,    0x0), WRITE_COEF(0x28, 0x8ccc), WRITE_COEF(0x2a, 0xff00),
11289 	WRITE_COEF(0x2b, 0x8000), WRITE_COEF(0xa7, 0xff00), WRITE_COEF(0xa8, 0x8000),
11290 	WRITE_COEF(0xaa, 0x2e17), WRITE_COEF(0xab, 0xa0c0), WRITE_COEF(0xac,    0x0),
11291 	WRITE_COEF(0xad,    0x0), WRITE_COEF(0xae, 0x2ac6), WRITE_COEF(0xaf, 0xa480),
11292 	WRITE_COEF(0xb0,    0x0), WRITE_COEF(0xb1,    0x0), WRITE_COEF(0xb2,    0x0),
11293 	WRITE_COEF(0xb3,    0x0), WRITE_COEF(0xb4,    0x0), WRITE_COEF(0xb5, 0x1040),
11294 	WRITE_COEF(0xb6, 0xd697), WRITE_COEF(0xb7, 0x902b), WRITE_COEF(0xb8, 0xd697),
11295 	WRITE_COEF(0xb9, 0x902b), WRITE_COEF(0xba, 0xb8ba), WRITE_COEF(0xbb, 0xaaab),
11296 	WRITE_COEF(0xbc, 0xaaaf), WRITE_COEF(0xbd, 0x6aaa), WRITE_COEF(0xbe, 0x1c02),
11297 	WRITE_COEF(0xc0, 0x00ff), WRITE_COEF(0xc1, 0x0fa6),
11298 	{}
11299 };
11300 
11301 static void alc668_restore_default_value(struct hda_codec *codec)
11302 {
11303 	alc_process_coef_fw(codec, alc668_coefs);
11304 }
11305 
11306 enum {
11307 	ALC662_FIXUP_ASPIRE,
11308 	ALC662_FIXUP_LED_GPIO1,
11309 	ALC662_FIXUP_IDEAPAD,
11310 	ALC272_FIXUP_MARIO,
11311 	ALC662_FIXUP_CZC_ET26,
11312 	ALC662_FIXUP_CZC_P10T,
11313 	ALC662_FIXUP_SKU_IGNORE,
11314 	ALC662_FIXUP_HP_RP5800,
11315 	ALC662_FIXUP_ASUS_MODE1,
11316 	ALC662_FIXUP_ASUS_MODE2,
11317 	ALC662_FIXUP_ASUS_MODE3,
11318 	ALC662_FIXUP_ASUS_MODE4,
11319 	ALC662_FIXUP_ASUS_MODE5,
11320 	ALC662_FIXUP_ASUS_MODE6,
11321 	ALC662_FIXUP_ASUS_MODE7,
11322 	ALC662_FIXUP_ASUS_MODE8,
11323 	ALC662_FIXUP_NO_JACK_DETECT,
11324 	ALC662_FIXUP_ZOTAC_Z68,
11325 	ALC662_FIXUP_INV_DMIC,
11326 	ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
11327 	ALC668_FIXUP_DELL_MIC_NO_PRESENCE,
11328 	ALC662_FIXUP_HEADSET_MODE,
11329 	ALC668_FIXUP_HEADSET_MODE,
11330 	ALC662_FIXUP_BASS_MODE4_CHMAP,
11331 	ALC662_FIXUP_BASS_16,
11332 	ALC662_FIXUP_BASS_1A,
11333 	ALC662_FIXUP_BASS_CHMAP,
11334 	ALC668_FIXUP_AUTO_MUTE,
11335 	ALC668_FIXUP_DELL_DISABLE_AAMIX,
11336 	ALC668_FIXUP_DELL_XPS13,
11337 	ALC662_FIXUP_ASUS_Nx50,
11338 	ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
11339 	ALC668_FIXUP_ASUS_Nx51,
11340 	ALC668_FIXUP_MIC_COEF,
11341 	ALC668_FIXUP_ASUS_G751,
11342 	ALC891_FIXUP_HEADSET_MODE,
11343 	ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
11344 	ALC662_FIXUP_ACER_VERITON,
11345 	ALC892_FIXUP_ASROCK_MOBO,
11346 	ALC662_FIXUP_USI_FUNC,
11347 	ALC662_FIXUP_USI_HEADSET_MODE,
11348 	ALC662_FIXUP_LENOVO_MULTI_CODECS,
11349 	ALC669_FIXUP_ACER_ASPIRE_ETHOS,
11350 	ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET,
11351 	ALC671_FIXUP_HP_HEADSET_MIC2,
11352 	ALC662_FIXUP_ACER_X2660G_HEADSET_MODE,
11353 	ALC662_FIXUP_ACER_NITRO_HEADSET_MODE,
11354 	ALC668_FIXUP_ASUS_NO_HEADSET_MIC,
11355 	ALC668_FIXUP_HEADSET_MIC,
11356 	ALC668_FIXUP_MIC_DET_COEF,
11357 	ALC897_FIXUP_LENOVO_HEADSET_MIC,
11358 	ALC897_FIXUP_HEADSET_MIC_PIN,
11359 	ALC897_FIXUP_HP_HSMIC_VERB,
11360 	ALC897_FIXUP_LENOVO_HEADSET_MODE,
11361 	ALC897_FIXUP_HEADSET_MIC_PIN2,
11362 	ALC897_FIXUP_UNIS_H3C_X500S,
11363 };
11364 
11365 static const struct hda_fixup alc662_fixups[] = {
11366 	[ALC662_FIXUP_ASPIRE] = {
11367 		.type = HDA_FIXUP_PINS,
11368 		.v.pins = (const struct hda_pintbl[]) {
11369 			{ 0x15, 0x99130112 }, /* subwoofer */
11370 			{ }
11371 		}
11372 	},
11373 	[ALC662_FIXUP_LED_GPIO1] = {
11374 		.type = HDA_FIXUP_FUNC,
11375 		.v.func = alc662_fixup_led_gpio1,
11376 	},
11377 	[ALC662_FIXUP_IDEAPAD] = {
11378 		.type = HDA_FIXUP_PINS,
11379 		.v.pins = (const struct hda_pintbl[]) {
11380 			{ 0x17, 0x99130112 }, /* subwoofer */
11381 			{ }
11382 		},
11383 		.chained = true,
11384 		.chain_id = ALC662_FIXUP_LED_GPIO1,
11385 	},
11386 	[ALC272_FIXUP_MARIO] = {
11387 		.type = HDA_FIXUP_FUNC,
11388 		.v.func = alc272_fixup_mario,
11389 	},
11390 	[ALC662_FIXUP_CZC_ET26] = {
11391 		.type = HDA_FIXUP_PINS,
11392 		.v.pins = (const struct hda_pintbl[]) {
11393 			{0x12, 0x403cc000},
11394 			{0x14, 0x90170110}, /* speaker */
11395 			{0x15, 0x411111f0},
11396 			{0x16, 0x411111f0},
11397 			{0x18, 0x01a19030}, /* mic */
11398 			{0x19, 0x90a7013f}, /* int-mic */
11399 			{0x1a, 0x01014020},
11400 			{0x1b, 0x0121401f},
11401 			{0x1c, 0x411111f0},
11402 			{0x1d, 0x411111f0},
11403 			{0x1e, 0x40478e35},
11404 			{}
11405 		},
11406 		.chained = true,
11407 		.chain_id = ALC662_FIXUP_SKU_IGNORE
11408 	},
11409 	[ALC662_FIXUP_CZC_P10T] = {
11410 		.type = HDA_FIXUP_VERBS,
11411 		.v.verbs = (const struct hda_verb[]) {
11412 			{0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
11413 			{}
11414 		}
11415 	},
11416 	[ALC662_FIXUP_SKU_IGNORE] = {
11417 		.type = HDA_FIXUP_FUNC,
11418 		.v.func = alc_fixup_sku_ignore,
11419 	},
11420 	[ALC662_FIXUP_HP_RP5800] = {
11421 		.type = HDA_FIXUP_PINS,
11422 		.v.pins = (const struct hda_pintbl[]) {
11423 			{ 0x14, 0x0221201f }, /* HP out */
11424 			{ }
11425 		},
11426 		.chained = true,
11427 		.chain_id = ALC662_FIXUP_SKU_IGNORE
11428 	},
11429 	[ALC662_FIXUP_ASUS_MODE1] = {
11430 		.type = HDA_FIXUP_PINS,
11431 		.v.pins = (const struct hda_pintbl[]) {
11432 			{ 0x14, 0x99130110 }, /* speaker */
11433 			{ 0x18, 0x01a19c20 }, /* mic */
11434 			{ 0x19, 0x99a3092f }, /* int-mic */
11435 			{ 0x21, 0x0121401f }, /* HP out */
11436 			{ }
11437 		},
11438 		.chained = true,
11439 		.chain_id = ALC662_FIXUP_SKU_IGNORE
11440 	},
11441 	[ALC662_FIXUP_ASUS_MODE2] = {
11442 		.type = HDA_FIXUP_PINS,
11443 		.v.pins = (const struct hda_pintbl[]) {
11444 			{ 0x14, 0x99130110 }, /* speaker */
11445 			{ 0x18, 0x01a19820 }, /* mic */
11446 			{ 0x19, 0x99a3092f }, /* int-mic */
11447 			{ 0x1b, 0x0121401f }, /* HP out */
11448 			{ }
11449 		},
11450 		.chained = true,
11451 		.chain_id = ALC662_FIXUP_SKU_IGNORE
11452 	},
11453 	[ALC662_FIXUP_ASUS_MODE3] = {
11454 		.type = HDA_FIXUP_PINS,
11455 		.v.pins = (const struct hda_pintbl[]) {
11456 			{ 0x14, 0x99130110 }, /* speaker */
11457 			{ 0x15, 0x0121441f }, /* HP */
11458 			{ 0x18, 0x01a19840 }, /* mic */
11459 			{ 0x19, 0x99a3094f }, /* int-mic */
11460 			{ 0x21, 0x01211420 }, /* HP2 */
11461 			{ }
11462 		},
11463 		.chained = true,
11464 		.chain_id = ALC662_FIXUP_SKU_IGNORE
11465 	},
11466 	[ALC662_FIXUP_ASUS_MODE4] = {
11467 		.type = HDA_FIXUP_PINS,
11468 		.v.pins = (const struct hda_pintbl[]) {
11469 			{ 0x14, 0x99130110 }, /* speaker */
11470 			{ 0x16, 0x99130111 }, /* speaker */
11471 			{ 0x18, 0x01a19840 }, /* mic */
11472 			{ 0x19, 0x99a3094f }, /* int-mic */
11473 			{ 0x21, 0x0121441f }, /* HP */
11474 			{ }
11475 		},
11476 		.chained = true,
11477 		.chain_id = ALC662_FIXUP_SKU_IGNORE
11478 	},
11479 	[ALC662_FIXUP_ASUS_MODE5] = {
11480 		.type = HDA_FIXUP_PINS,
11481 		.v.pins = (const struct hda_pintbl[]) {
11482 			{ 0x14, 0x99130110 }, /* speaker */
11483 			{ 0x15, 0x0121441f }, /* HP */
11484 			{ 0x16, 0x99130111 }, /* speaker */
11485 			{ 0x18, 0x01a19840 }, /* mic */
11486 			{ 0x19, 0x99a3094f }, /* int-mic */
11487 			{ }
11488 		},
11489 		.chained = true,
11490 		.chain_id = ALC662_FIXUP_SKU_IGNORE
11491 	},
11492 	[ALC662_FIXUP_ASUS_MODE6] = {
11493 		.type = HDA_FIXUP_PINS,
11494 		.v.pins = (const struct hda_pintbl[]) {
11495 			{ 0x14, 0x99130110 }, /* speaker */
11496 			{ 0x15, 0x01211420 }, /* HP2 */
11497 			{ 0x18, 0x01a19840 }, /* mic */
11498 			{ 0x19, 0x99a3094f }, /* int-mic */
11499 			{ 0x1b, 0x0121441f }, /* HP */
11500 			{ }
11501 		},
11502 		.chained = true,
11503 		.chain_id = ALC662_FIXUP_SKU_IGNORE
11504 	},
11505 	[ALC662_FIXUP_ASUS_MODE7] = {
11506 		.type = HDA_FIXUP_PINS,
11507 		.v.pins = (const struct hda_pintbl[]) {
11508 			{ 0x14, 0x99130110 }, /* speaker */
11509 			{ 0x17, 0x99130111 }, /* speaker */
11510 			{ 0x18, 0x01a19840 }, /* mic */
11511 			{ 0x19, 0x99a3094f }, /* int-mic */
11512 			{ 0x1b, 0x01214020 }, /* HP */
11513 			{ 0x21, 0x0121401f }, /* HP */
11514 			{ }
11515 		},
11516 		.chained = true,
11517 		.chain_id = ALC662_FIXUP_SKU_IGNORE
11518 	},
11519 	[ALC662_FIXUP_ASUS_MODE8] = {
11520 		.type = HDA_FIXUP_PINS,
11521 		.v.pins = (const struct hda_pintbl[]) {
11522 			{ 0x14, 0x99130110 }, /* speaker */
11523 			{ 0x12, 0x99a30970 }, /* int-mic */
11524 			{ 0x15, 0x01214020 }, /* HP */
11525 			{ 0x17, 0x99130111 }, /* speaker */
11526 			{ 0x18, 0x01a19840 }, /* mic */
11527 			{ 0x21, 0x0121401f }, /* HP */
11528 			{ }
11529 		},
11530 		.chained = true,
11531 		.chain_id = ALC662_FIXUP_SKU_IGNORE
11532 	},
11533 	[ALC662_FIXUP_NO_JACK_DETECT] = {
11534 		.type = HDA_FIXUP_FUNC,
11535 		.v.func = alc_fixup_no_jack_detect,
11536 	},
11537 	[ALC662_FIXUP_ZOTAC_Z68] = {
11538 		.type = HDA_FIXUP_PINS,
11539 		.v.pins = (const struct hda_pintbl[]) {
11540 			{ 0x1b, 0x02214020 }, /* Front HP */
11541 			{ }
11542 		}
11543 	},
11544 	[ALC662_FIXUP_INV_DMIC] = {
11545 		.type = HDA_FIXUP_FUNC,
11546 		.v.func = alc_fixup_inv_dmic,
11547 	},
11548 	[ALC668_FIXUP_DELL_XPS13] = {
11549 		.type = HDA_FIXUP_FUNC,
11550 		.v.func = alc_fixup_dell_xps13,
11551 		.chained = true,
11552 		.chain_id = ALC668_FIXUP_DELL_DISABLE_AAMIX
11553 	},
11554 	[ALC668_FIXUP_DELL_DISABLE_AAMIX] = {
11555 		.type = HDA_FIXUP_FUNC,
11556 		.v.func = alc_fixup_disable_aamix,
11557 		.chained = true,
11558 		.chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
11559 	},
11560 	[ALC668_FIXUP_AUTO_MUTE] = {
11561 		.type = HDA_FIXUP_FUNC,
11562 		.v.func = alc_fixup_auto_mute_via_amp,
11563 		.chained = true,
11564 		.chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
11565 	},
11566 	[ALC662_FIXUP_DELL_MIC_NO_PRESENCE] = {
11567 		.type = HDA_FIXUP_PINS,
11568 		.v.pins = (const struct hda_pintbl[]) {
11569 			{ 0x19, 0x03a1113c }, /* use as headset mic, without its own jack detect */
11570 			/* headphone mic by setting pin control of 0x1b (headphone out) to in + vref_50 */
11571 			{ }
11572 		},
11573 		.chained = true,
11574 		.chain_id = ALC662_FIXUP_HEADSET_MODE
11575 	},
11576 	[ALC662_FIXUP_HEADSET_MODE] = {
11577 		.type = HDA_FIXUP_FUNC,
11578 		.v.func = alc_fixup_headset_mode_alc662,
11579 	},
11580 	[ALC668_FIXUP_DELL_MIC_NO_PRESENCE] = {
11581 		.type = HDA_FIXUP_PINS,
11582 		.v.pins = (const struct hda_pintbl[]) {
11583 			{ 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
11584 			{ 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
11585 			{ }
11586 		},
11587 		.chained = true,
11588 		.chain_id = ALC668_FIXUP_HEADSET_MODE
11589 	},
11590 	[ALC668_FIXUP_HEADSET_MODE] = {
11591 		.type = HDA_FIXUP_FUNC,
11592 		.v.func = alc_fixup_headset_mode_alc668,
11593 	},
11594 	[ALC662_FIXUP_BASS_MODE4_CHMAP] = {
11595 		.type = HDA_FIXUP_FUNC,
11596 		.v.func = alc_fixup_bass_chmap,
11597 		.chained = true,
11598 		.chain_id = ALC662_FIXUP_ASUS_MODE4
11599 	},
11600 	[ALC662_FIXUP_BASS_16] = {
11601 		.type = HDA_FIXUP_PINS,
11602 		.v.pins = (const struct hda_pintbl[]) {
11603 			{0x16, 0x80106111}, /* bass speaker */
11604 			{}
11605 		},
11606 		.chained = true,
11607 		.chain_id = ALC662_FIXUP_BASS_CHMAP,
11608 	},
11609 	[ALC662_FIXUP_BASS_1A] = {
11610 		.type = HDA_FIXUP_PINS,
11611 		.v.pins = (const struct hda_pintbl[]) {
11612 			{0x1a, 0x80106111}, /* bass speaker */
11613 			{}
11614 		},
11615 		.chained = true,
11616 		.chain_id = ALC662_FIXUP_BASS_CHMAP,
11617 	},
11618 	[ALC662_FIXUP_BASS_CHMAP] = {
11619 		.type = HDA_FIXUP_FUNC,
11620 		.v.func = alc_fixup_bass_chmap,
11621 	},
11622 	[ALC662_FIXUP_ASUS_Nx50] = {
11623 		.type = HDA_FIXUP_FUNC,
11624 		.v.func = alc_fixup_auto_mute_via_amp,
11625 		.chained = true,
11626 		.chain_id = ALC662_FIXUP_BASS_1A
11627 	},
11628 	[ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE] = {
11629 		.type = HDA_FIXUP_FUNC,
11630 		.v.func = alc_fixup_headset_mode_alc668,
11631 		.chain_id = ALC662_FIXUP_BASS_CHMAP
11632 	},
11633 	[ALC668_FIXUP_ASUS_Nx51] = {
11634 		.type = HDA_FIXUP_PINS,
11635 		.v.pins = (const struct hda_pintbl[]) {
11636 			{ 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
11637 			{ 0x1a, 0x90170151 }, /* bass speaker */
11638 			{ 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
11639 			{}
11640 		},
11641 		.chained = true,
11642 		.chain_id = ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
11643 	},
11644 	[ALC668_FIXUP_MIC_COEF] = {
11645 		.type = HDA_FIXUP_VERBS,
11646 		.v.verbs = (const struct hda_verb[]) {
11647 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0xc3 },
11648 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x4000 },
11649 			{}
11650 		},
11651 	},
11652 	[ALC668_FIXUP_ASUS_G751] = {
11653 		.type = HDA_FIXUP_PINS,
11654 		.v.pins = (const struct hda_pintbl[]) {
11655 			{ 0x16, 0x0421101f }, /* HP */
11656 			{}
11657 		},
11658 		.chained = true,
11659 		.chain_id = ALC668_FIXUP_MIC_COEF
11660 	},
11661 	[ALC891_FIXUP_HEADSET_MODE] = {
11662 		.type = HDA_FIXUP_FUNC,
11663 		.v.func = alc_fixup_headset_mode,
11664 	},
11665 	[ALC891_FIXUP_DELL_MIC_NO_PRESENCE] = {
11666 		.type = HDA_FIXUP_PINS,
11667 		.v.pins = (const struct hda_pintbl[]) {
11668 			{ 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
11669 			{ 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
11670 			{ }
11671 		},
11672 		.chained = true,
11673 		.chain_id = ALC891_FIXUP_HEADSET_MODE
11674 	},
11675 	[ALC662_FIXUP_ACER_VERITON] = {
11676 		.type = HDA_FIXUP_PINS,
11677 		.v.pins = (const struct hda_pintbl[]) {
11678 			{ 0x15, 0x50170120 }, /* no internal speaker */
11679 			{ }
11680 		}
11681 	},
11682 	[ALC892_FIXUP_ASROCK_MOBO] = {
11683 		.type = HDA_FIXUP_PINS,
11684 		.v.pins = (const struct hda_pintbl[]) {
11685 			{ 0x15, 0x40f000f0 }, /* disabled */
11686 			{ 0x16, 0x40f000f0 }, /* disabled */
11687 			{ }
11688 		}
11689 	},
11690 	[ALC662_FIXUP_USI_FUNC] = {
11691 		.type = HDA_FIXUP_FUNC,
11692 		.v.func = alc662_fixup_usi_headset_mic,
11693 	},
11694 	[ALC662_FIXUP_USI_HEADSET_MODE] = {
11695 		.type = HDA_FIXUP_PINS,
11696 		.v.pins = (const struct hda_pintbl[]) {
11697 			{ 0x19, 0x02a1913c }, /* use as headset mic, without its own jack detect */
11698 			{ 0x18, 0x01a1903d },
11699 			{ }
11700 		},
11701 		.chained = true,
11702 		.chain_id = ALC662_FIXUP_USI_FUNC
11703 	},
11704 	[ALC662_FIXUP_LENOVO_MULTI_CODECS] = {
11705 		.type = HDA_FIXUP_FUNC,
11706 		.v.func = alc233_alc662_fixup_lenovo_dual_codecs,
11707 	},
11708 	[ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET] = {
11709 		.type = HDA_FIXUP_FUNC,
11710 		.v.func = alc662_fixup_aspire_ethos_hp,
11711 	},
11712 	[ALC669_FIXUP_ACER_ASPIRE_ETHOS] = {
11713 		.type = HDA_FIXUP_PINS,
11714 		.v.pins = (const struct hda_pintbl[]) {
11715 			{ 0x15, 0x92130110 }, /* front speakers */
11716 			{ 0x18, 0x99130111 }, /* center/subwoofer */
11717 			{ 0x1b, 0x11130012 }, /* surround plus jack for HP */
11718 			{ }
11719 		},
11720 		.chained = true,
11721 		.chain_id = ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET
11722 	},
11723 	[ALC671_FIXUP_HP_HEADSET_MIC2] = {
11724 		.type = HDA_FIXUP_FUNC,
11725 		.v.func = alc671_fixup_hp_headset_mic2,
11726 	},
11727 	[ALC662_FIXUP_ACER_X2660G_HEADSET_MODE] = {
11728 		.type = HDA_FIXUP_PINS,
11729 		.v.pins = (const struct hda_pintbl[]) {
11730 			{ 0x1a, 0x02a1113c }, /* use as headset mic, without its own jack detect */
11731 			{ }
11732 		},
11733 		.chained = true,
11734 		.chain_id = ALC662_FIXUP_USI_FUNC
11735 	},
11736 	[ALC662_FIXUP_ACER_NITRO_HEADSET_MODE] = {
11737 		.type = HDA_FIXUP_PINS,
11738 		.v.pins = (const struct hda_pintbl[]) {
11739 			{ 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */
11740 			{ 0x1b, 0x0221144f },
11741 			{ }
11742 		},
11743 		.chained = true,
11744 		.chain_id = ALC662_FIXUP_USI_FUNC
11745 	},
11746 	[ALC668_FIXUP_ASUS_NO_HEADSET_MIC] = {
11747 		.type = HDA_FIXUP_PINS,
11748 		.v.pins = (const struct hda_pintbl[]) {
11749 			{ 0x1b, 0x04a1112c },
11750 			{ }
11751 		},
11752 		.chained = true,
11753 		.chain_id = ALC668_FIXUP_HEADSET_MIC
11754 	},
11755 	[ALC668_FIXUP_HEADSET_MIC] = {
11756 		.type = HDA_FIXUP_FUNC,
11757 		.v.func = alc269_fixup_headset_mic,
11758 		.chained = true,
11759 		.chain_id = ALC668_FIXUP_MIC_DET_COEF
11760 	},
11761 	[ALC668_FIXUP_MIC_DET_COEF] = {
11762 		.type = HDA_FIXUP_VERBS,
11763 		.v.verbs = (const struct hda_verb[]) {
11764 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x15 },
11765 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0d60 },
11766 			{}
11767 		},
11768 	},
11769 	[ALC897_FIXUP_LENOVO_HEADSET_MIC] = {
11770 		.type = HDA_FIXUP_FUNC,
11771 		.v.func = alc897_fixup_lenovo_headset_mic,
11772 	},
11773 	[ALC897_FIXUP_HEADSET_MIC_PIN] = {
11774 		.type = HDA_FIXUP_PINS,
11775 		.v.pins = (const struct hda_pintbl[]) {
11776 			{ 0x1a, 0x03a11050 },
11777 			{ }
11778 		},
11779 		.chained = true,
11780 		.chain_id = ALC897_FIXUP_LENOVO_HEADSET_MIC
11781 	},
11782 	[ALC897_FIXUP_HP_HSMIC_VERB] = {
11783 		.type = HDA_FIXUP_PINS,
11784 		.v.pins = (const struct hda_pintbl[]) {
11785 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
11786 			{ }
11787 		},
11788 	},
11789 	[ALC897_FIXUP_LENOVO_HEADSET_MODE] = {
11790 		.type = HDA_FIXUP_FUNC,
11791 		.v.func = alc897_fixup_lenovo_headset_mode,
11792 	},
11793 	[ALC897_FIXUP_HEADSET_MIC_PIN2] = {
11794 		.type = HDA_FIXUP_PINS,
11795 		.v.pins = (const struct hda_pintbl[]) {
11796 			{ 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */
11797 			{ }
11798 		},
11799 		.chained = true,
11800 		.chain_id = ALC897_FIXUP_LENOVO_HEADSET_MODE
11801 	},
11802 	[ALC897_FIXUP_UNIS_H3C_X500S] = {
11803 		.type = HDA_FIXUP_VERBS,
11804 		.v.verbs = (const struct hda_verb[]) {
11805 			{ 0x14, AC_VERB_SET_EAPD_BTLENABLE, 0 },
11806 			{}
11807 		},
11808 	},
11809 };
11810 
11811 static const struct snd_pci_quirk alc662_fixup_tbl[] = {
11812 	SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2),
11813 	SND_PCI_QUIRK(0x1025, 0x022f, "Acer Aspire One", ALC662_FIXUP_INV_DMIC),
11814 	SND_PCI_QUIRK(0x1025, 0x0241, "Packard Bell DOTS", ALC662_FIXUP_INV_DMIC),
11815 	SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
11816 	SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),
11817 	SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC),
11818 	SND_PCI_QUIRK(0x1025, 0x034a, "Gateway LT27", ALC662_FIXUP_INV_DMIC),
11819 	SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
11820 	SND_PCI_QUIRK(0x1025, 0x0566, "Acer Aspire Ethos 8951G", ALC669_FIXUP_ACER_ASPIRE_ETHOS),
11821 	SND_PCI_QUIRK(0x1025, 0x123c, "Acer Nitro N50-600", ALC662_FIXUP_ACER_NITRO_HEADSET_MODE),
11822 	SND_PCI_QUIRK(0x1025, 0x124e, "Acer 2660G", ALC662_FIXUP_ACER_X2660G_HEADSET_MODE),
11823 	SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11824 	SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11825 	SND_PCI_QUIRK(0x1028, 0x05fe, "Dell XPS 15", ALC668_FIXUP_DELL_XPS13),
11826 	SND_PCI_QUIRK(0x1028, 0x060a, "Dell XPS 13", ALC668_FIXUP_DELL_XPS13),
11827 	SND_PCI_QUIRK(0x1028, 0x060d, "Dell M3800", ALC668_FIXUP_DELL_XPS13),
11828 	SND_PCI_QUIRK(0x1028, 0x0625, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11829 	SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11830 	SND_PCI_QUIRK(0x1028, 0x0696, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11831 	SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11832 	SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11833 	SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
11834 	SND_PCI_QUIRK(0x103c, 0x870c, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
11835 	SND_PCI_QUIRK(0x103c, 0x8719, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
11836 	SND_PCI_QUIRK(0x103c, 0x872b, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
11837 	SND_PCI_QUIRK(0x103c, 0x873e, "HP", ALC671_FIXUP_HP_HEADSET_MIC2),
11838 	SND_PCI_QUIRK(0x103c, 0x8768, "HP Slim Desktop S01", ALC671_FIXUP_HP_HEADSET_MIC2),
11839 	SND_PCI_QUIRK(0x103c, 0x877e, "HP 288 Pro G6", ALC671_FIXUP_HP_HEADSET_MIC2),
11840 	SND_PCI_QUIRK(0x103c, 0x885f, "HP 288 Pro G8", ALC671_FIXUP_HP_HEADSET_MIC2),
11841 	SND_PCI_QUIRK(0x1043, 0x1080, "Asus UX501VW", ALC668_FIXUP_HEADSET_MODE),
11842 	SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_ASUS_Nx50),
11843 	SND_PCI_QUIRK(0x1043, 0x129d, "Asus N750", ALC662_FIXUP_ASUS_Nx50),
11844 	SND_PCI_QUIRK(0x1043, 0x12ff, "ASUS G751", ALC668_FIXUP_ASUS_G751),
11845 	SND_PCI_QUIRK(0x1043, 0x13df, "Asus N550JX", ALC662_FIXUP_BASS_1A),
11846 	SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
11847 	SND_PCI_QUIRK(0x1043, 0x15a7, "ASUS UX51VZH", ALC662_FIXUP_BASS_16),
11848 	SND_PCI_QUIRK(0x1043, 0x177d, "ASUS N551", ALC668_FIXUP_ASUS_Nx51),
11849 	SND_PCI_QUIRK(0x1043, 0x17bd, "ASUS N751", ALC668_FIXUP_ASUS_Nx51),
11850 	SND_PCI_QUIRK(0x1043, 0x185d, "ASUS G551JW", ALC668_FIXUP_ASUS_NO_HEADSET_MIC),
11851 	SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71SL", ALC662_FIXUP_ASUS_MODE8),
11852 	SND_PCI_QUIRK(0x1043, 0x1b73, "ASUS N55SF", ALC662_FIXUP_BASS_16),
11853 	SND_PCI_QUIRK(0x1043, 0x1bf3, "ASUS N76VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
11854 	SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),
11855 	SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
11856 	SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
11857 	SND_PCI_QUIRK(0x14cd, 0x5003, "USI", ALC662_FIXUP_USI_HEADSET_MODE),
11858 	SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC662_FIXUP_LENOVO_MULTI_CODECS),
11859 	SND_PCI_QUIRK(0x17aa, 0x1057, "Lenovo P360", ALC897_FIXUP_HEADSET_MIC_PIN),
11860 	SND_PCI_QUIRK(0x17aa, 0x1064, "Lenovo P3 Tower", ALC897_FIXUP_HEADSET_MIC_PIN),
11861 	SND_PCI_QUIRK(0x17aa, 0x32ca, "Lenovo ThinkCentre M80", ALC897_FIXUP_HEADSET_MIC_PIN),
11862 	SND_PCI_QUIRK(0x17aa, 0x32cb, "Lenovo ThinkCentre M70", ALC897_FIXUP_HEADSET_MIC_PIN),
11863 	SND_PCI_QUIRK(0x17aa, 0x32cf, "Lenovo ThinkCentre M950", ALC897_FIXUP_HEADSET_MIC_PIN),
11864 	SND_PCI_QUIRK(0x17aa, 0x32f7, "Lenovo ThinkCentre M90", ALC897_FIXUP_HEADSET_MIC_PIN),
11865 	SND_PCI_QUIRK(0x17aa, 0x3321, "Lenovo ThinkCentre M70 Gen4", ALC897_FIXUP_HEADSET_MIC_PIN),
11866 	SND_PCI_QUIRK(0x17aa, 0x331b, "Lenovo ThinkCentre M90 Gen4", ALC897_FIXUP_HEADSET_MIC_PIN),
11867 	SND_PCI_QUIRK(0x17aa, 0x3742, "Lenovo TianYi510Pro-14IOB", ALC897_FIXUP_HEADSET_MIC_PIN2),
11868 	SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
11869 	SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
11870 	SND_PCI_QUIRK(0x1849, 0x5892, "ASRock B150M", ALC892_FIXUP_ASROCK_MOBO),
11871 	SND_PCI_QUIRK(0x19da, 0xa130, "Zotac Z68", ALC662_FIXUP_ZOTAC_Z68),
11872 	SND_PCI_QUIRK(0x1b0a, 0x01b8, "ACER Veriton", ALC662_FIXUP_ACER_VERITON),
11873 	SND_PCI_QUIRK(0x1b35, 0x1234, "CZC ET26", ALC662_FIXUP_CZC_ET26),
11874 	SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
11875 	SND_PCI_QUIRK(0x1c6c, 0x1239, "Compaq N14JP6-V2", ALC897_FIXUP_HP_HSMIC_VERB),
11876 
11877 #if 0
11878 	/* Below is a quirk table taken from the old code.
11879 	 * Basically the device should work as is without the fixup table.
11880 	 * If BIOS doesn't give a proper info, enable the corresponding
11881 	 * fixup entry.
11882 	 */
11883 	SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1),
11884 	SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3),
11885 	SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1),
11886 	SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC662_FIXUP_ASUS_MODE3),
11887 	SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
11888 	SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11889 	SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
11890 	SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC662_FIXUP_ASUS_MODE1),
11891 	SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC662_FIXUP_ASUS_MODE1),
11892 	SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11893 	SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC662_FIXUP_ASUS_MODE7),
11894 	SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC662_FIXUP_ASUS_MODE7),
11895 	SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC662_FIXUP_ASUS_MODE8),
11896 	SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC662_FIXUP_ASUS_MODE3),
11897 	SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC662_FIXUP_ASUS_MODE1),
11898 	SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11899 	SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_FIXUP_ASUS_MODE2),
11900 	SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC662_FIXUP_ASUS_MODE1),
11901 	SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11902 	SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
11903 	SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
11904 	SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11905 	SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC662_FIXUP_ASUS_MODE1),
11906 	SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC662_FIXUP_ASUS_MODE3),
11907 	SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_FIXUP_ASUS_MODE2),
11908 	SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11909 	SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC662_FIXUP_ASUS_MODE5),
11910 	SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
11911 	SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11912 	SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC662_FIXUP_ASUS_MODE1),
11913 	SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11914 	SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11915 	SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC662_FIXUP_ASUS_MODE3),
11916 	SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC662_FIXUP_ASUS_MODE3),
11917 	SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC662_FIXUP_ASUS_MODE1),
11918 	SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC662_FIXUP_ASUS_MODE1),
11919 	SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC662_FIXUP_ASUS_MODE1),
11920 	SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC662_FIXUP_ASUS_MODE1),
11921 	SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC662_FIXUP_ASUS_MODE1),
11922 	SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11923 	SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_FIXUP_ASUS_MODE2),
11924 	SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC662_FIXUP_ASUS_MODE1),
11925 	SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
11926 	SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC662_FIXUP_ASUS_MODE3),
11927 	SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC662_FIXUP_ASUS_MODE1),
11928 	SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC662_FIXUP_ASUS_MODE1),
11929 	SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC662_FIXUP_ASUS_MODE1),
11930 	SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_FIXUP_ASUS_MODE2),
11931 	SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
11932 	SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE4),
11933 #endif
11934 	{}
11935 };
11936 
11937 static const struct hda_model_fixup alc662_fixup_models[] = {
11938 	{.id = ALC662_FIXUP_ASPIRE, .name = "aspire"},
11939 	{.id = ALC662_FIXUP_IDEAPAD, .name = "ideapad"},
11940 	{.id = ALC272_FIXUP_MARIO, .name = "mario"},
11941 	{.id = ALC662_FIXUP_HP_RP5800, .name = "hp-rp5800"},
11942 	{.id = ALC662_FIXUP_ASUS_MODE1, .name = "asus-mode1"},
11943 	{.id = ALC662_FIXUP_ASUS_MODE2, .name = "asus-mode2"},
11944 	{.id = ALC662_FIXUP_ASUS_MODE3, .name = "asus-mode3"},
11945 	{.id = ALC662_FIXUP_ASUS_MODE4, .name = "asus-mode4"},
11946 	{.id = ALC662_FIXUP_ASUS_MODE5, .name = "asus-mode5"},
11947 	{.id = ALC662_FIXUP_ASUS_MODE6, .name = "asus-mode6"},
11948 	{.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},
11949 	{.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},
11950 	{.id = ALC662_FIXUP_ZOTAC_Z68, .name = "zotac-z68"},
11951 	{.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"},
11952 	{.id = ALC662_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc662-headset-multi"},
11953 	{.id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
11954 	{.id = ALC662_FIXUP_HEADSET_MODE, .name = "alc662-headset"},
11955 	{.id = ALC668_FIXUP_HEADSET_MODE, .name = "alc668-headset"},
11956 	{.id = ALC662_FIXUP_BASS_16, .name = "bass16"},
11957 	{.id = ALC662_FIXUP_BASS_1A, .name = "bass1a"},
11958 	{.id = ALC668_FIXUP_AUTO_MUTE, .name = "automute"},
11959 	{.id = ALC668_FIXUP_DELL_XPS13, .name = "dell-xps13"},
11960 	{.id = ALC662_FIXUP_ASUS_Nx50, .name = "asus-nx50"},
11961 	{.id = ALC668_FIXUP_ASUS_Nx51, .name = "asus-nx51"},
11962 	{.id = ALC668_FIXUP_ASUS_G751, .name = "asus-g751"},
11963 	{.id = ALC891_FIXUP_HEADSET_MODE, .name = "alc891-headset"},
11964 	{.id = ALC891_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc891-headset-multi"},
11965 	{.id = ALC662_FIXUP_ACER_VERITON, .name = "acer-veriton"},
11966 	{.id = ALC892_FIXUP_ASROCK_MOBO, .name = "asrock-mobo"},
11967 	{.id = ALC662_FIXUP_USI_HEADSET_MODE, .name = "usi-headset"},
11968 	{.id = ALC662_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
11969 	{.id = ALC669_FIXUP_ACER_ASPIRE_ETHOS, .name = "aspire-ethos"},
11970 	{.id = ALC897_FIXUP_UNIS_H3C_X500S, .name = "unis-h3c-x500s"},
11971 	{}
11972 };
11973 
11974 static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = {
11975 	SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
11976 		{0x17, 0x02211010},
11977 		{0x18, 0x01a19030},
11978 		{0x1a, 0x01813040},
11979 		{0x21, 0x01014020}),
11980 	SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
11981 		{0x16, 0x01813030},
11982 		{0x17, 0x02211010},
11983 		{0x18, 0x01a19040},
11984 		{0x21, 0x01014020}),
11985 	SND_HDA_PIN_QUIRK(0x10ec0662, 0x1028, "Dell", ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
11986 		{0x14, 0x01014010},
11987 		{0x18, 0x01a19020},
11988 		{0x1a, 0x0181302f},
11989 		{0x1b, 0x0221401f}),
11990 	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
11991 		{0x12, 0x99a30130},
11992 		{0x14, 0x90170110},
11993 		{0x15, 0x0321101f},
11994 		{0x16, 0x03011020}),
11995 	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
11996 		{0x12, 0x99a30140},
11997 		{0x14, 0x90170110},
11998 		{0x15, 0x0321101f},
11999 		{0x16, 0x03011020}),
12000 	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
12001 		{0x12, 0x99a30150},
12002 		{0x14, 0x90170110},
12003 		{0x15, 0x0321101f},
12004 		{0x16, 0x03011020}),
12005 	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
12006 		{0x14, 0x90170110},
12007 		{0x15, 0x0321101f},
12008 		{0x16, 0x03011020}),
12009 	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell XPS 15", ALC668_FIXUP_AUTO_MUTE,
12010 		{0x12, 0x90a60130},
12011 		{0x14, 0x90170110},
12012 		{0x15, 0x0321101f}),
12013 	SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
12014 		{0x14, 0x01014010},
12015 		{0x17, 0x90170150},
12016 		{0x19, 0x02a11060},
12017 		{0x1b, 0x01813030},
12018 		{0x21, 0x02211020}),
12019 	SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
12020 		{0x14, 0x01014010},
12021 		{0x18, 0x01a19040},
12022 		{0x1b, 0x01813030},
12023 		{0x21, 0x02211020}),
12024 	SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
12025 		{0x14, 0x01014020},
12026 		{0x17, 0x90170110},
12027 		{0x18, 0x01a19050},
12028 		{0x1b, 0x01813040},
12029 		{0x21, 0x02211030}),
12030 	{}
12031 };
12032 
12033 /*
12034  */
12035 static int patch_alc662(struct hda_codec *codec)
12036 {
12037 	struct alc_spec *spec;
12038 	int err;
12039 
12040 	err = alc_alloc_spec(codec, 0x0b);
12041 	if (err < 0)
12042 		return err;
12043 
12044 	spec = codec->spec;
12045 
12046 	spec->shutup = alc_eapd_shutup;
12047 
12048 	/* handle multiple HPs as is */
12049 	spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
12050 
12051 	alc_fix_pll_init(codec, 0x20, 0x04, 15);
12052 
12053 	switch (codec->core.vendor_id) {
12054 	case 0x10ec0668:
12055 		spec->init_hook = alc668_restore_default_value;
12056 		break;
12057 	}
12058 
12059 	alc_pre_init(codec);
12060 
12061 	snd_hda_pick_fixup(codec, alc662_fixup_models,
12062 		       alc662_fixup_tbl, alc662_fixups);
12063 	snd_hda_pick_pin_fixup(codec, alc662_pin_fixup_tbl, alc662_fixups, true);
12064 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
12065 
12066 	alc_auto_parse_customize_define(codec);
12067 
12068 	if (has_cdefine_beep(codec))
12069 		spec->gen.beep_nid = 0x01;
12070 
12071 	if ((alc_get_coef0(codec) & (1 << 14)) &&
12072 	    codec->bus->pci && codec->bus->pci->subsystem_vendor == 0x1025 &&
12073 	    spec->cdefine.platform_type == 1) {
12074 		err = alc_codec_rename(codec, "ALC272X");
12075 		if (err < 0)
12076 			goto error;
12077 	}
12078 
12079 	/* automatic parse from the BIOS config */
12080 	err = alc662_parse_auto_config(codec);
12081 	if (err < 0)
12082 		goto error;
12083 
12084 	if (!spec->gen.no_analog && spec->gen.beep_nid) {
12085 		switch (codec->core.vendor_id) {
12086 		case 0x10ec0662:
12087 			err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
12088 			break;
12089 		case 0x10ec0272:
12090 		case 0x10ec0663:
12091 		case 0x10ec0665:
12092 		case 0x10ec0668:
12093 			err = set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
12094 			break;
12095 		case 0x10ec0273:
12096 			err = set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
12097 			break;
12098 		}
12099 		if (err < 0)
12100 			goto error;
12101 	}
12102 
12103 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
12104 
12105 	return 0;
12106 
12107  error:
12108 	alc_free(codec);
12109 	return err;
12110 }
12111 
12112 /*
12113  * ALC680 support
12114  */
12115 
12116 static int alc680_parse_auto_config(struct hda_codec *codec)
12117 {
12118 	return alc_parse_auto_config(codec, NULL, NULL);
12119 }
12120 
12121 /*
12122  */
12123 static int patch_alc680(struct hda_codec *codec)
12124 {
12125 	int err;
12126 
12127 	/* ALC680 has no aa-loopback mixer */
12128 	err = alc_alloc_spec(codec, 0);
12129 	if (err < 0)
12130 		return err;
12131 
12132 	/* automatic parse from the BIOS config */
12133 	err = alc680_parse_auto_config(codec);
12134 	if (err < 0) {
12135 		alc_free(codec);
12136 		return err;
12137 	}
12138 
12139 	return 0;
12140 }
12141 
12142 /*
12143  * patch entries
12144  */
12145 static const struct hda_device_id snd_hda_id_realtek[] = {
12146 	HDA_CODEC_ENTRY(0x10ec0215, "ALC215", patch_alc269),
12147 	HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269),
12148 	HDA_CODEC_ENTRY(0x10ec0222, "ALC222", patch_alc269),
12149 	HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269),
12150 	HDA_CODEC_ENTRY(0x10ec0230, "ALC236", patch_alc269),
12151 	HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269),
12152 	HDA_CODEC_ENTRY(0x10ec0233, "ALC233", patch_alc269),
12153 	HDA_CODEC_ENTRY(0x10ec0234, "ALC234", patch_alc269),
12154 	HDA_CODEC_ENTRY(0x10ec0235, "ALC233", patch_alc269),
12155 	HDA_CODEC_ENTRY(0x10ec0236, "ALC236", patch_alc269),
12156 	HDA_CODEC_ENTRY(0x10ec0245, "ALC245", patch_alc269),
12157 	HDA_CODEC_ENTRY(0x10ec0255, "ALC255", patch_alc269),
12158 	HDA_CODEC_ENTRY(0x10ec0256, "ALC256", patch_alc269),
12159 	HDA_CODEC_ENTRY(0x10ec0257, "ALC257", patch_alc269),
12160 	HDA_CODEC_ENTRY(0x10ec0260, "ALC260", patch_alc260),
12161 	HDA_CODEC_ENTRY(0x10ec0262, "ALC262", patch_alc262),
12162 	HDA_CODEC_ENTRY(0x10ec0267, "ALC267", patch_alc268),
12163 	HDA_CODEC_ENTRY(0x10ec0268, "ALC268", patch_alc268),
12164 	HDA_CODEC_ENTRY(0x10ec0269, "ALC269", patch_alc269),
12165 	HDA_CODEC_ENTRY(0x10ec0270, "ALC270", patch_alc269),
12166 	HDA_CODEC_ENTRY(0x10ec0272, "ALC272", patch_alc662),
12167 	HDA_CODEC_ENTRY(0x10ec0274, "ALC274", patch_alc269),
12168 	HDA_CODEC_ENTRY(0x10ec0275, "ALC275", patch_alc269),
12169 	HDA_CODEC_ENTRY(0x10ec0276, "ALC276", patch_alc269),
12170 	HDA_CODEC_ENTRY(0x10ec0280, "ALC280", patch_alc269),
12171 	HDA_CODEC_ENTRY(0x10ec0282, "ALC282", patch_alc269),
12172 	HDA_CODEC_ENTRY(0x10ec0283, "ALC283", patch_alc269),
12173 	HDA_CODEC_ENTRY(0x10ec0284, "ALC284", patch_alc269),
12174 	HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269),
12175 	HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269),
12176 	HDA_CODEC_ENTRY(0x10ec0287, "ALC287", patch_alc269),
12177 	HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269),
12178 	HDA_CODEC_ENTRY(0x10ec0289, "ALC289", patch_alc269),
12179 	HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269),
12180 	HDA_CODEC_ENTRY(0x10ec0292, "ALC292", patch_alc269),
12181 	HDA_CODEC_ENTRY(0x10ec0293, "ALC293", patch_alc269),
12182 	HDA_CODEC_ENTRY(0x10ec0294, "ALC294", patch_alc269),
12183 	HDA_CODEC_ENTRY(0x10ec0295, "ALC295", patch_alc269),
12184 	HDA_CODEC_ENTRY(0x10ec0298, "ALC298", patch_alc269),
12185 	HDA_CODEC_ENTRY(0x10ec0299, "ALC299", patch_alc269),
12186 	HDA_CODEC_ENTRY(0x10ec0300, "ALC300", patch_alc269),
12187 	HDA_CODEC_ENTRY(0x10ec0623, "ALC623", patch_alc269),
12188 	HDA_CODEC_REV_ENTRY(0x10ec0861, 0x100340, "ALC660", patch_alc861),
12189 	HDA_CODEC_ENTRY(0x10ec0660, "ALC660-VD", patch_alc861vd),
12190 	HDA_CODEC_ENTRY(0x10ec0861, "ALC861", patch_alc861),
12191 	HDA_CODEC_ENTRY(0x10ec0862, "ALC861-VD", patch_alc861vd),
12192 	HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100002, "ALC662 rev2", patch_alc882),
12193 	HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100101, "ALC662 rev1", patch_alc662),
12194 	HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100300, "ALC662 rev3", patch_alc662),
12195 	HDA_CODEC_ENTRY(0x10ec0663, "ALC663", patch_alc662),
12196 	HDA_CODEC_ENTRY(0x10ec0665, "ALC665", patch_alc662),
12197 	HDA_CODEC_ENTRY(0x10ec0667, "ALC667", patch_alc662),
12198 	HDA_CODEC_ENTRY(0x10ec0668, "ALC668", patch_alc662),
12199 	HDA_CODEC_ENTRY(0x10ec0670, "ALC670", patch_alc662),
12200 	HDA_CODEC_ENTRY(0x10ec0671, "ALC671", patch_alc662),
12201 	HDA_CODEC_ENTRY(0x10ec0680, "ALC680", patch_alc680),
12202 	HDA_CODEC_ENTRY(0x10ec0700, "ALC700", patch_alc269),
12203 	HDA_CODEC_ENTRY(0x10ec0701, "ALC701", patch_alc269),
12204 	HDA_CODEC_ENTRY(0x10ec0703, "ALC703", patch_alc269),
12205 	HDA_CODEC_ENTRY(0x10ec0711, "ALC711", patch_alc269),
12206 	HDA_CODEC_ENTRY(0x10ec0867, "ALC891", patch_alc662),
12207 	HDA_CODEC_ENTRY(0x10ec0880, "ALC880", patch_alc880),
12208 	HDA_CODEC_ENTRY(0x10ec0882, "ALC882", patch_alc882),
12209 	HDA_CODEC_ENTRY(0x10ec0883, "ALC883", patch_alc882),
12210 	HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100101, "ALC889A", patch_alc882),
12211 	HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100103, "ALC889A", patch_alc882),
12212 	HDA_CODEC_ENTRY(0x10ec0885, "ALC885", patch_alc882),
12213 	HDA_CODEC_ENTRY(0x10ec0887, "ALC887", patch_alc882),
12214 	HDA_CODEC_REV_ENTRY(0x10ec0888, 0x100101, "ALC1200", patch_alc882),
12215 	HDA_CODEC_ENTRY(0x10ec0888, "ALC888", patch_alc882),
12216 	HDA_CODEC_ENTRY(0x10ec0889, "ALC889", patch_alc882),
12217 	HDA_CODEC_ENTRY(0x10ec0892, "ALC892", patch_alc662),
12218 	HDA_CODEC_ENTRY(0x10ec0897, "ALC897", patch_alc662),
12219 	HDA_CODEC_ENTRY(0x10ec0899, "ALC898", patch_alc882),
12220 	HDA_CODEC_ENTRY(0x10ec0900, "ALC1150", patch_alc882),
12221 	HDA_CODEC_ENTRY(0x10ec0b00, "ALCS1200A", patch_alc882),
12222 	HDA_CODEC_ENTRY(0x10ec1168, "ALC1220", patch_alc882),
12223 	HDA_CODEC_ENTRY(0x10ec1220, "ALC1220", patch_alc882),
12224 	HDA_CODEC_ENTRY(0x19e58326, "HW8326", patch_alc269),
12225 	{} /* terminator */
12226 };
12227 MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_realtek);
12228 
12229 MODULE_LICENSE("GPL");
12230 MODULE_DESCRIPTION("Realtek HD-audio codec");
12231 
12232 static struct hda_codec_driver realtek_driver = {
12233 	.id = snd_hda_id_realtek,
12234 };
12235 
12236 module_hda_codec_driver(realtek_driver);
12237