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