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