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