xref: /openbmc/linux/sound/pci/hda/patch_realtek.c (revision 9977a8c3497a8f7f7f951994f298a8e4d961234f)
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 }
3134 
3135 static void alc256_shutup(struct hda_codec *codec)
3136 {
3137 	struct alc_spec *spec = codec->spec;
3138 	hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
3139 	bool hp_pin_sense;
3140 
3141 	if (!hp_pin) {
3142 		alc269_shutup(codec);
3143 		return;
3144 	}
3145 
3146 	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3147 
3148 	if (hp_pin_sense)
3149 		msleep(2);
3150 
3151 	snd_hda_codec_write(codec, hp_pin, 0,
3152 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3153 
3154 	if (hp_pin_sense)
3155 		msleep(85);
3156 
3157 	/* 3k pull low control for Headset jack. */
3158 	/* NOTE: call this before clearing the pin, otherwise codec stalls */
3159 	alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
3160 
3161 	snd_hda_codec_write(codec, hp_pin, 0,
3162 			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3163 
3164 	if (hp_pin_sense)
3165 		msleep(100);
3166 
3167 	alc_auto_setup_eapd(codec, false);
3168 	snd_hda_shutup_pins(codec);
3169 }
3170 
3171 static void alc225_init(struct hda_codec *codec)
3172 {
3173 	struct alc_spec *spec = codec->spec;
3174 	hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
3175 	bool hp1_pin_sense, hp2_pin_sense;
3176 
3177 	if (!hp_pin)
3178 		return;
3179 
3180 	msleep(30);
3181 
3182 	hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3183 	hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3184 
3185 	if (hp1_pin_sense || hp2_pin_sense)
3186 		msleep(2);
3187 
3188 	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
3189 
3190 	if (hp1_pin_sense)
3191 		snd_hda_codec_write(codec, hp_pin, 0,
3192 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3193 	if (hp2_pin_sense)
3194 		snd_hda_codec_write(codec, 0x16, 0,
3195 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3196 
3197 	if (hp1_pin_sense || hp2_pin_sense)
3198 		msleep(85);
3199 
3200 	if (hp1_pin_sense)
3201 		snd_hda_codec_write(codec, hp_pin, 0,
3202 			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3203 	if (hp2_pin_sense)
3204 		snd_hda_codec_write(codec, 0x16, 0,
3205 			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3206 
3207 	if (hp1_pin_sense || hp2_pin_sense)
3208 		msleep(100);
3209 
3210 	alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3211 	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
3212 }
3213 
3214 static void alc225_shutup(struct hda_codec *codec)
3215 {
3216 	struct alc_spec *spec = codec->spec;
3217 	hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
3218 	bool hp1_pin_sense, hp2_pin_sense;
3219 
3220 	if (!hp_pin) {
3221 		alc269_shutup(codec);
3222 		return;
3223 	}
3224 
3225 	/* 3k pull low control for Headset jack. */
3226 	alc_update_coef_idx(codec, 0x4a, 0, 3 << 10);
3227 
3228 	hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3229 	hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3230 
3231 	if (hp1_pin_sense || hp2_pin_sense)
3232 		msleep(2);
3233 
3234 	if (hp1_pin_sense)
3235 		snd_hda_codec_write(codec, hp_pin, 0,
3236 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3237 	if (hp2_pin_sense)
3238 		snd_hda_codec_write(codec, 0x16, 0,
3239 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3240 
3241 	if (hp1_pin_sense || hp2_pin_sense)
3242 		msleep(85);
3243 
3244 	if (hp1_pin_sense)
3245 		snd_hda_codec_write(codec, hp_pin, 0,
3246 			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3247 	if (hp2_pin_sense)
3248 		snd_hda_codec_write(codec, 0x16, 0,
3249 			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3250 
3251 	if (hp1_pin_sense || hp2_pin_sense)
3252 		msleep(100);
3253 
3254 	alc_auto_setup_eapd(codec, false);
3255 	snd_hda_shutup_pins(codec);
3256 }
3257 
3258 static void alc_default_init(struct hda_codec *codec)
3259 {
3260 	struct alc_spec *spec = codec->spec;
3261 	hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
3262 	bool hp_pin_sense;
3263 
3264 	if (!hp_pin)
3265 		return;
3266 
3267 	msleep(30);
3268 
3269 	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3270 
3271 	if (hp_pin_sense)
3272 		msleep(2);
3273 
3274 	snd_hda_codec_write(codec, hp_pin, 0,
3275 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3276 
3277 	if (hp_pin_sense)
3278 		msleep(85);
3279 
3280 	snd_hda_codec_write(codec, hp_pin, 0,
3281 			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3282 
3283 	if (hp_pin_sense)
3284 		msleep(100);
3285 }
3286 
3287 static void alc_default_shutup(struct hda_codec *codec)
3288 {
3289 	struct alc_spec *spec = codec->spec;
3290 	hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
3291 	bool hp_pin_sense;
3292 
3293 	if (!hp_pin) {
3294 		alc269_shutup(codec);
3295 		return;
3296 	}
3297 
3298 	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3299 
3300 	if (hp_pin_sense)
3301 		msleep(2);
3302 
3303 	snd_hda_codec_write(codec, hp_pin, 0,
3304 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3305 
3306 	if (hp_pin_sense)
3307 		msleep(85);
3308 
3309 	snd_hda_codec_write(codec, hp_pin, 0,
3310 			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3311 
3312 	if (hp_pin_sense)
3313 		msleep(100);
3314 
3315 	alc_auto_setup_eapd(codec, false);
3316 	snd_hda_shutup_pins(codec);
3317 }
3318 
3319 static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg,
3320 			     unsigned int val)
3321 {
3322 	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3323 	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val & 0xffff); /* LSB */
3324 	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val >> 16); /* MSB */
3325 }
3326 
3327 static int alc5505_coef_get(struct hda_codec *codec, unsigned int index_reg)
3328 {
3329 	unsigned int val;
3330 
3331 	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3332 	val = snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3333 		& 0xffff;
3334 	val |= snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3335 		<< 16;
3336 	return val;
3337 }
3338 
3339 static void alc5505_dsp_halt(struct hda_codec *codec)
3340 {
3341 	unsigned int val;
3342 
3343 	alc5505_coef_set(codec, 0x3000, 0x000c); /* DSP CPU stop */
3344 	alc5505_coef_set(codec, 0x880c, 0x0008); /* DDR enter self refresh */
3345 	alc5505_coef_set(codec, 0x61c0, 0x11110080); /* Clock control for PLL and CPU */
3346 	alc5505_coef_set(codec, 0x6230, 0xfc0d4011); /* Disable Input OP */
3347 	alc5505_coef_set(codec, 0x61b4, 0x040a2b03); /* Stop PLL2 */
3348 	alc5505_coef_set(codec, 0x61b0, 0x00005b17); /* Stop PLL1 */
3349 	alc5505_coef_set(codec, 0x61b8, 0x04133303); /* Stop PLL3 */
3350 	val = alc5505_coef_get(codec, 0x6220);
3351 	alc5505_coef_set(codec, 0x6220, (val | 0x3000)); /* switch Ringbuffer clock to DBUS clock */
3352 }
3353 
3354 static void alc5505_dsp_back_from_halt(struct hda_codec *codec)
3355 {
3356 	alc5505_coef_set(codec, 0x61b8, 0x04133302);
3357 	alc5505_coef_set(codec, 0x61b0, 0x00005b16);
3358 	alc5505_coef_set(codec, 0x61b4, 0x040a2b02);
3359 	alc5505_coef_set(codec, 0x6230, 0xf80d4011);
3360 	alc5505_coef_set(codec, 0x6220, 0x2002010f);
3361 	alc5505_coef_set(codec, 0x880c, 0x00000004);
3362 }
3363 
3364 static void alc5505_dsp_init(struct hda_codec *codec)
3365 {
3366 	unsigned int val;
3367 
3368 	alc5505_dsp_halt(codec);
3369 	alc5505_dsp_back_from_halt(codec);
3370 	alc5505_coef_set(codec, 0x61b0, 0x5b14); /* PLL1 control */
3371 	alc5505_coef_set(codec, 0x61b0, 0x5b16);
3372 	alc5505_coef_set(codec, 0x61b4, 0x04132b00); /* PLL2 control */
3373 	alc5505_coef_set(codec, 0x61b4, 0x04132b02);
3374 	alc5505_coef_set(codec, 0x61b8, 0x041f3300); /* PLL3 control*/
3375 	alc5505_coef_set(codec, 0x61b8, 0x041f3302);
3376 	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_CODEC_RESET, 0); /* Function reset */
3377 	alc5505_coef_set(codec, 0x61b8, 0x041b3302);
3378 	alc5505_coef_set(codec, 0x61b8, 0x04173302);
3379 	alc5505_coef_set(codec, 0x61b8, 0x04163302);
3380 	alc5505_coef_set(codec, 0x8800, 0x348b328b); /* DRAM control */
3381 	alc5505_coef_set(codec, 0x8808, 0x00020022); /* DRAM control */
3382 	alc5505_coef_set(codec, 0x8818, 0x00000400); /* DRAM control */
3383 
3384 	val = alc5505_coef_get(codec, 0x6200) >> 16; /* Read revision ID */
3385 	if (val <= 3)
3386 		alc5505_coef_set(codec, 0x6220, 0x2002010f); /* I/O PAD Configuration */
3387 	else
3388 		alc5505_coef_set(codec, 0x6220, 0x6002018f);
3389 
3390 	alc5505_coef_set(codec, 0x61ac, 0x055525f0); /**/
3391 	alc5505_coef_set(codec, 0x61c0, 0x12230080); /* Clock control */
3392 	alc5505_coef_set(codec, 0x61b4, 0x040e2b02); /* PLL2 control */
3393 	alc5505_coef_set(codec, 0x61bc, 0x010234f8); /* OSC Control */
3394 	alc5505_coef_set(codec, 0x880c, 0x00000004); /* DRAM Function control */
3395 	alc5505_coef_set(codec, 0x880c, 0x00000003);
3396 	alc5505_coef_set(codec, 0x880c, 0x00000010);
3397 
3398 #ifdef HALT_REALTEK_ALC5505
3399 	alc5505_dsp_halt(codec);
3400 #endif
3401 }
3402 
3403 #ifdef HALT_REALTEK_ALC5505
3404 #define alc5505_dsp_suspend(codec)	/* NOP */
3405 #define alc5505_dsp_resume(codec)	/* NOP */
3406 #else
3407 #define alc5505_dsp_suspend(codec)	alc5505_dsp_halt(codec)
3408 #define alc5505_dsp_resume(codec)	alc5505_dsp_back_from_halt(codec)
3409 #endif
3410 
3411 #ifdef CONFIG_PM
3412 static int alc269_suspend(struct hda_codec *codec)
3413 {
3414 	struct alc_spec *spec = codec->spec;
3415 
3416 	if (spec->has_alc5505_dsp)
3417 		alc5505_dsp_suspend(codec);
3418 	return alc_suspend(codec);
3419 }
3420 
3421 static int alc269_resume(struct hda_codec *codec)
3422 {
3423 	struct alc_spec *spec = codec->spec;
3424 
3425 	if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3426 		alc269vb_toggle_power_output(codec, 0);
3427 	if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
3428 			(alc_get_coef0(codec) & 0x00ff) == 0x018) {
3429 		msleep(150);
3430 	}
3431 
3432 	codec->patch_ops.init(codec);
3433 
3434 	if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3435 		alc269vb_toggle_power_output(codec, 1);
3436 	if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
3437 			(alc_get_coef0(codec) & 0x00ff) == 0x017) {
3438 		msleep(200);
3439 	}
3440 
3441 	regcache_sync(codec->core.regmap);
3442 	hda_call_check_power_status(codec, 0x01);
3443 
3444 	/* on some machine, the BIOS will clear the codec gpio data when enter
3445 	 * suspend, and won't restore the data after resume, so we restore it
3446 	 * in the driver.
3447 	 */
3448 	if (spec->gpio_led)
3449 		snd_hda_codec_write(codec, codec->core.afg, 0, AC_VERB_SET_GPIO_DATA,
3450 			    spec->gpio_led);
3451 
3452 	if (spec->has_alc5505_dsp)
3453 		alc5505_dsp_resume(codec);
3454 
3455 	return 0;
3456 }
3457 #endif /* CONFIG_PM */
3458 
3459 static void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec,
3460 						 const struct hda_fixup *fix, int action)
3461 {
3462 	struct alc_spec *spec = codec->spec;
3463 
3464 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
3465 		spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
3466 }
3467 
3468 static void alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec *codec,
3469 						 const struct hda_fixup *fix,
3470 						 int action)
3471 {
3472 	unsigned int cfg_headphone = snd_hda_codec_get_pincfg(codec, 0x21);
3473 	unsigned int cfg_headset_mic = snd_hda_codec_get_pincfg(codec, 0x19);
3474 
3475 	if (cfg_headphone && cfg_headset_mic == 0x411111f0)
3476 		snd_hda_codec_set_pincfg(codec, 0x19,
3477 			(cfg_headphone & ~AC_DEFCFG_DEVICE) |
3478 			(AC_JACK_MIC_IN << AC_DEFCFG_DEVICE_SHIFT));
3479 }
3480 
3481 static void alc269_fixup_hweq(struct hda_codec *codec,
3482 			       const struct hda_fixup *fix, int action)
3483 {
3484 	if (action == HDA_FIXUP_ACT_INIT)
3485 		alc_update_coef_idx(codec, 0x1e, 0, 0x80);
3486 }
3487 
3488 static void alc269_fixup_headset_mic(struct hda_codec *codec,
3489 				       const struct hda_fixup *fix, int action)
3490 {
3491 	struct alc_spec *spec = codec->spec;
3492 
3493 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
3494 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
3495 }
3496 
3497 static void alc271_fixup_dmic(struct hda_codec *codec,
3498 			      const struct hda_fixup *fix, int action)
3499 {
3500 	static const struct hda_verb verbs[] = {
3501 		{0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
3502 		{0x20, AC_VERB_SET_PROC_COEF, 0x4000},
3503 		{}
3504 	};
3505 	unsigned int cfg;
3506 
3507 	if (strcmp(codec->core.chip_name, "ALC271X") &&
3508 	    strcmp(codec->core.chip_name, "ALC269VB"))
3509 		return;
3510 	cfg = snd_hda_codec_get_pincfg(codec, 0x12);
3511 	if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED)
3512 		snd_hda_sequence_write(codec, verbs);
3513 }
3514 
3515 static void alc269_fixup_pcm_44k(struct hda_codec *codec,
3516 				 const struct hda_fixup *fix, int action)
3517 {
3518 	struct alc_spec *spec = codec->spec;
3519 
3520 	if (action != HDA_FIXUP_ACT_PROBE)
3521 		return;
3522 
3523 	/* Due to a hardware problem on Lenovo Ideadpad, we need to
3524 	 * fix the sample rate of analog I/O to 44.1kHz
3525 	 */
3526 	spec->gen.stream_analog_playback = &alc269_44k_pcm_analog_playback;
3527 	spec->gen.stream_analog_capture = &alc269_44k_pcm_analog_capture;
3528 }
3529 
3530 static void alc269_fixup_stereo_dmic(struct hda_codec *codec,
3531 				     const struct hda_fixup *fix, int action)
3532 {
3533 	/* The digital-mic unit sends PDM (differential signal) instead of
3534 	 * the standard PCM, thus you can't record a valid mono stream as is.
3535 	 * Below is a workaround specific to ALC269 to control the dmic
3536 	 * signal source as mono.
3537 	 */
3538 	if (action == HDA_FIXUP_ACT_INIT)
3539 		alc_update_coef_idx(codec, 0x07, 0, 0x80);
3540 }
3541 
3542 static void alc269_quanta_automute(struct hda_codec *codec)
3543 {
3544 	snd_hda_gen_update_outputs(codec);
3545 
3546 	alc_write_coef_idx(codec, 0x0c, 0x680);
3547 	alc_write_coef_idx(codec, 0x0c, 0x480);
3548 }
3549 
3550 static void alc269_fixup_quanta_mute(struct hda_codec *codec,
3551 				     const struct hda_fixup *fix, int action)
3552 {
3553 	struct alc_spec *spec = codec->spec;
3554 	if (action != HDA_FIXUP_ACT_PROBE)
3555 		return;
3556 	spec->gen.automute_hook = alc269_quanta_automute;
3557 }
3558 
3559 static void alc269_x101_hp_automute_hook(struct hda_codec *codec,
3560 					 struct hda_jack_callback *jack)
3561 {
3562 	struct alc_spec *spec = codec->spec;
3563 	int vref;
3564 	msleep(200);
3565 	snd_hda_gen_hp_automute(codec, jack);
3566 
3567 	vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
3568 	msleep(100);
3569 	snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
3570 			    vref);
3571 	msleep(500);
3572 	snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
3573 			    vref);
3574 }
3575 
3576 static void alc269_fixup_x101_headset_mic(struct hda_codec *codec,
3577 				     const struct hda_fixup *fix, int action)
3578 {
3579 	struct alc_spec *spec = codec->spec;
3580 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3581 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
3582 		spec->gen.hp_automute_hook = alc269_x101_hp_automute_hook;
3583 	}
3584 }
3585 
3586 
3587 /* update mute-LED according to the speaker mute state via mic VREF pin */
3588 static void alc269_fixup_mic_mute_hook(void *private_data, int enabled)
3589 {
3590 	struct hda_codec *codec = private_data;
3591 	struct alc_spec *spec = codec->spec;
3592 	unsigned int pinval;
3593 
3594 	if (spec->mute_led_polarity)
3595 		enabled = !enabled;
3596 	pinval = snd_hda_codec_get_pin_target(codec, spec->mute_led_nid);
3597 	pinval &= ~AC_PINCTL_VREFEN;
3598 	pinval |= enabled ? AC_PINCTL_VREF_HIZ : AC_PINCTL_VREF_80;
3599 	if (spec->mute_led_nid)
3600 		snd_hda_set_pin_ctl_cache(codec, spec->mute_led_nid, pinval);
3601 }
3602 
3603 /* Make sure the led works even in runtime suspend */
3604 static unsigned int led_power_filter(struct hda_codec *codec,
3605 						  hda_nid_t nid,
3606 						  unsigned int power_state)
3607 {
3608 	struct alc_spec *spec = codec->spec;
3609 
3610 	if (power_state != AC_PWRST_D3 || nid == 0 ||
3611 	    (nid != spec->mute_led_nid && nid != spec->cap_mute_led_nid))
3612 		return power_state;
3613 
3614 	/* Set pin ctl again, it might have just been set to 0 */
3615 	snd_hda_set_pin_ctl(codec, nid,
3616 			    snd_hda_codec_get_pin_target(codec, nid));
3617 
3618 	return snd_hda_gen_path_power_filter(codec, nid, power_state);
3619 }
3620 
3621 static void alc269_fixup_hp_mute_led(struct hda_codec *codec,
3622 				     const struct hda_fixup *fix, int action)
3623 {
3624 	struct alc_spec *spec = codec->spec;
3625 	const struct dmi_device *dev = NULL;
3626 
3627 	if (action != HDA_FIXUP_ACT_PRE_PROBE)
3628 		return;
3629 
3630 	while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) {
3631 		int pol, pin;
3632 		if (sscanf(dev->name, "HP_Mute_LED_%d_%x", &pol, &pin) != 2)
3633 			continue;
3634 		if (pin < 0x0a || pin >= 0x10)
3635 			break;
3636 		spec->mute_led_polarity = pol;
3637 		spec->mute_led_nid = pin - 0x0a + 0x18;
3638 		spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook;
3639 		spec->gen.vmaster_mute_enum = 1;
3640 		codec->power_filter = led_power_filter;
3641 		codec_dbg(codec,
3642 			  "Detected mute LED for %x:%d\n", spec->mute_led_nid,
3643 			   spec->mute_led_polarity);
3644 		break;
3645 	}
3646 }
3647 
3648 static void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec,
3649 				const struct hda_fixup *fix, int action)
3650 {
3651 	struct alc_spec *spec = codec->spec;
3652 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3653 		spec->mute_led_polarity = 0;
3654 		spec->mute_led_nid = 0x18;
3655 		spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook;
3656 		spec->gen.vmaster_mute_enum = 1;
3657 		codec->power_filter = led_power_filter;
3658 	}
3659 }
3660 
3661 static void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec,
3662 				const struct hda_fixup *fix, int action)
3663 {
3664 	struct alc_spec *spec = codec->spec;
3665 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3666 		spec->mute_led_polarity = 0;
3667 		spec->mute_led_nid = 0x19;
3668 		spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook;
3669 		spec->gen.vmaster_mute_enum = 1;
3670 		codec->power_filter = led_power_filter;
3671 	}
3672 }
3673 
3674 /* update LED status via GPIO */
3675 static void alc_update_gpio_led(struct hda_codec *codec, unsigned int mask,
3676 				bool enabled)
3677 {
3678 	struct alc_spec *spec = codec->spec;
3679 	unsigned int oldval = spec->gpio_led;
3680 
3681 	if (spec->mute_led_polarity)
3682 		enabled = !enabled;
3683 
3684 	if (enabled)
3685 		spec->gpio_led &= ~mask;
3686 	else
3687 		spec->gpio_led |= mask;
3688 	if (spec->gpio_led != oldval)
3689 		snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
3690 				    spec->gpio_led);
3691 }
3692 
3693 /* turn on/off mute LED via GPIO per vmaster hook */
3694 static void alc_fixup_gpio_mute_hook(void *private_data, int enabled)
3695 {
3696 	struct hda_codec *codec = private_data;
3697 	struct alc_spec *spec = codec->spec;
3698 
3699 	alc_update_gpio_led(codec, spec->gpio_mute_led_mask, enabled);
3700 }
3701 
3702 /* turn on/off mic-mute LED via GPIO per capture hook */
3703 static void alc_fixup_gpio_mic_mute_hook(struct hda_codec *codec,
3704 					 struct snd_kcontrol *kcontrol,
3705 					 struct snd_ctl_elem_value *ucontrol)
3706 {
3707 	struct alc_spec *spec = codec->spec;
3708 
3709 	if (ucontrol)
3710 		alc_update_gpio_led(codec, spec->gpio_mic_led_mask,
3711 				    ucontrol->value.integer.value[0] ||
3712 				    ucontrol->value.integer.value[1]);
3713 }
3714 
3715 static void alc269_fixup_hp_gpio_led(struct hda_codec *codec,
3716 				const struct hda_fixup *fix, int action)
3717 {
3718 	struct alc_spec *spec = codec->spec;
3719 	static const struct hda_verb gpio_init[] = {
3720 		{ 0x01, AC_VERB_SET_GPIO_MASK, 0x18 },
3721 		{ 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x18 },
3722 		{}
3723 	};
3724 
3725 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3726 		spec->gen.vmaster_mute.hook = alc_fixup_gpio_mute_hook;
3727 		spec->gen.cap_sync_hook = alc_fixup_gpio_mic_mute_hook;
3728 		spec->gpio_led = 0;
3729 		spec->mute_led_polarity = 0;
3730 		spec->gpio_mute_led_mask = 0x08;
3731 		spec->gpio_mic_led_mask = 0x10;
3732 		snd_hda_add_verbs(codec, gpio_init);
3733 	}
3734 }
3735 
3736 static void alc286_fixup_hp_gpio_led(struct hda_codec *codec,
3737 				const struct hda_fixup *fix, int action)
3738 {
3739 	struct alc_spec *spec = codec->spec;
3740 	static const struct hda_verb gpio_init[] = {
3741 		{ 0x01, AC_VERB_SET_GPIO_MASK, 0x22 },
3742 		{ 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x22 },
3743 		{}
3744 	};
3745 
3746 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3747 		spec->gen.vmaster_mute.hook = alc_fixup_gpio_mute_hook;
3748 		spec->gen.cap_sync_hook = alc_fixup_gpio_mic_mute_hook;
3749 		spec->gpio_led = 0;
3750 		spec->mute_led_polarity = 0;
3751 		spec->gpio_mute_led_mask = 0x02;
3752 		spec->gpio_mic_led_mask = 0x20;
3753 		snd_hda_add_verbs(codec, gpio_init);
3754 	}
3755 }
3756 
3757 /* turn on/off mic-mute LED per capture hook */
3758 static void alc269_fixup_hp_cap_mic_mute_hook(struct hda_codec *codec,
3759 					       struct snd_kcontrol *kcontrol,
3760 					       struct snd_ctl_elem_value *ucontrol)
3761 {
3762 	struct alc_spec *spec = codec->spec;
3763 	unsigned int pinval, enable, disable;
3764 
3765 	pinval = snd_hda_codec_get_pin_target(codec, spec->cap_mute_led_nid);
3766 	pinval &= ~AC_PINCTL_VREFEN;
3767 	enable  = pinval | AC_PINCTL_VREF_80;
3768 	disable = pinval | AC_PINCTL_VREF_HIZ;
3769 
3770 	if (!ucontrol)
3771 		return;
3772 
3773 	if (ucontrol->value.integer.value[0] ||
3774 	    ucontrol->value.integer.value[1])
3775 		pinval = disable;
3776 	else
3777 		pinval = enable;
3778 
3779 	if (spec->cap_mute_led_nid)
3780 		snd_hda_set_pin_ctl_cache(codec, spec->cap_mute_led_nid, pinval);
3781 }
3782 
3783 static void alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec,
3784 				const struct hda_fixup *fix, int action)
3785 {
3786 	struct alc_spec *spec = codec->spec;
3787 	static const struct hda_verb gpio_init[] = {
3788 		{ 0x01, AC_VERB_SET_GPIO_MASK, 0x08 },
3789 		{ 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x08 },
3790 		{}
3791 	};
3792 
3793 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3794 		spec->gen.vmaster_mute.hook = alc_fixup_gpio_mute_hook;
3795 		spec->gen.cap_sync_hook = alc269_fixup_hp_cap_mic_mute_hook;
3796 		spec->gpio_led = 0;
3797 		spec->mute_led_polarity = 0;
3798 		spec->gpio_mute_led_mask = 0x08;
3799 		spec->cap_mute_led_nid = 0x18;
3800 		snd_hda_add_verbs(codec, gpio_init);
3801 		codec->power_filter = led_power_filter;
3802 	}
3803 }
3804 
3805 static void alc280_fixup_hp_gpio4(struct hda_codec *codec,
3806 				   const struct hda_fixup *fix, int action)
3807 {
3808 	/* Like hp_gpio_mic1_led, but also needs GPIO4 low to enable headphone amp */
3809 	struct alc_spec *spec = codec->spec;
3810 	static const struct hda_verb gpio_init[] = {
3811 		{ 0x01, AC_VERB_SET_GPIO_MASK, 0x18 },
3812 		{ 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x18 },
3813 		{}
3814 	};
3815 
3816 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3817 		spec->gen.vmaster_mute.hook = alc_fixup_gpio_mute_hook;
3818 		spec->gen.cap_sync_hook = alc269_fixup_hp_cap_mic_mute_hook;
3819 		spec->gpio_led = 0;
3820 		spec->mute_led_polarity = 0;
3821 		spec->gpio_mute_led_mask = 0x08;
3822 		spec->cap_mute_led_nid = 0x18;
3823 		snd_hda_add_verbs(codec, gpio_init);
3824 		codec->power_filter = led_power_filter;
3825 	}
3826 }
3827 
3828 #if IS_REACHABLE(INPUT)
3829 static void gpio2_mic_hotkey_event(struct hda_codec *codec,
3830 				   struct hda_jack_callback *event)
3831 {
3832 	struct alc_spec *spec = codec->spec;
3833 
3834 	/* GPIO2 just toggles on a keypress/keyrelease cycle. Therefore
3835 	   send both key on and key off event for every interrupt. */
3836 	input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 1);
3837 	input_sync(spec->kb_dev);
3838 	input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 0);
3839 	input_sync(spec->kb_dev);
3840 }
3841 
3842 static int alc_register_micmute_input_device(struct hda_codec *codec)
3843 {
3844 	struct alc_spec *spec = codec->spec;
3845 	int i;
3846 
3847 	spec->kb_dev = input_allocate_device();
3848 	if (!spec->kb_dev) {
3849 		codec_err(codec, "Out of memory (input_allocate_device)\n");
3850 		return -ENOMEM;
3851 	}
3852 
3853 	spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX] = KEY_MICMUTE;
3854 
3855 	spec->kb_dev->name = "Microphone Mute Button";
3856 	spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY);
3857 	spec->kb_dev->keycodesize = sizeof(spec->alc_mute_keycode_map[0]);
3858 	spec->kb_dev->keycodemax = ARRAY_SIZE(spec->alc_mute_keycode_map);
3859 	spec->kb_dev->keycode = spec->alc_mute_keycode_map;
3860 	for (i = 0; i < ARRAY_SIZE(spec->alc_mute_keycode_map); i++)
3861 		set_bit(spec->alc_mute_keycode_map[i], spec->kb_dev->keybit);
3862 
3863 	if (input_register_device(spec->kb_dev)) {
3864 		codec_err(codec, "input_register_device failed\n");
3865 		input_free_device(spec->kb_dev);
3866 		spec->kb_dev = NULL;
3867 		return -ENOMEM;
3868 	}
3869 
3870 	return 0;
3871 }
3872 
3873 static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec,
3874 					     const struct hda_fixup *fix, int action)
3875 {
3876 	/* GPIO1 = set according to SKU external amp
3877 	   GPIO2 = mic mute hotkey
3878 	   GPIO3 = mute LED
3879 	   GPIO4 = mic mute LED */
3880 	static const struct hda_verb gpio_init[] = {
3881 		{ 0x01, AC_VERB_SET_GPIO_MASK, 0x1e },
3882 		{ 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x1a },
3883 		{ 0x01, AC_VERB_SET_GPIO_DATA, 0x02 },
3884 		{}
3885 	};
3886 
3887 	struct alc_spec *spec = codec->spec;
3888 
3889 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3890 		if (alc_register_micmute_input_device(codec) != 0)
3891 			return;
3892 
3893 		snd_hda_add_verbs(codec, gpio_init);
3894 		snd_hda_codec_write_cache(codec, codec->core.afg, 0,
3895 					  AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x04);
3896 		snd_hda_jack_detect_enable_callback(codec, codec->core.afg,
3897 						    gpio2_mic_hotkey_event);
3898 
3899 		spec->gen.vmaster_mute.hook = alc_fixup_gpio_mute_hook;
3900 		spec->gen.cap_sync_hook = alc_fixup_gpio_mic_mute_hook;
3901 		spec->gpio_led = 0;
3902 		spec->mute_led_polarity = 0;
3903 		spec->gpio_mute_led_mask = 0x08;
3904 		spec->gpio_mic_led_mask = 0x10;
3905 		return;
3906 	}
3907 
3908 	if (!spec->kb_dev)
3909 		return;
3910 
3911 	switch (action) {
3912 	case HDA_FIXUP_ACT_PROBE:
3913 		spec->init_amp = ALC_INIT_DEFAULT;
3914 		break;
3915 	case HDA_FIXUP_ACT_FREE:
3916 		input_unregister_device(spec->kb_dev);
3917 		spec->kb_dev = NULL;
3918 	}
3919 }
3920 
3921 static void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec,
3922 					     const struct hda_fixup *fix, int action)
3923 {
3924 	/* Line2 = mic mute hotkey
3925 	   GPIO2 = mic mute LED */
3926 	static const struct hda_verb gpio_init[] = {
3927 		{ 0x01, AC_VERB_SET_GPIO_MASK, 0x04 },
3928 		{ 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04 },
3929 		{}
3930 	};
3931 
3932 	struct alc_spec *spec = codec->spec;
3933 
3934 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3935 		if (alc_register_micmute_input_device(codec) != 0)
3936 			return;
3937 
3938 		snd_hda_add_verbs(codec, gpio_init);
3939 		snd_hda_jack_detect_enable_callback(codec, 0x1b,
3940 						    gpio2_mic_hotkey_event);
3941 
3942 		spec->gen.cap_sync_hook = alc_fixup_gpio_mic_mute_hook;
3943 		spec->gpio_led = 0;
3944 		spec->mute_led_polarity = 0;
3945 		spec->gpio_mic_led_mask = 0x04;
3946 		return;
3947 	}
3948 
3949 	if (!spec->kb_dev)
3950 		return;
3951 
3952 	switch (action) {
3953 	case HDA_FIXUP_ACT_PROBE:
3954 		spec->init_amp = ALC_INIT_DEFAULT;
3955 		break;
3956 	case HDA_FIXUP_ACT_FREE:
3957 		input_unregister_device(spec->kb_dev);
3958 		spec->kb_dev = NULL;
3959 	}
3960 }
3961 #else /* INPUT */
3962 #define alc280_fixup_hp_gpio2_mic_hotkey	NULL
3963 #define alc233_fixup_lenovo_line2_mic_hotkey	NULL
3964 #endif /* INPUT */
3965 
3966 static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec,
3967 				const struct hda_fixup *fix, int action)
3968 {
3969 	struct alc_spec *spec = codec->spec;
3970 
3971 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3972 		spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook;
3973 		spec->gen.cap_sync_hook = alc269_fixup_hp_cap_mic_mute_hook;
3974 		spec->mute_led_polarity = 0;
3975 		spec->mute_led_nid = 0x1a;
3976 		spec->cap_mute_led_nid = 0x18;
3977 		spec->gen.vmaster_mute_enum = 1;
3978 		codec->power_filter = led_power_filter;
3979 	}
3980 }
3981 
3982 static struct coef_fw alc225_pre_hsmode[] = {
3983 	UPDATE_COEF(0x4a, 1<<8, 0),
3984 	UPDATE_COEFEX(0x57, 0x05, 1<<14, 0),
3985 	UPDATE_COEF(0x63, 3<<14, 3<<14),
3986 	UPDATE_COEF(0x4a, 3<<4, 2<<4),
3987 	UPDATE_COEF(0x4a, 3<<10, 3<<10),
3988 	UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10),
3989 	UPDATE_COEF(0x4a, 3<<10, 0),
3990 	{}
3991 };
3992 
3993 static void alc_headset_mode_unplugged(struct hda_codec *codec)
3994 {
3995 	static struct coef_fw coef0255[] = {
3996 		WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
3997 		UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
3998 		WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
3999 		WRITE_COEFEX(0x57, 0x03, 0x8aa6), /* Direct Drive HP Amp control */
4000 		{}
4001 	};
4002 	static struct coef_fw coef0255_1[] = {
4003 		WRITE_COEF(0x1b, 0x0c0b), /* LDO and MISC control */
4004 		{}
4005 	};
4006 	static struct coef_fw coef0256[] = {
4007 		WRITE_COEF(0x1b, 0x0c4b), /* LDO and MISC control */
4008 		{}
4009 	};
4010 	static struct coef_fw coef0233[] = {
4011 		WRITE_COEF(0x1b, 0x0c0b),
4012 		WRITE_COEF(0x45, 0xc429),
4013 		UPDATE_COEF(0x35, 0x4000, 0),
4014 		WRITE_COEF(0x06, 0x2104),
4015 		WRITE_COEF(0x1a, 0x0001),
4016 		WRITE_COEF(0x26, 0x0004),
4017 		WRITE_COEF(0x32, 0x42a3),
4018 		{}
4019 	};
4020 	static struct coef_fw coef0288[] = {
4021 		UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
4022 		UPDATE_COEF(0x50, 0x2000, 0x2000),
4023 		UPDATE_COEF(0x56, 0x0006, 0x0006),
4024 		UPDATE_COEF(0x66, 0x0008, 0),
4025 		UPDATE_COEF(0x67, 0x2000, 0),
4026 		{}
4027 	};
4028 	static struct coef_fw coef0298[] = {
4029 		UPDATE_COEF(0x19, 0x1300, 0x0300),
4030 		{}
4031 	};
4032 	static struct coef_fw coef0292[] = {
4033 		WRITE_COEF(0x76, 0x000e),
4034 		WRITE_COEF(0x6c, 0x2400),
4035 		WRITE_COEF(0x18, 0x7308),
4036 		WRITE_COEF(0x6b, 0xc429),
4037 		{}
4038 	};
4039 	static struct coef_fw coef0293[] = {
4040 		UPDATE_COEF(0x10, 7<<8, 6<<8), /* SET Line1 JD to 0 */
4041 		UPDATE_COEFEX(0x57, 0x05, 1<<15|1<<13, 0x0), /* SET charge pump by verb */
4042 		UPDATE_COEFEX(0x57, 0x03, 1<<10, 1<<10), /* SET EN_OSW to 1 */
4043 		UPDATE_COEF(0x1a, 1<<3, 1<<3), /* Combo JD gating with LINE1-VREFO */
4044 		WRITE_COEF(0x45, 0xc429), /* Set to TRS type */
4045 		UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
4046 		{}
4047 	};
4048 	static struct coef_fw coef0668[] = {
4049 		WRITE_COEF(0x15, 0x0d40),
4050 		WRITE_COEF(0xb7, 0x802b),
4051 		{}
4052 	};
4053 	static struct coef_fw coef0225[] = {
4054 		UPDATE_COEF(0x63, 3<<14, 0),
4055 		{}
4056 	};
4057 	static struct coef_fw coef0274[] = {
4058 		UPDATE_COEF(0x4a, 0x0100, 0),
4059 		UPDATE_COEFEX(0x57, 0x05, 0x4000, 0),
4060 		UPDATE_COEF(0x6b, 0xf000, 0x5000),
4061 		UPDATE_COEF(0x4a, 0x0010, 0),
4062 		UPDATE_COEF(0x4a, 0x0c00, 0x0c00),
4063 		WRITE_COEF(0x45, 0x5289),
4064 		UPDATE_COEF(0x4a, 0x0c00, 0),
4065 		{}
4066 	};
4067 
4068 	switch (codec->core.vendor_id) {
4069 	case 0x10ec0255:
4070 		alc_process_coef_fw(codec, coef0255_1);
4071 		alc_process_coef_fw(codec, coef0255);
4072 		break;
4073 	case 0x10ec0236:
4074 	case 0x10ec0256:
4075 		alc_process_coef_fw(codec, coef0256);
4076 		alc_process_coef_fw(codec, coef0255);
4077 		break;
4078 	case 0x10ec0234:
4079 	case 0x10ec0274:
4080 	case 0x10ec0294:
4081 		alc_process_coef_fw(codec, coef0274);
4082 		break;
4083 	case 0x10ec0233:
4084 	case 0x10ec0283:
4085 		alc_process_coef_fw(codec, coef0233);
4086 		break;
4087 	case 0x10ec0286:
4088 	case 0x10ec0288:
4089 		alc_process_coef_fw(codec, coef0288);
4090 		break;
4091 	case 0x10ec0298:
4092 		alc_process_coef_fw(codec, coef0298);
4093 		alc_process_coef_fw(codec, coef0288);
4094 		break;
4095 	case 0x10ec0292:
4096 		alc_process_coef_fw(codec, coef0292);
4097 		break;
4098 	case 0x10ec0293:
4099 		alc_process_coef_fw(codec, coef0293);
4100 		break;
4101 	case 0x10ec0668:
4102 		alc_process_coef_fw(codec, coef0668);
4103 		break;
4104 	case 0x10ec0215:
4105 	case 0x10ec0225:
4106 	case 0x10ec0285:
4107 	case 0x10ec0295:
4108 	case 0x10ec0289:
4109 	case 0x10ec0299:
4110 		alc_process_coef_fw(codec, coef0225);
4111 		break;
4112 	case 0x10ec0867:
4113 		alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
4114 		break;
4115 	}
4116 	codec_dbg(codec, "Headset jack set to unplugged mode.\n");
4117 }
4118 
4119 
4120 static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
4121 				    hda_nid_t mic_pin)
4122 {
4123 	static struct coef_fw coef0255[] = {
4124 		WRITE_COEFEX(0x57, 0x03, 0x8aa6),
4125 		WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
4126 		{}
4127 	};
4128 	static struct coef_fw coef0233[] = {
4129 		UPDATE_COEF(0x35, 0, 1<<14),
4130 		WRITE_COEF(0x06, 0x2100),
4131 		WRITE_COEF(0x1a, 0x0021),
4132 		WRITE_COEF(0x26, 0x008c),
4133 		{}
4134 	};
4135 	static struct coef_fw coef0288[] = {
4136 		UPDATE_COEF(0x4f, 0x00c0, 0),
4137 		UPDATE_COEF(0x50, 0x2000, 0),
4138 		UPDATE_COEF(0x56, 0x0006, 0),
4139 		UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
4140 		UPDATE_COEF(0x66, 0x0008, 0x0008),
4141 		UPDATE_COEF(0x67, 0x2000, 0x2000),
4142 		{}
4143 	};
4144 	static struct coef_fw coef0292[] = {
4145 		WRITE_COEF(0x19, 0xa208),
4146 		WRITE_COEF(0x2e, 0xacf0),
4147 		{}
4148 	};
4149 	static struct coef_fw coef0293[] = {
4150 		UPDATE_COEFEX(0x57, 0x05, 0, 1<<15|1<<13), /* SET charge pump by verb */
4151 		UPDATE_COEFEX(0x57, 0x03, 1<<10, 0), /* SET EN_OSW to 0 */
4152 		UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
4153 		{}
4154 	};
4155 	static struct coef_fw coef0688[] = {
4156 		WRITE_COEF(0xb7, 0x802b),
4157 		WRITE_COEF(0xb5, 0x1040),
4158 		UPDATE_COEF(0xc3, 0, 1<<12),
4159 		{}
4160 	};
4161 	static struct coef_fw coef0225[] = {
4162 		UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14),
4163 		UPDATE_COEF(0x4a, 3<<4, 2<<4),
4164 		UPDATE_COEF(0x63, 3<<14, 0),
4165 		{}
4166 	};
4167 	static struct coef_fw coef0274[] = {
4168 		UPDATE_COEFEX(0x57, 0x05, 0x4000, 0x4000),
4169 		UPDATE_COEF(0x4a, 0x0010, 0),
4170 		UPDATE_COEF(0x6b, 0xf000, 0),
4171 		{}
4172 	};
4173 
4174 	switch (codec->core.vendor_id) {
4175 	case 0x10ec0236:
4176 	case 0x10ec0255:
4177 	case 0x10ec0256:
4178 		alc_write_coef_idx(codec, 0x45, 0xc489);
4179 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4180 		alc_process_coef_fw(codec, coef0255);
4181 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4182 		break;
4183 	case 0x10ec0234:
4184 	case 0x10ec0274:
4185 	case 0x10ec0294:
4186 		alc_write_coef_idx(codec, 0x45, 0x4689);
4187 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4188 		alc_process_coef_fw(codec, coef0274);
4189 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4190 		break;
4191 	case 0x10ec0233:
4192 	case 0x10ec0283:
4193 		alc_write_coef_idx(codec, 0x45, 0xc429);
4194 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4195 		alc_process_coef_fw(codec, coef0233);
4196 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4197 		break;
4198 	case 0x10ec0286:
4199 	case 0x10ec0288:
4200 	case 0x10ec0298:
4201 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4202 		alc_process_coef_fw(codec, coef0288);
4203 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4204 		break;
4205 	case 0x10ec0292:
4206 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4207 		alc_process_coef_fw(codec, coef0292);
4208 		break;
4209 	case 0x10ec0293:
4210 		/* Set to TRS mode */
4211 		alc_write_coef_idx(codec, 0x45, 0xc429);
4212 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4213 		alc_process_coef_fw(codec, coef0293);
4214 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4215 		break;
4216 	case 0x10ec0867:
4217 		alc_update_coefex_idx(codec, 0x57, 0x5, 0, 1<<14);
4218 		/* fallthru */
4219 	case 0x10ec0221:
4220 	case 0x10ec0662:
4221 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4222 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4223 		break;
4224 	case 0x10ec0668:
4225 		alc_write_coef_idx(codec, 0x11, 0x0001);
4226 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4227 		alc_process_coef_fw(codec, coef0688);
4228 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4229 		break;
4230 	case 0x10ec0215:
4231 	case 0x10ec0225:
4232 	case 0x10ec0285:
4233 	case 0x10ec0295:
4234 	case 0x10ec0289:
4235 	case 0x10ec0299:
4236 		alc_process_coef_fw(codec, alc225_pre_hsmode);
4237 		alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x31<<10);
4238 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4239 		alc_process_coef_fw(codec, coef0225);
4240 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4241 		break;
4242 	}
4243 	codec_dbg(codec, "Headset jack set to mic-in mode.\n");
4244 }
4245 
4246 static void alc_headset_mode_default(struct hda_codec *codec)
4247 {
4248 	static struct coef_fw coef0225[] = {
4249 		UPDATE_COEF(0x45, 0x3f<<10, 0x30<<10),
4250 		UPDATE_COEF(0x45, 0x3f<<10, 0x31<<10),
4251 		UPDATE_COEF(0x49, 3<<8, 0<<8),
4252 		UPDATE_COEF(0x4a, 3<<4, 3<<4),
4253 		UPDATE_COEF(0x63, 3<<14, 0),
4254 		UPDATE_COEF(0x67, 0xf000, 0x3000),
4255 		{}
4256 	};
4257 	static struct coef_fw coef0255[] = {
4258 		WRITE_COEF(0x45, 0xc089),
4259 		WRITE_COEF(0x45, 0xc489),
4260 		WRITE_COEFEX(0x57, 0x03, 0x8ea6),
4261 		WRITE_COEF(0x49, 0x0049),
4262 		{}
4263 	};
4264 	static struct coef_fw coef0233[] = {
4265 		WRITE_COEF(0x06, 0x2100),
4266 		WRITE_COEF(0x32, 0x4ea3),
4267 		{}
4268 	};
4269 	static struct coef_fw coef0288[] = {
4270 		UPDATE_COEF(0x4f, 0xfcc0, 0xc400), /* Set to TRS type */
4271 		UPDATE_COEF(0x50, 0x2000, 0x2000),
4272 		UPDATE_COEF(0x56, 0x0006, 0x0006),
4273 		UPDATE_COEF(0x66, 0x0008, 0),
4274 		UPDATE_COEF(0x67, 0x2000, 0),
4275 		{}
4276 	};
4277 	static struct coef_fw coef0292[] = {
4278 		WRITE_COEF(0x76, 0x000e),
4279 		WRITE_COEF(0x6c, 0x2400),
4280 		WRITE_COEF(0x6b, 0xc429),
4281 		WRITE_COEF(0x18, 0x7308),
4282 		{}
4283 	};
4284 	static struct coef_fw coef0293[] = {
4285 		UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
4286 		WRITE_COEF(0x45, 0xC429), /* Set to TRS type */
4287 		UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
4288 		{}
4289 	};
4290 	static struct coef_fw coef0688[] = {
4291 		WRITE_COEF(0x11, 0x0041),
4292 		WRITE_COEF(0x15, 0x0d40),
4293 		WRITE_COEF(0xb7, 0x802b),
4294 		{}
4295 	};
4296 	static struct coef_fw coef0274[] = {
4297 		WRITE_COEF(0x45, 0x4289),
4298 		UPDATE_COEF(0x4a, 0x0010, 0x0010),
4299 		UPDATE_COEF(0x6b, 0x0f00, 0),
4300 		UPDATE_COEF(0x49, 0x0300, 0x0300),
4301 		{}
4302 	};
4303 
4304 	switch (codec->core.vendor_id) {
4305 	case 0x10ec0215:
4306 	case 0x10ec0225:
4307 	case 0x10ec0285:
4308 	case 0x10ec0295:
4309 	case 0x10ec0289:
4310 	case 0x10ec0299:
4311 		alc_process_coef_fw(codec, alc225_pre_hsmode);
4312 		alc_process_coef_fw(codec, coef0225);
4313 		break;
4314 	case 0x10ec0236:
4315 	case 0x10ec0255:
4316 	case 0x10ec0256:
4317 		alc_process_coef_fw(codec, coef0255);
4318 		break;
4319 	case 0x10ec0234:
4320 	case 0x10ec0274:
4321 	case 0x10ec0294:
4322 		alc_process_coef_fw(codec, coef0274);
4323 		break;
4324 	case 0x10ec0233:
4325 	case 0x10ec0283:
4326 		alc_process_coef_fw(codec, coef0233);
4327 		break;
4328 	case 0x10ec0286:
4329 	case 0x10ec0288:
4330 	case 0x10ec0298:
4331 		alc_process_coef_fw(codec, coef0288);
4332 		break;
4333 	case 0x10ec0292:
4334 		alc_process_coef_fw(codec, coef0292);
4335 		break;
4336 	case 0x10ec0293:
4337 		alc_process_coef_fw(codec, coef0293);
4338 		break;
4339 	case 0x10ec0668:
4340 		alc_process_coef_fw(codec, coef0688);
4341 		break;
4342 	case 0x10ec0867:
4343 		alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
4344 		break;
4345 	}
4346 	codec_dbg(codec, "Headset jack set to headphone (default) mode.\n");
4347 }
4348 
4349 /* Iphone type */
4350 static void alc_headset_mode_ctia(struct hda_codec *codec)
4351 {
4352 	int val;
4353 
4354 	static struct coef_fw coef0255[] = {
4355 		WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
4356 		WRITE_COEF(0x1b, 0x0c2b),
4357 		WRITE_COEFEX(0x57, 0x03, 0x8ea6),
4358 		{}
4359 	};
4360 	static struct coef_fw coef0256[] = {
4361 		WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
4362 		WRITE_COEF(0x1b, 0x0c6b),
4363 		WRITE_COEFEX(0x57, 0x03, 0x8ea6),
4364 		{}
4365 	};
4366 	static struct coef_fw coef0233[] = {
4367 		WRITE_COEF(0x45, 0xd429),
4368 		WRITE_COEF(0x1b, 0x0c2b),
4369 		WRITE_COEF(0x32, 0x4ea3),
4370 		{}
4371 	};
4372 	static struct coef_fw coef0288[] = {
4373 		UPDATE_COEF(0x50, 0x2000, 0x2000),
4374 		UPDATE_COEF(0x56, 0x0006, 0x0006),
4375 		UPDATE_COEF(0x66, 0x0008, 0),
4376 		UPDATE_COEF(0x67, 0x2000, 0),
4377 		{}
4378 	};
4379 	static struct coef_fw coef0292[] = {
4380 		WRITE_COEF(0x6b, 0xd429),
4381 		WRITE_COEF(0x76, 0x0008),
4382 		WRITE_COEF(0x18, 0x7388),
4383 		{}
4384 	};
4385 	static struct coef_fw coef0293[] = {
4386 		WRITE_COEF(0x45, 0xd429), /* Set to ctia type */
4387 		UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
4388 		{}
4389 	};
4390 	static struct coef_fw coef0688[] = {
4391 		WRITE_COEF(0x11, 0x0001),
4392 		WRITE_COEF(0x15, 0x0d60),
4393 		WRITE_COEF(0xc3, 0x0000),
4394 		{}
4395 	};
4396 	static struct coef_fw coef0225_1[] = {
4397 		UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
4398 		UPDATE_COEF(0x63, 3<<14, 2<<14),
4399 		{}
4400 	};
4401 	static struct coef_fw coef0225_2[] = {
4402 		UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
4403 		UPDATE_COEF(0x63, 3<<14, 1<<14),
4404 		{}
4405 	};
4406 
4407 	switch (codec->core.vendor_id) {
4408 	case 0x10ec0255:
4409 		alc_process_coef_fw(codec, coef0255);
4410 		break;
4411 	case 0x10ec0236:
4412 	case 0x10ec0256:
4413 		alc_process_coef_fw(codec, coef0256);
4414 		break;
4415 	case 0x10ec0234:
4416 	case 0x10ec0274:
4417 	case 0x10ec0294:
4418 		alc_write_coef_idx(codec, 0x45, 0xd689);
4419 		break;
4420 	case 0x10ec0233:
4421 	case 0x10ec0283:
4422 		alc_process_coef_fw(codec, coef0233);
4423 		break;
4424 	case 0x10ec0298:
4425 		val = alc_read_coef_idx(codec, 0x50);
4426 		if (val & (1 << 12)) {
4427 			alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
4428 			alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
4429 			msleep(300);
4430 		} else {
4431 			alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
4432 			alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
4433 			msleep(300);
4434 		}
4435 		break;
4436 	case 0x10ec0286:
4437 	case 0x10ec0288:
4438 		alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
4439 		msleep(300);
4440 		alc_process_coef_fw(codec, coef0288);
4441 		break;
4442 	case 0x10ec0292:
4443 		alc_process_coef_fw(codec, coef0292);
4444 		break;
4445 	case 0x10ec0293:
4446 		alc_process_coef_fw(codec, coef0293);
4447 		break;
4448 	case 0x10ec0668:
4449 		alc_process_coef_fw(codec, coef0688);
4450 		break;
4451 	case 0x10ec0215:
4452 	case 0x10ec0225:
4453 	case 0x10ec0285:
4454 	case 0x10ec0295:
4455 	case 0x10ec0289:
4456 	case 0x10ec0299:
4457 		val = alc_read_coef_idx(codec, 0x45);
4458 		if (val & (1 << 9))
4459 			alc_process_coef_fw(codec, coef0225_2);
4460 		else
4461 			alc_process_coef_fw(codec, coef0225_1);
4462 		break;
4463 	case 0x10ec0867:
4464 		alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
4465 		break;
4466 	}
4467 	codec_dbg(codec, "Headset jack set to iPhone-style headset mode.\n");
4468 }
4469 
4470 /* Nokia type */
4471 static void alc_headset_mode_omtp(struct hda_codec *codec)
4472 {
4473 	static struct coef_fw coef0255[] = {
4474 		WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
4475 		WRITE_COEF(0x1b, 0x0c2b),
4476 		WRITE_COEFEX(0x57, 0x03, 0x8ea6),
4477 		{}
4478 	};
4479 	static struct coef_fw coef0256[] = {
4480 		WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
4481 		WRITE_COEF(0x1b, 0x0c6b),
4482 		WRITE_COEFEX(0x57, 0x03, 0x8ea6),
4483 		{}
4484 	};
4485 	static struct coef_fw coef0233[] = {
4486 		WRITE_COEF(0x45, 0xe429),
4487 		WRITE_COEF(0x1b, 0x0c2b),
4488 		WRITE_COEF(0x32, 0x4ea3),
4489 		{}
4490 	};
4491 	static struct coef_fw coef0288[] = {
4492 		UPDATE_COEF(0x50, 0x2000, 0x2000),
4493 		UPDATE_COEF(0x56, 0x0006, 0x0006),
4494 		UPDATE_COEF(0x66, 0x0008, 0),
4495 		UPDATE_COEF(0x67, 0x2000, 0),
4496 		{}
4497 	};
4498 	static struct coef_fw coef0292[] = {
4499 		WRITE_COEF(0x6b, 0xe429),
4500 		WRITE_COEF(0x76, 0x0008),
4501 		WRITE_COEF(0x18, 0x7388),
4502 		{}
4503 	};
4504 	static struct coef_fw coef0293[] = {
4505 		WRITE_COEF(0x45, 0xe429), /* Set to omtp type */
4506 		UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
4507 		{}
4508 	};
4509 	static struct coef_fw coef0688[] = {
4510 		WRITE_COEF(0x11, 0x0001),
4511 		WRITE_COEF(0x15, 0x0d50),
4512 		WRITE_COEF(0xc3, 0x0000),
4513 		{}
4514 	};
4515 	static struct coef_fw coef0225[] = {
4516 		UPDATE_COEF(0x45, 0x3f<<10, 0x39<<10),
4517 		UPDATE_COEF(0x63, 3<<14, 2<<14),
4518 		{}
4519 	};
4520 
4521 	switch (codec->core.vendor_id) {
4522 	case 0x10ec0255:
4523 		alc_process_coef_fw(codec, coef0255);
4524 		break;
4525 	case 0x10ec0236:
4526 	case 0x10ec0256:
4527 		alc_process_coef_fw(codec, coef0256);
4528 		break;
4529 	case 0x10ec0234:
4530 	case 0x10ec0274:
4531 	case 0x10ec0294:
4532 		alc_write_coef_idx(codec, 0x45, 0xe689);
4533 		break;
4534 	case 0x10ec0233:
4535 	case 0x10ec0283:
4536 		alc_process_coef_fw(codec, coef0233);
4537 		break;
4538 	case 0x10ec0298:
4539 		alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);/* Headset output enable */
4540 		alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
4541 		msleep(300);
4542 		break;
4543 	case 0x10ec0286:
4544 	case 0x10ec0288:
4545 		alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
4546 		msleep(300);
4547 		alc_process_coef_fw(codec, coef0288);
4548 		break;
4549 	case 0x10ec0292:
4550 		alc_process_coef_fw(codec, coef0292);
4551 		break;
4552 	case 0x10ec0293:
4553 		alc_process_coef_fw(codec, coef0293);
4554 		break;
4555 	case 0x10ec0668:
4556 		alc_process_coef_fw(codec, coef0688);
4557 		break;
4558 	case 0x10ec0215:
4559 	case 0x10ec0225:
4560 	case 0x10ec0285:
4561 	case 0x10ec0295:
4562 	case 0x10ec0289:
4563 	case 0x10ec0299:
4564 		alc_process_coef_fw(codec, coef0225);
4565 		break;
4566 	}
4567 	codec_dbg(codec, "Headset jack set to Nokia-style headset mode.\n");
4568 }
4569 
4570 static void alc_determine_headset_type(struct hda_codec *codec)
4571 {
4572 	int val;
4573 	bool is_ctia = false;
4574 	struct alc_spec *spec = codec->spec;
4575 	static struct coef_fw coef0255[] = {
4576 		WRITE_COEF(0x45, 0xd089), /* combo jack auto switch control(Check type)*/
4577 		WRITE_COEF(0x49, 0x0149), /* combo jack auto switch control(Vref
4578  conteol) */
4579 		{}
4580 	};
4581 	static struct coef_fw coef0288[] = {
4582 		UPDATE_COEF(0x4f, 0xfcc0, 0xd400), /* Check Type */
4583 		{}
4584 	};
4585 	static struct coef_fw coef0298[] = {
4586 		UPDATE_COEF(0x50, 0x2000, 0x2000),
4587 		UPDATE_COEF(0x56, 0x0006, 0x0006),
4588 		UPDATE_COEF(0x66, 0x0008, 0),
4589 		UPDATE_COEF(0x67, 0x2000, 0),
4590 		UPDATE_COEF(0x19, 0x1300, 0x1300),
4591 		{}
4592 	};
4593 	static struct coef_fw coef0293[] = {
4594 		UPDATE_COEF(0x4a, 0x000f, 0x0008), /* Combo Jack auto detect */
4595 		WRITE_COEF(0x45, 0xD429), /* Set to ctia type */
4596 		{}
4597 	};
4598 	static struct coef_fw coef0688[] = {
4599 		WRITE_COEF(0x11, 0x0001),
4600 		WRITE_COEF(0xb7, 0x802b),
4601 		WRITE_COEF(0x15, 0x0d60),
4602 		WRITE_COEF(0xc3, 0x0c00),
4603 		{}
4604 	};
4605 	static struct coef_fw coef0274[] = {
4606 		UPDATE_COEF(0x4a, 0x0010, 0),
4607 		UPDATE_COEF(0x4a, 0x8000, 0),
4608 		WRITE_COEF(0x45, 0xd289),
4609 		UPDATE_COEF(0x49, 0x0300, 0x0300),
4610 		{}
4611 	};
4612 
4613 	switch (codec->core.vendor_id) {
4614 	case 0x10ec0236:
4615 	case 0x10ec0255:
4616 	case 0x10ec0256:
4617 		alc_process_coef_fw(codec, coef0255);
4618 		msleep(300);
4619 		val = alc_read_coef_idx(codec, 0x46);
4620 		is_ctia = (val & 0x0070) == 0x0070;
4621 		break;
4622 	case 0x10ec0234:
4623 	case 0x10ec0274:
4624 	case 0x10ec0294:
4625 		alc_process_coef_fw(codec, coef0274);
4626 		msleep(80);
4627 		val = alc_read_coef_idx(codec, 0x46);
4628 		is_ctia = (val & 0x00f0) == 0x00f0;
4629 		break;
4630 	case 0x10ec0233:
4631 	case 0x10ec0283:
4632 		alc_write_coef_idx(codec, 0x45, 0xd029);
4633 		msleep(300);
4634 		val = alc_read_coef_idx(codec, 0x46);
4635 		is_ctia = (val & 0x0070) == 0x0070;
4636 		break;
4637 	case 0x10ec0298:
4638 		snd_hda_codec_write(codec, 0x21, 0,
4639 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
4640 		msleep(100);
4641 		snd_hda_codec_write(codec, 0x21, 0,
4642 			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
4643 		msleep(200);
4644 
4645 		val = alc_read_coef_idx(codec, 0x50);
4646 		if (val & (1 << 12)) {
4647 			alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
4648 			alc_process_coef_fw(codec, coef0288);
4649 			msleep(350);
4650 			val = alc_read_coef_idx(codec, 0x50);
4651 			is_ctia = (val & 0x0070) == 0x0070;
4652 		} else {
4653 			alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
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 		}
4659 		alc_process_coef_fw(codec, coef0298);
4660 		snd_hda_codec_write(codec, 0x21, 0,
4661 			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP);
4662 		msleep(75);
4663 		snd_hda_codec_write(codec, 0x21, 0,
4664 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
4665 		break;
4666 	case 0x10ec0286:
4667 	case 0x10ec0288:
4668 		alc_process_coef_fw(codec, coef0288);
4669 		msleep(350);
4670 		val = alc_read_coef_idx(codec, 0x50);
4671 		is_ctia = (val & 0x0070) == 0x0070;
4672 		break;
4673 	case 0x10ec0292:
4674 		alc_write_coef_idx(codec, 0x6b, 0xd429);
4675 		msleep(300);
4676 		val = alc_read_coef_idx(codec, 0x6c);
4677 		is_ctia = (val & 0x001c) == 0x001c;
4678 		break;
4679 	case 0x10ec0293:
4680 		alc_process_coef_fw(codec, coef0293);
4681 		msleep(300);
4682 		val = alc_read_coef_idx(codec, 0x46);
4683 		is_ctia = (val & 0x0070) == 0x0070;
4684 		break;
4685 	case 0x10ec0668:
4686 		alc_process_coef_fw(codec, coef0688);
4687 		msleep(300);
4688 		val = alc_read_coef_idx(codec, 0xbe);
4689 		is_ctia = (val & 0x1c02) == 0x1c02;
4690 		break;
4691 	case 0x10ec0215:
4692 	case 0x10ec0225:
4693 	case 0x10ec0285:
4694 	case 0x10ec0295:
4695 	case 0x10ec0289:
4696 	case 0x10ec0299:
4697 		snd_hda_codec_write(codec, 0x21, 0,
4698 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
4699 		msleep(80);
4700 		snd_hda_codec_write(codec, 0x21, 0,
4701 			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
4702 
4703 		alc_process_coef_fw(codec, alc225_pre_hsmode);
4704 		alc_update_coef_idx(codec, 0x67, 0xf000, 0x1000);
4705 		val = alc_read_coef_idx(codec, 0x45);
4706 		if (val & (1 << 9)) {
4707 			alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
4708 			alc_update_coef_idx(codec, 0x49, 3<<8, 2<<8);
4709 			msleep(800);
4710 			val = alc_read_coef_idx(codec, 0x46);
4711 			is_ctia = (val & 0x00f0) == 0x00f0;
4712 		} else {
4713 			alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
4714 			alc_update_coef_idx(codec, 0x49, 3<<8, 1<<8);
4715 			msleep(800);
4716 			val = alc_read_coef_idx(codec, 0x46);
4717 			is_ctia = (val & 0x00f0) == 0x00f0;
4718 		}
4719 		alc_update_coef_idx(codec, 0x4a, 7<<6, 7<<6);
4720 		alc_update_coef_idx(codec, 0x4a, 3<<4, 3<<4);
4721 		alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
4722 
4723 		snd_hda_codec_write(codec, 0x21, 0,
4724 			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
4725 		msleep(80);
4726 		snd_hda_codec_write(codec, 0x21, 0,
4727 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
4728 		break;
4729 	case 0x10ec0867:
4730 		is_ctia = true;
4731 		break;
4732 	}
4733 
4734 	codec_dbg(codec, "Headset jack detected iPhone-style headset: %s\n",
4735 		    is_ctia ? "yes" : "no");
4736 	spec->current_headset_type = is_ctia ? ALC_HEADSET_TYPE_CTIA : ALC_HEADSET_TYPE_OMTP;
4737 }
4738 
4739 static void alc_update_headset_mode(struct hda_codec *codec)
4740 {
4741 	struct alc_spec *spec = codec->spec;
4742 
4743 	hda_nid_t mux_pin = spec->gen.imux_pins[spec->gen.cur_mux[0]];
4744 	hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
4745 
4746 	int new_headset_mode;
4747 
4748 	if (!snd_hda_jack_detect(codec, hp_pin))
4749 		new_headset_mode = ALC_HEADSET_MODE_UNPLUGGED;
4750 	else if (mux_pin == spec->headset_mic_pin)
4751 		new_headset_mode = ALC_HEADSET_MODE_HEADSET;
4752 	else if (mux_pin == spec->headphone_mic_pin)
4753 		new_headset_mode = ALC_HEADSET_MODE_MIC;
4754 	else
4755 		new_headset_mode = ALC_HEADSET_MODE_HEADPHONE;
4756 
4757 	if (new_headset_mode == spec->current_headset_mode) {
4758 		snd_hda_gen_update_outputs(codec);
4759 		return;
4760 	}
4761 
4762 	switch (new_headset_mode) {
4763 	case ALC_HEADSET_MODE_UNPLUGGED:
4764 		alc_headset_mode_unplugged(codec);
4765 		spec->gen.hp_jack_present = false;
4766 		break;
4767 	case ALC_HEADSET_MODE_HEADSET:
4768 		if (spec->current_headset_type == ALC_HEADSET_TYPE_UNKNOWN)
4769 			alc_determine_headset_type(codec);
4770 		if (spec->current_headset_type == ALC_HEADSET_TYPE_CTIA)
4771 			alc_headset_mode_ctia(codec);
4772 		else if (spec->current_headset_type == ALC_HEADSET_TYPE_OMTP)
4773 			alc_headset_mode_omtp(codec);
4774 		spec->gen.hp_jack_present = true;
4775 		break;
4776 	case ALC_HEADSET_MODE_MIC:
4777 		alc_headset_mode_mic_in(codec, hp_pin, spec->headphone_mic_pin);
4778 		spec->gen.hp_jack_present = false;
4779 		break;
4780 	case ALC_HEADSET_MODE_HEADPHONE:
4781 		alc_headset_mode_default(codec);
4782 		spec->gen.hp_jack_present = true;
4783 		break;
4784 	}
4785 	if (new_headset_mode != ALC_HEADSET_MODE_MIC) {
4786 		snd_hda_set_pin_ctl_cache(codec, hp_pin,
4787 					  AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
4788 		if (spec->headphone_mic_pin && spec->headphone_mic_pin != hp_pin)
4789 			snd_hda_set_pin_ctl_cache(codec, spec->headphone_mic_pin,
4790 						  PIN_VREFHIZ);
4791 	}
4792 	spec->current_headset_mode = new_headset_mode;
4793 
4794 	snd_hda_gen_update_outputs(codec);
4795 }
4796 
4797 static void alc_update_headset_mode_hook(struct hda_codec *codec,
4798 					 struct snd_kcontrol *kcontrol,
4799 					 struct snd_ctl_elem_value *ucontrol)
4800 {
4801 	alc_update_headset_mode(codec);
4802 }
4803 
4804 static void alc_update_headset_jack_cb(struct hda_codec *codec,
4805 				       struct hda_jack_callback *jack)
4806 {
4807 	struct alc_spec *spec = codec->spec;
4808 	spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
4809 	snd_hda_gen_hp_automute(codec, jack);
4810 }
4811 
4812 static void alc_probe_headset_mode(struct hda_codec *codec)
4813 {
4814 	int i;
4815 	struct alc_spec *spec = codec->spec;
4816 	struct auto_pin_cfg *cfg = &spec->gen.autocfg;
4817 
4818 	/* Find mic pins */
4819 	for (i = 0; i < cfg->num_inputs; i++) {
4820 		if (cfg->inputs[i].is_headset_mic && !spec->headset_mic_pin)
4821 			spec->headset_mic_pin = cfg->inputs[i].pin;
4822 		if (cfg->inputs[i].is_headphone_mic && !spec->headphone_mic_pin)
4823 			spec->headphone_mic_pin = cfg->inputs[i].pin;
4824 	}
4825 
4826 	spec->gen.cap_sync_hook = alc_update_headset_mode_hook;
4827 	spec->gen.automute_hook = alc_update_headset_mode;
4828 	spec->gen.hp_automute_hook = alc_update_headset_jack_cb;
4829 }
4830 
4831 static void alc_fixup_headset_mode(struct hda_codec *codec,
4832 				const struct hda_fixup *fix, int action)
4833 {
4834 	struct alc_spec *spec = codec->spec;
4835 
4836 	switch (action) {
4837 	case HDA_FIXUP_ACT_PRE_PROBE:
4838 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC | HDA_PINCFG_HEADPHONE_MIC;
4839 		break;
4840 	case HDA_FIXUP_ACT_PROBE:
4841 		alc_probe_headset_mode(codec);
4842 		break;
4843 	case HDA_FIXUP_ACT_INIT:
4844 		spec->current_headset_mode = 0;
4845 		alc_update_headset_mode(codec);
4846 		break;
4847 	}
4848 }
4849 
4850 static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
4851 				const struct hda_fixup *fix, int action)
4852 {
4853 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4854 		struct alc_spec *spec = codec->spec;
4855 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
4856 	}
4857 	else
4858 		alc_fixup_headset_mode(codec, fix, action);
4859 }
4860 
4861 static void alc255_set_default_jack_type(struct hda_codec *codec)
4862 {
4863 	/* Set to iphone type */
4864 	static struct coef_fw alc255fw[] = {
4865 		WRITE_COEF(0x1b, 0x880b),
4866 		WRITE_COEF(0x45, 0xd089),
4867 		WRITE_COEF(0x1b, 0x080b),
4868 		WRITE_COEF(0x46, 0x0004),
4869 		WRITE_COEF(0x1b, 0x0c0b),
4870 		{}
4871 	};
4872 	static struct coef_fw alc256fw[] = {
4873 		WRITE_COEF(0x1b, 0x884b),
4874 		WRITE_COEF(0x45, 0xd089),
4875 		WRITE_COEF(0x1b, 0x084b),
4876 		WRITE_COEF(0x46, 0x0004),
4877 		WRITE_COEF(0x1b, 0x0c4b),
4878 		{}
4879 	};
4880 	switch (codec->core.vendor_id) {
4881 	case 0x10ec0255:
4882 		alc_process_coef_fw(codec, alc255fw);
4883 		break;
4884 	case 0x10ec0236:
4885 	case 0x10ec0256:
4886 		alc_process_coef_fw(codec, alc256fw);
4887 		break;
4888 	}
4889 	msleep(30);
4890 }
4891 
4892 static void alc_fixup_headset_mode_alc255(struct hda_codec *codec,
4893 				const struct hda_fixup *fix, int action)
4894 {
4895 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4896 		alc255_set_default_jack_type(codec);
4897 	}
4898 	alc_fixup_headset_mode(codec, fix, action);
4899 }
4900 
4901 static void alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec,
4902 				const struct hda_fixup *fix, int action)
4903 {
4904 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4905 		struct alc_spec *spec = codec->spec;
4906 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
4907 		alc255_set_default_jack_type(codec);
4908 	}
4909 	else
4910 		alc_fixup_headset_mode(codec, fix, action);
4911 }
4912 
4913 static void alc288_update_headset_jack_cb(struct hda_codec *codec,
4914 				       struct hda_jack_callback *jack)
4915 {
4916 	struct alc_spec *spec = codec->spec;
4917 	int present;
4918 
4919 	alc_update_headset_jack_cb(codec, jack);
4920 	/* Headset Mic enable or disable, only for Dell Dino */
4921 	present = spec->gen.hp_jack_present ? 0x40 : 0;
4922 	snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
4923 				present);
4924 }
4925 
4926 static void alc_fixup_headset_mode_dell_alc288(struct hda_codec *codec,
4927 				const struct hda_fixup *fix, int action)
4928 {
4929 	alc_fixup_headset_mode(codec, fix, action);
4930 	if (action == HDA_FIXUP_ACT_PROBE) {
4931 		struct alc_spec *spec = codec->spec;
4932 		spec->gen.hp_automute_hook = alc288_update_headset_jack_cb;
4933 	}
4934 }
4935 
4936 static void alc_fixup_auto_mute_via_amp(struct hda_codec *codec,
4937 					const struct hda_fixup *fix, int action)
4938 {
4939 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4940 		struct alc_spec *spec = codec->spec;
4941 		spec->gen.auto_mute_via_amp = 1;
4942 	}
4943 }
4944 
4945 static void alc_no_shutup(struct hda_codec *codec)
4946 {
4947 }
4948 
4949 static void alc_fixup_no_shutup(struct hda_codec *codec,
4950 				const struct hda_fixup *fix, int action)
4951 {
4952 	if (action == HDA_FIXUP_ACT_PROBE) {
4953 		struct alc_spec *spec = codec->spec;
4954 		spec->shutup = alc_no_shutup;
4955 	}
4956 }
4957 
4958 static void alc_fixup_disable_aamix(struct hda_codec *codec,
4959 				    const struct hda_fixup *fix, int action)
4960 {
4961 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4962 		struct alc_spec *spec = codec->spec;
4963 		/* Disable AA-loopback as it causes white noise */
4964 		spec->gen.mixer_nid = 0;
4965 	}
4966 }
4967 
4968 /* fixup for Thinkpad docks: add dock pins, avoid HP parser fixup */
4969 static void alc_fixup_tpt440_dock(struct hda_codec *codec,
4970 				  const struct hda_fixup *fix, int action)
4971 {
4972 	static const struct hda_pintbl pincfgs[] = {
4973 		{ 0x16, 0x21211010 }, /* dock headphone */
4974 		{ 0x19, 0x21a11010 }, /* dock mic */
4975 		{ }
4976 	};
4977 	struct alc_spec *spec = codec->spec;
4978 
4979 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4980 		spec->shutup = alc_no_shutup; /* reduce click noise */
4981 		spec->reboot_notify = alc_d3_at_reboot; /* reduce noise */
4982 		spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
4983 		codec->power_save_node = 0; /* avoid click noises */
4984 		snd_hda_apply_pincfgs(codec, pincfgs);
4985 	}
4986 }
4987 
4988 static void alc_fixup_tpt470_dock(struct hda_codec *codec,
4989 				  const struct hda_fixup *fix, int action)
4990 {
4991 	static const struct hda_pintbl pincfgs[] = {
4992 		{ 0x17, 0x21211010 }, /* dock headphone */
4993 		{ 0x19, 0x21a11010 }, /* dock mic */
4994 		{ }
4995 	};
4996 	struct alc_spec *spec = codec->spec;
4997 
4998 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4999 		spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
5000 		/* Enable DOCK device */
5001 		snd_hda_codec_write(codec, 0x17, 0,
5002 			    AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
5003 		/* Enable DOCK device */
5004 		snd_hda_codec_write(codec, 0x19, 0,
5005 			    AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
5006 		snd_hda_apply_pincfgs(codec, pincfgs);
5007 	}
5008 }
5009 
5010 static void alc_shutup_dell_xps13(struct hda_codec *codec)
5011 {
5012 	struct alc_spec *spec = codec->spec;
5013 	int hp_pin = spec->gen.autocfg.hp_pins[0];
5014 
5015 	/* Prevent pop noises when headphones are plugged in */
5016 	snd_hda_codec_write(codec, hp_pin, 0,
5017 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5018 	msleep(20);
5019 }
5020 
5021 static void alc_fixup_dell_xps13(struct hda_codec *codec,
5022 				const struct hda_fixup *fix, int action)
5023 {
5024 	struct alc_spec *spec = codec->spec;
5025 	struct hda_input_mux *imux = &spec->gen.input_mux;
5026 	int i;
5027 
5028 	switch (action) {
5029 	case HDA_FIXUP_ACT_PRE_PROBE:
5030 		/* mic pin 0x19 must be initialized with Vref Hi-Z, otherwise
5031 		 * it causes a click noise at start up
5032 		 */
5033 		snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
5034 		break;
5035 	case HDA_FIXUP_ACT_PROBE:
5036 		spec->shutup = alc_shutup_dell_xps13;
5037 
5038 		/* Make the internal mic the default input source. */
5039 		for (i = 0; i < imux->num_items; i++) {
5040 			if (spec->gen.imux_pins[i] == 0x12) {
5041 				spec->gen.cur_mux[0] = i;
5042 				break;
5043 			}
5044 		}
5045 		break;
5046 	}
5047 }
5048 
5049 static void alc_fixup_headset_mode_alc662(struct hda_codec *codec,
5050 				const struct hda_fixup *fix, int action)
5051 {
5052 	struct alc_spec *spec = codec->spec;
5053 
5054 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5055 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5056 		spec->gen.hp_mic = 1; /* Mic-in is same pin as headphone */
5057 
5058 		/* Disable boost for mic-in permanently. (This code is only called
5059 		   from quirks that guarantee that the headphone is at NID 0x1b.) */
5060 		snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000);
5061 		snd_hda_override_wcaps(codec, 0x1b, get_wcaps(codec, 0x1b) & ~AC_WCAP_IN_AMP);
5062 	} else
5063 		alc_fixup_headset_mode(codec, fix, action);
5064 }
5065 
5066 static void alc_fixup_headset_mode_alc668(struct hda_codec *codec,
5067 				const struct hda_fixup *fix, int action)
5068 {
5069 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5070 		alc_write_coef_idx(codec, 0xc4, 0x8000);
5071 		alc_update_coef_idx(codec, 0xc2, ~0xfe, 0);
5072 		snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
5073 	}
5074 	alc_fixup_headset_mode(codec, fix, action);
5075 }
5076 
5077 /* Returns the nid of the external mic input pin, or 0 if it cannot be found. */
5078 static int find_ext_mic_pin(struct hda_codec *codec)
5079 {
5080 	struct alc_spec *spec = codec->spec;
5081 	struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5082 	hda_nid_t nid;
5083 	unsigned int defcfg;
5084 	int i;
5085 
5086 	for (i = 0; i < cfg->num_inputs; i++) {
5087 		if (cfg->inputs[i].type != AUTO_PIN_MIC)
5088 			continue;
5089 		nid = cfg->inputs[i].pin;
5090 		defcfg = snd_hda_codec_get_pincfg(codec, nid);
5091 		if (snd_hda_get_input_pin_attr(defcfg) == INPUT_PIN_ATTR_INT)
5092 			continue;
5093 		return nid;
5094 	}
5095 
5096 	return 0;
5097 }
5098 
5099 static void alc271_hp_gate_mic_jack(struct hda_codec *codec,
5100 				    const struct hda_fixup *fix,
5101 				    int action)
5102 {
5103 	struct alc_spec *spec = codec->spec;
5104 
5105 	if (action == HDA_FIXUP_ACT_PROBE) {
5106 		int mic_pin = find_ext_mic_pin(codec);
5107 		int hp_pin = spec->gen.autocfg.hp_pins[0];
5108 
5109 		if (snd_BUG_ON(!mic_pin || !hp_pin))
5110 			return;
5111 		snd_hda_jack_set_gating_jack(codec, mic_pin, hp_pin);
5112 	}
5113 }
5114 
5115 static void alc269_fixup_limit_int_mic_boost(struct hda_codec *codec,
5116 					     const struct hda_fixup *fix,
5117 					     int action)
5118 {
5119 	struct alc_spec *spec = codec->spec;
5120 	struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5121 	int i;
5122 
5123 	/* The mic boosts on level 2 and 3 are too noisy
5124 	   on the internal mic input.
5125 	   Therefore limit the boost to 0 or 1. */
5126 
5127 	if (action != HDA_FIXUP_ACT_PROBE)
5128 		return;
5129 
5130 	for (i = 0; i < cfg->num_inputs; i++) {
5131 		hda_nid_t nid = cfg->inputs[i].pin;
5132 		unsigned int defcfg;
5133 		if (cfg->inputs[i].type != AUTO_PIN_MIC)
5134 			continue;
5135 		defcfg = snd_hda_codec_get_pincfg(codec, nid);
5136 		if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
5137 			continue;
5138 
5139 		snd_hda_override_amp_caps(codec, nid, HDA_INPUT,
5140 					  (0x00 << AC_AMPCAP_OFFSET_SHIFT) |
5141 					  (0x01 << AC_AMPCAP_NUM_STEPS_SHIFT) |
5142 					  (0x2f << AC_AMPCAP_STEP_SIZE_SHIFT) |
5143 					  (0 << AC_AMPCAP_MUTE_SHIFT));
5144 	}
5145 }
5146 
5147 static void alc283_hp_automute_hook(struct hda_codec *codec,
5148 				    struct hda_jack_callback *jack)
5149 {
5150 	struct alc_spec *spec = codec->spec;
5151 	int vref;
5152 
5153 	msleep(200);
5154 	snd_hda_gen_hp_automute(codec, jack);
5155 
5156 	vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
5157 
5158 	msleep(600);
5159 	snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5160 			    vref);
5161 }
5162 
5163 static void alc283_fixup_chromebook(struct hda_codec *codec,
5164 				    const struct hda_fixup *fix, int action)
5165 {
5166 	struct alc_spec *spec = codec->spec;
5167 
5168 	switch (action) {
5169 	case HDA_FIXUP_ACT_PRE_PROBE:
5170 		snd_hda_override_wcaps(codec, 0x03, 0);
5171 		/* Disable AA-loopback as it causes white noise */
5172 		spec->gen.mixer_nid = 0;
5173 		break;
5174 	case HDA_FIXUP_ACT_INIT:
5175 		/* MIC2-VREF control */
5176 		/* Set to manual mode */
5177 		alc_update_coef_idx(codec, 0x06, 0x000c, 0);
5178 		/* Enable Line1 input control by verb */
5179 		alc_update_coef_idx(codec, 0x1a, 0, 1 << 4);
5180 		break;
5181 	}
5182 }
5183 
5184 static void alc283_fixup_sense_combo_jack(struct hda_codec *codec,
5185 				    const struct hda_fixup *fix, int action)
5186 {
5187 	struct alc_spec *spec = codec->spec;
5188 
5189 	switch (action) {
5190 	case HDA_FIXUP_ACT_PRE_PROBE:
5191 		spec->gen.hp_automute_hook = alc283_hp_automute_hook;
5192 		break;
5193 	case HDA_FIXUP_ACT_INIT:
5194 		/* MIC2-VREF control */
5195 		/* Set to manual mode */
5196 		alc_update_coef_idx(codec, 0x06, 0x000c, 0);
5197 		break;
5198 	}
5199 }
5200 
5201 /* mute tablet speaker pin (0x14) via dock plugging in addition */
5202 static void asus_tx300_automute(struct hda_codec *codec)
5203 {
5204 	struct alc_spec *spec = codec->spec;
5205 	snd_hda_gen_update_outputs(codec);
5206 	if (snd_hda_jack_detect(codec, 0x1b))
5207 		spec->gen.mute_bits |= (1ULL << 0x14);
5208 }
5209 
5210 static void alc282_fixup_asus_tx300(struct hda_codec *codec,
5211 				    const struct hda_fixup *fix, int action)
5212 {
5213 	struct alc_spec *spec = codec->spec;
5214 	/* TX300 needs to set up GPIO2 for the speaker amp */
5215 	static const struct hda_verb gpio2_verbs[] = {
5216 		{ 0x01, AC_VERB_SET_GPIO_MASK, 0x04 },
5217 		{ 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04 },
5218 		{ 0x01, AC_VERB_SET_GPIO_DATA, 0x04 },
5219 		{}
5220 	};
5221 	static const struct hda_pintbl dock_pins[] = {
5222 		{ 0x1b, 0x21114000 }, /* dock speaker pin */
5223 		{}
5224 	};
5225 
5226 	switch (action) {
5227 	case HDA_FIXUP_ACT_PRE_PROBE:
5228 		snd_hda_add_verbs(codec, gpio2_verbs);
5229 		snd_hda_apply_pincfgs(codec, dock_pins);
5230 		spec->gen.auto_mute_via_amp = 1;
5231 		spec->gen.automute_hook = asus_tx300_automute;
5232 		snd_hda_jack_detect_enable_callback(codec, 0x1b,
5233 						    snd_hda_gen_hp_automute);
5234 		break;
5235 	case HDA_FIXUP_ACT_BUILD:
5236 		/* this is a bit tricky; give more sane names for the main
5237 		 * (tablet) speaker and the dock speaker, respectively
5238 		 */
5239 		rename_ctl(codec, "Speaker Playback Switch",
5240 			   "Dock Speaker Playback Switch");
5241 		rename_ctl(codec, "Bass Speaker Playback Switch",
5242 			   "Speaker Playback Switch");
5243 		break;
5244 	}
5245 }
5246 
5247 static void alc290_fixup_mono_speakers(struct hda_codec *codec,
5248 				       const struct hda_fixup *fix, int action)
5249 {
5250 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5251 		/* DAC node 0x03 is giving mono output. We therefore want to
5252 		   make sure 0x14 (front speaker) and 0x15 (headphones) use the
5253 		   stereo DAC, while leaving 0x17 (bass speaker) for node 0x03. */
5254 		hda_nid_t conn1[2] = { 0x0c };
5255 		snd_hda_override_conn_list(codec, 0x14, 1, conn1);
5256 		snd_hda_override_conn_list(codec, 0x15, 1, conn1);
5257 	}
5258 }
5259 
5260 static void alc298_fixup_speaker_volume(struct hda_codec *codec,
5261 					const struct hda_fixup *fix, int action)
5262 {
5263 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5264 		/* The speaker is routed to the Node 0x06 by a mistake, as a result
5265 		   we can't adjust the speaker's volume since this node does not has
5266 		   Amp-out capability. we change the speaker's route to:
5267 		   Node 0x02 (Audio Output) -> Node 0x0c (Audio Mixer) -> Node 0x17 (
5268 		   Pin Complex), since Node 0x02 has Amp-out caps, we can adjust
5269 		   speaker's volume now. */
5270 
5271 		hda_nid_t conn1[1] = { 0x0c };
5272 		snd_hda_override_conn_list(codec, 0x17, 1, conn1);
5273 	}
5274 }
5275 
5276 /* Hook to update amp GPIO4 for automute */
5277 static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec,
5278 					  struct hda_jack_callback *jack)
5279 {
5280 	struct alc_spec *spec = codec->spec;
5281 
5282 	snd_hda_gen_hp_automute(codec, jack);
5283 	/* mute_led_polarity is set to 0, so we pass inverted value here */
5284 	alc_update_gpio_led(codec, 0x10, !spec->gen.hp_jack_present);
5285 }
5286 
5287 /* Manage GPIOs for HP EliteBook Folio 9480m.
5288  *
5289  * GPIO4 is the headphone amplifier power control
5290  * GPIO3 is the audio output mute indicator LED
5291  */
5292 
5293 static void alc280_fixup_hp_9480m(struct hda_codec *codec,
5294 				  const struct hda_fixup *fix,
5295 				  int action)
5296 {
5297 	struct alc_spec *spec = codec->spec;
5298 	static const struct hda_verb gpio_init[] = {
5299 		{ 0x01, AC_VERB_SET_GPIO_MASK, 0x18 },
5300 		{ 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x18 },
5301 		{}
5302 	};
5303 
5304 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5305 		/* Set the hooks to turn the headphone amp on/off
5306 		 * as needed
5307 		 */
5308 		spec->gen.vmaster_mute.hook = alc_fixup_gpio_mute_hook;
5309 		spec->gen.hp_automute_hook = alc280_hp_gpio4_automute_hook;
5310 
5311 		/* The GPIOs are currently off */
5312 		spec->gpio_led = 0;
5313 
5314 		/* GPIO3 is connected to the output mute LED,
5315 		 * high is on, low is off
5316 		 */
5317 		spec->mute_led_polarity = 0;
5318 		spec->gpio_mute_led_mask = 0x08;
5319 
5320 		/* Initialize GPIO configuration */
5321 		snd_hda_add_verbs(codec, gpio_init);
5322 	}
5323 }
5324 
5325 static void alc233_alc662_fixup_lenovo_dual_codecs(struct hda_codec *codec,
5326 					 const struct hda_fixup *fix,
5327 					 int action)
5328 {
5329 	alc_fixup_dual_codecs(codec, fix, action);
5330 	switch (action) {
5331 	case HDA_FIXUP_ACT_PRE_PROBE:
5332 		/* override card longname to provide a unique UCM profile */
5333 		strcpy(codec->card->longname, "HDAudio-Lenovo-DualCodecs");
5334 		break;
5335 	case HDA_FIXUP_ACT_BUILD:
5336 		/* rename Capture controls depending on the codec */
5337 		rename_ctl(codec, "Capture Volume",
5338 			   codec->addr == 0 ?
5339 			   "Rear-Panel Capture Volume" :
5340 			   "Front-Panel Capture Volume");
5341 		rename_ctl(codec, "Capture Switch",
5342 			   codec->addr == 0 ?
5343 			   "Rear-Panel Capture Switch" :
5344 			   "Front-Panel Capture Switch");
5345 		break;
5346 	}
5347 }
5348 
5349 /* Forcibly assign NID 0x03 to HP/LO while NID 0x02 to SPK for EQ */
5350 static void alc274_fixup_bind_dacs(struct hda_codec *codec,
5351 				    const struct hda_fixup *fix, int action)
5352 {
5353 	struct alc_spec *spec = codec->spec;
5354 	static hda_nid_t preferred_pairs[] = {
5355 		0x21, 0x03, 0x1b, 0x03, 0x16, 0x02,
5356 		0
5357 	};
5358 
5359 	if (action != HDA_FIXUP_ACT_PRE_PROBE)
5360 		return;
5361 
5362 	spec->gen.preferred_dacs = preferred_pairs;
5363 }
5364 
5365 /* for hda_fixup_thinkpad_acpi() */
5366 #include "thinkpad_helper.c"
5367 
5368 /* for dell wmi mic mute led */
5369 #include "dell_wmi_helper.c"
5370 
5371 enum {
5372 	ALC269_FIXUP_SONY_VAIO,
5373 	ALC275_FIXUP_SONY_VAIO_GPIO2,
5374 	ALC269_FIXUP_DELL_M101Z,
5375 	ALC269_FIXUP_SKU_IGNORE,
5376 	ALC269_FIXUP_ASUS_G73JW,
5377 	ALC269_FIXUP_LENOVO_EAPD,
5378 	ALC275_FIXUP_SONY_HWEQ,
5379 	ALC275_FIXUP_SONY_DISABLE_AAMIX,
5380 	ALC271_FIXUP_DMIC,
5381 	ALC269_FIXUP_PCM_44K,
5382 	ALC269_FIXUP_STEREO_DMIC,
5383 	ALC269_FIXUP_HEADSET_MIC,
5384 	ALC269_FIXUP_QUANTA_MUTE,
5385 	ALC269_FIXUP_LIFEBOOK,
5386 	ALC269_FIXUP_LIFEBOOK_EXTMIC,
5387 	ALC269_FIXUP_LIFEBOOK_HP_PIN,
5388 	ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT,
5389 	ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC,
5390 	ALC269_FIXUP_AMIC,
5391 	ALC269_FIXUP_DMIC,
5392 	ALC269VB_FIXUP_AMIC,
5393 	ALC269VB_FIXUP_DMIC,
5394 	ALC269_FIXUP_HP_MUTE_LED,
5395 	ALC269_FIXUP_HP_MUTE_LED_MIC1,
5396 	ALC269_FIXUP_HP_MUTE_LED_MIC2,
5397 	ALC269_FIXUP_HP_GPIO_LED,
5398 	ALC269_FIXUP_HP_GPIO_MIC1_LED,
5399 	ALC269_FIXUP_HP_LINE1_MIC1_LED,
5400 	ALC269_FIXUP_INV_DMIC,
5401 	ALC269_FIXUP_LENOVO_DOCK,
5402 	ALC269_FIXUP_NO_SHUTUP,
5403 	ALC286_FIXUP_SONY_MIC_NO_PRESENCE,
5404 	ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
5405 	ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
5406 	ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
5407 	ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
5408 	ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
5409 	ALC269_FIXUP_HEADSET_MODE,
5410 	ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
5411 	ALC269_FIXUP_ASPIRE_HEADSET_MIC,
5412 	ALC269_FIXUP_ASUS_X101_FUNC,
5413 	ALC269_FIXUP_ASUS_X101_VERB,
5414 	ALC269_FIXUP_ASUS_X101,
5415 	ALC271_FIXUP_AMIC_MIC2,
5416 	ALC271_FIXUP_HP_GATE_MIC_JACK,
5417 	ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572,
5418 	ALC269_FIXUP_ACER_AC700,
5419 	ALC269_FIXUP_LIMIT_INT_MIC_BOOST,
5420 	ALC269VB_FIXUP_ASUS_ZENBOOK,
5421 	ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A,
5422 	ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED,
5423 	ALC269VB_FIXUP_ORDISSIMO_EVE2,
5424 	ALC283_FIXUP_CHROME_BOOK,
5425 	ALC283_FIXUP_SENSE_COMBO_JACK,
5426 	ALC282_FIXUP_ASUS_TX300,
5427 	ALC283_FIXUP_INT_MIC,
5428 	ALC290_FIXUP_MONO_SPEAKERS,
5429 	ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
5430 	ALC290_FIXUP_SUBWOOFER,
5431 	ALC290_FIXUP_SUBWOOFER_HSJACK,
5432 	ALC269_FIXUP_THINKPAD_ACPI,
5433 	ALC269_FIXUP_DMIC_THINKPAD_ACPI,
5434 	ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
5435 	ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
5436 	ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
5437 	ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
5438 	ALC255_FIXUP_HEADSET_MODE,
5439 	ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,
5440 	ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
5441 	ALC292_FIXUP_TPT440_DOCK,
5442 	ALC292_FIXUP_TPT440,
5443 	ALC283_FIXUP_HEADSET_MIC,
5444 	ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED,
5445 	ALC282_FIXUP_ASPIRE_V5_PINS,
5446 	ALC280_FIXUP_HP_GPIO4,
5447 	ALC286_FIXUP_HP_GPIO_LED,
5448 	ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY,
5449 	ALC280_FIXUP_HP_DOCK_PINS,
5450 	ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED,
5451 	ALC280_FIXUP_HP_9480M,
5452 	ALC288_FIXUP_DELL_HEADSET_MODE,
5453 	ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
5454 	ALC288_FIXUP_DELL_XPS_13_GPIO6,
5455 	ALC288_FIXUP_DELL_XPS_13,
5456 	ALC288_FIXUP_DISABLE_AAMIX,
5457 	ALC292_FIXUP_DELL_E7X,
5458 	ALC292_FIXUP_DISABLE_AAMIX,
5459 	ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK,
5460 	ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
5461 	ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
5462 	ALC275_FIXUP_DELL_XPS,
5463 	ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE,
5464 	ALC293_FIXUP_LENOVO_SPK_NOISE,
5465 	ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
5466 	ALC255_FIXUP_DELL_SPK_NOISE,
5467 	ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
5468 	ALC280_FIXUP_HP_HEADSET_MIC,
5469 	ALC221_FIXUP_HP_FRONT_MIC,
5470 	ALC292_FIXUP_TPT460,
5471 	ALC298_FIXUP_SPK_VOLUME,
5472 	ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER,
5473 	ALC269_FIXUP_ATIV_BOOK_8,
5474 	ALC221_FIXUP_HP_MIC_NO_PRESENCE,
5475 	ALC256_FIXUP_ASUS_HEADSET_MODE,
5476 	ALC256_FIXUP_ASUS_MIC,
5477 	ALC256_FIXUP_ASUS_AIO_GPIO2,
5478 	ALC233_FIXUP_ASUS_MIC_NO_PRESENCE,
5479 	ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE,
5480 	ALC233_FIXUP_LENOVO_MULTI_CODECS,
5481 	ALC294_FIXUP_LENOVO_MIC_LOCATION,
5482 	ALC700_FIXUP_INTEL_REFERENCE,
5483 	ALC274_FIXUP_DELL_BIND_DACS,
5484 	ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
5485 	ALC298_FIXUP_TPT470_DOCK,
5486 };
5487 
5488 static const struct hda_fixup alc269_fixups[] = {
5489 	[ALC269_FIXUP_SONY_VAIO] = {
5490 		.type = HDA_FIXUP_PINCTLS,
5491 		.v.pins = (const struct hda_pintbl[]) {
5492 			{0x19, PIN_VREFGRD},
5493 			{}
5494 		}
5495 	},
5496 	[ALC275_FIXUP_SONY_VAIO_GPIO2] = {
5497 		.type = HDA_FIXUP_VERBS,
5498 		.v.verbs = (const struct hda_verb[]) {
5499 			{0x01, AC_VERB_SET_GPIO_MASK, 0x04},
5500 			{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04},
5501 			{0x01, AC_VERB_SET_GPIO_DATA, 0x00},
5502 			{ }
5503 		},
5504 		.chained = true,
5505 		.chain_id = ALC269_FIXUP_SONY_VAIO
5506 	},
5507 	[ALC269_FIXUP_DELL_M101Z] = {
5508 		.type = HDA_FIXUP_VERBS,
5509 		.v.verbs = (const struct hda_verb[]) {
5510 			/* Enables internal speaker */
5511 			{0x20, AC_VERB_SET_COEF_INDEX, 13},
5512 			{0x20, AC_VERB_SET_PROC_COEF, 0x4040},
5513 			{}
5514 		}
5515 	},
5516 	[ALC269_FIXUP_SKU_IGNORE] = {
5517 		.type = HDA_FIXUP_FUNC,
5518 		.v.func = alc_fixup_sku_ignore,
5519 	},
5520 	[ALC269_FIXUP_ASUS_G73JW] = {
5521 		.type = HDA_FIXUP_PINS,
5522 		.v.pins = (const struct hda_pintbl[]) {
5523 			{ 0x17, 0x99130111 }, /* subwoofer */
5524 			{ }
5525 		}
5526 	},
5527 	[ALC269_FIXUP_LENOVO_EAPD] = {
5528 		.type = HDA_FIXUP_VERBS,
5529 		.v.verbs = (const struct hda_verb[]) {
5530 			{0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
5531 			{}
5532 		}
5533 	},
5534 	[ALC275_FIXUP_SONY_HWEQ] = {
5535 		.type = HDA_FIXUP_FUNC,
5536 		.v.func = alc269_fixup_hweq,
5537 		.chained = true,
5538 		.chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
5539 	},
5540 	[ALC275_FIXUP_SONY_DISABLE_AAMIX] = {
5541 		.type = HDA_FIXUP_FUNC,
5542 		.v.func = alc_fixup_disable_aamix,
5543 		.chained = true,
5544 		.chain_id = ALC269_FIXUP_SONY_VAIO
5545 	},
5546 	[ALC271_FIXUP_DMIC] = {
5547 		.type = HDA_FIXUP_FUNC,
5548 		.v.func = alc271_fixup_dmic,
5549 	},
5550 	[ALC269_FIXUP_PCM_44K] = {
5551 		.type = HDA_FIXUP_FUNC,
5552 		.v.func = alc269_fixup_pcm_44k,
5553 		.chained = true,
5554 		.chain_id = ALC269_FIXUP_QUANTA_MUTE
5555 	},
5556 	[ALC269_FIXUP_STEREO_DMIC] = {
5557 		.type = HDA_FIXUP_FUNC,
5558 		.v.func = alc269_fixup_stereo_dmic,
5559 	},
5560 	[ALC269_FIXUP_HEADSET_MIC] = {
5561 		.type = HDA_FIXUP_FUNC,
5562 		.v.func = alc269_fixup_headset_mic,
5563 	},
5564 	[ALC269_FIXUP_QUANTA_MUTE] = {
5565 		.type = HDA_FIXUP_FUNC,
5566 		.v.func = alc269_fixup_quanta_mute,
5567 	},
5568 	[ALC269_FIXUP_LIFEBOOK] = {
5569 		.type = HDA_FIXUP_PINS,
5570 		.v.pins = (const struct hda_pintbl[]) {
5571 			{ 0x1a, 0x2101103f }, /* dock line-out */
5572 			{ 0x1b, 0x23a11040 }, /* dock mic-in */
5573 			{ }
5574 		},
5575 		.chained = true,
5576 		.chain_id = ALC269_FIXUP_QUANTA_MUTE
5577 	},
5578 	[ALC269_FIXUP_LIFEBOOK_EXTMIC] = {
5579 		.type = HDA_FIXUP_PINS,
5580 		.v.pins = (const struct hda_pintbl[]) {
5581 			{ 0x19, 0x01a1903c }, /* headset mic, with jack detect */
5582 			{ }
5583 		},
5584 	},
5585 	[ALC269_FIXUP_LIFEBOOK_HP_PIN] = {
5586 		.type = HDA_FIXUP_PINS,
5587 		.v.pins = (const struct hda_pintbl[]) {
5588 			{ 0x21, 0x0221102f }, /* HP out */
5589 			{ }
5590 		},
5591 	},
5592 	[ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT] = {
5593 		.type = HDA_FIXUP_FUNC,
5594 		.v.func = alc269_fixup_pincfg_no_hp_to_lineout,
5595 	},
5596 	[ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC] = {
5597 		.type = HDA_FIXUP_FUNC,
5598 		.v.func = alc269_fixup_pincfg_U7x7_headset_mic,
5599 	},
5600 	[ALC269_FIXUP_AMIC] = {
5601 		.type = HDA_FIXUP_PINS,
5602 		.v.pins = (const struct hda_pintbl[]) {
5603 			{ 0x14, 0x99130110 }, /* speaker */
5604 			{ 0x15, 0x0121401f }, /* HP out */
5605 			{ 0x18, 0x01a19c20 }, /* mic */
5606 			{ 0x19, 0x99a3092f }, /* int-mic */
5607 			{ }
5608 		},
5609 	},
5610 	[ALC269_FIXUP_DMIC] = {
5611 		.type = HDA_FIXUP_PINS,
5612 		.v.pins = (const struct hda_pintbl[]) {
5613 			{ 0x12, 0x99a3092f }, /* int-mic */
5614 			{ 0x14, 0x99130110 }, /* speaker */
5615 			{ 0x15, 0x0121401f }, /* HP out */
5616 			{ 0x18, 0x01a19c20 }, /* mic */
5617 			{ }
5618 		},
5619 	},
5620 	[ALC269VB_FIXUP_AMIC] = {
5621 		.type = HDA_FIXUP_PINS,
5622 		.v.pins = (const struct hda_pintbl[]) {
5623 			{ 0x14, 0x99130110 }, /* speaker */
5624 			{ 0x18, 0x01a19c20 }, /* mic */
5625 			{ 0x19, 0x99a3092f }, /* int-mic */
5626 			{ 0x21, 0x0121401f }, /* HP out */
5627 			{ }
5628 		},
5629 	},
5630 	[ALC269VB_FIXUP_DMIC] = {
5631 		.type = HDA_FIXUP_PINS,
5632 		.v.pins = (const struct hda_pintbl[]) {
5633 			{ 0x12, 0x99a3092f }, /* int-mic */
5634 			{ 0x14, 0x99130110 }, /* speaker */
5635 			{ 0x18, 0x01a19c20 }, /* mic */
5636 			{ 0x21, 0x0121401f }, /* HP out */
5637 			{ }
5638 		},
5639 	},
5640 	[ALC269_FIXUP_HP_MUTE_LED] = {
5641 		.type = HDA_FIXUP_FUNC,
5642 		.v.func = alc269_fixup_hp_mute_led,
5643 	},
5644 	[ALC269_FIXUP_HP_MUTE_LED_MIC1] = {
5645 		.type = HDA_FIXUP_FUNC,
5646 		.v.func = alc269_fixup_hp_mute_led_mic1,
5647 	},
5648 	[ALC269_FIXUP_HP_MUTE_LED_MIC2] = {
5649 		.type = HDA_FIXUP_FUNC,
5650 		.v.func = alc269_fixup_hp_mute_led_mic2,
5651 	},
5652 	[ALC269_FIXUP_HP_GPIO_LED] = {
5653 		.type = HDA_FIXUP_FUNC,
5654 		.v.func = alc269_fixup_hp_gpio_led,
5655 	},
5656 	[ALC269_FIXUP_HP_GPIO_MIC1_LED] = {
5657 		.type = HDA_FIXUP_FUNC,
5658 		.v.func = alc269_fixup_hp_gpio_mic1_led,
5659 	},
5660 	[ALC269_FIXUP_HP_LINE1_MIC1_LED] = {
5661 		.type = HDA_FIXUP_FUNC,
5662 		.v.func = alc269_fixup_hp_line1_mic1_led,
5663 	},
5664 	[ALC269_FIXUP_INV_DMIC] = {
5665 		.type = HDA_FIXUP_FUNC,
5666 		.v.func = alc_fixup_inv_dmic,
5667 	},
5668 	[ALC269_FIXUP_NO_SHUTUP] = {
5669 		.type = HDA_FIXUP_FUNC,
5670 		.v.func = alc_fixup_no_shutup,
5671 	},
5672 	[ALC269_FIXUP_LENOVO_DOCK] = {
5673 		.type = HDA_FIXUP_PINS,
5674 		.v.pins = (const struct hda_pintbl[]) {
5675 			{ 0x19, 0x23a11040 }, /* dock mic */
5676 			{ 0x1b, 0x2121103f }, /* dock headphone */
5677 			{ }
5678 		},
5679 		.chained = true,
5680 		.chain_id = ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT
5681 	},
5682 	[ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT] = {
5683 		.type = HDA_FIXUP_FUNC,
5684 		.v.func = alc269_fixup_pincfg_no_hp_to_lineout,
5685 		.chained = true,
5686 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
5687 	},
5688 	[ALC269_FIXUP_DELL1_MIC_NO_PRESENCE] = {
5689 		.type = HDA_FIXUP_PINS,
5690 		.v.pins = (const struct hda_pintbl[]) {
5691 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5692 			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
5693 			{ }
5694 		},
5695 		.chained = true,
5696 		.chain_id = ALC269_FIXUP_HEADSET_MODE
5697 	},
5698 	[ALC269_FIXUP_DELL2_MIC_NO_PRESENCE] = {
5699 		.type = HDA_FIXUP_PINS,
5700 		.v.pins = (const struct hda_pintbl[]) {
5701 			{ 0x16, 0x21014020 }, /* dock line out */
5702 			{ 0x19, 0x21a19030 }, /* dock mic */
5703 			{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5704 			{ }
5705 		},
5706 		.chained = true,
5707 		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
5708 	},
5709 	[ALC269_FIXUP_DELL3_MIC_NO_PRESENCE] = {
5710 		.type = HDA_FIXUP_PINS,
5711 		.v.pins = (const struct hda_pintbl[]) {
5712 			{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5713 			{ }
5714 		},
5715 		.chained = true,
5716 		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
5717 	},
5718 	[ALC269_FIXUP_DELL4_MIC_NO_PRESENCE] = {
5719 		.type = HDA_FIXUP_PINS,
5720 		.v.pins = (const struct hda_pintbl[]) {
5721 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5722 			{ 0x1b, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
5723 			{ }
5724 		},
5725 		.chained = true,
5726 		.chain_id = ALC269_FIXUP_HEADSET_MODE
5727 	},
5728 	[ALC269_FIXUP_HEADSET_MODE] = {
5729 		.type = HDA_FIXUP_FUNC,
5730 		.v.func = alc_fixup_headset_mode,
5731 		.chained = true,
5732 		.chain_id = ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED
5733 	},
5734 	[ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
5735 		.type = HDA_FIXUP_FUNC,
5736 		.v.func = alc_fixup_headset_mode_no_hp_mic,
5737 	},
5738 	[ALC269_FIXUP_ASPIRE_HEADSET_MIC] = {
5739 		.type = HDA_FIXUP_PINS,
5740 		.v.pins = (const struct hda_pintbl[]) {
5741 			{ 0x19, 0x01a1913c }, /* headset mic w/o jack detect */
5742 			{ }
5743 		},
5744 		.chained = true,
5745 		.chain_id = ALC269_FIXUP_HEADSET_MODE,
5746 	},
5747 	[ALC286_FIXUP_SONY_MIC_NO_PRESENCE] = {
5748 		.type = HDA_FIXUP_PINS,
5749 		.v.pins = (const struct hda_pintbl[]) {
5750 			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5751 			{ }
5752 		},
5753 		.chained = true,
5754 		.chain_id = ALC269_FIXUP_HEADSET_MIC
5755 	},
5756 	[ALC269_FIXUP_ASUS_X101_FUNC] = {
5757 		.type = HDA_FIXUP_FUNC,
5758 		.v.func = alc269_fixup_x101_headset_mic,
5759 	},
5760 	[ALC269_FIXUP_ASUS_X101_VERB] = {
5761 		.type = HDA_FIXUP_VERBS,
5762 		.v.verbs = (const struct hda_verb[]) {
5763 			{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5764 			{0x20, AC_VERB_SET_COEF_INDEX, 0x08},
5765 			{0x20, AC_VERB_SET_PROC_COEF,  0x0310},
5766 			{ }
5767 		},
5768 		.chained = true,
5769 		.chain_id = ALC269_FIXUP_ASUS_X101_FUNC
5770 	},
5771 	[ALC269_FIXUP_ASUS_X101] = {
5772 		.type = HDA_FIXUP_PINS,
5773 		.v.pins = (const struct hda_pintbl[]) {
5774 			{ 0x18, 0x04a1182c }, /* Headset mic */
5775 			{ }
5776 		},
5777 		.chained = true,
5778 		.chain_id = ALC269_FIXUP_ASUS_X101_VERB
5779 	},
5780 	[ALC271_FIXUP_AMIC_MIC2] = {
5781 		.type = HDA_FIXUP_PINS,
5782 		.v.pins = (const struct hda_pintbl[]) {
5783 			{ 0x14, 0x99130110 }, /* speaker */
5784 			{ 0x19, 0x01a19c20 }, /* mic */
5785 			{ 0x1b, 0x99a7012f }, /* int-mic */
5786 			{ 0x21, 0x0121401f }, /* HP out */
5787 			{ }
5788 		},
5789 	},
5790 	[ALC271_FIXUP_HP_GATE_MIC_JACK] = {
5791 		.type = HDA_FIXUP_FUNC,
5792 		.v.func = alc271_hp_gate_mic_jack,
5793 		.chained = true,
5794 		.chain_id = ALC271_FIXUP_AMIC_MIC2,
5795 	},
5796 	[ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572] = {
5797 		.type = HDA_FIXUP_FUNC,
5798 		.v.func = alc269_fixup_limit_int_mic_boost,
5799 		.chained = true,
5800 		.chain_id = ALC271_FIXUP_HP_GATE_MIC_JACK,
5801 	},
5802 	[ALC269_FIXUP_ACER_AC700] = {
5803 		.type = HDA_FIXUP_PINS,
5804 		.v.pins = (const struct hda_pintbl[]) {
5805 			{ 0x12, 0x99a3092f }, /* int-mic */
5806 			{ 0x14, 0x99130110 }, /* speaker */
5807 			{ 0x18, 0x03a11c20 }, /* mic */
5808 			{ 0x1e, 0x0346101e }, /* SPDIF1 */
5809 			{ 0x21, 0x0321101f }, /* HP out */
5810 			{ }
5811 		},
5812 		.chained = true,
5813 		.chain_id = ALC271_FIXUP_DMIC,
5814 	},
5815 	[ALC269_FIXUP_LIMIT_INT_MIC_BOOST] = {
5816 		.type = HDA_FIXUP_FUNC,
5817 		.v.func = alc269_fixup_limit_int_mic_boost,
5818 		.chained = true,
5819 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
5820 	},
5821 	[ALC269VB_FIXUP_ASUS_ZENBOOK] = {
5822 		.type = HDA_FIXUP_FUNC,
5823 		.v.func = alc269_fixup_limit_int_mic_boost,
5824 		.chained = true,
5825 		.chain_id = ALC269VB_FIXUP_DMIC,
5826 	},
5827 	[ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A] = {
5828 		.type = HDA_FIXUP_VERBS,
5829 		.v.verbs = (const struct hda_verb[]) {
5830 			/* class-D output amp +5dB */
5831 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x12 },
5832 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2800 },
5833 			{}
5834 		},
5835 		.chained = true,
5836 		.chain_id = ALC269VB_FIXUP_ASUS_ZENBOOK,
5837 	},
5838 	[ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED] = {
5839 		.type = HDA_FIXUP_FUNC,
5840 		.v.func = alc269_fixup_limit_int_mic_boost,
5841 		.chained = true,
5842 		.chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC1,
5843 	},
5844 	[ALC269VB_FIXUP_ORDISSIMO_EVE2] = {
5845 		.type = HDA_FIXUP_PINS,
5846 		.v.pins = (const struct hda_pintbl[]) {
5847 			{ 0x12, 0x99a3092f }, /* int-mic */
5848 			{ 0x18, 0x03a11d20 }, /* mic */
5849 			{ 0x19, 0x411111f0 }, /* Unused bogus pin */
5850 			{ }
5851 		},
5852 	},
5853 	[ALC283_FIXUP_CHROME_BOOK] = {
5854 		.type = HDA_FIXUP_FUNC,
5855 		.v.func = alc283_fixup_chromebook,
5856 	},
5857 	[ALC283_FIXUP_SENSE_COMBO_JACK] = {
5858 		.type = HDA_FIXUP_FUNC,
5859 		.v.func = alc283_fixup_sense_combo_jack,
5860 		.chained = true,
5861 		.chain_id = ALC283_FIXUP_CHROME_BOOK,
5862 	},
5863 	[ALC282_FIXUP_ASUS_TX300] = {
5864 		.type = HDA_FIXUP_FUNC,
5865 		.v.func = alc282_fixup_asus_tx300,
5866 	},
5867 	[ALC283_FIXUP_INT_MIC] = {
5868 		.type = HDA_FIXUP_VERBS,
5869 		.v.verbs = (const struct hda_verb[]) {
5870 			{0x20, AC_VERB_SET_COEF_INDEX, 0x1a},
5871 			{0x20, AC_VERB_SET_PROC_COEF, 0x0011},
5872 			{ }
5873 		},
5874 		.chained = true,
5875 		.chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
5876 	},
5877 	[ALC290_FIXUP_SUBWOOFER_HSJACK] = {
5878 		.type = HDA_FIXUP_PINS,
5879 		.v.pins = (const struct hda_pintbl[]) {
5880 			{ 0x17, 0x90170112 }, /* subwoofer */
5881 			{ }
5882 		},
5883 		.chained = true,
5884 		.chain_id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
5885 	},
5886 	[ALC290_FIXUP_SUBWOOFER] = {
5887 		.type = HDA_FIXUP_PINS,
5888 		.v.pins = (const struct hda_pintbl[]) {
5889 			{ 0x17, 0x90170112 }, /* subwoofer */
5890 			{ }
5891 		},
5892 		.chained = true,
5893 		.chain_id = ALC290_FIXUP_MONO_SPEAKERS,
5894 	},
5895 	[ALC290_FIXUP_MONO_SPEAKERS] = {
5896 		.type = HDA_FIXUP_FUNC,
5897 		.v.func = alc290_fixup_mono_speakers,
5898 	},
5899 	[ALC290_FIXUP_MONO_SPEAKERS_HSJACK] = {
5900 		.type = HDA_FIXUP_FUNC,
5901 		.v.func = alc290_fixup_mono_speakers,
5902 		.chained = true,
5903 		.chain_id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
5904 	},
5905 	[ALC269_FIXUP_THINKPAD_ACPI] = {
5906 		.type = HDA_FIXUP_FUNC,
5907 		.v.func = hda_fixup_thinkpad_acpi,
5908 		.chained = true,
5909 		.chain_id = ALC269_FIXUP_SKU_IGNORE,
5910 	},
5911 	[ALC269_FIXUP_DMIC_THINKPAD_ACPI] = {
5912 		.type = HDA_FIXUP_FUNC,
5913 		.v.func = alc_fixup_inv_dmic,
5914 		.chained = true,
5915 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
5916 	},
5917 	[ALC255_FIXUP_ACER_MIC_NO_PRESENCE] = {
5918 		.type = HDA_FIXUP_PINS,
5919 		.v.pins = (const struct hda_pintbl[]) {
5920 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5921 			{ }
5922 		},
5923 		.chained = true,
5924 		.chain_id = ALC255_FIXUP_HEADSET_MODE
5925 	},
5926 	[ALC255_FIXUP_ASUS_MIC_NO_PRESENCE] = {
5927 		.type = HDA_FIXUP_PINS,
5928 		.v.pins = (const struct hda_pintbl[]) {
5929 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5930 			{ }
5931 		},
5932 		.chained = true,
5933 		.chain_id = ALC255_FIXUP_HEADSET_MODE
5934 	},
5935 	[ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = {
5936 		.type = HDA_FIXUP_PINS,
5937 		.v.pins = (const struct hda_pintbl[]) {
5938 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5939 			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
5940 			{ }
5941 		},
5942 		.chained = true,
5943 		.chain_id = ALC255_FIXUP_HEADSET_MODE
5944 	},
5945 	[ALC255_FIXUP_DELL2_MIC_NO_PRESENCE] = {
5946 		.type = HDA_FIXUP_PINS,
5947 		.v.pins = (const struct hda_pintbl[]) {
5948 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5949 			{ }
5950 		},
5951 		.chained = true,
5952 		.chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
5953 	},
5954 	[ALC255_FIXUP_HEADSET_MODE] = {
5955 		.type = HDA_FIXUP_FUNC,
5956 		.v.func = alc_fixup_headset_mode_alc255,
5957 		.chained = true,
5958 		.chain_id = ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED
5959 	},
5960 	[ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
5961 		.type = HDA_FIXUP_FUNC,
5962 		.v.func = alc_fixup_headset_mode_alc255_no_hp_mic,
5963 	},
5964 	[ALC293_FIXUP_DELL1_MIC_NO_PRESENCE] = {
5965 		.type = HDA_FIXUP_PINS,
5966 		.v.pins = (const struct hda_pintbl[]) {
5967 			{ 0x18, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
5968 			{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5969 			{ }
5970 		},
5971 		.chained = true,
5972 		.chain_id = ALC269_FIXUP_HEADSET_MODE
5973 	},
5974 	[ALC292_FIXUP_TPT440_DOCK] = {
5975 		.type = HDA_FIXUP_FUNC,
5976 		.v.func = alc_fixup_tpt440_dock,
5977 		.chained = true,
5978 		.chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
5979 	},
5980 	[ALC292_FIXUP_TPT440] = {
5981 		.type = HDA_FIXUP_FUNC,
5982 		.v.func = alc_fixup_disable_aamix,
5983 		.chained = true,
5984 		.chain_id = ALC292_FIXUP_TPT440_DOCK,
5985 	},
5986 	[ALC283_FIXUP_HEADSET_MIC] = {
5987 		.type = HDA_FIXUP_PINS,
5988 		.v.pins = (const struct hda_pintbl[]) {
5989 			{ 0x19, 0x04a110f0 },
5990 			{ },
5991 		},
5992 	},
5993 	[ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED] = {
5994 		.type = HDA_FIXUP_FUNC,
5995 		.v.func = alc_fixup_dell_wmi,
5996 	},
5997 	[ALC282_FIXUP_ASPIRE_V5_PINS] = {
5998 		.type = HDA_FIXUP_PINS,
5999 		.v.pins = (const struct hda_pintbl[]) {
6000 			{ 0x12, 0x90a60130 },
6001 			{ 0x14, 0x90170110 },
6002 			{ 0x17, 0x40000008 },
6003 			{ 0x18, 0x411111f0 },
6004 			{ 0x19, 0x01a1913c },
6005 			{ 0x1a, 0x411111f0 },
6006 			{ 0x1b, 0x411111f0 },
6007 			{ 0x1d, 0x40f89b2d },
6008 			{ 0x1e, 0x411111f0 },
6009 			{ 0x21, 0x0321101f },
6010 			{ },
6011 		},
6012 	},
6013 	[ALC280_FIXUP_HP_GPIO4] = {
6014 		.type = HDA_FIXUP_FUNC,
6015 		.v.func = alc280_fixup_hp_gpio4,
6016 	},
6017 	[ALC286_FIXUP_HP_GPIO_LED] = {
6018 		.type = HDA_FIXUP_FUNC,
6019 		.v.func = alc286_fixup_hp_gpio_led,
6020 	},
6021 	[ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY] = {
6022 		.type = HDA_FIXUP_FUNC,
6023 		.v.func = alc280_fixup_hp_gpio2_mic_hotkey,
6024 	},
6025 	[ALC280_FIXUP_HP_DOCK_PINS] = {
6026 		.type = HDA_FIXUP_PINS,
6027 		.v.pins = (const struct hda_pintbl[]) {
6028 			{ 0x1b, 0x21011020 }, /* line-out */
6029 			{ 0x1a, 0x01a1903c }, /* headset mic */
6030 			{ 0x18, 0x2181103f }, /* line-in */
6031 			{ },
6032 		},
6033 		.chained = true,
6034 		.chain_id = ALC280_FIXUP_HP_GPIO4
6035 	},
6036 	[ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED] = {
6037 		.type = HDA_FIXUP_PINS,
6038 		.v.pins = (const struct hda_pintbl[]) {
6039 			{ 0x1b, 0x21011020 }, /* line-out */
6040 			{ 0x18, 0x2181103f }, /* line-in */
6041 			{ },
6042 		},
6043 		.chained = true,
6044 		.chain_id = ALC269_FIXUP_HP_GPIO_MIC1_LED
6045 	},
6046 	[ALC280_FIXUP_HP_9480M] = {
6047 		.type = HDA_FIXUP_FUNC,
6048 		.v.func = alc280_fixup_hp_9480m,
6049 	},
6050 	[ALC288_FIXUP_DELL_HEADSET_MODE] = {
6051 		.type = HDA_FIXUP_FUNC,
6052 		.v.func = alc_fixup_headset_mode_dell_alc288,
6053 		.chained = true,
6054 		.chain_id = ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED
6055 	},
6056 	[ALC288_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6057 		.type = HDA_FIXUP_PINS,
6058 		.v.pins = (const struct hda_pintbl[]) {
6059 			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6060 			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6061 			{ }
6062 		},
6063 		.chained = true,
6064 		.chain_id = ALC288_FIXUP_DELL_HEADSET_MODE
6065 	},
6066 	[ALC288_FIXUP_DELL_XPS_13_GPIO6] = {
6067 		.type = HDA_FIXUP_VERBS,
6068 		.v.verbs = (const struct hda_verb[]) {
6069 			{0x01, AC_VERB_SET_GPIO_MASK, 0x40},
6070 			{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x40},
6071 			{0x01, AC_VERB_SET_GPIO_DATA, 0x00},
6072 			{ }
6073 		},
6074 		.chained = true,
6075 		.chain_id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE
6076 	},
6077 	[ALC288_FIXUP_DISABLE_AAMIX] = {
6078 		.type = HDA_FIXUP_FUNC,
6079 		.v.func = alc_fixup_disable_aamix,
6080 		.chained = true,
6081 		.chain_id = ALC288_FIXUP_DELL_XPS_13_GPIO6
6082 	},
6083 	[ALC288_FIXUP_DELL_XPS_13] = {
6084 		.type = HDA_FIXUP_FUNC,
6085 		.v.func = alc_fixup_dell_xps13,
6086 		.chained = true,
6087 		.chain_id = ALC288_FIXUP_DISABLE_AAMIX
6088 	},
6089 	[ALC292_FIXUP_DISABLE_AAMIX] = {
6090 		.type = HDA_FIXUP_FUNC,
6091 		.v.func = alc_fixup_disable_aamix,
6092 		.chained = true,
6093 		.chain_id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE
6094 	},
6095 	[ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK] = {
6096 		.type = HDA_FIXUP_FUNC,
6097 		.v.func = alc_fixup_disable_aamix,
6098 		.chained = true,
6099 		.chain_id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE
6100 	},
6101 	[ALC292_FIXUP_DELL_E7X] = {
6102 		.type = HDA_FIXUP_FUNC,
6103 		.v.func = alc_fixup_dell_xps13,
6104 		.chained = true,
6105 		.chain_id = ALC292_FIXUP_DISABLE_AAMIX
6106 	},
6107 	[ALC298_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6108 		.type = HDA_FIXUP_PINS,
6109 		.v.pins = (const struct hda_pintbl[]) {
6110 			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6111 			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6112 			{ }
6113 		},
6114 		.chained = true,
6115 		.chain_id = ALC269_FIXUP_HEADSET_MODE
6116 	},
6117 	[ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE] = {
6118 		.type = HDA_FIXUP_PINS,
6119 		.v.pins = (const struct hda_pintbl[]) {
6120 			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6121 			{ }
6122 		},
6123 		.chained = true,
6124 		.chain_id = ALC269_FIXUP_HEADSET_MODE
6125 	},
6126 	[ALC275_FIXUP_DELL_XPS] = {
6127 		.type = HDA_FIXUP_VERBS,
6128 		.v.verbs = (const struct hda_verb[]) {
6129 			/* Enables internal speaker */
6130 			{0x20, AC_VERB_SET_COEF_INDEX, 0x1f},
6131 			{0x20, AC_VERB_SET_PROC_COEF, 0x00c0},
6132 			{0x20, AC_VERB_SET_COEF_INDEX, 0x30},
6133 			{0x20, AC_VERB_SET_PROC_COEF, 0x00b1},
6134 			{}
6135 		}
6136 	},
6137 	[ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE] = {
6138 		.type = HDA_FIXUP_VERBS,
6139 		.v.verbs = (const struct hda_verb[]) {
6140 			/* Disable pass-through path for FRONT 14h */
6141 			{0x20, AC_VERB_SET_COEF_INDEX, 0x36},
6142 			{0x20, AC_VERB_SET_PROC_COEF, 0x1737},
6143 			{}
6144 		},
6145 		.chained = true,
6146 		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
6147 	},
6148 	[ALC293_FIXUP_LENOVO_SPK_NOISE] = {
6149 		.type = HDA_FIXUP_FUNC,
6150 		.v.func = alc_fixup_disable_aamix,
6151 		.chained = true,
6152 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI
6153 	},
6154 	[ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY] = {
6155 		.type = HDA_FIXUP_FUNC,
6156 		.v.func = alc233_fixup_lenovo_line2_mic_hotkey,
6157 	},
6158 	[ALC255_FIXUP_DELL_SPK_NOISE] = {
6159 		.type = HDA_FIXUP_FUNC,
6160 		.v.func = alc_fixup_disable_aamix,
6161 		.chained = true,
6162 		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
6163 	},
6164 	[ALC225_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6165 		.type = HDA_FIXUP_VERBS,
6166 		.v.verbs = (const struct hda_verb[]) {
6167 			/* Disable pass-through path for FRONT 14h */
6168 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
6169 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
6170 			{}
6171 		},
6172 		.chained = true,
6173 		.chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
6174 	},
6175 	[ALC280_FIXUP_HP_HEADSET_MIC] = {
6176 		.type = HDA_FIXUP_FUNC,
6177 		.v.func = alc_fixup_disable_aamix,
6178 		.chained = true,
6179 		.chain_id = ALC269_FIXUP_HEADSET_MIC,
6180 	},
6181 	[ALC221_FIXUP_HP_FRONT_MIC] = {
6182 		.type = HDA_FIXUP_PINS,
6183 		.v.pins = (const struct hda_pintbl[]) {
6184 			{ 0x19, 0x02a19020 }, /* Front Mic */
6185 			{ }
6186 		},
6187 	},
6188 	[ALC292_FIXUP_TPT460] = {
6189 		.type = HDA_FIXUP_FUNC,
6190 		.v.func = alc_fixup_tpt440_dock,
6191 		.chained = true,
6192 		.chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE,
6193 	},
6194 	[ALC298_FIXUP_SPK_VOLUME] = {
6195 		.type = HDA_FIXUP_FUNC,
6196 		.v.func = alc298_fixup_speaker_volume,
6197 		.chained = true,
6198 		.chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
6199 	},
6200 	[ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {
6201 		.type = HDA_FIXUP_PINS,
6202 		.v.pins = (const struct hda_pintbl[]) {
6203 			{ 0x1b, 0x90170151 },
6204 			{ }
6205 		},
6206 		.chained = true,
6207 		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
6208 	},
6209 	[ALC269_FIXUP_ATIV_BOOK_8] = {
6210 		.type = HDA_FIXUP_FUNC,
6211 		.v.func = alc_fixup_auto_mute_via_amp,
6212 		.chained = true,
6213 		.chain_id = ALC269_FIXUP_NO_SHUTUP
6214 	},
6215 	[ALC221_FIXUP_HP_MIC_NO_PRESENCE] = {
6216 		.type = HDA_FIXUP_PINS,
6217 		.v.pins = (const struct hda_pintbl[]) {
6218 			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6219 			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6220 			{ }
6221 		},
6222 		.chained = true,
6223 		.chain_id = ALC269_FIXUP_HEADSET_MODE
6224 	},
6225 	[ALC256_FIXUP_ASUS_HEADSET_MODE] = {
6226 		.type = HDA_FIXUP_FUNC,
6227 		.v.func = alc_fixup_headset_mode,
6228 	},
6229 	[ALC256_FIXUP_ASUS_MIC] = {
6230 		.type = HDA_FIXUP_PINS,
6231 		.v.pins = (const struct hda_pintbl[]) {
6232 			{ 0x13, 0x90a60160 }, /* use as internal mic */
6233 			{ 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
6234 			{ }
6235 		},
6236 		.chained = true,
6237 		.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
6238 	},
6239 	[ALC256_FIXUP_ASUS_AIO_GPIO2] = {
6240 		.type = HDA_FIXUP_VERBS,
6241 		.v.verbs = (const struct hda_verb[]) {
6242 			/* Set up GPIO2 for the speaker amp */
6243 			{ 0x01, AC_VERB_SET_GPIO_MASK, 0x04 },
6244 			{ 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04 },
6245 			{ 0x01, AC_VERB_SET_GPIO_DATA, 0x04 },
6246 			{}
6247 		},
6248 	},
6249 	[ALC233_FIXUP_ASUS_MIC_NO_PRESENCE] = {
6250 		.type = HDA_FIXUP_PINS,
6251 		.v.pins = (const struct hda_pintbl[]) {
6252 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6253 			{ }
6254 		},
6255 		.chained = true,
6256 		.chain_id = ALC269_FIXUP_HEADSET_MIC
6257 	},
6258 	[ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE] = {
6259 		.type = HDA_FIXUP_VERBS,
6260 		.v.verbs = (const struct hda_verb[]) {
6261 			/* Enables internal speaker */
6262 			{0x20, AC_VERB_SET_COEF_INDEX, 0x40},
6263 			{0x20, AC_VERB_SET_PROC_COEF, 0x8800},
6264 			{}
6265 		},
6266 		.chained = true,
6267 		.chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
6268 	},
6269 	[ALC233_FIXUP_LENOVO_MULTI_CODECS] = {
6270 		.type = HDA_FIXUP_FUNC,
6271 		.v.func = alc233_alc662_fixup_lenovo_dual_codecs,
6272 	},
6273 	[ALC294_FIXUP_LENOVO_MIC_LOCATION] = {
6274 		.type = HDA_FIXUP_PINS,
6275 		.v.pins = (const struct hda_pintbl[]) {
6276 			/* Change the mic location from front to right, otherwise there are
6277 			   two front mics with the same name, pulseaudio can't handle them.
6278 			   This is just a temporary workaround, after applying this fixup,
6279 			   there will be one "Front Mic" and one "Mic" in this machine.
6280 			 */
6281 			{ 0x1a, 0x04a19040 },
6282 			{ }
6283 		},
6284 	},
6285 	[ALC700_FIXUP_INTEL_REFERENCE] = {
6286 		.type = HDA_FIXUP_VERBS,
6287 		.v.verbs = (const struct hda_verb[]) {
6288 			/* Enables internal speaker */
6289 			{0x20, AC_VERB_SET_COEF_INDEX, 0x45},
6290 			{0x20, AC_VERB_SET_PROC_COEF, 0x5289},
6291 			{0x20, AC_VERB_SET_COEF_INDEX, 0x4A},
6292 			{0x20, AC_VERB_SET_PROC_COEF, 0x001b},
6293 			{0x58, AC_VERB_SET_COEF_INDEX, 0x00},
6294 			{0x58, AC_VERB_SET_PROC_COEF, 0x3888},
6295 			{0x20, AC_VERB_SET_COEF_INDEX, 0x6f},
6296 			{0x20, AC_VERB_SET_PROC_COEF, 0x2c0b},
6297 			{}
6298 		}
6299 	},
6300 	[ALC274_FIXUP_DELL_BIND_DACS] = {
6301 		.type = HDA_FIXUP_FUNC,
6302 		.v.func = alc274_fixup_bind_dacs,
6303 		.chained = true,
6304 		.chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
6305 	},
6306 	[ALC274_FIXUP_DELL_AIO_LINEOUT_VERB] = {
6307 		.type = HDA_FIXUP_PINS,
6308 		.v.pins = (const struct hda_pintbl[]) {
6309 			{ 0x1b, 0x0401102f },
6310 			{ }
6311 		},
6312 		.chained = true,
6313 		.chain_id = ALC274_FIXUP_DELL_BIND_DACS
6314 	},
6315 	[ALC298_FIXUP_TPT470_DOCK] = {
6316 		.type = HDA_FIXUP_FUNC,
6317 		.v.func = alc_fixup_tpt470_dock,
6318 		.chained = true,
6319 		.chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE
6320 	},
6321 };
6322 
6323 static const struct snd_pci_quirk alc269_fixup_tbl[] = {
6324 	SND_PCI_QUIRK(0x1025, 0x0283, "Acer TravelMate 8371", ALC269_FIXUP_INV_DMIC),
6325 	SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC),
6326 	SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC),
6327 	SND_PCI_QUIRK(0x1025, 0x047c, "Acer AC700", ALC269_FIXUP_ACER_AC700),
6328 	SND_PCI_QUIRK(0x1025, 0x072d, "Acer Aspire V5-571G", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
6329 	SND_PCI_QUIRK(0x1025, 0x080d, "Acer Aspire V5-122P", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
6330 	SND_PCI_QUIRK(0x1025, 0x0740, "Acer AO725", ALC271_FIXUP_HP_GATE_MIC_JACK),
6331 	SND_PCI_QUIRK(0x1025, 0x0742, "Acer AO756", ALC271_FIXUP_HP_GATE_MIC_JACK),
6332 	SND_PCI_QUIRK(0x1025, 0x0762, "Acer Aspire E1-472", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
6333 	SND_PCI_QUIRK(0x1025, 0x0775, "Acer Aspire E1-572", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
6334 	SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS),
6335 	SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK),
6336 	SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
6337 	SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS),
6338 	SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X),
6339 	SND_PCI_QUIRK(0x1028, 0x05be, "Dell Latitude E6540", ALC292_FIXUP_DELL_E7X),
6340 	SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X),
6341 	SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X),
6342 	SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER),
6343 	SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
6344 	SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
6345 	SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
6346 	SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
6347 	SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
6348 	SND_PCI_QUIRK(0x1028, 0x062c, "Dell Latitude E5550", ALC292_FIXUP_DELL_E7X),
6349 	SND_PCI_QUIRK(0x1028, 0x062e, "Dell Latitude E7450", ALC292_FIXUP_DELL_E7X),
6350 	SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),
6351 	SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
6352 	SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
6353 	SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13),
6354 	SND_PCI_QUIRK(0x1028, 0x0669, "Dell Optiplex 9020m", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
6355 	SND_PCI_QUIRK(0x1028, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK),
6356 	SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
6357 	SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
6358 	SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
6359 	SND_PCI_QUIRK(0x1028, 0x06db, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
6360 	SND_PCI_QUIRK(0x1028, 0x06dd, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
6361 	SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
6362 	SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
6363 	SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
6364 	SND_PCI_QUIRK(0x1028, 0x0704, "Dell XPS 13 9350", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE),
6365 	SND_PCI_QUIRK(0x1028, 0x0706, "Dell Inspiron 7559", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
6366 	SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE),
6367 	SND_PCI_QUIRK(0x1028, 0x075b, "Dell XPS 13 9360", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE),
6368 	SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME),
6369 	SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
6370 	SND_PCI_QUIRK(0x1028, 0x082a, "Dell XPS 13 9360", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE),
6371 	SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
6372 	SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
6373 	SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
6374 	SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
6375 	SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
6376 	SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),
6377 	SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED),
6378 	SND_PCI_QUIRK(0x103c, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY),
6379 	/* ALC282 */
6380 	SND_PCI_QUIRK(0x103c, 0x21f9, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6381 	SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6382 	SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6383 	SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
6384 	SND_PCI_QUIRK(0x103c, 0x2237, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
6385 	SND_PCI_QUIRK(0x103c, 0x2238, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
6386 	SND_PCI_QUIRK(0x103c, 0x2239, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
6387 	SND_PCI_QUIRK(0x103c, 0x224b, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
6388 	SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6389 	SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6390 	SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6391 	SND_PCI_QUIRK(0x103c, 0x226e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6392 	SND_PCI_QUIRK(0x103c, 0x2271, "HP", ALC286_FIXUP_HP_GPIO_LED),
6393 	SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC280_FIXUP_HP_DOCK_PINS),
6394 	SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC280_FIXUP_HP_DOCK_PINS),
6395 	SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6396 	SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6397 	SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6398 	SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6399 	SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6400 	SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC280_FIXUP_HP_9480M),
6401 	SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6402 	SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6403 	/* ALC290 */
6404 	SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6405 	SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6406 	SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6407 	SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6408 	SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6409 	SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6410 	SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6411 	SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6412 	SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6413 	SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED),
6414 	SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6415 	SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6416 	SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6417 	SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6418 	SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6419 	SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6420 	SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6421 	SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6422 	SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6423 	SND_PCI_QUIRK(0x103c, 0x228b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6424 	SND_PCI_QUIRK(0x103c, 0x228e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6425 	SND_PCI_QUIRK(0x103c, 0x22c5, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6426 	SND_PCI_QUIRK(0x103c, 0x22c7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6427 	SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6428 	SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6429 	SND_PCI_QUIRK(0x103c, 0x2334, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6430 	SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6431 	SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6432 	SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6433 	SND_PCI_QUIRK(0x103c, 0x221c, "HP EliteBook 755 G2", ALC280_FIXUP_HP_HEADSET_MIC),
6434 	SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC),
6435 	SND_PCI_QUIRK(0x103c, 0x82bf, "HP", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
6436 	SND_PCI_QUIRK(0x103c, 0x82c0, "HP", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
6437 	SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
6438 	SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
6439 	SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
6440 	SND_PCI_QUIRK(0x1043, 0x10c0, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
6441 	SND_PCI_QUIRK(0x1043, 0x10d0, "ASUS X540LA/X540LJ", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
6442 	SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
6443 	SND_PCI_QUIRK(0x1043, 0x11c0, "ASUS X556UR", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
6444 	SND_PCI_QUIRK(0x1043, 0x1290, "ASUS X441SA", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
6445 	SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
6446 	SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC),
6447 	SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),
6448 	SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
6449 	SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
6450 	SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
6451 	SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
6452 	SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
6453 	SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC),
6454 	SND_PCI_QUIRK(0x1043, 0x1b13, "Asus U41SV", ALC269_FIXUP_INV_DMIC),
6455 	SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
6456 	SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
6457 	SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
6458 	SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
6459 	SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
6460 	SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
6461 	SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
6462 	SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
6463 	SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
6464 	SND_PCI_QUIRK(0x104d, 0x90b5, "Sony VAIO Pro 11", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
6465 	SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
6466 	SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
6467 	SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
6468 	SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
6469 	SND_PCI_QUIRK(0x104d, 0x9099, "Sony VAIO S13", ALC275_FIXUP_SONY_DISABLE_AAMIX),
6470 	SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),
6471 	SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT),
6472 	SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN),
6473 	SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN),
6474 	SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC),
6475 	SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),
6476 	SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE),
6477 	SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
6478 	SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
6479 	SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
6480 	SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),
6481 	SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
6482 	SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
6483 	SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
6484 	SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
6485 	SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
6486 	SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
6487 	SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK),
6488 	SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK),
6489 	SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),
6490 	SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),
6491 	SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK),
6492 	SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK),
6493 	SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440),
6494 	SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK),
6495 	SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK),
6496 	SND_PCI_QUIRK(0x17aa, 0x2211, "Thinkpad W541", ALC292_FIXUP_TPT440_DOCK),
6497 	SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK),
6498 	SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK),
6499 	SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
6500 	SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK),
6501 	SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK),
6502 	SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK),
6503 	SND_PCI_QUIRK(0x17aa, 0x222d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
6504 	SND_PCI_QUIRK(0x17aa, 0x222e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
6505 	SND_PCI_QUIRK(0x17aa, 0x2231, "Thinkpad T560", ALC292_FIXUP_TPT460),
6506 	SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460),
6507 	SND_PCI_QUIRK(0x17aa, 0x2245, "Thinkpad T470", ALC298_FIXUP_TPT470_DOCK),
6508 	SND_PCI_QUIRK(0x17aa, 0x2246, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
6509 	SND_PCI_QUIRK(0x17aa, 0x2247, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
6510 	SND_PCI_QUIRK(0x17aa, 0x224b, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
6511 	SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
6512 	SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
6513 	SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
6514 	SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
6515 	SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
6516 	SND_PCI_QUIRK(0x17aa, 0x313c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
6517 	SND_PCI_QUIRK(0x17aa, 0x3112, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
6518 	SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
6519 	SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
6520 	SND_PCI_QUIRK(0x17aa, 0x3978, "IdeaPad Y410P", ALC269_FIXUP_NO_SHUTUP),
6521 	SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
6522 	SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC),
6523 	SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK),
6524 	SND_PCI_QUIRK(0x17aa, 0x5026, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
6525 	SND_PCI_QUIRK(0x17aa, 0x5034, "Thinkpad T450", ALC292_FIXUP_TPT440_DOCK),
6526 	SND_PCI_QUIRK(0x17aa, 0x5036, "Thinkpad T450s", ALC292_FIXUP_TPT440_DOCK),
6527 	SND_PCI_QUIRK(0x17aa, 0x503c, "Thinkpad L450", ALC292_FIXUP_TPT440_DOCK),
6528 	SND_PCI_QUIRK(0x17aa, 0x504a, "ThinkPad X260", ALC292_FIXUP_TPT440_DOCK),
6529 	SND_PCI_QUIRK(0x17aa, 0x504b, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
6530 	SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460),
6531 	SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460),
6532 	SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460),
6533 	SND_PCI_QUIRK(0x17aa, 0x505d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
6534 	SND_PCI_QUIRK(0x17aa, 0x505f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
6535 	SND_PCI_QUIRK(0x17aa, 0x5062, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
6536 	SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
6537 	SND_PCI_QUIRK(0x17aa, 0x511e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
6538 	SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
6539 	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
6540 	SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
6541 	SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */
6542 
6543 #if 0
6544 	/* Below is a quirk table taken from the old code.
6545 	 * Basically the device should work as is without the fixup table.
6546 	 * If BIOS doesn't give a proper info, enable the corresponding
6547 	 * fixup entry.
6548 	 */
6549 	SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
6550 		      ALC269_FIXUP_AMIC),
6551 	SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC),
6552 	SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC),
6553 	SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC),
6554 	SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC),
6555 	SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269_FIXUP_AMIC),
6556 	SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269_FIXUP_AMIC),
6557 	SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269_FIXUP_AMIC),
6558 	SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_FIXUP_AMIC),
6559 	SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269_FIXUP_AMIC),
6560 	SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_FIXUP_AMIC),
6561 	SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_FIXUP_AMIC),
6562 	SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_FIXUP_AMIC),
6563 	SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_FIXUP_AMIC),
6564 	SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_FIXUP_AMIC),
6565 	SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_FIXUP_AMIC),
6566 	SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_FIXUP_AMIC),
6567 	SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_FIXUP_AMIC),
6568 	SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_FIXUP_AMIC),
6569 	SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_FIXUP_AMIC),
6570 	SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_FIXUP_AMIC),
6571 	SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_FIXUP_AMIC),
6572 	SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_FIXUP_AMIC),
6573 	SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_FIXUP_AMIC),
6574 	SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_FIXUP_AMIC),
6575 	SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_FIXUP_AMIC),
6576 	SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_FIXUP_AMIC),
6577 	SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_FIXUP_AMIC),
6578 	SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_FIXUP_AMIC),
6579 	SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_FIXUP_AMIC),
6580 	SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_FIXUP_AMIC),
6581 	SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_FIXUP_AMIC),
6582 	SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_FIXUP_AMIC),
6583 	SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_FIXUP_AMIC),
6584 	SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_FIXUP_AMIC),
6585 	SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_FIXUP_DMIC),
6586 	SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_FIXUP_AMIC),
6587 	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_AMIC),
6588 	SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_FIXUP_DMIC),
6589 	SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_FIXUP_DMIC),
6590 #endif
6591 	{}
6592 };
6593 
6594 static const struct snd_pci_quirk alc269_fixup_vendor_tbl[] = {
6595 	SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
6596 	SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED),
6597 	SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
6598 	SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", ALC269_FIXUP_THINKPAD_ACPI),
6599 	{}
6600 };
6601 
6602 static const struct hda_model_fixup alc269_fixup_models[] = {
6603 	{.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"},
6604 	{.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"},
6605 	{.id = ALC269_FIXUP_STEREO_DMIC, .name = "alc269-dmic"},
6606 	{.id = ALC271_FIXUP_DMIC, .name = "alc271-dmic"},
6607 	{.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"},
6608 	{.id = ALC269_FIXUP_HEADSET_MIC, .name = "headset-mic"},
6609 	{.id = ALC269_FIXUP_HEADSET_MODE, .name = "headset-mode"},
6610 	{.id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, .name = "headset-mode-no-hp-mic"},
6611 	{.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
6612 	{.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
6613 	{.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic1-led"},
6614 	{.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
6615 	{.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
6616 	{.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},
6617 	{.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"},
6618 	{.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
6619 	{.id = ALC292_FIXUP_TPT440, .name = "tpt440"},
6620 	{.id = ALC292_FIXUP_TPT460, .name = "tpt460"},
6621 	{.id = ALC233_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
6622 	{.id = ALC700_FIXUP_INTEL_REFERENCE, .name = "alc700-ref"},
6623 	{}
6624 };
6625 #define ALC225_STANDARD_PINS \
6626 	{0x21, 0x04211020}
6627 
6628 #define ALC256_STANDARD_PINS \
6629 	{0x12, 0x90a60140}, \
6630 	{0x14, 0x90170110}, \
6631 	{0x21, 0x02211020}
6632 
6633 #define ALC282_STANDARD_PINS \
6634 	{0x14, 0x90170110}
6635 
6636 #define ALC290_STANDARD_PINS \
6637 	{0x12, 0x99a30130}
6638 
6639 #define ALC292_STANDARD_PINS \
6640 	{0x14, 0x90170110}, \
6641 	{0x15, 0x0221401f}
6642 
6643 #define ALC295_STANDARD_PINS \
6644 	{0x12, 0xb7a60130}, \
6645 	{0x14, 0x90170110}, \
6646 	{0x21, 0x04211020}
6647 
6648 #define ALC298_STANDARD_PINS \
6649 	{0x12, 0x90a60130}, \
6650 	{0x21, 0x03211020}
6651 
6652 static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
6653 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1025, "Acer", ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
6654 		{0x12, 0x90a601c0},
6655 		{0x14, 0x90171120},
6656 		{0x21, 0x02211030}),
6657 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
6658 		{0x14, 0x90170110},
6659 		{0x1b, 0x90a70130},
6660 		{0x21, 0x03211020}),
6661 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
6662 		{0x1a, 0x90a70130},
6663 		{0x1b, 0x90170110},
6664 		{0x21, 0x03211020}),
6665 	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
6666 		ALC225_STANDARD_PINS,
6667 		{0x12, 0xb7a60130},
6668 		{0x14, 0x901701a0}),
6669 	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
6670 		ALC225_STANDARD_PINS,
6671 		{0x12, 0xb7a60130},
6672 		{0x14, 0x901701b0}),
6673 	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
6674 		ALC225_STANDARD_PINS,
6675 		{0x12, 0xb7a60150},
6676 		{0x14, 0x901701a0}),
6677 	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
6678 		ALC225_STANDARD_PINS,
6679 		{0x12, 0xb7a60150},
6680 		{0x14, 0x901701b0}),
6681 	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
6682 		ALC225_STANDARD_PINS,
6683 		{0x12, 0xb7a60130},
6684 		{0x1b, 0x90170110}),
6685 	SND_HDA_PIN_QUIRK(0x10ec0233, 0x8086, "Intel NUC Skull Canyon", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
6686 		{0x1b, 0x01111010},
6687 		{0x1e, 0x01451130},
6688 		{0x21, 0x02211020}),
6689 	SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6690 		{0x12, 0x90a60140},
6691 		{0x14, 0x90170110},
6692 		{0x21, 0x02211020}),
6693 	SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6694 		{0x12, 0x90a60140},
6695 		{0x14, 0x90170150},
6696 		{0x21, 0x02211020}),
6697 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
6698 		{0x14, 0x90170110},
6699 		{0x21, 0x02211020}),
6700 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6701 		{0x14, 0x90170130},
6702 		{0x21, 0x02211040}),
6703 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6704 		{0x12, 0x90a60140},
6705 		{0x14, 0x90170110},
6706 		{0x21, 0x02211020}),
6707 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6708 		{0x12, 0x90a60160},
6709 		{0x14, 0x90170120},
6710 		{0x21, 0x02211030}),
6711 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6712 		{0x14, 0x90170110},
6713 		{0x1b, 0x02011020},
6714 		{0x21, 0x0221101f}),
6715 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6716 		{0x14, 0x90170110},
6717 		{0x1b, 0x01011020},
6718 		{0x21, 0x0221101f}),
6719 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6720 		{0x14, 0x90170130},
6721 		{0x1b, 0x01014020},
6722 		{0x21, 0x0221103f}),
6723 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6724 		{0x14, 0x90170130},
6725 		{0x1b, 0x01011020},
6726 		{0x21, 0x0221103f}),
6727 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6728 		{0x14, 0x90170130},
6729 		{0x1b, 0x02011020},
6730 		{0x21, 0x0221103f}),
6731 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6732 		{0x14, 0x90170150},
6733 		{0x1b, 0x02011020},
6734 		{0x21, 0x0221105f}),
6735 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6736 		{0x14, 0x90170110},
6737 		{0x1b, 0x01014020},
6738 		{0x21, 0x0221101f}),
6739 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6740 		{0x12, 0x90a60160},
6741 		{0x14, 0x90170120},
6742 		{0x17, 0x90170140},
6743 		{0x21, 0x0321102f}),
6744 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6745 		{0x12, 0x90a60160},
6746 		{0x14, 0x90170130},
6747 		{0x21, 0x02211040}),
6748 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6749 		{0x12, 0x90a60160},
6750 		{0x14, 0x90170140},
6751 		{0x21, 0x02211050}),
6752 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6753 		{0x12, 0x90a60170},
6754 		{0x14, 0x90170120},
6755 		{0x21, 0x02211030}),
6756 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6757 		{0x12, 0x90a60170},
6758 		{0x14, 0x90170130},
6759 		{0x21, 0x02211040}),
6760 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6761 		{0x12, 0x90a60170},
6762 		{0x14, 0x90171130},
6763 		{0x21, 0x02211040}),
6764 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6765 		{0x12, 0x90a60170},
6766 		{0x14, 0x90170140},
6767 		{0x21, 0x02211050}),
6768 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5548", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6769 		{0x12, 0x90a60180},
6770 		{0x14, 0x90170130},
6771 		{0x21, 0x02211040}),
6772 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5565", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6773 		{0x12, 0x90a60180},
6774 		{0x14, 0x90170120},
6775 		{0x21, 0x02211030}),
6776 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6777 		{0x1b, 0x01011020},
6778 		{0x21, 0x02211010}),
6779 	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6780 		{0x12, 0x90a60130},
6781 		{0x14, 0x90170110},
6782 		{0x1b, 0x01011020},
6783 		{0x21, 0x0221101f}),
6784 	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6785 		{0x12, 0x90a60160},
6786 		{0x14, 0x90170120},
6787 		{0x21, 0x02211030}),
6788 	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6789 		{0x12, 0x90a60170},
6790 		{0x14, 0x90170120},
6791 		{0x21, 0x02211030}),
6792 	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell Inspiron 5468", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6793 		{0x12, 0x90a60180},
6794 		{0x14, 0x90170120},
6795 		{0x21, 0x02211030}),
6796 	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6797 		{0x12, 0xb7a60130},
6798 		{0x14, 0x90170110},
6799 		{0x21, 0x02211020}),
6800 	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6801 		{0x12, 0x90a60130},
6802 		{0x14, 0x90170110},
6803 		{0x14, 0x01011020},
6804 		{0x21, 0x0221101f}),
6805 	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6806 		ALC256_STANDARD_PINS),
6807 	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
6808 		{0x14, 0x90170110},
6809 		{0x1b, 0x90a70130},
6810 		{0x21, 0x04211020}),
6811 	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
6812 		{0x14, 0x90170110},
6813 		{0x1b, 0x90a70130},
6814 		{0x21, 0x03211020}),
6815 	SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
6816 		{0x12, 0xb7a60130},
6817 		{0x13, 0xb8a61140},
6818 		{0x16, 0x90170110},
6819 		{0x21, 0x04211020}),
6820 	SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
6821 		{0x12, 0x90a60130},
6822 		{0x14, 0x90170110},
6823 		{0x15, 0x0421101f},
6824 		{0x1a, 0x04a11020}),
6825 	SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED,
6826 		{0x12, 0x90a60140},
6827 		{0x14, 0x90170110},
6828 		{0x15, 0x0421101f},
6829 		{0x18, 0x02811030},
6830 		{0x1a, 0x04a1103f},
6831 		{0x1b, 0x02011020}),
6832 	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP 15 Touchsmart", ALC269_FIXUP_HP_MUTE_LED_MIC1,
6833 		ALC282_STANDARD_PINS,
6834 		{0x12, 0x99a30130},
6835 		{0x19, 0x03a11020},
6836 		{0x21, 0x0321101f}),
6837 	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
6838 		ALC282_STANDARD_PINS,
6839 		{0x12, 0x99a30130},
6840 		{0x19, 0x03a11020},
6841 		{0x21, 0x03211040}),
6842 	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
6843 		ALC282_STANDARD_PINS,
6844 		{0x12, 0x99a30130},
6845 		{0x19, 0x03a11030},
6846 		{0x21, 0x03211020}),
6847 	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
6848 		ALC282_STANDARD_PINS,
6849 		{0x12, 0x99a30130},
6850 		{0x19, 0x04a11020},
6851 		{0x21, 0x0421101f}),
6852 	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED,
6853 		ALC282_STANDARD_PINS,
6854 		{0x12, 0x90a60140},
6855 		{0x19, 0x04a11030},
6856 		{0x21, 0x04211020}),
6857 	SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
6858 		ALC282_STANDARD_PINS,
6859 		{0x12, 0x90a60130},
6860 		{0x21, 0x0321101f}),
6861 	SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
6862 		{0x12, 0x90a60160},
6863 		{0x14, 0x90170120},
6864 		{0x21, 0x02211030}),
6865 	SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
6866 		ALC282_STANDARD_PINS,
6867 		{0x12, 0x90a60130},
6868 		{0x19, 0x03a11020},
6869 		{0x21, 0x0321101f}),
6870 	SND_HDA_PIN_QUIRK(0x10ec0288, 0x1028, "Dell", ALC288_FIXUP_DELL_XPS_13_GPIO6,
6871 		{0x12, 0x90a60120},
6872 		{0x14, 0x90170110},
6873 		{0x21, 0x0321101f}),
6874 	SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
6875 		{0x12, 0xb7a60130},
6876 		{0x14, 0x90170110},
6877 		{0x21, 0x04211020}),
6878 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
6879 		ALC290_STANDARD_PINS,
6880 		{0x15, 0x04211040},
6881 		{0x18, 0x90170112},
6882 		{0x1a, 0x04a11020}),
6883 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
6884 		ALC290_STANDARD_PINS,
6885 		{0x15, 0x04211040},
6886 		{0x18, 0x90170110},
6887 		{0x1a, 0x04a11020}),
6888 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
6889 		ALC290_STANDARD_PINS,
6890 		{0x15, 0x0421101f},
6891 		{0x1a, 0x04a11020}),
6892 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
6893 		ALC290_STANDARD_PINS,
6894 		{0x15, 0x04211020},
6895 		{0x1a, 0x04a11040}),
6896 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
6897 		ALC290_STANDARD_PINS,
6898 		{0x14, 0x90170110},
6899 		{0x15, 0x04211020},
6900 		{0x1a, 0x04a11040}),
6901 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
6902 		ALC290_STANDARD_PINS,
6903 		{0x14, 0x90170110},
6904 		{0x15, 0x04211020},
6905 		{0x1a, 0x04a11020}),
6906 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
6907 		ALC290_STANDARD_PINS,
6908 		{0x14, 0x90170110},
6909 		{0x15, 0x0421101f},
6910 		{0x1a, 0x04a11020}),
6911 	SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
6912 		ALC292_STANDARD_PINS,
6913 		{0x12, 0x90a60140},
6914 		{0x16, 0x01014020},
6915 		{0x19, 0x01a19030}),
6916 	SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
6917 		ALC292_STANDARD_PINS,
6918 		{0x12, 0x90a60140},
6919 		{0x16, 0x01014020},
6920 		{0x18, 0x02a19031},
6921 		{0x19, 0x01a1903e}),
6922 	SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
6923 		ALC292_STANDARD_PINS,
6924 		{0x12, 0x90a60140}),
6925 	SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
6926 		ALC292_STANDARD_PINS,
6927 		{0x13, 0x90a60140},
6928 		{0x16, 0x21014020},
6929 		{0x19, 0x21a19030}),
6930 	SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
6931 		ALC292_STANDARD_PINS,
6932 		{0x13, 0x90a60140}),
6933 	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
6934 		ALC295_STANDARD_PINS,
6935 		{0x17, 0x21014020},
6936 		{0x18, 0x21a19030}),
6937 	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
6938 		ALC295_STANDARD_PINS,
6939 		{0x17, 0x21014040},
6940 		{0x18, 0x21a19050}),
6941 	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
6942 		ALC295_STANDARD_PINS),
6943 	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
6944 		ALC298_STANDARD_PINS,
6945 		{0x17, 0x90170110}),
6946 	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
6947 		ALC298_STANDARD_PINS,
6948 		{0x17, 0x90170140}),
6949 	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
6950 		ALC298_STANDARD_PINS,
6951 		{0x17, 0x90170150}),
6952 	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_SPK_VOLUME,
6953 		{0x12, 0xb7a60140},
6954 		{0x13, 0xb7a60150},
6955 		{0x17, 0x90170110},
6956 		{0x1a, 0x03011020},
6957 		{0x21, 0x03211030}),
6958 	SND_HDA_PIN_QUIRK(0x10ec0299, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
6959 		ALC225_STANDARD_PINS,
6960 		{0x12, 0xb7a60130},
6961 		{0x17, 0x90170110}),
6962 	{}
6963 };
6964 
6965 static void alc269_fill_coef(struct hda_codec *codec)
6966 {
6967 	struct alc_spec *spec = codec->spec;
6968 	int val;
6969 
6970 	if (spec->codec_variant != ALC269_TYPE_ALC269VB)
6971 		return;
6972 
6973 	if ((alc_get_coef0(codec) & 0x00ff) < 0x015) {
6974 		alc_write_coef_idx(codec, 0xf, 0x960b);
6975 		alc_write_coef_idx(codec, 0xe, 0x8817);
6976 	}
6977 
6978 	if ((alc_get_coef0(codec) & 0x00ff) == 0x016) {
6979 		alc_write_coef_idx(codec, 0xf, 0x960b);
6980 		alc_write_coef_idx(codec, 0xe, 0x8814);
6981 	}
6982 
6983 	if ((alc_get_coef0(codec) & 0x00ff) == 0x017) {
6984 		/* Power up output pin */
6985 		alc_update_coef_idx(codec, 0x04, 0, 1<<11);
6986 	}
6987 
6988 	if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {
6989 		val = alc_read_coef_idx(codec, 0xd);
6990 		if (val != -1 && (val & 0x0c00) >> 10 != 0x1) {
6991 			/* Capless ramp up clock control */
6992 			alc_write_coef_idx(codec, 0xd, val | (1<<10));
6993 		}
6994 		val = alc_read_coef_idx(codec, 0x17);
6995 		if (val != -1 && (val & 0x01c0) >> 6 != 0x4) {
6996 			/* Class D power on reset */
6997 			alc_write_coef_idx(codec, 0x17, val | (1<<7));
6998 		}
6999 	}
7000 
7001 	/* HP */
7002 	alc_update_coef_idx(codec, 0x4, 0, 1<<11);
7003 }
7004 
7005 /*
7006  */
7007 static int patch_alc269(struct hda_codec *codec)
7008 {
7009 	struct alc_spec *spec;
7010 	int err;
7011 
7012 	err = alc_alloc_spec(codec, 0x0b);
7013 	if (err < 0)
7014 		return err;
7015 
7016 	spec = codec->spec;
7017 	spec->gen.shared_mic_vref_pin = 0x18;
7018 	codec->power_save_node = 1;
7019 
7020 #ifdef CONFIG_PM
7021 	codec->patch_ops.suspend = alc269_suspend;
7022 	codec->patch_ops.resume = alc269_resume;
7023 #endif
7024 	spec->shutup = alc_default_shutup;
7025 	spec->init_hook = alc_default_init;
7026 
7027 	snd_hda_pick_fixup(codec, alc269_fixup_models,
7028 		       alc269_fixup_tbl, alc269_fixups);
7029 	snd_hda_pick_pin_fixup(codec, alc269_pin_fixup_tbl, alc269_fixups);
7030 	snd_hda_pick_fixup(codec, NULL,	alc269_fixup_vendor_tbl,
7031 			   alc269_fixups);
7032 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
7033 
7034 	alc_auto_parse_customize_define(codec);
7035 
7036 	if (has_cdefine_beep(codec))
7037 		spec->gen.beep_nid = 0x01;
7038 
7039 	switch (codec->core.vendor_id) {
7040 	case 0x10ec0269:
7041 		spec->codec_variant = ALC269_TYPE_ALC269VA;
7042 		switch (alc_get_coef0(codec) & 0x00f0) {
7043 		case 0x0010:
7044 			if (codec->bus->pci &&
7045 			    codec->bus->pci->subsystem_vendor == 0x1025 &&
7046 			    spec->cdefine.platform_type == 1)
7047 				err = alc_codec_rename(codec, "ALC271X");
7048 			spec->codec_variant = ALC269_TYPE_ALC269VB;
7049 			break;
7050 		case 0x0020:
7051 			if (codec->bus->pci &&
7052 			    codec->bus->pci->subsystem_vendor == 0x17aa &&
7053 			    codec->bus->pci->subsystem_device == 0x21f3)
7054 				err = alc_codec_rename(codec, "ALC3202");
7055 			spec->codec_variant = ALC269_TYPE_ALC269VC;
7056 			break;
7057 		case 0x0030:
7058 			spec->codec_variant = ALC269_TYPE_ALC269VD;
7059 			break;
7060 		default:
7061 			alc_fix_pll_init(codec, 0x20, 0x04, 15);
7062 		}
7063 		if (err < 0)
7064 			goto error;
7065 		spec->shutup = alc269_shutup;
7066 		spec->init_hook = alc269_fill_coef;
7067 		alc269_fill_coef(codec);
7068 		break;
7069 
7070 	case 0x10ec0280:
7071 	case 0x10ec0290:
7072 		spec->codec_variant = ALC269_TYPE_ALC280;
7073 		break;
7074 	case 0x10ec0282:
7075 		spec->codec_variant = ALC269_TYPE_ALC282;
7076 		spec->shutup = alc282_shutup;
7077 		spec->init_hook = alc282_init;
7078 		break;
7079 	case 0x10ec0233:
7080 	case 0x10ec0283:
7081 		spec->codec_variant = ALC269_TYPE_ALC283;
7082 		spec->shutup = alc283_shutup;
7083 		spec->init_hook = alc283_init;
7084 		break;
7085 	case 0x10ec0284:
7086 	case 0x10ec0292:
7087 		spec->codec_variant = ALC269_TYPE_ALC284;
7088 		break;
7089 	case 0x10ec0293:
7090 		spec->codec_variant = ALC269_TYPE_ALC293;
7091 		break;
7092 	case 0x10ec0286:
7093 	case 0x10ec0288:
7094 		spec->codec_variant = ALC269_TYPE_ALC286;
7095 		spec->shutup = alc286_shutup;
7096 		break;
7097 	case 0x10ec0298:
7098 		spec->codec_variant = ALC269_TYPE_ALC298;
7099 		break;
7100 	case 0x10ec0255:
7101 		spec->codec_variant = ALC269_TYPE_ALC255;
7102 		break;
7103 	case 0x10ec0236:
7104 	case 0x10ec0256:
7105 		spec->codec_variant = ALC269_TYPE_ALC256;
7106 		spec->shutup = alc256_shutup;
7107 		spec->init_hook = alc256_init;
7108 		spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */
7109 		alc_update_coef_idx(codec, 0x36, 1 << 13, 1 << 5); /* Switch pcbeep path to Line in path*/
7110 		break;
7111 	case 0x10ec0257:
7112 		spec->codec_variant = ALC269_TYPE_ALC257;
7113 		spec->gen.mixer_nid = 0;
7114 		break;
7115 	case 0x10ec0215:
7116 	case 0x10ec0285:
7117 	case 0x10ec0289:
7118 		spec->codec_variant = ALC269_TYPE_ALC215;
7119 		spec->shutup = alc225_shutup;
7120 		spec->init_hook = alc225_init;
7121 		spec->gen.mixer_nid = 0;
7122 		break;
7123 	case 0x10ec0225:
7124 	case 0x10ec0295:
7125 	case 0x10ec0299:
7126 		spec->codec_variant = ALC269_TYPE_ALC225;
7127 		spec->shutup = alc225_shutup;
7128 		spec->init_hook = alc225_init;
7129 		spec->gen.mixer_nid = 0; /* no loopback on ALC225, ALC295 and ALC299 */
7130 		break;
7131 	case 0x10ec0234:
7132 	case 0x10ec0274:
7133 	case 0x10ec0294:
7134 		spec->codec_variant = ALC269_TYPE_ALC294;
7135 		spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */
7136 		alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */
7137 		break;
7138 	case 0x10ec0700:
7139 	case 0x10ec0701:
7140 	case 0x10ec0703:
7141 		spec->codec_variant = ALC269_TYPE_ALC700;
7142 		spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */
7143 		alc_update_coef_idx(codec, 0x4a, 1 << 15, 0); /* Combo jack auto trigger control */
7144 		break;
7145 
7146 	}
7147 
7148 	if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) {
7149 		spec->has_alc5505_dsp = 1;
7150 		spec->init_hook = alc5505_dsp_init;
7151 	}
7152 
7153 	/* automatic parse from the BIOS config */
7154 	err = alc269_parse_auto_config(codec);
7155 	if (err < 0)
7156 		goto error;
7157 
7158 	if (!spec->gen.no_analog && spec->gen.beep_nid && spec->gen.mixer_nid)
7159 		set_beep_amp(spec, spec->gen.mixer_nid, 0x04, HDA_INPUT);
7160 
7161 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
7162 
7163 	return 0;
7164 
7165  error:
7166 	alc_free(codec);
7167 	return err;
7168 }
7169 
7170 /*
7171  * ALC861
7172  */
7173 
7174 static int alc861_parse_auto_config(struct hda_codec *codec)
7175 {
7176 	static const hda_nid_t alc861_ignore[] = { 0x1d, 0 };
7177 	static const hda_nid_t alc861_ssids[] = { 0x0e, 0x0f, 0x0b, 0 };
7178 	return alc_parse_auto_config(codec, alc861_ignore, alc861_ssids);
7179 }
7180 
7181 /* Pin config fixes */
7182 enum {
7183 	ALC861_FIXUP_FSC_AMILO_PI1505,
7184 	ALC861_FIXUP_AMP_VREF_0F,
7185 	ALC861_FIXUP_NO_JACK_DETECT,
7186 	ALC861_FIXUP_ASUS_A6RP,
7187 	ALC660_FIXUP_ASUS_W7J,
7188 };
7189 
7190 /* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */
7191 static void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec,
7192 			const struct hda_fixup *fix, int action)
7193 {
7194 	struct alc_spec *spec = codec->spec;
7195 	unsigned int val;
7196 
7197 	if (action != HDA_FIXUP_ACT_INIT)
7198 		return;
7199 	val = snd_hda_codec_get_pin_target(codec, 0x0f);
7200 	if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)))
7201 		val |= AC_PINCTL_IN_EN;
7202 	val |= AC_PINCTL_VREF_50;
7203 	snd_hda_set_pin_ctl(codec, 0x0f, val);
7204 	spec->gen.keep_vref_in_automute = 1;
7205 }
7206 
7207 /* suppress the jack-detection */
7208 static void alc_fixup_no_jack_detect(struct hda_codec *codec,
7209 				     const struct hda_fixup *fix, int action)
7210 {
7211 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
7212 		codec->no_jack_detect = 1;
7213 }
7214 
7215 static const struct hda_fixup alc861_fixups[] = {
7216 	[ALC861_FIXUP_FSC_AMILO_PI1505] = {
7217 		.type = HDA_FIXUP_PINS,
7218 		.v.pins = (const struct hda_pintbl[]) {
7219 			{ 0x0b, 0x0221101f }, /* HP */
7220 			{ 0x0f, 0x90170310 }, /* speaker */
7221 			{ }
7222 		}
7223 	},
7224 	[ALC861_FIXUP_AMP_VREF_0F] = {
7225 		.type = HDA_FIXUP_FUNC,
7226 		.v.func = alc861_fixup_asus_amp_vref_0f,
7227 	},
7228 	[ALC861_FIXUP_NO_JACK_DETECT] = {
7229 		.type = HDA_FIXUP_FUNC,
7230 		.v.func = alc_fixup_no_jack_detect,
7231 	},
7232 	[ALC861_FIXUP_ASUS_A6RP] = {
7233 		.type = HDA_FIXUP_FUNC,
7234 		.v.func = alc861_fixup_asus_amp_vref_0f,
7235 		.chained = true,
7236 		.chain_id = ALC861_FIXUP_NO_JACK_DETECT,
7237 	},
7238 	[ALC660_FIXUP_ASUS_W7J] = {
7239 		.type = HDA_FIXUP_VERBS,
7240 		.v.verbs = (const struct hda_verb[]) {
7241 			/* ASUS W7J needs a magic pin setup on unused NID 0x10
7242 			 * for enabling outputs
7243 			 */
7244 			{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
7245 			{ }
7246 		},
7247 	}
7248 };
7249 
7250 static const struct snd_pci_quirk alc861_fixup_tbl[] = {
7251 	SND_PCI_QUIRK(0x1043, 0x1253, "ASUS W7J", ALC660_FIXUP_ASUS_W7J),
7252 	SND_PCI_QUIRK(0x1043, 0x1263, "ASUS Z35HL", ALC660_FIXUP_ASUS_W7J),
7253 	SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP),
7254 	SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", ALC861_FIXUP_AMP_VREF_0F),
7255 	SND_PCI_QUIRK(0x1462, 0x7254, "HP DX2200", ALC861_FIXUP_NO_JACK_DETECT),
7256 	SND_PCI_QUIRK(0x1584, 0x2b01, "Haier W18", ALC861_FIXUP_AMP_VREF_0F),
7257 	SND_PCI_QUIRK(0x1584, 0x0000, "Uniwill ECS M31EI", ALC861_FIXUP_AMP_VREF_0F),
7258 	SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", ALC861_FIXUP_FSC_AMILO_PI1505),
7259 	{}
7260 };
7261 
7262 /*
7263  */
7264 static int patch_alc861(struct hda_codec *codec)
7265 {
7266 	struct alc_spec *spec;
7267 	int err;
7268 
7269 	err = alc_alloc_spec(codec, 0x15);
7270 	if (err < 0)
7271 		return err;
7272 
7273 	spec = codec->spec;
7274 	spec->gen.beep_nid = 0x23;
7275 
7276 #ifdef CONFIG_PM
7277 	spec->power_hook = alc_power_eapd;
7278 #endif
7279 
7280 	snd_hda_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);
7281 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
7282 
7283 	/* automatic parse from the BIOS config */
7284 	err = alc861_parse_auto_config(codec);
7285 	if (err < 0)
7286 		goto error;
7287 
7288 	if (!spec->gen.no_analog)
7289 		set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
7290 
7291 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
7292 
7293 	return 0;
7294 
7295  error:
7296 	alc_free(codec);
7297 	return err;
7298 }
7299 
7300 /*
7301  * ALC861-VD support
7302  *
7303  * Based on ALC882
7304  *
7305  * In addition, an independent DAC
7306  */
7307 static int alc861vd_parse_auto_config(struct hda_codec *codec)
7308 {
7309 	static const hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
7310 	static const hda_nid_t alc861vd_ssids[] = { 0x15, 0x1b, 0x14, 0 };
7311 	return alc_parse_auto_config(codec, alc861vd_ignore, alc861vd_ssids);
7312 }
7313 
7314 enum {
7315 	ALC660VD_FIX_ASUS_GPIO1,
7316 	ALC861VD_FIX_DALLAS,
7317 };
7318 
7319 /* exclude VREF80 */
7320 static void alc861vd_fixup_dallas(struct hda_codec *codec,
7321 				  const struct hda_fixup *fix, int action)
7322 {
7323 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
7324 		snd_hda_override_pin_caps(codec, 0x18, 0x00000734);
7325 		snd_hda_override_pin_caps(codec, 0x19, 0x0000073c);
7326 	}
7327 }
7328 
7329 static const struct hda_fixup alc861vd_fixups[] = {
7330 	[ALC660VD_FIX_ASUS_GPIO1] = {
7331 		.type = HDA_FIXUP_VERBS,
7332 		.v.verbs = (const struct hda_verb[]) {
7333 			/* reset GPIO1 */
7334 			{0x01, AC_VERB_SET_GPIO_MASK, 0x03},
7335 			{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
7336 			{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
7337 			{ }
7338 		}
7339 	},
7340 	[ALC861VD_FIX_DALLAS] = {
7341 		.type = HDA_FIXUP_FUNC,
7342 		.v.func = alc861vd_fixup_dallas,
7343 	},
7344 };
7345 
7346 static const struct snd_pci_quirk alc861vd_fixup_tbl[] = {
7347 	SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_FIX_DALLAS),
7348 	SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
7349 	SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_FIX_DALLAS),
7350 	{}
7351 };
7352 
7353 /*
7354  */
7355 static int patch_alc861vd(struct hda_codec *codec)
7356 {
7357 	struct alc_spec *spec;
7358 	int err;
7359 
7360 	err = alc_alloc_spec(codec, 0x0b);
7361 	if (err < 0)
7362 		return err;
7363 
7364 	spec = codec->spec;
7365 	spec->gen.beep_nid = 0x23;
7366 
7367 	spec->shutup = alc_eapd_shutup;
7368 
7369 	snd_hda_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);
7370 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
7371 
7372 	/* automatic parse from the BIOS config */
7373 	err = alc861vd_parse_auto_config(codec);
7374 	if (err < 0)
7375 		goto error;
7376 
7377 	if (!spec->gen.no_analog)
7378 		set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
7379 
7380 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
7381 
7382 	return 0;
7383 
7384  error:
7385 	alc_free(codec);
7386 	return err;
7387 }
7388 
7389 /*
7390  * ALC662 support
7391  *
7392  * ALC662 is almost identical with ALC880 but has cleaner and more flexible
7393  * configuration.  Each pin widget can choose any input DACs and a mixer.
7394  * Each ADC is connected from a mixer of all inputs.  This makes possible
7395  * 6-channel independent captures.
7396  *
7397  * In addition, an independent DAC for the multi-playback (not used in this
7398  * driver yet).
7399  */
7400 
7401 /*
7402  * BIOS auto configuration
7403  */
7404 
7405 static int alc662_parse_auto_config(struct hda_codec *codec)
7406 {
7407 	static const hda_nid_t alc662_ignore[] = { 0x1d, 0 };
7408 	static const hda_nid_t alc663_ssids[] = { 0x15, 0x1b, 0x14, 0x21 };
7409 	static const hda_nid_t alc662_ssids[] = { 0x15, 0x1b, 0x14, 0 };
7410 	const hda_nid_t *ssids;
7411 
7412 	if (codec->core.vendor_id == 0x10ec0272 || codec->core.vendor_id == 0x10ec0663 ||
7413 	    codec->core.vendor_id == 0x10ec0665 || codec->core.vendor_id == 0x10ec0670 ||
7414 	    codec->core.vendor_id == 0x10ec0671)
7415 		ssids = alc663_ssids;
7416 	else
7417 		ssids = alc662_ssids;
7418 	return alc_parse_auto_config(codec, alc662_ignore, ssids);
7419 }
7420 
7421 static void alc272_fixup_mario(struct hda_codec *codec,
7422 			       const struct hda_fixup *fix, int action)
7423 {
7424 	if (action != HDA_FIXUP_ACT_PRE_PROBE)
7425 		return;
7426 	if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
7427 				      (0x3b << AC_AMPCAP_OFFSET_SHIFT) |
7428 				      (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |
7429 				      (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |
7430 				      (0 << AC_AMPCAP_MUTE_SHIFT)))
7431 		codec_warn(codec, "failed to override amp caps for NID 0x2\n");
7432 }
7433 
7434 static const struct snd_pcm_chmap_elem asus_pcm_2_1_chmaps[] = {
7435 	{ .channels = 2,
7436 	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
7437 	{ .channels = 4,
7438 	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
7439 		   SNDRV_CHMAP_NA, SNDRV_CHMAP_LFE } }, /* LFE only on right */
7440 	{ }
7441 };
7442 
7443 /* override the 2.1 chmap */
7444 static void alc_fixup_bass_chmap(struct hda_codec *codec,
7445 				    const struct hda_fixup *fix, int action)
7446 {
7447 	if (action == HDA_FIXUP_ACT_BUILD) {
7448 		struct alc_spec *spec = codec->spec;
7449 		spec->gen.pcm_rec[0]->stream[0].chmap = asus_pcm_2_1_chmaps;
7450 	}
7451 }
7452 
7453 /* avoid D3 for keeping GPIO up */
7454 static unsigned int gpio_led_power_filter(struct hda_codec *codec,
7455 					  hda_nid_t nid,
7456 					  unsigned int power_state)
7457 {
7458 	struct alc_spec *spec = codec->spec;
7459 	if (nid == codec->core.afg && power_state == AC_PWRST_D3 && spec->gpio_led)
7460 		return AC_PWRST_D0;
7461 	return power_state;
7462 }
7463 
7464 static void alc662_fixup_led_gpio1(struct hda_codec *codec,
7465 				   const struct hda_fixup *fix, int action)
7466 {
7467 	struct alc_spec *spec = codec->spec;
7468 	static const struct hda_verb gpio_init[] = {
7469 		{ 0x01, AC_VERB_SET_GPIO_MASK, 0x01 },
7470 		{ 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01 },
7471 		{}
7472 	};
7473 
7474 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
7475 		spec->gen.vmaster_mute.hook = alc_fixup_gpio_mute_hook;
7476 		spec->gpio_led = 0;
7477 		spec->mute_led_polarity = 1;
7478 		spec->gpio_mute_led_mask = 0x01;
7479 		snd_hda_add_verbs(codec, gpio_init);
7480 		codec->power_filter = gpio_led_power_filter;
7481 	}
7482 }
7483 
7484 static void alc662_usi_automute_hook(struct hda_codec *codec,
7485 					 struct hda_jack_callback *jack)
7486 {
7487 	struct alc_spec *spec = codec->spec;
7488 	int vref;
7489 	msleep(200);
7490 	snd_hda_gen_hp_automute(codec, jack);
7491 
7492 	vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
7493 	msleep(100);
7494 	snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
7495 			    vref);
7496 }
7497 
7498 static void alc662_fixup_usi_headset_mic(struct hda_codec *codec,
7499 				     const struct hda_fixup *fix, int action)
7500 {
7501 	struct alc_spec *spec = codec->spec;
7502 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
7503 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
7504 		spec->gen.hp_automute_hook = alc662_usi_automute_hook;
7505 	}
7506 }
7507 
7508 static struct coef_fw alc668_coefs[] = {
7509 	WRITE_COEF(0x01, 0xbebe), WRITE_COEF(0x02, 0xaaaa), WRITE_COEF(0x03,    0x0),
7510 	WRITE_COEF(0x04, 0x0180), WRITE_COEF(0x06,    0x0), WRITE_COEF(0x07, 0x0f80),
7511 	WRITE_COEF(0x08, 0x0031), WRITE_COEF(0x0a, 0x0060), WRITE_COEF(0x0b,    0x0),
7512 	WRITE_COEF(0x0c, 0x7cf7), WRITE_COEF(0x0d, 0x1080), WRITE_COEF(0x0e, 0x7f7f),
7513 	WRITE_COEF(0x0f, 0xcccc), WRITE_COEF(0x10, 0xddcc), WRITE_COEF(0x11, 0x0001),
7514 	WRITE_COEF(0x13,    0x0), WRITE_COEF(0x14, 0x2aa0), WRITE_COEF(0x17, 0xa940),
7515 	WRITE_COEF(0x19,    0x0), WRITE_COEF(0x1a,    0x0), WRITE_COEF(0x1b,    0x0),
7516 	WRITE_COEF(0x1c,    0x0), WRITE_COEF(0x1d,    0x0), WRITE_COEF(0x1e, 0x7418),
7517 	WRITE_COEF(0x1f, 0x0804), WRITE_COEF(0x20, 0x4200), WRITE_COEF(0x21, 0x0468),
7518 	WRITE_COEF(0x22, 0x8ccc), WRITE_COEF(0x23, 0x0250), WRITE_COEF(0x24, 0x7418),
7519 	WRITE_COEF(0x27,    0x0), WRITE_COEF(0x28, 0x8ccc), WRITE_COEF(0x2a, 0xff00),
7520 	WRITE_COEF(0x2b, 0x8000), WRITE_COEF(0xa7, 0xff00), WRITE_COEF(0xa8, 0x8000),
7521 	WRITE_COEF(0xaa, 0x2e17), WRITE_COEF(0xab, 0xa0c0), WRITE_COEF(0xac,    0x0),
7522 	WRITE_COEF(0xad,    0x0), WRITE_COEF(0xae, 0x2ac6), WRITE_COEF(0xaf, 0xa480),
7523 	WRITE_COEF(0xb0,    0x0), WRITE_COEF(0xb1,    0x0), WRITE_COEF(0xb2,    0x0),
7524 	WRITE_COEF(0xb3,    0x0), WRITE_COEF(0xb4,    0x0), WRITE_COEF(0xb5, 0x1040),
7525 	WRITE_COEF(0xb6, 0xd697), WRITE_COEF(0xb7, 0x902b), WRITE_COEF(0xb8, 0xd697),
7526 	WRITE_COEF(0xb9, 0x902b), WRITE_COEF(0xba, 0xb8ba), WRITE_COEF(0xbb, 0xaaab),
7527 	WRITE_COEF(0xbc, 0xaaaf), WRITE_COEF(0xbd, 0x6aaa), WRITE_COEF(0xbe, 0x1c02),
7528 	WRITE_COEF(0xc0, 0x00ff), WRITE_COEF(0xc1, 0x0fa6),
7529 	{}
7530 };
7531 
7532 static void alc668_restore_default_value(struct hda_codec *codec)
7533 {
7534 	alc_process_coef_fw(codec, alc668_coefs);
7535 }
7536 
7537 enum {
7538 	ALC662_FIXUP_ASPIRE,
7539 	ALC662_FIXUP_LED_GPIO1,
7540 	ALC662_FIXUP_IDEAPAD,
7541 	ALC272_FIXUP_MARIO,
7542 	ALC662_FIXUP_CZC_P10T,
7543 	ALC662_FIXUP_SKU_IGNORE,
7544 	ALC662_FIXUP_HP_RP5800,
7545 	ALC662_FIXUP_ASUS_MODE1,
7546 	ALC662_FIXUP_ASUS_MODE2,
7547 	ALC662_FIXUP_ASUS_MODE3,
7548 	ALC662_FIXUP_ASUS_MODE4,
7549 	ALC662_FIXUP_ASUS_MODE5,
7550 	ALC662_FIXUP_ASUS_MODE6,
7551 	ALC662_FIXUP_ASUS_MODE7,
7552 	ALC662_FIXUP_ASUS_MODE8,
7553 	ALC662_FIXUP_NO_JACK_DETECT,
7554 	ALC662_FIXUP_ZOTAC_Z68,
7555 	ALC662_FIXUP_INV_DMIC,
7556 	ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
7557 	ALC668_FIXUP_DELL_MIC_NO_PRESENCE,
7558 	ALC662_FIXUP_HEADSET_MODE,
7559 	ALC668_FIXUP_HEADSET_MODE,
7560 	ALC662_FIXUP_BASS_MODE4_CHMAP,
7561 	ALC662_FIXUP_BASS_16,
7562 	ALC662_FIXUP_BASS_1A,
7563 	ALC662_FIXUP_BASS_CHMAP,
7564 	ALC668_FIXUP_AUTO_MUTE,
7565 	ALC668_FIXUP_DELL_DISABLE_AAMIX,
7566 	ALC668_FIXUP_DELL_XPS13,
7567 	ALC662_FIXUP_ASUS_Nx50,
7568 	ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
7569 	ALC668_FIXUP_ASUS_Nx51,
7570 	ALC891_FIXUP_HEADSET_MODE,
7571 	ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
7572 	ALC662_FIXUP_ACER_VERITON,
7573 	ALC892_FIXUP_ASROCK_MOBO,
7574 	ALC662_FIXUP_USI_FUNC,
7575 	ALC662_FIXUP_USI_HEADSET_MODE,
7576 	ALC662_FIXUP_LENOVO_MULTI_CODECS,
7577 };
7578 
7579 static const struct hda_fixup alc662_fixups[] = {
7580 	[ALC662_FIXUP_ASPIRE] = {
7581 		.type = HDA_FIXUP_PINS,
7582 		.v.pins = (const struct hda_pintbl[]) {
7583 			{ 0x15, 0x99130112 }, /* subwoofer */
7584 			{ }
7585 		}
7586 	},
7587 	[ALC662_FIXUP_LED_GPIO1] = {
7588 		.type = HDA_FIXUP_FUNC,
7589 		.v.func = alc662_fixup_led_gpio1,
7590 	},
7591 	[ALC662_FIXUP_IDEAPAD] = {
7592 		.type = HDA_FIXUP_PINS,
7593 		.v.pins = (const struct hda_pintbl[]) {
7594 			{ 0x17, 0x99130112 }, /* subwoofer */
7595 			{ }
7596 		},
7597 		.chained = true,
7598 		.chain_id = ALC662_FIXUP_LED_GPIO1,
7599 	},
7600 	[ALC272_FIXUP_MARIO] = {
7601 		.type = HDA_FIXUP_FUNC,
7602 		.v.func = alc272_fixup_mario,
7603 	},
7604 	[ALC662_FIXUP_CZC_P10T] = {
7605 		.type = HDA_FIXUP_VERBS,
7606 		.v.verbs = (const struct hda_verb[]) {
7607 			{0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
7608 			{}
7609 		}
7610 	},
7611 	[ALC662_FIXUP_SKU_IGNORE] = {
7612 		.type = HDA_FIXUP_FUNC,
7613 		.v.func = alc_fixup_sku_ignore,
7614 	},
7615 	[ALC662_FIXUP_HP_RP5800] = {
7616 		.type = HDA_FIXUP_PINS,
7617 		.v.pins = (const struct hda_pintbl[]) {
7618 			{ 0x14, 0x0221201f }, /* HP out */
7619 			{ }
7620 		},
7621 		.chained = true,
7622 		.chain_id = ALC662_FIXUP_SKU_IGNORE
7623 	},
7624 	[ALC662_FIXUP_ASUS_MODE1] = {
7625 		.type = HDA_FIXUP_PINS,
7626 		.v.pins = (const struct hda_pintbl[]) {
7627 			{ 0x14, 0x99130110 }, /* speaker */
7628 			{ 0x18, 0x01a19c20 }, /* mic */
7629 			{ 0x19, 0x99a3092f }, /* int-mic */
7630 			{ 0x21, 0x0121401f }, /* HP out */
7631 			{ }
7632 		},
7633 		.chained = true,
7634 		.chain_id = ALC662_FIXUP_SKU_IGNORE
7635 	},
7636 	[ALC662_FIXUP_ASUS_MODE2] = {
7637 		.type = HDA_FIXUP_PINS,
7638 		.v.pins = (const struct hda_pintbl[]) {
7639 			{ 0x14, 0x99130110 }, /* speaker */
7640 			{ 0x18, 0x01a19820 }, /* mic */
7641 			{ 0x19, 0x99a3092f }, /* int-mic */
7642 			{ 0x1b, 0x0121401f }, /* HP out */
7643 			{ }
7644 		},
7645 		.chained = true,
7646 		.chain_id = ALC662_FIXUP_SKU_IGNORE
7647 	},
7648 	[ALC662_FIXUP_ASUS_MODE3] = {
7649 		.type = HDA_FIXUP_PINS,
7650 		.v.pins = (const struct hda_pintbl[]) {
7651 			{ 0x14, 0x99130110 }, /* speaker */
7652 			{ 0x15, 0x0121441f }, /* HP */
7653 			{ 0x18, 0x01a19840 }, /* mic */
7654 			{ 0x19, 0x99a3094f }, /* int-mic */
7655 			{ 0x21, 0x01211420 }, /* HP2 */
7656 			{ }
7657 		},
7658 		.chained = true,
7659 		.chain_id = ALC662_FIXUP_SKU_IGNORE
7660 	},
7661 	[ALC662_FIXUP_ASUS_MODE4] = {
7662 		.type = HDA_FIXUP_PINS,
7663 		.v.pins = (const struct hda_pintbl[]) {
7664 			{ 0x14, 0x99130110 }, /* speaker */
7665 			{ 0x16, 0x99130111 }, /* speaker */
7666 			{ 0x18, 0x01a19840 }, /* mic */
7667 			{ 0x19, 0x99a3094f }, /* int-mic */
7668 			{ 0x21, 0x0121441f }, /* HP */
7669 			{ }
7670 		},
7671 		.chained = true,
7672 		.chain_id = ALC662_FIXUP_SKU_IGNORE
7673 	},
7674 	[ALC662_FIXUP_ASUS_MODE5] = {
7675 		.type = HDA_FIXUP_PINS,
7676 		.v.pins = (const struct hda_pintbl[]) {
7677 			{ 0x14, 0x99130110 }, /* speaker */
7678 			{ 0x15, 0x0121441f }, /* HP */
7679 			{ 0x16, 0x99130111 }, /* speaker */
7680 			{ 0x18, 0x01a19840 }, /* mic */
7681 			{ 0x19, 0x99a3094f }, /* int-mic */
7682 			{ }
7683 		},
7684 		.chained = true,
7685 		.chain_id = ALC662_FIXUP_SKU_IGNORE
7686 	},
7687 	[ALC662_FIXUP_ASUS_MODE6] = {
7688 		.type = HDA_FIXUP_PINS,
7689 		.v.pins = (const struct hda_pintbl[]) {
7690 			{ 0x14, 0x99130110 }, /* speaker */
7691 			{ 0x15, 0x01211420 }, /* HP2 */
7692 			{ 0x18, 0x01a19840 }, /* mic */
7693 			{ 0x19, 0x99a3094f }, /* int-mic */
7694 			{ 0x1b, 0x0121441f }, /* HP */
7695 			{ }
7696 		},
7697 		.chained = true,
7698 		.chain_id = ALC662_FIXUP_SKU_IGNORE
7699 	},
7700 	[ALC662_FIXUP_ASUS_MODE7] = {
7701 		.type = HDA_FIXUP_PINS,
7702 		.v.pins = (const struct hda_pintbl[]) {
7703 			{ 0x14, 0x99130110 }, /* speaker */
7704 			{ 0x17, 0x99130111 }, /* speaker */
7705 			{ 0x18, 0x01a19840 }, /* mic */
7706 			{ 0x19, 0x99a3094f }, /* int-mic */
7707 			{ 0x1b, 0x01214020 }, /* HP */
7708 			{ 0x21, 0x0121401f }, /* HP */
7709 			{ }
7710 		},
7711 		.chained = true,
7712 		.chain_id = ALC662_FIXUP_SKU_IGNORE
7713 	},
7714 	[ALC662_FIXUP_ASUS_MODE8] = {
7715 		.type = HDA_FIXUP_PINS,
7716 		.v.pins = (const struct hda_pintbl[]) {
7717 			{ 0x14, 0x99130110 }, /* speaker */
7718 			{ 0x12, 0x99a30970 }, /* int-mic */
7719 			{ 0x15, 0x01214020 }, /* HP */
7720 			{ 0x17, 0x99130111 }, /* speaker */
7721 			{ 0x18, 0x01a19840 }, /* mic */
7722 			{ 0x21, 0x0121401f }, /* HP */
7723 			{ }
7724 		},
7725 		.chained = true,
7726 		.chain_id = ALC662_FIXUP_SKU_IGNORE
7727 	},
7728 	[ALC662_FIXUP_NO_JACK_DETECT] = {
7729 		.type = HDA_FIXUP_FUNC,
7730 		.v.func = alc_fixup_no_jack_detect,
7731 	},
7732 	[ALC662_FIXUP_ZOTAC_Z68] = {
7733 		.type = HDA_FIXUP_PINS,
7734 		.v.pins = (const struct hda_pintbl[]) {
7735 			{ 0x1b, 0x02214020 }, /* Front HP */
7736 			{ }
7737 		}
7738 	},
7739 	[ALC662_FIXUP_INV_DMIC] = {
7740 		.type = HDA_FIXUP_FUNC,
7741 		.v.func = alc_fixup_inv_dmic,
7742 	},
7743 	[ALC668_FIXUP_DELL_XPS13] = {
7744 		.type = HDA_FIXUP_FUNC,
7745 		.v.func = alc_fixup_dell_xps13,
7746 		.chained = true,
7747 		.chain_id = ALC668_FIXUP_DELL_DISABLE_AAMIX
7748 	},
7749 	[ALC668_FIXUP_DELL_DISABLE_AAMIX] = {
7750 		.type = HDA_FIXUP_FUNC,
7751 		.v.func = alc_fixup_disable_aamix,
7752 		.chained = true,
7753 		.chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
7754 	},
7755 	[ALC668_FIXUP_AUTO_MUTE] = {
7756 		.type = HDA_FIXUP_FUNC,
7757 		.v.func = alc_fixup_auto_mute_via_amp,
7758 		.chained = true,
7759 		.chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
7760 	},
7761 	[ALC662_FIXUP_DELL_MIC_NO_PRESENCE] = {
7762 		.type = HDA_FIXUP_PINS,
7763 		.v.pins = (const struct hda_pintbl[]) {
7764 			{ 0x19, 0x03a1113c }, /* use as headset mic, without its own jack detect */
7765 			/* headphone mic by setting pin control of 0x1b (headphone out) to in + vref_50 */
7766 			{ }
7767 		},
7768 		.chained = true,
7769 		.chain_id = ALC662_FIXUP_HEADSET_MODE
7770 	},
7771 	[ALC662_FIXUP_HEADSET_MODE] = {
7772 		.type = HDA_FIXUP_FUNC,
7773 		.v.func = alc_fixup_headset_mode_alc662,
7774 	},
7775 	[ALC668_FIXUP_DELL_MIC_NO_PRESENCE] = {
7776 		.type = HDA_FIXUP_PINS,
7777 		.v.pins = (const struct hda_pintbl[]) {
7778 			{ 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
7779 			{ 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
7780 			{ }
7781 		},
7782 		.chained = true,
7783 		.chain_id = ALC668_FIXUP_HEADSET_MODE
7784 	},
7785 	[ALC668_FIXUP_HEADSET_MODE] = {
7786 		.type = HDA_FIXUP_FUNC,
7787 		.v.func = alc_fixup_headset_mode_alc668,
7788 	},
7789 	[ALC662_FIXUP_BASS_MODE4_CHMAP] = {
7790 		.type = HDA_FIXUP_FUNC,
7791 		.v.func = alc_fixup_bass_chmap,
7792 		.chained = true,
7793 		.chain_id = ALC662_FIXUP_ASUS_MODE4
7794 	},
7795 	[ALC662_FIXUP_BASS_16] = {
7796 		.type = HDA_FIXUP_PINS,
7797 		.v.pins = (const struct hda_pintbl[]) {
7798 			{0x16, 0x80106111}, /* bass speaker */
7799 			{}
7800 		},
7801 		.chained = true,
7802 		.chain_id = ALC662_FIXUP_BASS_CHMAP,
7803 	},
7804 	[ALC662_FIXUP_BASS_1A] = {
7805 		.type = HDA_FIXUP_PINS,
7806 		.v.pins = (const struct hda_pintbl[]) {
7807 			{0x1a, 0x80106111}, /* bass speaker */
7808 			{}
7809 		},
7810 		.chained = true,
7811 		.chain_id = ALC662_FIXUP_BASS_CHMAP,
7812 	},
7813 	[ALC662_FIXUP_BASS_CHMAP] = {
7814 		.type = HDA_FIXUP_FUNC,
7815 		.v.func = alc_fixup_bass_chmap,
7816 	},
7817 	[ALC662_FIXUP_ASUS_Nx50] = {
7818 		.type = HDA_FIXUP_FUNC,
7819 		.v.func = alc_fixup_auto_mute_via_amp,
7820 		.chained = true,
7821 		.chain_id = ALC662_FIXUP_BASS_1A
7822 	},
7823 	[ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE] = {
7824 		.type = HDA_FIXUP_FUNC,
7825 		.v.func = alc_fixup_headset_mode_alc668,
7826 		.chain_id = ALC662_FIXUP_BASS_CHMAP
7827 	},
7828 	[ALC668_FIXUP_ASUS_Nx51] = {
7829 		.type = HDA_FIXUP_PINS,
7830 		.v.pins = (const struct hda_pintbl[]) {
7831 			{ 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
7832 			{ 0x1a, 0x90170151 }, /* bass speaker */
7833 			{ 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
7834 			{}
7835 		},
7836 		.chained = true,
7837 		.chain_id = ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
7838 	},
7839 	[ALC891_FIXUP_HEADSET_MODE] = {
7840 		.type = HDA_FIXUP_FUNC,
7841 		.v.func = alc_fixup_headset_mode,
7842 	},
7843 	[ALC891_FIXUP_DELL_MIC_NO_PRESENCE] = {
7844 		.type = HDA_FIXUP_PINS,
7845 		.v.pins = (const struct hda_pintbl[]) {
7846 			{ 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
7847 			{ 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
7848 			{ }
7849 		},
7850 		.chained = true,
7851 		.chain_id = ALC891_FIXUP_HEADSET_MODE
7852 	},
7853 	[ALC662_FIXUP_ACER_VERITON] = {
7854 		.type = HDA_FIXUP_PINS,
7855 		.v.pins = (const struct hda_pintbl[]) {
7856 			{ 0x15, 0x50170120 }, /* no internal speaker */
7857 			{ }
7858 		}
7859 	},
7860 	[ALC892_FIXUP_ASROCK_MOBO] = {
7861 		.type = HDA_FIXUP_PINS,
7862 		.v.pins = (const struct hda_pintbl[]) {
7863 			{ 0x15, 0x40f000f0 }, /* disabled */
7864 			{ 0x16, 0x40f000f0 }, /* disabled */
7865 			{ }
7866 		}
7867 	},
7868 	[ALC662_FIXUP_USI_FUNC] = {
7869 		.type = HDA_FIXUP_FUNC,
7870 		.v.func = alc662_fixup_usi_headset_mic,
7871 	},
7872 	[ALC662_FIXUP_USI_HEADSET_MODE] = {
7873 		.type = HDA_FIXUP_PINS,
7874 		.v.pins = (const struct hda_pintbl[]) {
7875 			{ 0x19, 0x02a1913c }, /* use as headset mic, without its own jack detect */
7876 			{ 0x18, 0x01a1903d },
7877 			{ }
7878 		},
7879 		.chained = true,
7880 		.chain_id = ALC662_FIXUP_USI_FUNC
7881 	},
7882 	[ALC662_FIXUP_LENOVO_MULTI_CODECS] = {
7883 		.type = HDA_FIXUP_FUNC,
7884 		.v.func = alc233_alc662_fixup_lenovo_dual_codecs,
7885 	},
7886 };
7887 
7888 static const struct snd_pci_quirk alc662_fixup_tbl[] = {
7889 	SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2),
7890 	SND_PCI_QUIRK(0x1025, 0x022f, "Acer Aspire One", ALC662_FIXUP_INV_DMIC),
7891 	SND_PCI_QUIRK(0x1025, 0x0241, "Packard Bell DOTS", ALC662_FIXUP_INV_DMIC),
7892 	SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
7893 	SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),
7894 	SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC),
7895 	SND_PCI_QUIRK(0x1025, 0x034a, "Gateway LT27", ALC662_FIXUP_INV_DMIC),
7896 	SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
7897 	SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
7898 	SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
7899 	SND_PCI_QUIRK(0x1028, 0x05fe, "Dell XPS 15", ALC668_FIXUP_DELL_XPS13),
7900 	SND_PCI_QUIRK(0x1028, 0x060a, "Dell XPS 13", ALC668_FIXUP_DELL_XPS13),
7901 	SND_PCI_QUIRK(0x1028, 0x060d, "Dell M3800", ALC668_FIXUP_DELL_XPS13),
7902 	SND_PCI_QUIRK(0x1028, 0x0625, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
7903 	SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
7904 	SND_PCI_QUIRK(0x1028, 0x0696, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
7905 	SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
7906 	SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
7907 	SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
7908 	SND_PCI_QUIRK(0x1043, 0x1080, "Asus UX501VW", ALC668_FIXUP_HEADSET_MODE),
7909 	SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_ASUS_Nx50),
7910 	SND_PCI_QUIRK(0x1043, 0x13df, "Asus N550JX", ALC662_FIXUP_BASS_1A),
7911 	SND_PCI_QUIRK(0x1043, 0x129d, "Asus N750", ALC662_FIXUP_ASUS_Nx50),
7912 	SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
7913 	SND_PCI_QUIRK(0x1043, 0x15a7, "ASUS UX51VZH", ALC662_FIXUP_BASS_16),
7914 	SND_PCI_QUIRK(0x1043, 0x177d, "ASUS N551", ALC668_FIXUP_ASUS_Nx51),
7915 	SND_PCI_QUIRK(0x1043, 0x17bd, "ASUS N751", ALC668_FIXUP_ASUS_Nx51),
7916 	SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71SL", ALC662_FIXUP_ASUS_MODE8),
7917 	SND_PCI_QUIRK(0x1043, 0x1b73, "ASUS N55SF", ALC662_FIXUP_BASS_16),
7918 	SND_PCI_QUIRK(0x1043, 0x1bf3, "ASUS N76VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
7919 	SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),
7920 	SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
7921 	SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
7922 	SND_PCI_QUIRK(0x14cd, 0x5003, "USI", ALC662_FIXUP_USI_HEADSET_MODE),
7923 	SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC662_FIXUP_LENOVO_MULTI_CODECS),
7924 	SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
7925 	SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
7926 	SND_PCI_QUIRK(0x1849, 0x5892, "ASRock B150M", ALC892_FIXUP_ASROCK_MOBO),
7927 	SND_PCI_QUIRK(0x19da, 0xa130, "Zotac Z68", ALC662_FIXUP_ZOTAC_Z68),
7928 	SND_PCI_QUIRK(0x1b0a, 0x01b8, "ACER Veriton", ALC662_FIXUP_ACER_VERITON),
7929 	SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
7930 
7931 #if 0
7932 	/* Below is a quirk table taken from the old code.
7933 	 * Basically the device should work as is without the fixup table.
7934 	 * If BIOS doesn't give a proper info, enable the corresponding
7935 	 * fixup entry.
7936 	 */
7937 	SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1),
7938 	SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3),
7939 	SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1),
7940 	SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC662_FIXUP_ASUS_MODE3),
7941 	SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
7942 	SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
7943 	SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
7944 	SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC662_FIXUP_ASUS_MODE1),
7945 	SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC662_FIXUP_ASUS_MODE1),
7946 	SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
7947 	SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC662_FIXUP_ASUS_MODE7),
7948 	SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC662_FIXUP_ASUS_MODE7),
7949 	SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC662_FIXUP_ASUS_MODE8),
7950 	SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC662_FIXUP_ASUS_MODE3),
7951 	SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC662_FIXUP_ASUS_MODE1),
7952 	SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
7953 	SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_FIXUP_ASUS_MODE2),
7954 	SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC662_FIXUP_ASUS_MODE1),
7955 	SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
7956 	SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
7957 	SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
7958 	SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
7959 	SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC662_FIXUP_ASUS_MODE1),
7960 	SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC662_FIXUP_ASUS_MODE3),
7961 	SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_FIXUP_ASUS_MODE2),
7962 	SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
7963 	SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC662_FIXUP_ASUS_MODE5),
7964 	SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
7965 	SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
7966 	SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC662_FIXUP_ASUS_MODE1),
7967 	SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
7968 	SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
7969 	SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC662_FIXUP_ASUS_MODE3),
7970 	SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC662_FIXUP_ASUS_MODE3),
7971 	SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC662_FIXUP_ASUS_MODE1),
7972 	SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC662_FIXUP_ASUS_MODE1),
7973 	SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC662_FIXUP_ASUS_MODE1),
7974 	SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC662_FIXUP_ASUS_MODE1),
7975 	SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC662_FIXUP_ASUS_MODE1),
7976 	SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
7977 	SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_FIXUP_ASUS_MODE2),
7978 	SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC662_FIXUP_ASUS_MODE1),
7979 	SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
7980 	SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC662_FIXUP_ASUS_MODE3),
7981 	SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC662_FIXUP_ASUS_MODE1),
7982 	SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC662_FIXUP_ASUS_MODE1),
7983 	SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC662_FIXUP_ASUS_MODE1),
7984 	SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_FIXUP_ASUS_MODE2),
7985 	SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
7986 	SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE4),
7987 #endif
7988 	{}
7989 };
7990 
7991 static const struct hda_model_fixup alc662_fixup_models[] = {
7992 	{.id = ALC272_FIXUP_MARIO, .name = "mario"},
7993 	{.id = ALC662_FIXUP_ASUS_MODE1, .name = "asus-mode1"},
7994 	{.id = ALC662_FIXUP_ASUS_MODE2, .name = "asus-mode2"},
7995 	{.id = ALC662_FIXUP_ASUS_MODE3, .name = "asus-mode3"},
7996 	{.id = ALC662_FIXUP_ASUS_MODE4, .name = "asus-mode4"},
7997 	{.id = ALC662_FIXUP_ASUS_MODE5, .name = "asus-mode5"},
7998 	{.id = ALC662_FIXUP_ASUS_MODE6, .name = "asus-mode6"},
7999 	{.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},
8000 	{.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},
8001 	{.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"},
8002 	{.id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
8003 	{.id = ALC662_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
8004 	{}
8005 };
8006 
8007 static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = {
8008 	SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
8009 		{0x17, 0x02211010},
8010 		{0x18, 0x01a19030},
8011 		{0x1a, 0x01813040},
8012 		{0x21, 0x01014020}),
8013 	SND_HDA_PIN_QUIRK(0x10ec0662, 0x1028, "Dell", ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
8014 		{0x14, 0x01014010},
8015 		{0x18, 0x01a19020},
8016 		{0x1a, 0x0181302f},
8017 		{0x1b, 0x0221401f}),
8018 	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
8019 		{0x12, 0x99a30130},
8020 		{0x14, 0x90170110},
8021 		{0x15, 0x0321101f},
8022 		{0x16, 0x03011020}),
8023 	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
8024 		{0x12, 0x99a30140},
8025 		{0x14, 0x90170110},
8026 		{0x15, 0x0321101f},
8027 		{0x16, 0x03011020}),
8028 	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
8029 		{0x12, 0x99a30150},
8030 		{0x14, 0x90170110},
8031 		{0x15, 0x0321101f},
8032 		{0x16, 0x03011020}),
8033 	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
8034 		{0x14, 0x90170110},
8035 		{0x15, 0x0321101f},
8036 		{0x16, 0x03011020}),
8037 	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell XPS 15", ALC668_FIXUP_AUTO_MUTE,
8038 		{0x12, 0x90a60130},
8039 		{0x14, 0x90170110},
8040 		{0x15, 0x0321101f}),
8041 	{}
8042 };
8043 
8044 /*
8045  */
8046 static int patch_alc662(struct hda_codec *codec)
8047 {
8048 	struct alc_spec *spec;
8049 	int err;
8050 
8051 	err = alc_alloc_spec(codec, 0x0b);
8052 	if (err < 0)
8053 		return err;
8054 
8055 	spec = codec->spec;
8056 
8057 	spec->shutup = alc_eapd_shutup;
8058 
8059 	/* handle multiple HPs as is */
8060 	spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
8061 
8062 	alc_fix_pll_init(codec, 0x20, 0x04, 15);
8063 
8064 	switch (codec->core.vendor_id) {
8065 	case 0x10ec0668:
8066 		spec->init_hook = alc668_restore_default_value;
8067 		break;
8068 	}
8069 
8070 	snd_hda_pick_fixup(codec, alc662_fixup_models,
8071 		       alc662_fixup_tbl, alc662_fixups);
8072 	snd_hda_pick_pin_fixup(codec, alc662_pin_fixup_tbl, alc662_fixups);
8073 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
8074 
8075 	alc_auto_parse_customize_define(codec);
8076 
8077 	if (has_cdefine_beep(codec))
8078 		spec->gen.beep_nid = 0x01;
8079 
8080 	if ((alc_get_coef0(codec) & (1 << 14)) &&
8081 	    codec->bus->pci && codec->bus->pci->subsystem_vendor == 0x1025 &&
8082 	    spec->cdefine.platform_type == 1) {
8083 		err = alc_codec_rename(codec, "ALC272X");
8084 		if (err < 0)
8085 			goto error;
8086 	}
8087 
8088 	/* automatic parse from the BIOS config */
8089 	err = alc662_parse_auto_config(codec);
8090 	if (err < 0)
8091 		goto error;
8092 
8093 	if (!spec->gen.no_analog && spec->gen.beep_nid) {
8094 		switch (codec->core.vendor_id) {
8095 		case 0x10ec0662:
8096 			set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
8097 			break;
8098 		case 0x10ec0272:
8099 		case 0x10ec0663:
8100 		case 0x10ec0665:
8101 		case 0x10ec0668:
8102 			set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
8103 			break;
8104 		case 0x10ec0273:
8105 			set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
8106 			break;
8107 		}
8108 	}
8109 
8110 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
8111 
8112 	return 0;
8113 
8114  error:
8115 	alc_free(codec);
8116 	return err;
8117 }
8118 
8119 /*
8120  * ALC680 support
8121  */
8122 
8123 static int alc680_parse_auto_config(struct hda_codec *codec)
8124 {
8125 	return alc_parse_auto_config(codec, NULL, NULL);
8126 }
8127 
8128 /*
8129  */
8130 static int patch_alc680(struct hda_codec *codec)
8131 {
8132 	int err;
8133 
8134 	/* ALC680 has no aa-loopback mixer */
8135 	err = alc_alloc_spec(codec, 0);
8136 	if (err < 0)
8137 		return err;
8138 
8139 	/* automatic parse from the BIOS config */
8140 	err = alc680_parse_auto_config(codec);
8141 	if (err < 0) {
8142 		alc_free(codec);
8143 		return err;
8144 	}
8145 
8146 	return 0;
8147 }
8148 
8149 /*
8150  * patch entries
8151  */
8152 static const struct hda_device_id snd_hda_id_realtek[] = {
8153 	HDA_CODEC_ENTRY(0x10ec0215, "ALC215", patch_alc269),
8154 	HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269),
8155 	HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269),
8156 	HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269),
8157 	HDA_CODEC_ENTRY(0x10ec0233, "ALC233", patch_alc269),
8158 	HDA_CODEC_ENTRY(0x10ec0234, "ALC234", patch_alc269),
8159 	HDA_CODEC_ENTRY(0x10ec0235, "ALC233", patch_alc269),
8160 	HDA_CODEC_ENTRY(0x10ec0236, "ALC236", patch_alc269),
8161 	HDA_CODEC_ENTRY(0x10ec0255, "ALC255", patch_alc269),
8162 	HDA_CODEC_ENTRY(0x10ec0256, "ALC256", patch_alc269),
8163 	HDA_CODEC_ENTRY(0x10ec0257, "ALC257", patch_alc269),
8164 	HDA_CODEC_ENTRY(0x10ec0260, "ALC260", patch_alc260),
8165 	HDA_CODEC_ENTRY(0x10ec0262, "ALC262", patch_alc262),
8166 	HDA_CODEC_ENTRY(0x10ec0267, "ALC267", patch_alc268),
8167 	HDA_CODEC_ENTRY(0x10ec0268, "ALC268", patch_alc268),
8168 	HDA_CODEC_ENTRY(0x10ec0269, "ALC269", patch_alc269),
8169 	HDA_CODEC_ENTRY(0x10ec0270, "ALC270", patch_alc269),
8170 	HDA_CODEC_ENTRY(0x10ec0272, "ALC272", patch_alc662),
8171 	HDA_CODEC_ENTRY(0x10ec0274, "ALC274", patch_alc269),
8172 	HDA_CODEC_ENTRY(0x10ec0275, "ALC275", patch_alc269),
8173 	HDA_CODEC_ENTRY(0x10ec0276, "ALC276", patch_alc269),
8174 	HDA_CODEC_ENTRY(0x10ec0280, "ALC280", patch_alc269),
8175 	HDA_CODEC_ENTRY(0x10ec0282, "ALC282", patch_alc269),
8176 	HDA_CODEC_ENTRY(0x10ec0283, "ALC283", patch_alc269),
8177 	HDA_CODEC_ENTRY(0x10ec0284, "ALC284", patch_alc269),
8178 	HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269),
8179 	HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269),
8180 	HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269),
8181 	HDA_CODEC_ENTRY(0x10ec0289, "ALC289", patch_alc269),
8182 	HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269),
8183 	HDA_CODEC_ENTRY(0x10ec0292, "ALC292", patch_alc269),
8184 	HDA_CODEC_ENTRY(0x10ec0293, "ALC293", patch_alc269),
8185 	HDA_CODEC_ENTRY(0x10ec0294, "ALC294", patch_alc269),
8186 	HDA_CODEC_ENTRY(0x10ec0295, "ALC295", patch_alc269),
8187 	HDA_CODEC_ENTRY(0x10ec0298, "ALC298", patch_alc269),
8188 	HDA_CODEC_ENTRY(0x10ec0299, "ALC299", patch_alc269),
8189 	HDA_CODEC_REV_ENTRY(0x10ec0861, 0x100340, "ALC660", patch_alc861),
8190 	HDA_CODEC_ENTRY(0x10ec0660, "ALC660-VD", patch_alc861vd),
8191 	HDA_CODEC_ENTRY(0x10ec0861, "ALC861", patch_alc861),
8192 	HDA_CODEC_ENTRY(0x10ec0862, "ALC861-VD", patch_alc861vd),
8193 	HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100002, "ALC662 rev2", patch_alc882),
8194 	HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100101, "ALC662 rev1", patch_alc662),
8195 	HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100300, "ALC662 rev3", patch_alc662),
8196 	HDA_CODEC_ENTRY(0x10ec0663, "ALC663", patch_alc662),
8197 	HDA_CODEC_ENTRY(0x10ec0665, "ALC665", patch_alc662),
8198 	HDA_CODEC_ENTRY(0x10ec0667, "ALC667", patch_alc662),
8199 	HDA_CODEC_ENTRY(0x10ec0668, "ALC668", patch_alc662),
8200 	HDA_CODEC_ENTRY(0x10ec0670, "ALC670", patch_alc662),
8201 	HDA_CODEC_ENTRY(0x10ec0671, "ALC671", patch_alc662),
8202 	HDA_CODEC_ENTRY(0x10ec0680, "ALC680", patch_alc680),
8203 	HDA_CODEC_ENTRY(0x10ec0700, "ALC700", patch_alc269),
8204 	HDA_CODEC_ENTRY(0x10ec0701, "ALC701", patch_alc269),
8205 	HDA_CODEC_ENTRY(0x10ec0703, "ALC703", patch_alc269),
8206 	HDA_CODEC_ENTRY(0x10ec0867, "ALC891", patch_alc662),
8207 	HDA_CODEC_ENTRY(0x10ec0880, "ALC880", patch_alc880),
8208 	HDA_CODEC_ENTRY(0x10ec0882, "ALC882", patch_alc882),
8209 	HDA_CODEC_ENTRY(0x10ec0883, "ALC883", patch_alc882),
8210 	HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100101, "ALC889A", patch_alc882),
8211 	HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100103, "ALC889A", patch_alc882),
8212 	HDA_CODEC_ENTRY(0x10ec0885, "ALC885", patch_alc882),
8213 	HDA_CODEC_ENTRY(0x10ec0887, "ALC887", patch_alc882),
8214 	HDA_CODEC_REV_ENTRY(0x10ec0888, 0x100101, "ALC1200", patch_alc882),
8215 	HDA_CODEC_ENTRY(0x10ec0888, "ALC888", patch_alc882),
8216 	HDA_CODEC_ENTRY(0x10ec0889, "ALC889", patch_alc882),
8217 	HDA_CODEC_ENTRY(0x10ec0892, "ALC892", patch_alc662),
8218 	HDA_CODEC_ENTRY(0x10ec0899, "ALC898", patch_alc882),
8219 	HDA_CODEC_ENTRY(0x10ec0900, "ALC1150", patch_alc882),
8220 	HDA_CODEC_ENTRY(0x10ec1168, "ALC1220", patch_alc882),
8221 	HDA_CODEC_ENTRY(0x10ec1220, "ALC1220", patch_alc882),
8222 	{} /* terminator */
8223 };
8224 MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_realtek);
8225 
8226 MODULE_LICENSE("GPL");
8227 MODULE_DESCRIPTION("Realtek HD-audio codec");
8228 
8229 static struct hda_codec_driver realtek_driver = {
8230 	.id = snd_hda_id_realtek,
8231 };
8232 
8233 module_hda_codec_driver(realtek_driver);
8234