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