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