xref: /linux/sound/pci/hda/patch_realtek.c (revision 419043609689d0aba9f727a6faf1ff406e269ecf)
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 <sound/core.h>
33 #include <sound/jack.h>
34 #include "hda_codec.h"
35 #include "hda_local.h"
36 #include "hda_auto_parser.h"
37 #include "hda_jack.h"
38 #include "hda_generic.h"
39 
40 /* keep halting ALC5505 DSP, for power saving */
41 #define HALT_REALTEK_ALC5505
42 
43 /* for GPIO Poll */
44 #define GPIO_MASK	0x03
45 
46 /* extra amp-initialization sequence types */
47 enum {
48 	ALC_INIT_NONE,
49 	ALC_INIT_DEFAULT,
50 	ALC_INIT_GPIO1,
51 	ALC_INIT_GPIO2,
52 	ALC_INIT_GPIO3,
53 };
54 
55 enum {
56 	ALC_HEADSET_MODE_UNKNOWN,
57 	ALC_HEADSET_MODE_UNPLUGGED,
58 	ALC_HEADSET_MODE_HEADSET,
59 	ALC_HEADSET_MODE_MIC,
60 	ALC_HEADSET_MODE_HEADPHONE,
61 };
62 
63 enum {
64 	ALC_HEADSET_TYPE_UNKNOWN,
65 	ALC_HEADSET_TYPE_CTIA,
66 	ALC_HEADSET_TYPE_OMTP,
67 };
68 
69 struct alc_customize_define {
70 	unsigned int  sku_cfg;
71 	unsigned char port_connectivity;
72 	unsigned char check_sum;
73 	unsigned char customization;
74 	unsigned char external_amp;
75 	unsigned int  enable_pcbeep:1;
76 	unsigned int  platform_type:1;
77 	unsigned int  swap:1;
78 	unsigned int  override:1;
79 	unsigned int  fixup:1; /* Means that this sku is set by driver, not read from hw */
80 };
81 
82 struct alc_spec {
83 	struct hda_gen_spec gen; /* must be at head */
84 
85 	/* codec parameterization */
86 	const struct snd_kcontrol_new *mixers[5];	/* mixer arrays */
87 	unsigned int num_mixers;
88 	unsigned int beep_amp;	/* beep amp value, set via set_beep_amp() */
89 
90 	struct alc_customize_define cdefine;
91 	unsigned int parse_flags; /* flag for snd_hda_parse_pin_defcfg() */
92 
93 	/* mute LED for HP laptops, see alc269_fixup_mic_mute_hook() */
94 	int mute_led_polarity;
95 	hda_nid_t mute_led_nid;
96 	hda_nid_t cap_mute_led_nid;
97 
98 	unsigned int gpio_led; /* used for alc269_fixup_hp_gpio_led() */
99 
100 	hda_nid_t headset_mic_pin;
101 	hda_nid_t headphone_mic_pin;
102 	int current_headset_mode;
103 	int current_headset_type;
104 
105 	/* hooks */
106 	void (*init_hook)(struct hda_codec *codec);
107 #ifdef CONFIG_PM
108 	void (*power_hook)(struct hda_codec *codec);
109 #endif
110 	void (*shutup)(struct hda_codec *codec);
111 
112 	int init_amp;
113 	int codec_variant;	/* flag for other variants */
114 	unsigned int has_alc5505_dsp:1;
115 	unsigned int no_depop_delay:1;
116 
117 	/* for PLL fix */
118 	hda_nid_t pll_nid;
119 	unsigned int pll_coef_idx, pll_coef_bit;
120 	unsigned int coef0;
121 };
122 
123 /*
124  * COEF access helper functions
125  */
126 
127 static int alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
128 			       unsigned int coef_idx)
129 {
130 	unsigned int val;
131 
132 	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
133 	val = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PROC_COEF, 0);
134 	return val;
135 }
136 
137 #define alc_read_coef_idx(codec, coef_idx) \
138 	alc_read_coefex_idx(codec, 0x20, coef_idx)
139 
140 static void alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
141 				 unsigned int coef_idx, unsigned int coef_val)
142 {
143 	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
144 	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PROC_COEF, coef_val);
145 }
146 
147 #define alc_write_coef_idx(codec, coef_idx, coef_val) \
148 	alc_write_coefex_idx(codec, 0x20, coef_idx, coef_val)
149 
150 static void alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
151 				  unsigned int coef_idx, unsigned int mask,
152 				  unsigned int bits_set)
153 {
154 	unsigned int val = alc_read_coefex_idx(codec, nid, coef_idx);
155 
156 	if (val != -1)
157 		alc_write_coefex_idx(codec, nid, coef_idx,
158 				     (val & ~mask) | bits_set);
159 }
160 
161 #define alc_update_coef_idx(codec, coef_idx, mask, bits_set)	\
162 	alc_update_coefex_idx(codec, 0x20, coef_idx, mask, bits_set)
163 
164 /* a special bypass for COEF 0; read the cached value at the second time */
165 static unsigned int alc_get_coef0(struct hda_codec *codec)
166 {
167 	struct alc_spec *spec = codec->spec;
168 
169 	if (!spec->coef0)
170 		spec->coef0 = alc_read_coef_idx(codec, 0);
171 	return spec->coef0;
172 }
173 
174 /* coef writes/updates batch */
175 struct coef_fw {
176 	unsigned char nid;
177 	unsigned char idx;
178 	unsigned short mask;
179 	unsigned short val;
180 };
181 
182 #define UPDATE_COEFEX(_nid, _idx, _mask, _val) \
183 	{ .nid = (_nid), .idx = (_idx), .mask = (_mask), .val = (_val) }
184 #define WRITE_COEFEX(_nid, _idx, _val) UPDATE_COEFEX(_nid, _idx, -1, _val)
185 #define WRITE_COEF(_idx, _val) WRITE_COEFEX(0x20, _idx, _val)
186 #define UPDATE_COEF(_idx, _mask, _val) UPDATE_COEFEX(0x20, _idx, _mask, _val)
187 
188 static void alc_process_coef_fw(struct hda_codec *codec,
189 				const struct coef_fw *fw)
190 {
191 	for (; fw->nid; fw++) {
192 		if (fw->mask == (unsigned short)-1)
193 			alc_write_coefex_idx(codec, fw->nid, fw->idx, fw->val);
194 		else
195 			alc_update_coefex_idx(codec, fw->nid, fw->idx,
196 					      fw->mask, fw->val);
197 	}
198 }
199 
200 /*
201  * Append the given mixer and verb elements for the later use
202  * The mixer array is referred in build_controls(), and init_verbs are
203  * called in init().
204  */
205 static void add_mixer(struct alc_spec *spec, const struct snd_kcontrol_new *mix)
206 {
207 	if (snd_BUG_ON(spec->num_mixers >= ARRAY_SIZE(spec->mixers)))
208 		return;
209 	spec->mixers[spec->num_mixers++] = mix;
210 }
211 
212 /*
213  * GPIO setup tables, used in initialization
214  */
215 /* Enable GPIO mask and set output */
216 static const struct hda_verb alc_gpio1_init_verbs[] = {
217 	{0x01, AC_VERB_SET_GPIO_MASK, 0x01},
218 	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
219 	{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
220 	{ }
221 };
222 
223 static const struct hda_verb alc_gpio2_init_verbs[] = {
224 	{0x01, AC_VERB_SET_GPIO_MASK, 0x02},
225 	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
226 	{0x01, AC_VERB_SET_GPIO_DATA, 0x02},
227 	{ }
228 };
229 
230 static const struct hda_verb alc_gpio3_init_verbs[] = {
231 	{0x01, AC_VERB_SET_GPIO_MASK, 0x03},
232 	{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},
233 	{0x01, AC_VERB_SET_GPIO_DATA, 0x03},
234 	{ }
235 };
236 
237 /*
238  * Fix hardware PLL issue
239  * On some codecs, the analog PLL gating control must be off while
240  * the default value is 1.
241  */
242 static void alc_fix_pll(struct hda_codec *codec)
243 {
244 	struct alc_spec *spec = codec->spec;
245 
246 	if (spec->pll_nid)
247 		alc_update_coefex_idx(codec, spec->pll_nid, spec->pll_coef_idx,
248 				      1 << spec->pll_coef_bit, 0);
249 }
250 
251 static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
252 			     unsigned int coef_idx, unsigned int coef_bit)
253 {
254 	struct alc_spec *spec = codec->spec;
255 	spec->pll_nid = nid;
256 	spec->pll_coef_idx = coef_idx;
257 	spec->pll_coef_bit = coef_bit;
258 	alc_fix_pll(codec);
259 }
260 
261 /* update the master volume per volume-knob's unsol event */
262 static void alc_update_knob_master(struct hda_codec *codec,
263 				   struct hda_jack_callback *jack)
264 {
265 	unsigned int val;
266 	struct snd_kcontrol *kctl;
267 	struct snd_ctl_elem_value *uctl;
268 
269 	kctl = snd_hda_find_mixer_ctl(codec, "Master Playback Volume");
270 	if (!kctl)
271 		return;
272 	uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
273 	if (!uctl)
274 		return;
275 	val = snd_hda_codec_read(codec, jack->tbl->nid, 0,
276 				 AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
277 	val &= HDA_AMP_VOLMASK;
278 	uctl->value.integer.value[0] = val;
279 	uctl->value.integer.value[1] = val;
280 	kctl->put(kctl, uctl);
281 	kfree(uctl);
282 }
283 
284 static void alc880_unsol_event(struct hda_codec *codec, unsigned int res)
285 {
286 	/* For some reason, the res given from ALC880 is broken.
287 	   Here we adjust it properly. */
288 	snd_hda_jack_unsol_event(codec, res >> 2);
289 }
290 
291 /* additional initialization for ALC888 variants */
292 static void alc888_coef_init(struct hda_codec *codec)
293 {
294 	if (alc_get_coef0(codec) == 0x20)
295 		/* alc888S-VC */
296 		alc_write_coef_idx(codec, 7, 0x830);
297 	 else
298 		 /* alc888-VB */
299 		alc_write_coef_idx(codec, 7, 0x3030);
300 }
301 
302 /* additional initialization for ALC889 variants */
303 static void alc889_coef_init(struct hda_codec *codec)
304 {
305 	alc_update_coef_idx(codec, 7, 0, 0x2010);
306 }
307 
308 /* turn on/off EAPD control (only if available) */
309 static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
310 {
311 	if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
312 		return;
313 	if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
314 		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
315 				    on ? 2 : 0);
316 }
317 
318 /* turn on/off EAPD controls of the codec */
319 static void alc_auto_setup_eapd(struct hda_codec *codec, bool on)
320 {
321 	/* We currently only handle front, HP */
322 	static hda_nid_t pins[] = {
323 		0x0f, 0x10, 0x14, 0x15, 0
324 	};
325 	hda_nid_t *p;
326 	for (p = pins; *p; p++)
327 		set_eapd(codec, *p, on);
328 }
329 
330 /* generic shutup callback;
331  * just turning off EPAD and a little pause for avoiding pop-noise
332  */
333 static void alc_eapd_shutup(struct hda_codec *codec)
334 {
335 	struct alc_spec *spec = codec->spec;
336 
337 	alc_auto_setup_eapd(codec, false);
338 	if (!spec->no_depop_delay)
339 		msleep(200);
340 	snd_hda_shutup_pins(codec);
341 }
342 
343 /* generic EAPD initialization */
344 static void alc_auto_init_amp(struct hda_codec *codec, int type)
345 {
346 	alc_auto_setup_eapd(codec, true);
347 	switch (type) {
348 	case ALC_INIT_GPIO1:
349 		snd_hda_sequence_write(codec, alc_gpio1_init_verbs);
350 		break;
351 	case ALC_INIT_GPIO2:
352 		snd_hda_sequence_write(codec, alc_gpio2_init_verbs);
353 		break;
354 	case ALC_INIT_GPIO3:
355 		snd_hda_sequence_write(codec, alc_gpio3_init_verbs);
356 		break;
357 	case ALC_INIT_DEFAULT:
358 		switch (codec->vendor_id) {
359 		case 0x10ec0260:
360 			alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x2010);
361 			break;
362 		case 0x10ec0262:
363 		case 0x10ec0880:
364 		case 0x10ec0882:
365 		case 0x10ec0883:
366 		case 0x10ec0885:
367 		case 0x10ec0887:
368 		/*case 0x10ec0889:*/ /* this causes an SPDIF problem */
369 		case 0x10ec0900:
370 			alc889_coef_init(codec);
371 			break;
372 		case 0x10ec0888:
373 			alc888_coef_init(codec);
374 			break;
375 #if 0 /* XXX: This may cause the silent output on speaker on some machines */
376 		case 0x10ec0267:
377 		case 0x10ec0268:
378 			alc_update_coef_idx(codec, 7, 0, 0x3000);
379 			break;
380 #endif /* XXX */
381 		}
382 		break;
383 	}
384 }
385 
386 
387 /*
388  * Realtek SSID verification
389  */
390 
391 /* Could be any non-zero and even value. When used as fixup, tells
392  * the driver to ignore any present sku defines.
393  */
394 #define ALC_FIXUP_SKU_IGNORE (2)
395 
396 static void alc_fixup_sku_ignore(struct hda_codec *codec,
397 				 const struct hda_fixup *fix, int action)
398 {
399 	struct alc_spec *spec = codec->spec;
400 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
401 		spec->cdefine.fixup = 1;
402 		spec->cdefine.sku_cfg = ALC_FIXUP_SKU_IGNORE;
403 	}
404 }
405 
406 static void alc_fixup_no_depop_delay(struct hda_codec *codec,
407 				    const struct hda_fixup *fix, int action)
408 {
409 	struct alc_spec *spec = codec->spec;
410 
411 	if (action == HDA_FIXUP_ACT_PROBE) {
412 		spec->no_depop_delay = 1;
413 		codec->depop_delay = 0;
414 	}
415 }
416 
417 static int alc_auto_parse_customize_define(struct hda_codec *codec)
418 {
419 	unsigned int ass, tmp, i;
420 	unsigned nid = 0;
421 	struct alc_spec *spec = codec->spec;
422 
423 	spec->cdefine.enable_pcbeep = 1; /* assume always enabled */
424 
425 	if (spec->cdefine.fixup) {
426 		ass = spec->cdefine.sku_cfg;
427 		if (ass == ALC_FIXUP_SKU_IGNORE)
428 			return -1;
429 		goto do_sku;
430 	}
431 
432 	if (!codec->bus->pci)
433 		return -1;
434 	ass = codec->subsystem_id & 0xffff;
435 	if (ass != codec->bus->pci->subsystem_device && (ass & 1))
436 		goto do_sku;
437 
438 	nid = 0x1d;
439 	if (codec->vendor_id == 0x10ec0260)
440 		nid = 0x17;
441 	ass = snd_hda_codec_get_pincfg(codec, nid);
442 
443 	if (!(ass & 1)) {
444 		codec_info(codec, "%s: SKU not ready 0x%08x\n",
445 			   codec->chip_name, ass);
446 		return -1;
447 	}
448 
449 	/* check sum */
450 	tmp = 0;
451 	for (i = 1; i < 16; i++) {
452 		if ((ass >> i) & 1)
453 			tmp++;
454 	}
455 	if (((ass >> 16) & 0xf) != tmp)
456 		return -1;
457 
458 	spec->cdefine.port_connectivity = ass >> 30;
459 	spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
460 	spec->cdefine.check_sum = (ass >> 16) & 0xf;
461 	spec->cdefine.customization = ass >> 8;
462 do_sku:
463 	spec->cdefine.sku_cfg = ass;
464 	spec->cdefine.external_amp = (ass & 0x38) >> 3;
465 	spec->cdefine.platform_type = (ass & 0x4) >> 2;
466 	spec->cdefine.swap = (ass & 0x2) >> 1;
467 	spec->cdefine.override = ass & 0x1;
468 
469 	codec_dbg(codec, "SKU: Nid=0x%x sku_cfg=0x%08x\n",
470 		   nid, spec->cdefine.sku_cfg);
471 	codec_dbg(codec, "SKU: port_connectivity=0x%x\n",
472 		   spec->cdefine.port_connectivity);
473 	codec_dbg(codec, "SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
474 	codec_dbg(codec, "SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
475 	codec_dbg(codec, "SKU: customization=0x%08x\n", spec->cdefine.customization);
476 	codec_dbg(codec, "SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
477 	codec_dbg(codec, "SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
478 	codec_dbg(codec, "SKU: swap=0x%x\n", spec->cdefine.swap);
479 	codec_dbg(codec, "SKU: override=0x%x\n", spec->cdefine.override);
480 
481 	return 0;
482 }
483 
484 /* return the position of NID in the list, or -1 if not found */
485 static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
486 {
487 	int i;
488 	for (i = 0; i < nums; i++)
489 		if (list[i] == nid)
490 			return i;
491 	return -1;
492 }
493 /* return true if the given NID is found in the list */
494 static bool found_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
495 {
496 	return find_idx_in_nid_list(nid, list, nums) >= 0;
497 }
498 
499 /* check subsystem ID and set up device-specific initialization;
500  * return 1 if initialized, 0 if invalid SSID
501  */
502 /* 32-bit subsystem ID for BIOS loading in HD Audio codec.
503  *	31 ~ 16 :	Manufacture ID
504  *	15 ~ 8	:	SKU ID
505  *	7  ~ 0	:	Assembly ID
506  *	port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
507  */
508 static int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports)
509 {
510 	unsigned int ass, tmp, i;
511 	unsigned nid;
512 	struct alc_spec *spec = codec->spec;
513 
514 	if (spec->cdefine.fixup) {
515 		ass = spec->cdefine.sku_cfg;
516 		if (ass == ALC_FIXUP_SKU_IGNORE)
517 			return 0;
518 		goto do_sku;
519 	}
520 
521 	ass = codec->subsystem_id & 0xffff;
522 	if (codec->bus->pci &&
523 	    ass != codec->bus->pci->subsystem_device && (ass & 1))
524 		goto do_sku;
525 
526 	/* invalid SSID, check the special NID pin defcfg instead */
527 	/*
528 	 * 31~30	: port connectivity
529 	 * 29~21	: reserve
530 	 * 20		: PCBEEP input
531 	 * 19~16	: Check sum (15:1)
532 	 * 15~1		: Custom
533 	 * 0		: override
534 	*/
535 	nid = 0x1d;
536 	if (codec->vendor_id == 0x10ec0260)
537 		nid = 0x17;
538 	ass = snd_hda_codec_get_pincfg(codec, nid);
539 	codec_dbg(codec,
540 		  "realtek: No valid SSID, checking pincfg 0x%08x for NID 0x%x\n",
541 		   ass, nid);
542 	if (!(ass & 1))
543 		return 0;
544 	if ((ass >> 30) != 1)	/* no physical connection */
545 		return 0;
546 
547 	/* check sum */
548 	tmp = 0;
549 	for (i = 1; i < 16; i++) {
550 		if ((ass >> i) & 1)
551 			tmp++;
552 	}
553 	if (((ass >> 16) & 0xf) != tmp)
554 		return 0;
555 do_sku:
556 	codec_dbg(codec, "realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
557 		   ass & 0xffff, codec->vendor_id);
558 	/*
559 	 * 0 : override
560 	 * 1 :	Swap Jack
561 	 * 2 : 0 --> Desktop, 1 --> Laptop
562 	 * 3~5 : External Amplifier control
563 	 * 7~6 : Reserved
564 	*/
565 	tmp = (ass & 0x38) >> 3;	/* external Amp control */
566 	switch (tmp) {
567 	case 1:
568 		spec->init_amp = ALC_INIT_GPIO1;
569 		break;
570 	case 3:
571 		spec->init_amp = ALC_INIT_GPIO2;
572 		break;
573 	case 7:
574 		spec->init_amp = ALC_INIT_GPIO3;
575 		break;
576 	case 5:
577 	default:
578 		spec->init_amp = ALC_INIT_DEFAULT;
579 		break;
580 	}
581 
582 	/* is laptop or Desktop and enable the function "Mute internal speaker
583 	 * when the external headphone out jack is plugged"
584 	 */
585 	if (!(ass & 0x8000))
586 		return 1;
587 	/*
588 	 * 10~8 : Jack location
589 	 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
590 	 * 14~13: Resvered
591 	 * 15   : 1 --> enable the function "Mute internal speaker
592 	 *	        when the external headphone out jack is plugged"
593 	 */
594 	if (!spec->gen.autocfg.hp_pins[0] &&
595 	    !(spec->gen.autocfg.line_out_pins[0] &&
596 	      spec->gen.autocfg.line_out_type == AUTO_PIN_HP_OUT)) {
597 		hda_nid_t nid;
598 		tmp = (ass >> 11) & 0x3;	/* HP to chassis */
599 		nid = ports[tmp];
600 		if (found_in_nid_list(nid, spec->gen.autocfg.line_out_pins,
601 				      spec->gen.autocfg.line_outs))
602 			return 1;
603 		spec->gen.autocfg.hp_pins[0] = nid;
604 	}
605 	return 1;
606 }
607 
608 /* Check the validity of ALC subsystem-id
609  * ports contains an array of 4 pin NIDs for port-A, E, D and I */
610 static void alc_ssid_check(struct hda_codec *codec, const hda_nid_t *ports)
611 {
612 	if (!alc_subsystem_id(codec, ports)) {
613 		struct alc_spec *spec = codec->spec;
614 		codec_dbg(codec,
615 			  "realtek: Enable default setup for auto mode as fallback\n");
616 		spec->init_amp = ALC_INIT_DEFAULT;
617 	}
618 }
619 
620 /*
621  */
622 
623 static void alc_fixup_inv_dmic(struct hda_codec *codec,
624 			       const struct hda_fixup *fix, int action)
625 {
626 	struct alc_spec *spec = codec->spec;
627 
628 	spec->gen.inv_dmic_split = 1;
629 }
630 
631 
632 #ifdef CONFIG_SND_HDA_INPUT_BEEP
633 /* additional beep mixers; the actual parameters are overwritten at build */
634 static const struct snd_kcontrol_new alc_beep_mixer[] = {
635 	HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
636 	HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
637 	{ } /* end */
638 };
639 #endif
640 
641 static int alc_build_controls(struct hda_codec *codec)
642 {
643 	struct alc_spec *spec = codec->spec;
644 	int i, err;
645 
646 	err = snd_hda_gen_build_controls(codec);
647 	if (err < 0)
648 		return err;
649 
650 	for (i = 0; i < spec->num_mixers; i++) {
651 		err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
652 		if (err < 0)
653 			return err;
654 	}
655 
656 #ifdef CONFIG_SND_HDA_INPUT_BEEP
657 	/* create beep controls if needed */
658 	if (spec->beep_amp) {
659 		const struct snd_kcontrol_new *knew;
660 		for (knew = alc_beep_mixer; knew->name; knew++) {
661 			struct snd_kcontrol *kctl;
662 			kctl = snd_ctl_new1(knew, codec);
663 			if (!kctl)
664 				return -ENOMEM;
665 			kctl->private_value = spec->beep_amp;
666 			err = snd_hda_ctl_add(codec, 0, kctl);
667 			if (err < 0)
668 				return err;
669 		}
670 	}
671 #endif
672 
673 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_BUILD);
674 	return 0;
675 }
676 
677 
678 /*
679  * Common callbacks
680  */
681 
682 static int alc_init(struct hda_codec *codec)
683 {
684 	struct alc_spec *spec = codec->spec;
685 
686 	if (spec->init_hook)
687 		spec->init_hook(codec);
688 
689 	alc_fix_pll(codec);
690 	alc_auto_init_amp(codec, spec->init_amp);
691 
692 	snd_hda_gen_init(codec);
693 
694 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT);
695 
696 	return 0;
697 }
698 
699 static inline void alc_shutup(struct hda_codec *codec)
700 {
701 	struct alc_spec *spec = codec->spec;
702 
703 	if (spec && spec->shutup)
704 		spec->shutup(codec);
705 	else
706 		snd_hda_shutup_pins(codec);
707 }
708 
709 #define alc_free	snd_hda_gen_free
710 
711 #ifdef CONFIG_PM
712 static void alc_power_eapd(struct hda_codec *codec)
713 {
714 	alc_auto_setup_eapd(codec, false);
715 }
716 
717 static int alc_suspend(struct hda_codec *codec)
718 {
719 	struct alc_spec *spec = codec->spec;
720 	alc_shutup(codec);
721 	if (spec && spec->power_hook)
722 		spec->power_hook(codec);
723 	return 0;
724 }
725 #endif
726 
727 #ifdef CONFIG_PM
728 static int alc_resume(struct hda_codec *codec)
729 {
730 	struct alc_spec *spec = codec->spec;
731 
732 	if (!spec->no_depop_delay)
733 		msleep(150); /* to avoid pop noise */
734 	codec->patch_ops.init(codec);
735 	snd_hda_codec_resume_amp(codec);
736 	snd_hda_codec_resume_cache(codec);
737 	hda_call_check_power_status(codec, 0x01);
738 	return 0;
739 }
740 #endif
741 
742 /*
743  */
744 static const struct hda_codec_ops alc_patch_ops = {
745 	.build_controls = alc_build_controls,
746 	.build_pcms = snd_hda_gen_build_pcms,
747 	.init = alc_init,
748 	.free = alc_free,
749 	.unsol_event = snd_hda_jack_unsol_event,
750 #ifdef CONFIG_PM
751 	.resume = alc_resume,
752 	.suspend = alc_suspend,
753 	.check_power_status = snd_hda_gen_check_power_status,
754 #endif
755 	.reboot_notify = alc_shutup,
756 };
757 
758 
759 /* replace the codec chip_name with the given string */
760 static int alc_codec_rename(struct hda_codec *codec, const char *name)
761 {
762 	kfree(codec->chip_name);
763 	codec->chip_name = kstrdup(name, GFP_KERNEL);
764 	if (!codec->chip_name) {
765 		alc_free(codec);
766 		return -ENOMEM;
767 	}
768 	return 0;
769 }
770 
771 /*
772  * Rename codecs appropriately from COEF value or subvendor id
773  */
774 struct alc_codec_rename_table {
775 	unsigned int vendor_id;
776 	unsigned short coef_mask;
777 	unsigned short coef_bits;
778 	const char *name;
779 };
780 
781 struct alc_codec_rename_pci_table {
782 	unsigned int codec_vendor_id;
783 	unsigned short pci_subvendor;
784 	unsigned short pci_subdevice;
785 	const char *name;
786 };
787 
788 static struct alc_codec_rename_table rename_tbl[] = {
789 	{ 0x10ec0221, 0xf00f, 0x1003, "ALC231" },
790 	{ 0x10ec0269, 0xfff0, 0x3010, "ALC277" },
791 	{ 0x10ec0269, 0xf0f0, 0x2010, "ALC259" },
792 	{ 0x10ec0269, 0xf0f0, 0x3010, "ALC258" },
793 	{ 0x10ec0269, 0x00f0, 0x0010, "ALC269VB" },
794 	{ 0x10ec0269, 0xffff, 0xa023, "ALC259" },
795 	{ 0x10ec0269, 0xffff, 0x6023, "ALC281X" },
796 	{ 0x10ec0269, 0x00f0, 0x0020, "ALC269VC" },
797 	{ 0x10ec0269, 0x00f0, 0x0030, "ALC269VD" },
798 	{ 0x10ec0662, 0xffff, 0x4020, "ALC656" },
799 	{ 0x10ec0887, 0x00f0, 0x0030, "ALC887-VD" },
800 	{ 0x10ec0888, 0x00f0, 0x0030, "ALC888-VD" },
801 	{ 0x10ec0888, 0xf0f0, 0x3020, "ALC886" },
802 	{ 0x10ec0899, 0x2000, 0x2000, "ALC899" },
803 	{ 0x10ec0892, 0xffff, 0x8020, "ALC661" },
804 	{ 0x10ec0892, 0xffff, 0x8011, "ALC661" },
805 	{ 0x10ec0892, 0xffff, 0x4011, "ALC656" },
806 	{ } /* terminator */
807 };
808 
809 static struct alc_codec_rename_pci_table rename_pci_tbl[] = {
810 	{ 0x10ec0280, 0x1028, 0, "ALC3220" },
811 	{ 0x10ec0282, 0x1028, 0, "ALC3221" },
812 	{ 0x10ec0283, 0x1028, 0, "ALC3223" },
813 	{ 0x10ec0288, 0x1028, 0, "ALC3263" },
814 	{ 0x10ec0292, 0x1028, 0, "ALC3226" },
815 	{ 0x10ec0293, 0x1028, 0, "ALC3235" },
816 	{ 0x10ec0255, 0x1028, 0, "ALC3234" },
817 	{ 0x10ec0668, 0x1028, 0, "ALC3661" },
818 	{ 0x10ec0275, 0x1028, 0, "ALC3260" },
819 	{ 0x10ec0899, 0x1028, 0, "ALC3861" },
820 	{ 0x10ec0670, 0x1025, 0, "ALC669X" },
821 	{ 0x10ec0676, 0x1025, 0, "ALC679X" },
822 	{ 0x10ec0282, 0x1043, 0, "ALC3229" },
823 	{ 0x10ec0233, 0x1043, 0, "ALC3236" },
824 	{ 0x10ec0280, 0x103c, 0, "ALC3228" },
825 	{ 0x10ec0282, 0x103c, 0, "ALC3227" },
826 	{ 0x10ec0286, 0x103c, 0, "ALC3242" },
827 	{ 0x10ec0290, 0x103c, 0, "ALC3241" },
828 	{ 0x10ec0668, 0x103c, 0, "ALC3662" },
829 	{ 0x10ec0283, 0x17aa, 0, "ALC3239" },
830 	{ 0x10ec0292, 0x17aa, 0, "ALC3232" },
831 	{ } /* terminator */
832 };
833 
834 static int alc_codec_rename_from_preset(struct hda_codec *codec)
835 {
836 	const struct alc_codec_rename_table *p;
837 	const struct alc_codec_rename_pci_table *q;
838 
839 	for (p = rename_tbl; p->vendor_id; p++) {
840 		if (p->vendor_id != codec->vendor_id)
841 			continue;
842 		if ((alc_get_coef0(codec) & p->coef_mask) == p->coef_bits)
843 			return alc_codec_rename(codec, p->name);
844 	}
845 
846 	if (!codec->bus->pci)
847 		return 0;
848 	for (q = rename_pci_tbl; q->codec_vendor_id; q++) {
849 		if (q->codec_vendor_id != codec->vendor_id)
850 			continue;
851 		if (q->pci_subvendor != codec->bus->pci->subsystem_vendor)
852 			continue;
853 		if (!q->pci_subdevice ||
854 		    q->pci_subdevice == codec->bus->pci->subsystem_device)
855 			return alc_codec_rename(codec, q->name);
856 	}
857 
858 	return 0;
859 }
860 
861 
862 /*
863  * Digital-beep handlers
864  */
865 #ifdef CONFIG_SND_HDA_INPUT_BEEP
866 #define set_beep_amp(spec, nid, idx, dir) \
867 	((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir))
868 
869 static const struct snd_pci_quirk beep_white_list[] = {
870 	SND_PCI_QUIRK(0x1043, 0x103c, "ASUS", 1),
871 	SND_PCI_QUIRK(0x1043, 0x115d, "ASUS", 1),
872 	SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),
873 	SND_PCI_QUIRK(0x1043, 0x8376, "EeePC", 1),
874 	SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1),
875 	SND_PCI_QUIRK(0x1043, 0x831a, "EeePC", 1),
876 	SND_PCI_QUIRK(0x1043, 0x834a, "EeePC", 1),
877 	SND_PCI_QUIRK(0x1458, 0xa002, "GA-MA790X", 1),
878 	SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),
879 	{}
880 };
881 
882 static inline int has_cdefine_beep(struct hda_codec *codec)
883 {
884 	struct alc_spec *spec = codec->spec;
885 	const struct snd_pci_quirk *q;
886 	q = snd_pci_quirk_lookup(codec->bus->pci, beep_white_list);
887 	if (q)
888 		return q->value;
889 	return spec->cdefine.enable_pcbeep;
890 }
891 #else
892 #define set_beep_amp(spec, nid, idx, dir) /* NOP */
893 #define has_cdefine_beep(codec)		0
894 #endif
895 
896 /* parse the BIOS configuration and set up the alc_spec */
897 /* return 1 if successful, 0 if the proper config is not found,
898  * or a negative error code
899  */
900 static int alc_parse_auto_config(struct hda_codec *codec,
901 				 const hda_nid_t *ignore_nids,
902 				 const hda_nid_t *ssid_nids)
903 {
904 	struct alc_spec *spec = codec->spec;
905 	struct auto_pin_cfg *cfg = &spec->gen.autocfg;
906 	int err;
907 
908 	err = snd_hda_parse_pin_defcfg(codec, cfg, ignore_nids,
909 				       spec->parse_flags);
910 	if (err < 0)
911 		return err;
912 
913 	if (ssid_nids)
914 		alc_ssid_check(codec, ssid_nids);
915 
916 	err = snd_hda_gen_parse_auto_config(codec, cfg);
917 	if (err < 0)
918 		return err;
919 
920 	return 1;
921 }
922 
923 /* common preparation job for alc_spec */
924 static int alc_alloc_spec(struct hda_codec *codec, hda_nid_t mixer_nid)
925 {
926 	struct alc_spec *spec = kzalloc(sizeof(*spec), GFP_KERNEL);
927 	int err;
928 
929 	if (!spec)
930 		return -ENOMEM;
931 	codec->spec = spec;
932 	snd_hda_gen_spec_init(&spec->gen);
933 	spec->gen.mixer_nid = mixer_nid;
934 	spec->gen.own_eapd_ctl = 1;
935 	codec->single_adc_amp = 1;
936 	/* FIXME: do we need this for all Realtek codec models? */
937 	codec->spdif_status_reset = 1;
938 
939 	err = alc_codec_rename_from_preset(codec);
940 	if (err < 0) {
941 		kfree(spec);
942 		return err;
943 	}
944 	return 0;
945 }
946 
947 static int alc880_parse_auto_config(struct hda_codec *codec)
948 {
949 	static const hda_nid_t alc880_ignore[] = { 0x1d, 0 };
950 	static const hda_nid_t alc880_ssids[] = { 0x15, 0x1b, 0x14, 0 };
951 	return alc_parse_auto_config(codec, alc880_ignore, alc880_ssids);
952 }
953 
954 /*
955  * ALC880 fix-ups
956  */
957 enum {
958 	ALC880_FIXUP_GPIO1,
959 	ALC880_FIXUP_GPIO2,
960 	ALC880_FIXUP_MEDION_RIM,
961 	ALC880_FIXUP_LG,
962 	ALC880_FIXUP_LG_LW25,
963 	ALC880_FIXUP_W810,
964 	ALC880_FIXUP_EAPD_COEF,
965 	ALC880_FIXUP_TCL_S700,
966 	ALC880_FIXUP_VOL_KNOB,
967 	ALC880_FIXUP_FUJITSU,
968 	ALC880_FIXUP_F1734,
969 	ALC880_FIXUP_UNIWILL,
970 	ALC880_FIXUP_UNIWILL_DIG,
971 	ALC880_FIXUP_Z71V,
972 	ALC880_FIXUP_ASUS_W5A,
973 	ALC880_FIXUP_3ST_BASE,
974 	ALC880_FIXUP_3ST,
975 	ALC880_FIXUP_3ST_DIG,
976 	ALC880_FIXUP_5ST_BASE,
977 	ALC880_FIXUP_5ST,
978 	ALC880_FIXUP_5ST_DIG,
979 	ALC880_FIXUP_6ST_BASE,
980 	ALC880_FIXUP_6ST,
981 	ALC880_FIXUP_6ST_DIG,
982 	ALC880_FIXUP_6ST_AUTOMUTE,
983 };
984 
985 /* enable the volume-knob widget support on NID 0x21 */
986 static void alc880_fixup_vol_knob(struct hda_codec *codec,
987 				  const struct hda_fixup *fix, int action)
988 {
989 	if (action == HDA_FIXUP_ACT_PROBE)
990 		snd_hda_jack_detect_enable_callback(codec, 0x21,
991 						    alc_update_knob_master);
992 }
993 
994 static const struct hda_fixup alc880_fixups[] = {
995 	[ALC880_FIXUP_GPIO1] = {
996 		.type = HDA_FIXUP_VERBS,
997 		.v.verbs = alc_gpio1_init_verbs,
998 	},
999 	[ALC880_FIXUP_GPIO2] = {
1000 		.type = HDA_FIXUP_VERBS,
1001 		.v.verbs = alc_gpio2_init_verbs,
1002 	},
1003 	[ALC880_FIXUP_MEDION_RIM] = {
1004 		.type = HDA_FIXUP_VERBS,
1005 		.v.verbs = (const struct hda_verb[]) {
1006 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1007 			{ 0x20, AC_VERB_SET_PROC_COEF,  0x3060 },
1008 			{ }
1009 		},
1010 		.chained = true,
1011 		.chain_id = ALC880_FIXUP_GPIO2,
1012 	},
1013 	[ALC880_FIXUP_LG] = {
1014 		.type = HDA_FIXUP_PINS,
1015 		.v.pins = (const struct hda_pintbl[]) {
1016 			/* disable bogus unused pins */
1017 			{ 0x16, 0x411111f0 },
1018 			{ 0x18, 0x411111f0 },
1019 			{ 0x1a, 0x411111f0 },
1020 			{ }
1021 		}
1022 	},
1023 	[ALC880_FIXUP_LG_LW25] = {
1024 		.type = HDA_FIXUP_PINS,
1025 		.v.pins = (const struct hda_pintbl[]) {
1026 			{ 0x1a, 0x0181344f }, /* line-in */
1027 			{ 0x1b, 0x0321403f }, /* headphone */
1028 			{ }
1029 		}
1030 	},
1031 	[ALC880_FIXUP_W810] = {
1032 		.type = HDA_FIXUP_PINS,
1033 		.v.pins = (const struct hda_pintbl[]) {
1034 			/* disable bogus unused pins */
1035 			{ 0x17, 0x411111f0 },
1036 			{ }
1037 		},
1038 		.chained = true,
1039 		.chain_id = ALC880_FIXUP_GPIO2,
1040 	},
1041 	[ALC880_FIXUP_EAPD_COEF] = {
1042 		.type = HDA_FIXUP_VERBS,
1043 		.v.verbs = (const struct hda_verb[]) {
1044 			/* change to EAPD mode */
1045 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1046 			{ 0x20, AC_VERB_SET_PROC_COEF,  0x3060 },
1047 			{}
1048 		},
1049 	},
1050 	[ALC880_FIXUP_TCL_S700] = {
1051 		.type = HDA_FIXUP_VERBS,
1052 		.v.verbs = (const struct hda_verb[]) {
1053 			/* change to EAPD mode */
1054 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1055 			{ 0x20, AC_VERB_SET_PROC_COEF,  0x3070 },
1056 			{}
1057 		},
1058 		.chained = true,
1059 		.chain_id = ALC880_FIXUP_GPIO2,
1060 	},
1061 	[ALC880_FIXUP_VOL_KNOB] = {
1062 		.type = HDA_FIXUP_FUNC,
1063 		.v.func = alc880_fixup_vol_knob,
1064 	},
1065 	[ALC880_FIXUP_FUJITSU] = {
1066 		/* override all pins as BIOS on old Amilo is broken */
1067 		.type = HDA_FIXUP_PINS,
1068 		.v.pins = (const struct hda_pintbl[]) {
1069 			{ 0x14, 0x0121411f }, /* HP */
1070 			{ 0x15, 0x99030120 }, /* speaker */
1071 			{ 0x16, 0x99030130 }, /* bass speaker */
1072 			{ 0x17, 0x411111f0 }, /* N/A */
1073 			{ 0x18, 0x411111f0 }, /* N/A */
1074 			{ 0x19, 0x01a19950 }, /* mic-in */
1075 			{ 0x1a, 0x411111f0 }, /* N/A */
1076 			{ 0x1b, 0x411111f0 }, /* N/A */
1077 			{ 0x1c, 0x411111f0 }, /* N/A */
1078 			{ 0x1d, 0x411111f0 }, /* N/A */
1079 			{ 0x1e, 0x01454140 }, /* SPDIF out */
1080 			{ }
1081 		},
1082 		.chained = true,
1083 		.chain_id = ALC880_FIXUP_VOL_KNOB,
1084 	},
1085 	[ALC880_FIXUP_F1734] = {
1086 		/* almost compatible with FUJITSU, but no bass and SPDIF */
1087 		.type = HDA_FIXUP_PINS,
1088 		.v.pins = (const struct hda_pintbl[]) {
1089 			{ 0x14, 0x0121411f }, /* HP */
1090 			{ 0x15, 0x99030120 }, /* speaker */
1091 			{ 0x16, 0x411111f0 }, /* N/A */
1092 			{ 0x17, 0x411111f0 }, /* N/A */
1093 			{ 0x18, 0x411111f0 }, /* N/A */
1094 			{ 0x19, 0x01a19950 }, /* mic-in */
1095 			{ 0x1a, 0x411111f0 }, /* N/A */
1096 			{ 0x1b, 0x411111f0 }, /* N/A */
1097 			{ 0x1c, 0x411111f0 }, /* N/A */
1098 			{ 0x1d, 0x411111f0 }, /* N/A */
1099 			{ 0x1e, 0x411111f0 }, /* N/A */
1100 			{ }
1101 		},
1102 		.chained = true,
1103 		.chain_id = ALC880_FIXUP_VOL_KNOB,
1104 	},
1105 	[ALC880_FIXUP_UNIWILL] = {
1106 		/* need to fix HP and speaker pins to be parsed correctly */
1107 		.type = HDA_FIXUP_PINS,
1108 		.v.pins = (const struct hda_pintbl[]) {
1109 			{ 0x14, 0x0121411f }, /* HP */
1110 			{ 0x15, 0x99030120 }, /* speaker */
1111 			{ 0x16, 0x99030130 }, /* bass speaker */
1112 			{ }
1113 		},
1114 	},
1115 	[ALC880_FIXUP_UNIWILL_DIG] = {
1116 		.type = HDA_FIXUP_PINS,
1117 		.v.pins = (const struct hda_pintbl[]) {
1118 			/* disable bogus unused pins */
1119 			{ 0x17, 0x411111f0 },
1120 			{ 0x19, 0x411111f0 },
1121 			{ 0x1b, 0x411111f0 },
1122 			{ 0x1f, 0x411111f0 },
1123 			{ }
1124 		}
1125 	},
1126 	[ALC880_FIXUP_Z71V] = {
1127 		.type = HDA_FIXUP_PINS,
1128 		.v.pins = (const struct hda_pintbl[]) {
1129 			/* set up the whole pins as BIOS is utterly broken */
1130 			{ 0x14, 0x99030120 }, /* speaker */
1131 			{ 0x15, 0x0121411f }, /* HP */
1132 			{ 0x16, 0x411111f0 }, /* N/A */
1133 			{ 0x17, 0x411111f0 }, /* N/A */
1134 			{ 0x18, 0x01a19950 }, /* mic-in */
1135 			{ 0x19, 0x411111f0 }, /* N/A */
1136 			{ 0x1a, 0x01813031 }, /* line-in */
1137 			{ 0x1b, 0x411111f0 }, /* N/A */
1138 			{ 0x1c, 0x411111f0 }, /* N/A */
1139 			{ 0x1d, 0x411111f0 }, /* N/A */
1140 			{ 0x1e, 0x0144111e }, /* SPDIF */
1141 			{ }
1142 		}
1143 	},
1144 	[ALC880_FIXUP_ASUS_W5A] = {
1145 		.type = HDA_FIXUP_PINS,
1146 		.v.pins = (const struct hda_pintbl[]) {
1147 			/* set up the whole pins as BIOS is utterly broken */
1148 			{ 0x14, 0x0121411f }, /* HP */
1149 			{ 0x15, 0x411111f0 }, /* N/A */
1150 			{ 0x16, 0x411111f0 }, /* N/A */
1151 			{ 0x17, 0x411111f0 }, /* N/A */
1152 			{ 0x18, 0x90a60160 }, /* mic */
1153 			{ 0x19, 0x411111f0 }, /* N/A */
1154 			{ 0x1a, 0x411111f0 }, /* N/A */
1155 			{ 0x1b, 0x411111f0 }, /* N/A */
1156 			{ 0x1c, 0x411111f0 }, /* N/A */
1157 			{ 0x1d, 0x411111f0 }, /* N/A */
1158 			{ 0x1e, 0xb743111e }, /* SPDIF out */
1159 			{ }
1160 		},
1161 		.chained = true,
1162 		.chain_id = ALC880_FIXUP_GPIO1,
1163 	},
1164 	[ALC880_FIXUP_3ST_BASE] = {
1165 		.type = HDA_FIXUP_PINS,
1166 		.v.pins = (const struct hda_pintbl[]) {
1167 			{ 0x14, 0x01014010 }, /* line-out */
1168 			{ 0x15, 0x411111f0 }, /* N/A */
1169 			{ 0x16, 0x411111f0 }, /* N/A */
1170 			{ 0x17, 0x411111f0 }, /* N/A */
1171 			{ 0x18, 0x01a19c30 }, /* mic-in */
1172 			{ 0x19, 0x0121411f }, /* HP */
1173 			{ 0x1a, 0x01813031 }, /* line-in */
1174 			{ 0x1b, 0x02a19c40 }, /* front-mic */
1175 			{ 0x1c, 0x411111f0 }, /* N/A */
1176 			{ 0x1d, 0x411111f0 }, /* N/A */
1177 			/* 0x1e is filled in below */
1178 			{ 0x1f, 0x411111f0 }, /* N/A */
1179 			{ }
1180 		}
1181 	},
1182 	[ALC880_FIXUP_3ST] = {
1183 		.type = HDA_FIXUP_PINS,
1184 		.v.pins = (const struct hda_pintbl[]) {
1185 			{ 0x1e, 0x411111f0 }, /* N/A */
1186 			{ }
1187 		},
1188 		.chained = true,
1189 		.chain_id = ALC880_FIXUP_3ST_BASE,
1190 	},
1191 	[ALC880_FIXUP_3ST_DIG] = {
1192 		.type = HDA_FIXUP_PINS,
1193 		.v.pins = (const struct hda_pintbl[]) {
1194 			{ 0x1e, 0x0144111e }, /* SPDIF */
1195 			{ }
1196 		},
1197 		.chained = true,
1198 		.chain_id = ALC880_FIXUP_3ST_BASE,
1199 	},
1200 	[ALC880_FIXUP_5ST_BASE] = {
1201 		.type = HDA_FIXUP_PINS,
1202 		.v.pins = (const struct hda_pintbl[]) {
1203 			{ 0x14, 0x01014010 }, /* front */
1204 			{ 0x15, 0x411111f0 }, /* N/A */
1205 			{ 0x16, 0x01011411 }, /* CLFE */
1206 			{ 0x17, 0x01016412 }, /* surr */
1207 			{ 0x18, 0x01a19c30 }, /* mic-in */
1208 			{ 0x19, 0x0121411f }, /* HP */
1209 			{ 0x1a, 0x01813031 }, /* line-in */
1210 			{ 0x1b, 0x02a19c40 }, /* front-mic */
1211 			{ 0x1c, 0x411111f0 }, /* N/A */
1212 			{ 0x1d, 0x411111f0 }, /* N/A */
1213 			/* 0x1e is filled in below */
1214 			{ 0x1f, 0x411111f0 }, /* N/A */
1215 			{ }
1216 		}
1217 	},
1218 	[ALC880_FIXUP_5ST] = {
1219 		.type = HDA_FIXUP_PINS,
1220 		.v.pins = (const struct hda_pintbl[]) {
1221 			{ 0x1e, 0x411111f0 }, /* N/A */
1222 			{ }
1223 		},
1224 		.chained = true,
1225 		.chain_id = ALC880_FIXUP_5ST_BASE,
1226 	},
1227 	[ALC880_FIXUP_5ST_DIG] = {
1228 		.type = HDA_FIXUP_PINS,
1229 		.v.pins = (const struct hda_pintbl[]) {
1230 			{ 0x1e, 0x0144111e }, /* SPDIF */
1231 			{ }
1232 		},
1233 		.chained = true,
1234 		.chain_id = ALC880_FIXUP_5ST_BASE,
1235 	},
1236 	[ALC880_FIXUP_6ST_BASE] = {
1237 		.type = HDA_FIXUP_PINS,
1238 		.v.pins = (const struct hda_pintbl[]) {
1239 			{ 0x14, 0x01014010 }, /* front */
1240 			{ 0x15, 0x01016412 }, /* surr */
1241 			{ 0x16, 0x01011411 }, /* CLFE */
1242 			{ 0x17, 0x01012414 }, /* side */
1243 			{ 0x18, 0x01a19c30 }, /* mic-in */
1244 			{ 0x19, 0x02a19c40 }, /* front-mic */
1245 			{ 0x1a, 0x01813031 }, /* line-in */
1246 			{ 0x1b, 0x0121411f }, /* HP */
1247 			{ 0x1c, 0x411111f0 }, /* N/A */
1248 			{ 0x1d, 0x411111f0 }, /* N/A */
1249 			/* 0x1e is filled in below */
1250 			{ 0x1f, 0x411111f0 }, /* N/A */
1251 			{ }
1252 		}
1253 	},
1254 	[ALC880_FIXUP_6ST] = {
1255 		.type = HDA_FIXUP_PINS,
1256 		.v.pins = (const struct hda_pintbl[]) {
1257 			{ 0x1e, 0x411111f0 }, /* N/A */
1258 			{ }
1259 		},
1260 		.chained = true,
1261 		.chain_id = ALC880_FIXUP_6ST_BASE,
1262 	},
1263 	[ALC880_FIXUP_6ST_DIG] = {
1264 		.type = HDA_FIXUP_PINS,
1265 		.v.pins = (const struct hda_pintbl[]) {
1266 			{ 0x1e, 0x0144111e }, /* SPDIF */
1267 			{ }
1268 		},
1269 		.chained = true,
1270 		.chain_id = ALC880_FIXUP_6ST_BASE,
1271 	},
1272 	[ALC880_FIXUP_6ST_AUTOMUTE] = {
1273 		.type = HDA_FIXUP_PINS,
1274 		.v.pins = (const struct hda_pintbl[]) {
1275 			{ 0x1b, 0x0121401f }, /* HP with jack detect */
1276 			{ }
1277 		},
1278 		.chained_before = true,
1279 		.chain_id = ALC880_FIXUP_6ST_BASE,
1280 	},
1281 };
1282 
1283 static const struct snd_pci_quirk alc880_fixup_tbl[] = {
1284 	SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_FIXUP_W810),
1285 	SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS W5A", ALC880_FIXUP_ASUS_W5A),
1286 	SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_FIXUP_Z71V),
1287 	SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_FIXUP_GPIO1),
1288 	SND_PCI_QUIRK(0x147b, 0x1045, "ABit AA8XE", ALC880_FIXUP_6ST_AUTOMUTE),
1289 	SND_PCI_QUIRK(0x1558, 0x5401, "Clevo GPIO2", ALC880_FIXUP_GPIO2),
1290 	SND_PCI_QUIRK_VENDOR(0x1558, "Clevo", ALC880_FIXUP_EAPD_COEF),
1291 	SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_FIXUP_UNIWILL_DIG),
1292 	SND_PCI_QUIRK(0x1584, 0x9054, "Uniwill", ALC880_FIXUP_F1734),
1293 	SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_FIXUP_UNIWILL),
1294 	SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_FIXUP_VOL_KNOB),
1295 	SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_FIXUP_W810),
1296 	SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_FIXUP_MEDION_RIM),
1297 	SND_PCI_QUIRK(0x1631, 0xe011, "PB 13201056", ALC880_FIXUP_6ST_AUTOMUTE),
1298 	SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_FIXUP_F1734),
1299 	SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FIXUP_FUJITSU),
1300 	SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_FIXUP_F1734),
1301 	SND_PCI_QUIRK(0x1734, 0x10b0, "FSC Amilo Pi1556", ALC880_FIXUP_FUJITSU),
1302 	SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_FIXUP_LG),
1303 	SND_PCI_QUIRK(0x1854, 0x005f, "LG P1 Express", ALC880_FIXUP_LG),
1304 	SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_FIXUP_LG),
1305 	SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_FIXUP_LG_LW25),
1306 	SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_FIXUP_TCL_S700),
1307 
1308 	/* Below is the copied entries from alc880_quirks.c.
1309 	 * It's not quite sure whether BIOS sets the correct pin-config table
1310 	 * on these machines, thus they are kept to be compatible with
1311 	 * the old static quirks.  Once when it's confirmed to work without
1312 	 * these overrides, it'd be better to remove.
1313 	 */
1314 	SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_FIXUP_5ST_DIG),
1315 	SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_FIXUP_6ST),
1316 	SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_FIXUP_3ST_DIG),
1317 	SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_FIXUP_6ST_DIG),
1318 	SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_FIXUP_6ST_DIG),
1319 	SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_FIXUP_6ST_DIG),
1320 	SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_FIXUP_3ST_DIG),
1321 	SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_FIXUP_3ST),
1322 	SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_FIXUP_6ST_DIG),
1323 	SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_FIXUP_3ST),
1324 	SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_FIXUP_3ST),
1325 	SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_FIXUP_5ST),
1326 	SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_FIXUP_5ST),
1327 	SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_FIXUP_5ST),
1328 	SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_FIXUP_6ST_DIG),
1329 	SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_FIXUP_6ST_DIG),
1330 	SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_FIXUP_6ST_DIG),
1331 	SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_FIXUP_6ST_DIG),
1332 	SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_FIXUP_5ST_DIG),
1333 	SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_FIXUP_5ST_DIG),
1334 	SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_FIXUP_5ST_DIG),
1335 	SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_FIXUP_6ST_DIG), /* broken BIOS */
1336 	SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_FIXUP_6ST_DIG),
1337 	SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1338 	SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1339 	SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1340 	SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1341 	SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1342 	SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1343 	SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1344 	SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1345 	SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1346 	SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1347 	/* default Intel */
1348 	SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_FIXUP_3ST),
1349 	SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_FIXUP_5ST_DIG),
1350 	SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_FIXUP_6ST_DIG),
1351 	{}
1352 };
1353 
1354 static const struct hda_model_fixup alc880_fixup_models[] = {
1355 	{.id = ALC880_FIXUP_3ST, .name = "3stack"},
1356 	{.id = ALC880_FIXUP_3ST_DIG, .name = "3stack-digout"},
1357 	{.id = ALC880_FIXUP_5ST, .name = "5stack"},
1358 	{.id = ALC880_FIXUP_5ST_DIG, .name = "5stack-digout"},
1359 	{.id = ALC880_FIXUP_6ST, .name = "6stack"},
1360 	{.id = ALC880_FIXUP_6ST_DIG, .name = "6stack-digout"},
1361 	{.id = ALC880_FIXUP_6ST_AUTOMUTE, .name = "6stack-automute"},
1362 	{}
1363 };
1364 
1365 
1366 /*
1367  * OK, here we have finally the patch for ALC880
1368  */
1369 static int patch_alc880(struct hda_codec *codec)
1370 {
1371 	struct alc_spec *spec;
1372 	int err;
1373 
1374 	err = alc_alloc_spec(codec, 0x0b);
1375 	if (err < 0)
1376 		return err;
1377 
1378 	spec = codec->spec;
1379 	spec->gen.need_dac_fix = 1;
1380 	spec->gen.beep_nid = 0x01;
1381 
1382 	snd_hda_pick_fixup(codec, alc880_fixup_models, alc880_fixup_tbl,
1383 		       alc880_fixups);
1384 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1385 
1386 	/* automatic parse from the BIOS config */
1387 	err = alc880_parse_auto_config(codec);
1388 	if (err < 0)
1389 		goto error;
1390 
1391 	if (!spec->gen.no_analog)
1392 		set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
1393 
1394 	codec->patch_ops = alc_patch_ops;
1395 	codec->patch_ops.unsol_event = alc880_unsol_event;
1396 
1397 
1398 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
1399 
1400 	return 0;
1401 
1402  error:
1403 	alc_free(codec);
1404 	return err;
1405 }
1406 
1407 
1408 /*
1409  * ALC260 support
1410  */
1411 static int alc260_parse_auto_config(struct hda_codec *codec)
1412 {
1413 	static const hda_nid_t alc260_ignore[] = { 0x17, 0 };
1414 	static const hda_nid_t alc260_ssids[] = { 0x10, 0x15, 0x0f, 0 };
1415 	return alc_parse_auto_config(codec, alc260_ignore, alc260_ssids);
1416 }
1417 
1418 /*
1419  * Pin config fixes
1420  */
1421 enum {
1422 	ALC260_FIXUP_HP_DC5750,
1423 	ALC260_FIXUP_HP_PIN_0F,
1424 	ALC260_FIXUP_COEF,
1425 	ALC260_FIXUP_GPIO1,
1426 	ALC260_FIXUP_GPIO1_TOGGLE,
1427 	ALC260_FIXUP_REPLACER,
1428 	ALC260_FIXUP_HP_B1900,
1429 	ALC260_FIXUP_KN1,
1430 	ALC260_FIXUP_FSC_S7020,
1431 	ALC260_FIXUP_FSC_S7020_JWSE,
1432 	ALC260_FIXUP_VAIO_PINS,
1433 };
1434 
1435 static void alc260_gpio1_automute(struct hda_codec *codec)
1436 {
1437 	struct alc_spec *spec = codec->spec;
1438 	snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
1439 			    spec->gen.hp_jack_present);
1440 }
1441 
1442 static void alc260_fixup_gpio1_toggle(struct hda_codec *codec,
1443 				      const struct hda_fixup *fix, int action)
1444 {
1445 	struct alc_spec *spec = codec->spec;
1446 	if (action == HDA_FIXUP_ACT_PROBE) {
1447 		/* although the machine has only one output pin, we need to
1448 		 * toggle GPIO1 according to the jack state
1449 		 */
1450 		spec->gen.automute_hook = alc260_gpio1_automute;
1451 		spec->gen.detect_hp = 1;
1452 		spec->gen.automute_speaker = 1;
1453 		spec->gen.autocfg.hp_pins[0] = 0x0f; /* copy it for automute */
1454 		snd_hda_jack_detect_enable_callback(codec, 0x0f,
1455 						    snd_hda_gen_hp_automute);
1456 		snd_hda_add_verbs(codec, alc_gpio1_init_verbs);
1457 	}
1458 }
1459 
1460 static void alc260_fixup_kn1(struct hda_codec *codec,
1461 			     const struct hda_fixup *fix, int action)
1462 {
1463 	struct alc_spec *spec = codec->spec;
1464 	static const struct hda_pintbl pincfgs[] = {
1465 		{ 0x0f, 0x02214000 }, /* HP/speaker */
1466 		{ 0x12, 0x90a60160 }, /* int mic */
1467 		{ 0x13, 0x02a19000 }, /* ext mic */
1468 		{ 0x18, 0x01446000 }, /* SPDIF out */
1469 		/* disable bogus I/O pins */
1470 		{ 0x10, 0x411111f0 },
1471 		{ 0x11, 0x411111f0 },
1472 		{ 0x14, 0x411111f0 },
1473 		{ 0x15, 0x411111f0 },
1474 		{ 0x16, 0x411111f0 },
1475 		{ 0x17, 0x411111f0 },
1476 		{ 0x19, 0x411111f0 },
1477 		{ }
1478 	};
1479 
1480 	switch (action) {
1481 	case HDA_FIXUP_ACT_PRE_PROBE:
1482 		snd_hda_apply_pincfgs(codec, pincfgs);
1483 		break;
1484 	case HDA_FIXUP_ACT_PROBE:
1485 		spec->init_amp = ALC_INIT_NONE;
1486 		break;
1487 	}
1488 }
1489 
1490 static void alc260_fixup_fsc_s7020(struct hda_codec *codec,
1491 				   const struct hda_fixup *fix, int action)
1492 {
1493 	struct alc_spec *spec = codec->spec;
1494 	if (action == HDA_FIXUP_ACT_PROBE)
1495 		spec->init_amp = ALC_INIT_NONE;
1496 }
1497 
1498 static void alc260_fixup_fsc_s7020_jwse(struct hda_codec *codec,
1499 				   const struct hda_fixup *fix, int action)
1500 {
1501 	struct alc_spec *spec = codec->spec;
1502 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1503 		spec->gen.add_jack_modes = 1;
1504 		spec->gen.hp_mic = 1;
1505 	}
1506 }
1507 
1508 static const struct hda_fixup alc260_fixups[] = {
1509 	[ALC260_FIXUP_HP_DC5750] = {
1510 		.type = HDA_FIXUP_PINS,
1511 		.v.pins = (const struct hda_pintbl[]) {
1512 			{ 0x11, 0x90130110 }, /* speaker */
1513 			{ }
1514 		}
1515 	},
1516 	[ALC260_FIXUP_HP_PIN_0F] = {
1517 		.type = HDA_FIXUP_PINS,
1518 		.v.pins = (const struct hda_pintbl[]) {
1519 			{ 0x0f, 0x01214000 }, /* HP */
1520 			{ }
1521 		}
1522 	},
1523 	[ALC260_FIXUP_COEF] = {
1524 		.type = HDA_FIXUP_VERBS,
1525 		.v.verbs = (const struct hda_verb[]) {
1526 			{ 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1527 			{ 0x1a, AC_VERB_SET_PROC_COEF,  0x3040 },
1528 			{ }
1529 		},
1530 	},
1531 	[ALC260_FIXUP_GPIO1] = {
1532 		.type = HDA_FIXUP_VERBS,
1533 		.v.verbs = alc_gpio1_init_verbs,
1534 	},
1535 	[ALC260_FIXUP_GPIO1_TOGGLE] = {
1536 		.type = HDA_FIXUP_FUNC,
1537 		.v.func = alc260_fixup_gpio1_toggle,
1538 		.chained = true,
1539 		.chain_id = ALC260_FIXUP_HP_PIN_0F,
1540 	},
1541 	[ALC260_FIXUP_REPLACER] = {
1542 		.type = HDA_FIXUP_VERBS,
1543 		.v.verbs = (const struct hda_verb[]) {
1544 			{ 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1545 			{ 0x1a, AC_VERB_SET_PROC_COEF,  0x3050 },
1546 			{ }
1547 		},
1548 		.chained = true,
1549 		.chain_id = ALC260_FIXUP_GPIO1_TOGGLE,
1550 	},
1551 	[ALC260_FIXUP_HP_B1900] = {
1552 		.type = HDA_FIXUP_FUNC,
1553 		.v.func = alc260_fixup_gpio1_toggle,
1554 		.chained = true,
1555 		.chain_id = ALC260_FIXUP_COEF,
1556 	},
1557 	[ALC260_FIXUP_KN1] = {
1558 		.type = HDA_FIXUP_FUNC,
1559 		.v.func = alc260_fixup_kn1,
1560 	},
1561 	[ALC260_FIXUP_FSC_S7020] = {
1562 		.type = HDA_FIXUP_FUNC,
1563 		.v.func = alc260_fixup_fsc_s7020,
1564 	},
1565 	[ALC260_FIXUP_FSC_S7020_JWSE] = {
1566 		.type = HDA_FIXUP_FUNC,
1567 		.v.func = alc260_fixup_fsc_s7020_jwse,
1568 		.chained = true,
1569 		.chain_id = ALC260_FIXUP_FSC_S7020,
1570 	},
1571 	[ALC260_FIXUP_VAIO_PINS] = {
1572 		.type = HDA_FIXUP_PINS,
1573 		.v.pins = (const struct hda_pintbl[]) {
1574 			/* Pin configs are missing completely on some VAIOs */
1575 			{ 0x0f, 0x01211020 },
1576 			{ 0x10, 0x0001003f },
1577 			{ 0x11, 0x411111f0 },
1578 			{ 0x12, 0x01a15930 },
1579 			{ 0x13, 0x411111f0 },
1580 			{ 0x14, 0x411111f0 },
1581 			{ 0x15, 0x411111f0 },
1582 			{ 0x16, 0x411111f0 },
1583 			{ 0x17, 0x411111f0 },
1584 			{ 0x18, 0x411111f0 },
1585 			{ 0x19, 0x411111f0 },
1586 			{ }
1587 		}
1588 	},
1589 };
1590 
1591 static const struct snd_pci_quirk alc260_fixup_tbl[] = {
1592 	SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_FIXUP_GPIO1),
1593 	SND_PCI_QUIRK(0x1025, 0x007f, "Acer Aspire 9500", ALC260_FIXUP_COEF),
1594 	SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_FIXUP_GPIO1),
1595 	SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", ALC260_FIXUP_HP_DC5750),
1596 	SND_PCI_QUIRK(0x103c, 0x30ba, "HP Presario B1900", ALC260_FIXUP_HP_B1900),
1597 	SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_FIXUP_VAIO_PINS),
1598 	SND_PCI_QUIRK(0x104d, 0x81e2, "Sony VAIO TX", ALC260_FIXUP_HP_PIN_0F),
1599 	SND_PCI_QUIRK(0x10cf, 0x1326, "FSC LifeBook S7020", ALC260_FIXUP_FSC_S7020),
1600 	SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FIXUP_GPIO1),
1601 	SND_PCI_QUIRK(0x152d, 0x0729, "Quanta KN1", ALC260_FIXUP_KN1),
1602 	SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_FIXUP_REPLACER),
1603 	SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_FIXUP_COEF),
1604 	{}
1605 };
1606 
1607 static const struct hda_model_fixup alc260_fixup_models[] = {
1608 	{.id = ALC260_FIXUP_GPIO1, .name = "gpio1"},
1609 	{.id = ALC260_FIXUP_COEF, .name = "coef"},
1610 	{.id = ALC260_FIXUP_FSC_S7020, .name = "fujitsu"},
1611 	{.id = ALC260_FIXUP_FSC_S7020_JWSE, .name = "fujitsu-jwse"},
1612 	{}
1613 };
1614 
1615 /*
1616  */
1617 static int patch_alc260(struct hda_codec *codec)
1618 {
1619 	struct alc_spec *spec;
1620 	int err;
1621 
1622 	err = alc_alloc_spec(codec, 0x07);
1623 	if (err < 0)
1624 		return err;
1625 
1626 	spec = codec->spec;
1627 	/* as quite a few machines require HP amp for speaker outputs,
1628 	 * it's easier to enable it unconditionally; even if it's unneeded,
1629 	 * it's almost harmless.
1630 	 */
1631 	spec->gen.prefer_hp_amp = 1;
1632 	spec->gen.beep_nid = 0x01;
1633 
1634 	snd_hda_pick_fixup(codec, alc260_fixup_models, alc260_fixup_tbl,
1635 			   alc260_fixups);
1636 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1637 
1638 	/* automatic parse from the BIOS config */
1639 	err = alc260_parse_auto_config(codec);
1640 	if (err < 0)
1641 		goto error;
1642 
1643 	if (!spec->gen.no_analog)
1644 		set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
1645 
1646 	codec->patch_ops = alc_patch_ops;
1647 	spec->shutup = alc_eapd_shutup;
1648 
1649 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
1650 
1651 	return 0;
1652 
1653  error:
1654 	alc_free(codec);
1655 	return err;
1656 }
1657 
1658 
1659 /*
1660  * ALC882/883/885/888/889 support
1661  *
1662  * ALC882 is almost identical with ALC880 but has cleaner and more flexible
1663  * configuration.  Each pin widget can choose any input DACs and a mixer.
1664  * Each ADC is connected from a mixer of all inputs.  This makes possible
1665  * 6-channel independent captures.
1666  *
1667  * In addition, an independent DAC for the multi-playback (not used in this
1668  * driver yet).
1669  */
1670 
1671 /*
1672  * Pin config fixes
1673  */
1674 enum {
1675 	ALC882_FIXUP_ABIT_AW9D_MAX,
1676 	ALC882_FIXUP_LENOVO_Y530,
1677 	ALC882_FIXUP_PB_M5210,
1678 	ALC882_FIXUP_ACER_ASPIRE_7736,
1679 	ALC882_FIXUP_ASUS_W90V,
1680 	ALC889_FIXUP_CD,
1681 	ALC889_FIXUP_FRONT_HP_NO_PRESENCE,
1682 	ALC889_FIXUP_VAIO_TT,
1683 	ALC888_FIXUP_EEE1601,
1684 	ALC882_FIXUP_EAPD,
1685 	ALC883_FIXUP_EAPD,
1686 	ALC883_FIXUP_ACER_EAPD,
1687 	ALC882_FIXUP_GPIO1,
1688 	ALC882_FIXUP_GPIO2,
1689 	ALC882_FIXUP_GPIO3,
1690 	ALC889_FIXUP_COEF,
1691 	ALC882_FIXUP_ASUS_W2JC,
1692 	ALC882_FIXUP_ACER_ASPIRE_4930G,
1693 	ALC882_FIXUP_ACER_ASPIRE_8930G,
1694 	ALC882_FIXUP_ASPIRE_8930G_VERBS,
1695 	ALC885_FIXUP_MACPRO_GPIO,
1696 	ALC889_FIXUP_DAC_ROUTE,
1697 	ALC889_FIXUP_MBP_VREF,
1698 	ALC889_FIXUP_IMAC91_VREF,
1699 	ALC889_FIXUP_MBA11_VREF,
1700 	ALC889_FIXUP_MBA21_VREF,
1701 	ALC889_FIXUP_MP11_VREF,
1702 	ALC882_FIXUP_INV_DMIC,
1703 	ALC882_FIXUP_NO_PRIMARY_HP,
1704 	ALC887_FIXUP_ASUS_BASS,
1705 	ALC887_FIXUP_BASS_CHMAP,
1706 };
1707 
1708 static void alc889_fixup_coef(struct hda_codec *codec,
1709 			      const struct hda_fixup *fix, int action)
1710 {
1711 	if (action != HDA_FIXUP_ACT_INIT)
1712 		return;
1713 	alc889_coef_init(codec);
1714 }
1715 
1716 /* toggle speaker-output according to the hp-jack state */
1717 static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted)
1718 {
1719 	unsigned int gpiostate, gpiomask, gpiodir;
1720 
1721 	gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
1722 				       AC_VERB_GET_GPIO_DATA, 0);
1723 
1724 	if (!muted)
1725 		gpiostate |= (1 << pin);
1726 	else
1727 		gpiostate &= ~(1 << pin);
1728 
1729 	gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
1730 				      AC_VERB_GET_GPIO_MASK, 0);
1731 	gpiomask |= (1 << pin);
1732 
1733 	gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
1734 				     AC_VERB_GET_GPIO_DIRECTION, 0);
1735 	gpiodir |= (1 << pin);
1736 
1737 
1738 	snd_hda_codec_write(codec, codec->afg, 0,
1739 			    AC_VERB_SET_GPIO_MASK, gpiomask);
1740 	snd_hda_codec_write(codec, codec->afg, 0,
1741 			    AC_VERB_SET_GPIO_DIRECTION, gpiodir);
1742 
1743 	msleep(1);
1744 
1745 	snd_hda_codec_write(codec, codec->afg, 0,
1746 			    AC_VERB_SET_GPIO_DATA, gpiostate);
1747 }
1748 
1749 /* set up GPIO at initialization */
1750 static void alc885_fixup_macpro_gpio(struct hda_codec *codec,
1751 				     const struct hda_fixup *fix, int action)
1752 {
1753 	if (action != HDA_FIXUP_ACT_INIT)
1754 		return;
1755 	alc882_gpio_mute(codec, 0, 0);
1756 	alc882_gpio_mute(codec, 1, 0);
1757 }
1758 
1759 /* Fix the connection of some pins for ALC889:
1760  * At least, Acer Aspire 5935 shows the connections to DAC3/4 don't
1761  * work correctly (bko#42740)
1762  */
1763 static void alc889_fixup_dac_route(struct hda_codec *codec,
1764 				   const struct hda_fixup *fix, int action)
1765 {
1766 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1767 		/* fake the connections during parsing the tree */
1768 		hda_nid_t conn1[2] = { 0x0c, 0x0d };
1769 		hda_nid_t conn2[2] = { 0x0e, 0x0f };
1770 		snd_hda_override_conn_list(codec, 0x14, 2, conn1);
1771 		snd_hda_override_conn_list(codec, 0x15, 2, conn1);
1772 		snd_hda_override_conn_list(codec, 0x18, 2, conn2);
1773 		snd_hda_override_conn_list(codec, 0x1a, 2, conn2);
1774 	} else if (action == HDA_FIXUP_ACT_PROBE) {
1775 		/* restore the connections */
1776 		hda_nid_t conn[5] = { 0x0c, 0x0d, 0x0e, 0x0f, 0x26 };
1777 		snd_hda_override_conn_list(codec, 0x14, 5, conn);
1778 		snd_hda_override_conn_list(codec, 0x15, 5, conn);
1779 		snd_hda_override_conn_list(codec, 0x18, 5, conn);
1780 		snd_hda_override_conn_list(codec, 0x1a, 5, conn);
1781 	}
1782 }
1783 
1784 /* Set VREF on HP pin */
1785 static void alc889_fixup_mbp_vref(struct hda_codec *codec,
1786 				  const struct hda_fixup *fix, int action)
1787 {
1788 	struct alc_spec *spec = codec->spec;
1789 	static hda_nid_t nids[2] = { 0x14, 0x15 };
1790 	int i;
1791 
1792 	if (action != HDA_FIXUP_ACT_INIT)
1793 		return;
1794 	for (i = 0; i < ARRAY_SIZE(nids); i++) {
1795 		unsigned int val = snd_hda_codec_get_pincfg(codec, nids[i]);
1796 		if (get_defcfg_device(val) != AC_JACK_HP_OUT)
1797 			continue;
1798 		val = snd_hda_codec_get_pin_target(codec, nids[i]);
1799 		val |= AC_PINCTL_VREF_80;
1800 		snd_hda_set_pin_ctl(codec, nids[i], val);
1801 		spec->gen.keep_vref_in_automute = 1;
1802 		break;
1803 	}
1804 }
1805 
1806 static void alc889_fixup_mac_pins(struct hda_codec *codec,
1807 				  const hda_nid_t *nids, int num_nids)
1808 {
1809 	struct alc_spec *spec = codec->spec;
1810 	int i;
1811 
1812 	for (i = 0; i < num_nids; i++) {
1813 		unsigned int val;
1814 		val = snd_hda_codec_get_pin_target(codec, nids[i]);
1815 		val |= AC_PINCTL_VREF_50;
1816 		snd_hda_set_pin_ctl(codec, nids[i], val);
1817 	}
1818 	spec->gen.keep_vref_in_automute = 1;
1819 }
1820 
1821 /* Set VREF on speaker pins on imac91 */
1822 static void alc889_fixup_imac91_vref(struct hda_codec *codec,
1823 				     const struct hda_fixup *fix, int action)
1824 {
1825 	static hda_nid_t nids[2] = { 0x18, 0x1a };
1826 
1827 	if (action == HDA_FIXUP_ACT_INIT)
1828 		alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
1829 }
1830 
1831 /* Set VREF on speaker pins on mba11 */
1832 static void alc889_fixup_mba11_vref(struct hda_codec *codec,
1833 				    const struct hda_fixup *fix, int action)
1834 {
1835 	static hda_nid_t nids[1] = { 0x18 };
1836 
1837 	if (action == HDA_FIXUP_ACT_INIT)
1838 		alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
1839 }
1840 
1841 /* Set VREF on speaker pins on mba21 */
1842 static void alc889_fixup_mba21_vref(struct hda_codec *codec,
1843 				    const struct hda_fixup *fix, int action)
1844 {
1845 	static hda_nid_t nids[2] = { 0x18, 0x19 };
1846 
1847 	if (action == HDA_FIXUP_ACT_INIT)
1848 		alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
1849 }
1850 
1851 /* Don't take HP output as primary
1852  * Strangely, the speaker output doesn't work on Vaio Z and some Vaio
1853  * all-in-one desktop PCs (for example VGC-LN51JGB) through DAC 0x05
1854  */
1855 static void alc882_fixup_no_primary_hp(struct hda_codec *codec,
1856 				       const struct hda_fixup *fix, int action)
1857 {
1858 	struct alc_spec *spec = codec->spec;
1859 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1860 		spec->gen.no_primary_hp = 1;
1861 		spec->gen.no_multi_io = 1;
1862 	}
1863 }
1864 
1865 static void alc_fixup_bass_chmap(struct hda_codec *codec,
1866 				 const struct hda_fixup *fix, int action);
1867 
1868 static const struct hda_fixup alc882_fixups[] = {
1869 	[ALC882_FIXUP_ABIT_AW9D_MAX] = {
1870 		.type = HDA_FIXUP_PINS,
1871 		.v.pins = (const struct hda_pintbl[]) {
1872 			{ 0x15, 0x01080104 }, /* side */
1873 			{ 0x16, 0x01011012 }, /* rear */
1874 			{ 0x17, 0x01016011 }, /* clfe */
1875 			{ }
1876 		}
1877 	},
1878 	[ALC882_FIXUP_LENOVO_Y530] = {
1879 		.type = HDA_FIXUP_PINS,
1880 		.v.pins = (const struct hda_pintbl[]) {
1881 			{ 0x15, 0x99130112 }, /* rear int speakers */
1882 			{ 0x16, 0x99130111 }, /* subwoofer */
1883 			{ }
1884 		}
1885 	},
1886 	[ALC882_FIXUP_PB_M5210] = {
1887 		.type = HDA_FIXUP_PINCTLS,
1888 		.v.pins = (const struct hda_pintbl[]) {
1889 			{ 0x19, PIN_VREF50 },
1890 			{}
1891 		}
1892 	},
1893 	[ALC882_FIXUP_ACER_ASPIRE_7736] = {
1894 		.type = HDA_FIXUP_FUNC,
1895 		.v.func = alc_fixup_sku_ignore,
1896 	},
1897 	[ALC882_FIXUP_ASUS_W90V] = {
1898 		.type = HDA_FIXUP_PINS,
1899 		.v.pins = (const struct hda_pintbl[]) {
1900 			{ 0x16, 0x99130110 }, /* fix sequence for CLFE */
1901 			{ }
1902 		}
1903 	},
1904 	[ALC889_FIXUP_CD] = {
1905 		.type = HDA_FIXUP_PINS,
1906 		.v.pins = (const struct hda_pintbl[]) {
1907 			{ 0x1c, 0x993301f0 }, /* CD */
1908 			{ }
1909 		}
1910 	},
1911 	[ALC889_FIXUP_FRONT_HP_NO_PRESENCE] = {
1912 		.type = HDA_FIXUP_PINS,
1913 		.v.pins = (const struct hda_pintbl[]) {
1914 			{ 0x1b, 0x02214120 }, /* Front HP jack is flaky, disable jack detect */
1915 			{ }
1916 		},
1917 		.chained = true,
1918 		.chain_id = ALC889_FIXUP_CD,
1919 	},
1920 	[ALC889_FIXUP_VAIO_TT] = {
1921 		.type = HDA_FIXUP_PINS,
1922 		.v.pins = (const struct hda_pintbl[]) {
1923 			{ 0x17, 0x90170111 }, /* hidden surround speaker */
1924 			{ }
1925 		}
1926 	},
1927 	[ALC888_FIXUP_EEE1601] = {
1928 		.type = HDA_FIXUP_VERBS,
1929 		.v.verbs = (const struct hda_verb[]) {
1930 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
1931 			{ 0x20, AC_VERB_SET_PROC_COEF,  0x0838 },
1932 			{ }
1933 		}
1934 	},
1935 	[ALC882_FIXUP_EAPD] = {
1936 		.type = HDA_FIXUP_VERBS,
1937 		.v.verbs = (const struct hda_verb[]) {
1938 			/* change to EAPD mode */
1939 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1940 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
1941 			{ }
1942 		}
1943 	},
1944 	[ALC883_FIXUP_EAPD] = {
1945 		.type = HDA_FIXUP_VERBS,
1946 		.v.verbs = (const struct hda_verb[]) {
1947 			/* change to EAPD mode */
1948 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1949 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
1950 			{ }
1951 		}
1952 	},
1953 	[ALC883_FIXUP_ACER_EAPD] = {
1954 		.type = HDA_FIXUP_VERBS,
1955 		.v.verbs = (const struct hda_verb[]) {
1956 			/* eanable EAPD on Acer laptops */
1957 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1958 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
1959 			{ }
1960 		}
1961 	},
1962 	[ALC882_FIXUP_GPIO1] = {
1963 		.type = HDA_FIXUP_VERBS,
1964 		.v.verbs = alc_gpio1_init_verbs,
1965 	},
1966 	[ALC882_FIXUP_GPIO2] = {
1967 		.type = HDA_FIXUP_VERBS,
1968 		.v.verbs = alc_gpio2_init_verbs,
1969 	},
1970 	[ALC882_FIXUP_GPIO3] = {
1971 		.type = HDA_FIXUP_VERBS,
1972 		.v.verbs = alc_gpio3_init_verbs,
1973 	},
1974 	[ALC882_FIXUP_ASUS_W2JC] = {
1975 		.type = HDA_FIXUP_VERBS,
1976 		.v.verbs = alc_gpio1_init_verbs,
1977 		.chained = true,
1978 		.chain_id = ALC882_FIXUP_EAPD,
1979 	},
1980 	[ALC889_FIXUP_COEF] = {
1981 		.type = HDA_FIXUP_FUNC,
1982 		.v.func = alc889_fixup_coef,
1983 	},
1984 	[ALC882_FIXUP_ACER_ASPIRE_4930G] = {
1985 		.type = HDA_FIXUP_PINS,
1986 		.v.pins = (const struct hda_pintbl[]) {
1987 			{ 0x16, 0x99130111 }, /* CLFE speaker */
1988 			{ 0x17, 0x99130112 }, /* surround speaker */
1989 			{ }
1990 		},
1991 		.chained = true,
1992 		.chain_id = ALC882_FIXUP_GPIO1,
1993 	},
1994 	[ALC882_FIXUP_ACER_ASPIRE_8930G] = {
1995 		.type = HDA_FIXUP_PINS,
1996 		.v.pins = (const struct hda_pintbl[]) {
1997 			{ 0x16, 0x99130111 }, /* CLFE speaker */
1998 			{ 0x1b, 0x99130112 }, /* surround speaker */
1999 			{ }
2000 		},
2001 		.chained = true,
2002 		.chain_id = ALC882_FIXUP_ASPIRE_8930G_VERBS,
2003 	},
2004 	[ALC882_FIXUP_ASPIRE_8930G_VERBS] = {
2005 		/* additional init verbs for Acer Aspire 8930G */
2006 		.type = HDA_FIXUP_VERBS,
2007 		.v.verbs = (const struct hda_verb[]) {
2008 			/* Enable all DACs */
2009 			/* DAC DISABLE/MUTE 1? */
2010 			/*  setting bits 1-5 disables DAC nids 0x02-0x06
2011 			 *  apparently. Init=0x38 */
2012 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x03 },
2013 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2014 			/* DAC DISABLE/MUTE 2? */
2015 			/*  some bit here disables the other DACs.
2016 			 *  Init=0x4900 */
2017 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x08 },
2018 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2019 			/* DMIC fix
2020 			 * This laptop has a stereo digital microphone.
2021 			 * The mics are only 1cm apart which makes the stereo
2022 			 * useless. However, either the mic or the ALC889
2023 			 * makes the signal become a difference/sum signal
2024 			 * instead of standard stereo, which is annoying.
2025 			 * So instead we flip this bit which makes the
2026 			 * codec replicate the sum signal to both channels,
2027 			 * turning it into a normal mono mic.
2028 			 */
2029 			/* DMIC_CONTROL? Init value = 0x0001 */
2030 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2031 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0003 },
2032 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2033 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2034 			{ }
2035 		},
2036 		.chained = true,
2037 		.chain_id = ALC882_FIXUP_GPIO1,
2038 	},
2039 	[ALC885_FIXUP_MACPRO_GPIO] = {
2040 		.type = HDA_FIXUP_FUNC,
2041 		.v.func = alc885_fixup_macpro_gpio,
2042 	},
2043 	[ALC889_FIXUP_DAC_ROUTE] = {
2044 		.type = HDA_FIXUP_FUNC,
2045 		.v.func = alc889_fixup_dac_route,
2046 	},
2047 	[ALC889_FIXUP_MBP_VREF] = {
2048 		.type = HDA_FIXUP_FUNC,
2049 		.v.func = alc889_fixup_mbp_vref,
2050 		.chained = true,
2051 		.chain_id = ALC882_FIXUP_GPIO1,
2052 	},
2053 	[ALC889_FIXUP_IMAC91_VREF] = {
2054 		.type = HDA_FIXUP_FUNC,
2055 		.v.func = alc889_fixup_imac91_vref,
2056 		.chained = true,
2057 		.chain_id = ALC882_FIXUP_GPIO1,
2058 	},
2059 	[ALC889_FIXUP_MBA11_VREF] = {
2060 		.type = HDA_FIXUP_FUNC,
2061 		.v.func = alc889_fixup_mba11_vref,
2062 		.chained = true,
2063 		.chain_id = ALC889_FIXUP_MBP_VREF,
2064 	},
2065 	[ALC889_FIXUP_MBA21_VREF] = {
2066 		.type = HDA_FIXUP_FUNC,
2067 		.v.func = alc889_fixup_mba21_vref,
2068 		.chained = true,
2069 		.chain_id = ALC889_FIXUP_MBP_VREF,
2070 	},
2071 	[ALC889_FIXUP_MP11_VREF] = {
2072 		.type = HDA_FIXUP_FUNC,
2073 		.v.func = alc889_fixup_mba11_vref,
2074 		.chained = true,
2075 		.chain_id = ALC885_FIXUP_MACPRO_GPIO,
2076 	},
2077 	[ALC882_FIXUP_INV_DMIC] = {
2078 		.type = HDA_FIXUP_FUNC,
2079 		.v.func = alc_fixup_inv_dmic,
2080 	},
2081 	[ALC882_FIXUP_NO_PRIMARY_HP] = {
2082 		.type = HDA_FIXUP_FUNC,
2083 		.v.func = alc882_fixup_no_primary_hp,
2084 	},
2085 	[ALC887_FIXUP_ASUS_BASS] = {
2086 		.type = HDA_FIXUP_PINS,
2087 		.v.pins = (const struct hda_pintbl[]) {
2088 			{0x16, 0x99130130}, /* bass speaker */
2089 			{}
2090 		},
2091 		.chained = true,
2092 		.chain_id = ALC887_FIXUP_BASS_CHMAP,
2093 	},
2094 	[ALC887_FIXUP_BASS_CHMAP] = {
2095 		.type = HDA_FIXUP_FUNC,
2096 		.v.func = alc_fixup_bass_chmap,
2097 	},
2098 };
2099 
2100 static const struct snd_pci_quirk alc882_fixup_tbl[] = {
2101 	SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD),
2102 	SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2103 	SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD),
2104 	SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2105 	SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD),
2106 	SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_FIXUP_ACER_EAPD),
2107 	SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
2108 		      ALC882_FIXUP_ACER_ASPIRE_4930G),
2109 	SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
2110 		      ALC882_FIXUP_ACER_ASPIRE_4930G),
2111 	SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
2112 		      ALC882_FIXUP_ACER_ASPIRE_8930G),
2113 	SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
2114 		      ALC882_FIXUP_ACER_ASPIRE_8930G),
2115 	SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
2116 		      ALC882_FIXUP_ACER_ASPIRE_4930G),
2117 	SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
2118 		      ALC882_FIXUP_ACER_ASPIRE_4930G),
2119 	SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
2120 		      ALC882_FIXUP_ACER_ASPIRE_4930G),
2121 	SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
2122 	SND_PCI_QUIRK(0x1025, 0x021e, "Acer Aspire 5739G",
2123 		      ALC882_FIXUP_ACER_ASPIRE_4930G),
2124 	SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),
2125 	SND_PCI_QUIRK(0x1025, 0x026b, "Acer Aspire 8940G", ALC882_FIXUP_ACER_ASPIRE_8930G),
2126 	SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736),
2127 	SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD),
2128 	SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),
2129 	SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_FIXUP_ASUS_W2JC),
2130 	SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601),
2131 	SND_PCI_QUIRK(0x1043, 0x84bc, "ASUS ET2700", ALC887_FIXUP_ASUS_BASS),
2132 	SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT),
2133 	SND_PCI_QUIRK(0x104d, 0x905a, "Sony Vaio Z", ALC882_FIXUP_NO_PRIMARY_HP),
2134 	SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP),
2135 
2136 	/* All Apple entries are in codec SSIDs */
2137 	SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF),
2138 	SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC889_FIXUP_MBP_VREF),
2139 	SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
2140 	SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC889_FIXUP_MP11_VREF),
2141 	SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_FIXUP_MACPRO_GPIO),
2142 	SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_FIXUP_MACPRO_GPIO),
2143 	SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC889_FIXUP_MBP_VREF),
2144 	SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889_FIXUP_MBP_VREF),
2145 	SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD),
2146 	SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC889_FIXUP_MBA11_VREF),
2147 	SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBA21_VREF),
2148 	SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889_FIXUP_MBP_VREF),
2149 	SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
2150 	SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO),
2151 	SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF),
2152 	SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF),
2153 	SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF),
2154 	SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 5,1", ALC885_FIXUP_MACPRO_GPIO),
2155 	SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF),
2156 	SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),
2157 	SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),
2158 	SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_IMAC91_VREF),
2159 
2160 	SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),
2161 	SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),
2162 	SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
2163 	SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE),
2164 	SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
2165 	SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
2166 	SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),
2167 	SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),
2168 	SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_FIXUP_COEF),
2169 	{}
2170 };
2171 
2172 static const struct hda_model_fixup alc882_fixup_models[] = {
2173 	{.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name = "acer-aspire-4930g"},
2174 	{.id = ALC882_FIXUP_ACER_ASPIRE_8930G, .name = "acer-aspire-8930g"},
2175 	{.id = ALC883_FIXUP_ACER_EAPD, .name = "acer-aspire"},
2176 	{.id = ALC882_FIXUP_INV_DMIC, .name = "inv-dmic"},
2177 	{.id = ALC882_FIXUP_NO_PRIMARY_HP, .name = "no-primary-hp"},
2178 	{}
2179 };
2180 
2181 /*
2182  * BIOS auto configuration
2183  */
2184 /* almost identical with ALC880 parser... */
2185 static int alc882_parse_auto_config(struct hda_codec *codec)
2186 {
2187 	static const hda_nid_t alc882_ignore[] = { 0x1d, 0 };
2188 	static const hda_nid_t alc882_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2189 	return alc_parse_auto_config(codec, alc882_ignore, alc882_ssids);
2190 }
2191 
2192 /*
2193  */
2194 static int patch_alc882(struct hda_codec *codec)
2195 {
2196 	struct alc_spec *spec;
2197 	int err;
2198 
2199 	err = alc_alloc_spec(codec, 0x0b);
2200 	if (err < 0)
2201 		return err;
2202 
2203 	spec = codec->spec;
2204 
2205 	switch (codec->vendor_id) {
2206 	case 0x10ec0882:
2207 	case 0x10ec0885:
2208 	case 0x10ec0900:
2209 		break;
2210 	default:
2211 		/* ALC883 and variants */
2212 		alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2213 		break;
2214 	}
2215 
2216 	snd_hda_pick_fixup(codec, alc882_fixup_models, alc882_fixup_tbl,
2217 		       alc882_fixups);
2218 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2219 
2220 	alc_auto_parse_customize_define(codec);
2221 
2222 	if (has_cdefine_beep(codec))
2223 		spec->gen.beep_nid = 0x01;
2224 
2225 	/* automatic parse from the BIOS config */
2226 	err = alc882_parse_auto_config(codec);
2227 	if (err < 0)
2228 		goto error;
2229 
2230 	if (!spec->gen.no_analog && spec->gen.beep_nid)
2231 		set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2232 
2233 	codec->patch_ops = alc_patch_ops;
2234 
2235 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2236 
2237 	return 0;
2238 
2239  error:
2240 	alc_free(codec);
2241 	return err;
2242 }
2243 
2244 
2245 /*
2246  * ALC262 support
2247  */
2248 static int alc262_parse_auto_config(struct hda_codec *codec)
2249 {
2250 	static const hda_nid_t alc262_ignore[] = { 0x1d, 0 };
2251 	static const hda_nid_t alc262_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2252 	return alc_parse_auto_config(codec, alc262_ignore, alc262_ssids);
2253 }
2254 
2255 /*
2256  * Pin config fixes
2257  */
2258 enum {
2259 	ALC262_FIXUP_FSC_H270,
2260 	ALC262_FIXUP_FSC_S7110,
2261 	ALC262_FIXUP_HP_Z200,
2262 	ALC262_FIXUP_TYAN,
2263 	ALC262_FIXUP_LENOVO_3000,
2264 	ALC262_FIXUP_BENQ,
2265 	ALC262_FIXUP_BENQ_T31,
2266 	ALC262_FIXUP_INV_DMIC,
2267 	ALC262_FIXUP_INTEL_BAYLEYBAY,
2268 };
2269 
2270 static const struct hda_fixup alc262_fixups[] = {
2271 	[ALC262_FIXUP_FSC_H270] = {
2272 		.type = HDA_FIXUP_PINS,
2273 		.v.pins = (const struct hda_pintbl[]) {
2274 			{ 0x14, 0x99130110 }, /* speaker */
2275 			{ 0x15, 0x0221142f }, /* front HP */
2276 			{ 0x1b, 0x0121141f }, /* rear HP */
2277 			{ }
2278 		}
2279 	},
2280 	[ALC262_FIXUP_FSC_S7110] = {
2281 		.type = HDA_FIXUP_PINS,
2282 		.v.pins = (const struct hda_pintbl[]) {
2283 			{ 0x15, 0x90170110 }, /* speaker */
2284 			{ }
2285 		},
2286 		.chained = true,
2287 		.chain_id = ALC262_FIXUP_BENQ,
2288 	},
2289 	[ALC262_FIXUP_HP_Z200] = {
2290 		.type = HDA_FIXUP_PINS,
2291 		.v.pins = (const struct hda_pintbl[]) {
2292 			{ 0x16, 0x99130120 }, /* internal speaker */
2293 			{ }
2294 		}
2295 	},
2296 	[ALC262_FIXUP_TYAN] = {
2297 		.type = HDA_FIXUP_PINS,
2298 		.v.pins = (const struct hda_pintbl[]) {
2299 			{ 0x14, 0x1993e1f0 }, /* int AUX */
2300 			{ }
2301 		}
2302 	},
2303 	[ALC262_FIXUP_LENOVO_3000] = {
2304 		.type = HDA_FIXUP_PINCTLS,
2305 		.v.pins = (const struct hda_pintbl[]) {
2306 			{ 0x19, PIN_VREF50 },
2307 			{}
2308 		},
2309 		.chained = true,
2310 		.chain_id = ALC262_FIXUP_BENQ,
2311 	},
2312 	[ALC262_FIXUP_BENQ] = {
2313 		.type = HDA_FIXUP_VERBS,
2314 		.v.verbs = (const struct hda_verb[]) {
2315 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2316 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2317 			{}
2318 		}
2319 	},
2320 	[ALC262_FIXUP_BENQ_T31] = {
2321 		.type = HDA_FIXUP_VERBS,
2322 		.v.verbs = (const struct hda_verb[]) {
2323 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2324 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2325 			{}
2326 		}
2327 	},
2328 	[ALC262_FIXUP_INV_DMIC] = {
2329 		.type = HDA_FIXUP_FUNC,
2330 		.v.func = alc_fixup_inv_dmic,
2331 	},
2332 	[ALC262_FIXUP_INTEL_BAYLEYBAY] = {
2333 		.type = HDA_FIXUP_FUNC,
2334 		.v.func = alc_fixup_no_depop_delay,
2335 	},
2336 };
2337 
2338 static const struct snd_pci_quirk alc262_fixup_tbl[] = {
2339 	SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", ALC262_FIXUP_HP_Z200),
2340 	SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu Lifebook S7110", ALC262_FIXUP_FSC_S7110),
2341 	SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ),
2342 	SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN),
2343 	SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270),
2344 	SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000),
2345 	SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ),
2346 	SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_FIXUP_BENQ_T31),
2347 	SND_PCI_QUIRK(0x8086, 0x7270, "BayleyBay", ALC262_FIXUP_INTEL_BAYLEYBAY),
2348 	{}
2349 };
2350 
2351 static const struct hda_model_fixup alc262_fixup_models[] = {
2352 	{.id = ALC262_FIXUP_INV_DMIC, .name = "inv-dmic"},
2353 	{}
2354 };
2355 
2356 /*
2357  */
2358 static int patch_alc262(struct hda_codec *codec)
2359 {
2360 	struct alc_spec *spec;
2361 	int err;
2362 
2363 	err = alc_alloc_spec(codec, 0x0b);
2364 	if (err < 0)
2365 		return err;
2366 
2367 	spec = codec->spec;
2368 	spec->gen.shared_mic_vref_pin = 0x18;
2369 
2370 #if 0
2371 	/* pshou 07/11/05  set a zero PCM sample to DAC when FIFO is
2372 	 * under-run
2373 	 */
2374 	alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x80);
2375 #endif
2376 	alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2377 
2378 	snd_hda_pick_fixup(codec, alc262_fixup_models, alc262_fixup_tbl,
2379 		       alc262_fixups);
2380 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2381 
2382 	alc_auto_parse_customize_define(codec);
2383 
2384 	if (has_cdefine_beep(codec))
2385 		spec->gen.beep_nid = 0x01;
2386 
2387 	/* automatic parse from the BIOS config */
2388 	err = alc262_parse_auto_config(codec);
2389 	if (err < 0)
2390 		goto error;
2391 
2392 	if (!spec->gen.no_analog && spec->gen.beep_nid)
2393 		set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2394 
2395 	codec->patch_ops = alc_patch_ops;
2396 	spec->shutup = alc_eapd_shutup;
2397 
2398 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2399 
2400 	return 0;
2401 
2402  error:
2403 	alc_free(codec);
2404 	return err;
2405 }
2406 
2407 /*
2408  *  ALC268
2409  */
2410 /* bind Beep switches of both NID 0x0f and 0x10 */
2411 static const struct hda_bind_ctls alc268_bind_beep_sw = {
2412 	.ops = &snd_hda_bind_sw,
2413 	.values = {
2414 		HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT),
2415 		HDA_COMPOSE_AMP_VAL(0x10, 3, 1, HDA_INPUT),
2416 		0
2417 	},
2418 };
2419 
2420 static const struct snd_kcontrol_new alc268_beep_mixer[] = {
2421 	HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
2422 	HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw),
2423 	{ }
2424 };
2425 
2426 /* set PCBEEP vol = 0, mute connections */
2427 static const struct hda_verb alc268_beep_init_verbs[] = {
2428 	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2429 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2430 	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2431 	{ }
2432 };
2433 
2434 enum {
2435 	ALC268_FIXUP_INV_DMIC,
2436 	ALC268_FIXUP_HP_EAPD,
2437 	ALC268_FIXUP_SPDIF,
2438 };
2439 
2440 static const struct hda_fixup alc268_fixups[] = {
2441 	[ALC268_FIXUP_INV_DMIC] = {
2442 		.type = HDA_FIXUP_FUNC,
2443 		.v.func = alc_fixup_inv_dmic,
2444 	},
2445 	[ALC268_FIXUP_HP_EAPD] = {
2446 		.type = HDA_FIXUP_VERBS,
2447 		.v.verbs = (const struct hda_verb[]) {
2448 			{0x15, AC_VERB_SET_EAPD_BTLENABLE, 0},
2449 			{}
2450 		}
2451 	},
2452 	[ALC268_FIXUP_SPDIF] = {
2453 		.type = HDA_FIXUP_PINS,
2454 		.v.pins = (const struct hda_pintbl[]) {
2455 			{ 0x1e, 0x014b1180 }, /* enable SPDIF out */
2456 			{}
2457 		}
2458 	},
2459 };
2460 
2461 static const struct hda_model_fixup alc268_fixup_models[] = {
2462 	{.id = ALC268_FIXUP_INV_DMIC, .name = "inv-dmic"},
2463 	{.id = ALC268_FIXUP_HP_EAPD, .name = "hp-eapd"},
2464 	{}
2465 };
2466 
2467 static const struct snd_pci_quirk alc268_fixup_tbl[] = {
2468 	SND_PCI_QUIRK(0x1025, 0x0139, "Acer TravelMate 6293", ALC268_FIXUP_SPDIF),
2469 	SND_PCI_QUIRK(0x1025, 0x015b, "Acer AOA 150 (ZG5)", ALC268_FIXUP_INV_DMIC),
2470 	/* below is codec SSID since multiple Toshiba laptops have the
2471 	 * same PCI SSID 1179:ff00
2472 	 */
2473 	SND_PCI_QUIRK(0x1179, 0xff06, "Toshiba P200", ALC268_FIXUP_HP_EAPD),
2474 	{}
2475 };
2476 
2477 /*
2478  * BIOS auto configuration
2479  */
2480 static int alc268_parse_auto_config(struct hda_codec *codec)
2481 {
2482 	static const hda_nid_t alc268_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2483 	return alc_parse_auto_config(codec, NULL, alc268_ssids);
2484 }
2485 
2486 /*
2487  */
2488 static int patch_alc268(struct hda_codec *codec)
2489 {
2490 	struct alc_spec *spec;
2491 	int err;
2492 
2493 	/* ALC268 has no aa-loopback mixer */
2494 	err = alc_alloc_spec(codec, 0);
2495 	if (err < 0)
2496 		return err;
2497 
2498 	spec = codec->spec;
2499 	spec->gen.beep_nid = 0x01;
2500 
2501 	snd_hda_pick_fixup(codec, alc268_fixup_models, alc268_fixup_tbl, alc268_fixups);
2502 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2503 
2504 	/* automatic parse from the BIOS config */
2505 	err = alc268_parse_auto_config(codec);
2506 	if (err < 0)
2507 		goto error;
2508 
2509 	if (err > 0 && !spec->gen.no_analog &&
2510 	    spec->gen.autocfg.speaker_pins[0] != 0x1d) {
2511 		add_mixer(spec, alc268_beep_mixer);
2512 		snd_hda_add_verbs(codec, alc268_beep_init_verbs);
2513 		if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
2514 			/* override the amp caps for beep generator */
2515 			snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
2516 					  (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
2517 					  (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
2518 					  (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
2519 					  (0 << AC_AMPCAP_MUTE_SHIFT));
2520 	}
2521 
2522 	codec->patch_ops = alc_patch_ops;
2523 	spec->shutup = alc_eapd_shutup;
2524 
2525 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2526 
2527 	return 0;
2528 
2529  error:
2530 	alc_free(codec);
2531 	return err;
2532 }
2533 
2534 /*
2535  * ALC269
2536  */
2537 
2538 static int playback_pcm_open(struct hda_pcm_stream *hinfo,
2539 			     struct hda_codec *codec,
2540 			     struct snd_pcm_substream *substream)
2541 {
2542 	struct hda_gen_spec *spec = codec->spec;
2543 	return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
2544 					     hinfo);
2545 }
2546 
2547 static int playback_pcm_prepare(struct hda_pcm_stream *hinfo,
2548 				struct hda_codec *codec,
2549 				unsigned int stream_tag,
2550 				unsigned int format,
2551 				struct snd_pcm_substream *substream)
2552 {
2553 	struct hda_gen_spec *spec = codec->spec;
2554 	return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
2555 						stream_tag, format, substream);
2556 }
2557 
2558 static int playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
2559 				struct hda_codec *codec,
2560 				struct snd_pcm_substream *substream)
2561 {
2562 	struct hda_gen_spec *spec = codec->spec;
2563 	return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
2564 }
2565 
2566 static const struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
2567 	.substreams = 1,
2568 	.channels_min = 2,
2569 	.channels_max = 8,
2570 	.rates = SNDRV_PCM_RATE_44100, /* fixed rate */
2571 	/* NID is set in alc_build_pcms */
2572 	.ops = {
2573 		.open = playback_pcm_open,
2574 		.prepare = playback_pcm_prepare,
2575 		.cleanup = playback_pcm_cleanup
2576 	},
2577 };
2578 
2579 static const struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
2580 	.substreams = 1,
2581 	.channels_min = 2,
2582 	.channels_max = 2,
2583 	.rates = SNDRV_PCM_RATE_44100, /* fixed rate */
2584 	/* NID is set in alc_build_pcms */
2585 };
2586 
2587 /* different alc269-variants */
2588 enum {
2589 	ALC269_TYPE_ALC269VA,
2590 	ALC269_TYPE_ALC269VB,
2591 	ALC269_TYPE_ALC269VC,
2592 	ALC269_TYPE_ALC269VD,
2593 	ALC269_TYPE_ALC280,
2594 	ALC269_TYPE_ALC282,
2595 	ALC269_TYPE_ALC283,
2596 	ALC269_TYPE_ALC284,
2597 	ALC269_TYPE_ALC285,
2598 	ALC269_TYPE_ALC286,
2599 	ALC269_TYPE_ALC255,
2600 };
2601 
2602 /*
2603  * BIOS auto configuration
2604  */
2605 static int alc269_parse_auto_config(struct hda_codec *codec)
2606 {
2607 	static const hda_nid_t alc269_ignore[] = { 0x1d, 0 };
2608 	static const hda_nid_t alc269_ssids[] = { 0, 0x1b, 0x14, 0x21 };
2609 	static const hda_nid_t alc269va_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2610 	struct alc_spec *spec = codec->spec;
2611 	const hda_nid_t *ssids;
2612 
2613 	switch (spec->codec_variant) {
2614 	case ALC269_TYPE_ALC269VA:
2615 	case ALC269_TYPE_ALC269VC:
2616 	case ALC269_TYPE_ALC280:
2617 	case ALC269_TYPE_ALC284:
2618 	case ALC269_TYPE_ALC285:
2619 		ssids = alc269va_ssids;
2620 		break;
2621 	case ALC269_TYPE_ALC269VB:
2622 	case ALC269_TYPE_ALC269VD:
2623 	case ALC269_TYPE_ALC282:
2624 	case ALC269_TYPE_ALC283:
2625 	case ALC269_TYPE_ALC286:
2626 	case ALC269_TYPE_ALC255:
2627 		ssids = alc269_ssids;
2628 		break;
2629 	default:
2630 		ssids = alc269_ssids;
2631 		break;
2632 	}
2633 
2634 	return alc_parse_auto_config(codec, alc269_ignore, ssids);
2635 }
2636 
2637 static int find_ext_mic_pin(struct hda_codec *codec);
2638 
2639 static void alc286_shutup(struct hda_codec *codec)
2640 {
2641 	int i;
2642 	int mic_pin = find_ext_mic_pin(codec);
2643 	/* don't shut up pins when unloading the driver; otherwise it breaks
2644 	 * the default pin setup at the next load of the driver
2645 	 */
2646 	if (codec->bus->shutdown)
2647 		return;
2648 	for (i = 0; i < codec->init_pins.used; i++) {
2649 		struct hda_pincfg *pin = snd_array_elem(&codec->init_pins, i);
2650 		/* use read here for syncing after issuing each verb */
2651 		if (pin->nid != mic_pin)
2652 			snd_hda_codec_read(codec, pin->nid, 0,
2653 					AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
2654 	}
2655 	codec->pins_shutup = 1;
2656 }
2657 
2658 static void alc269vb_toggle_power_output(struct hda_codec *codec, int power_up)
2659 {
2660 	alc_update_coef_idx(codec, 0x04, 1 << 11, power_up ? (1 << 11) : 0);
2661 }
2662 
2663 static void alc269_shutup(struct hda_codec *codec)
2664 {
2665 	struct alc_spec *spec = codec->spec;
2666 
2667 	if (spec->codec_variant == ALC269_TYPE_ALC269VB)
2668 		alc269vb_toggle_power_output(codec, 0);
2669 	if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
2670 			(alc_get_coef0(codec) & 0x00ff) == 0x018) {
2671 		msleep(150);
2672 	}
2673 	snd_hda_shutup_pins(codec);
2674 }
2675 
2676 static struct coef_fw alc282_coefs[] = {
2677 	WRITE_COEF(0x03, 0x0002), /* Power Down Control */
2678 	UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
2679 	WRITE_COEF(0x07, 0x0200), /* DMIC control */
2680 	UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
2681 	UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
2682 	WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
2683 	WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
2684 	WRITE_COEF(0x0e, 0x6e00), /* LDO1/2/3, DAC/ADC */
2685 	UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
2686 	UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
2687 	WRITE_COEF(0x6f, 0x0), /* Class D test 4 */
2688 	UPDATE_COEF(0x0c, 0xfe00, 0), /* IO power down directly */
2689 	WRITE_COEF(0x34, 0xa0c0), /* ANC */
2690 	UPDATE_COEF(0x16, 0x0008, 0), /* AGC MUX */
2691 	UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
2692 	UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
2693 	WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
2694 	WRITE_COEF(0x63, 0x2902), /* PLL */
2695 	WRITE_COEF(0x68, 0xa080), /* capless control 2 */
2696 	WRITE_COEF(0x69, 0x3400), /* capless control 3 */
2697 	WRITE_COEF(0x6a, 0x2f3e), /* capless control 4 */
2698 	WRITE_COEF(0x6b, 0x0), /* capless control 5 */
2699 	UPDATE_COEF(0x6d, 0x0fff, 0x0900), /* class D test 2 */
2700 	WRITE_COEF(0x6e, 0x110a), /* class D test 3 */
2701 	UPDATE_COEF(0x70, 0x00f8, 0x00d8), /* class D test 5 */
2702 	WRITE_COEF(0x71, 0x0014), /* class D test 6 */
2703 	WRITE_COEF(0x72, 0xc2ba), /* classD OCP */
2704 	UPDATE_COEF(0x77, 0x0f80, 0), /* classD pure DC test */
2705 	WRITE_COEF(0x6c, 0xfc06), /* Class D amp control */
2706 	{}
2707 };
2708 
2709 static void alc282_restore_default_value(struct hda_codec *codec)
2710 {
2711 	alc_process_coef_fw(codec, alc282_coefs);
2712 }
2713 
2714 static void alc282_init(struct hda_codec *codec)
2715 {
2716 	struct alc_spec *spec = codec->spec;
2717 	hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
2718 	bool hp_pin_sense;
2719 	int coef78;
2720 
2721 	alc282_restore_default_value(codec);
2722 
2723 	if (!hp_pin)
2724 		return;
2725 	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
2726 	coef78 = alc_read_coef_idx(codec, 0x78);
2727 
2728 	/* Index 0x78 Direct Drive HP AMP LPM Control 1 */
2729 	/* Headphone capless set to high power mode */
2730 	alc_write_coef_idx(codec, 0x78, 0x9004);
2731 
2732 	if (hp_pin_sense)
2733 		msleep(2);
2734 
2735 	snd_hda_codec_write(codec, hp_pin, 0,
2736 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
2737 
2738 	if (hp_pin_sense)
2739 		msleep(85);
2740 
2741 	snd_hda_codec_write(codec, hp_pin, 0,
2742 			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
2743 
2744 	if (hp_pin_sense)
2745 		msleep(100);
2746 
2747 	/* Headphone capless set to normal mode */
2748 	alc_write_coef_idx(codec, 0x78, coef78);
2749 }
2750 
2751 static void alc282_shutup(struct hda_codec *codec)
2752 {
2753 	struct alc_spec *spec = codec->spec;
2754 	hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
2755 	bool hp_pin_sense;
2756 	int coef78;
2757 
2758 	if (!hp_pin) {
2759 		alc269_shutup(codec);
2760 		return;
2761 	}
2762 
2763 	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
2764 	coef78 = alc_read_coef_idx(codec, 0x78);
2765 	alc_write_coef_idx(codec, 0x78, 0x9004);
2766 
2767 	if (hp_pin_sense)
2768 		msleep(2);
2769 
2770 	snd_hda_codec_write(codec, hp_pin, 0,
2771 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
2772 
2773 	if (hp_pin_sense)
2774 		msleep(85);
2775 
2776 	snd_hda_codec_write(codec, hp_pin, 0,
2777 			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
2778 
2779 	if (hp_pin_sense)
2780 		msleep(100);
2781 
2782 	alc_auto_setup_eapd(codec, false);
2783 	snd_hda_shutup_pins(codec);
2784 	alc_write_coef_idx(codec, 0x78, coef78);
2785 }
2786 
2787 static struct coef_fw alc283_coefs[] = {
2788 	WRITE_COEF(0x03, 0x0002), /* Power Down Control */
2789 	UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
2790 	WRITE_COEF(0x07, 0x0200), /* DMIC control */
2791 	UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
2792 	UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
2793 	WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
2794 	WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
2795 	WRITE_COEF(0x0e, 0x6fc0), /* LDO1/2/3, DAC/ADC */
2796 	UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
2797 	UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
2798 	WRITE_COEF(0x3a, 0x0), /* Class D test 4 */
2799 	UPDATE_COEF(0x0c, 0xfe00, 0x0), /* IO power down directly */
2800 	WRITE_COEF(0x22, 0xa0c0), /* ANC */
2801 	UPDATE_COEFEX(0x53, 0x01, 0x000f, 0x0008), /* AGC MUX */
2802 	UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
2803 	UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
2804 	WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
2805 	WRITE_COEF(0x2e, 0x2902), /* PLL */
2806 	WRITE_COEF(0x33, 0xa080), /* capless control 2 */
2807 	WRITE_COEF(0x34, 0x3400), /* capless control 3 */
2808 	WRITE_COEF(0x35, 0x2f3e), /* capless control 4 */
2809 	WRITE_COEF(0x36, 0x0), /* capless control 5 */
2810 	UPDATE_COEF(0x38, 0x0fff, 0x0900), /* class D test 2 */
2811 	WRITE_COEF(0x39, 0x110a), /* class D test 3 */
2812 	UPDATE_COEF(0x3b, 0x00f8, 0x00d8), /* class D test 5 */
2813 	WRITE_COEF(0x3c, 0x0014), /* class D test 6 */
2814 	WRITE_COEF(0x3d, 0xc2ba), /* classD OCP */
2815 	UPDATE_COEF(0x42, 0x0f80, 0x0), /* classD pure DC test */
2816 	WRITE_COEF(0x49, 0x0), /* test mode */
2817 	UPDATE_COEF(0x40, 0xf800, 0x9800), /* Class D DC enable */
2818 	UPDATE_COEF(0x42, 0xf000, 0x2000), /* DC offset */
2819 	WRITE_COEF(0x37, 0xfc06), /* Class D amp control */
2820 	UPDATE_COEF(0x1b, 0x8000, 0), /* HP JD control */
2821 	{}
2822 };
2823 
2824 static void alc283_restore_default_value(struct hda_codec *codec)
2825 {
2826 	alc_process_coef_fw(codec, alc283_coefs);
2827 }
2828 
2829 static void alc283_init(struct hda_codec *codec)
2830 {
2831 	struct alc_spec *spec = codec->spec;
2832 	hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
2833 	bool hp_pin_sense;
2834 
2835 	if (!spec->gen.autocfg.hp_outs) {
2836 		if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
2837 			hp_pin = spec->gen.autocfg.line_out_pins[0];
2838 	}
2839 
2840 	alc283_restore_default_value(codec);
2841 
2842 	if (!hp_pin)
2843 		return;
2844 	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
2845 
2846 	/* Index 0x43 Direct Drive HP AMP LPM Control 1 */
2847 	/* Headphone capless set to high power mode */
2848 	alc_write_coef_idx(codec, 0x43, 0x9004);
2849 
2850 	snd_hda_codec_write(codec, hp_pin, 0,
2851 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
2852 
2853 	if (hp_pin_sense)
2854 		msleep(85);
2855 
2856 	snd_hda_codec_write(codec, hp_pin, 0,
2857 			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
2858 
2859 	if (hp_pin_sense)
2860 		msleep(85);
2861 	/* Index 0x46 Combo jack auto switch control 2 */
2862 	/* 3k pull low control for Headset jack. */
2863 	alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
2864 	/* Headphone capless set to normal mode */
2865 	alc_write_coef_idx(codec, 0x43, 0x9614);
2866 }
2867 
2868 static void alc283_shutup(struct hda_codec *codec)
2869 {
2870 	struct alc_spec *spec = codec->spec;
2871 	hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
2872 	bool hp_pin_sense;
2873 
2874 	if (!spec->gen.autocfg.hp_outs) {
2875 		if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
2876 			hp_pin = spec->gen.autocfg.line_out_pins[0];
2877 	}
2878 
2879 	if (!hp_pin) {
2880 		alc269_shutup(codec);
2881 		return;
2882 	}
2883 
2884 	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
2885 
2886 	alc_write_coef_idx(codec, 0x43, 0x9004);
2887 
2888 	/*depop hp during suspend*/
2889 	alc_write_coef_idx(codec, 0x06, 0x2100);
2890 
2891 	snd_hda_codec_write(codec, hp_pin, 0,
2892 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
2893 
2894 	if (hp_pin_sense)
2895 		msleep(100);
2896 
2897 	snd_hda_codec_write(codec, hp_pin, 0,
2898 			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
2899 
2900 	alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
2901 
2902 	if (hp_pin_sense)
2903 		msleep(100);
2904 	alc_auto_setup_eapd(codec, false);
2905 	snd_hda_shutup_pins(codec);
2906 	alc_write_coef_idx(codec, 0x43, 0x9614);
2907 }
2908 
2909 static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg,
2910 			     unsigned int val)
2911 {
2912 	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
2913 	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val & 0xffff); /* LSB */
2914 	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val >> 16); /* MSB */
2915 }
2916 
2917 static int alc5505_coef_get(struct hda_codec *codec, unsigned int index_reg)
2918 {
2919 	unsigned int val;
2920 
2921 	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
2922 	val = snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
2923 		& 0xffff;
2924 	val |= snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
2925 		<< 16;
2926 	return val;
2927 }
2928 
2929 static void alc5505_dsp_halt(struct hda_codec *codec)
2930 {
2931 	unsigned int val;
2932 
2933 	alc5505_coef_set(codec, 0x3000, 0x000c); /* DSP CPU stop */
2934 	alc5505_coef_set(codec, 0x880c, 0x0008); /* DDR enter self refresh */
2935 	alc5505_coef_set(codec, 0x61c0, 0x11110080); /* Clock control for PLL and CPU */
2936 	alc5505_coef_set(codec, 0x6230, 0xfc0d4011); /* Disable Input OP */
2937 	alc5505_coef_set(codec, 0x61b4, 0x040a2b03); /* Stop PLL2 */
2938 	alc5505_coef_set(codec, 0x61b0, 0x00005b17); /* Stop PLL1 */
2939 	alc5505_coef_set(codec, 0x61b8, 0x04133303); /* Stop PLL3 */
2940 	val = alc5505_coef_get(codec, 0x6220);
2941 	alc5505_coef_set(codec, 0x6220, (val | 0x3000)); /* switch Ringbuffer clock to DBUS clock */
2942 }
2943 
2944 static void alc5505_dsp_back_from_halt(struct hda_codec *codec)
2945 {
2946 	alc5505_coef_set(codec, 0x61b8, 0x04133302);
2947 	alc5505_coef_set(codec, 0x61b0, 0x00005b16);
2948 	alc5505_coef_set(codec, 0x61b4, 0x040a2b02);
2949 	alc5505_coef_set(codec, 0x6230, 0xf80d4011);
2950 	alc5505_coef_set(codec, 0x6220, 0x2002010f);
2951 	alc5505_coef_set(codec, 0x880c, 0x00000004);
2952 }
2953 
2954 static void alc5505_dsp_init(struct hda_codec *codec)
2955 {
2956 	unsigned int val;
2957 
2958 	alc5505_dsp_halt(codec);
2959 	alc5505_dsp_back_from_halt(codec);
2960 	alc5505_coef_set(codec, 0x61b0, 0x5b14); /* PLL1 control */
2961 	alc5505_coef_set(codec, 0x61b0, 0x5b16);
2962 	alc5505_coef_set(codec, 0x61b4, 0x04132b00); /* PLL2 control */
2963 	alc5505_coef_set(codec, 0x61b4, 0x04132b02);
2964 	alc5505_coef_set(codec, 0x61b8, 0x041f3300); /* PLL3 control*/
2965 	alc5505_coef_set(codec, 0x61b8, 0x041f3302);
2966 	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_CODEC_RESET, 0); /* Function reset */
2967 	alc5505_coef_set(codec, 0x61b8, 0x041b3302);
2968 	alc5505_coef_set(codec, 0x61b8, 0x04173302);
2969 	alc5505_coef_set(codec, 0x61b8, 0x04163302);
2970 	alc5505_coef_set(codec, 0x8800, 0x348b328b); /* DRAM control */
2971 	alc5505_coef_set(codec, 0x8808, 0x00020022); /* DRAM control */
2972 	alc5505_coef_set(codec, 0x8818, 0x00000400); /* DRAM control */
2973 
2974 	val = alc5505_coef_get(codec, 0x6200) >> 16; /* Read revision ID */
2975 	if (val <= 3)
2976 		alc5505_coef_set(codec, 0x6220, 0x2002010f); /* I/O PAD Configuration */
2977 	else
2978 		alc5505_coef_set(codec, 0x6220, 0x6002018f);
2979 
2980 	alc5505_coef_set(codec, 0x61ac, 0x055525f0); /**/
2981 	alc5505_coef_set(codec, 0x61c0, 0x12230080); /* Clock control */
2982 	alc5505_coef_set(codec, 0x61b4, 0x040e2b02); /* PLL2 control */
2983 	alc5505_coef_set(codec, 0x61bc, 0x010234f8); /* OSC Control */
2984 	alc5505_coef_set(codec, 0x880c, 0x00000004); /* DRAM Function control */
2985 	alc5505_coef_set(codec, 0x880c, 0x00000003);
2986 	alc5505_coef_set(codec, 0x880c, 0x00000010);
2987 
2988 #ifdef HALT_REALTEK_ALC5505
2989 	alc5505_dsp_halt(codec);
2990 #endif
2991 }
2992 
2993 #ifdef HALT_REALTEK_ALC5505
2994 #define alc5505_dsp_suspend(codec)	/* NOP */
2995 #define alc5505_dsp_resume(codec)	/* NOP */
2996 #else
2997 #define alc5505_dsp_suspend(codec)	alc5505_dsp_halt(codec)
2998 #define alc5505_dsp_resume(codec)	alc5505_dsp_back_from_halt(codec)
2999 #endif
3000 
3001 #ifdef CONFIG_PM
3002 static int alc269_suspend(struct hda_codec *codec)
3003 {
3004 	struct alc_spec *spec = codec->spec;
3005 
3006 	if (spec->has_alc5505_dsp)
3007 		alc5505_dsp_suspend(codec);
3008 	return alc_suspend(codec);
3009 }
3010 
3011 static int alc269_resume(struct hda_codec *codec)
3012 {
3013 	struct alc_spec *spec = codec->spec;
3014 
3015 	if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3016 		alc269vb_toggle_power_output(codec, 0);
3017 	if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
3018 			(alc_get_coef0(codec) & 0x00ff) == 0x018) {
3019 		msleep(150);
3020 	}
3021 
3022 	codec->patch_ops.init(codec);
3023 
3024 	if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3025 		alc269vb_toggle_power_output(codec, 1);
3026 	if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
3027 			(alc_get_coef0(codec) & 0x00ff) == 0x017) {
3028 		msleep(200);
3029 	}
3030 
3031 	snd_hda_codec_resume_amp(codec);
3032 	snd_hda_codec_resume_cache(codec);
3033 	hda_call_check_power_status(codec, 0x01);
3034 
3035 	/* on some machine, the BIOS will clear the codec gpio data when enter
3036 	 * suspend, and won't restore the data after resume, so we restore it
3037 	 * in the driver.
3038 	 */
3039 	if (spec->gpio_led)
3040 		snd_hda_codec_write(codec, codec->afg, 0, AC_VERB_SET_GPIO_DATA,
3041 			    spec->gpio_led);
3042 
3043 	if (spec->has_alc5505_dsp)
3044 		alc5505_dsp_resume(codec);
3045 
3046 	return 0;
3047 }
3048 #endif /* CONFIG_PM */
3049 
3050 static void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec,
3051 						 const struct hda_fixup *fix, int action)
3052 {
3053 	struct alc_spec *spec = codec->spec;
3054 
3055 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
3056 		spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
3057 }
3058 
3059 static void alc269_fixup_hweq(struct hda_codec *codec,
3060 			       const struct hda_fixup *fix, int action)
3061 {
3062 	if (action == HDA_FIXUP_ACT_INIT)
3063 		alc_update_coef_idx(codec, 0x1e, 0, 0x80);
3064 }
3065 
3066 static void alc269_fixup_headset_mic(struct hda_codec *codec,
3067 				       const struct hda_fixup *fix, int action)
3068 {
3069 	struct alc_spec *spec = codec->spec;
3070 
3071 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
3072 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
3073 }
3074 
3075 static void alc271_fixup_dmic(struct hda_codec *codec,
3076 			      const struct hda_fixup *fix, int action)
3077 {
3078 	static const struct hda_verb verbs[] = {
3079 		{0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
3080 		{0x20, AC_VERB_SET_PROC_COEF, 0x4000},
3081 		{}
3082 	};
3083 	unsigned int cfg;
3084 
3085 	if (strcmp(codec->chip_name, "ALC271X") &&
3086 	    strcmp(codec->chip_name, "ALC269VB"))
3087 		return;
3088 	cfg = snd_hda_codec_get_pincfg(codec, 0x12);
3089 	if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED)
3090 		snd_hda_sequence_write(codec, verbs);
3091 }
3092 
3093 static void alc269_fixup_pcm_44k(struct hda_codec *codec,
3094 				 const struct hda_fixup *fix, int action)
3095 {
3096 	struct alc_spec *spec = codec->spec;
3097 
3098 	if (action != HDA_FIXUP_ACT_PROBE)
3099 		return;
3100 
3101 	/* Due to a hardware problem on Lenovo Ideadpad, we need to
3102 	 * fix the sample rate of analog I/O to 44.1kHz
3103 	 */
3104 	spec->gen.stream_analog_playback = &alc269_44k_pcm_analog_playback;
3105 	spec->gen.stream_analog_capture = &alc269_44k_pcm_analog_capture;
3106 }
3107 
3108 static void alc269_fixup_stereo_dmic(struct hda_codec *codec,
3109 				     const struct hda_fixup *fix, int action)
3110 {
3111 	/* The digital-mic unit sends PDM (differential signal) instead of
3112 	 * the standard PCM, thus you can't record a valid mono stream as is.
3113 	 * Below is a workaround specific to ALC269 to control the dmic
3114 	 * signal source as mono.
3115 	 */
3116 	if (action == HDA_FIXUP_ACT_INIT)
3117 		alc_update_coef_idx(codec, 0x07, 0, 0x80);
3118 }
3119 
3120 static void alc269_quanta_automute(struct hda_codec *codec)
3121 {
3122 	snd_hda_gen_update_outputs(codec);
3123 
3124 	alc_write_coef_idx(codec, 0x0c, 0x680);
3125 	alc_write_coef_idx(codec, 0x0c, 0x480);
3126 }
3127 
3128 static void alc269_fixup_quanta_mute(struct hda_codec *codec,
3129 				     const struct hda_fixup *fix, int action)
3130 {
3131 	struct alc_spec *spec = codec->spec;
3132 	if (action != HDA_FIXUP_ACT_PROBE)
3133 		return;
3134 	spec->gen.automute_hook = alc269_quanta_automute;
3135 }
3136 
3137 static void alc269_x101_hp_automute_hook(struct hda_codec *codec,
3138 					 struct hda_jack_callback *jack)
3139 {
3140 	struct alc_spec *spec = codec->spec;
3141 	int vref;
3142 	msleep(200);
3143 	snd_hda_gen_hp_automute(codec, jack);
3144 
3145 	vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
3146 	msleep(100);
3147 	snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
3148 			    vref);
3149 	msleep(500);
3150 	snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
3151 			    vref);
3152 }
3153 
3154 static void alc269_fixup_x101_headset_mic(struct hda_codec *codec,
3155 				     const struct hda_fixup *fix, int action)
3156 {
3157 	struct alc_spec *spec = codec->spec;
3158 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3159 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
3160 		spec->gen.hp_automute_hook = alc269_x101_hp_automute_hook;
3161 	}
3162 }
3163 
3164 
3165 /* update mute-LED according to the speaker mute state via mic VREF pin */
3166 static void alc269_fixup_mic_mute_hook(void *private_data, int enabled)
3167 {
3168 	struct hda_codec *codec = private_data;
3169 	struct alc_spec *spec = codec->spec;
3170 	unsigned int pinval;
3171 
3172 	if (spec->mute_led_polarity)
3173 		enabled = !enabled;
3174 	pinval = snd_hda_codec_get_pin_target(codec, spec->mute_led_nid);
3175 	pinval &= ~AC_PINCTL_VREFEN;
3176 	pinval |= enabled ? AC_PINCTL_VREF_HIZ : AC_PINCTL_VREF_80;
3177 	if (spec->mute_led_nid)
3178 		snd_hda_set_pin_ctl_cache(codec, spec->mute_led_nid, pinval);
3179 }
3180 
3181 /* Make sure the led works even in runtime suspend */
3182 static unsigned int led_power_filter(struct hda_codec *codec,
3183 						  hda_nid_t nid,
3184 						  unsigned int power_state)
3185 {
3186 	struct alc_spec *spec = codec->spec;
3187 
3188 	if (power_state != AC_PWRST_D3 || nid == 0 ||
3189 	    (nid != spec->mute_led_nid && nid != spec->cap_mute_led_nid))
3190 		return power_state;
3191 
3192 	/* Set pin ctl again, it might have just been set to 0 */
3193 	snd_hda_set_pin_ctl(codec, nid,
3194 			    snd_hda_codec_get_pin_target(codec, nid));
3195 
3196 	return AC_PWRST_D0;
3197 }
3198 
3199 static void alc269_fixup_hp_mute_led(struct hda_codec *codec,
3200 				     const struct hda_fixup *fix, int action)
3201 {
3202 	struct alc_spec *spec = codec->spec;
3203 	const struct dmi_device *dev = NULL;
3204 
3205 	if (action != HDA_FIXUP_ACT_PRE_PROBE)
3206 		return;
3207 
3208 	while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) {
3209 		int pol, pin;
3210 		if (sscanf(dev->name, "HP_Mute_LED_%d_%x", &pol, &pin) != 2)
3211 			continue;
3212 		if (pin < 0x0a || pin >= 0x10)
3213 			break;
3214 		spec->mute_led_polarity = pol;
3215 		spec->mute_led_nid = pin - 0x0a + 0x18;
3216 		spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook;
3217 		spec->gen.vmaster_mute_enum = 1;
3218 		codec->power_filter = led_power_filter;
3219 		codec_dbg(codec,
3220 			  "Detected mute LED for %x:%d\n", spec->mute_led_nid,
3221 			   spec->mute_led_polarity);
3222 		break;
3223 	}
3224 }
3225 
3226 static void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec,
3227 				const struct hda_fixup *fix, int action)
3228 {
3229 	struct alc_spec *spec = codec->spec;
3230 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3231 		spec->mute_led_polarity = 0;
3232 		spec->mute_led_nid = 0x18;
3233 		spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook;
3234 		spec->gen.vmaster_mute_enum = 1;
3235 		codec->power_filter = led_power_filter;
3236 	}
3237 }
3238 
3239 static void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec,
3240 				const struct hda_fixup *fix, int action)
3241 {
3242 	struct alc_spec *spec = codec->spec;
3243 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3244 		spec->mute_led_polarity = 0;
3245 		spec->mute_led_nid = 0x19;
3246 		spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook;
3247 		spec->gen.vmaster_mute_enum = 1;
3248 		codec->power_filter = led_power_filter;
3249 	}
3250 }
3251 
3252 /* turn on/off mute LED per vmaster hook */
3253 static void alc269_fixup_hp_gpio_mute_hook(void *private_data, int enabled)
3254 {
3255 	struct hda_codec *codec = private_data;
3256 	struct alc_spec *spec = codec->spec;
3257 	unsigned int oldval = spec->gpio_led;
3258 
3259 	if (enabled)
3260 		spec->gpio_led &= ~0x08;
3261 	else
3262 		spec->gpio_led |= 0x08;
3263 	if (spec->gpio_led != oldval)
3264 		snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
3265 				    spec->gpio_led);
3266 }
3267 
3268 /* turn on/off mic-mute LED per capture hook */
3269 static void alc269_fixup_hp_gpio_mic_mute_hook(struct hda_codec *codec,
3270 					       struct snd_kcontrol *kcontrol,
3271 					       struct snd_ctl_elem_value *ucontrol)
3272 {
3273 	struct alc_spec *spec = codec->spec;
3274 	unsigned int oldval = spec->gpio_led;
3275 
3276 	if (!ucontrol)
3277 		return;
3278 
3279 	if (ucontrol->value.integer.value[0] ||
3280 	    ucontrol->value.integer.value[1])
3281 		spec->gpio_led &= ~0x10;
3282 	else
3283 		spec->gpio_led |= 0x10;
3284 	if (spec->gpio_led != oldval)
3285 		snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
3286 				    spec->gpio_led);
3287 }
3288 
3289 static void alc269_fixup_hp_gpio_led(struct hda_codec *codec,
3290 				const struct hda_fixup *fix, int action)
3291 {
3292 	struct alc_spec *spec = codec->spec;
3293 	static const struct hda_verb gpio_init[] = {
3294 		{ 0x01, AC_VERB_SET_GPIO_MASK, 0x18 },
3295 		{ 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x18 },
3296 		{}
3297 	};
3298 
3299 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3300 		spec->gen.vmaster_mute.hook = alc269_fixup_hp_gpio_mute_hook;
3301 		spec->gen.cap_sync_hook = alc269_fixup_hp_gpio_mic_mute_hook;
3302 		spec->gpio_led = 0;
3303 		snd_hda_add_verbs(codec, gpio_init);
3304 	}
3305 }
3306 
3307 /* turn on/off mic-mute LED per capture hook */
3308 static void alc269_fixup_hp_cap_mic_mute_hook(struct hda_codec *codec,
3309 					       struct snd_kcontrol *kcontrol,
3310 					       struct snd_ctl_elem_value *ucontrol)
3311 {
3312 	struct alc_spec *spec = codec->spec;
3313 	unsigned int pinval, enable, disable;
3314 
3315 	pinval = snd_hda_codec_get_pin_target(codec, spec->cap_mute_led_nid);
3316 	pinval &= ~AC_PINCTL_VREFEN;
3317 	enable  = pinval | AC_PINCTL_VREF_80;
3318 	disable = pinval | AC_PINCTL_VREF_HIZ;
3319 
3320 	if (!ucontrol)
3321 		return;
3322 
3323 	if (ucontrol->value.integer.value[0] ||
3324 	    ucontrol->value.integer.value[1])
3325 		pinval = disable;
3326 	else
3327 		pinval = enable;
3328 
3329 	if (spec->cap_mute_led_nid)
3330 		snd_hda_set_pin_ctl_cache(codec, spec->cap_mute_led_nid, pinval);
3331 }
3332 
3333 static void alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec,
3334 				const struct hda_fixup *fix, int action)
3335 {
3336 	struct alc_spec *spec = codec->spec;
3337 	static const struct hda_verb gpio_init[] = {
3338 		{ 0x01, AC_VERB_SET_GPIO_MASK, 0x08 },
3339 		{ 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x08 },
3340 		{}
3341 	};
3342 
3343 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3344 		spec->gen.vmaster_mute.hook = alc269_fixup_hp_gpio_mute_hook;
3345 		spec->gen.cap_sync_hook = alc269_fixup_hp_cap_mic_mute_hook;
3346 		spec->gpio_led = 0;
3347 		spec->cap_mute_led_nid = 0x18;
3348 		snd_hda_add_verbs(codec, gpio_init);
3349 		codec->power_filter = led_power_filter;
3350 	}
3351 }
3352 
3353 static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec,
3354 				const struct hda_fixup *fix, int action)
3355 {
3356 	struct alc_spec *spec = codec->spec;
3357 
3358 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3359 		spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook;
3360 		spec->gen.cap_sync_hook = alc269_fixup_hp_cap_mic_mute_hook;
3361 		spec->mute_led_polarity = 0;
3362 		spec->mute_led_nid = 0x1a;
3363 		spec->cap_mute_led_nid = 0x18;
3364 		spec->gen.vmaster_mute_enum = 1;
3365 		codec->power_filter = led_power_filter;
3366 	}
3367 }
3368 
3369 static void alc_headset_mode_unplugged(struct hda_codec *codec)
3370 {
3371 	static struct coef_fw coef0255[] = {
3372 		WRITE_COEF(0x1b, 0x0c0b), /* LDO and MISC control */
3373 		WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
3374 		UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
3375 		WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
3376 		WRITE_COEFEX(0x57, 0x03, 0x8aa6), /* Direct Drive HP Amp control */
3377 		{}
3378 	};
3379 	static struct coef_fw coef0233[] = {
3380 		WRITE_COEF(0x1b, 0x0c0b),
3381 		WRITE_COEF(0x45, 0xc429),
3382 		UPDATE_COEF(0x35, 0x4000, 0),
3383 		WRITE_COEF(0x06, 0x2104),
3384 		WRITE_COEF(0x1a, 0x0001),
3385 		WRITE_COEF(0x26, 0x0004),
3386 		WRITE_COEF(0x32, 0x42a3),
3387 		{}
3388 	};
3389 	static struct coef_fw coef0292[] = {
3390 		WRITE_COEF(0x76, 0x000e),
3391 		WRITE_COEF(0x6c, 0x2400),
3392 		WRITE_COEF(0x18, 0x7308),
3393 		WRITE_COEF(0x6b, 0xc429),
3394 		{}
3395 	};
3396 	static struct coef_fw coef0293[] = {
3397 		UPDATE_COEF(0x10, 7<<8, 6<<8), /* SET Line1 JD to 0 */
3398 		UPDATE_COEFEX(0x57, 0x05, 1<<15|1<<13, 0x0), /* SET charge pump by verb */
3399 		UPDATE_COEFEX(0x57, 0x03, 1<<10, 1<<10), /* SET EN_OSW to 1 */
3400 		UPDATE_COEF(0x1a, 1<<3, 1<<3), /* Combo JD gating with LINE1-VREFO */
3401 		WRITE_COEF(0x45, 0xc429), /* Set to TRS type */
3402 		UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
3403 		{}
3404 	};
3405 	static struct coef_fw coef0668[] = {
3406 		WRITE_COEF(0x15, 0x0d40),
3407 		WRITE_COEF(0xb7, 0x802b),
3408 		{}
3409 	};
3410 
3411 	switch (codec->vendor_id) {
3412 	case 0x10ec0255:
3413 		alc_process_coef_fw(codec, coef0255);
3414 		break;
3415 	case 0x10ec0233:
3416 	case 0x10ec0283:
3417 		alc_process_coef_fw(codec, coef0233);
3418 		break;
3419 	case 0x10ec0292:
3420 		alc_process_coef_fw(codec, coef0292);
3421 		break;
3422 	case 0x10ec0293:
3423 		alc_process_coef_fw(codec, coef0293);
3424 		break;
3425 	case 0x10ec0668:
3426 		alc_process_coef_fw(codec, coef0668);
3427 		break;
3428 	}
3429 	codec_dbg(codec, "Headset jack set to unplugged mode.\n");
3430 }
3431 
3432 
3433 static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
3434 				    hda_nid_t mic_pin)
3435 {
3436 	static struct coef_fw coef0255[] = {
3437 		WRITE_COEFEX(0x57, 0x03, 0x8aa6),
3438 		WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
3439 		{}
3440 	};
3441 	static struct coef_fw coef0233[] = {
3442 		UPDATE_COEF(0x35, 0, 1<<14),
3443 		WRITE_COEF(0x06, 0x2100),
3444 		WRITE_COEF(0x1a, 0x0021),
3445 		WRITE_COEF(0x26, 0x008c),
3446 		{}
3447 	};
3448 	static struct coef_fw coef0292[] = {
3449 		WRITE_COEF(0x19, 0xa208),
3450 		WRITE_COEF(0x2e, 0xacf0),
3451 		{}
3452 	};
3453 	static struct coef_fw coef0293[] = {
3454 		UPDATE_COEFEX(0x57, 0x05, 0, 1<<15|1<<13), /* SET charge pump by verb */
3455 		UPDATE_COEFEX(0x57, 0x03, 1<<10, 0), /* SET EN_OSW to 0 */
3456 		UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
3457 		{}
3458 	};
3459 	static struct coef_fw coef0688[] = {
3460 		WRITE_COEF(0xb7, 0x802b),
3461 		WRITE_COEF(0xb5, 0x1040),
3462 		UPDATE_COEF(0xc3, 0, 1<<12),
3463 		{}
3464 	};
3465 
3466 	switch (codec->vendor_id) {
3467 	case 0x10ec0255:
3468 		alc_write_coef_idx(codec, 0x45, 0xc489);
3469 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
3470 		alc_process_coef_fw(codec, coef0255);
3471 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
3472 		break;
3473 	case 0x10ec0233:
3474 	case 0x10ec0283:
3475 		alc_write_coef_idx(codec, 0x45, 0xc429);
3476 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
3477 		alc_process_coef_fw(codec, coef0233);
3478 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
3479 		break;
3480 	case 0x10ec0292:
3481 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
3482 		alc_process_coef_fw(codec, coef0292);
3483 		break;
3484 	case 0x10ec0293:
3485 		/* Set to TRS mode */
3486 		alc_write_coef_idx(codec, 0x45, 0xc429);
3487 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
3488 		alc_process_coef_fw(codec, coef0293);
3489 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
3490 		break;
3491 	case 0x10ec0668:
3492 		alc_write_coef_idx(codec, 0x11, 0x0001);
3493 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
3494 		alc_process_coef_fw(codec, coef0688);
3495 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
3496 		break;
3497 	}
3498 	codec_dbg(codec, "Headset jack set to mic-in mode.\n");
3499 }
3500 
3501 static void alc_headset_mode_default(struct hda_codec *codec)
3502 {
3503 	static struct coef_fw coef0255[] = {
3504 		WRITE_COEF(0x45, 0xc089),
3505 		WRITE_COEF(0x45, 0xc489),
3506 		WRITE_COEFEX(0x57, 0x03, 0x8ea6),
3507 		WRITE_COEF(0x49, 0x0049),
3508 		{}
3509 	};
3510 	static struct coef_fw coef0233[] = {
3511 		WRITE_COEF(0x06, 0x2100),
3512 		WRITE_COEF(0x32, 0x4ea3),
3513 		{}
3514 	};
3515 	static struct coef_fw coef0292[] = {
3516 		WRITE_COEF(0x76, 0x000e),
3517 		WRITE_COEF(0x6c, 0x2400),
3518 		WRITE_COEF(0x6b, 0xc429),
3519 		WRITE_COEF(0x18, 0x7308),
3520 		{}
3521 	};
3522 	static struct coef_fw coef0293[] = {
3523 		UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
3524 		WRITE_COEF(0x45, 0xC429), /* Set to TRS type */
3525 		UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
3526 		{}
3527 	};
3528 	static struct coef_fw coef0688[] = {
3529 		WRITE_COEF(0x11, 0x0041),
3530 		WRITE_COEF(0x15, 0x0d40),
3531 		WRITE_COEF(0xb7, 0x802b),
3532 		{}
3533 	};
3534 
3535 	switch (codec->vendor_id) {
3536 	case 0x10ec0255:
3537 		alc_process_coef_fw(codec, coef0255);
3538 		break;
3539 	case 0x10ec0233:
3540 	case 0x10ec0283:
3541 		alc_process_coef_fw(codec, coef0233);
3542 		break;
3543 	case 0x10ec0292:
3544 		alc_process_coef_fw(codec, coef0292);
3545 		break;
3546 	case 0x10ec0293:
3547 		alc_process_coef_fw(codec, coef0293);
3548 		break;
3549 	case 0x10ec0668:
3550 		alc_process_coef_fw(codec, coef0688);
3551 		break;
3552 	}
3553 	codec_dbg(codec, "Headset jack set to headphone (default) mode.\n");
3554 }
3555 
3556 /* Iphone type */
3557 static void alc_headset_mode_ctia(struct hda_codec *codec)
3558 {
3559 	static struct coef_fw coef0255[] = {
3560 		WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
3561 		WRITE_COEF(0x1b, 0x0c2b),
3562 		WRITE_COEFEX(0x57, 0x03, 0x8ea6),
3563 		{}
3564 	};
3565 	static struct coef_fw coef0233[] = {
3566 		WRITE_COEF(0x45, 0xd429),
3567 		WRITE_COEF(0x1b, 0x0c2b),
3568 		WRITE_COEF(0x32, 0x4ea3),
3569 		{}
3570 	};
3571 	static struct coef_fw coef0292[] = {
3572 		WRITE_COEF(0x6b, 0xd429),
3573 		WRITE_COEF(0x76, 0x0008),
3574 		WRITE_COEF(0x18, 0x7388),
3575 		{}
3576 	};
3577 	static struct coef_fw coef0293[] = {
3578 		WRITE_COEF(0x45, 0xd429), /* Set to ctia type */
3579 		UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
3580 		{}
3581 	};
3582 	static struct coef_fw coef0688[] = {
3583 		WRITE_COEF(0x11, 0x0001),
3584 		WRITE_COEF(0x15, 0x0d60),
3585 		WRITE_COEF(0xc3, 0x0000),
3586 		{}
3587 	};
3588 
3589 	switch (codec->vendor_id) {
3590 	case 0x10ec0255:
3591 		alc_process_coef_fw(codec, coef0255);
3592 		break;
3593 	case 0x10ec0233:
3594 	case 0x10ec0283:
3595 		alc_process_coef_fw(codec, coef0233);
3596 		break;
3597 	case 0x10ec0292:
3598 		alc_process_coef_fw(codec, coef0292);
3599 		break;
3600 	case 0x10ec0293:
3601 		alc_process_coef_fw(codec, coef0293);
3602 		break;
3603 	case 0x10ec0668:
3604 		alc_process_coef_fw(codec, coef0688);
3605 		break;
3606 	}
3607 	codec_dbg(codec, "Headset jack set to iPhone-style headset mode.\n");
3608 }
3609 
3610 /* Nokia type */
3611 static void alc_headset_mode_omtp(struct hda_codec *codec)
3612 {
3613 	static struct coef_fw coef0255[] = {
3614 		WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
3615 		WRITE_COEF(0x1b, 0x0c2b),
3616 		WRITE_COEFEX(0x57, 0x03, 0x8ea6),
3617 		{}
3618 	};
3619 	static struct coef_fw coef0233[] = {
3620 		WRITE_COEF(0x45, 0xe429),
3621 		WRITE_COEF(0x1b, 0x0c2b),
3622 		WRITE_COEF(0x32, 0x4ea3),
3623 		{}
3624 	};
3625 	static struct coef_fw coef0292[] = {
3626 		WRITE_COEF(0x6b, 0xe429),
3627 		WRITE_COEF(0x76, 0x0008),
3628 		WRITE_COEF(0x18, 0x7388),
3629 		{}
3630 	};
3631 	static struct coef_fw coef0293[] = {
3632 		WRITE_COEF(0x45, 0xe429), /* Set to omtp type */
3633 		UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
3634 		{}
3635 	};
3636 	static struct coef_fw coef0688[] = {
3637 		WRITE_COEF(0x11, 0x0001),
3638 		WRITE_COEF(0x15, 0x0d50),
3639 		WRITE_COEF(0xc3, 0x0000),
3640 		{}
3641 	};
3642 
3643 	switch (codec->vendor_id) {
3644 	case 0x10ec0255:
3645 		alc_process_coef_fw(codec, coef0255);
3646 		break;
3647 	case 0x10ec0233:
3648 	case 0x10ec0283:
3649 		alc_process_coef_fw(codec, coef0233);
3650 		break;
3651 	case 0x10ec0292:
3652 		alc_process_coef_fw(codec, coef0292);
3653 		break;
3654 	case 0x10ec0293:
3655 		alc_process_coef_fw(codec, coef0293);
3656 		break;
3657 	case 0x10ec0668:
3658 		alc_process_coef_fw(codec, coef0688);
3659 		break;
3660 	}
3661 	codec_dbg(codec, "Headset jack set to Nokia-style headset mode.\n");
3662 }
3663 
3664 static void alc_determine_headset_type(struct hda_codec *codec)
3665 {
3666 	int val;
3667 	bool is_ctia = false;
3668 	struct alc_spec *spec = codec->spec;
3669 	static struct coef_fw coef0255[] = {
3670 		WRITE_COEF(0x45, 0xd089), /* combo jack auto switch control(Check type)*/
3671 		WRITE_COEF(0x49, 0x0149), /* combo jack auto switch control(Vref
3672  conteol) */
3673 		{}
3674 	};
3675 	static struct coef_fw coef0293[] = {
3676 		UPDATE_COEF(0x4a, 0x000f, 0x0008), /* Combo Jack auto detect */
3677 		WRITE_COEF(0x45, 0xD429), /* Set to ctia type */
3678 		{}
3679 	};
3680 	static struct coef_fw coef0688[] = {
3681 		WRITE_COEF(0x11, 0x0001),
3682 		WRITE_COEF(0xb7, 0x802b),
3683 		WRITE_COEF(0x15, 0x0d60),
3684 		WRITE_COEF(0xc3, 0x0c00),
3685 		{}
3686 	};
3687 
3688 	switch (codec->vendor_id) {
3689 	case 0x10ec0255:
3690 		alc_process_coef_fw(codec, coef0255);
3691 		msleep(300);
3692 		val = alc_read_coef_idx(codec, 0x46);
3693 		is_ctia = (val & 0x0070) == 0x0070;
3694 		break;
3695 	case 0x10ec0233:
3696 	case 0x10ec0283:
3697 		alc_write_coef_idx(codec, 0x45, 0xd029);
3698 		msleep(300);
3699 		val = alc_read_coef_idx(codec, 0x46);
3700 		is_ctia = (val & 0x0070) == 0x0070;
3701 		break;
3702 	case 0x10ec0292:
3703 		alc_write_coef_idx(codec, 0x6b, 0xd429);
3704 		msleep(300);
3705 		val = alc_read_coef_idx(codec, 0x6c);
3706 		is_ctia = (val & 0x001c) == 0x001c;
3707 		break;
3708 	case 0x10ec0293:
3709 		alc_process_coef_fw(codec, coef0293);
3710 		msleep(300);
3711 		val = alc_read_coef_idx(codec, 0x46);
3712 		is_ctia = (val & 0x0070) == 0x0070;
3713 		break;
3714 	case 0x10ec0668:
3715 		alc_process_coef_fw(codec, coef0688);
3716 		msleep(300);
3717 		val = alc_read_coef_idx(codec, 0xbe);
3718 		is_ctia = (val & 0x1c02) == 0x1c02;
3719 		break;
3720 	}
3721 
3722 	codec_dbg(codec, "Headset jack detected iPhone-style headset: %s\n",
3723 		    is_ctia ? "yes" : "no");
3724 	spec->current_headset_type = is_ctia ? ALC_HEADSET_TYPE_CTIA : ALC_HEADSET_TYPE_OMTP;
3725 }
3726 
3727 static void alc_update_headset_mode(struct hda_codec *codec)
3728 {
3729 	struct alc_spec *spec = codec->spec;
3730 
3731 	hda_nid_t mux_pin = spec->gen.imux_pins[spec->gen.cur_mux[0]];
3732 	hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
3733 
3734 	int new_headset_mode;
3735 
3736 	if (!snd_hda_jack_detect(codec, hp_pin))
3737 		new_headset_mode = ALC_HEADSET_MODE_UNPLUGGED;
3738 	else if (mux_pin == spec->headset_mic_pin)
3739 		new_headset_mode = ALC_HEADSET_MODE_HEADSET;
3740 	else if (mux_pin == spec->headphone_mic_pin)
3741 		new_headset_mode = ALC_HEADSET_MODE_MIC;
3742 	else
3743 		new_headset_mode = ALC_HEADSET_MODE_HEADPHONE;
3744 
3745 	if (new_headset_mode == spec->current_headset_mode) {
3746 		snd_hda_gen_update_outputs(codec);
3747 		return;
3748 	}
3749 
3750 	switch (new_headset_mode) {
3751 	case ALC_HEADSET_MODE_UNPLUGGED:
3752 		alc_headset_mode_unplugged(codec);
3753 		spec->gen.hp_jack_present = false;
3754 		break;
3755 	case ALC_HEADSET_MODE_HEADSET:
3756 		if (spec->current_headset_type == ALC_HEADSET_TYPE_UNKNOWN)
3757 			alc_determine_headset_type(codec);
3758 		if (spec->current_headset_type == ALC_HEADSET_TYPE_CTIA)
3759 			alc_headset_mode_ctia(codec);
3760 		else if (spec->current_headset_type == ALC_HEADSET_TYPE_OMTP)
3761 			alc_headset_mode_omtp(codec);
3762 		spec->gen.hp_jack_present = true;
3763 		break;
3764 	case ALC_HEADSET_MODE_MIC:
3765 		alc_headset_mode_mic_in(codec, hp_pin, spec->headphone_mic_pin);
3766 		spec->gen.hp_jack_present = false;
3767 		break;
3768 	case ALC_HEADSET_MODE_HEADPHONE:
3769 		alc_headset_mode_default(codec);
3770 		spec->gen.hp_jack_present = true;
3771 		break;
3772 	}
3773 	if (new_headset_mode != ALC_HEADSET_MODE_MIC) {
3774 		snd_hda_set_pin_ctl_cache(codec, hp_pin,
3775 					  AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
3776 		if (spec->headphone_mic_pin)
3777 			snd_hda_set_pin_ctl_cache(codec, spec->headphone_mic_pin,
3778 						  PIN_VREFHIZ);
3779 	}
3780 	spec->current_headset_mode = new_headset_mode;
3781 
3782 	snd_hda_gen_update_outputs(codec);
3783 }
3784 
3785 static void alc_update_headset_mode_hook(struct hda_codec *codec,
3786 					 struct snd_kcontrol *kcontrol,
3787 					 struct snd_ctl_elem_value *ucontrol)
3788 {
3789 	alc_update_headset_mode(codec);
3790 }
3791 
3792 static void alc_update_headset_jack_cb(struct hda_codec *codec,
3793 				       struct hda_jack_callback *jack)
3794 {
3795 	struct alc_spec *spec = codec->spec;
3796 	spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
3797 	snd_hda_gen_hp_automute(codec, jack);
3798 }
3799 
3800 static void alc_probe_headset_mode(struct hda_codec *codec)
3801 {
3802 	int i;
3803 	struct alc_spec *spec = codec->spec;
3804 	struct auto_pin_cfg *cfg = &spec->gen.autocfg;
3805 
3806 	/* Find mic pins */
3807 	for (i = 0; i < cfg->num_inputs; i++) {
3808 		if (cfg->inputs[i].is_headset_mic && !spec->headset_mic_pin)
3809 			spec->headset_mic_pin = cfg->inputs[i].pin;
3810 		if (cfg->inputs[i].is_headphone_mic && !spec->headphone_mic_pin)
3811 			spec->headphone_mic_pin = cfg->inputs[i].pin;
3812 	}
3813 
3814 	spec->gen.cap_sync_hook = alc_update_headset_mode_hook;
3815 	spec->gen.automute_hook = alc_update_headset_mode;
3816 	spec->gen.hp_automute_hook = alc_update_headset_jack_cb;
3817 }
3818 
3819 static void alc_fixup_headset_mode(struct hda_codec *codec,
3820 				const struct hda_fixup *fix, int action)
3821 {
3822 	struct alc_spec *spec = codec->spec;
3823 
3824 	switch (action) {
3825 	case HDA_FIXUP_ACT_PRE_PROBE:
3826 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC | HDA_PINCFG_HEADPHONE_MIC;
3827 		break;
3828 	case HDA_FIXUP_ACT_PROBE:
3829 		alc_probe_headset_mode(codec);
3830 		break;
3831 	case HDA_FIXUP_ACT_INIT:
3832 		spec->current_headset_mode = 0;
3833 		alc_update_headset_mode(codec);
3834 		break;
3835 	}
3836 }
3837 
3838 static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
3839 				const struct hda_fixup *fix, int action)
3840 {
3841 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3842 		struct alc_spec *spec = codec->spec;
3843 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
3844 	}
3845 	else
3846 		alc_fixup_headset_mode(codec, fix, action);
3847 }
3848 
3849 static void alc255_set_default_jack_type(struct hda_codec *codec)
3850 {
3851 	/* Set to iphone type */
3852 	static struct coef_fw fw[] = {
3853 		WRITE_COEF(0x1b, 0x880b),
3854 		WRITE_COEF(0x45, 0xd089),
3855 		WRITE_COEF(0x1b, 0x080b),
3856 		WRITE_COEF(0x46, 0x0004),
3857 		WRITE_COEF(0x1b, 0x0c0b),
3858 		{}
3859 	};
3860 	alc_process_coef_fw(codec, fw);
3861 	msleep(30);
3862 }
3863 
3864 static void alc_fixup_headset_mode_alc255(struct hda_codec *codec,
3865 				const struct hda_fixup *fix, int action)
3866 {
3867 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3868 		alc255_set_default_jack_type(codec);
3869 	}
3870 	alc_fixup_headset_mode(codec, fix, action);
3871 }
3872 
3873 static void alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec,
3874 				const struct hda_fixup *fix, int action)
3875 {
3876 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3877 		struct alc_spec *spec = codec->spec;
3878 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
3879 		alc255_set_default_jack_type(codec);
3880 	}
3881 	else
3882 		alc_fixup_headset_mode(codec, fix, action);
3883 }
3884 
3885 static void alc_fixup_auto_mute_via_amp(struct hda_codec *codec,
3886 					const struct hda_fixup *fix, int action)
3887 {
3888 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3889 		struct alc_spec *spec = codec->spec;
3890 		spec->gen.auto_mute_via_amp = 1;
3891 	}
3892 }
3893 
3894 static void alc_no_shutup(struct hda_codec *codec)
3895 {
3896 }
3897 
3898 static void alc_fixup_no_shutup(struct hda_codec *codec,
3899 				const struct hda_fixup *fix, int action)
3900 {
3901 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3902 		struct alc_spec *spec = codec->spec;
3903 		spec->shutup = alc_no_shutup;
3904 	}
3905 }
3906 
3907 static void alc_fixup_disable_aamix(struct hda_codec *codec,
3908 				    const struct hda_fixup *fix, int action)
3909 {
3910 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3911 		struct alc_spec *spec = codec->spec;
3912 		/* Disable AA-loopback as it causes white noise */
3913 		spec->gen.mixer_nid = 0;
3914 	}
3915 }
3916 
3917 static unsigned int alc_power_filter_xps13(struct hda_codec *codec,
3918 				hda_nid_t nid,
3919 				unsigned int power_state)
3920 {
3921 	struct alc_spec *spec = codec->spec;
3922 
3923 	/* Avoid pop noises when headphones are plugged in */
3924 	if (spec->gen.hp_jack_present)
3925 		if (nid == codec->afg || nid == 0x02 || nid == 0x15)
3926 			return AC_PWRST_D0;
3927 	return power_state;
3928 }
3929 
3930 static void alc_fixup_dell_xps13(struct hda_codec *codec,
3931 				const struct hda_fixup *fix, int action)
3932 {
3933 	if (action == HDA_FIXUP_ACT_PROBE) {
3934 		struct alc_spec *spec = codec->spec;
3935 		struct hda_input_mux *imux = &spec->gen.input_mux;
3936 		int i;
3937 
3938 		spec->shutup = alc_no_shutup;
3939 		codec->power_filter = alc_power_filter_xps13;
3940 
3941 		/* Make the internal mic the default input source. */
3942 		for (i = 0; i < imux->num_items; i++) {
3943 			if (spec->gen.imux_pins[i] == 0x12) {
3944 				spec->gen.cur_mux[0] = i;
3945 				break;
3946 			}
3947 		}
3948 	}
3949 }
3950 
3951 static void alc_fixup_headset_mode_alc668(struct hda_codec *codec,
3952 				const struct hda_fixup *fix, int action)
3953 {
3954 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3955 		alc_write_coef_idx(codec, 0xc4, 0x8000);
3956 		alc_update_coef_idx(codec, 0xc2, ~0xfe, 0);
3957 		snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
3958 	}
3959 	alc_fixup_headset_mode(codec, fix, action);
3960 }
3961 
3962 /* Returns the nid of the external mic input pin, or 0 if it cannot be found. */
3963 static int find_ext_mic_pin(struct hda_codec *codec)
3964 {
3965 	struct alc_spec *spec = codec->spec;
3966 	struct auto_pin_cfg *cfg = &spec->gen.autocfg;
3967 	hda_nid_t nid;
3968 	unsigned int defcfg;
3969 	int i;
3970 
3971 	for (i = 0; i < cfg->num_inputs; i++) {
3972 		if (cfg->inputs[i].type != AUTO_PIN_MIC)
3973 			continue;
3974 		nid = cfg->inputs[i].pin;
3975 		defcfg = snd_hda_codec_get_pincfg(codec, nid);
3976 		if (snd_hda_get_input_pin_attr(defcfg) == INPUT_PIN_ATTR_INT)
3977 			continue;
3978 		return nid;
3979 	}
3980 
3981 	return 0;
3982 }
3983 
3984 static void alc271_hp_gate_mic_jack(struct hda_codec *codec,
3985 				    const struct hda_fixup *fix,
3986 				    int action)
3987 {
3988 	struct alc_spec *spec = codec->spec;
3989 
3990 	if (action == HDA_FIXUP_ACT_PROBE) {
3991 		int mic_pin = find_ext_mic_pin(codec);
3992 		int hp_pin = spec->gen.autocfg.hp_pins[0];
3993 
3994 		if (snd_BUG_ON(!mic_pin || !hp_pin))
3995 			return;
3996 		snd_hda_jack_set_gating_jack(codec, mic_pin, hp_pin);
3997 	}
3998 }
3999 
4000 static void alc269_fixup_limit_int_mic_boost(struct hda_codec *codec,
4001 					     const struct hda_fixup *fix,
4002 					     int action)
4003 {
4004 	struct alc_spec *spec = codec->spec;
4005 	struct auto_pin_cfg *cfg = &spec->gen.autocfg;
4006 	int i;
4007 
4008 	/* The mic boosts on level 2 and 3 are too noisy
4009 	   on the internal mic input.
4010 	   Therefore limit the boost to 0 or 1. */
4011 
4012 	if (action != HDA_FIXUP_ACT_PROBE)
4013 		return;
4014 
4015 	for (i = 0; i < cfg->num_inputs; i++) {
4016 		hda_nid_t nid = cfg->inputs[i].pin;
4017 		unsigned int defcfg;
4018 		if (cfg->inputs[i].type != AUTO_PIN_MIC)
4019 			continue;
4020 		defcfg = snd_hda_codec_get_pincfg(codec, nid);
4021 		if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
4022 			continue;
4023 
4024 		snd_hda_override_amp_caps(codec, nid, HDA_INPUT,
4025 					  (0x00 << AC_AMPCAP_OFFSET_SHIFT) |
4026 					  (0x01 << AC_AMPCAP_NUM_STEPS_SHIFT) |
4027 					  (0x2f << AC_AMPCAP_STEP_SIZE_SHIFT) |
4028 					  (0 << AC_AMPCAP_MUTE_SHIFT));
4029 	}
4030 }
4031 
4032 static void alc283_hp_automute_hook(struct hda_codec *codec,
4033 				    struct hda_jack_callback *jack)
4034 {
4035 	struct alc_spec *spec = codec->spec;
4036 	int vref;
4037 
4038 	msleep(200);
4039 	snd_hda_gen_hp_automute(codec, jack);
4040 
4041 	vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
4042 
4043 	msleep(600);
4044 	snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4045 			    vref);
4046 }
4047 
4048 static void alc283_fixup_chromebook(struct hda_codec *codec,
4049 				    const struct hda_fixup *fix, int action)
4050 {
4051 	struct alc_spec *spec = codec->spec;
4052 
4053 	switch (action) {
4054 	case HDA_FIXUP_ACT_PRE_PROBE:
4055 		snd_hda_override_wcaps(codec, 0x03, 0);
4056 		/* Disable AA-loopback as it causes white noise */
4057 		spec->gen.mixer_nid = 0;
4058 		break;
4059 	case HDA_FIXUP_ACT_INIT:
4060 		/* MIC2-VREF control */
4061 		/* Set to manual mode */
4062 		alc_update_coef_idx(codec, 0x06, 0x000c, 0);
4063 		/* Enable Line1 input control by verb */
4064 		alc_update_coef_idx(codec, 0x1a, 0, 1 << 4);
4065 		break;
4066 	}
4067 }
4068 
4069 static void alc283_fixup_sense_combo_jack(struct hda_codec *codec,
4070 				    const struct hda_fixup *fix, int action)
4071 {
4072 	struct alc_spec *spec = codec->spec;
4073 
4074 	switch (action) {
4075 	case HDA_FIXUP_ACT_PRE_PROBE:
4076 		spec->gen.hp_automute_hook = alc283_hp_automute_hook;
4077 		break;
4078 	case HDA_FIXUP_ACT_INIT:
4079 		/* MIC2-VREF control */
4080 		/* Set to manual mode */
4081 		alc_update_coef_idx(codec, 0x06, 0x000c, 0);
4082 		break;
4083 	}
4084 }
4085 
4086 /* mute tablet speaker pin (0x14) via dock plugging in addition */
4087 static void asus_tx300_automute(struct hda_codec *codec)
4088 {
4089 	struct alc_spec *spec = codec->spec;
4090 	snd_hda_gen_update_outputs(codec);
4091 	if (snd_hda_jack_detect(codec, 0x1b))
4092 		spec->gen.mute_bits |= (1ULL << 0x14);
4093 }
4094 
4095 static void alc282_fixup_asus_tx300(struct hda_codec *codec,
4096 				    const struct hda_fixup *fix, int action)
4097 {
4098 	struct alc_spec *spec = codec->spec;
4099 	/* TX300 needs to set up GPIO2 for the speaker amp */
4100 	static const struct hda_verb gpio2_verbs[] = {
4101 		{ 0x01, AC_VERB_SET_GPIO_MASK, 0x04 },
4102 		{ 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04 },
4103 		{ 0x01, AC_VERB_SET_GPIO_DATA, 0x04 },
4104 		{}
4105 	};
4106 	static const struct hda_pintbl dock_pins[] = {
4107 		{ 0x1b, 0x21114000 }, /* dock speaker pin */
4108 		{}
4109 	};
4110 	struct snd_kcontrol *kctl;
4111 
4112 	switch (action) {
4113 	case HDA_FIXUP_ACT_PRE_PROBE:
4114 		snd_hda_add_verbs(codec, gpio2_verbs);
4115 		snd_hda_apply_pincfgs(codec, dock_pins);
4116 		spec->gen.auto_mute_via_amp = 1;
4117 		spec->gen.automute_hook = asus_tx300_automute;
4118 		snd_hda_jack_detect_enable_callback(codec, 0x1b,
4119 						    snd_hda_gen_hp_automute);
4120 		break;
4121 	case HDA_FIXUP_ACT_BUILD:
4122 		/* this is a bit tricky; give more sane names for the main
4123 		 * (tablet) speaker and the dock speaker, respectively
4124 		 */
4125 		kctl = snd_hda_find_mixer_ctl(codec, "Speaker Playback Switch");
4126 		if (kctl)
4127 			strcpy(kctl->id.name, "Dock Speaker Playback Switch");
4128 		kctl = snd_hda_find_mixer_ctl(codec, "Bass Speaker Playback Switch");
4129 		if (kctl)
4130 			strcpy(kctl->id.name, "Speaker Playback Switch");
4131 		break;
4132 	}
4133 }
4134 
4135 static void alc290_fixup_mono_speakers(struct hda_codec *codec,
4136 				       const struct hda_fixup *fix, int action)
4137 {
4138 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4139 		/* DAC node 0x03 is giving mono output. We therefore want to
4140 		   make sure 0x14 (front speaker) and 0x15 (headphones) use the
4141 		   stereo DAC, while leaving 0x17 (bass speaker) for node 0x03. */
4142 		hda_nid_t conn1[2] = { 0x0c };
4143 		snd_hda_override_conn_list(codec, 0x14, 1, conn1);
4144 		snd_hda_override_conn_list(codec, 0x15, 1, conn1);
4145 	}
4146 }
4147 
4148 /* for hda_fixup_thinkpad_acpi() */
4149 #include "thinkpad_helper.c"
4150 
4151 /* for dell wmi mic mute led */
4152 #include "dell_wmi_helper.c"
4153 
4154 enum {
4155 	ALC269_FIXUP_SONY_VAIO,
4156 	ALC275_FIXUP_SONY_VAIO_GPIO2,
4157 	ALC269_FIXUP_DELL_M101Z,
4158 	ALC269_FIXUP_SKU_IGNORE,
4159 	ALC269_FIXUP_ASUS_G73JW,
4160 	ALC269_FIXUP_LENOVO_EAPD,
4161 	ALC275_FIXUP_SONY_HWEQ,
4162 	ALC275_FIXUP_SONY_DISABLE_AAMIX,
4163 	ALC271_FIXUP_DMIC,
4164 	ALC269_FIXUP_PCM_44K,
4165 	ALC269_FIXUP_STEREO_DMIC,
4166 	ALC269_FIXUP_HEADSET_MIC,
4167 	ALC269_FIXUP_QUANTA_MUTE,
4168 	ALC269_FIXUP_LIFEBOOK,
4169 	ALC269_FIXUP_LIFEBOOK_EXTMIC,
4170 	ALC269_FIXUP_AMIC,
4171 	ALC269_FIXUP_DMIC,
4172 	ALC269VB_FIXUP_AMIC,
4173 	ALC269VB_FIXUP_DMIC,
4174 	ALC269_FIXUP_HP_MUTE_LED,
4175 	ALC269_FIXUP_HP_MUTE_LED_MIC1,
4176 	ALC269_FIXUP_HP_MUTE_LED_MIC2,
4177 	ALC269_FIXUP_HP_GPIO_LED,
4178 	ALC269_FIXUP_HP_GPIO_MIC1_LED,
4179 	ALC269_FIXUP_HP_LINE1_MIC1_LED,
4180 	ALC269_FIXUP_INV_DMIC,
4181 	ALC269_FIXUP_LENOVO_DOCK,
4182 	ALC269_FIXUP_NO_SHUTUP,
4183 	ALC286_FIXUP_SONY_MIC_NO_PRESENCE,
4184 	ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
4185 	ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
4186 	ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
4187 	ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
4188 	ALC269_FIXUP_HEADSET_MODE,
4189 	ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
4190 	ALC269_FIXUP_ASUS_X101_FUNC,
4191 	ALC269_FIXUP_ASUS_X101_VERB,
4192 	ALC269_FIXUP_ASUS_X101,
4193 	ALC271_FIXUP_AMIC_MIC2,
4194 	ALC271_FIXUP_HP_GATE_MIC_JACK,
4195 	ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572,
4196 	ALC269_FIXUP_ACER_AC700,
4197 	ALC269_FIXUP_LIMIT_INT_MIC_BOOST,
4198 	ALC269VB_FIXUP_ASUS_ZENBOOK,
4199 	ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A,
4200 	ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED,
4201 	ALC269VB_FIXUP_ORDISSIMO_EVE2,
4202 	ALC283_FIXUP_CHROME_BOOK,
4203 	ALC283_FIXUP_SENSE_COMBO_JACK,
4204 	ALC282_FIXUP_ASUS_TX300,
4205 	ALC283_FIXUP_INT_MIC,
4206 	ALC290_FIXUP_MONO_SPEAKERS,
4207 	ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
4208 	ALC290_FIXUP_SUBWOOFER,
4209 	ALC290_FIXUP_SUBWOOFER_HSJACK,
4210 	ALC269_FIXUP_THINKPAD_ACPI,
4211 	ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
4212 	ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
4213 	ALC255_FIXUP_HEADSET_MODE,
4214 	ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,
4215 	ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
4216 	ALC292_FIXUP_TPT440_DOCK,
4217 	ALC283_FIXUP_BXBT2807_MIC,
4218 	ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED,
4219 	ALC282_FIXUP_ASPIRE_V5_PINS,
4220 };
4221 
4222 static const struct hda_fixup alc269_fixups[] = {
4223 	[ALC269_FIXUP_SONY_VAIO] = {
4224 		.type = HDA_FIXUP_PINCTLS,
4225 		.v.pins = (const struct hda_pintbl[]) {
4226 			{0x19, PIN_VREFGRD},
4227 			{}
4228 		}
4229 	},
4230 	[ALC275_FIXUP_SONY_VAIO_GPIO2] = {
4231 		.type = HDA_FIXUP_VERBS,
4232 		.v.verbs = (const struct hda_verb[]) {
4233 			{0x01, AC_VERB_SET_GPIO_MASK, 0x04},
4234 			{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04},
4235 			{0x01, AC_VERB_SET_GPIO_DATA, 0x00},
4236 			{ }
4237 		},
4238 		.chained = true,
4239 		.chain_id = ALC269_FIXUP_SONY_VAIO
4240 	},
4241 	[ALC269_FIXUP_DELL_M101Z] = {
4242 		.type = HDA_FIXUP_VERBS,
4243 		.v.verbs = (const struct hda_verb[]) {
4244 			/* Enables internal speaker */
4245 			{0x20, AC_VERB_SET_COEF_INDEX, 13},
4246 			{0x20, AC_VERB_SET_PROC_COEF, 0x4040},
4247 			{}
4248 		}
4249 	},
4250 	[ALC269_FIXUP_SKU_IGNORE] = {
4251 		.type = HDA_FIXUP_FUNC,
4252 		.v.func = alc_fixup_sku_ignore,
4253 	},
4254 	[ALC269_FIXUP_ASUS_G73JW] = {
4255 		.type = HDA_FIXUP_PINS,
4256 		.v.pins = (const struct hda_pintbl[]) {
4257 			{ 0x17, 0x99130111 }, /* subwoofer */
4258 			{ }
4259 		}
4260 	},
4261 	[ALC269_FIXUP_LENOVO_EAPD] = {
4262 		.type = HDA_FIXUP_VERBS,
4263 		.v.verbs = (const struct hda_verb[]) {
4264 			{0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
4265 			{}
4266 		}
4267 	},
4268 	[ALC275_FIXUP_SONY_HWEQ] = {
4269 		.type = HDA_FIXUP_FUNC,
4270 		.v.func = alc269_fixup_hweq,
4271 		.chained = true,
4272 		.chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
4273 	},
4274 	[ALC275_FIXUP_SONY_DISABLE_AAMIX] = {
4275 		.type = HDA_FIXUP_FUNC,
4276 		.v.func = alc_fixup_disable_aamix,
4277 		.chained = true,
4278 		.chain_id = ALC269_FIXUP_SONY_VAIO
4279 	},
4280 	[ALC271_FIXUP_DMIC] = {
4281 		.type = HDA_FIXUP_FUNC,
4282 		.v.func = alc271_fixup_dmic,
4283 	},
4284 	[ALC269_FIXUP_PCM_44K] = {
4285 		.type = HDA_FIXUP_FUNC,
4286 		.v.func = alc269_fixup_pcm_44k,
4287 		.chained = true,
4288 		.chain_id = ALC269_FIXUP_QUANTA_MUTE
4289 	},
4290 	[ALC269_FIXUP_STEREO_DMIC] = {
4291 		.type = HDA_FIXUP_FUNC,
4292 		.v.func = alc269_fixup_stereo_dmic,
4293 	},
4294 	[ALC269_FIXUP_HEADSET_MIC] = {
4295 		.type = HDA_FIXUP_FUNC,
4296 		.v.func = alc269_fixup_headset_mic,
4297 	},
4298 	[ALC269_FIXUP_QUANTA_MUTE] = {
4299 		.type = HDA_FIXUP_FUNC,
4300 		.v.func = alc269_fixup_quanta_mute,
4301 	},
4302 	[ALC269_FIXUP_LIFEBOOK] = {
4303 		.type = HDA_FIXUP_PINS,
4304 		.v.pins = (const struct hda_pintbl[]) {
4305 			{ 0x1a, 0x2101103f }, /* dock line-out */
4306 			{ 0x1b, 0x23a11040 }, /* dock mic-in */
4307 			{ }
4308 		},
4309 		.chained = true,
4310 		.chain_id = ALC269_FIXUP_QUANTA_MUTE
4311 	},
4312 	[ALC269_FIXUP_LIFEBOOK_EXTMIC] = {
4313 		.type = HDA_FIXUP_PINS,
4314 		.v.pins = (const struct hda_pintbl[]) {
4315 			{ 0x19, 0x01a1903c }, /* headset mic, with jack detect */
4316 			{ }
4317 		},
4318 	},
4319 	[ALC269_FIXUP_AMIC] = {
4320 		.type = HDA_FIXUP_PINS,
4321 		.v.pins = (const struct hda_pintbl[]) {
4322 			{ 0x14, 0x99130110 }, /* speaker */
4323 			{ 0x15, 0x0121401f }, /* HP out */
4324 			{ 0x18, 0x01a19c20 }, /* mic */
4325 			{ 0x19, 0x99a3092f }, /* int-mic */
4326 			{ }
4327 		},
4328 	},
4329 	[ALC269_FIXUP_DMIC] = {
4330 		.type = HDA_FIXUP_PINS,
4331 		.v.pins = (const struct hda_pintbl[]) {
4332 			{ 0x12, 0x99a3092f }, /* int-mic */
4333 			{ 0x14, 0x99130110 }, /* speaker */
4334 			{ 0x15, 0x0121401f }, /* HP out */
4335 			{ 0x18, 0x01a19c20 }, /* mic */
4336 			{ }
4337 		},
4338 	},
4339 	[ALC269VB_FIXUP_AMIC] = {
4340 		.type = HDA_FIXUP_PINS,
4341 		.v.pins = (const struct hda_pintbl[]) {
4342 			{ 0x14, 0x99130110 }, /* speaker */
4343 			{ 0x18, 0x01a19c20 }, /* mic */
4344 			{ 0x19, 0x99a3092f }, /* int-mic */
4345 			{ 0x21, 0x0121401f }, /* HP out */
4346 			{ }
4347 		},
4348 	},
4349 	[ALC269VB_FIXUP_DMIC] = {
4350 		.type = HDA_FIXUP_PINS,
4351 		.v.pins = (const struct hda_pintbl[]) {
4352 			{ 0x12, 0x99a3092f }, /* int-mic */
4353 			{ 0x14, 0x99130110 }, /* speaker */
4354 			{ 0x18, 0x01a19c20 }, /* mic */
4355 			{ 0x21, 0x0121401f }, /* HP out */
4356 			{ }
4357 		},
4358 	},
4359 	[ALC269_FIXUP_HP_MUTE_LED] = {
4360 		.type = HDA_FIXUP_FUNC,
4361 		.v.func = alc269_fixup_hp_mute_led,
4362 	},
4363 	[ALC269_FIXUP_HP_MUTE_LED_MIC1] = {
4364 		.type = HDA_FIXUP_FUNC,
4365 		.v.func = alc269_fixup_hp_mute_led_mic1,
4366 	},
4367 	[ALC269_FIXUP_HP_MUTE_LED_MIC2] = {
4368 		.type = HDA_FIXUP_FUNC,
4369 		.v.func = alc269_fixup_hp_mute_led_mic2,
4370 	},
4371 	[ALC269_FIXUP_HP_GPIO_LED] = {
4372 		.type = HDA_FIXUP_FUNC,
4373 		.v.func = alc269_fixup_hp_gpio_led,
4374 	},
4375 	[ALC269_FIXUP_HP_GPIO_MIC1_LED] = {
4376 		.type = HDA_FIXUP_FUNC,
4377 		.v.func = alc269_fixup_hp_gpio_mic1_led,
4378 	},
4379 	[ALC269_FIXUP_HP_LINE1_MIC1_LED] = {
4380 		.type = HDA_FIXUP_FUNC,
4381 		.v.func = alc269_fixup_hp_line1_mic1_led,
4382 	},
4383 	[ALC269_FIXUP_INV_DMIC] = {
4384 		.type = HDA_FIXUP_FUNC,
4385 		.v.func = alc_fixup_inv_dmic,
4386 	},
4387 	[ALC269_FIXUP_NO_SHUTUP] = {
4388 		.type = HDA_FIXUP_FUNC,
4389 		.v.func = alc_fixup_no_shutup,
4390 	},
4391 	[ALC269_FIXUP_LENOVO_DOCK] = {
4392 		.type = HDA_FIXUP_PINS,
4393 		.v.pins = (const struct hda_pintbl[]) {
4394 			{ 0x19, 0x23a11040 }, /* dock mic */
4395 			{ 0x1b, 0x2121103f }, /* dock headphone */
4396 			{ }
4397 		},
4398 		.chained = true,
4399 		.chain_id = ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT
4400 	},
4401 	[ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT] = {
4402 		.type = HDA_FIXUP_FUNC,
4403 		.v.func = alc269_fixup_pincfg_no_hp_to_lineout,
4404 		.chained = true,
4405 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
4406 	},
4407 	[ALC269_FIXUP_DELL1_MIC_NO_PRESENCE] = {
4408 		.type = HDA_FIXUP_PINS,
4409 		.v.pins = (const struct hda_pintbl[]) {
4410 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
4411 			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
4412 			{ }
4413 		},
4414 		.chained = true,
4415 		.chain_id = ALC269_FIXUP_HEADSET_MODE
4416 	},
4417 	[ALC269_FIXUP_DELL2_MIC_NO_PRESENCE] = {
4418 		.type = HDA_FIXUP_PINS,
4419 		.v.pins = (const struct hda_pintbl[]) {
4420 			{ 0x16, 0x21014020 }, /* dock line out */
4421 			{ 0x19, 0x21a19030 }, /* dock mic */
4422 			{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
4423 			{ }
4424 		},
4425 		.chained = true,
4426 		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
4427 	},
4428 	[ALC269_FIXUP_DELL3_MIC_NO_PRESENCE] = {
4429 		.type = HDA_FIXUP_PINS,
4430 		.v.pins = (const struct hda_pintbl[]) {
4431 			{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
4432 			{ }
4433 		},
4434 		.chained = true,
4435 		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
4436 	},
4437 	[ALC269_FIXUP_HEADSET_MODE] = {
4438 		.type = HDA_FIXUP_FUNC,
4439 		.v.func = alc_fixup_headset_mode,
4440 	},
4441 	[ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
4442 		.type = HDA_FIXUP_FUNC,
4443 		.v.func = alc_fixup_headset_mode_no_hp_mic,
4444 	},
4445 	[ALC286_FIXUP_SONY_MIC_NO_PRESENCE] = {
4446 		.type = HDA_FIXUP_PINS,
4447 		.v.pins = (const struct hda_pintbl[]) {
4448 			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
4449 			{ }
4450 		},
4451 		.chained = true,
4452 		.chain_id = ALC269_FIXUP_HEADSET_MIC
4453 	},
4454 	[ALC269_FIXUP_ASUS_X101_FUNC] = {
4455 		.type = HDA_FIXUP_FUNC,
4456 		.v.func = alc269_fixup_x101_headset_mic,
4457 	},
4458 	[ALC269_FIXUP_ASUS_X101_VERB] = {
4459 		.type = HDA_FIXUP_VERBS,
4460 		.v.verbs = (const struct hda_verb[]) {
4461 			{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
4462 			{0x20, AC_VERB_SET_COEF_INDEX, 0x08},
4463 			{0x20, AC_VERB_SET_PROC_COEF,  0x0310},
4464 			{ }
4465 		},
4466 		.chained = true,
4467 		.chain_id = ALC269_FIXUP_ASUS_X101_FUNC
4468 	},
4469 	[ALC269_FIXUP_ASUS_X101] = {
4470 		.type = HDA_FIXUP_PINS,
4471 		.v.pins = (const struct hda_pintbl[]) {
4472 			{ 0x18, 0x04a1182c }, /* Headset mic */
4473 			{ }
4474 		},
4475 		.chained = true,
4476 		.chain_id = ALC269_FIXUP_ASUS_X101_VERB
4477 	},
4478 	[ALC271_FIXUP_AMIC_MIC2] = {
4479 		.type = HDA_FIXUP_PINS,
4480 		.v.pins = (const struct hda_pintbl[]) {
4481 			{ 0x14, 0x99130110 }, /* speaker */
4482 			{ 0x19, 0x01a19c20 }, /* mic */
4483 			{ 0x1b, 0x99a7012f }, /* int-mic */
4484 			{ 0x21, 0x0121401f }, /* HP out */
4485 			{ }
4486 		},
4487 	},
4488 	[ALC271_FIXUP_HP_GATE_MIC_JACK] = {
4489 		.type = HDA_FIXUP_FUNC,
4490 		.v.func = alc271_hp_gate_mic_jack,
4491 		.chained = true,
4492 		.chain_id = ALC271_FIXUP_AMIC_MIC2,
4493 	},
4494 	[ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572] = {
4495 		.type = HDA_FIXUP_FUNC,
4496 		.v.func = alc269_fixup_limit_int_mic_boost,
4497 		.chained = true,
4498 		.chain_id = ALC271_FIXUP_HP_GATE_MIC_JACK,
4499 	},
4500 	[ALC269_FIXUP_ACER_AC700] = {
4501 		.type = HDA_FIXUP_PINS,
4502 		.v.pins = (const struct hda_pintbl[]) {
4503 			{ 0x12, 0x99a3092f }, /* int-mic */
4504 			{ 0x14, 0x99130110 }, /* speaker */
4505 			{ 0x18, 0x03a11c20 }, /* mic */
4506 			{ 0x1e, 0x0346101e }, /* SPDIF1 */
4507 			{ 0x21, 0x0321101f }, /* HP out */
4508 			{ }
4509 		},
4510 		.chained = true,
4511 		.chain_id = ALC271_FIXUP_DMIC,
4512 	},
4513 	[ALC269_FIXUP_LIMIT_INT_MIC_BOOST] = {
4514 		.type = HDA_FIXUP_FUNC,
4515 		.v.func = alc269_fixup_limit_int_mic_boost,
4516 		.chained = true,
4517 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
4518 	},
4519 	[ALC269VB_FIXUP_ASUS_ZENBOOK] = {
4520 		.type = HDA_FIXUP_FUNC,
4521 		.v.func = alc269_fixup_limit_int_mic_boost,
4522 		.chained = true,
4523 		.chain_id = ALC269VB_FIXUP_DMIC,
4524 	},
4525 	[ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A] = {
4526 		.type = HDA_FIXUP_VERBS,
4527 		.v.verbs = (const struct hda_verb[]) {
4528 			/* class-D output amp +5dB */
4529 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x12 },
4530 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2800 },
4531 			{}
4532 		},
4533 		.chained = true,
4534 		.chain_id = ALC269VB_FIXUP_ASUS_ZENBOOK,
4535 	},
4536 	[ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED] = {
4537 		.type = HDA_FIXUP_FUNC,
4538 		.v.func = alc269_fixup_limit_int_mic_boost,
4539 		.chained = true,
4540 		.chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC1,
4541 	},
4542 	[ALC269VB_FIXUP_ORDISSIMO_EVE2] = {
4543 		.type = HDA_FIXUP_PINS,
4544 		.v.pins = (const struct hda_pintbl[]) {
4545 			{ 0x12, 0x99a3092f }, /* int-mic */
4546 			{ 0x18, 0x03a11d20 }, /* mic */
4547 			{ 0x19, 0x411111f0 }, /* Unused bogus pin */
4548 			{ }
4549 		},
4550 	},
4551 	[ALC283_FIXUP_CHROME_BOOK] = {
4552 		.type = HDA_FIXUP_FUNC,
4553 		.v.func = alc283_fixup_chromebook,
4554 	},
4555 	[ALC283_FIXUP_SENSE_COMBO_JACK] = {
4556 		.type = HDA_FIXUP_FUNC,
4557 		.v.func = alc283_fixup_sense_combo_jack,
4558 		.chained = true,
4559 		.chain_id = ALC283_FIXUP_CHROME_BOOK,
4560 	},
4561 	[ALC282_FIXUP_ASUS_TX300] = {
4562 		.type = HDA_FIXUP_FUNC,
4563 		.v.func = alc282_fixup_asus_tx300,
4564 	},
4565 	[ALC283_FIXUP_INT_MIC] = {
4566 		.type = HDA_FIXUP_VERBS,
4567 		.v.verbs = (const struct hda_verb[]) {
4568 			{0x20, AC_VERB_SET_COEF_INDEX, 0x1a},
4569 			{0x20, AC_VERB_SET_PROC_COEF, 0x0011},
4570 			{ }
4571 		},
4572 		.chained = true,
4573 		.chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
4574 	},
4575 	[ALC290_FIXUP_SUBWOOFER_HSJACK] = {
4576 		.type = HDA_FIXUP_PINS,
4577 		.v.pins = (const struct hda_pintbl[]) {
4578 			{ 0x17, 0x90170112 }, /* subwoofer */
4579 			{ }
4580 		},
4581 		.chained = true,
4582 		.chain_id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
4583 	},
4584 	[ALC290_FIXUP_SUBWOOFER] = {
4585 		.type = HDA_FIXUP_PINS,
4586 		.v.pins = (const struct hda_pintbl[]) {
4587 			{ 0x17, 0x90170112 }, /* subwoofer */
4588 			{ }
4589 		},
4590 		.chained = true,
4591 		.chain_id = ALC290_FIXUP_MONO_SPEAKERS,
4592 	},
4593 	[ALC290_FIXUP_MONO_SPEAKERS] = {
4594 		.type = HDA_FIXUP_FUNC,
4595 		.v.func = alc290_fixup_mono_speakers,
4596 	},
4597 	[ALC290_FIXUP_MONO_SPEAKERS_HSJACK] = {
4598 		.type = HDA_FIXUP_FUNC,
4599 		.v.func = alc290_fixup_mono_speakers,
4600 		.chained = true,
4601 		.chain_id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
4602 	},
4603 	[ALC269_FIXUP_THINKPAD_ACPI] = {
4604 		.type = HDA_FIXUP_FUNC,
4605 		.v.func = hda_fixup_thinkpad_acpi,
4606 	},
4607 	[ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = {
4608 		.type = HDA_FIXUP_PINS,
4609 		.v.pins = (const struct hda_pintbl[]) {
4610 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
4611 			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
4612 			{ }
4613 		},
4614 		.chained = true,
4615 		.chain_id = ALC255_FIXUP_HEADSET_MODE
4616 	},
4617 	[ALC255_FIXUP_DELL2_MIC_NO_PRESENCE] = {
4618 		.type = HDA_FIXUP_PINS,
4619 		.v.pins = (const struct hda_pintbl[]) {
4620 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
4621 			{ }
4622 		},
4623 		.chained = true,
4624 		.chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
4625 	},
4626 	[ALC255_FIXUP_HEADSET_MODE] = {
4627 		.type = HDA_FIXUP_FUNC,
4628 		.v.func = alc_fixup_headset_mode_alc255,
4629 	},
4630 	[ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
4631 		.type = HDA_FIXUP_FUNC,
4632 		.v.func = alc_fixup_headset_mode_alc255_no_hp_mic,
4633 	},
4634 	[ALC293_FIXUP_DELL1_MIC_NO_PRESENCE] = {
4635 		.type = HDA_FIXUP_PINS,
4636 		.v.pins = (const struct hda_pintbl[]) {
4637 			{ 0x18, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
4638 			{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
4639 			{ }
4640 		},
4641 		.chained = true,
4642 		.chain_id = ALC269_FIXUP_HEADSET_MODE
4643 	},
4644 	[ALC292_FIXUP_TPT440_DOCK] = {
4645 		.type = HDA_FIXUP_PINS,
4646 		.v.pins = (const struct hda_pintbl[]) {
4647 			{ 0x16, 0x21211010 }, /* dock headphone */
4648 			{ 0x19, 0x21a11010 }, /* dock mic */
4649 			{ }
4650 		},
4651 		.chained = true,
4652 		.chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
4653 	},
4654 	[ALC283_FIXUP_BXBT2807_MIC] = {
4655 		.type = HDA_FIXUP_PINS,
4656 		.v.pins = (const struct hda_pintbl[]) {
4657 			{ 0x19, 0x04a110f0 },
4658 			{ },
4659 		},
4660 	},
4661 	[ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED] = {
4662 		.type = HDA_FIXUP_FUNC,
4663 		.v.func = alc_fixup_dell_wmi,
4664 		.chained_before = true,
4665 		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
4666 	},
4667 	[ALC282_FIXUP_ASPIRE_V5_PINS] = {
4668 		.type = HDA_FIXUP_PINS,
4669 		.v.pins = (const struct hda_pintbl[]) {
4670 			{ 0x12, 0x90a60130 },
4671 			{ 0x14, 0x90170110 },
4672 			{ 0x17, 0x40000008 },
4673 			{ 0x18, 0x411111f0 },
4674 			{ 0x19, 0x411111f0 },
4675 			{ 0x1a, 0x411111f0 },
4676 			{ 0x1b, 0x411111f0 },
4677 			{ 0x1d, 0x40f89b2d },
4678 			{ 0x1e, 0x411111f0 },
4679 			{ 0x21, 0x0321101f },
4680 			{ },
4681 		},
4682 	},
4683 
4684 };
4685 
4686 static const struct snd_pci_quirk alc269_fixup_tbl[] = {
4687 	SND_PCI_QUIRK(0x1025, 0x0283, "Acer TravelMate 8371", ALC269_FIXUP_INV_DMIC),
4688 	SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC),
4689 	SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC),
4690 	SND_PCI_QUIRK(0x1025, 0x047c, "Acer AC700", ALC269_FIXUP_ACER_AC700),
4691 	SND_PCI_QUIRK(0x1025, 0x0740, "Acer AO725", ALC271_FIXUP_HP_GATE_MIC_JACK),
4692 	SND_PCI_QUIRK(0x1025, 0x0742, "Acer AO756", ALC271_FIXUP_HP_GATE_MIC_JACK),
4693 	SND_PCI_QUIRK(0x1025, 0x0775, "Acer Aspire E1-572", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
4694 	SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS),
4695 	SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
4696 	SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER),
4697 	SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
4698 	SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
4699 	SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
4700 	SND_PCI_QUIRK(0x1028, 0x0610, "Dell", ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED),
4701 	SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
4702 	SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
4703 	SND_PCI_QUIRK(0x1028, 0x061f, "Dell", ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED),
4704 	SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),
4705 	SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
4706 	SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
4707 	SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
4708 	SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
4709 	SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
4710 	SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),
4711 	SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED),
4712 	/* ALC282 */
4713 	SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4714 	SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4715 	SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
4716 	SND_PCI_QUIRK(0x103c, 0x2237, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
4717 	SND_PCI_QUIRK(0x103c, 0x2238, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
4718 	SND_PCI_QUIRK(0x103c, 0x2239, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
4719 	SND_PCI_QUIRK(0x103c, 0x224b, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
4720 	SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4721 	SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4722 	SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4723 	SND_PCI_QUIRK(0x103c, 0x226e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4724 	SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4725 	SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4726 	SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4727 	SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4728 	SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4729 	SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
4730 	SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
4731 	SND_PCI_QUIRK(0x103c, 0x8004, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
4732 	/* ALC290 */
4733 	SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
4734 	SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
4735 	SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
4736 	SND_PCI_QUIRK(0x103c, 0x2246, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
4737 	SND_PCI_QUIRK(0x103c, 0x2247, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
4738 	SND_PCI_QUIRK(0x103c, 0x2248, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
4739 	SND_PCI_QUIRK(0x103c, 0x2249, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
4740 	SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
4741 	SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
4742 	SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
4743 	SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
4744 	SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
4745 	SND_PCI_QUIRK(0x103c, 0x2258, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
4746 	SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
4747 	SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
4748 	SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4749 	SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4750 	SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4751 	SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4752 	SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
4753 	SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
4754 	SND_PCI_QUIRK(0x103c, 0x2277, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
4755 	SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
4756 	SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4757 	SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4758 	SND_PCI_QUIRK(0x103c, 0x228b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4759 	SND_PCI_QUIRK(0x103c, 0x228e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4760 	SND_PCI_QUIRK(0x103c, 0x22c5, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4761 	SND_PCI_QUIRK(0x103c, 0x22c7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4762 	SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4763 	SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4764 	SND_PCI_QUIRK(0x103c, 0x2334, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4765 	SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4766 	SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4767 	SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4768 	SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
4769 	SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
4770 	SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
4771 	SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
4772 	SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
4773 	SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
4774 	SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
4775 	SND_PCI_QUIRK(0x1043, 0x1b13, "Asus U41SV", ALC269_FIXUP_INV_DMIC),
4776 	SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
4777 	SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
4778 	SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
4779 	SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
4780 	SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
4781 	SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
4782 	SND_PCI_QUIRK(0x104d, 0x90b5, "Sony VAIO Pro 11", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
4783 	SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
4784 	SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
4785 	SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
4786 	SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
4787 	SND_PCI_QUIRK(0x104d, 0x9099, "Sony VAIO S13", ALC275_FIXUP_SONY_DISABLE_AAMIX),
4788 	SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),
4789 	SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),
4790 	SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
4791 	SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_BXBT2807_MIC),
4792 	SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
4793 	SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
4794 	SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
4795 	SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
4796 	SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
4797 	SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK),
4798 	SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK),
4799 	SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),
4800 	SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),
4801 	SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK),
4802 	SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK),
4803 	SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440_DOCK),
4804 	SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK),
4805 	SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK),
4806 	SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK),
4807 	SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
4808 	SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
4809 	SND_PCI_QUIRK(0x17aa, 0x3978, "IdeaPad Y410P", ALC269_FIXUP_NO_SHUTUP),
4810 	SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
4811 	SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC),
4812 	SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK),
4813 	SND_PCI_QUIRK(0x17aa, 0x5026, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
4814 	SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
4815 	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
4816 	SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
4817 	SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */
4818 
4819 #if 0
4820 	/* Below is a quirk table taken from the old code.
4821 	 * Basically the device should work as is without the fixup table.
4822 	 * If BIOS doesn't give a proper info, enable the corresponding
4823 	 * fixup entry.
4824 	 */
4825 	SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
4826 		      ALC269_FIXUP_AMIC),
4827 	SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC),
4828 	SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC),
4829 	SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC),
4830 	SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC),
4831 	SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269_FIXUP_AMIC),
4832 	SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269_FIXUP_AMIC),
4833 	SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269_FIXUP_AMIC),
4834 	SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_FIXUP_AMIC),
4835 	SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269_FIXUP_AMIC),
4836 	SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_FIXUP_AMIC),
4837 	SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_FIXUP_AMIC),
4838 	SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_FIXUP_AMIC),
4839 	SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_FIXUP_AMIC),
4840 	SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_FIXUP_AMIC),
4841 	SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_FIXUP_AMIC),
4842 	SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_FIXUP_AMIC),
4843 	SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_FIXUP_AMIC),
4844 	SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_FIXUP_AMIC),
4845 	SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_FIXUP_AMIC),
4846 	SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_FIXUP_AMIC),
4847 	SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_FIXUP_AMIC),
4848 	SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_FIXUP_AMIC),
4849 	SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_FIXUP_AMIC),
4850 	SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_FIXUP_AMIC),
4851 	SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_FIXUP_AMIC),
4852 	SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_FIXUP_AMIC),
4853 	SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_FIXUP_AMIC),
4854 	SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_FIXUP_AMIC),
4855 	SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_FIXUP_AMIC),
4856 	SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_FIXUP_AMIC),
4857 	SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_FIXUP_AMIC),
4858 	SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_FIXUP_AMIC),
4859 	SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_FIXUP_AMIC),
4860 	SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_FIXUP_AMIC),
4861 	SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_FIXUP_DMIC),
4862 	SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_FIXUP_AMIC),
4863 	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_AMIC),
4864 	SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_FIXUP_DMIC),
4865 	SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_FIXUP_DMIC),
4866 #endif
4867 	{}
4868 };
4869 
4870 static const struct snd_pci_quirk alc269_fixup_vendor_tbl[] = {
4871 	SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
4872 	SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED),
4873 	SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
4874 	SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", ALC269_FIXUP_THINKPAD_ACPI),
4875 	{}
4876 };
4877 
4878 static const struct hda_model_fixup alc269_fixup_models[] = {
4879 	{.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"},
4880 	{.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"},
4881 	{.id = ALC269_FIXUP_STEREO_DMIC, .name = "alc269-dmic"},
4882 	{.id = ALC271_FIXUP_DMIC, .name = "alc271-dmic"},
4883 	{.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"},
4884 	{.id = ALC269_FIXUP_HEADSET_MIC, .name = "headset-mic"},
4885 	{.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
4886 	{.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
4887 	{.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
4888 	{.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
4889 	{.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},
4890 	{.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"},
4891 	{.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
4892 	{}
4893 };
4894 
4895 #define ALC255_STANDARD_PINS \
4896 	{0x18, 0x411111f0}, \
4897 	{0x19, 0x411111f0}, \
4898 	{0x1a, 0x411111f0}, \
4899 	{0x1b, 0x411111f0}, \
4900 	{0x1e, 0x411111f0}
4901 
4902 #define ALC282_STANDARD_PINS \
4903 	{0x14, 0x90170110}, \
4904 	{0x18, 0x411111f0}, \
4905 	{0x1a, 0x411111f0}, \
4906 	{0x1b, 0x411111f0}, \
4907 	{0x1e, 0x411111f0}
4908 
4909 #define ALC290_STANDARD_PINS \
4910 	{0x12, 0x99a30130}, \
4911 	{0x13, 0x40000000}, \
4912 	{0x16, 0x411111f0}, \
4913 	{0x17, 0x411111f0}, \
4914 	{0x19, 0x411111f0}, \
4915 	{0x1b, 0x411111f0}, \
4916 	{0x1e, 0x411111f0}
4917 
4918 #define ALC292_STANDARD_PINS \
4919 	{0x14, 0x90170110}, \
4920 	{0x15, 0x0221401f}, \
4921 	{0x1a, 0x411111f0}, \
4922 	{0x1b, 0x411111f0}, \
4923 	{0x1d, 0x40700001}, \
4924 	{0x1e, 0x411111f0}
4925 
4926 static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
4927 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
4928 		ALC255_STANDARD_PINS,
4929 		{0x12, 0x40300000},
4930 		{0x14, 0x90170110},
4931 		{0x17, 0x411111f0},
4932 		{0x1d, 0x40538029},
4933 		{0x21, 0x02211020}),
4934 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
4935 		ALC255_STANDARD_PINS,
4936 		{0x12, 0x90a60140},
4937 		{0x14, 0x90170110},
4938 		{0x17, 0x40000000},
4939 		{0x1d, 0x40700001},
4940 		{0x21, 0x02211020}),
4941 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
4942 		ALC255_STANDARD_PINS,
4943 		{0x12, 0x90a60160},
4944 		{0x14, 0x90170120},
4945 		{0x17, 0x40000000},
4946 		{0x1d, 0x40700001},
4947 		{0x21, 0x02211030}),
4948 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
4949 		{0x12, 0x90a60160},
4950 		{0x14, 0x90170120},
4951 		{0x17, 0x90170140},
4952 		{0x18, 0x40000000},
4953 		{0x19, 0x411111f0},
4954 		{0x1a, 0x411111f0},
4955 		{0x1b, 0x411111f0},
4956 		{0x1d, 0x41163b05},
4957 		{0x1e, 0x411111f0},
4958 		{0x21, 0x0321102f}),
4959 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
4960 		ALC255_STANDARD_PINS,
4961 		{0x12, 0x90a60160},
4962 		{0x14, 0x90170130},
4963 		{0x17, 0x40000000},
4964 		{0x1d, 0x40700001},
4965 		{0x21, 0x02211040}),
4966 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
4967 		ALC255_STANDARD_PINS,
4968 		{0x12, 0x90a60160},
4969 		{0x14, 0x90170140},
4970 		{0x17, 0x40000000},
4971 		{0x1d, 0x40700001},
4972 		{0x21, 0x02211050}),
4973 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
4974 		ALC255_STANDARD_PINS,
4975 		{0x12, 0x90a60170},
4976 		{0x14, 0x90170120},
4977 		{0x17, 0x40000000},
4978 		{0x1d, 0x40700001},
4979 		{0x21, 0x02211030}),
4980 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
4981 		ALC255_STANDARD_PINS,
4982 		{0x12, 0x90a60170},
4983 		{0x14, 0x90170130},
4984 		{0x17, 0x40000000},
4985 		{0x1d, 0x40700001},
4986 		{0x21, 0x02211040}),
4987 	SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED,
4988 		{0x12, 0x90a60140},
4989 		{0x13, 0x40000000},
4990 		{0x14, 0x90170110},
4991 		{0x15, 0x0421101f},
4992 		{0x16, 0x411111f0},
4993 		{0x17, 0x411111f0},
4994 		{0x18, 0x02811030},
4995 		{0x19, 0x411111f0},
4996 		{0x1a, 0x04a1103f},
4997 		{0x1b, 0x02011020},
4998 		{0x1d, 0x40700001},
4999 		{0x1e, 0x411111f0}),
5000 	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP 15 Touchsmart", ALC269_FIXUP_HP_MUTE_LED_MIC1,
5001 		ALC282_STANDARD_PINS,
5002 		{0x12, 0x99a30130},
5003 		{0x17, 0x40000000},
5004 		{0x19, 0x03a11020},
5005 		{0x1d, 0x40f41905},
5006 		{0x21, 0x0321101f}),
5007 	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
5008 		ALC282_STANDARD_PINS,
5009 		{0x12, 0x99a30130},
5010 		{0x17, 0x40020008},
5011 		{0x19, 0x03a11020},
5012 		{0x1d, 0x40e00001},
5013 		{0x21, 0x03211040}),
5014 	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
5015 		ALC282_STANDARD_PINS,
5016 		{0x12, 0x99a30130},
5017 		{0x17, 0x40000000},
5018 		{0x19, 0x03a11030},
5019 		{0x1d, 0x40e00001},
5020 		{0x21, 0x03211020}),
5021 	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
5022 		ALC282_STANDARD_PINS,
5023 		{0x12, 0x99a30130},
5024 		{0x17, 0x40000000},
5025 		{0x19, 0x03a11030},
5026 		{0x1d, 0x40f00001},
5027 		{0x21, 0x03211020}),
5028 	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
5029 		ALC282_STANDARD_PINS,
5030 		{0x12, 0x99a30130},
5031 		{0x17, 0x40000000},
5032 		{0x19, 0x04a11020},
5033 		{0x1d, 0x40f00001},
5034 		{0x21, 0x0421101f}),
5035 	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
5036 		ALC282_STANDARD_PINS,
5037 		{0x12, 0x99a30130},
5038 		{0x17, 0x40000000},
5039 		{0x19, 0x03a11030},
5040 		{0x1d, 0x40f00001},
5041 		{0x21, 0x04211020}),
5042 	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED,
5043 		ALC282_STANDARD_PINS,
5044 		{0x12, 0x90a60140},
5045 		{0x17, 0x40000000},
5046 		{0x19, 0x04a11030},
5047 		{0x1d, 0x40f00001},
5048 		{0x21, 0x04211020}),
5049 	SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
5050 		ALC282_STANDARD_PINS,
5051 		{0x12, 0x90a60130},
5052 		{0x17, 0x40020008},
5053 		{0x19, 0x411111f0},
5054 		{0x1d, 0x40e00001},
5055 		{0x21, 0x0321101f}),
5056 	SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
5057 		{0x12, 0x90a60160},
5058 		{0x14, 0x90170120},
5059 		{0x17, 0x40000000},
5060 		{0x18, 0x411111f0},
5061 		{0x19, 0x411111f0},
5062 		{0x1a, 0x411111f0},
5063 		{0x1b, 0x411111f0},
5064 		{0x1d, 0x40700001},
5065 		{0x1e, 0x411111f0},
5066 		{0x21, 0x02211030}),
5067 	SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
5068 		ALC282_STANDARD_PINS,
5069 		{0x12, 0x90a60130},
5070 		{0x17, 0x40020008},
5071 		{0x19, 0x03a11020},
5072 		{0x1d, 0x40e00001},
5073 		{0x21, 0x0321101f}),
5074 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
5075 		ALC290_STANDARD_PINS,
5076 		{0x14, 0x411111f0},
5077 		{0x15, 0x04211040},
5078 		{0x18, 0x90170112},
5079 		{0x1a, 0x04a11020},
5080 		{0x1d, 0x4075812d}),
5081 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
5082 		ALC290_STANDARD_PINS,
5083 		{0x14, 0x411111f0},
5084 		{0x15, 0x04211040},
5085 		{0x18, 0x90170110},
5086 		{0x1a, 0x04a11020},
5087 		{0x1d, 0x4075812d}),
5088 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
5089 		ALC290_STANDARD_PINS,
5090 		{0x14, 0x411111f0},
5091 		{0x15, 0x0421101f},
5092 		{0x18, 0x411111f0},
5093 		{0x1a, 0x04a11020},
5094 		{0x1d, 0x4075812d}),
5095 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
5096 		ALC290_STANDARD_PINS,
5097 		{0x14, 0x411111f0},
5098 		{0x15, 0x04211020},
5099 		{0x18, 0x411111f0},
5100 		{0x1a, 0x04a11040},
5101 		{0x1d, 0x4076a12d}),
5102 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
5103 		ALC290_STANDARD_PINS,
5104 		{0x14, 0x90170110},
5105 		{0x15, 0x04211020},
5106 		{0x18, 0x411111f0},
5107 		{0x1a, 0x04a11040},
5108 		{0x1d, 0x4076a12d}),
5109 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
5110 		ALC290_STANDARD_PINS,
5111 		{0x14, 0x90170110},
5112 		{0x15, 0x04211020},
5113 		{0x18, 0x411111f0},
5114 		{0x1a, 0x04a11020},
5115 		{0x1d, 0x4076a12d}),
5116 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
5117 		ALC290_STANDARD_PINS,
5118 		{0x14, 0x90170110},
5119 		{0x15, 0x0421101f},
5120 		{0x18, 0x411111f0},
5121 		{0x1a, 0x04a11020},
5122 		{0x1d, 0x4075812d}),
5123 	SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
5124 		ALC292_STANDARD_PINS,
5125 		{0x12, 0x90a60140},
5126 		{0x13, 0x411111f0},
5127 		{0x16, 0x01014020},
5128 		{0x18, 0x411111f0},
5129 		{0x19, 0x01a19030}),
5130 	SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
5131 		ALC292_STANDARD_PINS,
5132 		{0x12, 0x90a60140},
5133 		{0x13, 0x411111f0},
5134 		{0x16, 0x01014020},
5135 		{0x18, 0x02a19031},
5136 		{0x19, 0x01a1903e}),
5137 	SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
5138 		ALC292_STANDARD_PINS,
5139 		{0x12, 0x90a60140},
5140 		{0x13, 0x411111f0},
5141 		{0x16, 0x411111f0},
5142 		{0x18, 0x411111f0},
5143 		{0x19, 0x411111f0}),
5144 	SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
5145 		ALC292_STANDARD_PINS,
5146 		{0x12, 0x40000000},
5147 		{0x13, 0x90a60140},
5148 		{0x16, 0x21014020},
5149 		{0x18, 0x411111f0},
5150 		{0x19, 0x21a19030}),
5151 	SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
5152 		ALC292_STANDARD_PINS,
5153 		{0x12, 0x40000000},
5154 		{0x13, 0x90a60140},
5155 		{0x16, 0x411111f0},
5156 		{0x18, 0x411111f0},
5157 		{0x19, 0x411111f0}),
5158 	{}
5159 };
5160 
5161 static void alc269_fill_coef(struct hda_codec *codec)
5162 {
5163 	struct alc_spec *spec = codec->spec;
5164 	int val;
5165 
5166 	if (spec->codec_variant != ALC269_TYPE_ALC269VB)
5167 		return;
5168 
5169 	if ((alc_get_coef0(codec) & 0x00ff) < 0x015) {
5170 		alc_write_coef_idx(codec, 0xf, 0x960b);
5171 		alc_write_coef_idx(codec, 0xe, 0x8817);
5172 	}
5173 
5174 	if ((alc_get_coef0(codec) & 0x00ff) == 0x016) {
5175 		alc_write_coef_idx(codec, 0xf, 0x960b);
5176 		alc_write_coef_idx(codec, 0xe, 0x8814);
5177 	}
5178 
5179 	if ((alc_get_coef0(codec) & 0x00ff) == 0x017) {
5180 		/* Power up output pin */
5181 		alc_update_coef_idx(codec, 0x04, 0, 1<<11);
5182 	}
5183 
5184 	if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {
5185 		val = alc_read_coef_idx(codec, 0xd);
5186 		if (val != -1 && (val & 0x0c00) >> 10 != 0x1) {
5187 			/* Capless ramp up clock control */
5188 			alc_write_coef_idx(codec, 0xd, val | (1<<10));
5189 		}
5190 		val = alc_read_coef_idx(codec, 0x17);
5191 		if (val != -1 && (val & 0x01c0) >> 6 != 0x4) {
5192 			/* Class D power on reset */
5193 			alc_write_coef_idx(codec, 0x17, val | (1<<7));
5194 		}
5195 	}
5196 
5197 	/* Class D */
5198 	alc_update_coef_idx(codec, 0xd, 0, 1<<14);
5199 
5200 	/* HP */
5201 	alc_update_coef_idx(codec, 0x4, 0, 1<<11);
5202 }
5203 
5204 /*
5205  */
5206 static int patch_alc269(struct hda_codec *codec)
5207 {
5208 	struct alc_spec *spec;
5209 	int err;
5210 
5211 	err = alc_alloc_spec(codec, 0x0b);
5212 	if (err < 0)
5213 		return err;
5214 
5215 	spec = codec->spec;
5216 	spec->gen.shared_mic_vref_pin = 0x18;
5217 
5218 	snd_hda_pick_fixup(codec, alc269_fixup_models,
5219 		       alc269_fixup_tbl, alc269_fixups);
5220 	snd_hda_pick_pin_fixup(codec, alc269_pin_fixup_tbl, alc269_fixups);
5221 	snd_hda_pick_fixup(codec, NULL,	alc269_fixup_vendor_tbl,
5222 			   alc269_fixups);
5223 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
5224 
5225 	alc_auto_parse_customize_define(codec);
5226 
5227 	if (has_cdefine_beep(codec))
5228 		spec->gen.beep_nid = 0x01;
5229 
5230 	switch (codec->vendor_id) {
5231 	case 0x10ec0269:
5232 		spec->codec_variant = ALC269_TYPE_ALC269VA;
5233 		switch (alc_get_coef0(codec) & 0x00f0) {
5234 		case 0x0010:
5235 			if (codec->bus->pci &&
5236 			    codec->bus->pci->subsystem_vendor == 0x1025 &&
5237 			    spec->cdefine.platform_type == 1)
5238 				err = alc_codec_rename(codec, "ALC271X");
5239 			spec->codec_variant = ALC269_TYPE_ALC269VB;
5240 			break;
5241 		case 0x0020:
5242 			if (codec->bus->pci &&
5243 			    codec->bus->pci->subsystem_vendor == 0x17aa &&
5244 			    codec->bus->pci->subsystem_device == 0x21f3)
5245 				err = alc_codec_rename(codec, "ALC3202");
5246 			spec->codec_variant = ALC269_TYPE_ALC269VC;
5247 			break;
5248 		case 0x0030:
5249 			spec->codec_variant = ALC269_TYPE_ALC269VD;
5250 			break;
5251 		default:
5252 			alc_fix_pll_init(codec, 0x20, 0x04, 15);
5253 		}
5254 		if (err < 0)
5255 			goto error;
5256 		spec->init_hook = alc269_fill_coef;
5257 		alc269_fill_coef(codec);
5258 		break;
5259 
5260 	case 0x10ec0280:
5261 	case 0x10ec0290:
5262 		spec->codec_variant = ALC269_TYPE_ALC280;
5263 		break;
5264 	case 0x10ec0282:
5265 		spec->codec_variant = ALC269_TYPE_ALC282;
5266 		spec->shutup = alc282_shutup;
5267 		spec->init_hook = alc282_init;
5268 		break;
5269 	case 0x10ec0233:
5270 	case 0x10ec0283:
5271 		spec->codec_variant = ALC269_TYPE_ALC283;
5272 		spec->shutup = alc283_shutup;
5273 		spec->init_hook = alc283_init;
5274 		break;
5275 	case 0x10ec0284:
5276 	case 0x10ec0292:
5277 		spec->codec_variant = ALC269_TYPE_ALC284;
5278 		break;
5279 	case 0x10ec0285:
5280 	case 0x10ec0293:
5281 		spec->codec_variant = ALC269_TYPE_ALC285;
5282 		break;
5283 	case 0x10ec0286:
5284 	case 0x10ec0288:
5285 		spec->codec_variant = ALC269_TYPE_ALC286;
5286 		spec->shutup = alc286_shutup;
5287 		break;
5288 	case 0x10ec0255:
5289 		spec->codec_variant = ALC269_TYPE_ALC255;
5290 		break;
5291 	}
5292 
5293 	if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) {
5294 		spec->has_alc5505_dsp = 1;
5295 		spec->init_hook = alc5505_dsp_init;
5296 	}
5297 
5298 	/* automatic parse from the BIOS config */
5299 	err = alc269_parse_auto_config(codec);
5300 	if (err < 0)
5301 		goto error;
5302 
5303 	if (!spec->gen.no_analog && spec->gen.beep_nid)
5304 		set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
5305 
5306 	codec->patch_ops = alc_patch_ops;
5307 #ifdef CONFIG_PM
5308 	codec->patch_ops.suspend = alc269_suspend;
5309 	codec->patch_ops.resume = alc269_resume;
5310 #endif
5311 	if (!spec->shutup)
5312 		spec->shutup = alc269_shutup;
5313 
5314 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
5315 
5316 	return 0;
5317 
5318  error:
5319 	alc_free(codec);
5320 	return err;
5321 }
5322 
5323 /*
5324  * ALC861
5325  */
5326 
5327 static int alc861_parse_auto_config(struct hda_codec *codec)
5328 {
5329 	static const hda_nid_t alc861_ignore[] = { 0x1d, 0 };
5330 	static const hda_nid_t alc861_ssids[] = { 0x0e, 0x0f, 0x0b, 0 };
5331 	return alc_parse_auto_config(codec, alc861_ignore, alc861_ssids);
5332 }
5333 
5334 /* Pin config fixes */
5335 enum {
5336 	ALC861_FIXUP_FSC_AMILO_PI1505,
5337 	ALC861_FIXUP_AMP_VREF_0F,
5338 	ALC861_FIXUP_NO_JACK_DETECT,
5339 	ALC861_FIXUP_ASUS_A6RP,
5340 	ALC660_FIXUP_ASUS_W7J,
5341 };
5342 
5343 /* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */
5344 static void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec,
5345 			const struct hda_fixup *fix, int action)
5346 {
5347 	struct alc_spec *spec = codec->spec;
5348 	unsigned int val;
5349 
5350 	if (action != HDA_FIXUP_ACT_INIT)
5351 		return;
5352 	val = snd_hda_codec_get_pin_target(codec, 0x0f);
5353 	if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)))
5354 		val |= AC_PINCTL_IN_EN;
5355 	val |= AC_PINCTL_VREF_50;
5356 	snd_hda_set_pin_ctl(codec, 0x0f, val);
5357 	spec->gen.keep_vref_in_automute = 1;
5358 }
5359 
5360 /* suppress the jack-detection */
5361 static void alc_fixup_no_jack_detect(struct hda_codec *codec,
5362 				     const struct hda_fixup *fix, int action)
5363 {
5364 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
5365 		codec->no_jack_detect = 1;
5366 }
5367 
5368 static const struct hda_fixup alc861_fixups[] = {
5369 	[ALC861_FIXUP_FSC_AMILO_PI1505] = {
5370 		.type = HDA_FIXUP_PINS,
5371 		.v.pins = (const struct hda_pintbl[]) {
5372 			{ 0x0b, 0x0221101f }, /* HP */
5373 			{ 0x0f, 0x90170310 }, /* speaker */
5374 			{ }
5375 		}
5376 	},
5377 	[ALC861_FIXUP_AMP_VREF_0F] = {
5378 		.type = HDA_FIXUP_FUNC,
5379 		.v.func = alc861_fixup_asus_amp_vref_0f,
5380 	},
5381 	[ALC861_FIXUP_NO_JACK_DETECT] = {
5382 		.type = HDA_FIXUP_FUNC,
5383 		.v.func = alc_fixup_no_jack_detect,
5384 	},
5385 	[ALC861_FIXUP_ASUS_A6RP] = {
5386 		.type = HDA_FIXUP_FUNC,
5387 		.v.func = alc861_fixup_asus_amp_vref_0f,
5388 		.chained = true,
5389 		.chain_id = ALC861_FIXUP_NO_JACK_DETECT,
5390 	},
5391 	[ALC660_FIXUP_ASUS_W7J] = {
5392 		.type = HDA_FIXUP_VERBS,
5393 		.v.verbs = (const struct hda_verb[]) {
5394 			/* ASUS W7J needs a magic pin setup on unused NID 0x10
5395 			 * for enabling outputs
5396 			 */
5397 			{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5398 			{ }
5399 		},
5400 	}
5401 };
5402 
5403 static const struct snd_pci_quirk alc861_fixup_tbl[] = {
5404 	SND_PCI_QUIRK(0x1043, 0x1253, "ASUS W7J", ALC660_FIXUP_ASUS_W7J),
5405 	SND_PCI_QUIRK(0x1043, 0x1263, "ASUS Z35HL", ALC660_FIXUP_ASUS_W7J),
5406 	SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP),
5407 	SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", ALC861_FIXUP_AMP_VREF_0F),
5408 	SND_PCI_QUIRK(0x1462, 0x7254, "HP DX2200", ALC861_FIXUP_NO_JACK_DETECT),
5409 	SND_PCI_QUIRK(0x1584, 0x2b01, "Haier W18", ALC861_FIXUP_AMP_VREF_0F),
5410 	SND_PCI_QUIRK(0x1584, 0x0000, "Uniwill ECS M31EI", ALC861_FIXUP_AMP_VREF_0F),
5411 	SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", ALC861_FIXUP_FSC_AMILO_PI1505),
5412 	{}
5413 };
5414 
5415 /*
5416  */
5417 static int patch_alc861(struct hda_codec *codec)
5418 {
5419 	struct alc_spec *spec;
5420 	int err;
5421 
5422 	err = alc_alloc_spec(codec, 0x15);
5423 	if (err < 0)
5424 		return err;
5425 
5426 	spec = codec->spec;
5427 	spec->gen.beep_nid = 0x23;
5428 
5429 	snd_hda_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);
5430 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
5431 
5432 	/* automatic parse from the BIOS config */
5433 	err = alc861_parse_auto_config(codec);
5434 	if (err < 0)
5435 		goto error;
5436 
5437 	if (!spec->gen.no_analog)
5438 		set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
5439 
5440 	codec->patch_ops = alc_patch_ops;
5441 #ifdef CONFIG_PM
5442 	spec->power_hook = alc_power_eapd;
5443 #endif
5444 
5445 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
5446 
5447 	return 0;
5448 
5449  error:
5450 	alc_free(codec);
5451 	return err;
5452 }
5453 
5454 /*
5455  * ALC861-VD support
5456  *
5457  * Based on ALC882
5458  *
5459  * In addition, an independent DAC
5460  */
5461 static int alc861vd_parse_auto_config(struct hda_codec *codec)
5462 {
5463 	static const hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
5464 	static const hda_nid_t alc861vd_ssids[] = { 0x15, 0x1b, 0x14, 0 };
5465 	return alc_parse_auto_config(codec, alc861vd_ignore, alc861vd_ssids);
5466 }
5467 
5468 enum {
5469 	ALC660VD_FIX_ASUS_GPIO1,
5470 	ALC861VD_FIX_DALLAS,
5471 };
5472 
5473 /* exclude VREF80 */
5474 static void alc861vd_fixup_dallas(struct hda_codec *codec,
5475 				  const struct hda_fixup *fix, int action)
5476 {
5477 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5478 		snd_hda_override_pin_caps(codec, 0x18, 0x00000734);
5479 		snd_hda_override_pin_caps(codec, 0x19, 0x0000073c);
5480 	}
5481 }
5482 
5483 static const struct hda_fixup alc861vd_fixups[] = {
5484 	[ALC660VD_FIX_ASUS_GPIO1] = {
5485 		.type = HDA_FIXUP_VERBS,
5486 		.v.verbs = (const struct hda_verb[]) {
5487 			/* reset GPIO1 */
5488 			{0x01, AC_VERB_SET_GPIO_MASK, 0x03},
5489 			{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5490 			{0x01, AC_VERB_SET_GPIO_DATA, 0x01},
5491 			{ }
5492 		}
5493 	},
5494 	[ALC861VD_FIX_DALLAS] = {
5495 		.type = HDA_FIXUP_FUNC,
5496 		.v.func = alc861vd_fixup_dallas,
5497 	},
5498 };
5499 
5500 static const struct snd_pci_quirk alc861vd_fixup_tbl[] = {
5501 	SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_FIX_DALLAS),
5502 	SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
5503 	SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_FIX_DALLAS),
5504 	{}
5505 };
5506 
5507 /*
5508  */
5509 static int patch_alc861vd(struct hda_codec *codec)
5510 {
5511 	struct alc_spec *spec;
5512 	int err;
5513 
5514 	err = alc_alloc_spec(codec, 0x0b);
5515 	if (err < 0)
5516 		return err;
5517 
5518 	spec = codec->spec;
5519 	spec->gen.beep_nid = 0x23;
5520 
5521 	snd_hda_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);
5522 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
5523 
5524 	/* automatic parse from the BIOS config */
5525 	err = alc861vd_parse_auto_config(codec);
5526 	if (err < 0)
5527 		goto error;
5528 
5529 	if (!spec->gen.no_analog)
5530 		set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
5531 
5532 	codec->patch_ops = alc_patch_ops;
5533 
5534 	spec->shutup = alc_eapd_shutup;
5535 
5536 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
5537 
5538 	return 0;
5539 
5540  error:
5541 	alc_free(codec);
5542 	return err;
5543 }
5544 
5545 /*
5546  * ALC662 support
5547  *
5548  * ALC662 is almost identical with ALC880 but has cleaner and more flexible
5549  * configuration.  Each pin widget can choose any input DACs and a mixer.
5550  * Each ADC is connected from a mixer of all inputs.  This makes possible
5551  * 6-channel independent captures.
5552  *
5553  * In addition, an independent DAC for the multi-playback (not used in this
5554  * driver yet).
5555  */
5556 
5557 /*
5558  * BIOS auto configuration
5559  */
5560 
5561 static int alc662_parse_auto_config(struct hda_codec *codec)
5562 {
5563 	static const hda_nid_t alc662_ignore[] = { 0x1d, 0 };
5564 	static const hda_nid_t alc663_ssids[] = { 0x15, 0x1b, 0x14, 0x21 };
5565 	static const hda_nid_t alc662_ssids[] = { 0x15, 0x1b, 0x14, 0 };
5566 	const hda_nid_t *ssids;
5567 
5568 	if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
5569 	    codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670 ||
5570 	    codec->vendor_id == 0x10ec0671)
5571 		ssids = alc663_ssids;
5572 	else
5573 		ssids = alc662_ssids;
5574 	return alc_parse_auto_config(codec, alc662_ignore, ssids);
5575 }
5576 
5577 static void alc272_fixup_mario(struct hda_codec *codec,
5578 			       const struct hda_fixup *fix, int action)
5579 {
5580 	if (action != HDA_FIXUP_ACT_PRE_PROBE)
5581 		return;
5582 	if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
5583 				      (0x3b << AC_AMPCAP_OFFSET_SHIFT) |
5584 				      (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |
5585 				      (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |
5586 				      (0 << AC_AMPCAP_MUTE_SHIFT)))
5587 		codec_warn(codec, "failed to override amp caps for NID 0x2\n");
5588 }
5589 
5590 static const struct snd_pcm_chmap_elem asus_pcm_2_1_chmaps[] = {
5591 	{ .channels = 2,
5592 	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
5593 	{ .channels = 4,
5594 	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
5595 		   SNDRV_CHMAP_NA, SNDRV_CHMAP_LFE } }, /* LFE only on right */
5596 	{ }
5597 };
5598 
5599 /* override the 2.1 chmap */
5600 static void alc_fixup_bass_chmap(struct hda_codec *codec,
5601 				    const struct hda_fixup *fix, int action)
5602 {
5603 	if (action == HDA_FIXUP_ACT_BUILD) {
5604 		struct alc_spec *spec = codec->spec;
5605 		spec->gen.pcm_rec[0].stream[0].chmap = asus_pcm_2_1_chmaps;
5606 	}
5607 }
5608 
5609 /* turn on/off mute LED per vmaster hook */
5610 static void alc662_led_gpio1_mute_hook(void *private_data, int enabled)
5611 {
5612 	struct hda_codec *codec = private_data;
5613 	struct alc_spec *spec = codec->spec;
5614 	unsigned int oldval = spec->gpio_led;
5615 
5616 	if (enabled)
5617 		spec->gpio_led |= 0x01;
5618 	else
5619 		spec->gpio_led &= ~0x01;
5620 	if (spec->gpio_led != oldval)
5621 		snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
5622 				    spec->gpio_led);
5623 }
5624 
5625 /* avoid D3 for keeping GPIO up */
5626 static unsigned int gpio_led_power_filter(struct hda_codec *codec,
5627 					  hda_nid_t nid,
5628 					  unsigned int power_state)
5629 {
5630 	struct alc_spec *spec = codec->spec;
5631 	if (nid == codec->afg && power_state == AC_PWRST_D3 && spec->gpio_led)
5632 		return AC_PWRST_D0;
5633 	return power_state;
5634 }
5635 
5636 static void alc662_fixup_led_gpio1(struct hda_codec *codec,
5637 				   const struct hda_fixup *fix, int action)
5638 {
5639 	struct alc_spec *spec = codec->spec;
5640 	static const struct hda_verb gpio_init[] = {
5641 		{ 0x01, AC_VERB_SET_GPIO_MASK, 0x01 },
5642 		{ 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01 },
5643 		{}
5644 	};
5645 
5646 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5647 		spec->gen.vmaster_mute.hook = alc662_led_gpio1_mute_hook;
5648 		spec->gpio_led = 0;
5649 		snd_hda_add_verbs(codec, gpio_init);
5650 		codec->power_filter = gpio_led_power_filter;
5651 	}
5652 }
5653 
5654 enum {
5655 	ALC662_FIXUP_ASPIRE,
5656 	ALC662_FIXUP_LED_GPIO1,
5657 	ALC662_FIXUP_IDEAPAD,
5658 	ALC272_FIXUP_MARIO,
5659 	ALC662_FIXUP_CZC_P10T,
5660 	ALC662_FIXUP_SKU_IGNORE,
5661 	ALC662_FIXUP_HP_RP5800,
5662 	ALC662_FIXUP_ASUS_MODE1,
5663 	ALC662_FIXUP_ASUS_MODE2,
5664 	ALC662_FIXUP_ASUS_MODE3,
5665 	ALC662_FIXUP_ASUS_MODE4,
5666 	ALC662_FIXUP_ASUS_MODE5,
5667 	ALC662_FIXUP_ASUS_MODE6,
5668 	ALC662_FIXUP_ASUS_MODE7,
5669 	ALC662_FIXUP_ASUS_MODE8,
5670 	ALC662_FIXUP_NO_JACK_DETECT,
5671 	ALC662_FIXUP_ZOTAC_Z68,
5672 	ALC662_FIXUP_INV_DMIC,
5673 	ALC668_FIXUP_DELL_MIC_NO_PRESENCE,
5674 	ALC668_FIXUP_HEADSET_MODE,
5675 	ALC662_FIXUP_BASS_MODE4_CHMAP,
5676 	ALC662_FIXUP_BASS_16,
5677 	ALC662_FIXUP_BASS_1A,
5678 	ALC662_FIXUP_BASS_CHMAP,
5679 	ALC668_FIXUP_AUTO_MUTE,
5680 	ALC668_FIXUP_DELL_DISABLE_AAMIX,
5681 	ALC668_FIXUP_DELL_XPS13,
5682 };
5683 
5684 static const struct hda_fixup alc662_fixups[] = {
5685 	[ALC662_FIXUP_ASPIRE] = {
5686 		.type = HDA_FIXUP_PINS,
5687 		.v.pins = (const struct hda_pintbl[]) {
5688 			{ 0x15, 0x99130112 }, /* subwoofer */
5689 			{ }
5690 		}
5691 	},
5692 	[ALC662_FIXUP_LED_GPIO1] = {
5693 		.type = HDA_FIXUP_FUNC,
5694 		.v.func = alc662_fixup_led_gpio1,
5695 	},
5696 	[ALC662_FIXUP_IDEAPAD] = {
5697 		.type = HDA_FIXUP_PINS,
5698 		.v.pins = (const struct hda_pintbl[]) {
5699 			{ 0x17, 0x99130112 }, /* subwoofer */
5700 			{ }
5701 		},
5702 		.chained = true,
5703 		.chain_id = ALC662_FIXUP_LED_GPIO1,
5704 	},
5705 	[ALC272_FIXUP_MARIO] = {
5706 		.type = HDA_FIXUP_FUNC,
5707 		.v.func = alc272_fixup_mario,
5708 	},
5709 	[ALC662_FIXUP_CZC_P10T] = {
5710 		.type = HDA_FIXUP_VERBS,
5711 		.v.verbs = (const struct hda_verb[]) {
5712 			{0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
5713 			{}
5714 		}
5715 	},
5716 	[ALC662_FIXUP_SKU_IGNORE] = {
5717 		.type = HDA_FIXUP_FUNC,
5718 		.v.func = alc_fixup_sku_ignore,
5719 	},
5720 	[ALC662_FIXUP_HP_RP5800] = {
5721 		.type = HDA_FIXUP_PINS,
5722 		.v.pins = (const struct hda_pintbl[]) {
5723 			{ 0x14, 0x0221201f }, /* HP out */
5724 			{ }
5725 		},
5726 		.chained = true,
5727 		.chain_id = ALC662_FIXUP_SKU_IGNORE
5728 	},
5729 	[ALC662_FIXUP_ASUS_MODE1] = {
5730 		.type = HDA_FIXUP_PINS,
5731 		.v.pins = (const struct hda_pintbl[]) {
5732 			{ 0x14, 0x99130110 }, /* speaker */
5733 			{ 0x18, 0x01a19c20 }, /* mic */
5734 			{ 0x19, 0x99a3092f }, /* int-mic */
5735 			{ 0x21, 0x0121401f }, /* HP out */
5736 			{ }
5737 		},
5738 		.chained = true,
5739 		.chain_id = ALC662_FIXUP_SKU_IGNORE
5740 	},
5741 	[ALC662_FIXUP_ASUS_MODE2] = {
5742 		.type = HDA_FIXUP_PINS,
5743 		.v.pins = (const struct hda_pintbl[]) {
5744 			{ 0x14, 0x99130110 }, /* speaker */
5745 			{ 0x18, 0x01a19820 }, /* mic */
5746 			{ 0x19, 0x99a3092f }, /* int-mic */
5747 			{ 0x1b, 0x0121401f }, /* HP out */
5748 			{ }
5749 		},
5750 		.chained = true,
5751 		.chain_id = ALC662_FIXUP_SKU_IGNORE
5752 	},
5753 	[ALC662_FIXUP_ASUS_MODE3] = {
5754 		.type = HDA_FIXUP_PINS,
5755 		.v.pins = (const struct hda_pintbl[]) {
5756 			{ 0x14, 0x99130110 }, /* speaker */
5757 			{ 0x15, 0x0121441f }, /* HP */
5758 			{ 0x18, 0x01a19840 }, /* mic */
5759 			{ 0x19, 0x99a3094f }, /* int-mic */
5760 			{ 0x21, 0x01211420 }, /* HP2 */
5761 			{ }
5762 		},
5763 		.chained = true,
5764 		.chain_id = ALC662_FIXUP_SKU_IGNORE
5765 	},
5766 	[ALC662_FIXUP_ASUS_MODE4] = {
5767 		.type = HDA_FIXUP_PINS,
5768 		.v.pins = (const struct hda_pintbl[]) {
5769 			{ 0x14, 0x99130110 }, /* speaker */
5770 			{ 0x16, 0x99130111 }, /* speaker */
5771 			{ 0x18, 0x01a19840 }, /* mic */
5772 			{ 0x19, 0x99a3094f }, /* int-mic */
5773 			{ 0x21, 0x0121441f }, /* HP */
5774 			{ }
5775 		},
5776 		.chained = true,
5777 		.chain_id = ALC662_FIXUP_SKU_IGNORE
5778 	},
5779 	[ALC662_FIXUP_ASUS_MODE5] = {
5780 		.type = HDA_FIXUP_PINS,
5781 		.v.pins = (const struct hda_pintbl[]) {
5782 			{ 0x14, 0x99130110 }, /* speaker */
5783 			{ 0x15, 0x0121441f }, /* HP */
5784 			{ 0x16, 0x99130111 }, /* speaker */
5785 			{ 0x18, 0x01a19840 }, /* mic */
5786 			{ 0x19, 0x99a3094f }, /* int-mic */
5787 			{ }
5788 		},
5789 		.chained = true,
5790 		.chain_id = ALC662_FIXUP_SKU_IGNORE
5791 	},
5792 	[ALC662_FIXUP_ASUS_MODE6] = {
5793 		.type = HDA_FIXUP_PINS,
5794 		.v.pins = (const struct hda_pintbl[]) {
5795 			{ 0x14, 0x99130110 }, /* speaker */
5796 			{ 0x15, 0x01211420 }, /* HP2 */
5797 			{ 0x18, 0x01a19840 }, /* mic */
5798 			{ 0x19, 0x99a3094f }, /* int-mic */
5799 			{ 0x1b, 0x0121441f }, /* HP */
5800 			{ }
5801 		},
5802 		.chained = true,
5803 		.chain_id = ALC662_FIXUP_SKU_IGNORE
5804 	},
5805 	[ALC662_FIXUP_ASUS_MODE7] = {
5806 		.type = HDA_FIXUP_PINS,
5807 		.v.pins = (const struct hda_pintbl[]) {
5808 			{ 0x14, 0x99130110 }, /* speaker */
5809 			{ 0x17, 0x99130111 }, /* speaker */
5810 			{ 0x18, 0x01a19840 }, /* mic */
5811 			{ 0x19, 0x99a3094f }, /* int-mic */
5812 			{ 0x1b, 0x01214020 }, /* HP */
5813 			{ 0x21, 0x0121401f }, /* HP */
5814 			{ }
5815 		},
5816 		.chained = true,
5817 		.chain_id = ALC662_FIXUP_SKU_IGNORE
5818 	},
5819 	[ALC662_FIXUP_ASUS_MODE8] = {
5820 		.type = HDA_FIXUP_PINS,
5821 		.v.pins = (const struct hda_pintbl[]) {
5822 			{ 0x14, 0x99130110 }, /* speaker */
5823 			{ 0x12, 0x99a30970 }, /* int-mic */
5824 			{ 0x15, 0x01214020 }, /* HP */
5825 			{ 0x17, 0x99130111 }, /* speaker */
5826 			{ 0x18, 0x01a19840 }, /* mic */
5827 			{ 0x21, 0x0121401f }, /* HP */
5828 			{ }
5829 		},
5830 		.chained = true,
5831 		.chain_id = ALC662_FIXUP_SKU_IGNORE
5832 	},
5833 	[ALC662_FIXUP_NO_JACK_DETECT] = {
5834 		.type = HDA_FIXUP_FUNC,
5835 		.v.func = alc_fixup_no_jack_detect,
5836 	},
5837 	[ALC662_FIXUP_ZOTAC_Z68] = {
5838 		.type = HDA_FIXUP_PINS,
5839 		.v.pins = (const struct hda_pintbl[]) {
5840 			{ 0x1b, 0x02214020 }, /* Front HP */
5841 			{ }
5842 		}
5843 	},
5844 	[ALC662_FIXUP_INV_DMIC] = {
5845 		.type = HDA_FIXUP_FUNC,
5846 		.v.func = alc_fixup_inv_dmic,
5847 	},
5848 	[ALC668_FIXUP_DELL_XPS13] = {
5849 		.type = HDA_FIXUP_FUNC,
5850 		.v.func = alc_fixup_dell_xps13,
5851 		.chained = true,
5852 		.chain_id = ALC668_FIXUP_DELL_DISABLE_AAMIX
5853 	},
5854 	[ALC668_FIXUP_DELL_DISABLE_AAMIX] = {
5855 		.type = HDA_FIXUP_FUNC,
5856 		.v.func = alc_fixup_disable_aamix,
5857 		.chained = true,
5858 		.chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
5859 	},
5860 	[ALC668_FIXUP_AUTO_MUTE] = {
5861 		.type = HDA_FIXUP_FUNC,
5862 		.v.func = alc_fixup_auto_mute_via_amp,
5863 		.chained = true,
5864 		.chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
5865 	},
5866 	[ALC668_FIXUP_DELL_MIC_NO_PRESENCE] = {
5867 		.type = HDA_FIXUP_PINS,
5868 		.v.pins = (const struct hda_pintbl[]) {
5869 			{ 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
5870 			{ 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
5871 			{ }
5872 		},
5873 		.chained = true,
5874 		.chain_id = ALC668_FIXUP_HEADSET_MODE
5875 	},
5876 	[ALC668_FIXUP_HEADSET_MODE] = {
5877 		.type = HDA_FIXUP_FUNC,
5878 		.v.func = alc_fixup_headset_mode_alc668,
5879 	},
5880 	[ALC662_FIXUP_BASS_MODE4_CHMAP] = {
5881 		.type = HDA_FIXUP_FUNC,
5882 		.v.func = alc_fixup_bass_chmap,
5883 		.chained = true,
5884 		.chain_id = ALC662_FIXUP_ASUS_MODE4
5885 	},
5886 	[ALC662_FIXUP_BASS_16] = {
5887 		.type = HDA_FIXUP_PINS,
5888 		.v.pins = (const struct hda_pintbl[]) {
5889 			{0x16, 0x80106111}, /* bass speaker */
5890 			{}
5891 		},
5892 		.chained = true,
5893 		.chain_id = ALC662_FIXUP_BASS_CHMAP,
5894 	},
5895 	[ALC662_FIXUP_BASS_1A] = {
5896 		.type = HDA_FIXUP_PINS,
5897 		.v.pins = (const struct hda_pintbl[]) {
5898 			{0x1a, 0x80106111}, /* bass speaker */
5899 			{}
5900 		},
5901 		.chained = true,
5902 		.chain_id = ALC662_FIXUP_BASS_CHMAP,
5903 	},
5904 	[ALC662_FIXUP_BASS_CHMAP] = {
5905 		.type = HDA_FIXUP_FUNC,
5906 		.v.func = alc_fixup_bass_chmap,
5907 	},
5908 };
5909 
5910 static const struct snd_pci_quirk alc662_fixup_tbl[] = {
5911 	SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2),
5912 	SND_PCI_QUIRK(0x1025, 0x022f, "Acer Aspire One", ALC662_FIXUP_INV_DMIC),
5913 	SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
5914 	SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),
5915 	SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC),
5916 	SND_PCI_QUIRK(0x1025, 0x034a, "Gateway LT27", ALC662_FIXUP_INV_DMIC),
5917 	SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
5918 	SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
5919 	SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
5920 	SND_PCI_QUIRK(0x1028, 0x05fe, "Dell XPS 15", ALC668_FIXUP_DELL_XPS13),
5921 	SND_PCI_QUIRK(0x1028, 0x060a, "Dell XPS 13", ALC668_FIXUP_DELL_XPS13),
5922 	SND_PCI_QUIRK(0x1028, 0x0625, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
5923 	SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
5924 	SND_PCI_QUIRK(0x1028, 0x0696, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
5925 	SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
5926 	SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
5927 	SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
5928 	SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_BASS_1A),
5929 	SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
5930 	SND_PCI_QUIRK(0x1043, 0x15a7, "ASUS UX51VZH", ALC662_FIXUP_BASS_16),
5931 	SND_PCI_QUIRK(0x1043, 0x1b73, "ASUS N55SF", ALC662_FIXUP_BASS_16),
5932 	SND_PCI_QUIRK(0x1043, 0x1bf3, "ASUS N76VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
5933 	SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),
5934 	SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
5935 	SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
5936 	SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
5937 	SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
5938 	SND_PCI_QUIRK(0x19da, 0xa130, "Zotac Z68", ALC662_FIXUP_ZOTAC_Z68),
5939 	SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
5940 
5941 #if 0
5942 	/* Below is a quirk table taken from the old code.
5943 	 * Basically the device should work as is without the fixup table.
5944 	 * If BIOS doesn't give a proper info, enable the corresponding
5945 	 * fixup entry.
5946 	 */
5947 	SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1),
5948 	SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3),
5949 	SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1),
5950 	SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC662_FIXUP_ASUS_MODE3),
5951 	SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
5952 	SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
5953 	SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
5954 	SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC662_FIXUP_ASUS_MODE1),
5955 	SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC662_FIXUP_ASUS_MODE1),
5956 	SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
5957 	SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC662_FIXUP_ASUS_MODE7),
5958 	SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC662_FIXUP_ASUS_MODE7),
5959 	SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC662_FIXUP_ASUS_MODE8),
5960 	SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC662_FIXUP_ASUS_MODE3),
5961 	SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC662_FIXUP_ASUS_MODE1),
5962 	SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
5963 	SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_FIXUP_ASUS_MODE2),
5964 	SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC662_FIXUP_ASUS_MODE1),
5965 	SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
5966 	SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
5967 	SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
5968 	SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
5969 	SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC662_FIXUP_ASUS_MODE1),
5970 	SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC662_FIXUP_ASUS_MODE3),
5971 	SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_FIXUP_ASUS_MODE2),
5972 	SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
5973 	SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC662_FIXUP_ASUS_MODE5),
5974 	SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
5975 	SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
5976 	SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC662_FIXUP_ASUS_MODE1),
5977 	SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
5978 	SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
5979 	SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC662_FIXUP_ASUS_MODE3),
5980 	SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC662_FIXUP_ASUS_MODE3),
5981 	SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC662_FIXUP_ASUS_MODE1),
5982 	SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC662_FIXUP_ASUS_MODE1),
5983 	SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC662_FIXUP_ASUS_MODE1),
5984 	SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC662_FIXUP_ASUS_MODE1),
5985 	SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC662_FIXUP_ASUS_MODE1),
5986 	SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
5987 	SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_FIXUP_ASUS_MODE2),
5988 	SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC662_FIXUP_ASUS_MODE1),
5989 	SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
5990 	SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC662_FIXUP_ASUS_MODE3),
5991 	SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC662_FIXUP_ASUS_MODE1),
5992 	SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC662_FIXUP_ASUS_MODE1),
5993 	SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC662_FIXUP_ASUS_MODE1),
5994 	SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_FIXUP_ASUS_MODE2),
5995 	SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
5996 	SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE4),
5997 #endif
5998 	{}
5999 };
6000 
6001 static const struct hda_model_fixup alc662_fixup_models[] = {
6002 	{.id = ALC272_FIXUP_MARIO, .name = "mario"},
6003 	{.id = ALC662_FIXUP_ASUS_MODE1, .name = "asus-mode1"},
6004 	{.id = ALC662_FIXUP_ASUS_MODE2, .name = "asus-mode2"},
6005 	{.id = ALC662_FIXUP_ASUS_MODE3, .name = "asus-mode3"},
6006 	{.id = ALC662_FIXUP_ASUS_MODE4, .name = "asus-mode4"},
6007 	{.id = ALC662_FIXUP_ASUS_MODE5, .name = "asus-mode5"},
6008 	{.id = ALC662_FIXUP_ASUS_MODE6, .name = "asus-mode6"},
6009 	{.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},
6010 	{.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},
6011 	{.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"},
6012 	{.id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
6013 	{}
6014 };
6015 
6016 static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = {
6017 	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
6018 		{0x12, 0x99a30130},
6019 		{0x14, 0x90170110},
6020 		{0x15, 0x0321101f},
6021 		{0x16, 0x03011020},
6022 		{0x18, 0x40000008},
6023 		{0x19, 0x411111f0},
6024 		{0x1a, 0x411111f0},
6025 		{0x1b, 0x411111f0},
6026 		{0x1d, 0x41000001},
6027 		{0x1e, 0x411111f0},
6028 		{0x1f, 0x411111f0}),
6029 	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
6030 		{0x12, 0x99a30140},
6031 		{0x14, 0x90170110},
6032 		{0x15, 0x0321101f},
6033 		{0x16, 0x03011020},
6034 		{0x18, 0x40000008},
6035 		{0x19, 0x411111f0},
6036 		{0x1a, 0x411111f0},
6037 		{0x1b, 0x411111f0},
6038 		{0x1d, 0x41000001},
6039 		{0x1e, 0x411111f0},
6040 		{0x1f, 0x411111f0}),
6041 	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
6042 		{0x12, 0x99a30150},
6043 		{0x14, 0x90170110},
6044 		{0x15, 0x0321101f},
6045 		{0x16, 0x03011020},
6046 		{0x18, 0x40000008},
6047 		{0x19, 0x411111f0},
6048 		{0x1a, 0x411111f0},
6049 		{0x1b, 0x411111f0},
6050 		{0x1d, 0x41000001},
6051 		{0x1e, 0x411111f0},
6052 		{0x1f, 0x411111f0}),
6053 	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
6054 		{0x12, 0x411111f0},
6055 		{0x14, 0x90170110},
6056 		{0x15, 0x0321101f},
6057 		{0x16, 0x03011020},
6058 		{0x18, 0x40000008},
6059 		{0x19, 0x411111f0},
6060 		{0x1a, 0x411111f0},
6061 		{0x1b, 0x411111f0},
6062 		{0x1d, 0x41000001},
6063 		{0x1e, 0x411111f0},
6064 		{0x1f, 0x411111f0}),
6065 	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell XPS 15", ALC668_FIXUP_AUTO_MUTE,
6066 		{0x12, 0x90a60130},
6067 		{0x14, 0x90170110},
6068 		{0x15, 0x0321101f},
6069 		{0x16, 0x40000000},
6070 		{0x18, 0x411111f0},
6071 		{0x19, 0x411111f0},
6072 		{0x1a, 0x411111f0},
6073 		{0x1b, 0x411111f0},
6074 		{0x1d, 0x40d6832d},
6075 		{0x1e, 0x411111f0},
6076 		{0x1f, 0x411111f0}),
6077 	{}
6078 };
6079 
6080 static void alc662_fill_coef(struct hda_codec *codec)
6081 {
6082 	int coef;
6083 
6084 	coef = alc_get_coef0(codec);
6085 
6086 	switch (codec->vendor_id) {
6087 	case 0x10ec0662:
6088 		if ((coef & 0x00f0) == 0x0030)
6089 			alc_update_coef_idx(codec, 0x4, 1<<10, 0); /* EAPD Ctrl */
6090 		break;
6091 	case 0x10ec0272:
6092 	case 0x10ec0273:
6093 	case 0x10ec0663:
6094 	case 0x10ec0665:
6095 	case 0x10ec0670:
6096 	case 0x10ec0671:
6097 	case 0x10ec0672:
6098 		alc_update_coef_idx(codec, 0xd, 0, 1<<14); /* EAPD Ctrl */
6099 		break;
6100 	}
6101 }
6102 
6103 /*
6104  */
6105 static int patch_alc662(struct hda_codec *codec)
6106 {
6107 	struct alc_spec *spec;
6108 	int err;
6109 
6110 	err = alc_alloc_spec(codec, 0x0b);
6111 	if (err < 0)
6112 		return err;
6113 
6114 	spec = codec->spec;
6115 
6116 	/* handle multiple HPs as is */
6117 	spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
6118 
6119 	alc_fix_pll_init(codec, 0x20, 0x04, 15);
6120 
6121 	spec->init_hook = alc662_fill_coef;
6122 	alc662_fill_coef(codec);
6123 
6124 	snd_hda_pick_fixup(codec, alc662_fixup_models,
6125 		       alc662_fixup_tbl, alc662_fixups);
6126 	snd_hda_pick_pin_fixup(codec, alc662_pin_fixup_tbl, alc662_fixups);
6127 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
6128 
6129 	alc_auto_parse_customize_define(codec);
6130 
6131 	if (has_cdefine_beep(codec))
6132 		spec->gen.beep_nid = 0x01;
6133 
6134 	if ((alc_get_coef0(codec) & (1 << 14)) &&
6135 	    codec->bus->pci && codec->bus->pci->subsystem_vendor == 0x1025 &&
6136 	    spec->cdefine.platform_type == 1) {
6137 		err = alc_codec_rename(codec, "ALC272X");
6138 		if (err < 0)
6139 			goto error;
6140 	}
6141 
6142 	/* automatic parse from the BIOS config */
6143 	err = alc662_parse_auto_config(codec);
6144 	if (err < 0)
6145 		goto error;
6146 
6147 	if (!spec->gen.no_analog && spec->gen.beep_nid) {
6148 		switch (codec->vendor_id) {
6149 		case 0x10ec0662:
6150 			set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
6151 			break;
6152 		case 0x10ec0272:
6153 		case 0x10ec0663:
6154 		case 0x10ec0665:
6155 		case 0x10ec0668:
6156 			set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
6157 			break;
6158 		case 0x10ec0273:
6159 			set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
6160 			break;
6161 		}
6162 	}
6163 
6164 	codec->patch_ops = alc_patch_ops;
6165 	spec->shutup = alc_eapd_shutup;
6166 
6167 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
6168 
6169 	return 0;
6170 
6171  error:
6172 	alc_free(codec);
6173 	return err;
6174 }
6175 
6176 /*
6177  * ALC680 support
6178  */
6179 
6180 static int alc680_parse_auto_config(struct hda_codec *codec)
6181 {
6182 	return alc_parse_auto_config(codec, NULL, NULL);
6183 }
6184 
6185 /*
6186  */
6187 static int patch_alc680(struct hda_codec *codec)
6188 {
6189 	int err;
6190 
6191 	/* ALC680 has no aa-loopback mixer */
6192 	err = alc_alloc_spec(codec, 0);
6193 	if (err < 0)
6194 		return err;
6195 
6196 	/* automatic parse from the BIOS config */
6197 	err = alc680_parse_auto_config(codec);
6198 	if (err < 0) {
6199 		alc_free(codec);
6200 		return err;
6201 	}
6202 
6203 	codec->patch_ops = alc_patch_ops;
6204 
6205 	return 0;
6206 }
6207 
6208 /*
6209  * patch entries
6210  */
6211 static const struct hda_codec_preset snd_hda_preset_realtek[] = {
6212 	{ .id = 0x10ec0221, .name = "ALC221", .patch = patch_alc269 },
6213 	{ .id = 0x10ec0231, .name = "ALC231", .patch = patch_alc269 },
6214 	{ .id = 0x10ec0233, .name = "ALC233", .patch = patch_alc269 },
6215 	{ .id = 0x10ec0235, .name = "ALC233", .patch = patch_alc269 },
6216 	{ .id = 0x10ec0255, .name = "ALC255", .patch = patch_alc269 },
6217 	{ .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
6218 	{ .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
6219 	{ .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
6220 	{ .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 },
6221 	{ .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 },
6222 	{ .id = 0x10ec0270, .name = "ALC270", .patch = patch_alc269 },
6223 	{ .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 },
6224 	{ .id = 0x10ec0275, .name = "ALC275", .patch = patch_alc269 },
6225 	{ .id = 0x10ec0276, .name = "ALC276", .patch = patch_alc269 },
6226 	{ .id = 0x10ec0280, .name = "ALC280", .patch = patch_alc269 },
6227 	{ .id = 0x10ec0282, .name = "ALC282", .patch = patch_alc269 },
6228 	{ .id = 0x10ec0283, .name = "ALC283", .patch = patch_alc269 },
6229 	{ .id = 0x10ec0284, .name = "ALC284", .patch = patch_alc269 },
6230 	{ .id = 0x10ec0285, .name = "ALC285", .patch = patch_alc269 },
6231 	{ .id = 0x10ec0286, .name = "ALC286", .patch = patch_alc269 },
6232 	{ .id = 0x10ec0288, .name = "ALC288", .patch = patch_alc269 },
6233 	{ .id = 0x10ec0290, .name = "ALC290", .patch = patch_alc269 },
6234 	{ .id = 0x10ec0292, .name = "ALC292", .patch = patch_alc269 },
6235 	{ .id = 0x10ec0293, .name = "ALC293", .patch = patch_alc269 },
6236 	{ .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
6237 	  .patch = patch_alc861 },
6238 	{ .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
6239 	{ .id = 0x10ec0861, .name = "ALC861", .patch = patch_alc861 },
6240 	{ .id = 0x10ec0862, .name = "ALC861-VD", .patch = patch_alc861vd },
6241 	{ .id = 0x10ec0662, .rev = 0x100002, .name = "ALC662 rev2",
6242 	  .patch = patch_alc882 },
6243 	{ .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1",
6244 	  .patch = patch_alc662 },
6245 	{ .id = 0x10ec0662, .rev = 0x100300, .name = "ALC662 rev3",
6246 	  .patch = patch_alc662 },
6247 	{ .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 },
6248 	{ .id = 0x10ec0665, .name = "ALC665", .patch = patch_alc662 },
6249 	{ .id = 0x10ec0667, .name = "ALC667", .patch = patch_alc662 },
6250 	{ .id = 0x10ec0668, .name = "ALC668", .patch = patch_alc662 },
6251 	{ .id = 0x10ec0670, .name = "ALC670", .patch = patch_alc662 },
6252 	{ .id = 0x10ec0671, .name = "ALC671", .patch = patch_alc662 },
6253 	{ .id = 0x10ec0680, .name = "ALC680", .patch = patch_alc680 },
6254 	{ .id = 0x10ec0867, .name = "ALC891", .patch = patch_alc882 },
6255 	{ .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
6256 	{ .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
6257 	{ .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 },
6258 	{ .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A",
6259 	  .patch = patch_alc882 },
6260 	{ .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A",
6261 	  .patch = patch_alc882 },
6262 	{ .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 },
6263 	{ .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc882 },
6264 	{ .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200",
6265 	  .patch = patch_alc882 },
6266 	{ .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc882 },
6267 	{ .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 },
6268 	{ .id = 0x10ec0892, .name = "ALC892", .patch = patch_alc662 },
6269 	{ .id = 0x10ec0899, .name = "ALC898", .patch = patch_alc882 },
6270 	{ .id = 0x10ec0900, .name = "ALC1150", .patch = patch_alc882 },
6271 	{} /* terminator */
6272 };
6273 
6274 MODULE_ALIAS("snd-hda-codec-id:10ec*");
6275 
6276 MODULE_LICENSE("GPL");
6277 MODULE_DESCRIPTION("Realtek HD-audio codec");
6278 
6279 static struct hda_codec_preset_list realtek_list = {
6280 	.preset = snd_hda_preset_realtek,
6281 	.owner = THIS_MODULE,
6282 };
6283 
6284 static int __init patch_realtek_init(void)
6285 {
6286 	return snd_hda_add_codec_preset(&realtek_list);
6287 }
6288 
6289 static void __exit patch_realtek_exit(void)
6290 {
6291 	snd_hda_delete_codec_preset(&realtek_list);
6292 }
6293 
6294 module_init(patch_realtek_init)
6295 module_exit(patch_realtek_exit)
6296