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