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