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