1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Universal Interface for Intel High Definition Audio Codec
4 *
5 * HD audio interface patch for Realtek ALC codecs
6 *
7 * Copyright (c) 2004 Kailang Yang <kailang@realtek.com.tw>
8 *                    PeiSen Hou <pshou@realtek.com.tw>
9 *                    Takashi Iwai <tiwai@suse.de>
10 *                    Jonathan Woithe <jwoithe@just42.net>
11 */
12
13#include <linux/init.h>
14#include <linux/delay.h>
15#include <linux/slab.h>
16#include <linux/pci.h>
17#include <linux/dmi.h>
18#include <linux/module.h>
19#include <linux/input.h>
20#include <linux/leds.h>
21#include <linux/ctype.h>
22#include <sound/core.h>
23#include <sound/jack.h>
24#include <sound/hda_codec.h>
25#include "hda_local.h"
26#include "hda_auto_parser.h"
27#include "hda_jack.h"
28#include "hda_generic.h"
29#include "hda_component.h"
30
31/* keep halting ALC5505 DSP, for power saving */
32#define HALT_REALTEK_ALC5505
33
34/* extra amp-initialization sequence types */
35enum {
36	ALC_INIT_UNDEFINED,
37	ALC_INIT_NONE,
38	ALC_INIT_DEFAULT,
39};
40
41enum {
42	ALC_HEADSET_MODE_UNKNOWN,
43	ALC_HEADSET_MODE_UNPLUGGED,
44	ALC_HEADSET_MODE_HEADSET,
45	ALC_HEADSET_MODE_MIC,
46	ALC_HEADSET_MODE_HEADPHONE,
47};
48
49enum {
50	ALC_HEADSET_TYPE_UNKNOWN,
51	ALC_HEADSET_TYPE_CTIA,
52	ALC_HEADSET_TYPE_OMTP,
53};
54
55enum {
56	ALC_KEY_MICMUTE_INDEX,
57};
58
59struct alc_customize_define {
60	unsigned int  sku_cfg;
61	unsigned char port_connectivity;
62	unsigned char check_sum;
63	unsigned char customization;
64	unsigned char external_amp;
65	unsigned int  enable_pcbeep:1;
66	unsigned int  platform_type:1;
67	unsigned int  swap:1;
68	unsigned int  override:1;
69	unsigned int  fixup:1; /* Means that this sku is set by driver, not read from hw */
70};
71
72struct alc_coef_led {
73	unsigned int idx;
74	unsigned int mask;
75	unsigned int on;
76	unsigned int off;
77};
78
79struct alc_spec {
80	struct hda_gen_spec gen; /* must be at head */
81
82	/* codec parameterization */
83	struct alc_customize_define cdefine;
84	unsigned int parse_flags; /* flag for snd_hda_parse_pin_defcfg() */
85
86	/* GPIO bits */
87	unsigned int gpio_mask;
88	unsigned int gpio_dir;
89	unsigned int gpio_data;
90	bool gpio_write_delay;	/* add a delay before writing gpio_data */
91
92	/* mute LED for HP laptops, see vref_mute_led_set() */
93	int mute_led_polarity;
94	int micmute_led_polarity;
95	hda_nid_t mute_led_nid;
96	hda_nid_t cap_mute_led_nid;
97
98	unsigned int gpio_mute_led_mask;
99	unsigned int gpio_mic_led_mask;
100	struct alc_coef_led mute_led_coef;
101	struct alc_coef_led mic_led_coef;
102	struct mutex coef_mutex;
103
104	hda_nid_t headset_mic_pin;
105	hda_nid_t headphone_mic_pin;
106	int current_headset_mode;
107	int current_headset_type;
108
109	/* hooks */
110	void (*init_hook)(struct hda_codec *codec);
111#ifdef CONFIG_PM
112	void (*power_hook)(struct hda_codec *codec);
113#endif
114	void (*shutup)(struct hda_codec *codec);
115
116	int init_amp;
117	int codec_variant;	/* flag for other variants */
118	unsigned int has_alc5505_dsp:1;
119	unsigned int no_depop_delay:1;
120	unsigned int done_hp_init:1;
121	unsigned int no_shutup_pins:1;
122	unsigned int ultra_low_power:1;
123	unsigned int has_hs_key:1;
124	unsigned int no_internal_mic_pin:1;
125	unsigned int en_3kpull_low:1;
126
127	/* for PLL fix */
128	hda_nid_t pll_nid;
129	unsigned int pll_coef_idx, pll_coef_bit;
130	unsigned int coef0;
131	struct input_dev *kb_dev;
132	u8 alc_mute_keycode_map[1];
133
134	/* component binding */
135	struct component_match *match;
136	struct hda_component comps[HDA_MAX_COMPONENTS];
137};
138
139/*
140 * COEF access helper functions
141 */
142
143static void coef_mutex_lock(struct hda_codec *codec)
144{
145	struct alc_spec *spec = codec->spec;
146
147	snd_hda_power_up_pm(codec);
148	mutex_lock(&spec->coef_mutex);
149}
150
151static void coef_mutex_unlock(struct hda_codec *codec)
152{
153	struct alc_spec *spec = codec->spec;
154
155	mutex_unlock(&spec->coef_mutex);
156	snd_hda_power_down_pm(codec);
157}
158
159static int __alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
160				 unsigned int coef_idx)
161{
162	unsigned int val;
163
164	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
165	val = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PROC_COEF, 0);
166	return val;
167}
168
169static int alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
170			       unsigned int coef_idx)
171{
172	unsigned int val;
173
174	coef_mutex_lock(codec);
175	val = __alc_read_coefex_idx(codec, nid, coef_idx);
176	coef_mutex_unlock(codec);
177	return val;
178}
179
180#define alc_read_coef_idx(codec, coef_idx) \
181	alc_read_coefex_idx(codec, 0x20, coef_idx)
182
183static void __alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
184				   unsigned int coef_idx, unsigned int coef_val)
185{
186	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
187	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PROC_COEF, coef_val);
188}
189
190static void alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
191				 unsigned int coef_idx, unsigned int coef_val)
192{
193	coef_mutex_lock(codec);
194	__alc_write_coefex_idx(codec, nid, coef_idx, coef_val);
195	coef_mutex_unlock(codec);
196}
197
198#define alc_write_coef_idx(codec, coef_idx, coef_val) \
199	alc_write_coefex_idx(codec, 0x20, coef_idx, coef_val)
200
201static void __alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
202				    unsigned int coef_idx, unsigned int mask,
203				    unsigned int bits_set)
204{
205	unsigned int val = __alc_read_coefex_idx(codec, nid, coef_idx);
206
207	if (val != -1)
208		__alc_write_coefex_idx(codec, nid, coef_idx,
209				       (val & ~mask) | bits_set);
210}
211
212static void alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
213				  unsigned int coef_idx, unsigned int mask,
214				  unsigned int bits_set)
215{
216	coef_mutex_lock(codec);
217	__alc_update_coefex_idx(codec, nid, coef_idx, mask, bits_set);
218	coef_mutex_unlock(codec);
219}
220
221#define alc_update_coef_idx(codec, coef_idx, mask, bits_set)	\
222	alc_update_coefex_idx(codec, 0x20, coef_idx, mask, bits_set)
223
224/* a special bypass for COEF 0; read the cached value at the second time */
225static unsigned int alc_get_coef0(struct hda_codec *codec)
226{
227	struct alc_spec *spec = codec->spec;
228
229	if (!spec->coef0)
230		spec->coef0 = alc_read_coef_idx(codec, 0);
231	return spec->coef0;
232}
233
234/* coef writes/updates batch */
235struct coef_fw {
236	unsigned char nid;
237	unsigned char idx;
238	unsigned short mask;
239	unsigned short val;
240};
241
242#define UPDATE_COEFEX(_nid, _idx, _mask, _val) \
243	{ .nid = (_nid), .idx = (_idx), .mask = (_mask), .val = (_val) }
244#define WRITE_COEFEX(_nid, _idx, _val) UPDATE_COEFEX(_nid, _idx, -1, _val)
245#define WRITE_COEF(_idx, _val) WRITE_COEFEX(0x20, _idx, _val)
246#define UPDATE_COEF(_idx, _mask, _val) UPDATE_COEFEX(0x20, _idx, _mask, _val)
247
248static void alc_process_coef_fw(struct hda_codec *codec,
249				const struct coef_fw *fw)
250{
251	coef_mutex_lock(codec);
252	for (; fw->nid; fw++) {
253		if (fw->mask == (unsigned short)-1)
254			__alc_write_coefex_idx(codec, fw->nid, fw->idx, fw->val);
255		else
256			__alc_update_coefex_idx(codec, fw->nid, fw->idx,
257						fw->mask, fw->val);
258	}
259	coef_mutex_unlock(codec);
260}
261
262/*
263 * GPIO setup tables, used in initialization
264 */
265
266/* Enable GPIO mask and set output */
267static void alc_setup_gpio(struct hda_codec *codec, unsigned int mask)
268{
269	struct alc_spec *spec = codec->spec;
270
271	spec->gpio_mask |= mask;
272	spec->gpio_dir |= mask;
273	spec->gpio_data |= mask;
274}
275
276static void alc_write_gpio_data(struct hda_codec *codec)
277{
278	struct alc_spec *spec = codec->spec;
279
280	snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
281			    spec->gpio_data);
282}
283
284static void alc_update_gpio_data(struct hda_codec *codec, unsigned int mask,
285				 bool on)
286{
287	struct alc_spec *spec = codec->spec;
288	unsigned int oldval = spec->gpio_data;
289
290	if (on)
291		spec->gpio_data |= mask;
292	else
293		spec->gpio_data &= ~mask;
294	if (oldval != spec->gpio_data)
295		alc_write_gpio_data(codec);
296}
297
298static void alc_write_gpio(struct hda_codec *codec)
299{
300	struct alc_spec *spec = codec->spec;
301
302	if (!spec->gpio_mask)
303		return;
304
305	snd_hda_codec_write(codec, codec->core.afg, 0,
306			    AC_VERB_SET_GPIO_MASK, spec->gpio_mask);
307	snd_hda_codec_write(codec, codec->core.afg, 0,
308			    AC_VERB_SET_GPIO_DIRECTION, spec->gpio_dir);
309	if (spec->gpio_write_delay)
310		msleep(1);
311	alc_write_gpio_data(codec);
312}
313
314static void alc_fixup_gpio(struct hda_codec *codec, int action,
315			   unsigned int mask)
316{
317	if (action == HDA_FIXUP_ACT_PRE_PROBE)
318		alc_setup_gpio(codec, mask);
319}
320
321static void alc_fixup_gpio1(struct hda_codec *codec,
322			    const struct hda_fixup *fix, int action)
323{
324	alc_fixup_gpio(codec, action, 0x01);
325}
326
327static void alc_fixup_gpio2(struct hda_codec *codec,
328			    const struct hda_fixup *fix, int action)
329{
330	alc_fixup_gpio(codec, action, 0x02);
331}
332
333static void alc_fixup_gpio3(struct hda_codec *codec,
334			    const struct hda_fixup *fix, int action)
335{
336	alc_fixup_gpio(codec, action, 0x03);
337}
338
339static void alc_fixup_gpio4(struct hda_codec *codec,
340			    const struct hda_fixup *fix, int action)
341{
342	alc_fixup_gpio(codec, action, 0x04);
343}
344
345static void alc_fixup_micmute_led(struct hda_codec *codec,
346				  const struct hda_fixup *fix, int action)
347{
348	if (action == HDA_FIXUP_ACT_PRE_PROBE)
349		snd_hda_gen_add_micmute_led_cdev(codec, NULL);
350}
351
352/*
353 * Fix hardware PLL issue
354 * On some codecs, the analog PLL gating control must be off while
355 * the default value is 1.
356 */
357static void alc_fix_pll(struct hda_codec *codec)
358{
359	struct alc_spec *spec = codec->spec;
360
361	if (spec->pll_nid)
362		alc_update_coefex_idx(codec, spec->pll_nid, spec->pll_coef_idx,
363				      1 << spec->pll_coef_bit, 0);
364}
365
366static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
367			     unsigned int coef_idx, unsigned int coef_bit)
368{
369	struct alc_spec *spec = codec->spec;
370	spec->pll_nid = nid;
371	spec->pll_coef_idx = coef_idx;
372	spec->pll_coef_bit = coef_bit;
373	alc_fix_pll(codec);
374}
375
376/* update the master volume per volume-knob's unsol event */
377static void alc_update_knob_master(struct hda_codec *codec,
378				   struct hda_jack_callback *jack)
379{
380	unsigned int val;
381	struct snd_kcontrol *kctl;
382	struct snd_ctl_elem_value *uctl;
383
384	kctl = snd_hda_find_mixer_ctl(codec, "Master Playback Volume");
385	if (!kctl)
386		return;
387	uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
388	if (!uctl)
389		return;
390	val = snd_hda_codec_read(codec, jack->nid, 0,
391				 AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
392	val &= HDA_AMP_VOLMASK;
393	uctl->value.integer.value[0] = val;
394	uctl->value.integer.value[1] = val;
395	kctl->put(kctl, uctl);
396	kfree(uctl);
397}
398
399static void alc880_unsol_event(struct hda_codec *codec, unsigned int res)
400{
401	/* For some reason, the res given from ALC880 is broken.
402	   Here we adjust it properly. */
403	snd_hda_jack_unsol_event(codec, res >> 2);
404}
405
406/* Change EAPD to verb control */
407static void alc_fill_eapd_coef(struct hda_codec *codec)
408{
409	int coef;
410
411	coef = alc_get_coef0(codec);
412
413	switch (codec->core.vendor_id) {
414	case 0x10ec0262:
415		alc_update_coef_idx(codec, 0x7, 0, 1<<5);
416		break;
417	case 0x10ec0267:
418	case 0x10ec0268:
419		alc_update_coef_idx(codec, 0x7, 0, 1<<13);
420		break;
421	case 0x10ec0269:
422		if ((coef & 0x00f0) == 0x0010)
423			alc_update_coef_idx(codec, 0xd, 0, 1<<14);
424		if ((coef & 0x00f0) == 0x0020)
425			alc_update_coef_idx(codec, 0x4, 1<<15, 0);
426		if ((coef & 0x00f0) == 0x0030)
427			alc_update_coef_idx(codec, 0x10, 1<<9, 0);
428		break;
429	case 0x10ec0280:
430	case 0x10ec0284:
431	case 0x10ec0290:
432	case 0x10ec0292:
433		alc_update_coef_idx(codec, 0x4, 1<<15, 0);
434		break;
435	case 0x10ec0225:
436	case 0x10ec0295:
437	case 0x10ec0299:
438		alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
439		fallthrough;
440	case 0x10ec0215:
441	case 0x10ec0285:
442	case 0x10ec0289:
443		alc_update_coef_idx(codec, 0x36, 1<<13, 0);
444		fallthrough;
445	case 0x10ec0230:
446	case 0x10ec0233:
447	case 0x10ec0235:
448	case 0x10ec0236:
449	case 0x10ec0245:
450	case 0x10ec0255:
451	case 0x10ec0256:
452	case 0x19e58326:
453	case 0x10ec0257:
454	case 0x10ec0282:
455	case 0x10ec0283:
456	case 0x10ec0286:
457	case 0x10ec0288:
458	case 0x10ec0298:
459	case 0x10ec0300:
460		alc_update_coef_idx(codec, 0x10, 1<<9, 0);
461		break;
462	case 0x10ec0275:
463		alc_update_coef_idx(codec, 0xe, 0, 1<<0);
464		break;
465	case 0x10ec0287:
466		alc_update_coef_idx(codec, 0x10, 1<<9, 0);
467		alc_write_coef_idx(codec, 0x8, 0x4ab7);
468		break;
469	case 0x10ec0293:
470		alc_update_coef_idx(codec, 0xa, 1<<13, 0);
471		break;
472	case 0x10ec0234:
473	case 0x10ec0274:
474	case 0x10ec0294:
475	case 0x10ec0700:
476	case 0x10ec0701:
477	case 0x10ec0703:
478	case 0x10ec0711:
479		alc_update_coef_idx(codec, 0x10, 1<<15, 0);
480		break;
481	case 0x10ec0662:
482		if ((coef & 0x00f0) == 0x0030)
483			alc_update_coef_idx(codec, 0x4, 1<<10, 0); /* EAPD Ctrl */
484		break;
485	case 0x10ec0272:
486	case 0x10ec0273:
487	case 0x10ec0663:
488	case 0x10ec0665:
489	case 0x10ec0670:
490	case 0x10ec0671:
491	case 0x10ec0672:
492		alc_update_coef_idx(codec, 0xd, 0, 1<<14); /* EAPD Ctrl */
493		break;
494	case 0x10ec0222:
495	case 0x10ec0623:
496		alc_update_coef_idx(codec, 0x19, 1<<13, 0);
497		break;
498	case 0x10ec0668:
499		alc_update_coef_idx(codec, 0x7, 3<<13, 0);
500		break;
501	case 0x10ec0867:
502		alc_update_coef_idx(codec, 0x4, 1<<10, 0);
503		break;
504	case 0x10ec0888:
505		if ((coef & 0x00f0) == 0x0020 || (coef & 0x00f0) == 0x0030)
506			alc_update_coef_idx(codec, 0x7, 1<<5, 0);
507		break;
508	case 0x10ec0892:
509	case 0x10ec0897:
510		alc_update_coef_idx(codec, 0x7, 1<<5, 0);
511		break;
512	case 0x10ec0899:
513	case 0x10ec0900:
514	case 0x10ec0b00:
515	case 0x10ec1168:
516	case 0x10ec1220:
517		alc_update_coef_idx(codec, 0x7, 1<<1, 0);
518		break;
519	}
520}
521
522/* additional initialization for ALC888 variants */
523static void alc888_coef_init(struct hda_codec *codec)
524{
525	switch (alc_get_coef0(codec) & 0x00f0) {
526	/* alc888-VA */
527	case 0x00:
528	/* alc888-VB */
529	case 0x10:
530		alc_update_coef_idx(codec, 7, 0, 0x2030); /* Turn EAPD to High */
531		break;
532	}
533}
534
535/* turn on/off EAPD control (only if available) */
536static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
537{
538	if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
539		return;
540	if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
541		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
542				    on ? 2 : 0);
543}
544
545/* turn on/off EAPD controls of the codec */
546static void alc_auto_setup_eapd(struct hda_codec *codec, bool on)
547{
548	/* We currently only handle front, HP */
549	static const hda_nid_t pins[] = {
550		0x0f, 0x10, 0x14, 0x15, 0x17, 0
551	};
552	const hda_nid_t *p;
553	for (p = pins; *p; p++)
554		set_eapd(codec, *p, on);
555}
556
557static int find_ext_mic_pin(struct hda_codec *codec);
558
559static void alc_headset_mic_no_shutup(struct hda_codec *codec)
560{
561	const struct hda_pincfg *pin;
562	int mic_pin = find_ext_mic_pin(codec);
563	int i;
564
565	/* don't shut up pins when unloading the driver; otherwise it breaks
566	 * the default pin setup at the next load of the driver
567	 */
568	if (codec->bus->shutdown)
569		return;
570
571	snd_array_for_each(&codec->init_pins, i, pin) {
572		/* use read here for syncing after issuing each verb */
573		if (pin->nid != mic_pin)
574			snd_hda_codec_read(codec, pin->nid, 0,
575					AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
576	}
577
578	codec->pins_shutup = 1;
579}
580
581static void alc_shutup_pins(struct hda_codec *codec)
582{
583	struct alc_spec *spec = codec->spec;
584
585	switch (codec->core.vendor_id) {
586	case 0x10ec0236:
587	case 0x10ec0256:
588	case 0x19e58326:
589	case 0x10ec0283:
590	case 0x10ec0286:
591	case 0x10ec0288:
592	case 0x10ec0298:
593		alc_headset_mic_no_shutup(codec);
594		break;
595	default:
596		if (!spec->no_shutup_pins)
597			snd_hda_shutup_pins(codec);
598		break;
599	}
600}
601
602/* generic shutup callback;
603 * just turning off EAPD and a little pause for avoiding pop-noise
604 */
605static void alc_eapd_shutup(struct hda_codec *codec)
606{
607	struct alc_spec *spec = codec->spec;
608
609	alc_auto_setup_eapd(codec, false);
610	if (!spec->no_depop_delay)
611		msleep(200);
612	alc_shutup_pins(codec);
613}
614
615/* generic EAPD initialization */
616static void alc_auto_init_amp(struct hda_codec *codec, int type)
617{
618	alc_auto_setup_eapd(codec, true);
619	alc_write_gpio(codec);
620	switch (type) {
621	case ALC_INIT_DEFAULT:
622		switch (codec->core.vendor_id) {
623		case 0x10ec0260:
624			alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x2010);
625			break;
626		case 0x10ec0880:
627		case 0x10ec0882:
628		case 0x10ec0883:
629		case 0x10ec0885:
630			alc_update_coef_idx(codec, 7, 0, 0x2030);
631			break;
632		case 0x10ec0888:
633			alc888_coef_init(codec);
634			break;
635		}
636		break;
637	}
638}
639
640/* get a primary headphone pin if available */
641static hda_nid_t alc_get_hp_pin(struct alc_spec *spec)
642{
643	if (spec->gen.autocfg.hp_pins[0])
644		return spec->gen.autocfg.hp_pins[0];
645	if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
646		return spec->gen.autocfg.line_out_pins[0];
647	return 0;
648}
649
650/*
651 * Realtek SSID verification
652 */
653
654/* Could be any non-zero and even value. When used as fixup, tells
655 * the driver to ignore any present sku defines.
656 */
657#define ALC_FIXUP_SKU_IGNORE (2)
658
659static void alc_fixup_sku_ignore(struct hda_codec *codec,
660				 const struct hda_fixup *fix, int action)
661{
662	struct alc_spec *spec = codec->spec;
663	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
664		spec->cdefine.fixup = 1;
665		spec->cdefine.sku_cfg = ALC_FIXUP_SKU_IGNORE;
666	}
667}
668
669static void alc_fixup_no_depop_delay(struct hda_codec *codec,
670				    const struct hda_fixup *fix, int action)
671{
672	struct alc_spec *spec = codec->spec;
673
674	if (action == HDA_FIXUP_ACT_PROBE) {
675		spec->no_depop_delay = 1;
676		codec->depop_delay = 0;
677	}
678}
679
680static int alc_auto_parse_customize_define(struct hda_codec *codec)
681{
682	unsigned int ass, tmp, i;
683	unsigned nid = 0;
684	struct alc_spec *spec = codec->spec;
685
686	spec->cdefine.enable_pcbeep = 1; /* assume always enabled */
687
688	if (spec->cdefine.fixup) {
689		ass = spec->cdefine.sku_cfg;
690		if (ass == ALC_FIXUP_SKU_IGNORE)
691			return -1;
692		goto do_sku;
693	}
694
695	if (!codec->bus->pci)
696		return -1;
697	ass = codec->core.subsystem_id & 0xffff;
698	if (ass != codec->bus->pci->subsystem_device && (ass & 1))
699		goto do_sku;
700
701	nid = 0x1d;
702	if (codec->core.vendor_id == 0x10ec0260)
703		nid = 0x17;
704	ass = snd_hda_codec_get_pincfg(codec, nid);
705
706	if (!(ass & 1)) {
707		codec_info(codec, "%s: SKU not ready 0x%08x\n",
708			   codec->core.chip_name, ass);
709		return -1;
710	}
711
712	/* check sum */
713	tmp = 0;
714	for (i = 1; i < 16; i++) {
715		if ((ass >> i) & 1)
716			tmp++;
717	}
718	if (((ass >> 16) & 0xf) != tmp)
719		return -1;
720
721	spec->cdefine.port_connectivity = ass >> 30;
722	spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
723	spec->cdefine.check_sum = (ass >> 16) & 0xf;
724	spec->cdefine.customization = ass >> 8;
725do_sku:
726	spec->cdefine.sku_cfg = ass;
727	spec->cdefine.external_amp = (ass & 0x38) >> 3;
728	spec->cdefine.platform_type = (ass & 0x4) >> 2;
729	spec->cdefine.swap = (ass & 0x2) >> 1;
730	spec->cdefine.override = ass & 0x1;
731
732	codec_dbg(codec, "SKU: Nid=0x%x sku_cfg=0x%08x\n",
733		   nid, spec->cdefine.sku_cfg);
734	codec_dbg(codec, "SKU: port_connectivity=0x%x\n",
735		   spec->cdefine.port_connectivity);
736	codec_dbg(codec, "SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
737	codec_dbg(codec, "SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
738	codec_dbg(codec, "SKU: customization=0x%08x\n", spec->cdefine.customization);
739	codec_dbg(codec, "SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
740	codec_dbg(codec, "SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
741	codec_dbg(codec, "SKU: swap=0x%x\n", spec->cdefine.swap);
742	codec_dbg(codec, "SKU: override=0x%x\n", spec->cdefine.override);
743
744	return 0;
745}
746
747/* return the position of NID in the list, or -1 if not found */
748static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
749{
750	int i;
751	for (i = 0; i < nums; i++)
752		if (list[i] == nid)
753			return i;
754	return -1;
755}
756/* return true if the given NID is found in the list */
757static bool found_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
758{
759	return find_idx_in_nid_list(nid, list, nums) >= 0;
760}
761
762/* check subsystem ID and set up device-specific initialization;
763 * return 1 if initialized, 0 if invalid SSID
764 */
765/* 32-bit subsystem ID for BIOS loading in HD Audio codec.
766 *	31 ~ 16 :	Manufacture ID
767 *	15 ~ 8	:	SKU ID
768 *	7  ~ 0	:	Assembly ID
769 *	port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
770 */
771static int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports)
772{
773	unsigned int ass, tmp, i;
774	unsigned nid;
775	struct alc_spec *spec = codec->spec;
776
777	if (spec->cdefine.fixup) {
778		ass = spec->cdefine.sku_cfg;
779		if (ass == ALC_FIXUP_SKU_IGNORE)
780			return 0;
781		goto do_sku;
782	}
783
784	ass = codec->core.subsystem_id & 0xffff;
785	if (codec->bus->pci &&
786	    ass != codec->bus->pci->subsystem_device && (ass & 1))
787		goto do_sku;
788
789	/* invalid SSID, check the special NID pin defcfg instead */
790	/*
791	 * 31~30	: port connectivity
792	 * 29~21	: reserve
793	 * 20		: PCBEEP input
794	 * 19~16	: Check sum (15:1)
795	 * 15~1		: Custom
796	 * 0		: override
797	*/
798	nid = 0x1d;
799	if (codec->core.vendor_id == 0x10ec0260)
800		nid = 0x17;
801	ass = snd_hda_codec_get_pincfg(codec, nid);
802	codec_dbg(codec,
803		  "realtek: No valid SSID, checking pincfg 0x%08x for NID 0x%x\n",
804		   ass, nid);
805	if (!(ass & 1))
806		return 0;
807	if ((ass >> 30) != 1)	/* no physical connection */
808		return 0;
809
810	/* check sum */
811	tmp = 0;
812	for (i = 1; i < 16; i++) {
813		if ((ass >> i) & 1)
814			tmp++;
815	}
816	if (((ass >> 16) & 0xf) != tmp)
817		return 0;
818do_sku:
819	codec_dbg(codec, "realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
820		   ass & 0xffff, codec->core.vendor_id);
821	/*
822	 * 0 : override
823	 * 1 :	Swap Jack
824	 * 2 : 0 --> Desktop, 1 --> Laptop
825	 * 3~5 : External Amplifier control
826	 * 7~6 : Reserved
827	*/
828	tmp = (ass & 0x38) >> 3;	/* external Amp control */
829	if (spec->init_amp == ALC_INIT_UNDEFINED) {
830		switch (tmp) {
831		case 1:
832			alc_setup_gpio(codec, 0x01);
833			break;
834		case 3:
835			alc_setup_gpio(codec, 0x02);
836			break;
837		case 7:
838			alc_setup_gpio(codec, 0x04);
839			break;
840		case 5:
841		default:
842			spec->init_amp = ALC_INIT_DEFAULT;
843			break;
844		}
845	}
846
847	/* is laptop or Desktop and enable the function "Mute internal speaker
848	 * when the external headphone out jack is plugged"
849	 */
850	if (!(ass & 0x8000))
851		return 1;
852	/*
853	 * 10~8 : Jack location
854	 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
855	 * 14~13: Resvered
856	 * 15   : 1 --> enable the function "Mute internal speaker
857	 *	        when the external headphone out jack is plugged"
858	 */
859	if (!alc_get_hp_pin(spec)) {
860		hda_nid_t nid;
861		tmp = (ass >> 11) & 0x3;	/* HP to chassis */
862		nid = ports[tmp];
863		if (found_in_nid_list(nid, spec->gen.autocfg.line_out_pins,
864				      spec->gen.autocfg.line_outs))
865			return 1;
866		spec->gen.autocfg.hp_pins[0] = nid;
867	}
868	return 1;
869}
870
871/* Check the validity of ALC subsystem-id
872 * ports contains an array of 4 pin NIDs for port-A, E, D and I */
873static void alc_ssid_check(struct hda_codec *codec, const hda_nid_t *ports)
874{
875	if (!alc_subsystem_id(codec, ports)) {
876		struct alc_spec *spec = codec->spec;
877		if (spec->init_amp == ALC_INIT_UNDEFINED) {
878			codec_dbg(codec,
879				  "realtek: Enable default setup for auto mode as fallback\n");
880			spec->init_amp = ALC_INIT_DEFAULT;
881		}
882	}
883}
884
885/*
886 */
887
888static void alc_fixup_inv_dmic(struct hda_codec *codec,
889			       const struct hda_fixup *fix, int action)
890{
891	struct alc_spec *spec = codec->spec;
892
893	spec->gen.inv_dmic_split = 1;
894}
895
896
897static int alc_build_controls(struct hda_codec *codec)
898{
899	int err;
900
901	err = snd_hda_gen_build_controls(codec);
902	if (err < 0)
903		return err;
904
905	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_BUILD);
906	return 0;
907}
908
909
910/*
911 * Common callbacks
912 */
913
914static void alc_pre_init(struct hda_codec *codec)
915{
916	alc_fill_eapd_coef(codec);
917}
918
919#define is_s3_resume(codec) \
920	((codec)->core.dev.power.power_state.event == PM_EVENT_RESUME)
921#define is_s4_resume(codec) \
922	((codec)->core.dev.power.power_state.event == PM_EVENT_RESTORE)
923
924static int alc_init(struct hda_codec *codec)
925{
926	struct alc_spec *spec = codec->spec;
927
928	/* hibernation resume needs the full chip initialization */
929	if (is_s4_resume(codec))
930		alc_pre_init(codec);
931
932	if (spec->init_hook)
933		spec->init_hook(codec);
934
935	spec->gen.skip_verbs = 1; /* applied in below */
936	snd_hda_gen_init(codec);
937	alc_fix_pll(codec);
938	alc_auto_init_amp(codec, spec->init_amp);
939	snd_hda_apply_verbs(codec); /* apply verbs here after own init */
940
941	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT);
942
943	return 0;
944}
945
946#define alc_free	snd_hda_gen_free
947
948#ifdef CONFIG_PM
949static inline void alc_shutup(struct hda_codec *codec)
950{
951	struct alc_spec *spec = codec->spec;
952
953	if (!snd_hda_get_bool_hint(codec, "shutup"))
954		return; /* disabled explicitly by hints */
955
956	if (spec && spec->shutup)
957		spec->shutup(codec);
958	else
959		alc_shutup_pins(codec);
960}
961
962static void alc_power_eapd(struct hda_codec *codec)
963{
964	alc_auto_setup_eapd(codec, false);
965}
966
967static int alc_suspend(struct hda_codec *codec)
968{
969	struct alc_spec *spec = codec->spec;
970	alc_shutup(codec);
971	if (spec && spec->power_hook)
972		spec->power_hook(codec);
973	return 0;
974}
975
976static int alc_resume(struct hda_codec *codec)
977{
978	struct alc_spec *spec = codec->spec;
979
980	if (!spec->no_depop_delay)
981		msleep(150); /* to avoid pop noise */
982	codec->patch_ops.init(codec);
983	snd_hda_regmap_sync(codec);
984	hda_call_check_power_status(codec, 0x01);
985	return 0;
986}
987#endif
988
989/*
990 */
991static const struct hda_codec_ops alc_patch_ops = {
992	.build_controls = alc_build_controls,
993	.build_pcms = snd_hda_gen_build_pcms,
994	.init = alc_init,
995	.free = alc_free,
996	.unsol_event = snd_hda_jack_unsol_event,
997#ifdef CONFIG_PM
998	.resume = alc_resume,
999	.suspend = alc_suspend,
1000	.check_power_status = snd_hda_gen_check_power_status,
1001#endif
1002};
1003
1004
1005#define alc_codec_rename(codec, name) snd_hda_codec_set_name(codec, name)
1006
1007/*
1008 * Rename codecs appropriately from COEF value or subvendor id
1009 */
1010struct alc_codec_rename_table {
1011	unsigned int vendor_id;
1012	unsigned short coef_mask;
1013	unsigned short coef_bits;
1014	const char *name;
1015};
1016
1017struct alc_codec_rename_pci_table {
1018	unsigned int codec_vendor_id;
1019	unsigned short pci_subvendor;
1020	unsigned short pci_subdevice;
1021	const char *name;
1022};
1023
1024static const struct alc_codec_rename_table rename_tbl[] = {
1025	{ 0x10ec0221, 0xf00f, 0x1003, "ALC231" },
1026	{ 0x10ec0269, 0xfff0, 0x3010, "ALC277" },
1027	{ 0x10ec0269, 0xf0f0, 0x2010, "ALC259" },
1028	{ 0x10ec0269, 0xf0f0, 0x3010, "ALC258" },
1029	{ 0x10ec0269, 0x00f0, 0x0010, "ALC269VB" },
1030	{ 0x10ec0269, 0xffff, 0xa023, "ALC259" },
1031	{ 0x10ec0269, 0xffff, 0x6023, "ALC281X" },
1032	{ 0x10ec0269, 0x00f0, 0x0020, "ALC269VC" },
1033	{ 0x10ec0269, 0x00f0, 0x0030, "ALC269VD" },
1034	{ 0x10ec0662, 0xffff, 0x4020, "ALC656" },
1035	{ 0x10ec0887, 0x00f0, 0x0030, "ALC887-VD" },
1036	{ 0x10ec0888, 0x00f0, 0x0030, "ALC888-VD" },
1037	{ 0x10ec0888, 0xf0f0, 0x3020, "ALC886" },
1038	{ 0x10ec0899, 0x2000, 0x2000, "ALC899" },
1039	{ 0x10ec0892, 0xffff, 0x8020, "ALC661" },
1040	{ 0x10ec0892, 0xffff, 0x8011, "ALC661" },
1041	{ 0x10ec0892, 0xffff, 0x4011, "ALC656" },
1042	{ } /* terminator */
1043};
1044
1045static const struct alc_codec_rename_pci_table rename_pci_tbl[] = {
1046	{ 0x10ec0280, 0x1028, 0, "ALC3220" },
1047	{ 0x10ec0282, 0x1028, 0, "ALC3221" },
1048	{ 0x10ec0283, 0x1028, 0, "ALC3223" },
1049	{ 0x10ec0288, 0x1028, 0, "ALC3263" },
1050	{ 0x10ec0292, 0x1028, 0, "ALC3226" },
1051	{ 0x10ec0293, 0x1028, 0, "ALC3235" },
1052	{ 0x10ec0255, 0x1028, 0, "ALC3234" },
1053	{ 0x10ec0668, 0x1028, 0, "ALC3661" },
1054	{ 0x10ec0275, 0x1028, 0, "ALC3260" },
1055	{ 0x10ec0899, 0x1028, 0, "ALC3861" },
1056	{ 0x10ec0298, 0x1028, 0, "ALC3266" },
1057	{ 0x10ec0236, 0x1028, 0, "ALC3204" },
1058	{ 0x10ec0256, 0x1028, 0, "ALC3246" },
1059	{ 0x10ec0225, 0x1028, 0, "ALC3253" },
1060	{ 0x10ec0295, 0x1028, 0, "ALC3254" },
1061	{ 0x10ec0299, 0x1028, 0, "ALC3271" },
1062	{ 0x10ec0670, 0x1025, 0, "ALC669X" },
1063	{ 0x10ec0676, 0x1025, 0, "ALC679X" },
1064	{ 0x10ec0282, 0x1043, 0, "ALC3229" },
1065	{ 0x10ec0233, 0x1043, 0, "ALC3236" },
1066	{ 0x10ec0280, 0x103c, 0, "ALC3228" },
1067	{ 0x10ec0282, 0x103c, 0, "ALC3227" },
1068	{ 0x10ec0286, 0x103c, 0, "ALC3242" },
1069	{ 0x10ec0290, 0x103c, 0, "ALC3241" },
1070	{ 0x10ec0668, 0x103c, 0, "ALC3662" },
1071	{ 0x10ec0283, 0x17aa, 0, "ALC3239" },
1072	{ 0x10ec0292, 0x17aa, 0, "ALC3232" },
1073	{ } /* terminator */
1074};
1075
1076static int alc_codec_rename_from_preset(struct hda_codec *codec)
1077{
1078	const struct alc_codec_rename_table *p;
1079	const struct alc_codec_rename_pci_table *q;
1080
1081	for (p = rename_tbl; p->vendor_id; p++) {
1082		if (p->vendor_id != codec->core.vendor_id)
1083			continue;
1084		if ((alc_get_coef0(codec) & p->coef_mask) == p->coef_bits)
1085			return alc_codec_rename(codec, p->name);
1086	}
1087
1088	if (!codec->bus->pci)
1089		return 0;
1090	for (q = rename_pci_tbl; q->codec_vendor_id; q++) {
1091		if (q->codec_vendor_id != codec->core.vendor_id)
1092			continue;
1093		if (q->pci_subvendor != codec->bus->pci->subsystem_vendor)
1094			continue;
1095		if (!q->pci_subdevice ||
1096		    q->pci_subdevice == codec->bus->pci->subsystem_device)
1097			return alc_codec_rename(codec, q->name);
1098	}
1099
1100	return 0;
1101}
1102
1103
1104/*
1105 * Digital-beep handlers
1106 */
1107#ifdef CONFIG_SND_HDA_INPUT_BEEP
1108
1109/* additional beep mixers; private_value will be overwritten */
1110static const struct snd_kcontrol_new alc_beep_mixer[] = {
1111	HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
1112	HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
1113};
1114
1115/* set up and create beep controls */
1116static int set_beep_amp(struct alc_spec *spec, hda_nid_t nid,
1117			int idx, int dir)
1118{
1119	struct snd_kcontrol_new *knew;
1120	unsigned int beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir);
1121	int i;
1122
1123	for (i = 0; i < ARRAY_SIZE(alc_beep_mixer); i++) {
1124		knew = snd_hda_gen_add_kctl(&spec->gen, NULL,
1125					    &alc_beep_mixer[i]);
1126		if (!knew)
1127			return -ENOMEM;
1128		knew->private_value = beep_amp;
1129	}
1130	return 0;
1131}
1132
1133static const struct snd_pci_quirk beep_allow_list[] = {
1134	SND_PCI_QUIRK(0x1043, 0x103c, "ASUS", 1),
1135	SND_PCI_QUIRK(0x1043, 0x115d, "ASUS", 1),
1136	SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),
1137	SND_PCI_QUIRK(0x1043, 0x8376, "EeePC", 1),
1138	SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1),
1139	SND_PCI_QUIRK(0x1043, 0x831a, "EeePC", 1),
1140	SND_PCI_QUIRK(0x1043, 0x834a, "EeePC", 1),
1141	SND_PCI_QUIRK(0x1458, 0xa002, "GA-MA790X", 1),
1142	SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),
1143	/* denylist -- no beep available */
1144	SND_PCI_QUIRK(0x17aa, 0x309e, "Lenovo ThinkCentre M73", 0),
1145	SND_PCI_QUIRK(0x17aa, 0x30a3, "Lenovo ThinkCentre M93", 0),
1146	{}
1147};
1148
1149static inline int has_cdefine_beep(struct hda_codec *codec)
1150{
1151	struct alc_spec *spec = codec->spec;
1152	const struct snd_pci_quirk *q;
1153	q = snd_pci_quirk_lookup(codec->bus->pci, beep_allow_list);
1154	if (q)
1155		return q->value;
1156	return spec->cdefine.enable_pcbeep;
1157}
1158#else
1159#define set_beep_amp(spec, nid, idx, dir)	0
1160#define has_cdefine_beep(codec)		0
1161#endif
1162
1163/* parse the BIOS configuration and set up the alc_spec */
1164/* return 1 if successful, 0 if the proper config is not found,
1165 * or a negative error code
1166 */
1167static int alc_parse_auto_config(struct hda_codec *codec,
1168				 const hda_nid_t *ignore_nids,
1169				 const hda_nid_t *ssid_nids)
1170{
1171	struct alc_spec *spec = codec->spec;
1172	struct auto_pin_cfg *cfg = &spec->gen.autocfg;
1173	int err;
1174
1175	err = snd_hda_parse_pin_defcfg(codec, cfg, ignore_nids,
1176				       spec->parse_flags);
1177	if (err < 0)
1178		return err;
1179
1180	if (ssid_nids)
1181		alc_ssid_check(codec, ssid_nids);
1182
1183	err = snd_hda_gen_parse_auto_config(codec, cfg);
1184	if (err < 0)
1185		return err;
1186
1187	return 1;
1188}
1189
1190/* common preparation job for alc_spec */
1191static int alc_alloc_spec(struct hda_codec *codec, hda_nid_t mixer_nid)
1192{
1193	struct alc_spec *spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1194	int err;
1195
1196	if (!spec)
1197		return -ENOMEM;
1198	codec->spec = spec;
1199	snd_hda_gen_spec_init(&spec->gen);
1200	spec->gen.mixer_nid = mixer_nid;
1201	spec->gen.own_eapd_ctl = 1;
1202	codec->single_adc_amp = 1;
1203	/* FIXME: do we need this for all Realtek codec models? */
1204	codec->spdif_status_reset = 1;
1205	codec->forced_resume = 1;
1206	codec->patch_ops = alc_patch_ops;
1207	mutex_init(&spec->coef_mutex);
1208
1209	err = alc_codec_rename_from_preset(codec);
1210	if (err < 0) {
1211		kfree(spec);
1212		return err;
1213	}
1214	return 0;
1215}
1216
1217static int alc880_parse_auto_config(struct hda_codec *codec)
1218{
1219	static const hda_nid_t alc880_ignore[] = { 0x1d, 0 };
1220	static const hda_nid_t alc880_ssids[] = { 0x15, 0x1b, 0x14, 0 };
1221	return alc_parse_auto_config(codec, alc880_ignore, alc880_ssids);
1222}
1223
1224/*
1225 * ALC880 fix-ups
1226 */
1227enum {
1228	ALC880_FIXUP_GPIO1,
1229	ALC880_FIXUP_GPIO2,
1230	ALC880_FIXUP_MEDION_RIM,
1231	ALC880_FIXUP_LG,
1232	ALC880_FIXUP_LG_LW25,
1233	ALC880_FIXUP_W810,
1234	ALC880_FIXUP_EAPD_COEF,
1235	ALC880_FIXUP_TCL_S700,
1236	ALC880_FIXUP_VOL_KNOB,
1237	ALC880_FIXUP_FUJITSU,
1238	ALC880_FIXUP_F1734,
1239	ALC880_FIXUP_UNIWILL,
1240	ALC880_FIXUP_UNIWILL_DIG,
1241	ALC880_FIXUP_Z71V,
1242	ALC880_FIXUP_ASUS_W5A,
1243	ALC880_FIXUP_3ST_BASE,
1244	ALC880_FIXUP_3ST,
1245	ALC880_FIXUP_3ST_DIG,
1246	ALC880_FIXUP_5ST_BASE,
1247	ALC880_FIXUP_5ST,
1248	ALC880_FIXUP_5ST_DIG,
1249	ALC880_FIXUP_6ST_BASE,
1250	ALC880_FIXUP_6ST,
1251	ALC880_FIXUP_6ST_DIG,
1252	ALC880_FIXUP_6ST_AUTOMUTE,
1253};
1254
1255/* enable the volume-knob widget support on NID 0x21 */
1256static void alc880_fixup_vol_knob(struct hda_codec *codec,
1257				  const struct hda_fixup *fix, int action)
1258{
1259	if (action == HDA_FIXUP_ACT_PROBE)
1260		snd_hda_jack_detect_enable_callback(codec, 0x21,
1261						    alc_update_knob_master);
1262}
1263
1264static const struct hda_fixup alc880_fixups[] = {
1265	[ALC880_FIXUP_GPIO1] = {
1266		.type = HDA_FIXUP_FUNC,
1267		.v.func = alc_fixup_gpio1,
1268	},
1269	[ALC880_FIXUP_GPIO2] = {
1270		.type = HDA_FIXUP_FUNC,
1271		.v.func = alc_fixup_gpio2,
1272	},
1273	[ALC880_FIXUP_MEDION_RIM] = {
1274		.type = HDA_FIXUP_VERBS,
1275		.v.verbs = (const struct hda_verb[]) {
1276			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1277			{ 0x20, AC_VERB_SET_PROC_COEF,  0x3060 },
1278			{ }
1279		},
1280		.chained = true,
1281		.chain_id = ALC880_FIXUP_GPIO2,
1282	},
1283	[ALC880_FIXUP_LG] = {
1284		.type = HDA_FIXUP_PINS,
1285		.v.pins = (const struct hda_pintbl[]) {
1286			/* disable bogus unused pins */
1287			{ 0x16, 0x411111f0 },
1288			{ 0x18, 0x411111f0 },
1289			{ 0x1a, 0x411111f0 },
1290			{ }
1291		}
1292	},
1293	[ALC880_FIXUP_LG_LW25] = {
1294		.type = HDA_FIXUP_PINS,
1295		.v.pins = (const struct hda_pintbl[]) {
1296			{ 0x1a, 0x0181344f }, /* line-in */
1297			{ 0x1b, 0x0321403f }, /* headphone */
1298			{ }
1299		}
1300	},
1301	[ALC880_FIXUP_W810] = {
1302		.type = HDA_FIXUP_PINS,
1303		.v.pins = (const struct hda_pintbl[]) {
1304			/* disable bogus unused pins */
1305			{ 0x17, 0x411111f0 },
1306			{ }
1307		},
1308		.chained = true,
1309		.chain_id = ALC880_FIXUP_GPIO2,
1310	},
1311	[ALC880_FIXUP_EAPD_COEF] = {
1312		.type = HDA_FIXUP_VERBS,
1313		.v.verbs = (const struct hda_verb[]) {
1314			/* change to EAPD mode */
1315			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1316			{ 0x20, AC_VERB_SET_PROC_COEF,  0x3060 },
1317			{}
1318		},
1319	},
1320	[ALC880_FIXUP_TCL_S700] = {
1321		.type = HDA_FIXUP_VERBS,
1322		.v.verbs = (const struct hda_verb[]) {
1323			/* change to EAPD mode */
1324			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1325			{ 0x20, AC_VERB_SET_PROC_COEF,  0x3070 },
1326			{}
1327		},
1328		.chained = true,
1329		.chain_id = ALC880_FIXUP_GPIO2,
1330	},
1331	[ALC880_FIXUP_VOL_KNOB] = {
1332		.type = HDA_FIXUP_FUNC,
1333		.v.func = alc880_fixup_vol_knob,
1334	},
1335	[ALC880_FIXUP_FUJITSU] = {
1336		/* override all pins as BIOS on old Amilo is broken */
1337		.type = HDA_FIXUP_PINS,
1338		.v.pins = (const struct hda_pintbl[]) {
1339			{ 0x14, 0x0121401f }, /* HP */
1340			{ 0x15, 0x99030120 }, /* speaker */
1341			{ 0x16, 0x99030130 }, /* bass speaker */
1342			{ 0x17, 0x411111f0 }, /* N/A */
1343			{ 0x18, 0x411111f0 }, /* N/A */
1344			{ 0x19, 0x01a19950 }, /* mic-in */
1345			{ 0x1a, 0x411111f0 }, /* N/A */
1346			{ 0x1b, 0x411111f0 }, /* N/A */
1347			{ 0x1c, 0x411111f0 }, /* N/A */
1348			{ 0x1d, 0x411111f0 }, /* N/A */
1349			{ 0x1e, 0x01454140 }, /* SPDIF out */
1350			{ }
1351		},
1352		.chained = true,
1353		.chain_id = ALC880_FIXUP_VOL_KNOB,
1354	},
1355	[ALC880_FIXUP_F1734] = {
1356		/* almost compatible with FUJITSU, but no bass and SPDIF */
1357		.type = HDA_FIXUP_PINS,
1358		.v.pins = (const struct hda_pintbl[]) {
1359			{ 0x14, 0x0121401f }, /* HP */
1360			{ 0x15, 0x99030120 }, /* speaker */
1361			{ 0x16, 0x411111f0 }, /* N/A */
1362			{ 0x17, 0x411111f0 }, /* N/A */
1363			{ 0x18, 0x411111f0 }, /* N/A */
1364			{ 0x19, 0x01a19950 }, /* mic-in */
1365			{ 0x1a, 0x411111f0 }, /* N/A */
1366			{ 0x1b, 0x411111f0 }, /* N/A */
1367			{ 0x1c, 0x411111f0 }, /* N/A */
1368			{ 0x1d, 0x411111f0 }, /* N/A */
1369			{ 0x1e, 0x411111f0 }, /* N/A */
1370			{ }
1371		},
1372		.chained = true,
1373		.chain_id = ALC880_FIXUP_VOL_KNOB,
1374	},
1375	[ALC880_FIXUP_UNIWILL] = {
1376		/* need to fix HP and speaker pins to be parsed correctly */
1377		.type = HDA_FIXUP_PINS,
1378		.v.pins = (const struct hda_pintbl[]) {
1379			{ 0x14, 0x0121411f }, /* HP */
1380			{ 0x15, 0x99030120 }, /* speaker */
1381			{ 0x16, 0x99030130 }, /* bass speaker */
1382			{ }
1383		},
1384	},
1385	[ALC880_FIXUP_UNIWILL_DIG] = {
1386		.type = HDA_FIXUP_PINS,
1387		.v.pins = (const struct hda_pintbl[]) {
1388			/* disable bogus unused pins */
1389			{ 0x17, 0x411111f0 },
1390			{ 0x19, 0x411111f0 },
1391			{ 0x1b, 0x411111f0 },
1392			{ 0x1f, 0x411111f0 },
1393			{ }
1394		}
1395	},
1396	[ALC880_FIXUP_Z71V] = {
1397		.type = HDA_FIXUP_PINS,
1398		.v.pins = (const struct hda_pintbl[]) {
1399			/* set up the whole pins as BIOS is utterly broken */
1400			{ 0x14, 0x99030120 }, /* speaker */
1401			{ 0x15, 0x0121411f }, /* HP */
1402			{ 0x16, 0x411111f0 }, /* N/A */
1403			{ 0x17, 0x411111f0 }, /* N/A */
1404			{ 0x18, 0x01a19950 }, /* mic-in */
1405			{ 0x19, 0x411111f0 }, /* N/A */
1406			{ 0x1a, 0x01813031 }, /* line-in */
1407			{ 0x1b, 0x411111f0 }, /* N/A */
1408			{ 0x1c, 0x411111f0 }, /* N/A */
1409			{ 0x1d, 0x411111f0 }, /* N/A */
1410			{ 0x1e, 0x0144111e }, /* SPDIF */
1411			{ }
1412		}
1413	},
1414	[ALC880_FIXUP_ASUS_W5A] = {
1415		.type = HDA_FIXUP_PINS,
1416		.v.pins = (const struct hda_pintbl[]) {
1417			/* set up the whole pins as BIOS is utterly broken */
1418			{ 0x14, 0x0121411f }, /* HP */
1419			{ 0x15, 0x411111f0 }, /* N/A */
1420			{ 0x16, 0x411111f0 }, /* N/A */
1421			{ 0x17, 0x411111f0 }, /* N/A */
1422			{ 0x18, 0x90a60160 }, /* mic */
1423			{ 0x19, 0x411111f0 }, /* N/A */
1424			{ 0x1a, 0x411111f0 }, /* N/A */
1425			{ 0x1b, 0x411111f0 }, /* N/A */
1426			{ 0x1c, 0x411111f0 }, /* N/A */
1427			{ 0x1d, 0x411111f0 }, /* N/A */
1428			{ 0x1e, 0xb743111e }, /* SPDIF out */
1429			{ }
1430		},
1431		.chained = true,
1432		.chain_id = ALC880_FIXUP_GPIO1,
1433	},
1434	[ALC880_FIXUP_3ST_BASE] = {
1435		.type = HDA_FIXUP_PINS,
1436		.v.pins = (const struct hda_pintbl[]) {
1437			{ 0x14, 0x01014010 }, /* line-out */
1438			{ 0x15, 0x411111f0 }, /* N/A */
1439			{ 0x16, 0x411111f0 }, /* N/A */
1440			{ 0x17, 0x411111f0 }, /* N/A */
1441			{ 0x18, 0x01a19c30 }, /* mic-in */
1442			{ 0x19, 0x0121411f }, /* HP */
1443			{ 0x1a, 0x01813031 }, /* line-in */
1444			{ 0x1b, 0x02a19c40 }, /* front-mic */
1445			{ 0x1c, 0x411111f0 }, /* N/A */
1446			{ 0x1d, 0x411111f0 }, /* N/A */
1447			/* 0x1e is filled in below */
1448			{ 0x1f, 0x411111f0 }, /* N/A */
1449			{ }
1450		}
1451	},
1452	[ALC880_FIXUP_3ST] = {
1453		.type = HDA_FIXUP_PINS,
1454		.v.pins = (const struct hda_pintbl[]) {
1455			{ 0x1e, 0x411111f0 }, /* N/A */
1456			{ }
1457		},
1458		.chained = true,
1459		.chain_id = ALC880_FIXUP_3ST_BASE,
1460	},
1461	[ALC880_FIXUP_3ST_DIG] = {
1462		.type = HDA_FIXUP_PINS,
1463		.v.pins = (const struct hda_pintbl[]) {
1464			{ 0x1e, 0x0144111e }, /* SPDIF */
1465			{ }
1466		},
1467		.chained = true,
1468		.chain_id = ALC880_FIXUP_3ST_BASE,
1469	},
1470	[ALC880_FIXUP_5ST_BASE] = {
1471		.type = HDA_FIXUP_PINS,
1472		.v.pins = (const struct hda_pintbl[]) {
1473			{ 0x14, 0x01014010 }, /* front */
1474			{ 0x15, 0x411111f0 }, /* N/A */
1475			{ 0x16, 0x01011411 }, /* CLFE */
1476			{ 0x17, 0x01016412 }, /* surr */
1477			{ 0x18, 0x01a19c30 }, /* mic-in */
1478			{ 0x19, 0x0121411f }, /* HP */
1479			{ 0x1a, 0x01813031 }, /* line-in */
1480			{ 0x1b, 0x02a19c40 }, /* front-mic */
1481			{ 0x1c, 0x411111f0 }, /* N/A */
1482			{ 0x1d, 0x411111f0 }, /* N/A */
1483			/* 0x1e is filled in below */
1484			{ 0x1f, 0x411111f0 }, /* N/A */
1485			{ }
1486		}
1487	},
1488	[ALC880_FIXUP_5ST] = {
1489		.type = HDA_FIXUP_PINS,
1490		.v.pins = (const struct hda_pintbl[]) {
1491			{ 0x1e, 0x411111f0 }, /* N/A */
1492			{ }
1493		},
1494		.chained = true,
1495		.chain_id = ALC880_FIXUP_5ST_BASE,
1496	},
1497	[ALC880_FIXUP_5ST_DIG] = {
1498		.type = HDA_FIXUP_PINS,
1499		.v.pins = (const struct hda_pintbl[]) {
1500			{ 0x1e, 0x0144111e }, /* SPDIF */
1501			{ }
1502		},
1503		.chained = true,
1504		.chain_id = ALC880_FIXUP_5ST_BASE,
1505	},
1506	[ALC880_FIXUP_6ST_BASE] = {
1507		.type = HDA_FIXUP_PINS,
1508		.v.pins = (const struct hda_pintbl[]) {
1509			{ 0x14, 0x01014010 }, /* front */
1510			{ 0x15, 0x01016412 }, /* surr */
1511			{ 0x16, 0x01011411 }, /* CLFE */
1512			{ 0x17, 0x01012414 }, /* side */
1513			{ 0x18, 0x01a19c30 }, /* mic-in */
1514			{ 0x19, 0x02a19c40 }, /* front-mic */
1515			{ 0x1a, 0x01813031 }, /* line-in */
1516			{ 0x1b, 0x0121411f }, /* HP */
1517			{ 0x1c, 0x411111f0 }, /* N/A */
1518			{ 0x1d, 0x411111f0 }, /* N/A */
1519			/* 0x1e is filled in below */
1520			{ 0x1f, 0x411111f0 }, /* N/A */
1521			{ }
1522		}
1523	},
1524	[ALC880_FIXUP_6ST] = {
1525		.type = HDA_FIXUP_PINS,
1526		.v.pins = (const struct hda_pintbl[]) {
1527			{ 0x1e, 0x411111f0 }, /* N/A */
1528			{ }
1529		},
1530		.chained = true,
1531		.chain_id = ALC880_FIXUP_6ST_BASE,
1532	},
1533	[ALC880_FIXUP_6ST_DIG] = {
1534		.type = HDA_FIXUP_PINS,
1535		.v.pins = (const struct hda_pintbl[]) {
1536			{ 0x1e, 0x0144111e }, /* SPDIF */
1537			{ }
1538		},
1539		.chained = true,
1540		.chain_id = ALC880_FIXUP_6ST_BASE,
1541	},
1542	[ALC880_FIXUP_6ST_AUTOMUTE] = {
1543		.type = HDA_FIXUP_PINS,
1544		.v.pins = (const struct hda_pintbl[]) {
1545			{ 0x1b, 0x0121401f }, /* HP with jack detect */
1546			{ }
1547		},
1548		.chained_before = true,
1549		.chain_id = ALC880_FIXUP_6ST_BASE,
1550	},
1551};
1552
1553static const struct snd_pci_quirk alc880_fixup_tbl[] = {
1554	SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_FIXUP_W810),
1555	SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS W5A", ALC880_FIXUP_ASUS_W5A),
1556	SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_FIXUP_Z71V),
1557	SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_FIXUP_GPIO1),
1558	SND_PCI_QUIRK(0x147b, 0x1045, "ABit AA8XE", ALC880_FIXUP_6ST_AUTOMUTE),
1559	SND_PCI_QUIRK(0x1558, 0x5401, "Clevo GPIO2", ALC880_FIXUP_GPIO2),
1560	SND_PCI_QUIRK_VENDOR(0x1558, "Clevo", ALC880_FIXUP_EAPD_COEF),
1561	SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_FIXUP_UNIWILL_DIG),
1562	SND_PCI_QUIRK(0x1584, 0x9054, "Uniwill", ALC880_FIXUP_F1734),
1563	SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_FIXUP_UNIWILL),
1564	SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_FIXUP_VOL_KNOB),
1565	SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_FIXUP_W810),
1566	SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_FIXUP_MEDION_RIM),
1567	SND_PCI_QUIRK(0x1631, 0xe011, "PB 13201056", ALC880_FIXUP_6ST_AUTOMUTE),
1568	SND_PCI_QUIRK(0x1734, 0x107c, "FSC Amilo M1437", ALC880_FIXUP_FUJITSU),
1569	SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FIXUP_FUJITSU),
1570	SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_FIXUP_F1734),
1571	SND_PCI_QUIRK(0x1734, 0x10b0, "FSC Amilo Pi1556", ALC880_FIXUP_FUJITSU),
1572	SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_FIXUP_LG),
1573	SND_PCI_QUIRK(0x1854, 0x005f, "LG P1 Express", ALC880_FIXUP_LG),
1574	SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_FIXUP_LG),
1575	SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_FIXUP_LG_LW25),
1576	SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_FIXUP_TCL_S700),
1577
1578	/* Below is the copied entries from alc880_quirks.c.
1579	 * It's not quite sure whether BIOS sets the correct pin-config table
1580	 * on these machines, thus they are kept to be compatible with
1581	 * the old static quirks.  Once when it's confirmed to work without
1582	 * these overrides, it'd be better to remove.
1583	 */
1584	SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_FIXUP_5ST_DIG),
1585	SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_FIXUP_6ST),
1586	SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_FIXUP_3ST_DIG),
1587	SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_FIXUP_6ST_DIG),
1588	SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_FIXUP_6ST_DIG),
1589	SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_FIXUP_6ST_DIG),
1590	SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_FIXUP_3ST_DIG),
1591	SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_FIXUP_3ST),
1592	SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_FIXUP_6ST_DIG),
1593	SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_FIXUP_3ST),
1594	SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_FIXUP_3ST),
1595	SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_FIXUP_5ST),
1596	SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_FIXUP_5ST),
1597	SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_FIXUP_5ST),
1598	SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_FIXUP_6ST_DIG),
1599	SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_FIXUP_6ST_DIG),
1600	SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_FIXUP_6ST_DIG),
1601	SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_FIXUP_6ST_DIG),
1602	SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_FIXUP_5ST_DIG),
1603	SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_FIXUP_5ST_DIG),
1604	SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_FIXUP_5ST_DIG),
1605	SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_FIXUP_6ST_DIG), /* broken BIOS */
1606	SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_FIXUP_6ST_DIG),
1607	SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1608	SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1609	SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1610	SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1611	SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1612	SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1613	SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1614	SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1615	SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1616	SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1617	/* default Intel */
1618	SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_FIXUP_3ST),
1619	SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_FIXUP_5ST_DIG),
1620	SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_FIXUP_6ST_DIG),
1621	{}
1622};
1623
1624static const struct hda_model_fixup alc880_fixup_models[] = {
1625	{.id = ALC880_FIXUP_3ST, .name = "3stack"},
1626	{.id = ALC880_FIXUP_3ST_DIG, .name = "3stack-digout"},
1627	{.id = ALC880_FIXUP_5ST, .name = "5stack"},
1628	{.id = ALC880_FIXUP_5ST_DIG, .name = "5stack-digout"},
1629	{.id = ALC880_FIXUP_6ST, .name = "6stack"},
1630	{.id = ALC880_FIXUP_6ST_DIG, .name = "6stack-digout"},
1631	{.id = ALC880_FIXUP_6ST_AUTOMUTE, .name = "6stack-automute"},
1632	{}
1633};
1634
1635
1636/*
1637 * OK, here we have finally the patch for ALC880
1638 */
1639static int patch_alc880(struct hda_codec *codec)
1640{
1641	struct alc_spec *spec;
1642	int err;
1643
1644	err = alc_alloc_spec(codec, 0x0b);
1645	if (err < 0)
1646		return err;
1647
1648	spec = codec->spec;
1649	spec->gen.need_dac_fix = 1;
1650	spec->gen.beep_nid = 0x01;
1651
1652	codec->patch_ops.unsol_event = alc880_unsol_event;
1653
1654	alc_pre_init(codec);
1655
1656	snd_hda_pick_fixup(codec, alc880_fixup_models, alc880_fixup_tbl,
1657		       alc880_fixups);
1658	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1659
1660	/* automatic parse from the BIOS config */
1661	err = alc880_parse_auto_config(codec);
1662	if (err < 0)
1663		goto error;
1664
1665	if (!spec->gen.no_analog) {
1666		err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
1667		if (err < 0)
1668			goto error;
1669	}
1670
1671	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
1672
1673	return 0;
1674
1675 error:
1676	alc_free(codec);
1677	return err;
1678}
1679
1680
1681/*
1682 * ALC260 support
1683 */
1684static int alc260_parse_auto_config(struct hda_codec *codec)
1685{
1686	static const hda_nid_t alc260_ignore[] = { 0x17, 0 };
1687	static const hda_nid_t alc260_ssids[] = { 0x10, 0x15, 0x0f, 0 };
1688	return alc_parse_auto_config(codec, alc260_ignore, alc260_ssids);
1689}
1690
1691/*
1692 * Pin config fixes
1693 */
1694enum {
1695	ALC260_FIXUP_HP_DC5750,
1696	ALC260_FIXUP_HP_PIN_0F,
1697	ALC260_FIXUP_COEF,
1698	ALC260_FIXUP_GPIO1,
1699	ALC260_FIXUP_GPIO1_TOGGLE,
1700	ALC260_FIXUP_REPLACER,
1701	ALC260_FIXUP_HP_B1900,
1702	ALC260_FIXUP_KN1,
1703	ALC260_FIXUP_FSC_S7020,
1704	ALC260_FIXUP_FSC_S7020_JWSE,
1705	ALC260_FIXUP_VAIO_PINS,
1706};
1707
1708static void alc260_gpio1_automute(struct hda_codec *codec)
1709{
1710	struct alc_spec *spec = codec->spec;
1711
1712	alc_update_gpio_data(codec, 0x01, spec->gen.hp_jack_present);
1713}
1714
1715static void alc260_fixup_gpio1_toggle(struct hda_codec *codec,
1716				      const struct hda_fixup *fix, int action)
1717{
1718	struct alc_spec *spec = codec->spec;
1719	if (action == HDA_FIXUP_ACT_PROBE) {
1720		/* although the machine has only one output pin, we need to
1721		 * toggle GPIO1 according to the jack state
1722		 */
1723		spec->gen.automute_hook = alc260_gpio1_automute;
1724		spec->gen.detect_hp = 1;
1725		spec->gen.automute_speaker = 1;
1726		spec->gen.autocfg.hp_pins[0] = 0x0f; /* copy it for automute */
1727		snd_hda_jack_detect_enable_callback(codec, 0x0f,
1728						    snd_hda_gen_hp_automute);
1729		alc_setup_gpio(codec, 0x01);
1730	}
1731}
1732
1733static void alc260_fixup_kn1(struct hda_codec *codec,
1734			     const struct hda_fixup *fix, int action)
1735{
1736	struct alc_spec *spec = codec->spec;
1737	static const struct hda_pintbl pincfgs[] = {
1738		{ 0x0f, 0x02214000 }, /* HP/speaker */
1739		{ 0x12, 0x90a60160 }, /* int mic */
1740		{ 0x13, 0x02a19000 }, /* ext mic */
1741		{ 0x18, 0x01446000 }, /* SPDIF out */
1742		/* disable bogus I/O pins */
1743		{ 0x10, 0x411111f0 },
1744		{ 0x11, 0x411111f0 },
1745		{ 0x14, 0x411111f0 },
1746		{ 0x15, 0x411111f0 },
1747		{ 0x16, 0x411111f0 },
1748		{ 0x17, 0x411111f0 },
1749		{ 0x19, 0x411111f0 },
1750		{ }
1751	};
1752
1753	switch (action) {
1754	case HDA_FIXUP_ACT_PRE_PROBE:
1755		snd_hda_apply_pincfgs(codec, pincfgs);
1756		spec->init_amp = ALC_INIT_NONE;
1757		break;
1758	}
1759}
1760
1761static void alc260_fixup_fsc_s7020(struct hda_codec *codec,
1762				   const struct hda_fixup *fix, int action)
1763{
1764	struct alc_spec *spec = codec->spec;
1765	if (action == HDA_FIXUP_ACT_PRE_PROBE)
1766		spec->init_amp = ALC_INIT_NONE;
1767}
1768
1769static void alc260_fixup_fsc_s7020_jwse(struct hda_codec *codec,
1770				   const struct hda_fixup *fix, int action)
1771{
1772	struct alc_spec *spec = codec->spec;
1773	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1774		spec->gen.add_jack_modes = 1;
1775		spec->gen.hp_mic = 1;
1776	}
1777}
1778
1779static const struct hda_fixup alc260_fixups[] = {
1780	[ALC260_FIXUP_HP_DC5750] = {
1781		.type = HDA_FIXUP_PINS,
1782		.v.pins = (const struct hda_pintbl[]) {
1783			{ 0x11, 0x90130110 }, /* speaker */
1784			{ }
1785		}
1786	},
1787	[ALC260_FIXUP_HP_PIN_0F] = {
1788		.type = HDA_FIXUP_PINS,
1789		.v.pins = (const struct hda_pintbl[]) {
1790			{ 0x0f, 0x01214000 }, /* HP */
1791			{ }
1792		}
1793	},
1794	[ALC260_FIXUP_COEF] = {
1795		.type = HDA_FIXUP_VERBS,
1796		.v.verbs = (const struct hda_verb[]) {
1797			{ 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1798			{ 0x1a, AC_VERB_SET_PROC_COEF,  0x3040 },
1799			{ }
1800		},
1801	},
1802	[ALC260_FIXUP_GPIO1] = {
1803		.type = HDA_FIXUP_FUNC,
1804		.v.func = alc_fixup_gpio1,
1805	},
1806	[ALC260_FIXUP_GPIO1_TOGGLE] = {
1807		.type = HDA_FIXUP_FUNC,
1808		.v.func = alc260_fixup_gpio1_toggle,
1809		.chained = true,
1810		.chain_id = ALC260_FIXUP_HP_PIN_0F,
1811	},
1812	[ALC260_FIXUP_REPLACER] = {
1813		.type = HDA_FIXUP_VERBS,
1814		.v.verbs = (const struct hda_verb[]) {
1815			{ 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1816			{ 0x1a, AC_VERB_SET_PROC_COEF,  0x3050 },
1817			{ }
1818		},
1819		.chained = true,
1820		.chain_id = ALC260_FIXUP_GPIO1_TOGGLE,
1821	},
1822	[ALC260_FIXUP_HP_B1900] = {
1823		.type = HDA_FIXUP_FUNC,
1824		.v.func = alc260_fixup_gpio1_toggle,
1825		.chained = true,
1826		.chain_id = ALC260_FIXUP_COEF,
1827	},
1828	[ALC260_FIXUP_KN1] = {
1829		.type = HDA_FIXUP_FUNC,
1830		.v.func = alc260_fixup_kn1,
1831	},
1832	[ALC260_FIXUP_FSC_S7020] = {
1833		.type = HDA_FIXUP_FUNC,
1834		.v.func = alc260_fixup_fsc_s7020,
1835	},
1836	[ALC260_FIXUP_FSC_S7020_JWSE] = {
1837		.type = HDA_FIXUP_FUNC,
1838		.v.func = alc260_fixup_fsc_s7020_jwse,
1839		.chained = true,
1840		.chain_id = ALC260_FIXUP_FSC_S7020,
1841	},
1842	[ALC260_FIXUP_VAIO_PINS] = {
1843		.type = HDA_FIXUP_PINS,
1844		.v.pins = (const struct hda_pintbl[]) {
1845			/* Pin configs are missing completely on some VAIOs */
1846			{ 0x0f, 0x01211020 },
1847			{ 0x10, 0x0001003f },
1848			{ 0x11, 0x411111f0 },
1849			{ 0x12, 0x01a15930 },
1850			{ 0x13, 0x411111f0 },
1851			{ 0x14, 0x411111f0 },
1852			{ 0x15, 0x411111f0 },
1853			{ 0x16, 0x411111f0 },
1854			{ 0x17, 0x411111f0 },
1855			{ 0x18, 0x411111f0 },
1856			{ 0x19, 0x411111f0 },
1857			{ }
1858		}
1859	},
1860};
1861
1862static const struct snd_pci_quirk alc260_fixup_tbl[] = {
1863	SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_FIXUP_GPIO1),
1864	SND_PCI_QUIRK(0x1025, 0x007f, "Acer Aspire 9500", ALC260_FIXUP_COEF),
1865	SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_FIXUP_GPIO1),
1866	SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", ALC260_FIXUP_HP_DC5750),
1867	SND_PCI_QUIRK(0x103c, 0x30ba, "HP Presario B1900", ALC260_FIXUP_HP_B1900),
1868	SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_FIXUP_VAIO_PINS),
1869	SND_PCI_QUIRK(0x104d, 0x81e2, "Sony VAIO TX", ALC260_FIXUP_HP_PIN_0F),
1870	SND_PCI_QUIRK(0x10cf, 0x1326, "FSC LifeBook S7020", ALC260_FIXUP_FSC_S7020),
1871	SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FIXUP_GPIO1),
1872	SND_PCI_QUIRK(0x152d, 0x0729, "Quanta KN1", ALC260_FIXUP_KN1),
1873	SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_FIXUP_REPLACER),
1874	SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_FIXUP_COEF),
1875	{}
1876};
1877
1878static const struct hda_model_fixup alc260_fixup_models[] = {
1879	{.id = ALC260_FIXUP_GPIO1, .name = "gpio1"},
1880	{.id = ALC260_FIXUP_COEF, .name = "coef"},
1881	{.id = ALC260_FIXUP_FSC_S7020, .name = "fujitsu"},
1882	{.id = ALC260_FIXUP_FSC_S7020_JWSE, .name = "fujitsu-jwse"},
1883	{}
1884};
1885
1886/*
1887 */
1888static int patch_alc260(struct hda_codec *codec)
1889{
1890	struct alc_spec *spec;
1891	int err;
1892
1893	err = alc_alloc_spec(codec, 0x07);
1894	if (err < 0)
1895		return err;
1896
1897	spec = codec->spec;
1898	/* as quite a few machines require HP amp for speaker outputs,
1899	 * it's easier to enable it unconditionally; even if it's unneeded,
1900	 * it's almost harmless.
1901	 */
1902	spec->gen.prefer_hp_amp = 1;
1903	spec->gen.beep_nid = 0x01;
1904
1905	spec->shutup = alc_eapd_shutup;
1906
1907	alc_pre_init(codec);
1908
1909	snd_hda_pick_fixup(codec, alc260_fixup_models, alc260_fixup_tbl,
1910			   alc260_fixups);
1911	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1912
1913	/* automatic parse from the BIOS config */
1914	err = alc260_parse_auto_config(codec);
1915	if (err < 0)
1916		goto error;
1917
1918	if (!spec->gen.no_analog) {
1919		err = set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
1920		if (err < 0)
1921			goto error;
1922	}
1923
1924	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
1925
1926	return 0;
1927
1928 error:
1929	alc_free(codec);
1930	return err;
1931}
1932
1933
1934/*
1935 * ALC882/883/885/888/889 support
1936 *
1937 * ALC882 is almost identical with ALC880 but has cleaner and more flexible
1938 * configuration.  Each pin widget can choose any input DACs and a mixer.
1939 * Each ADC is connected from a mixer of all inputs.  This makes possible
1940 * 6-channel independent captures.
1941 *
1942 * In addition, an independent DAC for the multi-playback (not used in this
1943 * driver yet).
1944 */
1945
1946/*
1947 * Pin config fixes
1948 */
1949enum {
1950	ALC882_FIXUP_ABIT_AW9D_MAX,
1951	ALC882_FIXUP_LENOVO_Y530,
1952	ALC882_FIXUP_PB_M5210,
1953	ALC882_FIXUP_ACER_ASPIRE_7736,
1954	ALC882_FIXUP_ASUS_W90V,
1955	ALC889_FIXUP_CD,
1956	ALC889_FIXUP_FRONT_HP_NO_PRESENCE,
1957	ALC889_FIXUP_VAIO_TT,
1958	ALC888_FIXUP_EEE1601,
1959	ALC886_FIXUP_EAPD,
1960	ALC882_FIXUP_EAPD,
1961	ALC883_FIXUP_EAPD,
1962	ALC883_FIXUP_ACER_EAPD,
1963	ALC882_FIXUP_GPIO1,
1964	ALC882_FIXUP_GPIO2,
1965	ALC882_FIXUP_GPIO3,
1966	ALC889_FIXUP_COEF,
1967	ALC882_FIXUP_ASUS_W2JC,
1968	ALC882_FIXUP_ACER_ASPIRE_4930G,
1969	ALC882_FIXUP_ACER_ASPIRE_8930G,
1970	ALC882_FIXUP_ASPIRE_8930G_VERBS,
1971	ALC885_FIXUP_MACPRO_GPIO,
1972	ALC889_FIXUP_DAC_ROUTE,
1973	ALC889_FIXUP_MBP_VREF,
1974	ALC889_FIXUP_IMAC91_VREF,
1975	ALC889_FIXUP_MBA11_VREF,
1976	ALC889_FIXUP_MBA21_VREF,
1977	ALC889_FIXUP_MP11_VREF,
1978	ALC889_FIXUP_MP41_VREF,
1979	ALC882_FIXUP_INV_DMIC,
1980	ALC882_FIXUP_NO_PRIMARY_HP,
1981	ALC887_FIXUP_ASUS_BASS,
1982	ALC887_FIXUP_BASS_CHMAP,
1983	ALC1220_FIXUP_GB_DUAL_CODECS,
1984	ALC1220_FIXUP_GB_X570,
1985	ALC1220_FIXUP_CLEVO_P950,
1986	ALC1220_FIXUP_CLEVO_PB51ED,
1987	ALC1220_FIXUP_CLEVO_PB51ED_PINS,
1988	ALC887_FIXUP_ASUS_AUDIO,
1989	ALC887_FIXUP_ASUS_HMIC,
1990	ALCS1200A_FIXUP_MIC_VREF,
1991	ALC888VD_FIXUP_MIC_100VREF,
1992};
1993
1994static void alc889_fixup_coef(struct hda_codec *codec,
1995			      const struct hda_fixup *fix, int action)
1996{
1997	if (action != HDA_FIXUP_ACT_INIT)
1998		return;
1999	alc_update_coef_idx(codec, 7, 0, 0x2030);
2000}
2001
2002/* set up GPIO at initialization */
2003static void alc885_fixup_macpro_gpio(struct hda_codec *codec,
2004				     const struct hda_fixup *fix, int action)
2005{
2006	struct alc_spec *spec = codec->spec;
2007
2008	spec->gpio_write_delay = true;
2009	alc_fixup_gpio3(codec, fix, action);
2010}
2011
2012/* Fix the connection of some pins for ALC889:
2013 * At least, Acer Aspire 5935 shows the connections to DAC3/4 don't
2014 * work correctly (bko#42740)
2015 */
2016static void alc889_fixup_dac_route(struct hda_codec *codec,
2017				   const struct hda_fixup *fix, int action)
2018{
2019	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2020		/* fake the connections during parsing the tree */
2021		static const hda_nid_t conn1[] = { 0x0c, 0x0d };
2022		static const hda_nid_t conn2[] = { 0x0e, 0x0f };
2023		snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2024		snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
2025		snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn2), conn2);
2026		snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn2), conn2);
2027	} else if (action == HDA_FIXUP_ACT_PROBE) {
2028		/* restore the connections */
2029		static const hda_nid_t conn[] = { 0x0c, 0x0d, 0x0e, 0x0f, 0x26 };
2030		snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
2031		snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn), conn);
2032		snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn), conn);
2033		snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn), conn);
2034	}
2035}
2036
2037/* Set VREF on HP pin */
2038static void alc889_fixup_mbp_vref(struct hda_codec *codec,
2039				  const struct hda_fixup *fix, int action)
2040{
2041	static const hda_nid_t nids[] = { 0x14, 0x15, 0x19 };
2042	struct alc_spec *spec = codec->spec;
2043	int i;
2044
2045	if (action != HDA_FIXUP_ACT_INIT)
2046		return;
2047	for (i = 0; i < ARRAY_SIZE(nids); i++) {
2048		unsigned int val = snd_hda_codec_get_pincfg(codec, nids[i]);
2049		if (get_defcfg_device(val) != AC_JACK_HP_OUT)
2050			continue;
2051		val = snd_hda_codec_get_pin_target(codec, nids[i]);
2052		val |= AC_PINCTL_VREF_80;
2053		snd_hda_set_pin_ctl(codec, nids[i], val);
2054		spec->gen.keep_vref_in_automute = 1;
2055		break;
2056	}
2057}
2058
2059static void alc889_fixup_mac_pins(struct hda_codec *codec,
2060				  const hda_nid_t *nids, int num_nids)
2061{
2062	struct alc_spec *spec = codec->spec;
2063	int i;
2064
2065	for (i = 0; i < num_nids; i++) {
2066		unsigned int val;
2067		val = snd_hda_codec_get_pin_target(codec, nids[i]);
2068		val |= AC_PINCTL_VREF_50;
2069		snd_hda_set_pin_ctl(codec, nids[i], val);
2070	}
2071	spec->gen.keep_vref_in_automute = 1;
2072}
2073
2074/* Set VREF on speaker pins on imac91 */
2075static void alc889_fixup_imac91_vref(struct hda_codec *codec,
2076				     const struct hda_fixup *fix, int action)
2077{
2078	static const hda_nid_t nids[] = { 0x18, 0x1a };
2079
2080	if (action == HDA_FIXUP_ACT_INIT)
2081		alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2082}
2083
2084/* Set VREF on speaker pins on mba11 */
2085static void alc889_fixup_mba11_vref(struct hda_codec *codec,
2086				    const struct hda_fixup *fix, int action)
2087{
2088	static const hda_nid_t nids[] = { 0x18 };
2089
2090	if (action == HDA_FIXUP_ACT_INIT)
2091		alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2092}
2093
2094/* Set VREF on speaker pins on mba21 */
2095static void alc889_fixup_mba21_vref(struct hda_codec *codec,
2096				    const struct hda_fixup *fix, int action)
2097{
2098	static const hda_nid_t nids[] = { 0x18, 0x19 };
2099
2100	if (action == HDA_FIXUP_ACT_INIT)
2101		alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2102}
2103
2104/* Don't take HP output as primary
2105 * Strangely, the speaker output doesn't work on Vaio Z and some Vaio
2106 * all-in-one desktop PCs (for example VGC-LN51JGB) through DAC 0x05
2107 */
2108static void alc882_fixup_no_primary_hp(struct hda_codec *codec,
2109				       const struct hda_fixup *fix, int action)
2110{
2111	struct alc_spec *spec = codec->spec;
2112	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2113		spec->gen.no_primary_hp = 1;
2114		spec->gen.no_multi_io = 1;
2115	}
2116}
2117
2118static void alc_fixup_bass_chmap(struct hda_codec *codec,
2119				 const struct hda_fixup *fix, int action);
2120
2121/* For dual-codec configuration, we need to disable some features to avoid
2122 * conflicts of kctls and PCM streams
2123 */
2124static void alc_fixup_dual_codecs(struct hda_codec *codec,
2125				  const struct hda_fixup *fix, int action)
2126{
2127	struct alc_spec *spec = codec->spec;
2128
2129	if (action != HDA_FIXUP_ACT_PRE_PROBE)
2130		return;
2131	/* disable vmaster */
2132	spec->gen.suppress_vmaster = 1;
2133	/* auto-mute and auto-mic switch don't work with multiple codecs */
2134	spec->gen.suppress_auto_mute = 1;
2135	spec->gen.suppress_auto_mic = 1;
2136	/* disable aamix as well */
2137	spec->gen.mixer_nid = 0;
2138	/* add location prefix to avoid conflicts */
2139	codec->force_pin_prefix = 1;
2140}
2141
2142static void rename_ctl(struct hda_codec *codec, const char *oldname,
2143		       const char *newname)
2144{
2145	struct snd_kcontrol *kctl;
2146
2147	kctl = snd_hda_find_mixer_ctl(codec, oldname);
2148	if (kctl)
2149		snd_ctl_rename(codec->card, kctl, newname);
2150}
2151
2152static void alc1220_fixup_gb_dual_codecs(struct hda_codec *codec,
2153					 const struct hda_fixup *fix,
2154					 int action)
2155{
2156	alc_fixup_dual_codecs(codec, fix, action);
2157	switch (action) {
2158	case HDA_FIXUP_ACT_PRE_PROBE:
2159		/* override card longname to provide a unique UCM profile */
2160		strcpy(codec->card->longname, "HDAudio-Gigabyte-ALC1220DualCodecs");
2161		break;
2162	case HDA_FIXUP_ACT_BUILD:
2163		/* rename Capture controls depending on the codec */
2164		rename_ctl(codec, "Capture Volume",
2165			   codec->addr == 0 ?
2166			   "Rear-Panel Capture Volume" :
2167			   "Front-Panel Capture Volume");
2168		rename_ctl(codec, "Capture Switch",
2169			   codec->addr == 0 ?
2170			   "Rear-Panel Capture Switch" :
2171			   "Front-Panel Capture Switch");
2172		break;
2173	}
2174}
2175
2176static void alc1220_fixup_gb_x570(struct hda_codec *codec,
2177				     const struct hda_fixup *fix,
2178				     int action)
2179{
2180	static const hda_nid_t conn1[] = { 0x0c };
2181	static const struct coef_fw gb_x570_coefs[] = {
2182		WRITE_COEF(0x07, 0x03c0),
2183		WRITE_COEF(0x1a, 0x01c1),
2184		WRITE_COEF(0x1b, 0x0202),
2185		WRITE_COEF(0x43, 0x3005),
2186		{}
2187	};
2188
2189	switch (action) {
2190	case HDA_FIXUP_ACT_PRE_PROBE:
2191		snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2192		snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
2193		break;
2194	case HDA_FIXUP_ACT_INIT:
2195		alc_process_coef_fw(codec, gb_x570_coefs);
2196		break;
2197	}
2198}
2199
2200static void alc1220_fixup_clevo_p950(struct hda_codec *codec,
2201				     const struct hda_fixup *fix,
2202				     int action)
2203{
2204	static const hda_nid_t conn1[] = { 0x0c };
2205
2206	if (action != HDA_FIXUP_ACT_PRE_PROBE)
2207		return;
2208
2209	alc_update_coef_idx(codec, 0x7, 0, 0x3c3);
2210	/* We therefore want to make sure 0x14 (front headphone) and
2211	 * 0x1b (speakers) use the stereo DAC 0x02
2212	 */
2213	snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2214	snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
2215}
2216
2217static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
2218				const struct hda_fixup *fix, int action);
2219
2220static void alc1220_fixup_clevo_pb51ed(struct hda_codec *codec,
2221				     const struct hda_fixup *fix,
2222				     int action)
2223{
2224	alc1220_fixup_clevo_p950(codec, fix, action);
2225	alc_fixup_headset_mode_no_hp_mic(codec, fix, action);
2226}
2227
2228static void alc887_asus_hp_automute_hook(struct hda_codec *codec,
2229					 struct hda_jack_callback *jack)
2230{
2231	struct alc_spec *spec = codec->spec;
2232	unsigned int vref;
2233
2234	snd_hda_gen_hp_automute(codec, jack);
2235
2236	if (spec->gen.hp_jack_present)
2237		vref = AC_PINCTL_VREF_80;
2238	else
2239		vref = AC_PINCTL_VREF_HIZ;
2240	snd_hda_set_pin_ctl(codec, 0x19, PIN_HP | vref);
2241}
2242
2243static void alc887_fixup_asus_jack(struct hda_codec *codec,
2244				     const struct hda_fixup *fix, int action)
2245{
2246	struct alc_spec *spec = codec->spec;
2247	if (action != HDA_FIXUP_ACT_PROBE)
2248		return;
2249	snd_hda_set_pin_ctl_cache(codec, 0x1b, PIN_HP);
2250	spec->gen.hp_automute_hook = alc887_asus_hp_automute_hook;
2251}
2252
2253static const struct hda_fixup alc882_fixups[] = {
2254	[ALC882_FIXUP_ABIT_AW9D_MAX] = {
2255		.type = HDA_FIXUP_PINS,
2256		.v.pins = (const struct hda_pintbl[]) {
2257			{ 0x15, 0x01080104 }, /* side */
2258			{ 0x16, 0x01011012 }, /* rear */
2259			{ 0x17, 0x01016011 }, /* clfe */
2260			{ }
2261		}
2262	},
2263	[ALC882_FIXUP_LENOVO_Y530] = {
2264		.type = HDA_FIXUP_PINS,
2265		.v.pins = (const struct hda_pintbl[]) {
2266			{ 0x15, 0x99130112 }, /* rear int speakers */
2267			{ 0x16, 0x99130111 }, /* subwoofer */
2268			{ }
2269		}
2270	},
2271	[ALC882_FIXUP_PB_M5210] = {
2272		.type = HDA_FIXUP_PINCTLS,
2273		.v.pins = (const struct hda_pintbl[]) {
2274			{ 0x19, PIN_VREF50 },
2275			{}
2276		}
2277	},
2278	[ALC882_FIXUP_ACER_ASPIRE_7736] = {
2279		.type = HDA_FIXUP_FUNC,
2280		.v.func = alc_fixup_sku_ignore,
2281	},
2282	[ALC882_FIXUP_ASUS_W90V] = {
2283		.type = HDA_FIXUP_PINS,
2284		.v.pins = (const struct hda_pintbl[]) {
2285			{ 0x16, 0x99130110 }, /* fix sequence for CLFE */
2286			{ }
2287		}
2288	},
2289	[ALC889_FIXUP_CD] = {
2290		.type = HDA_FIXUP_PINS,
2291		.v.pins = (const struct hda_pintbl[]) {
2292			{ 0x1c, 0x993301f0 }, /* CD */
2293			{ }
2294		}
2295	},
2296	[ALC889_FIXUP_FRONT_HP_NO_PRESENCE] = {
2297		.type = HDA_FIXUP_PINS,
2298		.v.pins = (const struct hda_pintbl[]) {
2299			{ 0x1b, 0x02214120 }, /* Front HP jack is flaky, disable jack detect */
2300			{ }
2301		},
2302		.chained = true,
2303		.chain_id = ALC889_FIXUP_CD,
2304	},
2305	[ALC889_FIXUP_VAIO_TT] = {
2306		.type = HDA_FIXUP_PINS,
2307		.v.pins = (const struct hda_pintbl[]) {
2308			{ 0x17, 0x90170111 }, /* hidden surround speaker */
2309			{ }
2310		}
2311	},
2312	[ALC888_FIXUP_EEE1601] = {
2313		.type = HDA_FIXUP_VERBS,
2314		.v.verbs = (const struct hda_verb[]) {
2315			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2316			{ 0x20, AC_VERB_SET_PROC_COEF,  0x0838 },
2317			{ }
2318		}
2319	},
2320	[ALC886_FIXUP_EAPD] = {
2321		.type = HDA_FIXUP_VERBS,
2322		.v.verbs = (const struct hda_verb[]) {
2323			/* change to EAPD mode */
2324			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2325			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0068 },
2326			{ }
2327		}
2328	},
2329	[ALC882_FIXUP_EAPD] = {
2330		.type = HDA_FIXUP_VERBS,
2331		.v.verbs = (const struct hda_verb[]) {
2332			/* change to EAPD mode */
2333			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2334			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
2335			{ }
2336		}
2337	},
2338	[ALC883_FIXUP_EAPD] = {
2339		.type = HDA_FIXUP_VERBS,
2340		.v.verbs = (const struct hda_verb[]) {
2341			/* change to EAPD mode */
2342			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2343			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2344			{ }
2345		}
2346	},
2347	[ALC883_FIXUP_ACER_EAPD] = {
2348		.type = HDA_FIXUP_VERBS,
2349		.v.verbs = (const struct hda_verb[]) {
2350			/* eanable EAPD on Acer laptops */
2351			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2352			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2353			{ }
2354		}
2355	},
2356	[ALC882_FIXUP_GPIO1] = {
2357		.type = HDA_FIXUP_FUNC,
2358		.v.func = alc_fixup_gpio1,
2359	},
2360	[ALC882_FIXUP_GPIO2] = {
2361		.type = HDA_FIXUP_FUNC,
2362		.v.func = alc_fixup_gpio2,
2363	},
2364	[ALC882_FIXUP_GPIO3] = {
2365		.type = HDA_FIXUP_FUNC,
2366		.v.func = alc_fixup_gpio3,
2367	},
2368	[ALC882_FIXUP_ASUS_W2JC] = {
2369		.type = HDA_FIXUP_FUNC,
2370		.v.func = alc_fixup_gpio1,
2371		.chained = true,
2372		.chain_id = ALC882_FIXUP_EAPD,
2373	},
2374	[ALC889_FIXUP_COEF] = {
2375		.type = HDA_FIXUP_FUNC,
2376		.v.func = alc889_fixup_coef,
2377	},
2378	[ALC882_FIXUP_ACER_ASPIRE_4930G] = {
2379		.type = HDA_FIXUP_PINS,
2380		.v.pins = (const struct hda_pintbl[]) {
2381			{ 0x16, 0x99130111 }, /* CLFE speaker */
2382			{ 0x17, 0x99130112 }, /* surround speaker */
2383			{ }
2384		},
2385		.chained = true,
2386		.chain_id = ALC882_FIXUP_GPIO1,
2387	},
2388	[ALC882_FIXUP_ACER_ASPIRE_8930G] = {
2389		.type = HDA_FIXUP_PINS,
2390		.v.pins = (const struct hda_pintbl[]) {
2391			{ 0x16, 0x99130111 }, /* CLFE speaker */
2392			{ 0x1b, 0x99130112 }, /* surround speaker */
2393			{ }
2394		},
2395		.chained = true,
2396		.chain_id = ALC882_FIXUP_ASPIRE_8930G_VERBS,
2397	},
2398	[ALC882_FIXUP_ASPIRE_8930G_VERBS] = {
2399		/* additional init verbs for Acer Aspire 8930G */
2400		.type = HDA_FIXUP_VERBS,
2401		.v.verbs = (const struct hda_verb[]) {
2402			/* Enable all DACs */
2403			/* DAC DISABLE/MUTE 1? */
2404			/*  setting bits 1-5 disables DAC nids 0x02-0x06
2405			 *  apparently. Init=0x38 */
2406			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x03 },
2407			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2408			/* DAC DISABLE/MUTE 2? */
2409			/*  some bit here disables the other DACs.
2410			 *  Init=0x4900 */
2411			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x08 },
2412			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2413			/* DMIC fix
2414			 * This laptop has a stereo digital microphone.
2415			 * The mics are only 1cm apart which makes the stereo
2416			 * useless. However, either the mic or the ALC889
2417			 * makes the signal become a difference/sum signal
2418			 * instead of standard stereo, which is annoying.
2419			 * So instead we flip this bit which makes the
2420			 * codec replicate the sum signal to both channels,
2421			 * turning it into a normal mono mic.
2422			 */
2423			/* DMIC_CONTROL? Init value = 0x0001 */
2424			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2425			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0003 },
2426			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2427			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2428			{ }
2429		},
2430		.chained = true,
2431		.chain_id = ALC882_FIXUP_GPIO1,
2432	},
2433	[ALC885_FIXUP_MACPRO_GPIO] = {
2434		.type = HDA_FIXUP_FUNC,
2435		.v.func = alc885_fixup_macpro_gpio,
2436	},
2437	[ALC889_FIXUP_DAC_ROUTE] = {
2438		.type = HDA_FIXUP_FUNC,
2439		.v.func = alc889_fixup_dac_route,
2440	},
2441	[ALC889_FIXUP_MBP_VREF] = {
2442		.type = HDA_FIXUP_FUNC,
2443		.v.func = alc889_fixup_mbp_vref,
2444		.chained = true,
2445		.chain_id = ALC882_FIXUP_GPIO1,
2446	},
2447	[ALC889_FIXUP_IMAC91_VREF] = {
2448		.type = HDA_FIXUP_FUNC,
2449		.v.func = alc889_fixup_imac91_vref,
2450		.chained = true,
2451		.chain_id = ALC882_FIXUP_GPIO1,
2452	},
2453	[ALC889_FIXUP_MBA11_VREF] = {
2454		.type = HDA_FIXUP_FUNC,
2455		.v.func = alc889_fixup_mba11_vref,
2456		.chained = true,
2457		.chain_id = ALC889_FIXUP_MBP_VREF,
2458	},
2459	[ALC889_FIXUP_MBA21_VREF] = {
2460		.type = HDA_FIXUP_FUNC,
2461		.v.func = alc889_fixup_mba21_vref,
2462		.chained = true,
2463		.chain_id = ALC889_FIXUP_MBP_VREF,
2464	},
2465	[ALC889_FIXUP_MP11_VREF] = {
2466		.type = HDA_FIXUP_FUNC,
2467		.v.func = alc889_fixup_mba11_vref,
2468		.chained = true,
2469		.chain_id = ALC885_FIXUP_MACPRO_GPIO,
2470	},
2471	[ALC889_FIXUP_MP41_VREF] = {
2472		.type = HDA_FIXUP_FUNC,
2473		.v.func = alc889_fixup_mbp_vref,
2474		.chained = true,
2475		.chain_id = ALC885_FIXUP_MACPRO_GPIO,
2476	},
2477	[ALC882_FIXUP_INV_DMIC] = {
2478		.type = HDA_FIXUP_FUNC,
2479		.v.func = alc_fixup_inv_dmic,
2480	},
2481	[ALC882_FIXUP_NO_PRIMARY_HP] = {
2482		.type = HDA_FIXUP_FUNC,
2483		.v.func = alc882_fixup_no_primary_hp,
2484	},
2485	[ALC887_FIXUP_ASUS_BASS] = {
2486		.type = HDA_FIXUP_PINS,
2487		.v.pins = (const struct hda_pintbl[]) {
2488			{0x16, 0x99130130}, /* bass speaker */
2489			{}
2490		},
2491		.chained = true,
2492		.chain_id = ALC887_FIXUP_BASS_CHMAP,
2493	},
2494	[ALC887_FIXUP_BASS_CHMAP] = {
2495		.type = HDA_FIXUP_FUNC,
2496		.v.func = alc_fixup_bass_chmap,
2497	},
2498	[ALC1220_FIXUP_GB_DUAL_CODECS] = {
2499		.type = HDA_FIXUP_FUNC,
2500		.v.func = alc1220_fixup_gb_dual_codecs,
2501	},
2502	[ALC1220_FIXUP_GB_X570] = {
2503		.type = HDA_FIXUP_FUNC,
2504		.v.func = alc1220_fixup_gb_x570,
2505	},
2506	[ALC1220_FIXUP_CLEVO_P950] = {
2507		.type = HDA_FIXUP_FUNC,
2508		.v.func = alc1220_fixup_clevo_p950,
2509	},
2510	[ALC1220_FIXUP_CLEVO_PB51ED] = {
2511		.type = HDA_FIXUP_FUNC,
2512		.v.func = alc1220_fixup_clevo_pb51ed,
2513	},
2514	[ALC1220_FIXUP_CLEVO_PB51ED_PINS] = {
2515		.type = HDA_FIXUP_PINS,
2516		.v.pins = (const struct hda_pintbl[]) {
2517			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
2518			{}
2519		},
2520		.chained = true,
2521		.chain_id = ALC1220_FIXUP_CLEVO_PB51ED,
2522	},
2523	[ALC887_FIXUP_ASUS_AUDIO] = {
2524		.type = HDA_FIXUP_PINS,
2525		.v.pins = (const struct hda_pintbl[]) {
2526			{ 0x15, 0x02a14150 }, /* use as headset mic, without its own jack detect */
2527			{ 0x19, 0x22219420 },
2528			{}
2529		},
2530	},
2531	[ALC887_FIXUP_ASUS_HMIC] = {
2532		.type = HDA_FIXUP_FUNC,
2533		.v.func = alc887_fixup_asus_jack,
2534		.chained = true,
2535		.chain_id = ALC887_FIXUP_ASUS_AUDIO,
2536	},
2537	[ALCS1200A_FIXUP_MIC_VREF] = {
2538		.type = HDA_FIXUP_PINCTLS,
2539		.v.pins = (const struct hda_pintbl[]) {
2540			{ 0x18, PIN_VREF50 }, /* rear mic */
2541			{ 0x19, PIN_VREF50 }, /* front mic */
2542			{}
2543		}
2544	},
2545	[ALC888VD_FIXUP_MIC_100VREF] = {
2546		.type = HDA_FIXUP_PINCTLS,
2547		.v.pins = (const struct hda_pintbl[]) {
2548			{ 0x18, PIN_VREF100 }, /* headset mic */
2549			{}
2550		}
2551	},
2552};
2553
2554static const struct snd_pci_quirk alc882_fixup_tbl[] = {
2555	SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD),
2556	SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2557	SND_PCI_QUIRK(0x1025, 0x0107, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2558	SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD),
2559	SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2560	SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD),
2561	SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_FIXUP_ACER_EAPD),
2562	SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
2563		      ALC882_FIXUP_ACER_ASPIRE_4930G),
2564	SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
2565		      ALC882_FIXUP_ACER_ASPIRE_4930G),
2566	SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
2567		      ALC882_FIXUP_ACER_ASPIRE_8930G),
2568	SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
2569		      ALC882_FIXUP_ACER_ASPIRE_8930G),
2570	SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
2571		      ALC882_FIXUP_ACER_ASPIRE_4930G),
2572	SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
2573	SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
2574		      ALC882_FIXUP_ACER_ASPIRE_4930G),
2575	SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
2576		      ALC882_FIXUP_ACER_ASPIRE_4930G),
2577	SND_PCI_QUIRK(0x1025, 0x021e, "Acer Aspire 5739G",
2578		      ALC882_FIXUP_ACER_ASPIRE_4930G),
2579	SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),
2580	SND_PCI_QUIRK(0x1025, 0x026b, "Acer Aspire 8940G", ALC882_FIXUP_ACER_ASPIRE_8930G),
2581	SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736),
2582	SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD),
2583	SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),
2584	SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_FIXUP_ASUS_W2JC),
2585	SND_PCI_QUIRK(0x1043, 0x2390, "Asus D700SA", ALC887_FIXUP_ASUS_HMIC),
2586	SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601),
2587	SND_PCI_QUIRK(0x1043, 0x84bc, "ASUS ET2700", ALC887_FIXUP_ASUS_BASS),
2588	SND_PCI_QUIRK(0x1043, 0x8691, "ASUS ROG Ranger VIII", ALC882_FIXUP_GPIO3),
2589	SND_PCI_QUIRK(0x1043, 0x8797, "ASUS TUF B550M-PLUS", ALCS1200A_FIXUP_MIC_VREF),
2590	SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP),
2591	SND_PCI_QUIRK(0x104d, 0x9044, "Sony VAIO AiO", ALC882_FIXUP_NO_PRIMARY_HP),
2592	SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT),
2593	SND_PCI_QUIRK(0x104d, 0x905a, "Sony Vaio Z", ALC882_FIXUP_NO_PRIMARY_HP),
2594	SND_PCI_QUIRK(0x104d, 0x9060, "Sony Vaio VPCL14M1R", ALC882_FIXUP_NO_PRIMARY_HP),
2595
2596	/* All Apple entries are in codec SSIDs */
2597	SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF),
2598	SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC889_FIXUP_MBP_VREF),
2599	SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
2600	SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC889_FIXUP_MP11_VREF),
2601	SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_FIXUP_MACPRO_GPIO),
2602	SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_FIXUP_MACPRO_GPIO),
2603	SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC889_FIXUP_MBP_VREF),
2604	SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889_FIXUP_MBP_VREF),
2605	SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD),
2606	SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC889_FIXUP_MBA11_VREF),
2607	SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBA21_VREF),
2608	SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889_FIXUP_MBP_VREF),
2609	SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
2610	SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO),
2611	SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF),
2612	SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF),
2613	SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF),
2614	SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 4,1/5,1", ALC889_FIXUP_MP41_VREF),
2615	SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF),
2616	SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),
2617	SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),
2618	SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_MBA11_VREF),
2619
2620	SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),
2621	SND_PCI_QUIRK(0x10ec, 0x12d8, "iBase Elo Touch", ALC888VD_FIXUP_MIC_100VREF),
2622	SND_PCI_QUIRK(0x13fe, 0x1009, "Advantech MIT-W101", ALC886_FIXUP_EAPD),
2623	SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE),
2624	SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
2625	SND_PCI_QUIRK(0x1458, 0xa0cd, "Gigabyte X570 Aorus Master", ALC1220_FIXUP_GB_X570),
2626	SND_PCI_QUIRK(0x1458, 0xa0ce, "Gigabyte X570 Aorus Xtreme", ALC1220_FIXUP_GB_X570),
2627	SND_PCI_QUIRK(0x1458, 0xa0d5, "Gigabyte X570S Aorus Master", ALC1220_FIXUP_GB_X570),
2628	SND_PCI_QUIRK(0x1462, 0x11f7, "MSI-GE63", ALC1220_FIXUP_CLEVO_P950),
2629	SND_PCI_QUIRK(0x1462, 0x1228, "MSI-GP63", ALC1220_FIXUP_CLEVO_P950),
2630	SND_PCI_QUIRK(0x1462, 0x1229, "MSI-GP73", ALC1220_FIXUP_CLEVO_P950),
2631	SND_PCI_QUIRK(0x1462, 0x1275, "MSI-GL63", ALC1220_FIXUP_CLEVO_P950),
2632	SND_PCI_QUIRK(0x1462, 0x1276, "MSI-GL73", ALC1220_FIXUP_CLEVO_P950),
2633	SND_PCI_QUIRK(0x1462, 0x1293, "MSI-GP65", ALC1220_FIXUP_CLEVO_P950),
2634	SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),
2635	SND_PCI_QUIRK(0x1462, 0xcc34, "MSI Godlike X570", ALC1220_FIXUP_GB_DUAL_CODECS),
2636	SND_PCI_QUIRK(0x1462, 0xda57, "MSI Z270-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
2637	SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
2638	SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
2639	SND_PCI_QUIRK(0x1558, 0x3702, "Clevo X370SN[VW]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2640	SND_PCI_QUIRK(0x1558, 0x50d3, "Clevo PC50[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2641	SND_PCI_QUIRK(0x1558, 0x65d1, "Clevo PB51[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2642	SND_PCI_QUIRK(0x1558, 0x65d2, "Clevo PB51R[CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2643	SND_PCI_QUIRK(0x1558, 0x65e1, "Clevo PB51[ED][DF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2644	SND_PCI_QUIRK(0x1558, 0x65e5, "Clevo PC50D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2645	SND_PCI_QUIRK(0x1558, 0x65f1, "Clevo PC50HS", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2646	SND_PCI_QUIRK(0x1558, 0x65f5, "Clevo PD50PN[NRT]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2647	SND_PCI_QUIRK(0x1558, 0x66a2, "Clevo PE60RNE", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2648	SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2649	SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2650	SND_PCI_QUIRK(0x1558, 0x67e5, "Clevo PC70D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2651	SND_PCI_QUIRK(0x1558, 0x67f1, "Clevo PC70H[PRS]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2652	SND_PCI_QUIRK(0x1558, 0x67f5, "Clevo PD70PN[NRT]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2653	SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2654	SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170SM", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2655	SND_PCI_QUIRK(0x1558, 0x7715, "Clevo X170KM-G", ALC1220_FIXUP_CLEVO_PB51ED),
2656	SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),
2657	SND_PCI_QUIRK(0x1558, 0x9506, "Clevo P955HQ", ALC1220_FIXUP_CLEVO_P950),
2658	SND_PCI_QUIRK(0x1558, 0x950a, "Clevo P955H[PR]", ALC1220_FIXUP_CLEVO_P950),
2659	SND_PCI_QUIRK(0x1558, 0x95e1, "Clevo P95xER", ALC1220_FIXUP_CLEVO_P950),
2660	SND_PCI_QUIRK(0x1558, 0x95e2, "Clevo P950ER", ALC1220_FIXUP_CLEVO_P950),
2661	SND_PCI_QUIRK(0x1558, 0x95e3, "Clevo P955[ER]T", ALC1220_FIXUP_CLEVO_P950),
2662	SND_PCI_QUIRK(0x1558, 0x95e4, "Clevo P955ER", ALC1220_FIXUP_CLEVO_P950),
2663	SND_PCI_QUIRK(0x1558, 0x95e5, "Clevo P955EE6", ALC1220_FIXUP_CLEVO_P950),
2664	SND_PCI_QUIRK(0x1558, 0x95e6, "Clevo P950R[CDF]", ALC1220_FIXUP_CLEVO_P950),
2665	SND_PCI_QUIRK(0x1558, 0x96e1, "Clevo P960[ER][CDFN]-K", ALC1220_FIXUP_CLEVO_P950),
2666	SND_PCI_QUIRK(0x1558, 0x97e1, "Clevo P970[ER][CDFN]", ALC1220_FIXUP_CLEVO_P950),
2667	SND_PCI_QUIRK(0x1558, 0x97e2, "Clevo P970RC-M", ALC1220_FIXUP_CLEVO_P950),
2668	SND_PCI_QUIRK(0x1558, 0xd502, "Clevo PD50SNE", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2669	SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
2670	SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),
2671	SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),
2672	SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_FIXUP_COEF),
2673	{}
2674};
2675
2676static const struct hda_model_fixup alc882_fixup_models[] = {
2677	{.id = ALC882_FIXUP_ABIT_AW9D_MAX, .name = "abit-aw9d"},
2678	{.id = ALC882_FIXUP_LENOVO_Y530, .name = "lenovo-y530"},
2679	{.id = ALC882_FIXUP_ACER_ASPIRE_7736, .name = "acer-aspire-7736"},
2680	{.id = ALC882_FIXUP_ASUS_W90V, .name = "asus-w90v"},
2681	{.id = ALC889_FIXUP_CD, .name = "cd"},
2682	{.id = ALC889_FIXUP_FRONT_HP_NO_PRESENCE, .name = "no-front-hp"},
2683	{.id = ALC889_FIXUP_VAIO_TT, .name = "vaio-tt"},
2684	{.id = ALC888_FIXUP_EEE1601, .name = "eee1601"},
2685	{.id = ALC882_FIXUP_EAPD, .name = "alc882-eapd"},
2686	{.id = ALC883_FIXUP_EAPD, .name = "alc883-eapd"},
2687	{.id = ALC882_FIXUP_GPIO1, .name = "gpio1"},
2688	{.id = ALC882_FIXUP_GPIO2, .name = "gpio2"},
2689	{.id = ALC882_FIXUP_GPIO3, .name = "gpio3"},
2690	{.id = ALC889_FIXUP_COEF, .name = "alc889-coef"},
2691	{.id = ALC882_FIXUP_ASUS_W2JC, .name = "asus-w2jc"},
2692	{.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name = "acer-aspire-4930g"},
2693	{.id = ALC882_FIXUP_ACER_ASPIRE_8930G, .name = "acer-aspire-8930g"},
2694	{.id = ALC883_FIXUP_ACER_EAPD, .name = "acer-aspire"},
2695	{.id = ALC885_FIXUP_MACPRO_GPIO, .name = "macpro-gpio"},
2696	{.id = ALC889_FIXUP_DAC_ROUTE, .name = "dac-route"},
2697	{.id = ALC889_FIXUP_MBP_VREF, .name = "mbp-vref"},
2698	{.id = ALC889_FIXUP_IMAC91_VREF, .name = "imac91-vref"},
2699	{.id = ALC889_FIXUP_MBA11_VREF, .name = "mba11-vref"},
2700	{.id = ALC889_FIXUP_MBA21_VREF, .name = "mba21-vref"},
2701	{.id = ALC889_FIXUP_MP11_VREF, .name = "mp11-vref"},
2702	{.id = ALC889_FIXUP_MP41_VREF, .name = "mp41-vref"},
2703	{.id = ALC882_FIXUP_INV_DMIC, .name = "inv-dmic"},
2704	{.id = ALC882_FIXUP_NO_PRIMARY_HP, .name = "no-primary-hp"},
2705	{.id = ALC887_FIXUP_ASUS_BASS, .name = "asus-bass"},
2706	{.id = ALC1220_FIXUP_GB_DUAL_CODECS, .name = "dual-codecs"},
2707	{.id = ALC1220_FIXUP_GB_X570, .name = "gb-x570"},
2708	{.id = ALC1220_FIXUP_CLEVO_P950, .name = "clevo-p950"},
2709	{}
2710};
2711
2712static const struct snd_hda_pin_quirk alc882_pin_fixup_tbl[] = {
2713	SND_HDA_PIN_QUIRK(0x10ec1220, 0x1043, "ASUS", ALC1220_FIXUP_CLEVO_P950,
2714		{0x14, 0x01014010},
2715		{0x15, 0x01011012},
2716		{0x16, 0x01016011},
2717		{0x18, 0x01a19040},
2718		{0x19, 0x02a19050},
2719		{0x1a, 0x0181304f},
2720		{0x1b, 0x0221401f},
2721		{0x1e, 0x01456130}),
2722	SND_HDA_PIN_QUIRK(0x10ec1220, 0x1462, "MS-7C35", ALC1220_FIXUP_CLEVO_P950,
2723		{0x14, 0x01015010},
2724		{0x15, 0x01011012},
2725		{0x16, 0x01011011},
2726		{0x18, 0x01a11040},
2727		{0x19, 0x02a19050},
2728		{0x1a, 0x0181104f},
2729		{0x1b, 0x0221401f},
2730		{0x1e, 0x01451130}),
2731	{}
2732};
2733
2734/*
2735 * BIOS auto configuration
2736 */
2737/* almost identical with ALC880 parser... */
2738static int alc882_parse_auto_config(struct hda_codec *codec)
2739{
2740	static const hda_nid_t alc882_ignore[] = { 0x1d, 0 };
2741	static const hda_nid_t alc882_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2742	return alc_parse_auto_config(codec, alc882_ignore, alc882_ssids);
2743}
2744
2745/*
2746 */
2747static int patch_alc882(struct hda_codec *codec)
2748{
2749	struct alc_spec *spec;
2750	int err;
2751
2752	err = alc_alloc_spec(codec, 0x0b);
2753	if (err < 0)
2754		return err;
2755
2756	spec = codec->spec;
2757
2758	switch (codec->core.vendor_id) {
2759	case 0x10ec0882:
2760	case 0x10ec0885:
2761	case 0x10ec0900:
2762	case 0x10ec0b00:
2763	case 0x10ec1220:
2764		break;
2765	default:
2766		/* ALC883 and variants */
2767		alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2768		break;
2769	}
2770
2771	alc_pre_init(codec);
2772
2773	snd_hda_pick_fixup(codec, alc882_fixup_models, alc882_fixup_tbl,
2774		       alc882_fixups);
2775	snd_hda_pick_pin_fixup(codec, alc882_pin_fixup_tbl, alc882_fixups, true);
2776	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2777
2778	alc_auto_parse_customize_define(codec);
2779
2780	if (has_cdefine_beep(codec))
2781		spec->gen.beep_nid = 0x01;
2782
2783	/* automatic parse from the BIOS config */
2784	err = alc882_parse_auto_config(codec);
2785	if (err < 0)
2786		goto error;
2787
2788	if (!spec->gen.no_analog && spec->gen.beep_nid) {
2789		err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2790		if (err < 0)
2791			goto error;
2792	}
2793
2794	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2795
2796	return 0;
2797
2798 error:
2799	alc_free(codec);
2800	return err;
2801}
2802
2803
2804/*
2805 * ALC262 support
2806 */
2807static int alc262_parse_auto_config(struct hda_codec *codec)
2808{
2809	static const hda_nid_t alc262_ignore[] = { 0x1d, 0 };
2810	static const hda_nid_t alc262_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2811	return alc_parse_auto_config(codec, alc262_ignore, alc262_ssids);
2812}
2813
2814/*
2815 * Pin config fixes
2816 */
2817enum {
2818	ALC262_FIXUP_FSC_H270,
2819	ALC262_FIXUP_FSC_S7110,
2820	ALC262_FIXUP_HP_Z200,
2821	ALC262_FIXUP_TYAN,
2822	ALC262_FIXUP_LENOVO_3000,
2823	ALC262_FIXUP_BENQ,
2824	ALC262_FIXUP_BENQ_T31,
2825	ALC262_FIXUP_INV_DMIC,
2826	ALC262_FIXUP_INTEL_BAYLEYBAY,
2827};
2828
2829static const struct hda_fixup alc262_fixups[] = {
2830	[ALC262_FIXUP_FSC_H270] = {
2831		.type = HDA_FIXUP_PINS,
2832		.v.pins = (const struct hda_pintbl[]) {
2833			{ 0x14, 0x99130110 }, /* speaker */
2834			{ 0x15, 0x0221142f }, /* front HP */
2835			{ 0x1b, 0x0121141f }, /* rear HP */
2836			{ }
2837		}
2838	},
2839	[ALC262_FIXUP_FSC_S7110] = {
2840		.type = HDA_FIXUP_PINS,
2841		.v.pins = (const struct hda_pintbl[]) {
2842			{ 0x15, 0x90170110 }, /* speaker */
2843			{ }
2844		},
2845		.chained = true,
2846		.chain_id = ALC262_FIXUP_BENQ,
2847	},
2848	[ALC262_FIXUP_HP_Z200] = {
2849		.type = HDA_FIXUP_PINS,
2850		.v.pins = (const struct hda_pintbl[]) {
2851			{ 0x16, 0x99130120 }, /* internal speaker */
2852			{ }
2853		}
2854	},
2855	[ALC262_FIXUP_TYAN] = {
2856		.type = HDA_FIXUP_PINS,
2857		.v.pins = (const struct hda_pintbl[]) {
2858			{ 0x14, 0x1993e1f0 }, /* int AUX */
2859			{ }
2860		}
2861	},
2862	[ALC262_FIXUP_LENOVO_3000] = {
2863		.type = HDA_FIXUP_PINCTLS,
2864		.v.pins = (const struct hda_pintbl[]) {
2865			{ 0x19, PIN_VREF50 },
2866			{}
2867		},
2868		.chained = true,
2869		.chain_id = ALC262_FIXUP_BENQ,
2870	},
2871	[ALC262_FIXUP_BENQ] = {
2872		.type = HDA_FIXUP_VERBS,
2873		.v.verbs = (const struct hda_verb[]) {
2874			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2875			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2876			{}
2877		}
2878	},
2879	[ALC262_FIXUP_BENQ_T31] = {
2880		.type = HDA_FIXUP_VERBS,
2881		.v.verbs = (const struct hda_verb[]) {
2882			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2883			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2884			{}
2885		}
2886	},
2887	[ALC262_FIXUP_INV_DMIC] = {
2888		.type = HDA_FIXUP_FUNC,
2889		.v.func = alc_fixup_inv_dmic,
2890	},
2891	[ALC262_FIXUP_INTEL_BAYLEYBAY] = {
2892		.type = HDA_FIXUP_FUNC,
2893		.v.func = alc_fixup_no_depop_delay,
2894	},
2895};
2896
2897static const struct snd_pci_quirk alc262_fixup_tbl[] = {
2898	SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", ALC262_FIXUP_HP_Z200),
2899	SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu Lifebook S7110", ALC262_FIXUP_FSC_S7110),
2900	SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ),
2901	SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN),
2902	SND_PCI_QUIRK(0x1734, 0x1141, "FSC ESPRIMO U9210", ALC262_FIXUP_FSC_H270),
2903	SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270),
2904	SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000),
2905	SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ),
2906	SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_FIXUP_BENQ_T31),
2907	SND_PCI_QUIRK(0x8086, 0x7270, "BayleyBay", ALC262_FIXUP_INTEL_BAYLEYBAY),
2908	{}
2909};
2910
2911static const struct hda_model_fixup alc262_fixup_models[] = {
2912	{.id = ALC262_FIXUP_INV_DMIC, .name = "inv-dmic"},
2913	{.id = ALC262_FIXUP_FSC_H270, .name = "fsc-h270"},
2914	{.id = ALC262_FIXUP_FSC_S7110, .name = "fsc-s7110"},
2915	{.id = ALC262_FIXUP_HP_Z200, .name = "hp-z200"},
2916	{.id = ALC262_FIXUP_TYAN, .name = "tyan"},
2917	{.id = ALC262_FIXUP_LENOVO_3000, .name = "lenovo-3000"},
2918	{.id = ALC262_FIXUP_BENQ, .name = "benq"},
2919	{.id = ALC262_FIXUP_BENQ_T31, .name = "benq-t31"},
2920	{.id = ALC262_FIXUP_INTEL_BAYLEYBAY, .name = "bayleybay"},
2921	{}
2922};
2923
2924/*
2925 */
2926static int patch_alc262(struct hda_codec *codec)
2927{
2928	struct alc_spec *spec;
2929	int err;
2930
2931	err = alc_alloc_spec(codec, 0x0b);
2932	if (err < 0)
2933		return err;
2934
2935	spec = codec->spec;
2936	spec->gen.shared_mic_vref_pin = 0x18;
2937
2938	spec->shutup = alc_eapd_shutup;
2939
2940#if 0
2941	/* pshou 07/11/05  set a zero PCM sample to DAC when FIFO is
2942	 * under-run
2943	 */
2944	alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x80);
2945#endif
2946	alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2947
2948	alc_pre_init(codec);
2949
2950	snd_hda_pick_fixup(codec, alc262_fixup_models, alc262_fixup_tbl,
2951		       alc262_fixups);
2952	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2953
2954	alc_auto_parse_customize_define(codec);
2955
2956	if (has_cdefine_beep(codec))
2957		spec->gen.beep_nid = 0x01;
2958
2959	/* automatic parse from the BIOS config */
2960	err = alc262_parse_auto_config(codec);
2961	if (err < 0)
2962		goto error;
2963
2964	if (!spec->gen.no_analog && spec->gen.beep_nid) {
2965		err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2966		if (err < 0)
2967			goto error;
2968	}
2969
2970	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2971
2972	return 0;
2973
2974 error:
2975	alc_free(codec);
2976	return err;
2977}
2978
2979/*
2980 *  ALC268
2981 */
2982/* bind Beep switches of both NID 0x0f and 0x10 */
2983static int alc268_beep_switch_put(struct snd_kcontrol *kcontrol,
2984				  struct snd_ctl_elem_value *ucontrol)
2985{
2986	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2987	unsigned long pval;
2988	int err;
2989
2990	mutex_lock(&codec->control_mutex);
2991	pval = kcontrol->private_value;
2992	kcontrol->private_value = (pval & ~0xff) | 0x0f;
2993	err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2994	if (err >= 0) {
2995		kcontrol->private_value = (pval & ~0xff) | 0x10;
2996		err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2997	}
2998	kcontrol->private_value = pval;
2999	mutex_unlock(&codec->control_mutex);
3000	return err;
3001}
3002
3003static const struct snd_kcontrol_new alc268_beep_mixer[] = {
3004	HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
3005	{
3006		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3007		.name = "Beep Playback Switch",
3008		.subdevice = HDA_SUBDEV_AMP_FLAG,
3009		.info = snd_hda_mixer_amp_switch_info,
3010		.get = snd_hda_mixer_amp_switch_get,
3011		.put = alc268_beep_switch_put,
3012		.private_value = HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT)
3013	},
3014};
3015
3016/* set PCBEEP vol = 0, mute connections */
3017static const struct hda_verb alc268_beep_init_verbs[] = {
3018	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3019	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3020	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3021	{ }
3022};
3023
3024enum {
3025	ALC268_FIXUP_INV_DMIC,
3026	ALC268_FIXUP_HP_EAPD,
3027	ALC268_FIXUP_SPDIF,
3028};
3029
3030static const struct hda_fixup alc268_fixups[] = {
3031	[ALC268_FIXUP_INV_DMIC] = {
3032		.type = HDA_FIXUP_FUNC,
3033		.v.func = alc_fixup_inv_dmic,
3034	},
3035	[ALC268_FIXUP_HP_EAPD] = {
3036		.type = HDA_FIXUP_VERBS,
3037		.v.verbs = (const struct hda_verb[]) {
3038			{0x15, AC_VERB_SET_EAPD_BTLENABLE, 0},
3039			{}
3040		}
3041	},
3042	[ALC268_FIXUP_SPDIF] = {
3043		.type = HDA_FIXUP_PINS,
3044		.v.pins = (const struct hda_pintbl[]) {
3045			{ 0x1e, 0x014b1180 }, /* enable SPDIF out */
3046			{}
3047		}
3048	},
3049};
3050
3051static const struct hda_model_fixup alc268_fixup_models[] = {
3052	{.id = ALC268_FIXUP_INV_DMIC, .name = "inv-dmic"},
3053	{.id = ALC268_FIXUP_HP_EAPD, .name = "hp-eapd"},
3054	{.id = ALC268_FIXUP_SPDIF, .name = "spdif"},
3055	{}
3056};
3057
3058static const struct snd_pci_quirk alc268_fixup_tbl[] = {
3059	SND_PCI_QUIRK(0x1025, 0x0139, "Acer TravelMate 6293", ALC268_FIXUP_SPDIF),
3060	SND_PCI_QUIRK(0x1025, 0x015b, "Acer AOA 150 (ZG5)", ALC268_FIXUP_INV_DMIC),
3061	/* below is codec SSID since multiple Toshiba laptops have the
3062	 * same PCI SSID 1179:ff00
3063	 */
3064	SND_PCI_QUIRK(0x1179, 0xff06, "Toshiba P200", ALC268_FIXUP_HP_EAPD),
3065	{}
3066};
3067
3068/*
3069 * BIOS auto configuration
3070 */
3071static int alc268_parse_auto_config(struct hda_codec *codec)
3072{
3073	static const hda_nid_t alc268_ssids[] = { 0x15, 0x1b, 0x14, 0 };
3074	return alc_parse_auto_config(codec, NULL, alc268_ssids);
3075}
3076
3077/*
3078 */
3079static int patch_alc268(struct hda_codec *codec)
3080{
3081	struct alc_spec *spec;
3082	int i, err;
3083
3084	/* ALC268 has no aa-loopback mixer */
3085	err = alc_alloc_spec(codec, 0);
3086	if (err < 0)
3087		return err;
3088
3089	spec = codec->spec;
3090	if (has_cdefine_beep(codec))
3091		spec->gen.beep_nid = 0x01;
3092
3093	spec->shutup = alc_eapd_shutup;
3094
3095	alc_pre_init(codec);
3096
3097	snd_hda_pick_fixup(codec, alc268_fixup_models, alc268_fixup_tbl, alc268_fixups);
3098	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
3099
3100	/* automatic parse from the BIOS config */
3101	err = alc268_parse_auto_config(codec);
3102	if (err < 0)
3103		goto error;
3104
3105	if (err > 0 && !spec->gen.no_analog &&
3106	    spec->gen.autocfg.speaker_pins[0] != 0x1d) {
3107		for (i = 0; i < ARRAY_SIZE(alc268_beep_mixer); i++) {
3108			if (!snd_hda_gen_add_kctl(&spec->gen, NULL,
3109						  &alc268_beep_mixer[i])) {
3110				err = -ENOMEM;
3111				goto error;
3112			}
3113		}
3114		snd_hda_add_verbs(codec, alc268_beep_init_verbs);
3115		if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
3116			/* override the amp caps for beep generator */
3117			snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
3118					  (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
3119					  (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
3120					  (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
3121					  (0 << AC_AMPCAP_MUTE_SHIFT));
3122	}
3123
3124	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
3125
3126	return 0;
3127
3128 error:
3129	alc_free(codec);
3130	return err;
3131}
3132
3133/*
3134 * ALC269
3135 */
3136
3137static const struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
3138	.rates = SNDRV_PCM_RATE_44100, /* fixed rate */
3139};
3140
3141static const struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
3142	.rates = SNDRV_PCM_RATE_44100, /* fixed rate */
3143};
3144
3145/* different alc269-variants */
3146enum {
3147	ALC269_TYPE_ALC269VA,
3148	ALC269_TYPE_ALC269VB,
3149	ALC269_TYPE_ALC269VC,
3150	ALC269_TYPE_ALC269VD,
3151	ALC269_TYPE_ALC280,
3152	ALC269_TYPE_ALC282,
3153	ALC269_TYPE_ALC283,
3154	ALC269_TYPE_ALC284,
3155	ALC269_TYPE_ALC293,
3156	ALC269_TYPE_ALC286,
3157	ALC269_TYPE_ALC298,
3158	ALC269_TYPE_ALC255,
3159	ALC269_TYPE_ALC256,
3160	ALC269_TYPE_ALC257,
3161	ALC269_TYPE_ALC215,
3162	ALC269_TYPE_ALC225,
3163	ALC269_TYPE_ALC245,
3164	ALC269_TYPE_ALC287,
3165	ALC269_TYPE_ALC294,
3166	ALC269_TYPE_ALC300,
3167	ALC269_TYPE_ALC623,
3168	ALC269_TYPE_ALC700,
3169};
3170
3171/*
3172 * BIOS auto configuration
3173 */
3174static int alc269_parse_auto_config(struct hda_codec *codec)
3175{
3176	static const hda_nid_t alc269_ignore[] = { 0x1d, 0 };
3177	static const hda_nid_t alc269_ssids[] = { 0, 0x1b, 0x14, 0x21 };
3178	static const hda_nid_t alc269va_ssids[] = { 0x15, 0x1b, 0x14, 0 };
3179	struct alc_spec *spec = codec->spec;
3180	const hda_nid_t *ssids;
3181
3182	switch (spec->codec_variant) {
3183	case ALC269_TYPE_ALC269VA:
3184	case ALC269_TYPE_ALC269VC:
3185	case ALC269_TYPE_ALC280:
3186	case ALC269_TYPE_ALC284:
3187	case ALC269_TYPE_ALC293:
3188		ssids = alc269va_ssids;
3189		break;
3190	case ALC269_TYPE_ALC269VB:
3191	case ALC269_TYPE_ALC269VD:
3192	case ALC269_TYPE_ALC282:
3193	case ALC269_TYPE_ALC283:
3194	case ALC269_TYPE_ALC286:
3195	case ALC269_TYPE_ALC298:
3196	case ALC269_TYPE_ALC255:
3197	case ALC269_TYPE_ALC256:
3198	case ALC269_TYPE_ALC257:
3199	case ALC269_TYPE_ALC215:
3200	case ALC269_TYPE_ALC225:
3201	case ALC269_TYPE_ALC245:
3202	case ALC269_TYPE_ALC287:
3203	case ALC269_TYPE_ALC294:
3204	case ALC269_TYPE_ALC300:
3205	case ALC269_TYPE_ALC623:
3206	case ALC269_TYPE_ALC700:
3207		ssids = alc269_ssids;
3208		break;
3209	default:
3210		ssids = alc269_ssids;
3211		break;
3212	}
3213
3214	return alc_parse_auto_config(codec, alc269_ignore, ssids);
3215}
3216
3217static const struct hda_jack_keymap alc_headset_btn_keymap[] = {
3218	{ SND_JACK_BTN_0, KEY_PLAYPAUSE },
3219	{ SND_JACK_BTN_1, KEY_VOICECOMMAND },
3220	{ SND_JACK_BTN_2, KEY_VOLUMEUP },
3221	{ SND_JACK_BTN_3, KEY_VOLUMEDOWN },
3222	{}
3223};
3224
3225static void alc_headset_btn_callback(struct hda_codec *codec,
3226				     struct hda_jack_callback *jack)
3227{
3228	int report = 0;
3229
3230	if (jack->unsol_res & (7 << 13))
3231		report |= SND_JACK_BTN_0;
3232
3233	if (jack->unsol_res  & (1 << 16 | 3 << 8))
3234		report |= SND_JACK_BTN_1;
3235
3236	/* Volume up key */
3237	if (jack->unsol_res & (7 << 23))
3238		report |= SND_JACK_BTN_2;
3239
3240	/* Volume down key */
3241	if (jack->unsol_res & (7 << 10))
3242		report |= SND_JACK_BTN_3;
3243
3244	snd_hda_jack_set_button_state(codec, jack->nid, report);
3245}
3246
3247static void alc_disable_headset_jack_key(struct hda_codec *codec)
3248{
3249	struct alc_spec *spec = codec->spec;
3250
3251	if (!spec->has_hs_key)
3252		return;
3253
3254	switch (codec->core.vendor_id) {
3255	case 0x10ec0215:
3256	case 0x10ec0225:
3257	case 0x10ec0285:
3258	case 0x10ec0287:
3259	case 0x10ec0295:
3260	case 0x10ec0289:
3261	case 0x10ec0299:
3262		alc_write_coef_idx(codec, 0x48, 0x0);
3263		alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3264		alc_update_coef_idx(codec, 0x44, 0x0045 << 8, 0x0);
3265		break;
3266	case 0x10ec0230:
3267	case 0x10ec0236:
3268	case 0x10ec0256:
3269	case 0x10ec0257:
3270	case 0x19e58326:
3271		alc_write_coef_idx(codec, 0x48, 0x0);
3272		alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3273		break;
3274	}
3275}
3276
3277static void alc_enable_headset_jack_key(struct hda_codec *codec)
3278{
3279	struct alc_spec *spec = codec->spec;
3280
3281	if (!spec->has_hs_key)
3282		return;
3283
3284	switch (codec->core.vendor_id) {
3285	case 0x10ec0215:
3286	case 0x10ec0225:
3287	case 0x10ec0285:
3288	case 0x10ec0287:
3289	case 0x10ec0295:
3290	case 0x10ec0289:
3291	case 0x10ec0299:
3292		alc_write_coef_idx(codec, 0x48, 0xd011);
3293		alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3294		alc_update_coef_idx(codec, 0x44, 0x007f << 8, 0x0045 << 8);
3295		break;
3296	case 0x10ec0230:
3297	case 0x10ec0236:
3298	case 0x10ec0256:
3299	case 0x10ec0257:
3300	case 0x19e58326:
3301		alc_write_coef_idx(codec, 0x48, 0xd011);
3302		alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3303		break;
3304	}
3305}
3306
3307static void alc_fixup_headset_jack(struct hda_codec *codec,
3308				    const struct hda_fixup *fix, int action)
3309{
3310	struct alc_spec *spec = codec->spec;
3311	hda_nid_t hp_pin;
3312
3313	switch (action) {
3314	case HDA_FIXUP_ACT_PRE_PROBE:
3315		spec->has_hs_key = 1;
3316		snd_hda_jack_detect_enable_callback(codec, 0x55,
3317						    alc_headset_btn_callback);
3318		break;
3319	case HDA_FIXUP_ACT_BUILD:
3320		hp_pin = alc_get_hp_pin(spec);
3321		if (!hp_pin || snd_hda_jack_bind_keymap(codec, 0x55,
3322							alc_headset_btn_keymap,
3323							hp_pin))
3324			snd_hda_jack_add_kctl(codec, 0x55, "Headset Jack",
3325					      false, SND_JACK_HEADSET,
3326					      alc_headset_btn_keymap);
3327
3328		alc_enable_headset_jack_key(codec);
3329		break;
3330	}
3331}
3332
3333static void alc269vb_toggle_power_output(struct hda_codec *codec, int power_up)
3334{
3335	alc_update_coef_idx(codec, 0x04, 1 << 11, power_up ? (1 << 11) : 0);
3336}
3337
3338static void alc269_shutup(struct hda_codec *codec)
3339{
3340	struct alc_spec *spec = codec->spec;
3341
3342	if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3343		alc269vb_toggle_power_output(codec, 0);
3344	if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
3345			(alc_get_coef0(codec) & 0x00ff) == 0x018) {
3346		msleep(150);
3347	}
3348	alc_shutup_pins(codec);
3349}
3350
3351static const struct coef_fw alc282_coefs[] = {
3352	WRITE_COEF(0x03, 0x0002), /* Power Down Control */
3353	UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
3354	WRITE_COEF(0x07, 0x0200), /* DMIC control */
3355	UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
3356	UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
3357	WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
3358	WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
3359	WRITE_COEF(0x0e, 0x6e00), /* LDO1/2/3, DAC/ADC */
3360	UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
3361	UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
3362	WRITE_COEF(0x6f, 0x0), /* Class D test 4 */
3363	UPDATE_COEF(0x0c, 0xfe00, 0), /* IO power down directly */
3364	WRITE_COEF(0x34, 0xa0c0), /* ANC */
3365	UPDATE_COEF(0x16, 0x0008, 0), /* AGC MUX */
3366	UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
3367	UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
3368	WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
3369	WRITE_COEF(0x63, 0x2902), /* PLL */
3370	WRITE_COEF(0x68, 0xa080), /* capless control 2 */
3371	WRITE_COEF(0x69, 0x3400), /* capless control 3 */
3372	WRITE_COEF(0x6a, 0x2f3e), /* capless control 4 */
3373	WRITE_COEF(0x6b, 0x0), /* capless control 5 */
3374	UPDATE_COEF(0x6d, 0x0fff, 0x0900), /* class D test 2 */
3375	WRITE_COEF(0x6e, 0x110a), /* class D test 3 */
3376	UPDATE_COEF(0x70, 0x00f8, 0x00d8), /* class D test 5 */
3377	WRITE_COEF(0x71, 0x0014), /* class D test 6 */
3378	WRITE_COEF(0x72, 0xc2ba), /* classD OCP */
3379	UPDATE_COEF(0x77, 0x0f80, 0), /* classD pure DC test */
3380	WRITE_COEF(0x6c, 0xfc06), /* Class D amp control */
3381	{}
3382};
3383
3384static void alc282_restore_default_value(struct hda_codec *codec)
3385{
3386	alc_process_coef_fw(codec, alc282_coefs);
3387}
3388
3389static void alc282_init(struct hda_codec *codec)
3390{
3391	struct alc_spec *spec = codec->spec;
3392	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3393	bool hp_pin_sense;
3394	int coef78;
3395
3396	alc282_restore_default_value(codec);
3397
3398	if (!hp_pin)
3399		return;
3400	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3401	coef78 = alc_read_coef_idx(codec, 0x78);
3402
3403	/* Index 0x78 Direct Drive HP AMP LPM Control 1 */
3404	/* Headphone capless set to high power mode */
3405	alc_write_coef_idx(codec, 0x78, 0x9004);
3406
3407	if (hp_pin_sense)
3408		msleep(2);
3409
3410	snd_hda_codec_write(codec, hp_pin, 0,
3411			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3412
3413	if (hp_pin_sense)
3414		msleep(85);
3415
3416	snd_hda_codec_write(codec, hp_pin, 0,
3417			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3418
3419	if (hp_pin_sense)
3420		msleep(100);
3421
3422	/* Headphone capless set to normal mode */
3423	alc_write_coef_idx(codec, 0x78, coef78);
3424}
3425
3426static void alc282_shutup(struct hda_codec *codec)
3427{
3428	struct alc_spec *spec = codec->spec;
3429	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3430	bool hp_pin_sense;
3431	int coef78;
3432
3433	if (!hp_pin) {
3434		alc269_shutup(codec);
3435		return;
3436	}
3437
3438	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3439	coef78 = alc_read_coef_idx(codec, 0x78);
3440	alc_write_coef_idx(codec, 0x78, 0x9004);
3441
3442	if (hp_pin_sense)
3443		msleep(2);
3444
3445	snd_hda_codec_write(codec, hp_pin, 0,
3446			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3447
3448	if (hp_pin_sense)
3449		msleep(85);
3450
3451	if (!spec->no_shutup_pins)
3452		snd_hda_codec_write(codec, hp_pin, 0,
3453				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3454
3455	if (hp_pin_sense)
3456		msleep(100);
3457
3458	alc_auto_setup_eapd(codec, false);
3459	alc_shutup_pins(codec);
3460	alc_write_coef_idx(codec, 0x78, coef78);
3461}
3462
3463static const struct coef_fw alc283_coefs[] = {
3464	WRITE_COEF(0x03, 0x0002), /* Power Down Control */
3465	UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
3466	WRITE_COEF(0x07, 0x0200), /* DMIC control */
3467	UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
3468	UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
3469	WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
3470	WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
3471	WRITE_COEF(0x0e, 0x6fc0), /* LDO1/2/3, DAC/ADC */
3472	UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
3473	UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
3474	WRITE_COEF(0x3a, 0x0), /* Class D test 4 */
3475	UPDATE_COEF(0x0c, 0xfe00, 0x0), /* IO power down directly */
3476	WRITE_COEF(0x22, 0xa0c0), /* ANC */
3477	UPDATE_COEFEX(0x53, 0x01, 0x000f, 0x0008), /* AGC MUX */
3478	UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
3479	UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
3480	WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
3481	WRITE_COEF(0x2e, 0x2902), /* PLL */
3482	WRITE_COEF(0x33, 0xa080), /* capless control 2 */
3483	WRITE_COEF(0x34, 0x3400), /* capless control 3 */
3484	WRITE_COEF(0x35, 0x2f3e), /* capless control 4 */
3485	WRITE_COEF(0x36, 0x0), /* capless control 5 */
3486	UPDATE_COEF(0x38, 0x0fff, 0x0900), /* class D test 2 */
3487	WRITE_COEF(0x39, 0x110a), /* class D test 3 */
3488	UPDATE_COEF(0x3b, 0x00f8, 0x00d8), /* class D test 5 */
3489	WRITE_COEF(0x3c, 0x0014), /* class D test 6 */
3490	WRITE_COEF(0x3d, 0xc2ba), /* classD OCP */
3491	UPDATE_COEF(0x42, 0x0f80, 0x0), /* classD pure DC test */
3492	WRITE_COEF(0x49, 0x0), /* test mode */
3493	UPDATE_COEF(0x40, 0xf800, 0x9800), /* Class D DC enable */
3494	UPDATE_COEF(0x42, 0xf000, 0x2000), /* DC offset */
3495	WRITE_COEF(0x37, 0xfc06), /* Class D amp control */
3496	UPDATE_COEF(0x1b, 0x8000, 0), /* HP JD control */
3497	{}
3498};
3499
3500static void alc283_restore_default_value(struct hda_codec *codec)
3501{
3502	alc_process_coef_fw(codec, alc283_coefs);
3503}
3504
3505static void alc283_init(struct hda_codec *codec)
3506{
3507	struct alc_spec *spec = codec->spec;
3508	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3509	bool hp_pin_sense;
3510
3511	alc283_restore_default_value(codec);
3512
3513	if (!hp_pin)
3514		return;
3515
3516	msleep(30);
3517	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3518
3519	/* Index 0x43 Direct Drive HP AMP LPM Control 1 */
3520	/* Headphone capless set to high power mode */
3521	alc_write_coef_idx(codec, 0x43, 0x9004);
3522
3523	snd_hda_codec_write(codec, hp_pin, 0,
3524			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3525
3526	if (hp_pin_sense)
3527		msleep(85);
3528
3529	snd_hda_codec_write(codec, hp_pin, 0,
3530			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3531
3532	if (hp_pin_sense)
3533		msleep(85);
3534	/* Index 0x46 Combo jack auto switch control 2 */
3535	/* 3k pull low control for Headset jack. */
3536	alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
3537	/* Headphone capless set to normal mode */
3538	alc_write_coef_idx(codec, 0x43, 0x9614);
3539}
3540
3541static void alc283_shutup(struct hda_codec *codec)
3542{
3543	struct alc_spec *spec = codec->spec;
3544	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3545	bool hp_pin_sense;
3546
3547	if (!hp_pin) {
3548		alc269_shutup(codec);
3549		return;
3550	}
3551
3552	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3553
3554	alc_write_coef_idx(codec, 0x43, 0x9004);
3555
3556	/*depop hp during suspend*/
3557	alc_write_coef_idx(codec, 0x06, 0x2100);
3558
3559	snd_hda_codec_write(codec, hp_pin, 0,
3560			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3561
3562	if (hp_pin_sense)
3563		msleep(100);
3564
3565	if (!spec->no_shutup_pins)
3566		snd_hda_codec_write(codec, hp_pin, 0,
3567				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3568
3569	alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
3570
3571	if (hp_pin_sense)
3572		msleep(100);
3573	alc_auto_setup_eapd(codec, false);
3574	alc_shutup_pins(codec);
3575	alc_write_coef_idx(codec, 0x43, 0x9614);
3576}
3577
3578static void alc256_init(struct hda_codec *codec)
3579{
3580	struct alc_spec *spec = codec->spec;
3581	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3582	bool hp_pin_sense;
3583
3584	if (spec->ultra_low_power) {
3585		alc_update_coef_idx(codec, 0x03, 1<<1, 1<<1);
3586		alc_update_coef_idx(codec, 0x08, 3<<2, 3<<2);
3587		alc_update_coef_idx(codec, 0x08, 7<<4, 0);
3588		alc_update_coef_idx(codec, 0x3b, 1<<15, 0);
3589		alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3590		msleep(30);
3591	}
3592
3593	if (!hp_pin)
3594		hp_pin = 0x21;
3595
3596	msleep(30);
3597
3598	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3599
3600	if (hp_pin_sense)
3601		msleep(2);
3602
3603	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
3604
3605	snd_hda_codec_write(codec, hp_pin, 0,
3606			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3607
3608	if (hp_pin_sense || spec->ultra_low_power)
3609		msleep(85);
3610
3611	snd_hda_codec_write(codec, hp_pin, 0,
3612			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3613
3614	if (hp_pin_sense || spec->ultra_low_power)
3615		msleep(100);
3616
3617	alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
3618	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
3619	alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15); /* Clear bit */
3620	alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15);
3621	/*
3622	 * Expose headphone mic (or possibly Line In on some machines) instead
3623	 * of PC Beep on 1Ah, and disable 1Ah loopback for all outputs. See
3624	 * Documentation/sound/hd-audio/realtek-pc-beep.rst for details of
3625	 * this register.
3626	 */
3627	alc_write_coef_idx(codec, 0x36, 0x5757);
3628}
3629
3630static void alc256_shutup(struct hda_codec *codec)
3631{
3632	struct alc_spec *spec = codec->spec;
3633	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3634	bool hp_pin_sense;
3635
3636	if (!hp_pin)
3637		hp_pin = 0x21;
3638
3639	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
3640	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3641
3642	if (hp_pin_sense)
3643		msleep(2);
3644
3645	snd_hda_codec_write(codec, hp_pin, 0,
3646			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3647
3648	if (hp_pin_sense || spec->ultra_low_power)
3649		msleep(85);
3650
3651	/* 3k pull low control for Headset jack. */
3652	/* NOTE: call this before clearing the pin, otherwise codec stalls */
3653	/* If disable 3k pulldown control for alc257, the Mic detection will not work correctly
3654	 * when booting with headset plugged. So skip setting it for the codec alc257
3655	 */
3656	if (spec->en_3kpull_low)
3657		alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
3658
3659	if (!spec->no_shutup_pins)
3660		snd_hda_codec_write(codec, hp_pin, 0,
3661				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3662
3663	if (hp_pin_sense || spec->ultra_low_power)
3664		msleep(100);
3665
3666	alc_auto_setup_eapd(codec, false);
3667	alc_shutup_pins(codec);
3668	if (spec->ultra_low_power) {
3669		msleep(50);
3670		alc_update_coef_idx(codec, 0x03, 1<<1, 0);
3671		alc_update_coef_idx(codec, 0x08, 7<<4, 7<<4);
3672		alc_update_coef_idx(codec, 0x08, 3<<2, 0);
3673		alc_update_coef_idx(codec, 0x3b, 1<<15, 1<<15);
3674		alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3675		msleep(30);
3676	}
3677}
3678
3679static void alc285_hp_init(struct hda_codec *codec)
3680{
3681	struct alc_spec *spec = codec->spec;
3682	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3683	int i, val;
3684	int coef38, coef0d, coef36;
3685
3686	alc_write_coefex_idx(codec, 0x58, 0x00, 0x1888); /* write default value */
3687	alc_update_coef_idx(codec, 0x4a, 1<<15, 1<<15); /* Reset HP JD */
3688	coef38 = alc_read_coef_idx(codec, 0x38); /* Amp control */
3689	coef0d = alc_read_coef_idx(codec, 0x0d); /* Digital Misc control */
3690	coef36 = alc_read_coef_idx(codec, 0x36); /* Passthrough Control */
3691	alc_update_coef_idx(codec, 0x38, 1<<4, 0x0);
3692	alc_update_coef_idx(codec, 0x0d, 0x110, 0x0);
3693
3694	alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
3695
3696	if (hp_pin)
3697		snd_hda_codec_write(codec, hp_pin, 0,
3698			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3699
3700	msleep(130);
3701	alc_update_coef_idx(codec, 0x36, 1<<14, 1<<14);
3702	alc_update_coef_idx(codec, 0x36, 1<<13, 0x0);
3703
3704	if (hp_pin)
3705		snd_hda_codec_write(codec, hp_pin, 0,
3706			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3707	msleep(10);
3708	alc_write_coef_idx(codec, 0x67, 0x0); /* Set HP depop to manual mode */
3709	alc_write_coefex_idx(codec, 0x58, 0x00, 0x7880);
3710	alc_write_coefex_idx(codec, 0x58, 0x0f, 0xf049);
3711	alc_update_coefex_idx(codec, 0x58, 0x03, 0x00f0, 0x00c0);
3712
3713	alc_write_coefex_idx(codec, 0x58, 0x00, 0xf888); /* HP depop procedure start */
3714	val = alc_read_coefex_idx(codec, 0x58, 0x00);
3715	for (i = 0; i < 20 && val & 0x8000; i++) {
3716		msleep(50);
3717		val = alc_read_coefex_idx(codec, 0x58, 0x00);
3718	} /* Wait for depop procedure finish  */
3719
3720	alc_write_coefex_idx(codec, 0x58, 0x00, val); /* write back the result */
3721	alc_update_coef_idx(codec, 0x38, 1<<4, coef38);
3722	alc_update_coef_idx(codec, 0x0d, 0x110, coef0d);
3723	alc_update_coef_idx(codec, 0x36, 3<<13, coef36);
3724
3725	msleep(50);
3726	alc_update_coef_idx(codec, 0x4a, 1<<15, 0);
3727}
3728
3729static void alc225_init(struct hda_codec *codec)
3730{
3731	struct alc_spec *spec = codec->spec;
3732	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3733	bool hp1_pin_sense, hp2_pin_sense;
3734
3735	if (spec->ultra_low_power) {
3736		alc_update_coef_idx(codec, 0x08, 0x0f << 2, 3<<2);
3737		alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3738		alc_update_coef_idx(codec, 0x33, 1<<11, 0);
3739		msleep(30);
3740	}
3741
3742	if (spec->codec_variant != ALC269_TYPE_ALC287 &&
3743		spec->codec_variant != ALC269_TYPE_ALC245)
3744		/* required only at boot or S3 and S4 resume time */
3745		if (!spec->done_hp_init ||
3746			is_s3_resume(codec) ||
3747			is_s4_resume(codec)) {
3748			alc285_hp_init(codec);
3749			spec->done_hp_init = true;
3750		}
3751
3752	if (!hp_pin)
3753		hp_pin = 0x21;
3754	msleep(30);
3755
3756	hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3757	hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3758
3759	if (hp1_pin_sense || hp2_pin_sense)
3760		msleep(2);
3761
3762	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
3763
3764	if (hp1_pin_sense || spec->ultra_low_power)
3765		snd_hda_codec_write(codec, hp_pin, 0,
3766			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3767	if (hp2_pin_sense)
3768		snd_hda_codec_write(codec, 0x16, 0,
3769			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3770
3771	if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3772		msleep(85);
3773
3774	if (hp1_pin_sense || spec->ultra_low_power)
3775		snd_hda_codec_write(codec, hp_pin, 0,
3776			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3777	if (hp2_pin_sense)
3778		snd_hda_codec_write(codec, 0x16, 0,
3779			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3780
3781	if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3782		msleep(100);
3783
3784	alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3785	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
3786}
3787
3788static void alc225_shutup(struct hda_codec *codec)
3789{
3790	struct alc_spec *spec = codec->spec;
3791	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3792	bool hp1_pin_sense, hp2_pin_sense;
3793
3794	if (!hp_pin)
3795		hp_pin = 0x21;
3796
3797	alc_disable_headset_jack_key(codec);
3798	/* 3k pull low control for Headset jack. */
3799	alc_update_coef_idx(codec, 0x4a, 0, 3 << 10);
3800
3801	hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3802	hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3803
3804	if (hp1_pin_sense || hp2_pin_sense)
3805		msleep(2);
3806
3807	if (hp1_pin_sense || spec->ultra_low_power)
3808		snd_hda_codec_write(codec, hp_pin, 0,
3809			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3810	if (hp2_pin_sense)
3811		snd_hda_codec_write(codec, 0x16, 0,
3812			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3813
3814	if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3815		msleep(85);
3816
3817	if (hp1_pin_sense || spec->ultra_low_power)
3818		snd_hda_codec_write(codec, hp_pin, 0,
3819			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3820	if (hp2_pin_sense)
3821		snd_hda_codec_write(codec, 0x16, 0,
3822			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3823
3824	if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3825		msleep(100);
3826
3827	alc_auto_setup_eapd(codec, false);
3828	alc_shutup_pins(codec);
3829	if (spec->ultra_low_power) {
3830		msleep(50);
3831		alc_update_coef_idx(codec, 0x08, 0x0f << 2, 0x0c << 2);
3832		alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3833		alc_update_coef_idx(codec, 0x33, 1<<11, 1<<11);
3834		alc_update_coef_idx(codec, 0x4a, 3<<4, 2<<4);
3835		msleep(30);
3836	}
3837
3838	alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3839	alc_enable_headset_jack_key(codec);
3840}
3841
3842static void alc_default_init(struct hda_codec *codec)
3843{
3844	struct alc_spec *spec = codec->spec;
3845	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3846	bool hp_pin_sense;
3847
3848	if (!hp_pin)
3849		return;
3850
3851	msleep(30);
3852
3853	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3854
3855	if (hp_pin_sense)
3856		msleep(2);
3857
3858	snd_hda_codec_write(codec, hp_pin, 0,
3859			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3860
3861	if (hp_pin_sense)
3862		msleep(85);
3863
3864	snd_hda_codec_write(codec, hp_pin, 0,
3865			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3866
3867	if (hp_pin_sense)
3868		msleep(100);
3869}
3870
3871static void alc_default_shutup(struct hda_codec *codec)
3872{
3873	struct alc_spec *spec = codec->spec;
3874	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3875	bool hp_pin_sense;
3876
3877	if (!hp_pin) {
3878		alc269_shutup(codec);
3879		return;
3880	}
3881
3882	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3883
3884	if (hp_pin_sense)
3885		msleep(2);
3886
3887	snd_hda_codec_write(codec, hp_pin, 0,
3888			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3889
3890	if (hp_pin_sense)
3891		msleep(85);
3892
3893	if (!spec->no_shutup_pins)
3894		snd_hda_codec_write(codec, hp_pin, 0,
3895				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3896
3897	if (hp_pin_sense)
3898		msleep(100);
3899
3900	alc_auto_setup_eapd(codec, false);
3901	alc_shutup_pins(codec);
3902}
3903
3904static void alc294_hp_init(struct hda_codec *codec)
3905{
3906	struct alc_spec *spec = codec->spec;
3907	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3908	int i, val;
3909
3910	if (!hp_pin)
3911		return;
3912
3913	snd_hda_codec_write(codec, hp_pin, 0,
3914			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3915
3916	msleep(100);
3917
3918	if (!spec->no_shutup_pins)
3919		snd_hda_codec_write(codec, hp_pin, 0,
3920				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3921
3922	alc_update_coef_idx(codec, 0x6f, 0x000f, 0);/* Set HP depop to manual mode */
3923	alc_update_coefex_idx(codec, 0x58, 0x00, 0x8000, 0x8000); /* HP depop procedure start */
3924
3925	/* Wait for depop procedure finish  */
3926	val = alc_read_coefex_idx(codec, 0x58, 0x01);
3927	for (i = 0; i < 20 && val & 0x0080; i++) {
3928		msleep(50);
3929		val = alc_read_coefex_idx(codec, 0x58, 0x01);
3930	}
3931	/* Set HP depop to auto mode */
3932	alc_update_coef_idx(codec, 0x6f, 0x000f, 0x000b);
3933	msleep(50);
3934}
3935
3936static void alc294_init(struct hda_codec *codec)
3937{
3938	struct alc_spec *spec = codec->spec;
3939
3940	/* required only at boot or S4 resume time */
3941	if (!spec->done_hp_init ||
3942	    codec->core.dev.power.power_state.event == PM_EVENT_RESTORE) {
3943		alc294_hp_init(codec);
3944		spec->done_hp_init = true;
3945	}
3946	alc_default_init(codec);
3947}
3948
3949static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg,
3950			     unsigned int val)
3951{
3952	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3953	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val & 0xffff); /* LSB */
3954	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val >> 16); /* MSB */
3955}
3956
3957static int alc5505_coef_get(struct hda_codec *codec, unsigned int index_reg)
3958{
3959	unsigned int val;
3960
3961	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3962	val = snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3963		& 0xffff;
3964	val |= snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3965		<< 16;
3966	return val;
3967}
3968
3969static void alc5505_dsp_halt(struct hda_codec *codec)
3970{
3971	unsigned int val;
3972
3973	alc5505_coef_set(codec, 0x3000, 0x000c); /* DSP CPU stop */
3974	alc5505_coef_set(codec, 0x880c, 0x0008); /* DDR enter self refresh */
3975	alc5505_coef_set(codec, 0x61c0, 0x11110080); /* Clock control for PLL and CPU */
3976	alc5505_coef_set(codec, 0x6230, 0xfc0d4011); /* Disable Input OP */
3977	alc5505_coef_set(codec, 0x61b4, 0x040a2b03); /* Stop PLL2 */
3978	alc5505_coef_set(codec, 0x61b0, 0x00005b17); /* Stop PLL1 */
3979	alc5505_coef_set(codec, 0x61b8, 0x04133303); /* Stop PLL3 */
3980	val = alc5505_coef_get(codec, 0x6220);
3981	alc5505_coef_set(codec, 0x6220, (val | 0x3000)); /* switch Ringbuffer clock to DBUS clock */
3982}
3983
3984static void alc5505_dsp_back_from_halt(struct hda_codec *codec)
3985{
3986	alc5505_coef_set(codec, 0x61b8, 0x04133302);
3987	alc5505_coef_set(codec, 0x61b0, 0x00005b16);
3988	alc5505_coef_set(codec, 0x61b4, 0x040a2b02);
3989	alc5505_coef_set(codec, 0x6230, 0xf80d4011);
3990	alc5505_coef_set(codec, 0x6220, 0x2002010f);
3991	alc5505_coef_set(codec, 0x880c, 0x00000004);
3992}
3993
3994static void alc5505_dsp_init(struct hda_codec *codec)
3995{
3996	unsigned int val;
3997
3998	alc5505_dsp_halt(codec);
3999	alc5505_dsp_back_from_halt(codec);
4000	alc5505_coef_set(codec, 0x61b0, 0x5b14); /* PLL1 control */
4001	alc5505_coef_set(codec, 0x61b0, 0x5b16);
4002	alc5505_coef_set(codec, 0x61b4, 0x04132b00); /* PLL2 control */
4003	alc5505_coef_set(codec, 0x61b4, 0x04132b02);
4004	alc5505_coef_set(codec, 0x61b8, 0x041f3300); /* PLL3 control*/
4005	alc5505_coef_set(codec, 0x61b8, 0x041f3302);
4006	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_CODEC_RESET, 0); /* Function reset */
4007	alc5505_coef_set(codec, 0x61b8, 0x041b3302);
4008	alc5505_coef_set(codec, 0x61b8, 0x04173302);
4009	alc5505_coef_set(codec, 0x61b8, 0x04163302);
4010	alc5505_coef_set(codec, 0x8800, 0x348b328b); /* DRAM control */
4011	alc5505_coef_set(codec, 0x8808, 0x00020022); /* DRAM control */
4012	alc5505_coef_set(codec, 0x8818, 0x00000400); /* DRAM control */
4013
4014	val = alc5505_coef_get(codec, 0x6200) >> 16; /* Read revision ID */
4015	if (val <= 3)
4016		alc5505_coef_set(codec, 0x6220, 0x2002010f); /* I/O PAD Configuration */
4017	else
4018		alc5505_coef_set(codec, 0x6220, 0x6002018f);
4019
4020	alc5505_coef_set(codec, 0x61ac, 0x055525f0); /**/
4021	alc5505_coef_set(codec, 0x61c0, 0x12230080); /* Clock control */
4022	alc5505_coef_set(codec, 0x61b4, 0x040e2b02); /* PLL2 control */
4023	alc5505_coef_set(codec, 0x61bc, 0x010234f8); /* OSC Control */
4024	alc5505_coef_set(codec, 0x880c, 0x00000004); /* DRAM Function control */
4025	alc5505_coef_set(codec, 0x880c, 0x00000003);
4026	alc5505_coef_set(codec, 0x880c, 0x00000010);
4027
4028#ifdef HALT_REALTEK_ALC5505
4029	alc5505_dsp_halt(codec);
4030#endif
4031}
4032
4033#ifdef HALT_REALTEK_ALC5505
4034#define alc5505_dsp_suspend(codec)	do { } while (0) /* NOP */
4035#define alc5505_dsp_resume(codec)	do { } while (0) /* NOP */
4036#else
4037#define alc5505_dsp_suspend(codec)	alc5505_dsp_halt(codec)
4038#define alc5505_dsp_resume(codec)	alc5505_dsp_back_from_halt(codec)
4039#endif
4040
4041#ifdef CONFIG_PM
4042static int alc269_suspend(struct hda_codec *codec)
4043{
4044	struct alc_spec *spec = codec->spec;
4045
4046	if (spec->has_alc5505_dsp)
4047		alc5505_dsp_suspend(codec);
4048
4049	return alc_suspend(codec);
4050}
4051
4052static int alc269_resume(struct hda_codec *codec)
4053{
4054	struct alc_spec *spec = codec->spec;
4055
4056	if (spec->codec_variant == ALC269_TYPE_ALC269VB)
4057		alc269vb_toggle_power_output(codec, 0);
4058	if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
4059			(alc_get_coef0(codec) & 0x00ff) == 0x018) {
4060		msleep(150);
4061	}
4062
4063	codec->patch_ops.init(codec);
4064
4065	if (spec->codec_variant == ALC269_TYPE_ALC269VB)
4066		alc269vb_toggle_power_output(codec, 1);
4067	if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
4068			(alc_get_coef0(codec) & 0x00ff) == 0x017) {
4069		msleep(200);
4070	}
4071
4072	snd_hda_regmap_sync(codec);
4073	hda_call_check_power_status(codec, 0x01);
4074
4075	/* on some machine, the BIOS will clear the codec gpio data when enter
4076	 * suspend, and won't restore the data after resume, so we restore it
4077	 * in the driver.
4078	 */
4079	if (spec->gpio_data)
4080		alc_write_gpio_data(codec);
4081
4082	if (spec->has_alc5505_dsp)
4083		alc5505_dsp_resume(codec);
4084
4085	return 0;
4086}
4087#endif /* CONFIG_PM */
4088
4089static void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec,
4090						 const struct hda_fixup *fix, int action)
4091{
4092	struct alc_spec *spec = codec->spec;
4093
4094	if (action == HDA_FIXUP_ACT_PRE_PROBE)
4095		spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
4096}
4097
4098static void alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec *codec,
4099						 const struct hda_fixup *fix,
4100						 int action)
4101{
4102	unsigned int cfg_headphone = snd_hda_codec_get_pincfg(codec, 0x21);
4103	unsigned int cfg_headset_mic = snd_hda_codec_get_pincfg(codec, 0x19);
4104
4105	if (cfg_headphone && cfg_headset_mic == 0x411111f0)
4106		snd_hda_codec_set_pincfg(codec, 0x19,
4107			(cfg_headphone & ~AC_DEFCFG_DEVICE) |
4108			(AC_JACK_MIC_IN << AC_DEFCFG_DEVICE_SHIFT));
4109}
4110
4111static void alc269_fixup_hweq(struct hda_codec *codec,
4112			       const struct hda_fixup *fix, int action)
4113{
4114	if (action == HDA_FIXUP_ACT_INIT)
4115		alc_update_coef_idx(codec, 0x1e, 0, 0x80);
4116}
4117
4118static void alc269_fixup_headset_mic(struct hda_codec *codec,
4119				       const struct hda_fixup *fix, int action)
4120{
4121	struct alc_spec *spec = codec->spec;
4122
4123	if (action == HDA_FIXUP_ACT_PRE_PROBE)
4124		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
4125}
4126
4127static void alc271_fixup_dmic(struct hda_codec *codec,
4128			      const struct hda_fixup *fix, int action)
4129{
4130	static const struct hda_verb verbs[] = {
4131		{0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
4132		{0x20, AC_VERB_SET_PROC_COEF, 0x4000},
4133		{}
4134	};
4135	unsigned int cfg;
4136
4137	if (strcmp(codec->core.chip_name, "ALC271X") &&
4138	    strcmp(codec->core.chip_name, "ALC269VB"))
4139		return;
4140	cfg = snd_hda_codec_get_pincfg(codec, 0x12);
4141	if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED)
4142		snd_hda_sequence_write(codec, verbs);
4143}
4144
4145/* Fix the speaker amp after resume, etc */
4146static void alc269vb_fixup_aspire_e1_coef(struct hda_codec *codec,
4147					  const struct hda_fixup *fix,
4148					  int action)
4149{
4150	if (action == HDA_FIXUP_ACT_INIT)
4151		alc_update_coef_idx(codec, 0x0d, 0x6000, 0x6000);
4152}
4153
4154static void alc269_fixup_pcm_44k(struct hda_codec *codec,
4155				 const struct hda_fixup *fix, int action)
4156{
4157	struct alc_spec *spec = codec->spec;
4158
4159	if (action != HDA_FIXUP_ACT_PROBE)
4160		return;
4161
4162	/* Due to a hardware problem on Lenovo Ideadpad, we need to
4163	 * fix the sample rate of analog I/O to 44.1kHz
4164	 */
4165	spec->gen.stream_analog_playback = &alc269_44k_pcm_analog_playback;
4166	spec->gen.stream_analog_capture = &alc269_44k_pcm_analog_capture;
4167}
4168
4169static void alc269_fixup_stereo_dmic(struct hda_codec *codec,
4170				     const struct hda_fixup *fix, int action)
4171{
4172	/* The digital-mic unit sends PDM (differential signal) instead of
4173	 * the standard PCM, thus you can't record a valid mono stream as is.
4174	 * Below is a workaround specific to ALC269 to control the dmic
4175	 * signal source as mono.
4176	 */
4177	if (action == HDA_FIXUP_ACT_INIT)
4178		alc_update_coef_idx(codec, 0x07, 0, 0x80);
4179}
4180
4181static void alc269_quanta_automute(struct hda_codec *codec)
4182{
4183	snd_hda_gen_update_outputs(codec);
4184
4185	alc_write_coef_idx(codec, 0x0c, 0x680);
4186	alc_write_coef_idx(codec, 0x0c, 0x480);
4187}
4188
4189static void alc269_fixup_quanta_mute(struct hda_codec *codec,
4190				     const struct hda_fixup *fix, int action)
4191{
4192	struct alc_spec *spec = codec->spec;
4193	if (action != HDA_FIXUP_ACT_PROBE)
4194		return;
4195	spec->gen.automute_hook = alc269_quanta_automute;
4196}
4197
4198static void alc269_x101_hp_automute_hook(struct hda_codec *codec,
4199					 struct hda_jack_callback *jack)
4200{
4201	struct alc_spec *spec = codec->spec;
4202	int vref;
4203	msleep(200);
4204	snd_hda_gen_hp_automute(codec, jack);
4205
4206	vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
4207	msleep(100);
4208	snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4209			    vref);
4210	msleep(500);
4211	snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4212			    vref);
4213}
4214
4215/*
4216 * Magic sequence to make Huawei Matebook X right speaker working (bko#197801)
4217 */
4218struct hda_alc298_mbxinit {
4219	unsigned char value_0x23;
4220	unsigned char value_0x25;
4221};
4222
4223static void alc298_huawei_mbx_stereo_seq(struct hda_codec *codec,
4224					 const struct hda_alc298_mbxinit *initval,
4225					 bool first)
4226{
4227	snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x0);
4228	alc_write_coef_idx(codec, 0x26, 0xb000);
4229
4230	if (first)
4231		snd_hda_codec_write(codec, 0x21, 0, AC_VERB_GET_PIN_SENSE, 0x0);
4232
4233	snd_hda_codec_write(codec, 0x6, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
4234	alc_write_coef_idx(codec, 0x26, 0xf000);
4235	alc_write_coef_idx(codec, 0x23, initval->value_0x23);
4236
4237	if (initval->value_0x23 != 0x1e)
4238		alc_write_coef_idx(codec, 0x25, initval->value_0x25);
4239
4240	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
4241	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
4242}
4243
4244static void alc298_fixup_huawei_mbx_stereo(struct hda_codec *codec,
4245					   const struct hda_fixup *fix,
4246					   int action)
4247{
4248	/* Initialization magic */
4249	static const struct hda_alc298_mbxinit dac_init[] = {
4250		{0x0c, 0x00}, {0x0d, 0x00}, {0x0e, 0x00}, {0x0f, 0x00},
4251		{0x10, 0x00}, {0x1a, 0x40}, {0x1b, 0x82}, {0x1c, 0x00},
4252		{0x1d, 0x00}, {0x1e, 0x00}, {0x1f, 0x00},
4253		{0x20, 0xc2}, {0x21, 0xc8}, {0x22, 0x26}, {0x23, 0x24},
4254		{0x27, 0xff}, {0x28, 0xff}, {0x29, 0xff}, {0x2a, 0x8f},
4255		{0x2b, 0x02}, {0x2c, 0x48}, {0x2d, 0x34}, {0x2e, 0x00},
4256		{0x2f, 0x00},
4257		{0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00},
4258		{0x34, 0x00}, {0x35, 0x01}, {0x36, 0x93}, {0x37, 0x0c},
4259		{0x38, 0x00}, {0x39, 0x00}, {0x3a, 0xf8}, {0x38, 0x80},
4260		{}
4261	};
4262	const struct hda_alc298_mbxinit *seq;
4263
4264	if (action != HDA_FIXUP_ACT_INIT)
4265		return;
4266
4267	/* Start */
4268	snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x00);
4269	snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
4270	alc_write_coef_idx(codec, 0x26, 0xf000);
4271	alc_write_coef_idx(codec, 0x22, 0x31);
4272	alc_write_coef_idx(codec, 0x23, 0x0b);
4273	alc_write_coef_idx(codec, 0x25, 0x00);
4274	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
4275	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
4276
4277	for (seq = dac_init; seq->value_0x23; seq++)
4278		alc298_huawei_mbx_stereo_seq(codec, seq, seq == dac_init);
4279}
4280
4281static void alc269_fixup_x101_headset_mic(struct hda_codec *codec,
4282				     const struct hda_fixup *fix, int action)
4283{
4284	struct alc_spec *spec = codec->spec;
4285	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4286		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
4287		spec->gen.hp_automute_hook = alc269_x101_hp_automute_hook;
4288	}
4289}
4290
4291static void alc_update_vref_led(struct hda_codec *codec, hda_nid_t pin,
4292				bool polarity, bool on)
4293{
4294	unsigned int pinval;
4295
4296	if (!pin)
4297		return;
4298	if (polarity)
4299		on = !on;
4300	pinval = snd_hda_codec_get_pin_target(codec, pin);
4301	pinval &= ~AC_PINCTL_VREFEN;
4302	pinval |= on ? AC_PINCTL_VREF_80 : AC_PINCTL_VREF_HIZ;
4303	/* temporarily power up/down for setting VREF */
4304	snd_hda_power_up_pm(codec);
4305	snd_hda_set_pin_ctl_cache(codec, pin, pinval);
4306	snd_hda_power_down_pm(codec);
4307}
4308
4309/* update mute-LED according to the speaker mute state via mic VREF pin */
4310static int vref_mute_led_set(struct led_classdev *led_cdev,
4311			     enum led_brightness brightness)
4312{
4313	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4314	struct alc_spec *spec = codec->spec;
4315
4316	alc_update_vref_led(codec, spec->mute_led_nid,
4317			    spec->mute_led_polarity, brightness);
4318	return 0;
4319}
4320
4321/* Make sure the led works even in runtime suspend */
4322static unsigned int led_power_filter(struct hda_codec *codec,
4323						  hda_nid_t nid,
4324						  unsigned int power_state)
4325{
4326	struct alc_spec *spec = codec->spec;
4327
4328	if (power_state != AC_PWRST_D3 || nid == 0 ||
4329	    (nid != spec->mute_led_nid && nid != spec->cap_mute_led_nid))
4330		return power_state;
4331
4332	/* Set pin ctl again, it might have just been set to 0 */
4333	snd_hda_set_pin_ctl(codec, nid,
4334			    snd_hda_codec_get_pin_target(codec, nid));
4335
4336	return snd_hda_gen_path_power_filter(codec, nid, power_state);
4337}
4338
4339static void alc269_fixup_hp_mute_led(struct hda_codec *codec,
4340				     const struct hda_fixup *fix, int action)
4341{
4342	struct alc_spec *spec = codec->spec;
4343	const struct dmi_device *dev = NULL;
4344
4345	if (action != HDA_FIXUP_ACT_PRE_PROBE)
4346		return;
4347
4348	while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) {
4349		int pol, pin;
4350		if (sscanf(dev->name, "HP_Mute_LED_%d_%x", &pol, &pin) != 2)
4351			continue;
4352		if (pin < 0x0a || pin >= 0x10)
4353			break;
4354		spec->mute_led_polarity = pol;
4355		spec->mute_led_nid = pin - 0x0a + 0x18;
4356		snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
4357		codec->power_filter = led_power_filter;
4358		codec_dbg(codec,
4359			  "Detected mute LED for %x:%d\n", spec->mute_led_nid,
4360			   spec->mute_led_polarity);
4361		break;
4362	}
4363}
4364
4365static void alc269_fixup_hp_mute_led_micx(struct hda_codec *codec,
4366					  const struct hda_fixup *fix,
4367					  int action, hda_nid_t pin)
4368{
4369	struct alc_spec *spec = codec->spec;
4370
4371	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4372		spec->mute_led_polarity = 0;
4373		spec->mute_led_nid = pin;
4374		snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
4375		codec->power_filter = led_power_filter;
4376	}
4377}
4378
4379static void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec,
4380				const struct hda_fixup *fix, int action)
4381{
4382	alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x18);
4383}
4384
4385static void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec,
4386				const struct hda_fixup *fix, int action)
4387{
4388	alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x19);
4389}
4390
4391static void alc269_fixup_hp_mute_led_mic3(struct hda_codec *codec,
4392				const struct hda_fixup *fix, int action)
4393{
4394	alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1b);
4395}
4396
4397/* update LED status via GPIO */
4398static void alc_update_gpio_led(struct hda_codec *codec, unsigned int mask,
4399				int polarity, bool enabled)
4400{
4401	if (polarity)
4402		enabled = !enabled;
4403	alc_update_gpio_data(codec, mask, !enabled); /* muted -> LED on */
4404}
4405
4406/* turn on/off mute LED via GPIO per vmaster hook */
4407static int gpio_mute_led_set(struct led_classdev *led_cdev,
4408			     enum led_brightness brightness)
4409{
4410	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4411	struct alc_spec *spec = codec->spec;
4412
4413	alc_update_gpio_led(codec, spec->gpio_mute_led_mask,
4414			    spec->mute_led_polarity, !brightness);
4415	return 0;
4416}
4417
4418/* turn on/off mic-mute LED via GPIO per capture hook */
4419static int micmute_led_set(struct led_classdev *led_cdev,
4420			   enum led_brightness brightness)
4421{
4422	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4423	struct alc_spec *spec = codec->spec;
4424
4425	alc_update_gpio_led(codec, spec->gpio_mic_led_mask,
4426			    spec->micmute_led_polarity, !brightness);
4427	return 0;
4428}
4429
4430/* setup mute and mic-mute GPIO bits, add hooks appropriately */
4431static void alc_fixup_hp_gpio_led(struct hda_codec *codec,
4432				  int action,
4433				  unsigned int mute_mask,
4434				  unsigned int micmute_mask)
4435{
4436	struct alc_spec *spec = codec->spec;
4437
4438	alc_fixup_gpio(codec, action, mute_mask | micmute_mask);
4439
4440	if (action != HDA_FIXUP_ACT_PRE_PROBE)
4441		return;
4442	if (mute_mask) {
4443		spec->gpio_mute_led_mask = mute_mask;
4444		snd_hda_gen_add_mute_led_cdev(codec, gpio_mute_led_set);
4445	}
4446	if (micmute_mask) {
4447		spec->gpio_mic_led_mask = micmute_mask;
4448		snd_hda_gen_add_micmute_led_cdev(codec, micmute_led_set);
4449	}
4450}
4451
4452static void alc236_fixup_hp_gpio_led(struct hda_codec *codec,
4453				const struct hda_fixup *fix, int action)
4454{
4455	alc_fixup_hp_gpio_led(codec, action, 0x02, 0x01);
4456}
4457
4458static void alc269_fixup_hp_gpio_led(struct hda_codec *codec,
4459				const struct hda_fixup *fix, int action)
4460{
4461	alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
4462}
4463
4464static void alc285_fixup_hp_gpio_led(struct hda_codec *codec,
4465				const struct hda_fixup *fix, int action)
4466{
4467	alc_fixup_hp_gpio_led(codec, action, 0x04, 0x01);
4468}
4469
4470static void alc286_fixup_hp_gpio_led(struct hda_codec *codec,
4471				const struct hda_fixup *fix, int action)
4472{
4473	alc_fixup_hp_gpio_led(codec, action, 0x02, 0x20);
4474}
4475
4476static void alc287_fixup_hp_gpio_led(struct hda_codec *codec,
4477				const struct hda_fixup *fix, int action)
4478{
4479	alc_fixup_hp_gpio_led(codec, action, 0x10, 0);
4480}
4481
4482static void alc245_fixup_hp_gpio_led(struct hda_codec *codec,
4483				const struct hda_fixup *fix, int action)
4484{
4485	struct alc_spec *spec = codec->spec;
4486
4487	if (action == HDA_FIXUP_ACT_PRE_PROBE)
4488		spec->micmute_led_polarity = 1;
4489	alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
4490}
4491
4492/* turn on/off mic-mute LED per capture hook via VREF change */
4493static int vref_micmute_led_set(struct led_classdev *led_cdev,
4494				enum led_brightness brightness)
4495{
4496	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4497	struct alc_spec *spec = codec->spec;
4498
4499	alc_update_vref_led(codec, spec->cap_mute_led_nid,
4500			    spec->micmute_led_polarity, brightness);
4501	return 0;
4502}
4503
4504static void alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec,
4505				const struct hda_fixup *fix, int action)
4506{
4507	struct alc_spec *spec = codec->spec;
4508
4509	alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
4510	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4511		/* Like hp_gpio_mic1_led, but also needs GPIO4 low to
4512		 * enable headphone amp
4513		 */
4514		spec->gpio_mask |= 0x10;
4515		spec->gpio_dir |= 0x10;
4516		spec->cap_mute_led_nid = 0x18;
4517		snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4518		codec->power_filter = led_power_filter;
4519	}
4520}
4521
4522static void alc280_fixup_hp_gpio4(struct hda_codec *codec,
4523				   const struct hda_fixup *fix, int action)
4524{
4525	struct alc_spec *spec = codec->spec;
4526
4527	alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
4528	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4529		spec->cap_mute_led_nid = 0x18;
4530		snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4531		codec->power_filter = led_power_filter;
4532	}
4533}
4534
4535/* HP Spectre x360 14 model needs a unique workaround for enabling the amp;
4536 * it needs to toggle the GPIO0 once on and off at each time (bko#210633)
4537 */
4538static void alc245_fixup_hp_x360_amp(struct hda_codec *codec,
4539				     const struct hda_fixup *fix, int action)
4540{
4541	struct alc_spec *spec = codec->spec;
4542
4543	switch (action) {
4544	case HDA_FIXUP_ACT_PRE_PROBE:
4545		spec->gpio_mask |= 0x01;
4546		spec->gpio_dir |= 0x01;
4547		break;
4548	case HDA_FIXUP_ACT_INIT:
4549		/* need to toggle GPIO to enable the amp */
4550		alc_update_gpio_data(codec, 0x01, true);
4551		msleep(100);
4552		alc_update_gpio_data(codec, 0x01, false);
4553		break;
4554	}
4555}
4556
4557/* toggle GPIO2 at each time stream is started; we use PREPARE state instead */
4558static void alc274_hp_envy_pcm_hook(struct hda_pcm_stream *hinfo,
4559				    struct hda_codec *codec,
4560				    struct snd_pcm_substream *substream,
4561				    int action)
4562{
4563	switch (action) {
4564	case HDA_GEN_PCM_ACT_PREPARE:
4565		alc_update_gpio_data(codec, 0x04, true);
4566		break;
4567	case HDA_GEN_PCM_ACT_CLEANUP:
4568		alc_update_gpio_data(codec, 0x04, false);
4569		break;
4570	}
4571}
4572
4573static void alc274_fixup_hp_envy_gpio(struct hda_codec *codec,
4574				      const struct hda_fixup *fix,
4575				      int action)
4576{
4577	struct alc_spec *spec = codec->spec;
4578
4579	if (action == HDA_FIXUP_ACT_PROBE) {
4580		spec->gpio_mask |= 0x04;
4581		spec->gpio_dir |= 0x04;
4582		spec->gen.pcm_playback_hook = alc274_hp_envy_pcm_hook;
4583	}
4584}
4585
4586static void alc_update_coef_led(struct hda_codec *codec,
4587				struct alc_coef_led *led,
4588				bool polarity, bool on)
4589{
4590	if (polarity)
4591		on = !on;
4592	/* temporarily power up/down for setting COEF bit */
4593	alc_update_coef_idx(codec, led->idx, led->mask,
4594			    on ? led->on : led->off);
4595}
4596
4597/* update mute-LED according to the speaker mute state via COEF bit */
4598static int coef_mute_led_set(struct led_classdev *led_cdev,
4599			     enum led_brightness brightness)
4600{
4601	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4602	struct alc_spec *spec = codec->spec;
4603
4604	alc_update_coef_led(codec, &spec->mute_led_coef,
4605			    spec->mute_led_polarity, brightness);
4606	return 0;
4607}
4608
4609static void alc285_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4610					  const struct hda_fixup *fix,
4611					  int action)
4612{
4613	struct alc_spec *spec = codec->spec;
4614
4615	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4616		spec->mute_led_polarity = 0;
4617		spec->mute_led_coef.idx = 0x0b;
4618		spec->mute_led_coef.mask = 1 << 3;
4619		spec->mute_led_coef.on = 1 << 3;
4620		spec->mute_led_coef.off = 0;
4621		snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4622	}
4623}
4624
4625static void alc236_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4626					  const struct hda_fixup *fix,
4627					  int action)
4628{
4629	struct alc_spec *spec = codec->spec;
4630
4631	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4632		spec->mute_led_polarity = 0;
4633		spec->mute_led_coef.idx = 0x34;
4634		spec->mute_led_coef.mask = 1 << 5;
4635		spec->mute_led_coef.on = 0;
4636		spec->mute_led_coef.off = 1 << 5;
4637		snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4638	}
4639}
4640
4641static void alc236_fixup_hp_mute_led_coefbit2(struct hda_codec *codec,
4642					  const struct hda_fixup *fix, int action)
4643{
4644	struct alc_spec *spec = codec->spec;
4645
4646	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4647		spec->mute_led_polarity = 0;
4648		spec->mute_led_coef.idx = 0x07;
4649		spec->mute_led_coef.mask = 1;
4650		spec->mute_led_coef.on = 1;
4651		spec->mute_led_coef.off = 0;
4652		snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4653	}
4654}
4655
4656static void alc245_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4657					  const struct hda_fixup *fix,
4658					  int action)
4659{
4660	struct alc_spec *spec = codec->spec;
4661
4662	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4663		spec->mute_led_polarity = 0;
4664		spec->mute_led_coef.idx = 0x0b;
4665		spec->mute_led_coef.mask = 3 << 2;
4666		spec->mute_led_coef.on = 2 << 2;
4667		spec->mute_led_coef.off = 1 << 2;
4668		snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4669	}
4670}
4671
4672/* turn on/off mic-mute LED per capture hook by coef bit */
4673static int coef_micmute_led_set(struct led_classdev *led_cdev,
4674				enum led_brightness brightness)
4675{
4676	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4677	struct alc_spec *spec = codec->spec;
4678
4679	alc_update_coef_led(codec, &spec->mic_led_coef,
4680			    spec->micmute_led_polarity, brightness);
4681	return 0;
4682}
4683
4684static void alc285_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4685				const struct hda_fixup *fix, int action)
4686{
4687	struct alc_spec *spec = codec->spec;
4688
4689	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4690		spec->mic_led_coef.idx = 0x19;
4691		spec->mic_led_coef.mask = 1 << 13;
4692		spec->mic_led_coef.on = 1 << 13;
4693		spec->mic_led_coef.off = 0;
4694		snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
4695	}
4696}
4697
4698static void alc285_fixup_hp_gpio_micmute_led(struct hda_codec *codec,
4699				const struct hda_fixup *fix, int action)
4700{
4701	struct alc_spec *spec = codec->spec;
4702
4703	if (action == HDA_FIXUP_ACT_PRE_PROBE)
4704		spec->micmute_led_polarity = 1;
4705	alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
4706}
4707
4708static void alc236_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4709				const struct hda_fixup *fix, int action)
4710{
4711	struct alc_spec *spec = codec->spec;
4712
4713	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4714		spec->mic_led_coef.idx = 0x35;
4715		spec->mic_led_coef.mask = 3 << 2;
4716		spec->mic_led_coef.on = 2 << 2;
4717		spec->mic_led_coef.off = 1 << 2;
4718		snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
4719	}
4720}
4721
4722static void alc285_fixup_hp_mute_led(struct hda_codec *codec,
4723				const struct hda_fixup *fix, int action)
4724{
4725	alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
4726	alc285_fixup_hp_coef_micmute_led(codec, fix, action);
4727}
4728
4729static void alc285_fixup_hp_spectre_x360_mute_led(struct hda_codec *codec,
4730				const struct hda_fixup *fix, int action)
4731{
4732	alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
4733	alc285_fixup_hp_gpio_micmute_led(codec, fix, action);
4734}
4735
4736static void alc236_fixup_hp_mute_led(struct hda_codec *codec,
4737				const struct hda_fixup *fix, int action)
4738{
4739	alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
4740	alc236_fixup_hp_coef_micmute_led(codec, fix, action);
4741}
4742
4743static void alc236_fixup_hp_micmute_led_vref(struct hda_codec *codec,
4744				const struct hda_fixup *fix, int action)
4745{
4746	struct alc_spec *spec = codec->spec;
4747
4748	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4749		spec->cap_mute_led_nid = 0x1a;
4750		snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4751		codec->power_filter = led_power_filter;
4752	}
4753}
4754
4755static void alc236_fixup_hp_mute_led_micmute_vref(struct hda_codec *codec,
4756				const struct hda_fixup *fix, int action)
4757{
4758	alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
4759	alc236_fixup_hp_micmute_led_vref(codec, fix, action);
4760}
4761
4762static inline void alc298_samsung_write_coef_pack(struct hda_codec *codec,
4763						  const unsigned short coefs[2])
4764{
4765	alc_write_coef_idx(codec, 0x23, coefs[0]);
4766	alc_write_coef_idx(codec, 0x25, coefs[1]);
4767	alc_write_coef_idx(codec, 0x26, 0xb011);
4768}
4769
4770struct alc298_samsung_amp_desc {
4771	unsigned char nid;
4772	unsigned short init_seq[2][2];
4773};
4774
4775static void alc298_fixup_samsung_amp(struct hda_codec *codec,
4776				     const struct hda_fixup *fix, int action)
4777{
4778	int i, j;
4779	static const unsigned short init_seq[][2] = {
4780		{ 0x19, 0x00 }, { 0x20, 0xc0 }, { 0x22, 0x44 }, { 0x23, 0x08 },
4781		{ 0x24, 0x85 }, { 0x25, 0x41 }, { 0x35, 0x40 }, { 0x36, 0x01 },
4782		{ 0x38, 0x81 }, { 0x3a, 0x03 }, { 0x3b, 0x81 }, { 0x40, 0x3e },
4783		{ 0x41, 0x07 }, { 0x400, 0x1 }
4784	};
4785	static const struct alc298_samsung_amp_desc amps[] = {
4786		{ 0x3a, { { 0x18, 0x1 }, { 0x26, 0x0 } } },
4787		{ 0x39, { { 0x18, 0x2 }, { 0x26, 0x1 } } }
4788	};
4789
4790	if (action != HDA_FIXUP_ACT_INIT)
4791		return;
4792
4793	for (i = 0; i < ARRAY_SIZE(amps); i++) {
4794		alc_write_coef_idx(codec, 0x22, amps[i].nid);
4795
4796		for (j = 0; j < ARRAY_SIZE(amps[i].init_seq); j++)
4797			alc298_samsung_write_coef_pack(codec, amps[i].init_seq[j]);
4798
4799		for (j = 0; j < ARRAY_SIZE(init_seq); j++)
4800			alc298_samsung_write_coef_pack(codec, init_seq[j]);
4801	}
4802}
4803
4804#if IS_REACHABLE(CONFIG_INPUT)
4805static void gpio2_mic_hotkey_event(struct hda_codec *codec,
4806				   struct hda_jack_callback *event)
4807{
4808	struct alc_spec *spec = codec->spec;
4809
4810	/* GPIO2 just toggles on a keypress/keyrelease cycle. Therefore
4811	   send both key on and key off event for every interrupt. */
4812	input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 1);
4813	input_sync(spec->kb_dev);
4814	input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 0);
4815	input_sync(spec->kb_dev);
4816}
4817
4818static int alc_register_micmute_input_device(struct hda_codec *codec)
4819{
4820	struct alc_spec *spec = codec->spec;
4821	int i;
4822
4823	spec->kb_dev = input_allocate_device();
4824	if (!spec->kb_dev) {
4825		codec_err(codec, "Out of memory (input_allocate_device)\n");
4826		return -ENOMEM;
4827	}
4828
4829	spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX] = KEY_MICMUTE;
4830
4831	spec->kb_dev->name = "Microphone Mute Button";
4832	spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY);
4833	spec->kb_dev->keycodesize = sizeof(spec->alc_mute_keycode_map[0]);
4834	spec->kb_dev->keycodemax = ARRAY_SIZE(spec->alc_mute_keycode_map);
4835	spec->kb_dev->keycode = spec->alc_mute_keycode_map;
4836	for (i = 0; i < ARRAY_SIZE(spec->alc_mute_keycode_map); i++)
4837		set_bit(spec->alc_mute_keycode_map[i], spec->kb_dev->keybit);
4838
4839	if (input_register_device(spec->kb_dev)) {
4840		codec_err(codec, "input_register_device failed\n");
4841		input_free_device(spec->kb_dev);
4842		spec->kb_dev = NULL;
4843		return -ENOMEM;
4844	}
4845
4846	return 0;
4847}
4848
4849/* GPIO1 = set according to SKU external amp
4850 * GPIO2 = mic mute hotkey
4851 * GPIO3 = mute LED
4852 * GPIO4 = mic mute LED
4853 */
4854static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec,
4855					     const struct hda_fixup *fix, int action)
4856{
4857	struct alc_spec *spec = codec->spec;
4858
4859	alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
4860	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4861		spec->init_amp = ALC_INIT_DEFAULT;
4862		if (alc_register_micmute_input_device(codec) != 0)
4863			return;
4864
4865		spec->gpio_mask |= 0x06;
4866		spec->gpio_dir |= 0x02;
4867		spec->gpio_data |= 0x02;
4868		snd_hda_codec_write_cache(codec, codec->core.afg, 0,
4869					  AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x04);
4870		snd_hda_jack_detect_enable_callback(codec, codec->core.afg,
4871						    gpio2_mic_hotkey_event);
4872		return;
4873	}
4874
4875	if (!spec->kb_dev)
4876		return;
4877
4878	switch (action) {
4879	case HDA_FIXUP_ACT_FREE:
4880		input_unregister_device(spec->kb_dev);
4881		spec->kb_dev = NULL;
4882	}
4883}
4884
4885/* Line2 = mic mute hotkey
4886 * GPIO2 = mic mute LED
4887 */
4888static void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec,
4889					     const struct hda_fixup *fix, int action)
4890{
4891	struct alc_spec *spec = codec->spec;
4892
4893	alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
4894	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4895		spec->init_amp = ALC_INIT_DEFAULT;
4896		if (alc_register_micmute_input_device(codec) != 0)
4897			return;
4898
4899		snd_hda_jack_detect_enable_callback(codec, 0x1b,
4900						    gpio2_mic_hotkey_event);
4901		return;
4902	}
4903
4904	if (!spec->kb_dev)
4905		return;
4906
4907	switch (action) {
4908	case HDA_FIXUP_ACT_FREE:
4909		input_unregister_device(spec->kb_dev);
4910		spec->kb_dev = NULL;
4911	}
4912}
4913#else /* INPUT */
4914#define alc280_fixup_hp_gpio2_mic_hotkey	NULL
4915#define alc233_fixup_lenovo_line2_mic_hotkey	NULL
4916#endif /* INPUT */
4917
4918static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec,
4919				const struct hda_fixup *fix, int action)
4920{
4921	struct alc_spec *spec = codec->spec;
4922
4923	alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1a);
4924	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4925		spec->cap_mute_led_nid = 0x18;
4926		snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4927	}
4928}
4929
4930static const struct coef_fw alc225_pre_hsmode[] = {
4931	UPDATE_COEF(0x4a, 1<<8, 0),
4932	UPDATE_COEFEX(0x57, 0x05, 1<<14, 0),
4933	UPDATE_COEF(0x63, 3<<14, 3<<14),
4934	UPDATE_COEF(0x4a, 3<<4, 2<<4),
4935	UPDATE_COEF(0x4a, 3<<10, 3<<10),
4936	UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10),
4937	UPDATE_COEF(0x4a, 3<<10, 0),
4938	{}
4939};
4940
4941static void alc_headset_mode_unplugged(struct hda_codec *codec)
4942{
4943	struct alc_spec *spec = codec->spec;
4944	static const struct coef_fw coef0255[] = {
4945		WRITE_COEF(0x1b, 0x0c0b), /* LDO and MISC control */
4946		WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
4947		UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
4948		WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
4949		WRITE_COEFEX(0x57, 0x03, 0x8aa6), /* Direct Drive HP Amp control */
4950		{}
4951	};
4952	static const struct coef_fw coef0256[] = {
4953		WRITE_COEF(0x1b, 0x0c4b), /* LDO and MISC control */
4954		WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
4955		WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
4956		WRITE_COEFEX(0x57, 0x03, 0x09a3), /* Direct Drive HP Amp control */
4957		UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
4958		{}
4959	};
4960	static const struct coef_fw coef0233[] = {
4961		WRITE_COEF(0x1b, 0x0c0b),
4962		WRITE_COEF(0x45, 0xc429),
4963		UPDATE_COEF(0x35, 0x4000, 0),
4964		WRITE_COEF(0x06, 0x2104),
4965		WRITE_COEF(0x1a, 0x0001),
4966		WRITE_COEF(0x26, 0x0004),
4967		WRITE_COEF(0x32, 0x42a3),
4968		{}
4969	};
4970	static const struct coef_fw coef0288[] = {
4971		UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
4972		UPDATE_COEF(0x50, 0x2000, 0x2000),
4973		UPDATE_COEF(0x56, 0x0006, 0x0006),
4974		UPDATE_COEF(0x66, 0x0008, 0),
4975		UPDATE_COEF(0x67, 0x2000, 0),
4976		{}
4977	};
4978	static const struct coef_fw coef0298[] = {
4979		UPDATE_COEF(0x19, 0x1300, 0x0300),
4980		{}
4981	};
4982	static const struct coef_fw coef0292[] = {
4983		WRITE_COEF(0x76, 0x000e),
4984		WRITE_COEF(0x6c, 0x2400),
4985		WRITE_COEF(0x18, 0x7308),
4986		WRITE_COEF(0x6b, 0xc429),
4987		{}
4988	};
4989	static const struct coef_fw coef0293[] = {
4990		UPDATE_COEF(0x10, 7<<8, 6<<8), /* SET Line1 JD to 0 */
4991		UPDATE_COEFEX(0x57, 0x05, 1<<15|1<<13, 0x0), /* SET charge pump by verb */
4992		UPDATE_COEFEX(0x57, 0x03, 1<<10, 1<<10), /* SET EN_OSW to 1 */
4993		UPDATE_COEF(0x1a, 1<<3, 1<<3), /* Combo JD gating with LINE1-VREFO */
4994		WRITE_COEF(0x45, 0xc429), /* Set to TRS type */
4995		UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
4996		{}
4997	};
4998	static const struct coef_fw coef0668[] = {
4999		WRITE_COEF(0x15, 0x0d40),
5000		WRITE_COEF(0xb7, 0x802b),
5001		{}
5002	};
5003	static const struct coef_fw coef0225[] = {
5004		UPDATE_COEF(0x63, 3<<14, 0),
5005		{}
5006	};
5007	static const struct coef_fw coef0274[] = {
5008		UPDATE_COEF(0x4a, 0x0100, 0),
5009		UPDATE_COEFEX(0x57, 0x05, 0x4000, 0),
5010		UPDATE_COEF(0x6b, 0xf000, 0x5000),
5011		UPDATE_COEF(0x4a, 0x0010, 0),
5012		UPDATE_COEF(0x4a, 0x0c00, 0x0c00),
5013		WRITE_COEF(0x45, 0x5289),
5014		UPDATE_COEF(0x4a, 0x0c00, 0),
5015		{}
5016	};
5017
5018	if (spec->no_internal_mic_pin) {
5019		alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
5020		return;
5021	}
5022
5023	switch (codec->core.vendor_id) {
5024	case 0x10ec0255:
5025		alc_process_coef_fw(codec, coef0255);
5026		break;
5027	case 0x10ec0230:
5028	case 0x10ec0236:
5029	case 0x10ec0256:
5030	case 0x19e58326:
5031		alc_process_coef_fw(codec, coef0256);
5032		break;
5033	case 0x10ec0234:
5034	case 0x10ec0274:
5035	case 0x10ec0294:
5036		alc_process_coef_fw(codec, coef0274);
5037		break;
5038	case 0x10ec0233:
5039	case 0x10ec0283:
5040		alc_process_coef_fw(codec, coef0233);
5041		break;
5042	case 0x10ec0286:
5043	case 0x10ec0288:
5044		alc_process_coef_fw(codec, coef0288);
5045		break;
5046	case 0x10ec0298:
5047		alc_process_coef_fw(codec, coef0298);
5048		alc_process_coef_fw(codec, coef0288);
5049		break;
5050	case 0x10ec0292:
5051		alc_process_coef_fw(codec, coef0292);
5052		break;
5053	case 0x10ec0293:
5054		alc_process_coef_fw(codec, coef0293);
5055		break;
5056	case 0x10ec0668:
5057		alc_process_coef_fw(codec, coef0668);
5058		break;
5059	case 0x10ec0215:
5060	case 0x10ec0225:
5061	case 0x10ec0285:
5062	case 0x10ec0295:
5063	case 0x10ec0289:
5064	case 0x10ec0299:
5065		alc_process_coef_fw(codec, alc225_pre_hsmode);
5066		alc_process_coef_fw(codec, coef0225);
5067		break;
5068	case 0x10ec0867:
5069		alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5070		break;
5071	}
5072	codec_dbg(codec, "Headset jack set to unplugged mode.\n");
5073}
5074
5075
5076static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
5077				    hda_nid_t mic_pin)
5078{
5079	static const struct coef_fw coef0255[] = {
5080		WRITE_COEFEX(0x57, 0x03, 0x8aa6),
5081		WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
5082		{}
5083	};
5084	static const struct coef_fw coef0256[] = {
5085		UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14), /* Direct Drive HP Amp control(Set to verb control)*/
5086		WRITE_COEFEX(0x57, 0x03, 0x09a3),
5087		WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
5088		{}
5089	};
5090	static const struct coef_fw coef0233[] = {
5091		UPDATE_COEF(0x35, 0, 1<<14),
5092		WRITE_COEF(0x06, 0x2100),
5093		WRITE_COEF(0x1a, 0x0021),
5094		WRITE_COEF(0x26, 0x008c),
5095		{}
5096	};
5097	static const struct coef_fw coef0288[] = {
5098		UPDATE_COEF(0x4f, 0x00c0, 0),
5099		UPDATE_COEF(0x50, 0x2000, 0),
5100		UPDATE_COEF(0x56, 0x0006, 0),
5101		UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
5102		UPDATE_COEF(0x66, 0x0008, 0x0008),
5103		UPDATE_COEF(0x67, 0x2000, 0x2000),
5104		{}
5105	};
5106	static const struct coef_fw coef0292[] = {
5107		WRITE_COEF(0x19, 0xa208),
5108		WRITE_COEF(0x2e, 0xacf0),
5109		{}
5110	};
5111	static const struct coef_fw coef0293[] = {
5112		UPDATE_COEFEX(0x57, 0x05, 0, 1<<15|1<<13), /* SET charge pump by verb */
5113		UPDATE_COEFEX(0x57, 0x03, 1<<10, 0), /* SET EN_OSW to 0 */
5114		UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
5115		{}
5116	};
5117	static const struct coef_fw coef0688[] = {
5118		WRITE_COEF(0xb7, 0x802b),
5119		WRITE_COEF(0xb5, 0x1040),
5120		UPDATE_COEF(0xc3, 0, 1<<12),
5121		{}
5122	};
5123	static const struct coef_fw coef0225[] = {
5124		UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14),
5125		UPDATE_COEF(0x4a, 3<<4, 2<<4),
5126		UPDATE_COEF(0x63, 3<<14, 0),
5127		{}
5128	};
5129	static const struct coef_fw coef0274[] = {
5130		UPDATE_COEFEX(0x57, 0x05, 0x4000, 0x4000),
5131		UPDATE_COEF(0x4a, 0x0010, 0),
5132		UPDATE_COEF(0x6b, 0xf000, 0),
5133		{}
5134	};
5135
5136	switch (codec->core.vendor_id) {
5137	case 0x10ec0255:
5138		alc_write_coef_idx(codec, 0x45, 0xc489);
5139		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5140		alc_process_coef_fw(codec, coef0255);
5141		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5142		break;
5143	case 0x10ec0230:
5144	case 0x10ec0236:
5145	case 0x10ec0256:
5146	case 0x19e58326:
5147		alc_write_coef_idx(codec, 0x45, 0xc489);
5148		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5149		alc_process_coef_fw(codec, coef0256);
5150		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5151		break;
5152	case 0x10ec0234:
5153	case 0x10ec0274:
5154	case 0x10ec0294:
5155		alc_write_coef_idx(codec, 0x45, 0x4689);
5156		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5157		alc_process_coef_fw(codec, coef0274);
5158		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5159		break;
5160	case 0x10ec0233:
5161	case 0x10ec0283:
5162		alc_write_coef_idx(codec, 0x45, 0xc429);
5163		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5164		alc_process_coef_fw(codec, coef0233);
5165		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5166		break;
5167	case 0x10ec0286:
5168	case 0x10ec0288:
5169	case 0x10ec0298:
5170		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5171		alc_process_coef_fw(codec, coef0288);
5172		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5173		break;
5174	case 0x10ec0292:
5175		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5176		alc_process_coef_fw(codec, coef0292);
5177		break;
5178	case 0x10ec0293:
5179		/* Set to TRS mode */
5180		alc_write_coef_idx(codec, 0x45, 0xc429);
5181		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5182		alc_process_coef_fw(codec, coef0293);
5183		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5184		break;
5185	case 0x10ec0867:
5186		alc_update_coefex_idx(codec, 0x57, 0x5, 0, 1<<14);
5187		fallthrough;
5188	case 0x10ec0221:
5189	case 0x10ec0662:
5190		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5191		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5192		break;
5193	case 0x10ec0668:
5194		alc_write_coef_idx(codec, 0x11, 0x0001);
5195		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5196		alc_process_coef_fw(codec, coef0688);
5197		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5198		break;
5199	case 0x10ec0215:
5200	case 0x10ec0225:
5201	case 0x10ec0285:
5202	case 0x10ec0295:
5203	case 0x10ec0289:
5204	case 0x10ec0299:
5205		alc_process_coef_fw(codec, alc225_pre_hsmode);
5206		alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x31<<10);
5207		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5208		alc_process_coef_fw(codec, coef0225);
5209		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5210		break;
5211	}
5212	codec_dbg(codec, "Headset jack set to mic-in mode.\n");
5213}
5214
5215static void alc_headset_mode_default(struct hda_codec *codec)
5216{
5217	static const struct coef_fw coef0225[] = {
5218		UPDATE_COEF(0x45, 0x3f<<10, 0x30<<10),
5219		UPDATE_COEF(0x45, 0x3f<<10, 0x31<<10),
5220		UPDATE_COEF(0x49, 3<<8, 0<<8),
5221		UPDATE_COEF(0x4a, 3<<4, 3<<4),
5222		UPDATE_COEF(0x63, 3<<14, 0),
5223		UPDATE_COEF(0x67, 0xf000, 0x3000),
5224		{}
5225	};
5226	static const struct coef_fw coef0255[] = {
5227		WRITE_COEF(0x45, 0xc089),
5228		WRITE_COEF(0x45, 0xc489),
5229		WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5230		WRITE_COEF(0x49, 0x0049),
5231		{}
5232	};
5233	static const struct coef_fw coef0256[] = {
5234		WRITE_COEF(0x45, 0xc489),
5235		WRITE_COEFEX(0x57, 0x03, 0x0da3),
5236		WRITE_COEF(0x49, 0x0049),
5237		UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
5238		WRITE_COEF(0x06, 0x6100),
5239		{}
5240	};
5241	static const struct coef_fw coef0233[] = {
5242		WRITE_COEF(0x06, 0x2100),
5243		WRITE_COEF(0x32, 0x4ea3),
5244		{}
5245	};
5246	static const struct coef_fw coef0288[] = {
5247		UPDATE_COEF(0x4f, 0xfcc0, 0xc400), /* Set to TRS type */
5248		UPDATE_COEF(0x50, 0x2000, 0x2000),
5249		UPDATE_COEF(0x56, 0x0006, 0x0006),
5250		UPDATE_COEF(0x66, 0x0008, 0),
5251		UPDATE_COEF(0x67, 0x2000, 0),
5252		{}
5253	};
5254	static const struct coef_fw coef0292[] = {
5255		WRITE_COEF(0x76, 0x000e),
5256		WRITE_COEF(0x6c, 0x2400),
5257		WRITE_COEF(0x6b, 0xc429),
5258		WRITE_COEF(0x18, 0x7308),
5259		{}
5260	};
5261	static const struct coef_fw coef0293[] = {
5262		UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
5263		WRITE_COEF(0x45, 0xC429), /* Set to TRS type */
5264		UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
5265		{}
5266	};
5267	static const struct coef_fw coef0688[] = {
5268		WRITE_COEF(0x11, 0x0041),
5269		WRITE_COEF(0x15, 0x0d40),
5270		WRITE_COEF(0xb7, 0x802b),
5271		{}
5272	};
5273	static const struct coef_fw coef0274[] = {
5274		WRITE_COEF(0x45, 0x4289),
5275		UPDATE_COEF(0x4a, 0x0010, 0x0010),
5276		UPDATE_COEF(0x6b, 0x0f00, 0),
5277		UPDATE_COEF(0x49, 0x0300, 0x0300),
5278		{}
5279	};
5280
5281	switch (codec->core.vendor_id) {
5282	case 0x10ec0215:
5283	case 0x10ec0225:
5284	case 0x10ec0285:
5285	case 0x10ec0295:
5286	case 0x10ec0289:
5287	case 0x10ec0299:
5288		alc_process_coef_fw(codec, alc225_pre_hsmode);
5289		alc_process_coef_fw(codec, coef0225);
5290		break;
5291	case 0x10ec0255:
5292		alc_process_coef_fw(codec, coef0255);
5293		break;
5294	case 0x10ec0230:
5295	case 0x10ec0236:
5296	case 0x10ec0256:
5297	case 0x19e58326:
5298		alc_write_coef_idx(codec, 0x1b, 0x0e4b);
5299		alc_write_coef_idx(codec, 0x45, 0xc089);
5300		msleep(50);
5301		alc_process_coef_fw(codec, coef0256);
5302		break;
5303	case 0x10ec0234:
5304	case 0x10ec0274:
5305	case 0x10ec0294:
5306		alc_process_coef_fw(codec, coef0274);
5307		break;
5308	case 0x10ec0233:
5309	case 0x10ec0283:
5310		alc_process_coef_fw(codec, coef0233);
5311		break;
5312	case 0x10ec0286:
5313	case 0x10ec0288:
5314	case 0x10ec0298:
5315		alc_process_coef_fw(codec, coef0288);
5316		break;
5317	case 0x10ec0292:
5318		alc_process_coef_fw(codec, coef0292);
5319		break;
5320	case 0x10ec0293:
5321		alc_process_coef_fw(codec, coef0293);
5322		break;
5323	case 0x10ec0668:
5324		alc_process_coef_fw(codec, coef0688);
5325		break;
5326	case 0x10ec0867:
5327		alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5328		break;
5329	}
5330	codec_dbg(codec, "Headset jack set to headphone (default) mode.\n");
5331}
5332
5333/* Iphone type */
5334static void alc_headset_mode_ctia(struct hda_codec *codec)
5335{
5336	int val;
5337
5338	static const struct coef_fw coef0255[] = {
5339		WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
5340		WRITE_COEF(0x1b, 0x0c2b),
5341		WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5342		{}
5343	};
5344	static const struct coef_fw coef0256[] = {
5345		WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
5346		WRITE_COEF(0x1b, 0x0e6b),
5347		{}
5348	};
5349	static const struct coef_fw coef0233[] = {
5350		WRITE_COEF(0x45, 0xd429),
5351		WRITE_COEF(0x1b, 0x0c2b),
5352		WRITE_COEF(0x32, 0x4ea3),
5353		{}
5354	};
5355	static const struct coef_fw coef0288[] = {
5356		UPDATE_COEF(0x50, 0x2000, 0x2000),
5357		UPDATE_COEF(0x56, 0x0006, 0x0006),
5358		UPDATE_COEF(0x66, 0x0008, 0),
5359		UPDATE_COEF(0x67, 0x2000, 0),
5360		{}
5361	};
5362	static const struct coef_fw coef0292[] = {
5363		WRITE_COEF(0x6b, 0xd429),
5364		WRITE_COEF(0x76, 0x0008),
5365		WRITE_COEF(0x18, 0x7388),
5366		{}
5367	};
5368	static const struct coef_fw coef0293[] = {
5369		WRITE_COEF(0x45, 0xd429), /* Set to ctia type */
5370		UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
5371		{}
5372	};
5373	static const struct coef_fw coef0688[] = {
5374		WRITE_COEF(0x11, 0x0001),
5375		WRITE_COEF(0x15, 0x0d60),
5376		WRITE_COEF(0xc3, 0x0000),
5377		{}
5378	};
5379	static const struct coef_fw coef0225_1[] = {
5380		UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
5381		UPDATE_COEF(0x63, 3<<14, 2<<14),
5382		{}
5383	};
5384	static const struct coef_fw coef0225_2[] = {
5385		UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
5386		UPDATE_COEF(0x63, 3<<14, 1<<14),
5387		{}
5388	};
5389
5390	switch (codec->core.vendor_id) {
5391	case 0x10ec0255:
5392		alc_process_coef_fw(codec, coef0255);
5393		break;
5394	case 0x10ec0230:
5395	case 0x10ec0236:
5396	case 0x10ec0256:
5397	case 0x19e58326:
5398		alc_process_coef_fw(codec, coef0256);
5399		break;
5400	case 0x10ec0234:
5401	case 0x10ec0274:
5402	case 0x10ec0294:
5403		alc_write_coef_idx(codec, 0x45, 0xd689);
5404		break;
5405	case 0x10ec0233:
5406	case 0x10ec0283:
5407		alc_process_coef_fw(codec, coef0233);
5408		break;
5409	case 0x10ec0298:
5410		val = alc_read_coef_idx(codec, 0x50);
5411		if (val & (1 << 12)) {
5412			alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
5413			alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5414			msleep(300);
5415		} else {
5416			alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
5417			alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5418			msleep(300);
5419		}
5420		break;
5421	case 0x10ec0286:
5422	case 0x10ec0288:
5423		alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5424		msleep(300);
5425		alc_process_coef_fw(codec, coef0288);
5426		break;
5427	case 0x10ec0292:
5428		alc_process_coef_fw(codec, coef0292);
5429		break;
5430	case 0x10ec0293:
5431		alc_process_coef_fw(codec, coef0293);
5432		break;
5433	case 0x10ec0668:
5434		alc_process_coef_fw(codec, coef0688);
5435		break;
5436	case 0x10ec0215:
5437	case 0x10ec0225:
5438	case 0x10ec0285:
5439	case 0x10ec0295:
5440	case 0x10ec0289:
5441	case 0x10ec0299:
5442		val = alc_read_coef_idx(codec, 0x45);
5443		if (val & (1 << 9))
5444			alc_process_coef_fw(codec, coef0225_2);
5445		else
5446			alc_process_coef_fw(codec, coef0225_1);
5447		break;
5448	case 0x10ec0867:
5449		alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5450		break;
5451	}
5452	codec_dbg(codec, "Headset jack set to iPhone-style headset mode.\n");
5453}
5454
5455/* Nokia type */
5456static void alc_headset_mode_omtp(struct hda_codec *codec)
5457{
5458	static const struct coef_fw coef0255[] = {
5459		WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
5460		WRITE_COEF(0x1b, 0x0c2b),
5461		WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5462		{}
5463	};
5464	static const struct coef_fw coef0256[] = {
5465		WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
5466		WRITE_COEF(0x1b, 0x0e6b),
5467		{}
5468	};
5469	static const struct coef_fw coef0233[] = {
5470		WRITE_COEF(0x45, 0xe429),
5471		WRITE_COEF(0x1b, 0x0c2b),
5472		WRITE_COEF(0x32, 0x4ea3),
5473		{}
5474	};
5475	static const struct coef_fw coef0288[] = {
5476		UPDATE_COEF(0x50, 0x2000, 0x2000),
5477		UPDATE_COEF(0x56, 0x0006, 0x0006),
5478		UPDATE_COEF(0x66, 0x0008, 0),
5479		UPDATE_COEF(0x67, 0x2000, 0),
5480		{}
5481	};
5482	static const struct coef_fw coef0292[] = {
5483		WRITE_COEF(0x6b, 0xe429),
5484		WRITE_COEF(0x76, 0x0008),
5485		WRITE_COEF(0x18, 0x7388),
5486		{}
5487	};
5488	static const struct coef_fw coef0293[] = {
5489		WRITE_COEF(0x45, 0xe429), /* Set to omtp type */
5490		UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
5491		{}
5492	};
5493	static const struct coef_fw coef0688[] = {
5494		WRITE_COEF(0x11, 0x0001),
5495		WRITE_COEF(0x15, 0x0d50),
5496		WRITE_COEF(0xc3, 0x0000),
5497		{}
5498	};
5499	static const struct coef_fw coef0225[] = {
5500		UPDATE_COEF(0x45, 0x3f<<10, 0x39<<10),
5501		UPDATE_COEF(0x63, 3<<14, 2<<14),
5502		{}
5503	};
5504
5505	switch (codec->core.vendor_id) {
5506	case 0x10ec0255:
5507		alc_process_coef_fw(codec, coef0255);
5508		break;
5509	case 0x10ec0230:
5510	case 0x10ec0236:
5511	case 0x10ec0256:
5512	case 0x19e58326:
5513		alc_process_coef_fw(codec, coef0256);
5514		break;
5515	case 0x10ec0234:
5516	case 0x10ec0274:
5517	case 0x10ec0294:
5518		alc_write_coef_idx(codec, 0x45, 0xe689);
5519		break;
5520	case 0x10ec0233:
5521	case 0x10ec0283:
5522		alc_process_coef_fw(codec, coef0233);
5523		break;
5524	case 0x10ec0298:
5525		alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);/* Headset output enable */
5526		alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5527		msleep(300);
5528		break;
5529	case 0x10ec0286:
5530	case 0x10ec0288:
5531		alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5532		msleep(300);
5533		alc_process_coef_fw(codec, coef0288);
5534		break;
5535	case 0x10ec0292:
5536		alc_process_coef_fw(codec, coef0292);
5537		break;
5538	case 0x10ec0293:
5539		alc_process_coef_fw(codec, coef0293);
5540		break;
5541	case 0x10ec0668:
5542		alc_process_coef_fw(codec, coef0688);
5543		break;
5544	case 0x10ec0215:
5545	case 0x10ec0225:
5546	case 0x10ec0285:
5547	case 0x10ec0295:
5548	case 0x10ec0289:
5549	case 0x10ec0299:
5550		alc_process_coef_fw(codec, coef0225);
5551		break;
5552	}
5553	codec_dbg(codec, "Headset jack set to Nokia-style headset mode.\n");
5554}
5555
5556static void alc_determine_headset_type(struct hda_codec *codec)
5557{
5558	int val;
5559	bool is_ctia = false;
5560	struct alc_spec *spec = codec->spec;
5561	static const struct coef_fw coef0255[] = {
5562		WRITE_COEF(0x45, 0xd089), /* combo jack auto switch control(Check type)*/
5563		WRITE_COEF(0x49, 0x0149), /* combo jack auto switch control(Vref
5564 conteol) */
5565		{}
5566	};
5567	static const struct coef_fw coef0288[] = {
5568		UPDATE_COEF(0x4f, 0xfcc0, 0xd400), /* Check Type */
5569		{}
5570	};
5571	static const struct coef_fw coef0298[] = {
5572		UPDATE_COEF(0x50, 0x2000, 0x2000),
5573		UPDATE_COEF(0x56, 0x0006, 0x0006),
5574		UPDATE_COEF(0x66, 0x0008, 0),
5575		UPDATE_COEF(0x67, 0x2000, 0),
5576		UPDATE_COEF(0x19, 0x1300, 0x1300),
5577		{}
5578	};
5579	static const struct coef_fw coef0293[] = {
5580		UPDATE_COEF(0x4a, 0x000f, 0x0008), /* Combo Jack auto detect */
5581		WRITE_COEF(0x45, 0xD429), /* Set to ctia type */
5582		{}
5583	};
5584	static const struct coef_fw coef0688[] = {
5585		WRITE_COEF(0x11, 0x0001),
5586		WRITE_COEF(0xb7, 0x802b),
5587		WRITE_COEF(0x15, 0x0d60),
5588		WRITE_COEF(0xc3, 0x0c00),
5589		{}
5590	};
5591	static const struct coef_fw coef0274[] = {
5592		UPDATE_COEF(0x4a, 0x0010, 0),
5593		UPDATE_COEF(0x4a, 0x8000, 0),
5594		WRITE_COEF(0x45, 0xd289),
5595		UPDATE_COEF(0x49, 0x0300, 0x0300),
5596		{}
5597	};
5598
5599	if (spec->no_internal_mic_pin) {
5600		alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
5601		return;
5602	}
5603
5604	switch (codec->core.vendor_id) {
5605	case 0x10ec0255:
5606		alc_process_coef_fw(codec, coef0255);
5607		msleep(300);
5608		val = alc_read_coef_idx(codec, 0x46);
5609		is_ctia = (val & 0x0070) == 0x0070;
5610		break;
5611	case 0x10ec0230:
5612	case 0x10ec0236:
5613	case 0x10ec0256:
5614	case 0x19e58326:
5615		alc_write_coef_idx(codec, 0x1b, 0x0e4b);
5616		alc_write_coef_idx(codec, 0x06, 0x6104);
5617		alc_write_coefex_idx(codec, 0x57, 0x3, 0x09a3);
5618
5619		snd_hda_codec_write(codec, 0x21, 0,
5620			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5621		msleep(80);
5622		snd_hda_codec_write(codec, 0x21, 0,
5623			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5624
5625		alc_process_coef_fw(codec, coef0255);
5626		msleep(300);
5627		val = alc_read_coef_idx(codec, 0x46);
5628		is_ctia = (val & 0x0070) == 0x0070;
5629
5630		alc_write_coefex_idx(codec, 0x57, 0x3, 0x0da3);
5631		alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5632
5633		snd_hda_codec_write(codec, 0x21, 0,
5634			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5635		msleep(80);
5636		snd_hda_codec_write(codec, 0x21, 0,
5637			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5638		break;
5639	case 0x10ec0234:
5640	case 0x10ec0274:
5641	case 0x10ec0294:
5642		alc_process_coef_fw(codec, coef0274);
5643		msleep(850);
5644		val = alc_read_coef_idx(codec, 0x46);
5645		is_ctia = (val & 0x00f0) == 0x00f0;
5646		break;
5647	case 0x10ec0233:
5648	case 0x10ec0283:
5649		alc_write_coef_idx(codec, 0x45, 0xd029);
5650		msleep(300);
5651		val = alc_read_coef_idx(codec, 0x46);
5652		is_ctia = (val & 0x0070) == 0x0070;
5653		break;
5654	case 0x10ec0298:
5655		snd_hda_codec_write(codec, 0x21, 0,
5656			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5657		msleep(100);
5658		snd_hda_codec_write(codec, 0x21, 0,
5659			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5660		msleep(200);
5661
5662		val = alc_read_coef_idx(codec, 0x50);
5663		if (val & (1 << 12)) {
5664			alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
5665			alc_process_coef_fw(codec, coef0288);
5666			msleep(350);
5667			val = alc_read_coef_idx(codec, 0x50);
5668			is_ctia = (val & 0x0070) == 0x0070;
5669		} else {
5670			alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
5671			alc_process_coef_fw(codec, coef0288);
5672			msleep(350);
5673			val = alc_read_coef_idx(codec, 0x50);
5674			is_ctia = (val & 0x0070) == 0x0070;
5675		}
5676		alc_process_coef_fw(codec, coef0298);
5677		snd_hda_codec_write(codec, 0x21, 0,
5678			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP);
5679		msleep(75);
5680		snd_hda_codec_write(codec, 0x21, 0,
5681			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5682		break;
5683	case 0x10ec0286:
5684	case 0x10ec0288:
5685		alc_process_coef_fw(codec, coef0288);
5686		msleep(350);
5687		val = alc_read_coef_idx(codec, 0x50);
5688		is_ctia = (val & 0x0070) == 0x0070;
5689		break;
5690	case 0x10ec0292:
5691		alc_write_coef_idx(codec, 0x6b, 0xd429);
5692		msleep(300);
5693		val = alc_read_coef_idx(codec, 0x6c);
5694		is_ctia = (val & 0x001c) == 0x001c;
5695		break;
5696	case 0x10ec0293:
5697		alc_process_coef_fw(codec, coef0293);
5698		msleep(300);
5699		val = alc_read_coef_idx(codec, 0x46);
5700		is_ctia = (val & 0x0070) == 0x0070;
5701		break;
5702	case 0x10ec0668:
5703		alc_process_coef_fw(codec, coef0688);
5704		msleep(300);
5705		val = alc_read_coef_idx(codec, 0xbe);
5706		is_ctia = (val & 0x1c02) == 0x1c02;
5707		break;
5708	case 0x10ec0215:
5709	case 0x10ec0225:
5710	case 0x10ec0285:
5711	case 0x10ec0295:
5712	case 0x10ec0289:
5713	case 0x10ec0299:
5714		snd_hda_codec_write(codec, 0x21, 0,
5715			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5716		msleep(80);
5717		snd_hda_codec_write(codec, 0x21, 0,
5718			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5719
5720		alc_process_coef_fw(codec, alc225_pre_hsmode);
5721		alc_update_coef_idx(codec, 0x67, 0xf000, 0x1000);
5722		val = alc_read_coef_idx(codec, 0x45);
5723		if (val & (1 << 9)) {
5724			alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5725			alc_update_coef_idx(codec, 0x49, 3<<8, 2<<8);
5726			msleep(800);
5727			val = alc_read_coef_idx(codec, 0x46);
5728			is_ctia = (val & 0x00f0) == 0x00f0;
5729		} else {
5730			alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5731			alc_update_coef_idx(codec, 0x49, 3<<8, 1<<8);
5732			msleep(800);
5733			val = alc_read_coef_idx(codec, 0x46);
5734			is_ctia = (val & 0x00f0) == 0x00f0;
5735		}
5736		alc_update_coef_idx(codec, 0x4a, 7<<6, 7<<6);
5737		alc_update_coef_idx(codec, 0x4a, 3<<4, 3<<4);
5738		alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
5739
5740		snd_hda_codec_write(codec, 0x21, 0,
5741			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5742		msleep(80);
5743		snd_hda_codec_write(codec, 0x21, 0,
5744			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5745		break;
5746	case 0x10ec0867:
5747		is_ctia = true;
5748		break;
5749	}
5750
5751	codec_dbg(codec, "Headset jack detected iPhone-style headset: %s\n",
5752		    is_ctia ? "yes" : "no");
5753	spec->current_headset_type = is_ctia ? ALC_HEADSET_TYPE_CTIA : ALC_HEADSET_TYPE_OMTP;
5754}
5755
5756static void alc_update_headset_mode(struct hda_codec *codec)
5757{
5758	struct alc_spec *spec = codec->spec;
5759
5760	hda_nid_t mux_pin = spec->gen.imux_pins[spec->gen.cur_mux[0]];
5761	hda_nid_t hp_pin = alc_get_hp_pin(spec);
5762
5763	int new_headset_mode;
5764
5765	if (!snd_hda_jack_detect(codec, hp_pin))
5766		new_headset_mode = ALC_HEADSET_MODE_UNPLUGGED;
5767	else if (mux_pin == spec->headset_mic_pin)
5768		new_headset_mode = ALC_HEADSET_MODE_HEADSET;
5769	else if (mux_pin == spec->headphone_mic_pin)
5770		new_headset_mode = ALC_HEADSET_MODE_MIC;
5771	else
5772		new_headset_mode = ALC_HEADSET_MODE_HEADPHONE;
5773
5774	if (new_headset_mode == spec->current_headset_mode) {
5775		snd_hda_gen_update_outputs(codec);
5776		return;
5777	}
5778
5779	switch (new_headset_mode) {
5780	case ALC_HEADSET_MODE_UNPLUGGED:
5781		alc_headset_mode_unplugged(codec);
5782		spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5783		spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
5784		spec->gen.hp_jack_present = false;
5785		break;
5786	case ALC_HEADSET_MODE_HEADSET:
5787		if (spec->current_headset_type == ALC_HEADSET_TYPE_UNKNOWN)
5788			alc_determine_headset_type(codec);
5789		if (spec->current_headset_type == ALC_HEADSET_TYPE_CTIA)
5790			alc_headset_mode_ctia(codec);
5791		else if (spec->current_headset_type == ALC_HEADSET_TYPE_OMTP)
5792			alc_headset_mode_omtp(codec);
5793		spec->gen.hp_jack_present = true;
5794		break;
5795	case ALC_HEADSET_MODE_MIC:
5796		alc_headset_mode_mic_in(codec, hp_pin, spec->headphone_mic_pin);
5797		spec->gen.hp_jack_present = false;
5798		break;
5799	case ALC_HEADSET_MODE_HEADPHONE:
5800		alc_headset_mode_default(codec);
5801		spec->gen.hp_jack_present = true;
5802		break;
5803	}
5804	if (new_headset_mode != ALC_HEADSET_MODE_MIC) {
5805		snd_hda_set_pin_ctl_cache(codec, hp_pin,
5806					  AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
5807		if (spec->headphone_mic_pin && spec->headphone_mic_pin != hp_pin)
5808			snd_hda_set_pin_ctl_cache(codec, spec->headphone_mic_pin,
5809						  PIN_VREFHIZ);
5810	}
5811	spec->current_headset_mode = new_headset_mode;
5812
5813	snd_hda_gen_update_outputs(codec);
5814}
5815
5816static void alc_update_headset_mode_hook(struct hda_codec *codec,
5817					 struct snd_kcontrol *kcontrol,
5818					 struct snd_ctl_elem_value *ucontrol)
5819{
5820	alc_update_headset_mode(codec);
5821}
5822
5823static void alc_update_headset_jack_cb(struct hda_codec *codec,
5824				       struct hda_jack_callback *jack)
5825{
5826	snd_hda_gen_hp_automute(codec, jack);
5827	alc_update_headset_mode(codec);
5828}
5829
5830static void alc_probe_headset_mode(struct hda_codec *codec)
5831{
5832	int i;
5833	struct alc_spec *spec = codec->spec;
5834	struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5835
5836	/* Find mic pins */
5837	for (i = 0; i < cfg->num_inputs; i++) {
5838		if (cfg->inputs[i].is_headset_mic && !spec->headset_mic_pin)
5839			spec->headset_mic_pin = cfg->inputs[i].pin;
5840		if (cfg->inputs[i].is_headphone_mic && !spec->headphone_mic_pin)
5841			spec->headphone_mic_pin = cfg->inputs[i].pin;
5842	}
5843
5844	WARN_ON(spec->gen.cap_sync_hook);
5845	spec->gen.cap_sync_hook = alc_update_headset_mode_hook;
5846	spec->gen.automute_hook = alc_update_headset_mode;
5847	spec->gen.hp_automute_hook = alc_update_headset_jack_cb;
5848}
5849
5850static void alc_fixup_headset_mode(struct hda_codec *codec,
5851				const struct hda_fixup *fix, int action)
5852{
5853	struct alc_spec *spec = codec->spec;
5854
5855	switch (action) {
5856	case HDA_FIXUP_ACT_PRE_PROBE:
5857		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC | HDA_PINCFG_HEADPHONE_MIC;
5858		break;
5859	case HDA_FIXUP_ACT_PROBE:
5860		alc_probe_headset_mode(codec);
5861		break;
5862	case HDA_FIXUP_ACT_INIT:
5863		if (is_s3_resume(codec) || is_s4_resume(codec)) {
5864			spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5865			spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
5866		}
5867		alc_update_headset_mode(codec);
5868		break;
5869	}
5870}
5871
5872static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
5873				const struct hda_fixup *fix, int action)
5874{
5875	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5876		struct alc_spec *spec = codec->spec;
5877		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5878	}
5879	else
5880		alc_fixup_headset_mode(codec, fix, action);
5881}
5882
5883static void alc255_set_default_jack_type(struct hda_codec *codec)
5884{
5885	/* Set to iphone type */
5886	static const struct coef_fw alc255fw[] = {
5887		WRITE_COEF(0x1b, 0x880b),
5888		WRITE_COEF(0x45, 0xd089),
5889		WRITE_COEF(0x1b, 0x080b),
5890		WRITE_COEF(0x46, 0x0004),
5891		WRITE_COEF(0x1b, 0x0c0b),
5892		{}
5893	};
5894	static const struct coef_fw alc256fw[] = {
5895		WRITE_COEF(0x1b, 0x884b),
5896		WRITE_COEF(0x45, 0xd089),
5897		WRITE_COEF(0x1b, 0x084b),
5898		WRITE_COEF(0x46, 0x0004),
5899		WRITE_COEF(0x1b, 0x0c4b),
5900		{}
5901	};
5902	switch (codec->core.vendor_id) {
5903	case 0x10ec0255:
5904		alc_process_coef_fw(codec, alc255fw);
5905		break;
5906	case 0x10ec0230:
5907	case 0x10ec0236:
5908	case 0x10ec0256:
5909	case 0x19e58326:
5910		alc_process_coef_fw(codec, alc256fw);
5911		break;
5912	}
5913	msleep(30);
5914}
5915
5916static void alc_fixup_headset_mode_alc255(struct hda_codec *codec,
5917				const struct hda_fixup *fix, int action)
5918{
5919	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5920		alc255_set_default_jack_type(codec);
5921	}
5922	alc_fixup_headset_mode(codec, fix, action);
5923}
5924
5925static void alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec,
5926				const struct hda_fixup *fix, int action)
5927{
5928	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5929		struct alc_spec *spec = codec->spec;
5930		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5931		alc255_set_default_jack_type(codec);
5932	}
5933	else
5934		alc_fixup_headset_mode(codec, fix, action);
5935}
5936
5937static void alc288_update_headset_jack_cb(struct hda_codec *codec,
5938				       struct hda_jack_callback *jack)
5939{
5940	struct alc_spec *spec = codec->spec;
5941
5942	alc_update_headset_jack_cb(codec, jack);
5943	/* Headset Mic enable or disable, only for Dell Dino */
5944	alc_update_gpio_data(codec, 0x40, spec->gen.hp_jack_present);
5945}
5946
5947static void alc_fixup_headset_mode_dell_alc288(struct hda_codec *codec,
5948				const struct hda_fixup *fix, int action)
5949{
5950	alc_fixup_headset_mode(codec, fix, action);
5951	if (action == HDA_FIXUP_ACT_PROBE) {
5952		struct alc_spec *spec = codec->spec;
5953		/* toggled via hp_automute_hook */
5954		spec->gpio_mask |= 0x40;
5955		spec->gpio_dir |= 0x40;
5956		spec->gen.hp_automute_hook = alc288_update_headset_jack_cb;
5957	}
5958}
5959
5960static void alc_fixup_auto_mute_via_amp(struct hda_codec *codec,
5961					const struct hda_fixup *fix, int action)
5962{
5963	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5964		struct alc_spec *spec = codec->spec;
5965		spec->gen.auto_mute_via_amp = 1;
5966	}
5967}
5968
5969static void alc_fixup_no_shutup(struct hda_codec *codec,
5970				const struct hda_fixup *fix, int action)
5971{
5972	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5973		struct alc_spec *spec = codec->spec;
5974		spec->no_shutup_pins = 1;
5975	}
5976}
5977
5978static void alc_fixup_disable_aamix(struct hda_codec *codec,
5979				    const struct hda_fixup *fix, int action)
5980{
5981	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5982		struct alc_spec *spec = codec->spec;
5983		/* Disable AA-loopback as it causes white noise */
5984		spec->gen.mixer_nid = 0;
5985	}
5986}
5987
5988/* fixup for Thinkpad docks: add dock pins, avoid HP parser fixup */
5989static void alc_fixup_tpt440_dock(struct hda_codec *codec,
5990				  const struct hda_fixup *fix, int action)
5991{
5992	static const struct hda_pintbl pincfgs[] = {
5993		{ 0x16, 0x21211010 }, /* dock headphone */
5994		{ 0x19, 0x21a11010 }, /* dock mic */
5995		{ }
5996	};
5997	struct alc_spec *spec = codec->spec;
5998
5999	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6000		spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
6001		codec->power_save_node = 0; /* avoid click noises */
6002		snd_hda_apply_pincfgs(codec, pincfgs);
6003	}
6004}
6005
6006static void alc_fixup_tpt470_dock(struct hda_codec *codec,
6007				  const struct hda_fixup *fix, int action)
6008{
6009	static const struct hda_pintbl pincfgs[] = {
6010		{ 0x17, 0x21211010 }, /* dock headphone */
6011		{ 0x19, 0x21a11010 }, /* dock mic */
6012		{ }
6013	};
6014	struct alc_spec *spec = codec->spec;
6015
6016	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6017		spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
6018		snd_hda_apply_pincfgs(codec, pincfgs);
6019	} else if (action == HDA_FIXUP_ACT_INIT) {
6020		/* Enable DOCK device */
6021		snd_hda_codec_write(codec, 0x17, 0,
6022			    AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
6023		/* Enable DOCK device */
6024		snd_hda_codec_write(codec, 0x19, 0,
6025			    AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
6026	}
6027}
6028
6029static void alc_fixup_tpt470_dacs(struct hda_codec *codec,
6030				  const struct hda_fixup *fix, int action)
6031{
6032	/* Assure the speaker pin to be coupled with DAC NID 0x03; otherwise
6033	 * the speaker output becomes too low by some reason on Thinkpads with
6034	 * ALC298 codec
6035	 */
6036	static const hda_nid_t preferred_pairs[] = {
6037		0x14, 0x03, 0x17, 0x02, 0x21, 0x02,
6038		0
6039	};
6040	struct alc_spec *spec = codec->spec;
6041
6042	if (action == HDA_FIXUP_ACT_PRE_PROBE)
6043		spec->gen.preferred_dacs = preferred_pairs;
6044}
6045
6046static void alc295_fixup_asus_dacs(struct hda_codec *codec,
6047				   const struct hda_fixup *fix, int action)
6048{
6049	static const hda_nid_t preferred_pairs[] = {
6050		0x17, 0x02, 0x21, 0x03, 0
6051	};
6052	struct alc_spec *spec = codec->spec;
6053
6054	if (action == HDA_FIXUP_ACT_PRE_PROBE)
6055		spec->gen.preferred_dacs = preferred_pairs;
6056}
6057
6058static void alc_shutup_dell_xps13(struct hda_codec *codec)
6059{
6060	struct alc_spec *spec = codec->spec;
6061	int hp_pin = alc_get_hp_pin(spec);
6062
6063	/* Prevent pop noises when headphones are plugged in */
6064	snd_hda_codec_write(codec, hp_pin, 0,
6065			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
6066	msleep(20);
6067}
6068
6069static void alc_fixup_dell_xps13(struct hda_codec *codec,
6070				const struct hda_fixup *fix, int action)
6071{
6072	struct alc_spec *spec = codec->spec;
6073	struct hda_input_mux *imux = &spec->gen.input_mux;
6074	int i;
6075
6076	switch (action) {
6077	case HDA_FIXUP_ACT_PRE_PROBE:
6078		/* mic pin 0x19 must be initialized with Vref Hi-Z, otherwise
6079		 * it causes a click noise at start up
6080		 */
6081		snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
6082		spec->shutup = alc_shutup_dell_xps13;
6083		break;
6084	case HDA_FIXUP_ACT_PROBE:
6085		/* Make the internal mic the default input source. */
6086		for (i = 0; i < imux->num_items; i++) {
6087			if (spec->gen.imux_pins[i] == 0x12) {
6088				spec->gen.cur_mux[0] = i;
6089				break;
6090			}
6091		}
6092		break;
6093	}
6094}
6095
6096static void alc_fixup_headset_mode_alc662(struct hda_codec *codec,
6097				const struct hda_fixup *fix, int action)
6098{
6099	struct alc_spec *spec = codec->spec;
6100
6101	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6102		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
6103		spec->gen.hp_mic = 1; /* Mic-in is same pin as headphone */
6104
6105		/* Disable boost for mic-in permanently. (This code is only called
6106		   from quirks that guarantee that the headphone is at NID 0x1b.) */
6107		snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000);
6108		snd_hda_override_wcaps(codec, 0x1b, get_wcaps(codec, 0x1b) & ~AC_WCAP_IN_AMP);
6109	} else
6110		alc_fixup_headset_mode(codec, fix, action);
6111}
6112
6113static void alc_fixup_headset_mode_alc668(struct hda_codec *codec,
6114				const struct hda_fixup *fix, int action)
6115{
6116	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6117		alc_write_coef_idx(codec, 0xc4, 0x8000);
6118		alc_update_coef_idx(codec, 0xc2, ~0xfe, 0);
6119		snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
6120	}
6121	alc_fixup_headset_mode(codec, fix, action);
6122}
6123
6124/* Returns the nid of the external mic input pin, or 0 if it cannot be found. */
6125static int find_ext_mic_pin(struct hda_codec *codec)
6126{
6127	struct alc_spec *spec = codec->spec;
6128	struct auto_pin_cfg *cfg = &spec->gen.autocfg;
6129	hda_nid_t nid;
6130	unsigned int defcfg;
6131	int i;
6132
6133	for (i = 0; i < cfg->num_inputs; i++) {
6134		if (cfg->inputs[i].type != AUTO_PIN_MIC)
6135			continue;
6136		nid = cfg->inputs[i].pin;
6137		defcfg = snd_hda_codec_get_pincfg(codec, nid);
6138		if (snd_hda_get_input_pin_attr(defcfg) == INPUT_PIN_ATTR_INT)
6139			continue;
6140		return nid;
6141	}
6142
6143	return 0;
6144}
6145
6146static void alc271_hp_gate_mic_jack(struct hda_codec *codec,
6147				    const struct hda_fixup *fix,
6148				    int action)
6149{
6150	struct alc_spec *spec = codec->spec;
6151
6152	if (action == HDA_FIXUP_ACT_PROBE) {
6153		int mic_pin = find_ext_mic_pin(codec);
6154		int hp_pin = alc_get_hp_pin(spec);
6155
6156		if (snd_BUG_ON(!mic_pin || !hp_pin))
6157			return;
6158		snd_hda_jack_set_gating_jack(codec, mic_pin, hp_pin);
6159	}
6160}
6161
6162static void alc269_fixup_limit_int_mic_boost(struct hda_codec *codec,
6163					     const struct hda_fixup *fix,
6164					     int action)
6165{
6166	struct alc_spec *spec = codec->spec;
6167	struct auto_pin_cfg *cfg = &spec->gen.autocfg;
6168	int i;
6169
6170	/* The mic boosts on level 2 and 3 are too noisy
6171	   on the internal mic input.
6172	   Therefore limit the boost to 0 or 1. */
6173
6174	if (action != HDA_FIXUP_ACT_PROBE)
6175		return;
6176
6177	for (i = 0; i < cfg->num_inputs; i++) {
6178		hda_nid_t nid = cfg->inputs[i].pin;
6179		unsigned int defcfg;
6180		if (cfg->inputs[i].type != AUTO_PIN_MIC)
6181			continue;
6182		defcfg = snd_hda_codec_get_pincfg(codec, nid);
6183		if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
6184			continue;
6185
6186		snd_hda_override_amp_caps(codec, nid, HDA_INPUT,
6187					  (0x00 << AC_AMPCAP_OFFSET_SHIFT) |
6188					  (0x01 << AC_AMPCAP_NUM_STEPS_SHIFT) |
6189					  (0x2f << AC_AMPCAP_STEP_SIZE_SHIFT) |
6190					  (0 << AC_AMPCAP_MUTE_SHIFT));
6191	}
6192}
6193
6194static void alc283_hp_automute_hook(struct hda_codec *codec,
6195				    struct hda_jack_callback *jack)
6196{
6197	struct alc_spec *spec = codec->spec;
6198	int vref;
6199
6200	msleep(200);
6201	snd_hda_gen_hp_automute(codec, jack);
6202
6203	vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
6204
6205	msleep(600);
6206	snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
6207			    vref);
6208}
6209
6210static void alc283_fixup_chromebook(struct hda_codec *codec,
6211				    const struct hda_fixup *fix, int action)
6212{
6213	struct alc_spec *spec = codec->spec;
6214
6215	switch (action) {
6216	case HDA_FIXUP_ACT_PRE_PROBE:
6217		snd_hda_override_wcaps(codec, 0x03, 0);
6218		/* Disable AA-loopback as it causes white noise */
6219		spec->gen.mixer_nid = 0;
6220		break;
6221	case HDA_FIXUP_ACT_INIT:
6222		/* MIC2-VREF control */
6223		/* Set to manual mode */
6224		alc_update_coef_idx(codec, 0x06, 0x000c, 0);
6225		/* Enable Line1 input control by verb */
6226		alc_update_coef_idx(codec, 0x1a, 0, 1 << 4);
6227		break;
6228	}
6229}
6230
6231static void alc283_fixup_sense_combo_jack(struct hda_codec *codec,
6232				    const struct hda_fixup *fix, int action)
6233{
6234	struct alc_spec *spec = codec->spec;
6235
6236	switch (action) {
6237	case HDA_FIXUP_ACT_PRE_PROBE:
6238		spec->gen.hp_automute_hook = alc283_hp_automute_hook;
6239		break;
6240	case HDA_FIXUP_ACT_INIT:
6241		/* MIC2-VREF control */
6242		/* Set to manual mode */
6243		alc_update_coef_idx(codec, 0x06, 0x000c, 0);
6244		break;
6245	}
6246}
6247
6248/* mute tablet speaker pin (0x14) via dock plugging in addition */
6249static void asus_tx300_automute(struct hda_codec *codec)
6250{
6251	struct alc_spec *spec = codec->spec;
6252	snd_hda_gen_update_outputs(codec);
6253	if (snd_hda_jack_detect(codec, 0x1b))
6254		spec->gen.mute_bits |= (1ULL << 0x14);
6255}
6256
6257static void alc282_fixup_asus_tx300(struct hda_codec *codec,
6258				    const struct hda_fixup *fix, int action)
6259{
6260	struct alc_spec *spec = codec->spec;
6261	static const struct hda_pintbl dock_pins[] = {
6262		{ 0x1b, 0x21114000 }, /* dock speaker pin */
6263		{}
6264	};
6265
6266	switch (action) {
6267	case HDA_FIXUP_ACT_PRE_PROBE:
6268		spec->init_amp = ALC_INIT_DEFAULT;
6269		/* TX300 needs to set up GPIO2 for the speaker amp */
6270		alc_setup_gpio(codec, 0x04);
6271		snd_hda_apply_pincfgs(codec, dock_pins);
6272		spec->gen.auto_mute_via_amp = 1;
6273		spec->gen.automute_hook = asus_tx300_automute;
6274		snd_hda_jack_detect_enable_callback(codec, 0x1b,
6275						    snd_hda_gen_hp_automute);
6276		break;
6277	case HDA_FIXUP_ACT_PROBE:
6278		spec->init_amp = ALC_INIT_DEFAULT;
6279		break;
6280	case HDA_FIXUP_ACT_BUILD:
6281		/* this is a bit tricky; give more sane names for the main
6282		 * (tablet) speaker and the dock speaker, respectively
6283		 */
6284		rename_ctl(codec, "Speaker Playback Switch",
6285			   "Dock Speaker Playback Switch");
6286		rename_ctl(codec, "Bass Speaker Playback Switch",
6287			   "Speaker Playback Switch");
6288		break;
6289	}
6290}
6291
6292static void alc290_fixup_mono_speakers(struct hda_codec *codec,
6293				       const struct hda_fixup *fix, int action)
6294{
6295	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6296		/* DAC node 0x03 is giving mono output. We therefore want to
6297		   make sure 0x14 (front speaker) and 0x15 (headphones) use the
6298		   stereo DAC, while leaving 0x17 (bass speaker) for node 0x03. */
6299		static const hda_nid_t conn1[] = { 0x0c };
6300		snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
6301		snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
6302	}
6303}
6304
6305static void alc298_fixup_speaker_volume(struct hda_codec *codec,
6306					const struct hda_fixup *fix, int action)
6307{
6308	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6309		/* The speaker is routed to the Node 0x06 by a mistake, as a result
6310		   we can't adjust the speaker's volume since this node does not has
6311		   Amp-out capability. we change the speaker's route to:
6312		   Node 0x02 (Audio Output) -> Node 0x0c (Audio Mixer) -> Node 0x17 (
6313		   Pin Complex), since Node 0x02 has Amp-out caps, we can adjust
6314		   speaker's volume now. */
6315
6316		static const hda_nid_t conn1[] = { 0x0c };
6317		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn1), conn1);
6318	}
6319}
6320
6321/* disable DAC3 (0x06) selection on NID 0x17 as it has no volume amp control */
6322static void alc295_fixup_disable_dac3(struct hda_codec *codec,
6323				      const struct hda_fixup *fix, int action)
6324{
6325	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6326		static const hda_nid_t conn[] = { 0x02, 0x03 };
6327		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6328	}
6329}
6330
6331/* force NID 0x17 (Bass Speaker) to DAC1 to share it with the main speaker */
6332static void alc285_fixup_speaker2_to_dac1(struct hda_codec *codec,
6333					  const struct hda_fixup *fix, int action)
6334{
6335	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6336		static const hda_nid_t conn[] = { 0x02 };
6337		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6338	}
6339}
6340
6341/* Hook to update amp GPIO4 for automute */
6342static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec,
6343					  struct hda_jack_callback *jack)
6344{
6345	struct alc_spec *spec = codec->spec;
6346
6347	snd_hda_gen_hp_automute(codec, jack);
6348	/* mute_led_polarity is set to 0, so we pass inverted value here */
6349	alc_update_gpio_led(codec, 0x10, spec->mute_led_polarity,
6350			    !spec->gen.hp_jack_present);
6351}
6352
6353/* Manage GPIOs for HP EliteBook Folio 9480m.
6354 *
6355 * GPIO4 is the headphone amplifier power control
6356 * GPIO3 is the audio output mute indicator LED
6357 */
6358
6359static void alc280_fixup_hp_9480m(struct hda_codec *codec,
6360				  const struct hda_fixup *fix,
6361				  int action)
6362{
6363	struct alc_spec *spec = codec->spec;
6364
6365	alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
6366	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6367		/* amp at GPIO4; toggled via alc280_hp_gpio4_automute_hook() */
6368		spec->gpio_mask |= 0x10;
6369		spec->gpio_dir |= 0x10;
6370		spec->gen.hp_automute_hook = alc280_hp_gpio4_automute_hook;
6371	}
6372}
6373
6374static void alc275_fixup_gpio4_off(struct hda_codec *codec,
6375				   const struct hda_fixup *fix,
6376				   int action)
6377{
6378	struct alc_spec *spec = codec->spec;
6379
6380	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6381		spec->gpio_mask |= 0x04;
6382		spec->gpio_dir |= 0x04;
6383		/* set data bit low */
6384	}
6385}
6386
6387/* Quirk for Thinkpad X1 7th and 8th Gen
6388 * The following fixed routing needed
6389 * DAC1 (NID 0x02) -> Speaker (NID 0x14); some eq applied secretly
6390 * DAC2 (NID 0x03) -> Bass (NID 0x17) & Headphone (NID 0x21); sharing a DAC
6391 * DAC3 (NID 0x06) -> Unused, due to the lack of volume amp
6392 */
6393static void alc285_fixup_thinkpad_x1_gen7(struct hda_codec *codec,
6394					  const struct hda_fixup *fix, int action)
6395{
6396	static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */
6397	static const hda_nid_t preferred_pairs[] = {
6398		0x14, 0x02, 0x17, 0x03, 0x21, 0x03, 0
6399	};
6400	struct alc_spec *spec = codec->spec;
6401
6402	switch (action) {
6403	case HDA_FIXUP_ACT_PRE_PROBE:
6404		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6405		spec->gen.preferred_dacs = preferred_pairs;
6406		break;
6407	case HDA_FIXUP_ACT_BUILD:
6408		/* The generic parser creates somewhat unintuitive volume ctls
6409		 * with the fixed routing above, and the shared DAC2 may be
6410		 * confusing for PA.
6411		 * Rename those to unique names so that PA doesn't touch them
6412		 * and use only Master volume.
6413		 */
6414		rename_ctl(codec, "Front Playback Volume", "DAC1 Playback Volume");
6415		rename_ctl(codec, "Bass Speaker Playback Volume", "DAC2 Playback Volume");
6416		break;
6417	}
6418}
6419
6420static void alc233_alc662_fixup_lenovo_dual_codecs(struct hda_codec *codec,
6421					 const struct hda_fixup *fix,
6422					 int action)
6423{
6424	alc_fixup_dual_codecs(codec, fix, action);
6425	switch (action) {
6426	case HDA_FIXUP_ACT_PRE_PROBE:
6427		/* override card longname to provide a unique UCM profile */
6428		strcpy(codec->card->longname, "HDAudio-Lenovo-DualCodecs");
6429		break;
6430	case HDA_FIXUP_ACT_BUILD:
6431		/* rename Capture controls depending on the codec */
6432		rename_ctl(codec, "Capture Volume",
6433			   codec->addr == 0 ?
6434			   "Rear-Panel Capture Volume" :
6435			   "Front-Panel Capture Volume");
6436		rename_ctl(codec, "Capture Switch",
6437			   codec->addr == 0 ?
6438			   "Rear-Panel Capture Switch" :
6439			   "Front-Panel Capture Switch");
6440		break;
6441	}
6442}
6443
6444static void alc225_fixup_s3_pop_noise(struct hda_codec *codec,
6445				      const struct hda_fixup *fix, int action)
6446{
6447	if (action != HDA_FIXUP_ACT_PRE_PROBE)
6448		return;
6449
6450	codec->power_save_node = 1;
6451}
6452
6453/* Forcibly assign NID 0x03 to HP/LO while NID 0x02 to SPK for EQ */
6454static void alc274_fixup_bind_dacs(struct hda_codec *codec,
6455				    const struct hda_fixup *fix, int action)
6456{
6457	struct alc_spec *spec = codec->spec;
6458	static const hda_nid_t preferred_pairs[] = {
6459		0x21, 0x03, 0x1b, 0x03, 0x16, 0x02,
6460		0
6461	};
6462
6463	if (action != HDA_FIXUP_ACT_PRE_PROBE)
6464		return;
6465
6466	spec->gen.preferred_dacs = preferred_pairs;
6467	spec->gen.auto_mute_via_amp = 1;
6468	codec->power_save_node = 0;
6469}
6470
6471/* avoid DAC 0x06 for bass speaker 0x17; it has no volume control */
6472static void alc289_fixup_asus_ga401(struct hda_codec *codec,
6473				    const struct hda_fixup *fix, int action)
6474{
6475	static const hda_nid_t preferred_pairs[] = {
6476		0x14, 0x02, 0x17, 0x02, 0x21, 0x03, 0
6477	};
6478	struct alc_spec *spec = codec->spec;
6479
6480	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6481		spec->gen.preferred_dacs = preferred_pairs;
6482		spec->gen.obey_preferred_dacs = 1;
6483	}
6484}
6485
6486/* The DAC of NID 0x3 will introduce click/pop noise on headphones, so invalidate it */
6487static void alc285_fixup_invalidate_dacs(struct hda_codec *codec,
6488			      const struct hda_fixup *fix, int action)
6489{
6490	if (action != HDA_FIXUP_ACT_PRE_PROBE)
6491		return;
6492
6493	snd_hda_override_wcaps(codec, 0x03, 0);
6494}
6495
6496static void alc_combo_jack_hp_jd_restart(struct hda_codec *codec)
6497{
6498	switch (codec->core.vendor_id) {
6499	case 0x10ec0274:
6500	case 0x10ec0294:
6501	case 0x10ec0225:
6502	case 0x10ec0295:
6503	case 0x10ec0299:
6504		alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15); /* Reset HP JD */
6505		alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15);
6506		break;
6507	case 0x10ec0230:
6508	case 0x10ec0235:
6509	case 0x10ec0236:
6510	case 0x10ec0255:
6511	case 0x10ec0256:
6512	case 0x10ec0257:
6513	case 0x19e58326:
6514		alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15); /* Reset HP JD */
6515		alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15);
6516		break;
6517	}
6518}
6519
6520static void alc295_fixup_chromebook(struct hda_codec *codec,
6521				    const struct hda_fixup *fix, int action)
6522{
6523	struct alc_spec *spec = codec->spec;
6524
6525	switch (action) {
6526	case HDA_FIXUP_ACT_PRE_PROBE:
6527		spec->ultra_low_power = true;
6528		break;
6529	case HDA_FIXUP_ACT_INIT:
6530		alc_combo_jack_hp_jd_restart(codec);
6531		break;
6532	}
6533}
6534
6535static void alc_fixup_disable_mic_vref(struct hda_codec *codec,
6536				  const struct hda_fixup *fix, int action)
6537{
6538	if (action == HDA_FIXUP_ACT_PRE_PROBE)
6539		snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
6540}
6541
6542
6543static void alc294_gx502_toggle_output(struct hda_codec *codec,
6544					struct hda_jack_callback *cb)
6545{
6546	/* The Windows driver sets the codec up in a very different way where
6547	 * it appears to leave 0x10 = 0x8a20 set. For Linux we need to toggle it
6548	 */
6549	if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
6550		alc_write_coef_idx(codec, 0x10, 0x8a20);
6551	else
6552		alc_write_coef_idx(codec, 0x10, 0x0a20);
6553}
6554
6555static void alc294_fixup_gx502_hp(struct hda_codec *codec,
6556					const struct hda_fixup *fix, int action)
6557{
6558	/* Pin 0x21: headphones/headset mic */
6559	if (!is_jack_detectable(codec, 0x21))
6560		return;
6561
6562	switch (action) {
6563	case HDA_FIXUP_ACT_PRE_PROBE:
6564		snd_hda_jack_detect_enable_callback(codec, 0x21,
6565				alc294_gx502_toggle_output);
6566		break;
6567	case HDA_FIXUP_ACT_INIT:
6568		/* Make sure to start in a correct state, i.e. if
6569		 * headphones have been plugged in before powering up the system
6570		 */
6571		alc294_gx502_toggle_output(codec, NULL);
6572		break;
6573	}
6574}
6575
6576static void alc294_gu502_toggle_output(struct hda_codec *codec,
6577				       struct hda_jack_callback *cb)
6578{
6579	/* Windows sets 0x10 to 0x8420 for Node 0x20 which is
6580	 * responsible from changes between speakers and headphones
6581	 */
6582	if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
6583		alc_write_coef_idx(codec, 0x10, 0x8420);
6584	else
6585		alc_write_coef_idx(codec, 0x10, 0x0a20);
6586}
6587
6588static void alc294_fixup_gu502_hp(struct hda_codec *codec,
6589				  const struct hda_fixup *fix, int action)
6590{
6591	if (!is_jack_detectable(codec, 0x21))
6592		return;
6593
6594	switch (action) {
6595	case HDA_FIXUP_ACT_PRE_PROBE:
6596		snd_hda_jack_detect_enable_callback(codec, 0x21,
6597				alc294_gu502_toggle_output);
6598		break;
6599	case HDA_FIXUP_ACT_INIT:
6600		alc294_gu502_toggle_output(codec, NULL);
6601		break;
6602	}
6603}
6604
6605static void  alc285_fixup_hp_gpio_amp_init(struct hda_codec *codec,
6606			      const struct hda_fixup *fix, int action)
6607{
6608	if (action != HDA_FIXUP_ACT_INIT)
6609		return;
6610
6611	msleep(100);
6612	alc_write_coef_idx(codec, 0x65, 0x0);
6613}
6614
6615static void alc274_fixup_hp_headset_mic(struct hda_codec *codec,
6616				    const struct hda_fixup *fix, int action)
6617{
6618	switch (action) {
6619	case HDA_FIXUP_ACT_INIT:
6620		alc_combo_jack_hp_jd_restart(codec);
6621		break;
6622	}
6623}
6624
6625static void alc_fixup_no_int_mic(struct hda_codec *codec,
6626				    const struct hda_fixup *fix, int action)
6627{
6628	struct alc_spec *spec = codec->spec;
6629
6630	switch (action) {
6631	case HDA_FIXUP_ACT_PRE_PROBE:
6632		/* Mic RING SLEEVE swap for combo jack */
6633		alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
6634		spec->no_internal_mic_pin = true;
6635		break;
6636	case HDA_FIXUP_ACT_INIT:
6637		alc_combo_jack_hp_jd_restart(codec);
6638		break;
6639	}
6640}
6641
6642/* GPIO1 = amplifier on/off
6643 * GPIO3 = mic mute LED
6644 */
6645static void alc285_fixup_hp_spectre_x360_eb1(struct hda_codec *codec,
6646					  const struct hda_fixup *fix, int action)
6647{
6648	static const hda_nid_t conn[] = { 0x02 };
6649
6650	struct alc_spec *spec = codec->spec;
6651	static const struct hda_pintbl pincfgs[] = {
6652		{ 0x14, 0x90170110 },  /* front/high speakers */
6653		{ 0x17, 0x90170130 },  /* back/bass speakers */
6654		{ }
6655	};
6656
6657	//enable micmute led
6658	alc_fixup_hp_gpio_led(codec, action, 0x00, 0x04);
6659
6660	switch (action) {
6661	case HDA_FIXUP_ACT_PRE_PROBE:
6662		spec->micmute_led_polarity = 1;
6663		/* needed for amp of back speakers */
6664		spec->gpio_mask |= 0x01;
6665		spec->gpio_dir |= 0x01;
6666		snd_hda_apply_pincfgs(codec, pincfgs);
6667		/* share DAC to have unified volume control */
6668		snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
6669		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6670		break;
6671	case HDA_FIXUP_ACT_INIT:
6672		/* need to toggle GPIO to enable the amp of back speakers */
6673		alc_update_gpio_data(codec, 0x01, true);
6674		msleep(100);
6675		alc_update_gpio_data(codec, 0x01, false);
6676		break;
6677	}
6678}
6679
6680static void alc285_fixup_hp_spectre_x360(struct hda_codec *codec,
6681					  const struct hda_fixup *fix, int action)
6682{
6683	static const hda_nid_t conn[] = { 0x02 };
6684	static const struct hda_pintbl pincfgs[] = {
6685		{ 0x14, 0x90170110 },  /* rear speaker */
6686		{ }
6687	};
6688
6689	switch (action) {
6690	case HDA_FIXUP_ACT_PRE_PROBE:
6691		snd_hda_apply_pincfgs(codec, pincfgs);
6692		/* force front speaker to DAC1 */
6693		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6694		break;
6695	}
6696}
6697
6698static void alc285_fixup_hp_envy_x360(struct hda_codec *codec,
6699				      const struct hda_fixup *fix,
6700				      int action)
6701{
6702	static const struct coef_fw coefs[] = {
6703		WRITE_COEF(0x08, 0x6a0c), WRITE_COEF(0x0d, 0xa023),
6704		WRITE_COEF(0x10, 0x0320), WRITE_COEF(0x1a, 0x8c03),
6705		WRITE_COEF(0x25, 0x1800), WRITE_COEF(0x26, 0x003a),
6706		WRITE_COEF(0x28, 0x1dfe), WRITE_COEF(0x29, 0xb014),
6707		WRITE_COEF(0x2b, 0x1dfe), WRITE_COEF(0x37, 0xfe15),
6708		WRITE_COEF(0x38, 0x7909), WRITE_COEF(0x45, 0xd489),
6709		WRITE_COEF(0x46, 0x00f4), WRITE_COEF(0x4a, 0x21e0),
6710		WRITE_COEF(0x66, 0x03f0), WRITE_COEF(0x67, 0x1000),
6711		WRITE_COEF(0x6e, 0x1005), { }
6712	};
6713
6714	static const struct hda_pintbl pincfgs[] = {
6715		{ 0x12, 0xb7a60130 },  /* Internal microphone*/
6716		{ 0x14, 0x90170150 },  /* B&O soundbar speakers */
6717		{ 0x17, 0x90170153 },  /* Side speakers */
6718		{ 0x19, 0x03a11040 },  /* Headset microphone */
6719		{ }
6720	};
6721
6722	switch (action) {
6723	case HDA_FIXUP_ACT_PRE_PROBE:
6724		snd_hda_apply_pincfgs(codec, pincfgs);
6725
6726		/* Fixes volume control problem for side speakers */
6727		alc295_fixup_disable_dac3(codec, fix, action);
6728
6729		/* Fixes no sound from headset speaker */
6730		snd_hda_codec_amp_stereo(codec, 0x21, HDA_OUTPUT, 0, -1, 0);
6731
6732		/* Auto-enable headset mic when plugged */
6733		snd_hda_jack_set_gating_jack(codec, 0x19, 0x21);
6734
6735		/* Headset mic volume enhancement */
6736		snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREF50);
6737		break;
6738	case HDA_FIXUP_ACT_INIT:
6739		alc_process_coef_fw(codec, coefs);
6740		break;
6741	case HDA_FIXUP_ACT_BUILD:
6742		rename_ctl(codec, "Bass Speaker Playback Volume",
6743			   "B&O-Tuned Playback Volume");
6744		rename_ctl(codec, "Front Playback Switch",
6745			   "B&O Soundbar Playback Switch");
6746		rename_ctl(codec, "Bass Speaker Playback Switch",
6747			   "Side Speaker Playback Switch");
6748		break;
6749	}
6750}
6751
6752/* for hda_fixup_thinkpad_acpi() */
6753#include "thinkpad_helper.c"
6754
6755static void alc_fixup_thinkpad_acpi(struct hda_codec *codec,
6756				    const struct hda_fixup *fix, int action)
6757{
6758	alc_fixup_no_shutup(codec, fix, action); /* reduce click noise */
6759	hda_fixup_thinkpad_acpi(codec, fix, action);
6760}
6761
6762/* Fixup for Lenovo Legion 15IMHg05 speaker output on headset removal. */
6763static void alc287_fixup_legion_15imhg05_speakers(struct hda_codec *codec,
6764						  const struct hda_fixup *fix,
6765						  int action)
6766{
6767	struct alc_spec *spec = codec->spec;
6768
6769	switch (action) {
6770	case HDA_FIXUP_ACT_PRE_PROBE:
6771		spec->gen.suppress_auto_mute = 1;
6772		break;
6773	}
6774}
6775
6776static int comp_bind(struct device *dev)
6777{
6778	struct hda_codec *cdc = dev_to_hda_codec(dev);
6779	struct alc_spec *spec = cdc->spec;
6780
6781	return component_bind_all(dev, spec->comps);
6782}
6783
6784static void comp_unbind(struct device *dev)
6785{
6786	struct hda_codec *cdc = dev_to_hda_codec(dev);
6787	struct alc_spec *spec = cdc->spec;
6788
6789	component_unbind_all(dev, spec->comps);
6790}
6791
6792static const struct component_master_ops comp_master_ops = {
6793	.bind = comp_bind,
6794	.unbind = comp_unbind,
6795};
6796
6797static void comp_generic_playback_hook(struct hda_pcm_stream *hinfo, struct hda_codec *cdc,
6798				       struct snd_pcm_substream *sub, int action)
6799{
6800	struct alc_spec *spec = cdc->spec;
6801	int i;
6802
6803	for (i = 0; i < HDA_MAX_COMPONENTS; i++) {
6804		if (spec->comps[i].dev && spec->comps[i].pre_playback_hook)
6805			spec->comps[i].pre_playback_hook(spec->comps[i].dev, action);
6806	}
6807	for (i = 0; i < HDA_MAX_COMPONENTS; i++) {
6808		if (spec->comps[i].dev && spec->comps[i].playback_hook)
6809			spec->comps[i].playback_hook(spec->comps[i].dev, action);
6810	}
6811	for (i = 0; i < HDA_MAX_COMPONENTS; i++) {
6812		if (spec->comps[i].dev && spec->comps[i].post_playback_hook)
6813			spec->comps[i].post_playback_hook(spec->comps[i].dev, action);
6814	}
6815}
6816
6817struct scodec_dev_name {
6818	const char *bus;
6819	const char *hid;
6820	int index;
6821};
6822
6823/* match the device name in a slightly relaxed manner */
6824static int comp_match_cs35l41_dev_name(struct device *dev, void *data)
6825{
6826	struct scodec_dev_name *p = data;
6827	const char *d = dev_name(dev);
6828	int n = strlen(p->bus);
6829	char tmp[32];
6830
6831	/* check the bus name */
6832	if (strncmp(d, p->bus, n))
6833		return 0;
6834	/* skip the bus number */
6835	if (isdigit(d[n]))
6836		n++;
6837	/* the rest must be exact matching */
6838	snprintf(tmp, sizeof(tmp), "-%s:00-cs35l41-hda.%d", p->hid, p->index);
6839	return !strcmp(d + n, tmp);
6840}
6841
6842static int comp_match_tas2781_dev_name(struct device *dev,
6843	void *data)
6844{
6845	struct scodec_dev_name *p = data;
6846	const char *d = dev_name(dev);
6847	int n = strlen(p->bus);
6848	char tmp[32];
6849
6850	/* check the bus name */
6851	if (strncmp(d, p->bus, n))
6852		return 0;
6853	/* skip the bus number */
6854	if (isdigit(d[n]))
6855		n++;
6856	/* the rest must be exact matching */
6857	snprintf(tmp, sizeof(tmp), "-%s:00", p->hid);
6858
6859	return !strcmp(d + n, tmp);
6860}
6861
6862static void cs35l41_generic_fixup(struct hda_codec *cdc, int action, const char *bus,
6863				  const char *hid, int count)
6864{
6865	struct device *dev = hda_codec_dev(cdc);
6866	struct alc_spec *spec = cdc->spec;
6867	struct scodec_dev_name *rec;
6868	int ret, i;
6869
6870	switch (action) {
6871	case HDA_FIXUP_ACT_PRE_PROBE:
6872		for (i = 0; i < count; i++) {
6873			rec = devm_kmalloc(dev, sizeof(*rec), GFP_KERNEL);
6874			if (!rec)
6875				return;
6876			rec->bus = bus;
6877			rec->hid = hid;
6878			rec->index = i;
6879			spec->comps[i].codec = cdc;
6880			component_match_add(dev, &spec->match,
6881					    comp_match_cs35l41_dev_name, rec);
6882		}
6883		ret = component_master_add_with_match(dev, &comp_master_ops, spec->match);
6884		if (ret)
6885			codec_err(cdc, "Fail to register component aggregator %d\n", ret);
6886		else
6887			spec->gen.pcm_playback_hook = comp_generic_playback_hook;
6888		break;
6889	case HDA_FIXUP_ACT_FREE:
6890		component_master_del(dev, &comp_master_ops);
6891		break;
6892	}
6893}
6894
6895static void tas2781_generic_fixup(struct hda_codec *cdc, int action,
6896	const char *bus, const char *hid)
6897{
6898	struct device *dev = hda_codec_dev(cdc);
6899	struct alc_spec *spec = cdc->spec;
6900	struct scodec_dev_name *rec;
6901	int ret;
6902
6903	switch (action) {
6904	case HDA_FIXUP_ACT_PRE_PROBE:
6905		rec = devm_kmalloc(dev, sizeof(*rec), GFP_KERNEL);
6906		if (!rec)
6907			return;
6908		rec->bus = bus;
6909		rec->hid = hid;
6910		rec->index = 0;
6911		spec->comps[0].codec = cdc;
6912		component_match_add(dev, &spec->match,
6913			comp_match_tas2781_dev_name, rec);
6914		ret = component_master_add_with_match(dev, &comp_master_ops,
6915			spec->match);
6916		if (ret)
6917			codec_err(cdc,
6918				"Fail to register component aggregator %d\n",
6919				ret);
6920		else
6921			spec->gen.pcm_playback_hook =
6922				comp_generic_playback_hook;
6923		break;
6924	case HDA_FIXUP_ACT_FREE:
6925		component_master_del(dev, &comp_master_ops);
6926		break;
6927	}
6928}
6929
6930static void cs35l41_fixup_i2c_two(struct hda_codec *cdc, const struct hda_fixup *fix, int action)
6931{
6932	cs35l41_generic_fixup(cdc, action, "i2c", "CSC3551", 2);
6933}
6934
6935static void cs35l41_fixup_spi_two(struct hda_codec *codec, const struct hda_fixup *fix, int action)
6936{
6937	cs35l41_generic_fixup(codec, action, "spi", "CSC3551", 2);
6938}
6939
6940static void cs35l41_fixup_spi_four(struct hda_codec *codec, const struct hda_fixup *fix, int action)
6941{
6942	cs35l41_generic_fixup(codec, action, "spi", "CSC3551", 4);
6943}
6944
6945static void alc287_fixup_legion_16achg6_speakers(struct hda_codec *cdc, const struct hda_fixup *fix,
6946						 int action)
6947{
6948	cs35l41_generic_fixup(cdc, action, "i2c", "CLSA0100", 2);
6949}
6950
6951static void alc287_fixup_legion_16ithg6_speakers(struct hda_codec *cdc, const struct hda_fixup *fix,
6952						 int action)
6953{
6954	cs35l41_generic_fixup(cdc, action, "i2c", "CLSA0101", 2);
6955}
6956
6957static void tas2781_fixup_i2c(struct hda_codec *cdc,
6958	const struct hda_fixup *fix, int action)
6959{
6960	 tas2781_generic_fixup(cdc, action, "i2c", "TIAS2781");
6961}
6962
6963/* for alc295_fixup_hp_top_speakers */
6964#include "hp_x360_helper.c"
6965
6966/* for alc285_fixup_ideapad_s740_coef() */
6967#include "ideapad_s740_helper.c"
6968
6969static const struct coef_fw alc256_fixup_set_coef_defaults_coefs[] = {
6970	WRITE_COEF(0x10, 0x0020), WRITE_COEF(0x24, 0x0000),
6971	WRITE_COEF(0x26, 0x0000), WRITE_COEF(0x29, 0x3000),
6972	WRITE_COEF(0x37, 0xfe05), WRITE_COEF(0x45, 0x5089),
6973	{}
6974};
6975
6976static void alc256_fixup_set_coef_defaults(struct hda_codec *codec,
6977					   const struct hda_fixup *fix,
6978					   int action)
6979{
6980	/*
6981	 * A certain other OS sets these coeffs to different values. On at least
6982	 * one TongFang barebone these settings might survive even a cold
6983	 * reboot. So to restore a clean slate the values are explicitly reset
6984	 * to default here. Without this, the external microphone is always in a
6985	 * plugged-in state, while the internal microphone is always in an
6986	 * unplugged state, breaking the ability to use the internal microphone.
6987	 */
6988	alc_process_coef_fw(codec, alc256_fixup_set_coef_defaults_coefs);
6989}
6990
6991static const struct coef_fw alc233_fixup_no_audio_jack_coefs[] = {
6992	WRITE_COEF(0x1a, 0x9003), WRITE_COEF(0x1b, 0x0e2b), WRITE_COEF(0x37, 0xfe06),
6993	WRITE_COEF(0x38, 0x4981), WRITE_COEF(0x45, 0xd489), WRITE_COEF(0x46, 0x0074),
6994	WRITE_COEF(0x49, 0x0149),
6995	{}
6996};
6997
6998static void alc233_fixup_no_audio_jack(struct hda_codec *codec,
6999				       const struct hda_fixup *fix,
7000				       int action)
7001{
7002	/*
7003	 * The audio jack input and output is not detected on the ASRock NUC Box
7004	 * 1100 series when cold booting without this fix. Warm rebooting from a
7005	 * certain other OS makes the audio functional, as COEF settings are
7006	 * preserved in this case. This fix sets these altered COEF values as
7007	 * the default.
7008	 */
7009	alc_process_coef_fw(codec, alc233_fixup_no_audio_jack_coefs);
7010}
7011
7012static void alc256_fixup_mic_no_presence_and_resume(struct hda_codec *codec,
7013						    const struct hda_fixup *fix,
7014						    int action)
7015{
7016	/*
7017	 * The Clevo NJ51CU comes either with the ALC293 or the ALC256 codec,
7018	 * but uses the 0x8686 subproduct id in both cases. The ALC256 codec
7019	 * needs an additional quirk for sound working after suspend and resume.
7020	 */
7021	if (codec->core.vendor_id == 0x10ec0256) {
7022		alc_update_coef_idx(codec, 0x10, 1<<9, 0);
7023		snd_hda_codec_set_pincfg(codec, 0x19, 0x04a11120);
7024	} else {
7025		snd_hda_codec_set_pincfg(codec, 0x1a, 0x04a1113c);
7026	}
7027}
7028
7029static void alc_fixup_dell4_mic_no_presence_quiet(struct hda_codec *codec,
7030						  const struct hda_fixup *fix,
7031						  int action)
7032{
7033	struct alc_spec *spec = codec->spec;
7034	struct hda_input_mux *imux = &spec->gen.input_mux;
7035	int i;
7036
7037	alc269_fixup_limit_int_mic_boost(codec, fix, action);
7038
7039	switch (action) {
7040	case HDA_FIXUP_ACT_PRE_PROBE:
7041		/**
7042		 * Set the vref of pin 0x19 (Headset Mic) and pin 0x1b (Headphone Mic)
7043		 * to Hi-Z to avoid pop noises at startup and when plugging and
7044		 * unplugging headphones.
7045		 */
7046		snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
7047		snd_hda_codec_set_pin_target(codec, 0x1b, PIN_VREFHIZ);
7048		break;
7049	case HDA_FIXUP_ACT_PROBE:
7050		/**
7051		 * Make the internal mic (0x12) the default input source to
7052		 * prevent pop noises on cold boot.
7053		 */
7054		for (i = 0; i < imux->num_items; i++) {
7055			if (spec->gen.imux_pins[i] == 0x12) {
7056				spec->gen.cur_mux[0] = i;
7057				break;
7058			}
7059		}
7060		break;
7061	}
7062}
7063
7064static void alc287_fixup_yoga9_14iap7_bass_spk_pin(struct hda_codec *codec,
7065					  const struct hda_fixup *fix, int action)
7066{
7067	/*
7068	 * The Pin Complex 0x17 for the bass speakers is wrongly reported as
7069	 * unconnected.
7070	 */
7071	static const struct hda_pintbl pincfgs[] = {
7072		{ 0x17, 0x90170121 },
7073		{ }
7074	};
7075	/*
7076	 * Avoid DAC 0x06 and 0x08, as they have no volume controls.
7077	 * DAC 0x02 and 0x03 would be fine.
7078	 */
7079	static const hda_nid_t conn[] = { 0x02, 0x03 };
7080	/*
7081	 * Prefer both speakerbar (0x14) and bass speakers (0x17) connected to DAC 0x02.
7082	 * Headphones (0x21) are connected to DAC 0x03.
7083	 */
7084	static const hda_nid_t preferred_pairs[] = {
7085		0x14, 0x02,
7086		0x17, 0x02,
7087		0x21, 0x03,
7088		0
7089	};
7090	struct alc_spec *spec = codec->spec;
7091
7092	switch (action) {
7093	case HDA_FIXUP_ACT_PRE_PROBE:
7094		snd_hda_apply_pincfgs(codec, pincfgs);
7095		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
7096		spec->gen.preferred_dacs = preferred_pairs;
7097		break;
7098	}
7099}
7100
7101static void alc295_fixup_dell_inspiron_top_speakers(struct hda_codec *codec,
7102					  const struct hda_fixup *fix, int action)
7103{
7104	static const struct hda_pintbl pincfgs[] = {
7105		{ 0x14, 0x90170151 },
7106		{ 0x17, 0x90170150 },
7107		{ }
7108	};
7109	static const hda_nid_t conn[] = { 0x02, 0x03 };
7110	static const hda_nid_t preferred_pairs[] = {
7111		0x14, 0x02,
7112		0x17, 0x03,
7113		0x21, 0x02,
7114		0
7115	};
7116	struct alc_spec *spec = codec->spec;
7117
7118	alc_fixup_no_shutup(codec, fix, action);
7119
7120	switch (action) {
7121	case HDA_FIXUP_ACT_PRE_PROBE:
7122		snd_hda_apply_pincfgs(codec, pincfgs);
7123		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
7124		spec->gen.preferred_dacs = preferred_pairs;
7125		break;
7126	}
7127}
7128
7129/* Forcibly assign NID 0x03 to HP while NID 0x02 to SPK */
7130static void alc287_fixup_bind_dacs(struct hda_codec *codec,
7131				    const struct hda_fixup *fix, int action)
7132{
7133	struct alc_spec *spec = codec->spec;
7134	static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */
7135	static const hda_nid_t preferred_pairs[] = {
7136		0x17, 0x02, 0x21, 0x03, 0
7137	};
7138
7139	if (action != HDA_FIXUP_ACT_PRE_PROBE)
7140		return;
7141
7142	snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
7143	spec->gen.preferred_dacs = preferred_pairs;
7144	spec->gen.auto_mute_via_amp = 1;
7145	if (spec->gen.autocfg.speaker_pins[0] != 0x14) {
7146		snd_hda_codec_write_cache(codec, 0x14, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
7147					0x0); /* Make sure 0x14 was disable */
7148	}
7149}
7150/* Fix none verb table of Headset Mic pin */
7151static void alc_fixup_headset_mic(struct hda_codec *codec,
7152				   const struct hda_fixup *fix, int action)
7153{
7154	struct alc_spec *spec = codec->spec;
7155	static const struct hda_pintbl pincfgs[] = {
7156		{ 0x19, 0x03a1103c },
7157		{ }
7158	};
7159
7160	switch (action) {
7161	case HDA_FIXUP_ACT_PRE_PROBE:
7162		snd_hda_apply_pincfgs(codec, pincfgs);
7163		alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
7164		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
7165		break;
7166	}
7167}
7168
7169
7170enum {
7171	ALC269_FIXUP_GPIO2,
7172	ALC269_FIXUP_SONY_VAIO,
7173	ALC275_FIXUP_SONY_VAIO_GPIO2,
7174	ALC269_FIXUP_DELL_M101Z,
7175	ALC269_FIXUP_SKU_IGNORE,
7176	ALC269_FIXUP_ASUS_G73JW,
7177	ALC269_FIXUP_ASUS_N7601ZM_PINS,
7178	ALC269_FIXUP_ASUS_N7601ZM,
7179	ALC269_FIXUP_LENOVO_EAPD,
7180	ALC275_FIXUP_SONY_HWEQ,
7181	ALC275_FIXUP_SONY_DISABLE_AAMIX,
7182	ALC271_FIXUP_DMIC,
7183	ALC269_FIXUP_PCM_44K,
7184	ALC269_FIXUP_STEREO_DMIC,
7185	ALC269_FIXUP_HEADSET_MIC,
7186	ALC269_FIXUP_QUANTA_MUTE,
7187	ALC269_FIXUP_LIFEBOOK,
7188	ALC269_FIXUP_LIFEBOOK_EXTMIC,
7189	ALC269_FIXUP_LIFEBOOK_HP_PIN,
7190	ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT,
7191	ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC,
7192	ALC269_FIXUP_AMIC,
7193	ALC269_FIXUP_DMIC,
7194	ALC269VB_FIXUP_AMIC,
7195	ALC269VB_FIXUP_DMIC,
7196	ALC269_FIXUP_HP_MUTE_LED,
7197	ALC269_FIXUP_HP_MUTE_LED_MIC1,
7198	ALC269_FIXUP_HP_MUTE_LED_MIC2,
7199	ALC269_FIXUP_HP_MUTE_LED_MIC3,
7200	ALC269_FIXUP_HP_GPIO_LED,
7201	ALC269_FIXUP_HP_GPIO_MIC1_LED,
7202	ALC269_FIXUP_HP_LINE1_MIC1_LED,
7203	ALC269_FIXUP_INV_DMIC,
7204	ALC269_FIXUP_LENOVO_DOCK,
7205	ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST,
7206	ALC269_FIXUP_NO_SHUTUP,
7207	ALC286_FIXUP_SONY_MIC_NO_PRESENCE,
7208	ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
7209	ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
7210	ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
7211	ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
7212	ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
7213	ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET,
7214	ALC269_FIXUP_HEADSET_MODE,
7215	ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
7216	ALC269_FIXUP_ASPIRE_HEADSET_MIC,
7217	ALC269_FIXUP_ASUS_X101_FUNC,
7218	ALC269_FIXUP_ASUS_X101_VERB,
7219	ALC269_FIXUP_ASUS_X101,
7220	ALC271_FIXUP_AMIC_MIC2,
7221	ALC271_FIXUP_HP_GATE_MIC_JACK,
7222	ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572,
7223	ALC269_FIXUP_ACER_AC700,
7224	ALC269_FIXUP_LIMIT_INT_MIC_BOOST,
7225	ALC269VB_FIXUP_ASUS_ZENBOOK,
7226	ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A,
7227	ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE,
7228	ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED,
7229	ALC269VB_FIXUP_ORDISSIMO_EVE2,
7230	ALC283_FIXUP_CHROME_BOOK,
7231	ALC283_FIXUP_SENSE_COMBO_JACK,
7232	ALC282_FIXUP_ASUS_TX300,
7233	ALC283_FIXUP_INT_MIC,
7234	ALC290_FIXUP_MONO_SPEAKERS,
7235	ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
7236	ALC290_FIXUP_SUBWOOFER,
7237	ALC290_FIXUP_SUBWOOFER_HSJACK,
7238	ALC269_FIXUP_THINKPAD_ACPI,
7239	ALC269_FIXUP_DMIC_THINKPAD_ACPI,
7240	ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO,
7241	ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
7242	ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
7243	ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7244	ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
7245	ALC255_FIXUP_HEADSET_MODE,
7246	ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,
7247	ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
7248	ALC292_FIXUP_TPT440_DOCK,
7249	ALC292_FIXUP_TPT440,
7250	ALC283_FIXUP_HEADSET_MIC,
7251	ALC255_FIXUP_MIC_MUTE_LED,
7252	ALC282_FIXUP_ASPIRE_V5_PINS,
7253	ALC269VB_FIXUP_ASPIRE_E1_COEF,
7254	ALC280_FIXUP_HP_GPIO4,
7255	ALC286_FIXUP_HP_GPIO_LED,
7256	ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY,
7257	ALC280_FIXUP_HP_DOCK_PINS,
7258	ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED,
7259	ALC280_FIXUP_HP_9480M,
7260	ALC245_FIXUP_HP_X360_AMP,
7261	ALC285_FIXUP_HP_SPECTRE_X360_EB1,
7262	ALC285_FIXUP_HP_ENVY_X360,
7263	ALC288_FIXUP_DELL_HEADSET_MODE,
7264	ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
7265	ALC288_FIXUP_DELL_XPS_13,
7266	ALC288_FIXUP_DISABLE_AAMIX,
7267	ALC292_FIXUP_DELL_E7X_AAMIX,
7268	ALC292_FIXUP_DELL_E7X,
7269	ALC292_FIXUP_DISABLE_AAMIX,
7270	ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK,
7271	ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
7272	ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
7273	ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
7274	ALC275_FIXUP_DELL_XPS,
7275	ALC293_FIXUP_LENOVO_SPK_NOISE,
7276	ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
7277	ALC255_FIXUP_DELL_SPK_NOISE,
7278	ALC225_FIXUP_DISABLE_MIC_VREF,
7279	ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
7280	ALC295_FIXUP_DISABLE_DAC3,
7281	ALC285_FIXUP_SPEAKER2_TO_DAC1,
7282	ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1,
7283	ALC285_FIXUP_ASUS_HEADSET_MIC,
7284	ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS,
7285	ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1,
7286	ALC285_FIXUP_ASUS_I2C_HEADSET_MIC,
7287	ALC280_FIXUP_HP_HEADSET_MIC,
7288	ALC221_FIXUP_HP_FRONT_MIC,
7289	ALC292_FIXUP_TPT460,
7290	ALC298_FIXUP_SPK_VOLUME,
7291	ALC298_FIXUP_LENOVO_SPK_VOLUME,
7292	ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER,
7293	ALC269_FIXUP_ATIV_BOOK_8,
7294	ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE,
7295	ALC221_FIXUP_HP_MIC_NO_PRESENCE,
7296	ALC256_FIXUP_ASUS_HEADSET_MODE,
7297	ALC256_FIXUP_ASUS_MIC,
7298	ALC256_FIXUP_ASUS_AIO_GPIO2,
7299	ALC233_FIXUP_ASUS_MIC_NO_PRESENCE,
7300	ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE,
7301	ALC233_FIXUP_LENOVO_MULTI_CODECS,
7302	ALC233_FIXUP_ACER_HEADSET_MIC,
7303	ALC294_FIXUP_LENOVO_MIC_LOCATION,
7304	ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE,
7305	ALC225_FIXUP_S3_POP_NOISE,
7306	ALC700_FIXUP_INTEL_REFERENCE,
7307	ALC274_FIXUP_DELL_BIND_DACS,
7308	ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
7309	ALC298_FIXUP_TPT470_DOCK_FIX,
7310	ALC298_FIXUP_TPT470_DOCK,
7311	ALC255_FIXUP_DUMMY_LINEOUT_VERB,
7312	ALC255_FIXUP_DELL_HEADSET_MIC,
7313	ALC256_FIXUP_HUAWEI_MACH_WX9_PINS,
7314	ALC298_FIXUP_HUAWEI_MBX_STEREO,
7315	ALC295_FIXUP_HP_X360,
7316	ALC221_FIXUP_HP_HEADSET_MIC,
7317	ALC285_FIXUP_LENOVO_HEADPHONE_NOISE,
7318	ALC295_FIXUP_HP_AUTO_MUTE,
7319	ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
7320	ALC294_FIXUP_ASUS_MIC,
7321	ALC294_FIXUP_ASUS_HEADSET_MIC,
7322	ALC294_FIXUP_ASUS_SPK,
7323	ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
7324	ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
7325	ALC255_FIXUP_ACER_HEADSET_MIC,
7326	ALC295_FIXUP_CHROME_BOOK,
7327	ALC225_FIXUP_HEADSET_JACK,
7328	ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE,
7329	ALC225_FIXUP_WYSE_AUTO_MUTE,
7330	ALC225_FIXUP_WYSE_DISABLE_MIC_VREF,
7331	ALC286_FIXUP_ACER_AIO_HEADSET_MIC,
7332	ALC256_FIXUP_ASUS_HEADSET_MIC,
7333	ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
7334	ALC299_FIXUP_PREDATOR_SPK,
7335	ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE,
7336	ALC289_FIXUP_DELL_SPK1,
7337	ALC289_FIXUP_DELL_SPK2,
7338	ALC289_FIXUP_DUAL_SPK,
7339	ALC289_FIXUP_RTK_AMP_DUAL_SPK,
7340	ALC294_FIXUP_SPK2_TO_DAC1,
7341	ALC294_FIXUP_ASUS_DUAL_SPK,
7342	ALC285_FIXUP_THINKPAD_X1_GEN7,
7343	ALC285_FIXUP_THINKPAD_HEADSET_JACK,
7344	ALC294_FIXUP_ASUS_ALLY,
7345	ALC294_FIXUP_ASUS_ALLY_PINS,
7346	ALC294_FIXUP_ASUS_ALLY_VERBS,
7347	ALC294_FIXUP_ASUS_ALLY_SPEAKER,
7348	ALC294_FIXUP_ASUS_HPE,
7349	ALC294_FIXUP_ASUS_COEF_1B,
7350	ALC294_FIXUP_ASUS_GX502_HP,
7351	ALC294_FIXUP_ASUS_GX502_PINS,
7352	ALC294_FIXUP_ASUS_GX502_VERBS,
7353	ALC294_FIXUP_ASUS_GU502_HP,
7354	ALC294_FIXUP_ASUS_GU502_PINS,
7355	ALC294_FIXUP_ASUS_GU502_VERBS,
7356	ALC294_FIXUP_ASUS_G513_PINS,
7357	ALC285_FIXUP_ASUS_G533Z_PINS,
7358	ALC285_FIXUP_HP_GPIO_LED,
7359	ALC285_FIXUP_HP_MUTE_LED,
7360	ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED,
7361	ALC236_FIXUP_HP_MUTE_LED_COEFBIT2,
7362	ALC236_FIXUP_HP_GPIO_LED,
7363	ALC236_FIXUP_HP_MUTE_LED,
7364	ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,
7365	ALC298_FIXUP_SAMSUNG_AMP,
7366	ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
7367	ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
7368	ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
7369	ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS,
7370	ALC269VC_FIXUP_ACER_HEADSET_MIC,
7371	ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE,
7372	ALC289_FIXUP_ASUS_GA401,
7373	ALC289_FIXUP_ASUS_GA502,
7374	ALC256_FIXUP_ACER_MIC_NO_PRESENCE,
7375	ALC285_FIXUP_HP_GPIO_AMP_INIT,
7376	ALC269_FIXUP_CZC_B20,
7377	ALC269_FIXUP_CZC_TMI,
7378	ALC269_FIXUP_CZC_L101,
7379	ALC269_FIXUP_LEMOTE_A1802,
7380	ALC269_FIXUP_LEMOTE_A190X,
7381	ALC256_FIXUP_INTEL_NUC8_RUGGED,
7382	ALC233_FIXUP_INTEL_NUC8_DMIC,
7383	ALC233_FIXUP_INTEL_NUC8_BOOST,
7384	ALC256_FIXUP_INTEL_NUC10,
7385	ALC255_FIXUP_XIAOMI_HEADSET_MIC,
7386	ALC274_FIXUP_HP_MIC,
7387	ALC274_FIXUP_HP_HEADSET_MIC,
7388	ALC274_FIXUP_HP_ENVY_GPIO,
7389	ALC256_FIXUP_ASUS_HPE,
7390	ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
7391	ALC287_FIXUP_HP_GPIO_LED,
7392	ALC256_FIXUP_HP_HEADSET_MIC,
7393	ALC245_FIXUP_HP_GPIO_LED,
7394	ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
7395	ALC282_FIXUP_ACER_DISABLE_LINEOUT,
7396	ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST,
7397	ALC256_FIXUP_ACER_HEADSET_MIC,
7398	ALC285_FIXUP_IDEAPAD_S740_COEF,
7399	ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST,
7400	ALC295_FIXUP_ASUS_DACS,
7401	ALC295_FIXUP_HP_OMEN,
7402	ALC285_FIXUP_HP_SPECTRE_X360,
7403	ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP,
7404	ALC623_FIXUP_LENOVO_THINKSTATION_P340,
7405	ALC255_FIXUP_ACER_HEADPHONE_AND_MIC,
7406	ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST,
7407	ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS,
7408	ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,
7409	ALC287_FIXUP_YOGA7_14ITL_SPEAKERS,
7410	ALC298_FIXUP_LENOVO_C940_DUET7,
7411	ALC287_FIXUP_LENOVO_14IRP8_DUETITL,
7412	ALC287_FIXUP_13S_GEN2_SPEAKERS,
7413	ALC256_FIXUP_SET_COEF_DEFAULTS,
7414	ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
7415	ALC233_FIXUP_NO_AUDIO_JACK,
7416	ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME,
7417	ALC285_FIXUP_LEGION_Y9000X_SPEAKERS,
7418	ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,
7419	ALC287_FIXUP_LEGION_16ACHG6,
7420	ALC287_FIXUP_CS35L41_I2C_2,
7421	ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED,
7422	ALC245_FIXUP_CS35L41_SPI_2,
7423	ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED,
7424	ALC245_FIXUP_CS35L41_SPI_4,
7425	ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED,
7426	ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED,
7427	ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE,
7428	ALC287_FIXUP_LEGION_16ITHG6,
7429	ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK,
7430	ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN,
7431	ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS,
7432	ALC236_FIXUP_DELL_DUAL_CODECS,
7433	ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI,
7434	ALC287_FIXUP_TAS2781_I2C,
7435	ALC245_FIXUP_HP_MUTE_LED_COEFBIT,
7436	ALC245_FIXUP_HP_X360_MUTE_LEDS,
7437	ALC287_FIXUP_THINKPAD_I2S_SPK,
7438	ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD,
7439	ALC2XX_FIXUP_HEADSET_MIC,
7440	ALC289_FIXUP_DELL_CS35L41_SPI_2,
7441	ALC294_FIXUP_CS35L41_I2C_2,
7442};
7443
7444/* A special fixup for Lenovo C940 and Yoga Duet 7;
7445 * both have the very same PCI SSID, and we need to apply different fixups
7446 * depending on the codec ID
7447 */
7448static void alc298_fixup_lenovo_c940_duet7(struct hda_codec *codec,
7449					   const struct hda_fixup *fix,
7450					   int action)
7451{
7452	int id;
7453
7454	if (codec->core.vendor_id == 0x10ec0298)
7455		id = ALC298_FIXUP_LENOVO_SPK_VOLUME; /* C940 */
7456	else
7457		id = ALC287_FIXUP_YOGA7_14ITL_SPEAKERS; /* Duet 7 */
7458	__snd_hda_apply_fixup(codec, id, action, 0);
7459}
7460
7461/* A special fixup for Lenovo Slim/Yoga Pro 9 14IRP8 and Yoga DuetITL 2021;
7462 * 14IRP8 PCI SSID will mistakenly be matched with the DuetITL codec SSID,
7463 * so we need to apply a different fixup in this case. The only DuetITL codec
7464 * SSID reported so far is the 17aa:3802 while the 14IRP8 has the 17aa:38be
7465 * and 17aa:38bf. If it weren't for the PCI SSID, the 14IRP8 models would
7466 * have matched correctly by their codecs.
7467 */
7468static void alc287_fixup_lenovo_14irp8_duetitl(struct hda_codec *codec,
7469					      const struct hda_fixup *fix,
7470					      int action)
7471{
7472	int id;
7473
7474	if (codec->core.subsystem_id == 0x17aa3802)
7475		id = ALC287_FIXUP_YOGA7_14ITL_SPEAKERS; /* DuetITL */
7476	else
7477		id = ALC287_FIXUP_TAS2781_I2C; /* 14IRP8 */
7478	__snd_hda_apply_fixup(codec, id, action, 0);
7479}
7480
7481static const struct hda_fixup alc269_fixups[] = {
7482	[ALC269_FIXUP_GPIO2] = {
7483		.type = HDA_FIXUP_FUNC,
7484		.v.func = alc_fixup_gpio2,
7485	},
7486	[ALC269_FIXUP_SONY_VAIO] = {
7487		.type = HDA_FIXUP_PINCTLS,
7488		.v.pins = (const struct hda_pintbl[]) {
7489			{0x19, PIN_VREFGRD},
7490			{}
7491		}
7492	},
7493	[ALC275_FIXUP_SONY_VAIO_GPIO2] = {
7494		.type = HDA_FIXUP_FUNC,
7495		.v.func = alc275_fixup_gpio4_off,
7496		.chained = true,
7497		.chain_id = ALC269_FIXUP_SONY_VAIO
7498	},
7499	[ALC269_FIXUP_DELL_M101Z] = {
7500		.type = HDA_FIXUP_VERBS,
7501		.v.verbs = (const struct hda_verb[]) {
7502			/* Enables internal speaker */
7503			{0x20, AC_VERB_SET_COEF_INDEX, 13},
7504			{0x20, AC_VERB_SET_PROC_COEF, 0x4040},
7505			{}
7506		}
7507	},
7508	[ALC269_FIXUP_SKU_IGNORE] = {
7509		.type = HDA_FIXUP_FUNC,
7510		.v.func = alc_fixup_sku_ignore,
7511	},
7512	[ALC269_FIXUP_ASUS_G73JW] = {
7513		.type = HDA_FIXUP_PINS,
7514		.v.pins = (const struct hda_pintbl[]) {
7515			{ 0x17, 0x99130111 }, /* subwoofer */
7516			{ }
7517		}
7518	},
7519	[ALC269_FIXUP_ASUS_N7601ZM_PINS] = {
7520		.type = HDA_FIXUP_PINS,
7521		.v.pins = (const struct hda_pintbl[]) {
7522			{ 0x19, 0x03A11050 },
7523			{ 0x1a, 0x03A11C30 },
7524			{ 0x21, 0x03211420 },
7525			{ }
7526		}
7527	},
7528	[ALC269_FIXUP_ASUS_N7601ZM] = {
7529		.type = HDA_FIXUP_VERBS,
7530		.v.verbs = (const struct hda_verb[]) {
7531			{0x20, AC_VERB_SET_COEF_INDEX, 0x62},
7532			{0x20, AC_VERB_SET_PROC_COEF, 0xa007},
7533			{0x20, AC_VERB_SET_COEF_INDEX, 0x10},
7534			{0x20, AC_VERB_SET_PROC_COEF, 0x8420},
7535			{0x20, AC_VERB_SET_COEF_INDEX, 0x0f},
7536			{0x20, AC_VERB_SET_PROC_COEF, 0x7774},
7537			{ }
7538		},
7539		.chained = true,
7540		.chain_id = ALC269_FIXUP_ASUS_N7601ZM_PINS,
7541	},
7542	[ALC269_FIXUP_LENOVO_EAPD] = {
7543		.type = HDA_FIXUP_VERBS,
7544		.v.verbs = (const struct hda_verb[]) {
7545			{0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
7546			{}
7547		}
7548	},
7549	[ALC275_FIXUP_SONY_HWEQ] = {
7550		.type = HDA_FIXUP_FUNC,
7551		.v.func = alc269_fixup_hweq,
7552		.chained = true,
7553		.chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
7554	},
7555	[ALC275_FIXUP_SONY_DISABLE_AAMIX] = {
7556		.type = HDA_FIXUP_FUNC,
7557		.v.func = alc_fixup_disable_aamix,
7558		.chained = true,
7559		.chain_id = ALC269_FIXUP_SONY_VAIO
7560	},
7561	[ALC271_FIXUP_DMIC] = {
7562		.type = HDA_FIXUP_FUNC,
7563		.v.func = alc271_fixup_dmic,
7564	},
7565	[ALC269_FIXUP_PCM_44K] = {
7566		.type = HDA_FIXUP_FUNC,
7567		.v.func = alc269_fixup_pcm_44k,
7568		.chained = true,
7569		.chain_id = ALC269_FIXUP_QUANTA_MUTE
7570	},
7571	[ALC269_FIXUP_STEREO_DMIC] = {
7572		.type = HDA_FIXUP_FUNC,
7573		.v.func = alc269_fixup_stereo_dmic,
7574	},
7575	[ALC269_FIXUP_HEADSET_MIC] = {
7576		.type = HDA_FIXUP_FUNC,
7577		.v.func = alc269_fixup_headset_mic,
7578	},
7579	[ALC269_FIXUP_QUANTA_MUTE] = {
7580		.type = HDA_FIXUP_FUNC,
7581		.v.func = alc269_fixup_quanta_mute,
7582	},
7583	[ALC269_FIXUP_LIFEBOOK] = {
7584		.type = HDA_FIXUP_PINS,
7585		.v.pins = (const struct hda_pintbl[]) {
7586			{ 0x1a, 0x2101103f }, /* dock line-out */
7587			{ 0x1b, 0x23a11040 }, /* dock mic-in */
7588			{ }
7589		},
7590		.chained = true,
7591		.chain_id = ALC269_FIXUP_QUANTA_MUTE
7592	},
7593	[ALC269_FIXUP_LIFEBOOK_EXTMIC] = {
7594		.type = HDA_FIXUP_PINS,
7595		.v.pins = (const struct hda_pintbl[]) {
7596			{ 0x19, 0x01a1903c }, /* headset mic, with jack detect */
7597			{ }
7598		},
7599	},
7600	[ALC269_FIXUP_LIFEBOOK_HP_PIN] = {
7601		.type = HDA_FIXUP_PINS,
7602		.v.pins = (const struct hda_pintbl[]) {
7603			{ 0x21, 0x0221102f }, /* HP out */
7604			{ }
7605		},
7606	},
7607	[ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT] = {
7608		.type = HDA_FIXUP_FUNC,
7609		.v.func = alc269_fixup_pincfg_no_hp_to_lineout,
7610	},
7611	[ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC] = {
7612		.type = HDA_FIXUP_FUNC,
7613		.v.func = alc269_fixup_pincfg_U7x7_headset_mic,
7614	},
7615	[ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO] = {
7616		.type = HDA_FIXUP_PINS,
7617		.v.pins = (const struct hda_pintbl[]) {
7618			{ 0x18, 0x03a19020 }, /* headset mic */
7619			{ 0x1b, 0x90170150 }, /* speaker */
7620			{ }
7621		},
7622	},
7623	[ALC269_FIXUP_AMIC] = {
7624		.type = HDA_FIXUP_PINS,
7625		.v.pins = (const struct hda_pintbl[]) {
7626			{ 0x14, 0x99130110 }, /* speaker */
7627			{ 0x15, 0x0121401f }, /* HP out */
7628			{ 0x18, 0x01a19c20 }, /* mic */
7629			{ 0x19, 0x99a3092f }, /* int-mic */
7630			{ }
7631		},
7632	},
7633	[ALC269_FIXUP_DMIC] = {
7634		.type = HDA_FIXUP_PINS,
7635		.v.pins = (const struct hda_pintbl[]) {
7636			{ 0x12, 0x99a3092f }, /* int-mic */
7637			{ 0x14, 0x99130110 }, /* speaker */
7638			{ 0x15, 0x0121401f }, /* HP out */
7639			{ 0x18, 0x01a19c20 }, /* mic */
7640			{ }
7641		},
7642	},
7643	[ALC269VB_FIXUP_AMIC] = {
7644		.type = HDA_FIXUP_PINS,
7645		.v.pins = (const struct hda_pintbl[]) {
7646			{ 0x14, 0x99130110 }, /* speaker */
7647			{ 0x18, 0x01a19c20 }, /* mic */
7648			{ 0x19, 0x99a3092f }, /* int-mic */
7649			{ 0x21, 0x0121401f }, /* HP out */
7650			{ }
7651		},
7652	},
7653	[ALC269VB_FIXUP_DMIC] = {
7654		.type = HDA_FIXUP_PINS,
7655		.v.pins = (const struct hda_pintbl[]) {
7656			{ 0x12, 0x99a3092f }, /* int-mic */
7657			{ 0x14, 0x99130110 }, /* speaker */
7658			{ 0x18, 0x01a19c20 }, /* mic */
7659			{ 0x21, 0x0121401f }, /* HP out */
7660			{ }
7661		},
7662	},
7663	[ALC269_FIXUP_HP_MUTE_LED] = {
7664		.type = HDA_FIXUP_FUNC,
7665		.v.func = alc269_fixup_hp_mute_led,
7666	},
7667	[ALC269_FIXUP_HP_MUTE_LED_MIC1] = {
7668		.type = HDA_FIXUP_FUNC,
7669		.v.func = alc269_fixup_hp_mute_led_mic1,
7670	},
7671	[ALC269_FIXUP_HP_MUTE_LED_MIC2] = {
7672		.type = HDA_FIXUP_FUNC,
7673		.v.func = alc269_fixup_hp_mute_led_mic2,
7674	},
7675	[ALC269_FIXUP_HP_MUTE_LED_MIC3] = {
7676		.type = HDA_FIXUP_FUNC,
7677		.v.func = alc269_fixup_hp_mute_led_mic3,
7678		.chained = true,
7679		.chain_id = ALC295_FIXUP_HP_AUTO_MUTE
7680	},
7681	[ALC269_FIXUP_HP_GPIO_LED] = {
7682		.type = HDA_FIXUP_FUNC,
7683		.v.func = alc269_fixup_hp_gpio_led,
7684	},
7685	[ALC269_FIXUP_HP_GPIO_MIC1_LED] = {
7686		.type = HDA_FIXUP_FUNC,
7687		.v.func = alc269_fixup_hp_gpio_mic1_led,
7688	},
7689	[ALC269_FIXUP_HP_LINE1_MIC1_LED] = {
7690		.type = HDA_FIXUP_FUNC,
7691		.v.func = alc269_fixup_hp_line1_mic1_led,
7692	},
7693	[ALC269_FIXUP_INV_DMIC] = {
7694		.type = HDA_FIXUP_FUNC,
7695		.v.func = alc_fixup_inv_dmic,
7696	},
7697	[ALC269_FIXUP_NO_SHUTUP] = {
7698		.type = HDA_FIXUP_FUNC,
7699		.v.func = alc_fixup_no_shutup,
7700	},
7701	[ALC269_FIXUP_LENOVO_DOCK] = {
7702		.type = HDA_FIXUP_PINS,
7703		.v.pins = (const struct hda_pintbl[]) {
7704			{ 0x19, 0x23a11040 }, /* dock mic */
7705			{ 0x1b, 0x2121103f }, /* dock headphone */
7706			{ }
7707		},
7708		.chained = true,
7709		.chain_id = ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT
7710	},
7711	[ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST] = {
7712		.type = HDA_FIXUP_FUNC,
7713		.v.func = alc269_fixup_limit_int_mic_boost,
7714		.chained = true,
7715		.chain_id = ALC269_FIXUP_LENOVO_DOCK,
7716	},
7717	[ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT] = {
7718		.type = HDA_FIXUP_FUNC,
7719		.v.func = alc269_fixup_pincfg_no_hp_to_lineout,
7720		.chained = true,
7721		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
7722	},
7723	[ALC269_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7724		.type = HDA_FIXUP_PINS,
7725		.v.pins = (const struct hda_pintbl[]) {
7726			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7727			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7728			{ }
7729		},
7730		.chained = true,
7731		.chain_id = ALC269_FIXUP_HEADSET_MODE
7732	},
7733	[ALC269_FIXUP_DELL2_MIC_NO_PRESENCE] = {
7734		.type = HDA_FIXUP_PINS,
7735		.v.pins = (const struct hda_pintbl[]) {
7736			{ 0x16, 0x21014020 }, /* dock line out */
7737			{ 0x19, 0x21a19030 }, /* dock mic */
7738			{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7739			{ }
7740		},
7741		.chained = true,
7742		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7743	},
7744	[ALC269_FIXUP_DELL3_MIC_NO_PRESENCE] = {
7745		.type = HDA_FIXUP_PINS,
7746		.v.pins = (const struct hda_pintbl[]) {
7747			{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7748			{ }
7749		},
7750		.chained = true,
7751		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7752	},
7753	[ALC269_FIXUP_DELL4_MIC_NO_PRESENCE] = {
7754		.type = HDA_FIXUP_PINS,
7755		.v.pins = (const struct hda_pintbl[]) {
7756			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7757			{ 0x1b, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7758			{ }
7759		},
7760		.chained = true,
7761		.chain_id = ALC269_FIXUP_HEADSET_MODE
7762	},
7763	[ALC269_FIXUP_HEADSET_MODE] = {
7764		.type = HDA_FIXUP_FUNC,
7765		.v.func = alc_fixup_headset_mode,
7766		.chained = true,
7767		.chain_id = ALC255_FIXUP_MIC_MUTE_LED
7768	},
7769	[ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
7770		.type = HDA_FIXUP_FUNC,
7771		.v.func = alc_fixup_headset_mode_no_hp_mic,
7772	},
7773	[ALC269_FIXUP_ASPIRE_HEADSET_MIC] = {
7774		.type = HDA_FIXUP_PINS,
7775		.v.pins = (const struct hda_pintbl[]) {
7776			{ 0x19, 0x01a1913c }, /* headset mic w/o jack detect */
7777			{ }
7778		},
7779		.chained = true,
7780		.chain_id = ALC269_FIXUP_HEADSET_MODE,
7781	},
7782	[ALC286_FIXUP_SONY_MIC_NO_PRESENCE] = {
7783		.type = HDA_FIXUP_PINS,
7784		.v.pins = (const struct hda_pintbl[]) {
7785			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7786			{ }
7787		},
7788		.chained = true,
7789		.chain_id = ALC269_FIXUP_HEADSET_MIC
7790	},
7791	[ALC256_FIXUP_HUAWEI_MACH_WX9_PINS] = {
7792		.type = HDA_FIXUP_PINS,
7793		.v.pins = (const struct hda_pintbl[]) {
7794			{0x12, 0x90a60130},
7795			{0x13, 0x40000000},
7796			{0x14, 0x90170110},
7797			{0x18, 0x411111f0},
7798			{0x19, 0x04a11040},
7799			{0x1a, 0x411111f0},
7800			{0x1b, 0x90170112},
7801			{0x1d, 0x40759a05},
7802			{0x1e, 0x411111f0},
7803			{0x21, 0x04211020},
7804			{ }
7805		},
7806		.chained = true,
7807		.chain_id = ALC255_FIXUP_MIC_MUTE_LED
7808	},
7809	[ALC298_FIXUP_HUAWEI_MBX_STEREO] = {
7810		.type = HDA_FIXUP_FUNC,
7811		.v.func = alc298_fixup_huawei_mbx_stereo,
7812		.chained = true,
7813		.chain_id = ALC255_FIXUP_MIC_MUTE_LED
7814	},
7815	[ALC269_FIXUP_ASUS_X101_FUNC] = {
7816		.type = HDA_FIXUP_FUNC,
7817		.v.func = alc269_fixup_x101_headset_mic,
7818	},
7819	[ALC269_FIXUP_ASUS_X101_VERB] = {
7820		.type = HDA_FIXUP_VERBS,
7821		.v.verbs = (const struct hda_verb[]) {
7822			{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
7823			{0x20, AC_VERB_SET_COEF_INDEX, 0x08},
7824			{0x20, AC_VERB_SET_PROC_COEF,  0x0310},
7825			{ }
7826		},
7827		.chained = true,
7828		.chain_id = ALC269_FIXUP_ASUS_X101_FUNC
7829	},
7830	[ALC269_FIXUP_ASUS_X101] = {
7831		.type = HDA_FIXUP_PINS,
7832		.v.pins = (const struct hda_pintbl[]) {
7833			{ 0x18, 0x04a1182c }, /* Headset mic */
7834			{ }
7835		},
7836		.chained = true,
7837		.chain_id = ALC269_FIXUP_ASUS_X101_VERB
7838	},
7839	[ALC271_FIXUP_AMIC_MIC2] = {
7840		.type = HDA_FIXUP_PINS,
7841		.v.pins = (const struct hda_pintbl[]) {
7842			{ 0x14, 0x99130110 }, /* speaker */
7843			{ 0x19, 0x01a19c20 }, /* mic */
7844			{ 0x1b, 0x99a7012f }, /* int-mic */
7845			{ 0x21, 0x0121401f }, /* HP out */
7846			{ }
7847		},
7848	},
7849	[ALC271_FIXUP_HP_GATE_MIC_JACK] = {
7850		.type = HDA_FIXUP_FUNC,
7851		.v.func = alc271_hp_gate_mic_jack,
7852		.chained = true,
7853		.chain_id = ALC271_FIXUP_AMIC_MIC2,
7854	},
7855	[ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572] = {
7856		.type = HDA_FIXUP_FUNC,
7857		.v.func = alc269_fixup_limit_int_mic_boost,
7858		.chained = true,
7859		.chain_id = ALC271_FIXUP_HP_GATE_MIC_JACK,
7860	},
7861	[ALC269_FIXUP_ACER_AC700] = {
7862		.type = HDA_FIXUP_PINS,
7863		.v.pins = (const struct hda_pintbl[]) {
7864			{ 0x12, 0x99a3092f }, /* int-mic */
7865			{ 0x14, 0x99130110 }, /* speaker */
7866			{ 0x18, 0x03a11c20 }, /* mic */
7867			{ 0x1e, 0x0346101e }, /* SPDIF1 */
7868			{ 0x21, 0x0321101f }, /* HP out */
7869			{ }
7870		},
7871		.chained = true,
7872		.chain_id = ALC271_FIXUP_DMIC,
7873	},
7874	[ALC269_FIXUP_LIMIT_INT_MIC_BOOST] = {
7875		.type = HDA_FIXUP_FUNC,
7876		.v.func = alc269_fixup_limit_int_mic_boost,
7877		.chained = true,
7878		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
7879	},
7880	[ALC269VB_FIXUP_ASUS_ZENBOOK] = {
7881		.type = HDA_FIXUP_FUNC,
7882		.v.func = alc269_fixup_limit_int_mic_boost,
7883		.chained = true,
7884		.chain_id = ALC269VB_FIXUP_DMIC,
7885	},
7886	[ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A] = {
7887		.type = HDA_FIXUP_VERBS,
7888		.v.verbs = (const struct hda_verb[]) {
7889			/* class-D output amp +5dB */
7890			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x12 },
7891			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2800 },
7892			{}
7893		},
7894		.chained = true,
7895		.chain_id = ALC269VB_FIXUP_ASUS_ZENBOOK,
7896	},
7897	[ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7898		.type = HDA_FIXUP_PINS,
7899		.v.pins = (const struct hda_pintbl[]) {
7900			{ 0x18, 0x01a110f0 },  /* use as headset mic */
7901			{ }
7902		},
7903		.chained = true,
7904		.chain_id = ALC269_FIXUP_HEADSET_MIC
7905	},
7906	[ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED] = {
7907		.type = HDA_FIXUP_FUNC,
7908		.v.func = alc269_fixup_limit_int_mic_boost,
7909		.chained = true,
7910		.chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC1,
7911	},
7912	[ALC269VB_FIXUP_ORDISSIMO_EVE2] = {
7913		.type = HDA_FIXUP_PINS,
7914		.v.pins = (const struct hda_pintbl[]) {
7915			{ 0x12, 0x99a3092f }, /* int-mic */
7916			{ 0x18, 0x03a11d20 }, /* mic */
7917			{ 0x19, 0x411111f0 }, /* Unused bogus pin */
7918			{ }
7919		},
7920	},
7921	[ALC283_FIXUP_CHROME_BOOK] = {
7922		.type = HDA_FIXUP_FUNC,
7923		.v.func = alc283_fixup_chromebook,
7924	},
7925	[ALC283_FIXUP_SENSE_COMBO_JACK] = {
7926		.type = HDA_FIXUP_FUNC,
7927		.v.func = alc283_fixup_sense_combo_jack,
7928		.chained = true,
7929		.chain_id = ALC283_FIXUP_CHROME_BOOK,
7930	},
7931	[ALC282_FIXUP_ASUS_TX300] = {
7932		.type = HDA_FIXUP_FUNC,
7933		.v.func = alc282_fixup_asus_tx300,
7934	},
7935	[ALC283_FIXUP_INT_MIC] = {
7936		.type = HDA_FIXUP_VERBS,
7937		.v.verbs = (const struct hda_verb[]) {
7938			{0x20, AC_VERB_SET_COEF_INDEX, 0x1a},
7939			{0x20, AC_VERB_SET_PROC_COEF, 0x0011},
7940			{ }
7941		},
7942		.chained = true,
7943		.chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
7944	},
7945	[ALC290_FIXUP_SUBWOOFER_HSJACK] = {
7946		.type = HDA_FIXUP_PINS,
7947		.v.pins = (const struct hda_pintbl[]) {
7948			{ 0x17, 0x90170112 }, /* subwoofer */
7949			{ }
7950		},
7951		.chained = true,
7952		.chain_id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
7953	},
7954	[ALC290_FIXUP_SUBWOOFER] = {
7955		.type = HDA_FIXUP_PINS,
7956		.v.pins = (const struct hda_pintbl[]) {
7957			{ 0x17, 0x90170112 }, /* subwoofer */
7958			{ }
7959		},
7960		.chained = true,
7961		.chain_id = ALC290_FIXUP_MONO_SPEAKERS,
7962	},
7963	[ALC290_FIXUP_MONO_SPEAKERS] = {
7964		.type = HDA_FIXUP_FUNC,
7965		.v.func = alc290_fixup_mono_speakers,
7966	},
7967	[ALC290_FIXUP_MONO_SPEAKERS_HSJACK] = {
7968		.type = HDA_FIXUP_FUNC,
7969		.v.func = alc290_fixup_mono_speakers,
7970		.chained = true,
7971		.chain_id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
7972	},
7973	[ALC269_FIXUP_THINKPAD_ACPI] = {
7974		.type = HDA_FIXUP_FUNC,
7975		.v.func = alc_fixup_thinkpad_acpi,
7976		.chained = true,
7977		.chain_id = ALC269_FIXUP_SKU_IGNORE,
7978	},
7979	[ALC269_FIXUP_DMIC_THINKPAD_ACPI] = {
7980		.type = HDA_FIXUP_FUNC,
7981		.v.func = alc_fixup_inv_dmic,
7982		.chained = true,
7983		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
7984	},
7985	[ALC255_FIXUP_ACER_MIC_NO_PRESENCE] = {
7986		.type = HDA_FIXUP_PINS,
7987		.v.pins = (const struct hda_pintbl[]) {
7988			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7989			{ }
7990		},
7991		.chained = true,
7992		.chain_id = ALC255_FIXUP_HEADSET_MODE
7993	},
7994	[ALC255_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7995		.type = HDA_FIXUP_PINS,
7996		.v.pins = (const struct hda_pintbl[]) {
7997			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7998			{ }
7999		},
8000		.chained = true,
8001		.chain_id = ALC255_FIXUP_HEADSET_MODE
8002	},
8003	[ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = {
8004		.type = HDA_FIXUP_PINS,
8005		.v.pins = (const struct hda_pintbl[]) {
8006			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8007			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
8008			{ }
8009		},
8010		.chained = true,
8011		.chain_id = ALC255_FIXUP_HEADSET_MODE
8012	},
8013	[ALC255_FIXUP_DELL2_MIC_NO_PRESENCE] = {
8014		.type = HDA_FIXUP_PINS,
8015		.v.pins = (const struct hda_pintbl[]) {
8016			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8017			{ }
8018		},
8019		.chained = true,
8020		.chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
8021	},
8022	[ALC255_FIXUP_HEADSET_MODE] = {
8023		.type = HDA_FIXUP_FUNC,
8024		.v.func = alc_fixup_headset_mode_alc255,
8025		.chained = true,
8026		.chain_id = ALC255_FIXUP_MIC_MUTE_LED
8027	},
8028	[ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
8029		.type = HDA_FIXUP_FUNC,
8030		.v.func = alc_fixup_headset_mode_alc255_no_hp_mic,
8031	},
8032	[ALC293_FIXUP_DELL1_MIC_NO_PRESENCE] = {
8033		.type = HDA_FIXUP_PINS,
8034		.v.pins = (const struct hda_pintbl[]) {
8035			{ 0x18, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
8036			{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8037			{ }
8038		},
8039		.chained = true,
8040		.chain_id = ALC269_FIXUP_HEADSET_MODE
8041	},
8042	[ALC292_FIXUP_TPT440_DOCK] = {
8043		.type = HDA_FIXUP_FUNC,
8044		.v.func = alc_fixup_tpt440_dock,
8045		.chained = true,
8046		.chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
8047	},
8048	[ALC292_FIXUP_TPT440] = {
8049		.type = HDA_FIXUP_FUNC,
8050		.v.func = alc_fixup_disable_aamix,
8051		.chained = true,
8052		.chain_id = ALC292_FIXUP_TPT440_DOCK,
8053	},
8054	[ALC283_FIXUP_HEADSET_MIC] = {
8055		.type = HDA_FIXUP_PINS,
8056		.v.pins = (const struct hda_pintbl[]) {
8057			{ 0x19, 0x04a110f0 },
8058			{ },
8059		},
8060	},
8061	[ALC255_FIXUP_MIC_MUTE_LED] = {
8062		.type = HDA_FIXUP_FUNC,
8063		.v.func = alc_fixup_micmute_led,
8064	},
8065	[ALC282_FIXUP_ASPIRE_V5_PINS] = {
8066		.type = HDA_FIXUP_PINS,
8067		.v.pins = (const struct hda_pintbl[]) {
8068			{ 0x12, 0x90a60130 },
8069			{ 0x14, 0x90170110 },
8070			{ 0x17, 0x40000008 },
8071			{ 0x18, 0x411111f0 },
8072			{ 0x19, 0x01a1913c },
8073			{ 0x1a, 0x411111f0 },
8074			{ 0x1b, 0x411111f0 },
8075			{ 0x1d, 0x40f89b2d },
8076			{ 0x1e, 0x411111f0 },
8077			{ 0x21, 0x0321101f },
8078			{ },
8079		},
8080	},
8081	[ALC269VB_FIXUP_ASPIRE_E1_COEF] = {
8082		.type = HDA_FIXUP_FUNC,
8083		.v.func = alc269vb_fixup_aspire_e1_coef,
8084	},
8085	[ALC280_FIXUP_HP_GPIO4] = {
8086		.type = HDA_FIXUP_FUNC,
8087		.v.func = alc280_fixup_hp_gpio4,
8088	},
8089	[ALC286_FIXUP_HP_GPIO_LED] = {
8090		.type = HDA_FIXUP_FUNC,
8091		.v.func = alc286_fixup_hp_gpio_led,
8092	},
8093	[ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY] = {
8094		.type = HDA_FIXUP_FUNC,
8095		.v.func = alc280_fixup_hp_gpio2_mic_hotkey,
8096	},
8097	[ALC280_FIXUP_HP_DOCK_PINS] = {
8098		.type = HDA_FIXUP_PINS,
8099		.v.pins = (const struct hda_pintbl[]) {
8100			{ 0x1b, 0x21011020 }, /* line-out */
8101			{ 0x1a, 0x01a1903c }, /* headset mic */
8102			{ 0x18, 0x2181103f }, /* line-in */
8103			{ },
8104		},
8105		.chained = true,
8106		.chain_id = ALC280_FIXUP_HP_GPIO4
8107	},
8108	[ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED] = {
8109		.type = HDA_FIXUP_PINS,
8110		.v.pins = (const struct hda_pintbl[]) {
8111			{ 0x1b, 0x21011020 }, /* line-out */
8112			{ 0x18, 0x2181103f }, /* line-in */
8113			{ },
8114		},
8115		.chained = true,
8116		.chain_id = ALC269_FIXUP_HP_GPIO_MIC1_LED
8117	},
8118	[ALC280_FIXUP_HP_9480M] = {
8119		.type = HDA_FIXUP_FUNC,
8120		.v.func = alc280_fixup_hp_9480m,
8121	},
8122	[ALC245_FIXUP_HP_X360_AMP] = {
8123		.type = HDA_FIXUP_FUNC,
8124		.v.func = alc245_fixup_hp_x360_amp,
8125		.chained = true,
8126		.chain_id = ALC245_FIXUP_HP_GPIO_LED
8127	},
8128	[ALC288_FIXUP_DELL_HEADSET_MODE] = {
8129		.type = HDA_FIXUP_FUNC,
8130		.v.func = alc_fixup_headset_mode_dell_alc288,
8131		.chained = true,
8132		.chain_id = ALC255_FIXUP_MIC_MUTE_LED
8133	},
8134	[ALC288_FIXUP_DELL1_MIC_NO_PRESENCE] = {
8135		.type = HDA_FIXUP_PINS,
8136		.v.pins = (const struct hda_pintbl[]) {
8137			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8138			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
8139			{ }
8140		},
8141		.chained = true,
8142		.chain_id = ALC288_FIXUP_DELL_HEADSET_MODE
8143	},
8144	[ALC288_FIXUP_DISABLE_AAMIX] = {
8145		.type = HDA_FIXUP_FUNC,
8146		.v.func = alc_fixup_disable_aamix,
8147		.chained = true,
8148		.chain_id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE
8149	},
8150	[ALC288_FIXUP_DELL_XPS_13] = {
8151		.type = HDA_FIXUP_FUNC,
8152		.v.func = alc_fixup_dell_xps13,
8153		.chained = true,
8154		.chain_id = ALC288_FIXUP_DISABLE_AAMIX
8155	},
8156	[ALC292_FIXUP_DISABLE_AAMIX] = {
8157		.type = HDA_FIXUP_FUNC,
8158		.v.func = alc_fixup_disable_aamix,
8159		.chained = true,
8160		.chain_id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE
8161	},
8162	[ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK] = {
8163		.type = HDA_FIXUP_FUNC,
8164		.v.func = alc_fixup_disable_aamix,
8165		.chained = true,
8166		.chain_id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE
8167	},
8168	[ALC292_FIXUP_DELL_E7X_AAMIX] = {
8169		.type = HDA_FIXUP_FUNC,
8170		.v.func = alc_fixup_dell_xps13,
8171		.chained = true,
8172		.chain_id = ALC292_FIXUP_DISABLE_AAMIX
8173	},
8174	[ALC292_FIXUP_DELL_E7X] = {
8175		.type = HDA_FIXUP_FUNC,
8176		.v.func = alc_fixup_micmute_led,
8177		/* micmute fixup must be applied at last */
8178		.chained_before = true,
8179		.chain_id = ALC292_FIXUP_DELL_E7X_AAMIX,
8180	},
8181	[ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE] = {
8182		.type = HDA_FIXUP_PINS,
8183		.v.pins = (const struct hda_pintbl[]) {
8184			{ 0x18, 0x01a1913c }, /* headset mic w/o jack detect */
8185			{ }
8186		},
8187		.chained_before = true,
8188		.chain_id = ALC269_FIXUP_HEADSET_MODE,
8189	},
8190	[ALC298_FIXUP_DELL1_MIC_NO_PRESENCE] = {
8191		.type = HDA_FIXUP_PINS,
8192		.v.pins = (const struct hda_pintbl[]) {
8193			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8194			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
8195			{ }
8196		},
8197		.chained = true,
8198		.chain_id = ALC269_FIXUP_HEADSET_MODE
8199	},
8200	[ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE] = {
8201		.type = HDA_FIXUP_PINS,
8202		.v.pins = (const struct hda_pintbl[]) {
8203			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8204			{ }
8205		},
8206		.chained = true,
8207		.chain_id = ALC269_FIXUP_HEADSET_MODE
8208	},
8209	[ALC275_FIXUP_DELL_XPS] = {
8210		.type = HDA_FIXUP_VERBS,
8211		.v.verbs = (const struct hda_verb[]) {
8212			/* Enables internal speaker */
8213			{0x20, AC_VERB_SET_COEF_INDEX, 0x1f},
8214			{0x20, AC_VERB_SET_PROC_COEF, 0x00c0},
8215			{0x20, AC_VERB_SET_COEF_INDEX, 0x30},
8216			{0x20, AC_VERB_SET_PROC_COEF, 0x00b1},
8217			{}
8218		}
8219	},
8220	[ALC293_FIXUP_LENOVO_SPK_NOISE] = {
8221		.type = HDA_FIXUP_FUNC,
8222		.v.func = alc_fixup_disable_aamix,
8223		.chained = true,
8224		.chain_id = ALC269_FIXUP_THINKPAD_ACPI
8225	},
8226	[ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY] = {
8227		.type = HDA_FIXUP_FUNC,
8228		.v.func = alc233_fixup_lenovo_line2_mic_hotkey,
8229	},
8230	[ALC233_FIXUP_INTEL_NUC8_DMIC] = {
8231		.type = HDA_FIXUP_FUNC,
8232		.v.func = alc_fixup_inv_dmic,
8233		.chained = true,
8234		.chain_id = ALC233_FIXUP_INTEL_NUC8_BOOST,
8235	},
8236	[ALC233_FIXUP_INTEL_NUC8_BOOST] = {
8237		.type = HDA_FIXUP_FUNC,
8238		.v.func = alc269_fixup_limit_int_mic_boost
8239	},
8240	[ALC255_FIXUP_DELL_SPK_NOISE] = {
8241		.type = HDA_FIXUP_FUNC,
8242		.v.func = alc_fixup_disable_aamix,
8243		.chained = true,
8244		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
8245	},
8246	[ALC225_FIXUP_DISABLE_MIC_VREF] = {
8247		.type = HDA_FIXUP_FUNC,
8248		.v.func = alc_fixup_disable_mic_vref,
8249		.chained = true,
8250		.chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
8251	},
8252	[ALC225_FIXUP_DELL1_MIC_NO_PRESENCE] = {
8253		.type = HDA_FIXUP_VERBS,
8254		.v.verbs = (const struct hda_verb[]) {
8255			/* Disable pass-through path for FRONT 14h */
8256			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
8257			{ 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
8258			{}
8259		},
8260		.chained = true,
8261		.chain_id = ALC225_FIXUP_DISABLE_MIC_VREF
8262	},
8263	[ALC280_FIXUP_HP_HEADSET_MIC] = {
8264		.type = HDA_FIXUP_FUNC,
8265		.v.func = alc_fixup_disable_aamix,
8266		.chained = true,
8267		.chain_id = ALC269_FIXUP_HEADSET_MIC,
8268	},
8269	[ALC221_FIXUP_HP_FRONT_MIC] = {
8270		.type = HDA_FIXUP_PINS,
8271		.v.pins = (const struct hda_pintbl[]) {
8272			{ 0x19, 0x02a19020 }, /* Front Mic */
8273			{ }
8274		},
8275	},
8276	[ALC292_FIXUP_TPT460] = {
8277		.type = HDA_FIXUP_FUNC,
8278		.v.func = alc_fixup_tpt440_dock,
8279		.chained = true,
8280		.chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE,
8281	},
8282	[ALC298_FIXUP_SPK_VOLUME] = {
8283		.type = HDA_FIXUP_FUNC,
8284		.v.func = alc298_fixup_speaker_volume,
8285		.chained = true,
8286		.chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
8287	},
8288	[ALC298_FIXUP_LENOVO_SPK_VOLUME] = {
8289		.type = HDA_FIXUP_FUNC,
8290		.v.func = alc298_fixup_speaker_volume,
8291	},
8292	[ALC295_FIXUP_DISABLE_DAC3] = {
8293		.type = HDA_FIXUP_FUNC,
8294		.v.func = alc295_fixup_disable_dac3,
8295	},
8296	[ALC285_FIXUP_SPEAKER2_TO_DAC1] = {
8297		.type = HDA_FIXUP_FUNC,
8298		.v.func = alc285_fixup_speaker2_to_dac1,
8299		.chained = true,
8300		.chain_id = ALC269_FIXUP_THINKPAD_ACPI
8301	},
8302	[ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1] = {
8303		.type = HDA_FIXUP_FUNC,
8304		.v.func = alc285_fixup_speaker2_to_dac1,
8305		.chained = true,
8306		.chain_id = ALC245_FIXUP_CS35L41_SPI_2
8307	},
8308	[ALC285_FIXUP_ASUS_HEADSET_MIC] = {
8309		.type = HDA_FIXUP_PINS,
8310		.v.pins = (const struct hda_pintbl[]) {
8311			{ 0x19, 0x03a11050 },
8312			{ 0x1b, 0x03a11c30 },
8313			{ }
8314		},
8315		.chained = true,
8316		.chain_id = ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1
8317	},
8318	[ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS] = {
8319		.type = HDA_FIXUP_PINS,
8320		.v.pins = (const struct hda_pintbl[]) {
8321			{ 0x14, 0x90170120 },
8322			{ }
8323		},
8324		.chained = true,
8325		.chain_id = ALC285_FIXUP_ASUS_HEADSET_MIC
8326	},
8327	[ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1] = {
8328		.type = HDA_FIXUP_FUNC,
8329		.v.func = alc285_fixup_speaker2_to_dac1,
8330		.chained = true,
8331		.chain_id = ALC287_FIXUP_CS35L41_I2C_2
8332	},
8333	[ALC285_FIXUP_ASUS_I2C_HEADSET_MIC] = {
8334		.type = HDA_FIXUP_PINS,
8335		.v.pins = (const struct hda_pintbl[]) {
8336			{ 0x19, 0x03a11050 },
8337			{ 0x1b, 0x03a11c30 },
8338			{ }
8339		},
8340		.chained = true,
8341		.chain_id = ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1
8342	},
8343	[ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {
8344		.type = HDA_FIXUP_PINS,
8345		.v.pins = (const struct hda_pintbl[]) {
8346			{ 0x1b, 0x90170151 },
8347			{ }
8348		},
8349		.chained = true,
8350		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
8351	},
8352	[ALC269_FIXUP_ATIV_BOOK_8] = {
8353		.type = HDA_FIXUP_FUNC,
8354		.v.func = alc_fixup_auto_mute_via_amp,
8355		.chained = true,
8356		.chain_id = ALC269_FIXUP_NO_SHUTUP
8357	},
8358	[ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE] = {
8359		.type = HDA_FIXUP_PINS,
8360		.v.pins = (const struct hda_pintbl[]) {
8361			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8362			{ 0x1a, 0x01813030 }, /* use as headphone mic, without its own jack detect */
8363			{ }
8364		},
8365		.chained = true,
8366		.chain_id = ALC269_FIXUP_HEADSET_MODE
8367	},
8368	[ALC221_FIXUP_HP_MIC_NO_PRESENCE] = {
8369		.type = HDA_FIXUP_PINS,
8370		.v.pins = (const struct hda_pintbl[]) {
8371			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8372			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
8373			{ }
8374		},
8375		.chained = true,
8376		.chain_id = ALC269_FIXUP_HEADSET_MODE
8377	},
8378	[ALC256_FIXUP_ASUS_HEADSET_MODE] = {
8379		.type = HDA_FIXUP_FUNC,
8380		.v.func = alc_fixup_headset_mode,
8381	},
8382	[ALC256_FIXUP_ASUS_MIC] = {
8383		.type = HDA_FIXUP_PINS,
8384		.v.pins = (const struct hda_pintbl[]) {
8385			{ 0x13, 0x90a60160 }, /* use as internal mic */
8386			{ 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
8387			{ }
8388		},
8389		.chained = true,
8390		.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8391	},
8392	[ALC256_FIXUP_ASUS_AIO_GPIO2] = {
8393		.type = HDA_FIXUP_FUNC,
8394		/* Set up GPIO2 for the speaker amp */
8395		.v.func = alc_fixup_gpio4,
8396	},
8397	[ALC233_FIXUP_ASUS_MIC_NO_PRESENCE] = {
8398		.type = HDA_FIXUP_PINS,
8399		.v.pins = (const struct hda_pintbl[]) {
8400			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8401			{ }
8402		},
8403		.chained = true,
8404		.chain_id = ALC269_FIXUP_HEADSET_MIC
8405	},
8406	[ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE] = {
8407		.type = HDA_FIXUP_VERBS,
8408		.v.verbs = (const struct hda_verb[]) {
8409			/* Enables internal speaker */
8410			{0x20, AC_VERB_SET_COEF_INDEX, 0x40},
8411			{0x20, AC_VERB_SET_PROC_COEF, 0x8800},
8412			{}
8413		},
8414		.chained = true,
8415		.chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
8416	},
8417	[ALC233_FIXUP_LENOVO_MULTI_CODECS] = {
8418		.type = HDA_FIXUP_FUNC,
8419		.v.func = alc233_alc662_fixup_lenovo_dual_codecs,
8420		.chained = true,
8421		.chain_id = ALC269_FIXUP_GPIO2
8422	},
8423	[ALC233_FIXUP_ACER_HEADSET_MIC] = {
8424		.type = HDA_FIXUP_VERBS,
8425		.v.verbs = (const struct hda_verb[]) {
8426			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
8427			{ 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
8428			{ }
8429		},
8430		.chained = true,
8431		.chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
8432	},
8433	[ALC294_FIXUP_LENOVO_MIC_LOCATION] = {
8434		.type = HDA_FIXUP_PINS,
8435		.v.pins = (const struct hda_pintbl[]) {
8436			/* Change the mic location from front to right, otherwise there are
8437			   two front mics with the same name, pulseaudio can't handle them.
8438			   This is just a temporary workaround, after applying this fixup,
8439			   there will be one "Front Mic" and one "Mic" in this machine.
8440			 */
8441			{ 0x1a, 0x04a19040 },
8442			{ }
8443		},
8444	},
8445	[ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE] = {
8446		.type = HDA_FIXUP_PINS,
8447		.v.pins = (const struct hda_pintbl[]) {
8448			{ 0x16, 0x0101102f }, /* Rear Headset HP */
8449			{ 0x19, 0x02a1913c }, /* use as Front headset mic, without its own jack detect */
8450			{ 0x1a, 0x01a19030 }, /* Rear Headset MIC */
8451			{ 0x1b, 0x02011020 },
8452			{ }
8453		},
8454		.chained = true,
8455		.chain_id = ALC225_FIXUP_S3_POP_NOISE
8456	},
8457	[ALC225_FIXUP_S3_POP_NOISE] = {
8458		.type = HDA_FIXUP_FUNC,
8459		.v.func = alc225_fixup_s3_pop_noise,
8460		.chained = true,
8461		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8462	},
8463	[ALC700_FIXUP_INTEL_REFERENCE] = {
8464		.type = HDA_FIXUP_VERBS,
8465		.v.verbs = (const struct hda_verb[]) {
8466			/* Enables internal speaker */
8467			{0x20, AC_VERB_SET_COEF_INDEX, 0x45},
8468			{0x20, AC_VERB_SET_PROC_COEF, 0x5289},
8469			{0x20, AC_VERB_SET_COEF_INDEX, 0x4A},
8470			{0x20, AC_VERB_SET_PROC_COEF, 0x001b},
8471			{0x58, AC_VERB_SET_COEF_INDEX, 0x00},
8472			{0x58, AC_VERB_SET_PROC_COEF, 0x3888},
8473			{0x20, AC_VERB_SET_COEF_INDEX, 0x6f},
8474			{0x20, AC_VERB_SET_PROC_COEF, 0x2c0b},
8475			{}
8476		}
8477	},
8478	[ALC274_FIXUP_DELL_BIND_DACS] = {
8479		.type = HDA_FIXUP_FUNC,
8480		.v.func = alc274_fixup_bind_dacs,
8481		.chained = true,
8482		.chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
8483	},
8484	[ALC274_FIXUP_DELL_AIO_LINEOUT_VERB] = {
8485		.type = HDA_FIXUP_PINS,
8486		.v.pins = (const struct hda_pintbl[]) {
8487			{ 0x1b, 0x0401102f },
8488			{ }
8489		},
8490		.chained = true,
8491		.chain_id = ALC274_FIXUP_DELL_BIND_DACS
8492	},
8493	[ALC298_FIXUP_TPT470_DOCK_FIX] = {
8494		.type = HDA_FIXUP_FUNC,
8495		.v.func = alc_fixup_tpt470_dock,
8496		.chained = true,
8497		.chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE
8498	},
8499	[ALC298_FIXUP_TPT470_DOCK] = {
8500		.type = HDA_FIXUP_FUNC,
8501		.v.func = alc_fixup_tpt470_dacs,
8502		.chained = true,
8503		.chain_id = ALC298_FIXUP_TPT470_DOCK_FIX
8504	},
8505	[ALC255_FIXUP_DUMMY_LINEOUT_VERB] = {
8506		.type = HDA_FIXUP_PINS,
8507		.v.pins = (const struct hda_pintbl[]) {
8508			{ 0x14, 0x0201101f },
8509			{ }
8510		},
8511		.chained = true,
8512		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
8513	},
8514	[ALC255_FIXUP_DELL_HEADSET_MIC] = {
8515		.type = HDA_FIXUP_PINS,
8516		.v.pins = (const struct hda_pintbl[]) {
8517			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8518			{ }
8519		},
8520		.chained = true,
8521		.chain_id = ALC269_FIXUP_HEADSET_MIC
8522	},
8523	[ALC295_FIXUP_HP_X360] = {
8524		.type = HDA_FIXUP_FUNC,
8525		.v.func = alc295_fixup_hp_top_speakers,
8526		.chained = true,
8527		.chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC3
8528	},
8529	[ALC221_FIXUP_HP_HEADSET_MIC] = {
8530		.type = HDA_FIXUP_PINS,
8531		.v.pins = (const struct hda_pintbl[]) {
8532			{ 0x19, 0x0181313f},
8533			{ }
8534		},
8535		.chained = true,
8536		.chain_id = ALC269_FIXUP_HEADSET_MIC
8537	},
8538	[ALC285_FIXUP_LENOVO_HEADPHONE_NOISE] = {
8539		.type = HDA_FIXUP_FUNC,
8540		.v.func = alc285_fixup_invalidate_dacs,
8541		.chained = true,
8542		.chain_id = ALC269_FIXUP_THINKPAD_ACPI
8543	},
8544	[ALC295_FIXUP_HP_AUTO_MUTE] = {
8545		.type = HDA_FIXUP_FUNC,
8546		.v.func = alc_fixup_auto_mute_via_amp,
8547	},
8548	[ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE] = {
8549		.type = HDA_FIXUP_PINS,
8550		.v.pins = (const struct hda_pintbl[]) {
8551			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8552			{ }
8553		},
8554		.chained = true,
8555		.chain_id = ALC269_FIXUP_HEADSET_MIC
8556	},
8557	[ALC294_FIXUP_ASUS_MIC] = {
8558		.type = HDA_FIXUP_PINS,
8559		.v.pins = (const struct hda_pintbl[]) {
8560			{ 0x13, 0x90a60160 }, /* use as internal mic */
8561			{ 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
8562			{ }
8563		},
8564		.chained = true,
8565		.chain_id = ALC269_FIXUP_HEADSET_MIC
8566	},
8567	[ALC294_FIXUP_ASUS_HEADSET_MIC] = {
8568		.type = HDA_FIXUP_PINS,
8569		.v.pins = (const struct hda_pintbl[]) {
8570			{ 0x19, 0x01a1103c }, /* use as headset mic */
8571			{ }
8572		},
8573		.chained = true,
8574		.chain_id = ALC269_FIXUP_HEADSET_MIC
8575	},
8576	[ALC294_FIXUP_ASUS_SPK] = {
8577		.type = HDA_FIXUP_VERBS,
8578		.v.verbs = (const struct hda_verb[]) {
8579			/* Set EAPD high */
8580			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x40 },
8581			{ 0x20, AC_VERB_SET_PROC_COEF, 0x8800 },
8582			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
8583			{ 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
8584			{ }
8585		},
8586		.chained = true,
8587		.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8588	},
8589	[ALC295_FIXUP_CHROME_BOOK] = {
8590		.type = HDA_FIXUP_FUNC,
8591		.v.func = alc295_fixup_chromebook,
8592		.chained = true,
8593		.chain_id = ALC225_FIXUP_HEADSET_JACK
8594	},
8595	[ALC225_FIXUP_HEADSET_JACK] = {
8596		.type = HDA_FIXUP_FUNC,
8597		.v.func = alc_fixup_headset_jack,
8598	},
8599	[ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
8600		.type = HDA_FIXUP_PINS,
8601		.v.pins = (const struct hda_pintbl[]) {
8602			{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8603			{ }
8604		},
8605		.chained = true,
8606		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8607	},
8608	[ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE] = {
8609		.type = HDA_FIXUP_VERBS,
8610		.v.verbs = (const struct hda_verb[]) {
8611			/* Disable PCBEEP-IN passthrough */
8612			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
8613			{ 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
8614			{ }
8615		},
8616		.chained = true,
8617		.chain_id = ALC285_FIXUP_LENOVO_HEADPHONE_NOISE
8618	},
8619	[ALC255_FIXUP_ACER_HEADSET_MIC] = {
8620		.type = HDA_FIXUP_PINS,
8621		.v.pins = (const struct hda_pintbl[]) {
8622			{ 0x19, 0x03a11130 },
8623			{ 0x1a, 0x90a60140 }, /* use as internal mic */
8624			{ }
8625		},
8626		.chained = true,
8627		.chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
8628	},
8629	[ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE] = {
8630		.type = HDA_FIXUP_PINS,
8631		.v.pins = (const struct hda_pintbl[]) {
8632			{ 0x16, 0x01011020 }, /* Rear Line out */
8633			{ 0x19, 0x01a1913c }, /* use as Front headset mic, without its own jack detect */
8634			{ }
8635		},
8636		.chained = true,
8637		.chain_id = ALC225_FIXUP_WYSE_AUTO_MUTE
8638	},
8639	[ALC225_FIXUP_WYSE_AUTO_MUTE] = {
8640		.type = HDA_FIXUP_FUNC,
8641		.v.func = alc_fixup_auto_mute_via_amp,
8642		.chained = true,
8643		.chain_id = ALC225_FIXUP_WYSE_DISABLE_MIC_VREF
8644	},
8645	[ALC225_FIXUP_WYSE_DISABLE_MIC_VREF] = {
8646		.type = HDA_FIXUP_FUNC,
8647		.v.func = alc_fixup_disable_mic_vref,
8648		.chained = true,
8649		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8650	},
8651	[ALC286_FIXUP_ACER_AIO_HEADSET_MIC] = {
8652		.type = HDA_FIXUP_VERBS,
8653		.v.verbs = (const struct hda_verb[]) {
8654			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x4f },
8655			{ 0x20, AC_VERB_SET_PROC_COEF, 0x5029 },
8656			{ }
8657		},
8658		.chained = true,
8659		.chain_id = ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE
8660	},
8661	[ALC256_FIXUP_ASUS_HEADSET_MIC] = {
8662		.type = HDA_FIXUP_PINS,
8663		.v.pins = (const struct hda_pintbl[]) {
8664			{ 0x19, 0x03a11020 }, /* headset mic with jack detect */
8665			{ }
8666		},
8667		.chained = true,
8668		.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8669	},
8670	[ALC256_FIXUP_ASUS_MIC_NO_PRESENCE] = {
8671		.type = HDA_FIXUP_PINS,
8672		.v.pins = (const struct hda_pintbl[]) {
8673			{ 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
8674			{ }
8675		},
8676		.chained = true,
8677		.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8678	},
8679	[ALC299_FIXUP_PREDATOR_SPK] = {
8680		.type = HDA_FIXUP_PINS,
8681		.v.pins = (const struct hda_pintbl[]) {
8682			{ 0x21, 0x90170150 }, /* use as headset mic, without its own jack detect */
8683			{ }
8684		}
8685	},
8686	[ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE] = {
8687		.type = HDA_FIXUP_PINS,
8688		.v.pins = (const struct hda_pintbl[]) {
8689			{ 0x19, 0x04a11040 },
8690			{ 0x21, 0x04211020 },
8691			{ }
8692		},
8693		.chained = true,
8694		.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8695	},
8696	[ALC289_FIXUP_DELL_SPK1] = {
8697		.type = HDA_FIXUP_PINS,
8698		.v.pins = (const struct hda_pintbl[]) {
8699			{ 0x14, 0x90170140 },
8700			{ }
8701		},
8702		.chained = true,
8703		.chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE
8704	},
8705	[ALC289_FIXUP_DELL_SPK2] = {
8706		.type = HDA_FIXUP_PINS,
8707		.v.pins = (const struct hda_pintbl[]) {
8708			{ 0x17, 0x90170130 }, /* bass spk */
8709			{ }
8710		},
8711		.chained = true,
8712		.chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE
8713	},
8714	[ALC289_FIXUP_DUAL_SPK] = {
8715		.type = HDA_FIXUP_FUNC,
8716		.v.func = alc285_fixup_speaker2_to_dac1,
8717		.chained = true,
8718		.chain_id = ALC289_FIXUP_DELL_SPK2
8719	},
8720	[ALC289_FIXUP_RTK_AMP_DUAL_SPK] = {
8721		.type = HDA_FIXUP_FUNC,
8722		.v.func = alc285_fixup_speaker2_to_dac1,
8723		.chained = true,
8724		.chain_id = ALC289_FIXUP_DELL_SPK1
8725	},
8726	[ALC294_FIXUP_SPK2_TO_DAC1] = {
8727		.type = HDA_FIXUP_FUNC,
8728		.v.func = alc285_fixup_speaker2_to_dac1,
8729		.chained = true,
8730		.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8731	},
8732	[ALC294_FIXUP_ASUS_DUAL_SPK] = {
8733		.type = HDA_FIXUP_FUNC,
8734		/* The GPIO must be pulled to initialize the AMP */
8735		.v.func = alc_fixup_gpio4,
8736		.chained = true,
8737		.chain_id = ALC294_FIXUP_SPK2_TO_DAC1
8738	},
8739	[ALC294_FIXUP_ASUS_ALLY] = {
8740		.type = HDA_FIXUP_FUNC,
8741		.v.func = cs35l41_fixup_i2c_two,
8742		.chained = true,
8743		.chain_id = ALC294_FIXUP_ASUS_ALLY_PINS
8744	},
8745	[ALC294_FIXUP_ASUS_ALLY_PINS] = {
8746		.type = HDA_FIXUP_PINS,
8747		.v.pins = (const struct hda_pintbl[]) {
8748			{ 0x19, 0x03a11050 },
8749			{ 0x1a, 0x03a11c30 },
8750			{ 0x21, 0x03211420 },
8751			{ }
8752		},
8753		.chained = true,
8754		.chain_id = ALC294_FIXUP_ASUS_ALLY_VERBS
8755	},
8756	[ALC294_FIXUP_ASUS_ALLY_VERBS] = {
8757		.type = HDA_FIXUP_VERBS,
8758		.v.verbs = (const struct hda_verb[]) {
8759			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
8760			{ 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
8761			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x46 },
8762			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0004 },
8763			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x47 },
8764			{ 0x20, AC_VERB_SET_PROC_COEF, 0xa47a },
8765			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x49 },
8766			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0049},
8767			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x4a },
8768			{ 0x20, AC_VERB_SET_PROC_COEF, 0x201b },
8769			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x6b },
8770			{ 0x20, AC_VERB_SET_PROC_COEF, 0x4278},
8771			{ }
8772		},
8773		.chained = true,
8774		.chain_id = ALC294_FIXUP_ASUS_ALLY_SPEAKER
8775	},
8776	[ALC294_FIXUP_ASUS_ALLY_SPEAKER] = {
8777		.type = HDA_FIXUP_FUNC,
8778		.v.func = alc285_fixup_speaker2_to_dac1,
8779	},
8780	[ALC285_FIXUP_THINKPAD_X1_GEN7] = {
8781		.type = HDA_FIXUP_FUNC,
8782		.v.func = alc285_fixup_thinkpad_x1_gen7,
8783		.chained = true,
8784		.chain_id = ALC269_FIXUP_THINKPAD_ACPI
8785	},
8786	[ALC285_FIXUP_THINKPAD_HEADSET_JACK] = {
8787		.type = HDA_FIXUP_FUNC,
8788		.v.func = alc_fixup_headset_jack,
8789		.chained = true,
8790		.chain_id = ALC285_FIXUP_THINKPAD_X1_GEN7
8791	},
8792	[ALC294_FIXUP_ASUS_HPE] = {
8793		.type = HDA_FIXUP_VERBS,
8794		.v.verbs = (const struct hda_verb[]) {
8795			/* Set EAPD high */
8796			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
8797			{ 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
8798			{ }
8799		},
8800		.chained = true,
8801		.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8802	},
8803	[ALC294_FIXUP_ASUS_GX502_PINS] = {
8804		.type = HDA_FIXUP_PINS,
8805		.v.pins = (const struct hda_pintbl[]) {
8806			{ 0x19, 0x03a11050 }, /* front HP mic */
8807			{ 0x1a, 0x01a11830 }, /* rear external mic */
8808			{ 0x21, 0x03211020 }, /* front HP out */
8809			{ }
8810		},
8811		.chained = true,
8812		.chain_id = ALC294_FIXUP_ASUS_GX502_VERBS
8813	},
8814	[ALC294_FIXUP_ASUS_GX502_VERBS] = {
8815		.type = HDA_FIXUP_VERBS,
8816		.v.verbs = (const struct hda_verb[]) {
8817			/* set 0x15 to HP-OUT ctrl */
8818			{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
8819			/* unmute the 0x15 amp */
8820			{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
8821			{ }
8822		},
8823		.chained = true,
8824		.chain_id = ALC294_FIXUP_ASUS_GX502_HP
8825	},
8826	[ALC294_FIXUP_ASUS_GX502_HP] = {
8827		.type = HDA_FIXUP_FUNC,
8828		.v.func = alc294_fixup_gx502_hp,
8829	},
8830	[ALC294_FIXUP_ASUS_GU502_PINS] = {
8831		.type = HDA_FIXUP_PINS,
8832		.v.pins = (const struct hda_pintbl[]) {
8833			{ 0x19, 0x01a11050 }, /* rear HP mic */
8834			{ 0x1a, 0x01a11830 }, /* rear external mic */
8835			{ 0x21, 0x012110f0 }, /* rear HP out */
8836			{ }
8837		},
8838		.chained = true,
8839		.chain_id = ALC294_FIXUP_ASUS_GU502_VERBS
8840	},
8841	[ALC294_FIXUP_ASUS_GU502_VERBS] = {
8842		.type = HDA_FIXUP_VERBS,
8843		.v.verbs = (const struct hda_verb[]) {
8844			/* set 0x15 to HP-OUT ctrl */
8845			{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
8846			/* unmute the 0x15 amp */
8847			{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
8848			/* set 0x1b to HP-OUT */
8849			{ 0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
8850			{ }
8851		},
8852		.chained = true,
8853		.chain_id = ALC294_FIXUP_ASUS_GU502_HP
8854	},
8855	[ALC294_FIXUP_ASUS_GU502_HP] = {
8856		.type = HDA_FIXUP_FUNC,
8857		.v.func = alc294_fixup_gu502_hp,
8858	},
8859	 [ALC294_FIXUP_ASUS_G513_PINS] = {
8860		.type = HDA_FIXUP_PINS,
8861		.v.pins = (const struct hda_pintbl[]) {
8862				{ 0x19, 0x03a11050 }, /* front HP mic */
8863				{ 0x1a, 0x03a11c30 }, /* rear external mic */
8864				{ 0x21, 0x03211420 }, /* front HP out */
8865				{ }
8866		},
8867	},
8868	[ALC285_FIXUP_ASUS_G533Z_PINS] = {
8869		.type = HDA_FIXUP_PINS,
8870		.v.pins = (const struct hda_pintbl[]) {
8871			{ 0x14, 0x90170152 }, /* Speaker Surround Playback Switch */
8872			{ 0x19, 0x03a19020 }, /* Mic Boost Volume */
8873			{ 0x1a, 0x03a11c30 }, /* Mic Boost Volume */
8874			{ 0x1e, 0x90170151 }, /* Rear jack, IN OUT EAPD Detect */
8875			{ 0x21, 0x03211420 },
8876			{ }
8877		},
8878	},
8879	[ALC294_FIXUP_ASUS_COEF_1B] = {
8880		.type = HDA_FIXUP_VERBS,
8881		.v.verbs = (const struct hda_verb[]) {
8882			/* Set bit 10 to correct noisy output after reboot from
8883			 * Windows 10 (due to pop noise reduction?)
8884			 */
8885			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x1b },
8886			{ 0x20, AC_VERB_SET_PROC_COEF, 0x4e4b },
8887			{ }
8888		},
8889		.chained = true,
8890		.chain_id = ALC289_FIXUP_ASUS_GA401,
8891	},
8892	[ALC285_FIXUP_HP_GPIO_LED] = {
8893		.type = HDA_FIXUP_FUNC,
8894		.v.func = alc285_fixup_hp_gpio_led,
8895	},
8896	[ALC285_FIXUP_HP_MUTE_LED] = {
8897		.type = HDA_FIXUP_FUNC,
8898		.v.func = alc285_fixup_hp_mute_led,
8899	},
8900	[ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED] = {
8901		.type = HDA_FIXUP_FUNC,
8902		.v.func = alc285_fixup_hp_spectre_x360_mute_led,
8903	},
8904	[ALC236_FIXUP_HP_MUTE_LED_COEFBIT2] = {
8905	    .type = HDA_FIXUP_FUNC,
8906	    .v.func = alc236_fixup_hp_mute_led_coefbit2,
8907	},
8908	[ALC236_FIXUP_HP_GPIO_LED] = {
8909		.type = HDA_FIXUP_FUNC,
8910		.v.func = alc236_fixup_hp_gpio_led,
8911	},
8912	[ALC236_FIXUP_HP_MUTE_LED] = {
8913		.type = HDA_FIXUP_FUNC,
8914		.v.func = alc236_fixup_hp_mute_led,
8915	},
8916	[ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF] = {
8917		.type = HDA_FIXUP_FUNC,
8918		.v.func = alc236_fixup_hp_mute_led_micmute_vref,
8919	},
8920	[ALC298_FIXUP_SAMSUNG_AMP] = {
8921		.type = HDA_FIXUP_FUNC,
8922		.v.func = alc298_fixup_samsung_amp,
8923		.chained = true,
8924		.chain_id = ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET
8925	},
8926	[ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
8927		.type = HDA_FIXUP_VERBS,
8928		.v.verbs = (const struct hda_verb[]) {
8929			{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc5 },
8930			{ }
8931		},
8932	},
8933	[ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
8934		.type = HDA_FIXUP_VERBS,
8935		.v.verbs = (const struct hda_verb[]) {
8936			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x08},
8937			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2fcf},
8938			{ }
8939		},
8940	},
8941	[ALC295_FIXUP_ASUS_MIC_NO_PRESENCE] = {
8942		.type = HDA_FIXUP_PINS,
8943		.v.pins = (const struct hda_pintbl[]) {
8944			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8945			{ }
8946		},
8947		.chained = true,
8948		.chain_id = ALC269_FIXUP_HEADSET_MODE
8949	},
8950	[ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS] = {
8951		.type = HDA_FIXUP_PINS,
8952		.v.pins = (const struct hda_pintbl[]) {
8953			{ 0x14, 0x90100120 }, /* use as internal speaker */
8954			{ 0x18, 0x02a111f0 }, /* use as headset mic, without its own jack detect */
8955			{ 0x1a, 0x01011020 }, /* use as line out */
8956			{ },
8957		},
8958		.chained = true,
8959		.chain_id = ALC269_FIXUP_HEADSET_MIC
8960	},
8961	[ALC269VC_FIXUP_ACER_HEADSET_MIC] = {
8962		.type = HDA_FIXUP_PINS,
8963		.v.pins = (const struct hda_pintbl[]) {
8964			{ 0x18, 0x02a11030 }, /* use as headset mic */
8965			{ }
8966		},
8967		.chained = true,
8968		.chain_id = ALC269_FIXUP_HEADSET_MIC
8969	},
8970	[ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE] = {
8971		.type = HDA_FIXUP_PINS,
8972		.v.pins = (const struct hda_pintbl[]) {
8973			{ 0x18, 0x01a11130 }, /* use as headset mic, without its own jack detect */
8974			{ }
8975		},
8976		.chained = true,
8977		.chain_id = ALC269_FIXUP_HEADSET_MIC
8978	},
8979	[ALC289_FIXUP_ASUS_GA401] = {
8980		.type = HDA_FIXUP_FUNC,
8981		.v.func = alc289_fixup_asus_ga401,
8982		.chained = true,
8983		.chain_id = ALC289_FIXUP_ASUS_GA502,
8984	},
8985	[ALC289_FIXUP_ASUS_GA502] = {
8986		.type = HDA_FIXUP_PINS,
8987		.v.pins = (const struct hda_pintbl[]) {
8988			{ 0x19, 0x03a11020 }, /* headset mic with jack detect */
8989			{ }
8990		},
8991	},
8992	[ALC256_FIXUP_ACER_MIC_NO_PRESENCE] = {
8993		.type = HDA_FIXUP_PINS,
8994		.v.pins = (const struct hda_pintbl[]) {
8995			{ 0x19, 0x02a11120 }, /* use as headset mic, without its own jack detect */
8996			{ }
8997		},
8998		.chained = true,
8999		.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
9000	},
9001	[ALC285_FIXUP_HP_GPIO_AMP_INIT] = {
9002		.type = HDA_FIXUP_FUNC,
9003		.v.func = alc285_fixup_hp_gpio_amp_init,
9004		.chained = true,
9005		.chain_id = ALC285_FIXUP_HP_GPIO_LED
9006	},
9007	[ALC269_FIXUP_CZC_B20] = {
9008		.type = HDA_FIXUP_PINS,
9009		.v.pins = (const struct hda_pintbl[]) {
9010			{ 0x12, 0x411111f0 },
9011			{ 0x14, 0x90170110 }, /* speaker */
9012			{ 0x15, 0x032f1020 }, /* HP out */
9013			{ 0x17, 0x411111f0 },
9014			{ 0x18, 0x03ab1040 }, /* mic */
9015			{ 0x19, 0xb7a7013f },
9016			{ 0x1a, 0x0181305f },
9017			{ 0x1b, 0x411111f0 },
9018			{ 0x1d, 0x411111f0 },
9019			{ 0x1e, 0x411111f0 },
9020			{ }
9021		},
9022		.chain_id = ALC269_FIXUP_DMIC,
9023	},
9024	[ALC269_FIXUP_CZC_TMI] = {
9025		.type = HDA_FIXUP_PINS,
9026		.v.pins = (const struct hda_pintbl[]) {
9027			{ 0x12, 0x4000c000 },
9028			{ 0x14, 0x90170110 }, /* speaker */
9029			{ 0x15, 0x0421401f }, /* HP out */
9030			{ 0x17, 0x411111f0 },
9031			{ 0x18, 0x04a19020 }, /* mic */
9032			{ 0x19, 0x411111f0 },
9033			{ 0x1a, 0x411111f0 },
9034			{ 0x1b, 0x411111f0 },
9035			{ 0x1d, 0x40448505 },
9036			{ 0x1e, 0x411111f0 },
9037			{ 0x20, 0x8000ffff },
9038			{ }
9039		},
9040		.chain_id = ALC269_FIXUP_DMIC,
9041	},
9042	[ALC269_FIXUP_CZC_L101] = {
9043		.type = HDA_FIXUP_PINS,
9044		.v.pins = (const struct hda_pintbl[]) {
9045			{ 0x12, 0x40000000 },
9046			{ 0x14, 0x01014010 }, /* speaker */
9047			{ 0x15, 0x411111f0 }, /* HP out */
9048			{ 0x16, 0x411111f0 },
9049			{ 0x18, 0x01a19020 }, /* mic */
9050			{ 0x19, 0x02a19021 },
9051			{ 0x1a, 0x0181302f },
9052			{ 0x1b, 0x0221401f },
9053			{ 0x1c, 0x411111f0 },
9054			{ 0x1d, 0x4044c601 },
9055			{ 0x1e, 0x411111f0 },
9056			{ }
9057		},
9058		.chain_id = ALC269_FIXUP_DMIC,
9059	},
9060	[ALC269_FIXUP_LEMOTE_A1802] = {
9061		.type = HDA_FIXUP_PINS,
9062		.v.pins = (const struct hda_pintbl[]) {
9063			{ 0x12, 0x40000000 },
9064			{ 0x14, 0x90170110 }, /* speaker */
9065			{ 0x17, 0x411111f0 },
9066			{ 0x18, 0x03a19040 }, /* mic1 */
9067			{ 0x19, 0x90a70130 }, /* mic2 */
9068			{ 0x1a, 0x411111f0 },
9069			{ 0x1b, 0x411111f0 },
9070			{ 0x1d, 0x40489d2d },
9071			{ 0x1e, 0x411111f0 },
9072			{ 0x20, 0x0003ffff },
9073			{ 0x21, 0x03214020 },
9074			{ }
9075		},
9076		.chain_id = ALC269_FIXUP_DMIC,
9077	},
9078	[ALC269_FIXUP_LEMOTE_A190X] = {
9079		.type = HDA_FIXUP_PINS,
9080		.v.pins = (const struct hda_pintbl[]) {
9081			{ 0x14, 0x99130110 }, /* speaker */
9082			{ 0x15, 0x0121401f }, /* HP out */
9083			{ 0x18, 0x01a19c20 }, /* rear  mic */
9084			{ 0x19, 0x99a3092f }, /* front mic */
9085			{ 0x1b, 0x0201401f }, /* front lineout */
9086			{ }
9087		},
9088		.chain_id = ALC269_FIXUP_DMIC,
9089	},
9090	[ALC256_FIXUP_INTEL_NUC8_RUGGED] = {
9091		.type = HDA_FIXUP_PINS,
9092		.v.pins = (const struct hda_pintbl[]) {
9093			{ 0x1b, 0x01a1913c }, /* use as headset mic, without its own jack detect */
9094			{ }
9095		},
9096		.chained = true,
9097		.chain_id = ALC269_FIXUP_HEADSET_MODE
9098	},
9099	[ALC256_FIXUP_INTEL_NUC10] = {
9100		.type = HDA_FIXUP_PINS,
9101		.v.pins = (const struct hda_pintbl[]) {
9102			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
9103			{ }
9104		},
9105		.chained = true,
9106		.chain_id = ALC269_FIXUP_HEADSET_MODE
9107	},
9108	[ALC255_FIXUP_XIAOMI_HEADSET_MIC] = {
9109		.type = HDA_FIXUP_VERBS,
9110		.v.verbs = (const struct hda_verb[]) {
9111			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
9112			{ 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
9113			{ }
9114		},
9115		.chained = true,
9116		.chain_id = ALC289_FIXUP_ASUS_GA502
9117	},
9118	[ALC274_FIXUP_HP_MIC] = {
9119		.type = HDA_FIXUP_VERBS,
9120		.v.verbs = (const struct hda_verb[]) {
9121			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
9122			{ 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
9123			{ }
9124		},
9125	},
9126	[ALC274_FIXUP_HP_HEADSET_MIC] = {
9127		.type = HDA_FIXUP_FUNC,
9128		.v.func = alc274_fixup_hp_headset_mic,
9129		.chained = true,
9130		.chain_id = ALC274_FIXUP_HP_MIC
9131	},
9132	[ALC274_FIXUP_HP_ENVY_GPIO] = {
9133		.type = HDA_FIXUP_FUNC,
9134		.v.func = alc274_fixup_hp_envy_gpio,
9135	},
9136	[ALC256_FIXUP_ASUS_HPE] = {
9137		.type = HDA_FIXUP_VERBS,
9138		.v.verbs = (const struct hda_verb[]) {
9139			/* Set EAPD high */
9140			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
9141			{ 0x20, AC_VERB_SET_PROC_COEF, 0x7778 },
9142			{ }
9143		},
9144		.chained = true,
9145		.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
9146	},
9147	[ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK] = {
9148		.type = HDA_FIXUP_FUNC,
9149		.v.func = alc_fixup_headset_jack,
9150		.chained = true,
9151		.chain_id = ALC269_FIXUP_THINKPAD_ACPI
9152	},
9153	[ALC287_FIXUP_HP_GPIO_LED] = {
9154		.type = HDA_FIXUP_FUNC,
9155		.v.func = alc287_fixup_hp_gpio_led,
9156	},
9157	[ALC256_FIXUP_HP_HEADSET_MIC] = {
9158		.type = HDA_FIXUP_FUNC,
9159		.v.func = alc274_fixup_hp_headset_mic,
9160	},
9161	[ALC236_FIXUP_DELL_AIO_HEADSET_MIC] = {
9162		.type = HDA_FIXUP_FUNC,
9163		.v.func = alc_fixup_no_int_mic,
9164		.chained = true,
9165		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
9166	},
9167	[ALC282_FIXUP_ACER_DISABLE_LINEOUT] = {
9168		.type = HDA_FIXUP_PINS,
9169		.v.pins = (const struct hda_pintbl[]) {
9170			{ 0x1b, 0x411111f0 },
9171			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
9172			{ },
9173		},
9174		.chained = true,
9175		.chain_id = ALC269_FIXUP_HEADSET_MODE
9176	},
9177	[ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST] = {
9178		.type = HDA_FIXUP_FUNC,
9179		.v.func = alc269_fixup_limit_int_mic_boost,
9180		.chained = true,
9181		.chain_id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
9182	},
9183	[ALC256_FIXUP_ACER_HEADSET_MIC] = {
9184		.type = HDA_FIXUP_PINS,
9185		.v.pins = (const struct hda_pintbl[]) {
9186			{ 0x19, 0x02a1113c }, /* use as headset mic, without its own jack detect */
9187			{ 0x1a, 0x90a1092f }, /* use as internal mic */
9188			{ }
9189		},
9190		.chained = true,
9191		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
9192	},
9193	[ALC285_FIXUP_IDEAPAD_S740_COEF] = {
9194		.type = HDA_FIXUP_FUNC,
9195		.v.func = alc285_fixup_ideapad_s740_coef,
9196		.chained = true,
9197		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
9198	},
9199	[ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST] = {
9200		.type = HDA_FIXUP_FUNC,
9201		.v.func = alc269_fixup_limit_int_mic_boost,
9202		.chained = true,
9203		.chain_id = ALC285_FIXUP_HP_MUTE_LED,
9204	},
9205	[ALC295_FIXUP_ASUS_DACS] = {
9206		.type = HDA_FIXUP_FUNC,
9207		.v.func = alc295_fixup_asus_dacs,
9208	},
9209	[ALC295_FIXUP_HP_OMEN] = {
9210		.type = HDA_FIXUP_PINS,
9211		.v.pins = (const struct hda_pintbl[]) {
9212			{ 0x12, 0xb7a60130 },
9213			{ 0x13, 0x40000000 },
9214			{ 0x14, 0x411111f0 },
9215			{ 0x16, 0x411111f0 },
9216			{ 0x17, 0x90170110 },
9217			{ 0x18, 0x411111f0 },
9218			{ 0x19, 0x02a11030 },
9219			{ 0x1a, 0x411111f0 },
9220			{ 0x1b, 0x04a19030 },
9221			{ 0x1d, 0x40600001 },
9222			{ 0x1e, 0x411111f0 },
9223			{ 0x21, 0x03211020 },
9224			{}
9225		},
9226		.chained = true,
9227		.chain_id = ALC269_FIXUP_HP_LINE1_MIC1_LED,
9228	},
9229	[ALC285_FIXUP_HP_SPECTRE_X360] = {
9230		.type = HDA_FIXUP_FUNC,
9231		.v.func = alc285_fixup_hp_spectre_x360,
9232	},
9233	[ALC285_FIXUP_HP_SPECTRE_X360_EB1] = {
9234		.type = HDA_FIXUP_FUNC,
9235		.v.func = alc285_fixup_hp_spectre_x360_eb1
9236	},
9237	[ALC285_FIXUP_HP_ENVY_X360] = {
9238		.type = HDA_FIXUP_FUNC,
9239		.v.func = alc285_fixup_hp_envy_x360,
9240		.chained = true,
9241		.chain_id = ALC285_FIXUP_HP_GPIO_AMP_INIT,
9242	},
9243	[ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP] = {
9244		.type = HDA_FIXUP_FUNC,
9245		.v.func = alc285_fixup_ideapad_s740_coef,
9246		.chained = true,
9247		.chain_id = ALC285_FIXUP_THINKPAD_HEADSET_JACK,
9248	},
9249	[ALC623_FIXUP_LENOVO_THINKSTATION_P340] = {
9250		.type = HDA_FIXUP_FUNC,
9251		.v.func = alc_fixup_no_shutup,
9252		.chained = true,
9253		.chain_id = ALC283_FIXUP_HEADSET_MIC,
9254	},
9255	[ALC255_FIXUP_ACER_HEADPHONE_AND_MIC] = {
9256		.type = HDA_FIXUP_PINS,
9257		.v.pins = (const struct hda_pintbl[]) {
9258			{ 0x21, 0x03211030 }, /* Change the Headphone location to Left */
9259			{ }
9260		},
9261		.chained = true,
9262		.chain_id = ALC255_FIXUP_XIAOMI_HEADSET_MIC
9263	},
9264	[ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST] = {
9265		.type = HDA_FIXUP_FUNC,
9266		.v.func = alc269_fixup_limit_int_mic_boost,
9267		.chained = true,
9268		.chain_id = ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,
9269	},
9270	[ALC285_FIXUP_LEGION_Y9000X_SPEAKERS] = {
9271		.type = HDA_FIXUP_FUNC,
9272		.v.func = alc285_fixup_ideapad_s740_coef,
9273		.chained = true,
9274		.chain_id = ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,
9275	},
9276	[ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE] = {
9277		.type = HDA_FIXUP_FUNC,
9278		.v.func = alc287_fixup_legion_15imhg05_speakers,
9279		.chained = true,
9280		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
9281	},
9282	[ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS] = {
9283		.type = HDA_FIXUP_VERBS,
9284		//.v.verbs = legion_15imhg05_coefs,
9285		.v.verbs = (const struct hda_verb[]) {
9286			 // set left speaker Legion 7i.
9287			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9288			 { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
9289
9290			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9291			 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9292			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9293			 { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
9294			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9295
9296			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9297			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9298			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9299			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9300			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9301
9302			 // set right speaker Legion 7i.
9303			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9304			 { 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
9305
9306			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9307			 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9308			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9309			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
9310			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9311
9312			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9313			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9314			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9315			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9316			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9317			 {}
9318		},
9319		.chained = true,
9320		.chain_id = ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,
9321	},
9322	[ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE] = {
9323		.type = HDA_FIXUP_FUNC,
9324		.v.func = alc287_fixup_legion_15imhg05_speakers,
9325		.chained = true,
9326		.chain_id = ALC269_FIXUP_HEADSET_MODE,
9327	},
9328	[ALC287_FIXUP_YOGA7_14ITL_SPEAKERS] = {
9329		.type = HDA_FIXUP_VERBS,
9330		.v.verbs = (const struct hda_verb[]) {
9331			 // set left speaker Yoga 7i.
9332			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9333			 { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
9334
9335			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9336			 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9337			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9338			 { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
9339			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9340
9341			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9342			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9343			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9344			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9345			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9346
9347			 // set right speaker Yoga 7i.
9348			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9349			 { 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
9350
9351			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9352			 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9353			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9354			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
9355			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9356
9357			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9358			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9359			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9360			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9361			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9362			 {}
9363		},
9364		.chained = true,
9365		.chain_id = ALC269_FIXUP_HEADSET_MODE,
9366	},
9367	[ALC298_FIXUP_LENOVO_C940_DUET7] = {
9368		.type = HDA_FIXUP_FUNC,
9369		.v.func = alc298_fixup_lenovo_c940_duet7,
9370	},
9371	[ALC287_FIXUP_LENOVO_14IRP8_DUETITL] = {
9372		.type = HDA_FIXUP_FUNC,
9373		.v.func = alc287_fixup_lenovo_14irp8_duetitl,
9374	},
9375	[ALC287_FIXUP_13S_GEN2_SPEAKERS] = {
9376		.type = HDA_FIXUP_VERBS,
9377		.v.verbs = (const struct hda_verb[]) {
9378			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9379			{ 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
9380			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9381			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9382			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9383			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9384			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9385			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9386			{ 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
9387			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9388			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9389			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9390			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9391			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9392			{}
9393		},
9394		.chained = true,
9395		.chain_id = ALC269_FIXUP_HEADSET_MODE,
9396	},
9397	[ALC256_FIXUP_SET_COEF_DEFAULTS] = {
9398		.type = HDA_FIXUP_FUNC,
9399		.v.func = alc256_fixup_set_coef_defaults,
9400	},
9401	[ALC245_FIXUP_HP_GPIO_LED] = {
9402		.type = HDA_FIXUP_FUNC,
9403		.v.func = alc245_fixup_hp_gpio_led,
9404	},
9405	[ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
9406		.type = HDA_FIXUP_PINS,
9407		.v.pins = (const struct hda_pintbl[]) {
9408			{ 0x19, 0x03a11120 }, /* use as headset mic, without its own jack detect */
9409			{ }
9410		},
9411		.chained = true,
9412		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
9413	},
9414	[ALC233_FIXUP_NO_AUDIO_JACK] = {
9415		.type = HDA_FIXUP_FUNC,
9416		.v.func = alc233_fixup_no_audio_jack,
9417	},
9418	[ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME] = {
9419		.type = HDA_FIXUP_FUNC,
9420		.v.func = alc256_fixup_mic_no_presence_and_resume,
9421		.chained = true,
9422		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
9423	},
9424	[ALC287_FIXUP_LEGION_16ACHG6] = {
9425		.type = HDA_FIXUP_FUNC,
9426		.v.func = alc287_fixup_legion_16achg6_speakers,
9427	},
9428	[ALC287_FIXUP_CS35L41_I2C_2] = {
9429		.type = HDA_FIXUP_FUNC,
9430		.v.func = cs35l41_fixup_i2c_two,
9431	},
9432	[ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED] = {
9433		.type = HDA_FIXUP_FUNC,
9434		.v.func = cs35l41_fixup_i2c_two,
9435		.chained = true,
9436		.chain_id = ALC285_FIXUP_HP_MUTE_LED,
9437	},
9438	[ALC245_FIXUP_CS35L41_SPI_2] = {
9439		.type = HDA_FIXUP_FUNC,
9440		.v.func = cs35l41_fixup_spi_two,
9441	},
9442	[ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED] = {
9443		.type = HDA_FIXUP_FUNC,
9444		.v.func = cs35l41_fixup_spi_two,
9445		.chained = true,
9446		.chain_id = ALC285_FIXUP_HP_GPIO_LED,
9447	},
9448	[ALC245_FIXUP_CS35L41_SPI_4] = {
9449		.type = HDA_FIXUP_FUNC,
9450		.v.func = cs35l41_fixup_spi_four,
9451	},
9452	[ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED] = {
9453		.type = HDA_FIXUP_FUNC,
9454		.v.func = cs35l41_fixup_spi_four,
9455		.chained = true,
9456		.chain_id = ALC285_FIXUP_HP_GPIO_LED,
9457	},
9458	[ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED] = {
9459		.type = HDA_FIXUP_VERBS,
9460		.v.verbs = (const struct hda_verb[]) {
9461			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x19 },
9462			 { 0x20, AC_VERB_SET_PROC_COEF, 0x8e11 },
9463			 { }
9464		},
9465		.chained = true,
9466		.chain_id = ALC285_FIXUP_HP_MUTE_LED,
9467	},
9468	[ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET] = {
9469		.type = HDA_FIXUP_FUNC,
9470		.v.func = alc_fixup_dell4_mic_no_presence_quiet,
9471		.chained = true,
9472		.chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
9473	},
9474	[ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE] = {
9475		.type = HDA_FIXUP_PINS,
9476		.v.pins = (const struct hda_pintbl[]) {
9477			{ 0x19, 0x02a1112c }, /* use as headset mic, without its own jack detect */
9478			{ }
9479		},
9480		.chained = true,
9481		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
9482	},
9483	[ALC287_FIXUP_LEGION_16ITHG6] = {
9484		.type = HDA_FIXUP_FUNC,
9485		.v.func = alc287_fixup_legion_16ithg6_speakers,
9486	},
9487	[ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK] = {
9488		.type = HDA_FIXUP_VERBS,
9489		.v.verbs = (const struct hda_verb[]) {
9490			// enable left speaker
9491			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9492			{ 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
9493
9494			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9495			{ 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9496			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9497			{ 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
9498			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9499
9500			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9501			{ 0x20, AC_VERB_SET_PROC_COEF, 0xf },
9502			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9503			{ 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
9504			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9505
9506			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9507			{ 0x20, AC_VERB_SET_PROC_COEF, 0x10 },
9508			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9509			{ 0x20, AC_VERB_SET_PROC_COEF, 0x40 },
9510			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9511
9512			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9513			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9514			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9515			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9516			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9517
9518			// enable right speaker
9519			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9520			{ 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
9521
9522			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9523			{ 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9524			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9525			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
9526			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9527
9528			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9529			{ 0x20, AC_VERB_SET_PROC_COEF, 0xf },
9530			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9531			{ 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
9532			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9533
9534			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9535			{ 0x20, AC_VERB_SET_PROC_COEF, 0x10 },
9536			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9537			{ 0x20, AC_VERB_SET_PROC_COEF, 0x44 },
9538			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9539
9540			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9541			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9542			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9543			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9544			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9545
9546			{ },
9547		},
9548	},
9549	[ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN] = {
9550		.type = HDA_FIXUP_FUNC,
9551		.v.func = alc287_fixup_yoga9_14iap7_bass_spk_pin,
9552		.chained = true,
9553		.chain_id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK,
9554	},
9555	[ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS] = {
9556		.type = HDA_FIXUP_FUNC,
9557		.v.func = alc295_fixup_dell_inspiron_top_speakers,
9558		.chained = true,
9559		.chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
9560	},
9561	[ALC236_FIXUP_DELL_DUAL_CODECS] = {
9562		.type = HDA_FIXUP_PINS,
9563		.v.func = alc1220_fixup_gb_dual_codecs,
9564		.chained = true,
9565		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9566	},
9567	[ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI] = {
9568		.type = HDA_FIXUP_FUNC,
9569		.v.func = cs35l41_fixup_i2c_two,
9570		.chained = true,
9571		.chain_id = ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
9572	},
9573	[ALC287_FIXUP_TAS2781_I2C] = {
9574		.type = HDA_FIXUP_FUNC,
9575		.v.func = tas2781_fixup_i2c,
9576		.chained = true,
9577		.chain_id = ALC285_FIXUP_THINKPAD_HEADSET_JACK,
9578	},
9579	[ALC245_FIXUP_HP_MUTE_LED_COEFBIT] = {
9580		.type = HDA_FIXUP_FUNC,
9581		.v.func = alc245_fixup_hp_mute_led_coefbit,
9582	},
9583	[ALC245_FIXUP_HP_X360_MUTE_LEDS] = {
9584		.type = HDA_FIXUP_FUNC,
9585		.v.func = alc245_fixup_hp_mute_led_coefbit,
9586		.chained = true,
9587		.chain_id = ALC245_FIXUP_HP_GPIO_LED
9588	},
9589	[ALC287_FIXUP_THINKPAD_I2S_SPK] = {
9590		.type = HDA_FIXUP_FUNC,
9591		.v.func = alc287_fixup_bind_dacs,
9592		.chained = true,
9593		.chain_id = ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
9594	},
9595	[ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD] = {
9596		.type = HDA_FIXUP_FUNC,
9597		.v.func = alc287_fixup_bind_dacs,
9598		.chained = true,
9599		.chain_id = ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI,
9600	},
9601	[ALC2XX_FIXUP_HEADSET_MIC] = {
9602		.type = HDA_FIXUP_FUNC,
9603		.v.func = alc_fixup_headset_mic,
9604	},
9605	[ALC289_FIXUP_DELL_CS35L41_SPI_2] = {
9606		.type = HDA_FIXUP_FUNC,
9607		.v.func = cs35l41_fixup_spi_two,
9608		.chained = true,
9609		.chain_id = ALC289_FIXUP_DUAL_SPK
9610	},
9611	[ALC294_FIXUP_CS35L41_I2C_2] = {
9612		.type = HDA_FIXUP_FUNC,
9613		.v.func = cs35l41_fixup_i2c_two,
9614	},
9615};
9616
9617static const struct snd_pci_quirk alc269_fixup_tbl[] = {
9618	SND_PCI_QUIRK(0x1025, 0x0283, "Acer TravelMate 8371", ALC269_FIXUP_INV_DMIC),
9619	SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC),
9620	SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC),
9621	SND_PCI_QUIRK(0x1025, 0x047c, "Acer AC700", ALC269_FIXUP_ACER_AC700),
9622	SND_PCI_QUIRK(0x1025, 0x072d, "Acer Aspire V5-571G", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
9623	SND_PCI_QUIRK(0x1025, 0x0740, "Acer AO725", ALC271_FIXUP_HP_GATE_MIC_JACK),
9624	SND_PCI_QUIRK(0x1025, 0x0742, "Acer AO756", ALC271_FIXUP_HP_GATE_MIC_JACK),
9625	SND_PCI_QUIRK(0x1025, 0x0762, "Acer Aspire E1-472", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
9626	SND_PCI_QUIRK(0x1025, 0x0775, "Acer Aspire E1-572", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
9627	SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS),
9628	SND_PCI_QUIRK(0x1025, 0x080d, "Acer Aspire V5-122P", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
9629	SND_PCI_QUIRK(0x1025, 0x0840, "Acer Aspire E1", ALC269VB_FIXUP_ASPIRE_E1_COEF),
9630	SND_PCI_QUIRK(0x1025, 0x101c, "Acer Veriton N2510G", ALC269_FIXUP_LIFEBOOK),
9631	SND_PCI_QUIRK(0x1025, 0x102b, "Acer Aspire C24-860", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE),
9632	SND_PCI_QUIRK(0x1025, 0x1065, "Acer Aspire C20-820", ALC269VC_FIXUP_ACER_HEADSET_MIC),
9633	SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK),
9634	SND_PCI_QUIRK(0x1025, 0x1094, "Acer Aspire E5-575T", ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST),
9635	SND_PCI_QUIRK(0x1025, 0x1099, "Acer Aspire E5-523G", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9636	SND_PCI_QUIRK(0x1025, 0x110e, "Acer Aspire ES1-432", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9637	SND_PCI_QUIRK(0x1025, 0x1166, "Acer Veriton N4640G", ALC269_FIXUP_LIFEBOOK),
9638	SND_PCI_QUIRK(0x1025, 0x1167, "Acer Veriton N6640G", ALC269_FIXUP_LIFEBOOK),
9639	SND_PCI_QUIRK(0x1025, 0x1246, "Acer Predator Helios 500", ALC299_FIXUP_PREDATOR_SPK),
9640	SND_PCI_QUIRK(0x1025, 0x1247, "Acer vCopperbox", ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS),
9641	SND_PCI_QUIRK(0x1025, 0x1248, "Acer Veriton N4660G", ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE),
9642	SND_PCI_QUIRK(0x1025, 0x1269, "Acer SWIFT SF314-54", ALC256_FIXUP_ACER_HEADSET_MIC),
9643	SND_PCI_QUIRK(0x1025, 0x126a, "Acer Swift SF114-32", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
9644	SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
9645	SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
9646	SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
9647	SND_PCI_QUIRK(0x1025, 0x129c, "Acer SWIFT SF314-55", ALC256_FIXUP_ACER_HEADSET_MIC),
9648	SND_PCI_QUIRK(0x1025, 0x129d, "Acer SWIFT SF313-51", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
9649	SND_PCI_QUIRK(0x1025, 0x1300, "Acer SWIFT SF314-56", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
9650	SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
9651	SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", ALC233_FIXUP_ACER_HEADSET_MIC),
9652	SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC),
9653	SND_PCI_QUIRK(0x1025, 0x141f, "Acer Spin SP513-54N", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9654	SND_PCI_QUIRK(0x1025, 0x142b, "Acer Swift SF314-42", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9655	SND_PCI_QUIRK(0x1025, 0x1430, "Acer TravelMate B311R-31", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
9656	SND_PCI_QUIRK(0x1025, 0x1466, "Acer Aspire A515-56", ALC255_FIXUP_ACER_HEADPHONE_AND_MIC),
9657	SND_PCI_QUIRK(0x1025, 0x1534, "Acer Predator PH315-54", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9658	SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
9659	SND_PCI_QUIRK(0x1028, 0x053c, "Dell Latitude E5430", ALC292_FIXUP_DELL_E7X),
9660	SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS),
9661	SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X),
9662	SND_PCI_QUIRK(0x1028, 0x05be, "Dell Latitude E6540", ALC292_FIXUP_DELL_E7X),
9663	SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X),
9664	SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X),
9665	SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER),
9666	SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
9667	SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
9668	SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
9669	SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
9670	SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
9671	SND_PCI_QUIRK(0x1028, 0x062c, "Dell Latitude E5550", ALC292_FIXUP_DELL_E7X),
9672	SND_PCI_QUIRK(0x1028, 0x062e, "Dell Latitude E7450", ALC292_FIXUP_DELL_E7X),
9673	SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),
9674	SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9675	SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9676	SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13),
9677	SND_PCI_QUIRK(0x1028, 0x0669, "Dell Optiplex 9020m", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
9678	SND_PCI_QUIRK(0x1028, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK),
9679	SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
9680	SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9681	SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9682	SND_PCI_QUIRK(0x1028, 0x06db, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9683	SND_PCI_QUIRK(0x1028, 0x06dd, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9684	SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9685	SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9686	SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9687	SND_PCI_QUIRK(0x1028, 0x0706, "Dell Inspiron 7559", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
9688	SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE),
9689	SND_PCI_QUIRK(0x1028, 0x0738, "Dell Precision 5820", ALC269_FIXUP_NO_SHUTUP),
9690	SND_PCI_QUIRK(0x1028, 0x075c, "Dell XPS 27 7760", ALC298_FIXUP_SPK_VOLUME),
9691	SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME),
9692	SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
9693	SND_PCI_QUIRK(0x1028, 0x07b0, "Dell Precision 7520", ALC295_FIXUP_DISABLE_DAC3),
9694	SND_PCI_QUIRK(0x1028, 0x080c, "Dell WYSE", ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE),
9695	SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
9696	SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
9697	SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
9698	SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
9699	SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB),
9700	SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE),
9701	SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE),
9702	SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
9703	SND_PCI_QUIRK(0x1028, 0x097d, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
9704	SND_PCI_QUIRK(0x1028, 0x097e, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
9705	SND_PCI_QUIRK(0x1028, 0x098d, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
9706	SND_PCI_QUIRK(0x1028, 0x09bf, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
9707	SND_PCI_QUIRK(0x1028, 0x0a2e, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
9708	SND_PCI_QUIRK(0x1028, 0x0a30, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
9709	SND_PCI_QUIRK(0x1028, 0x0a38, "Dell Latitude 7520", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET),
9710	SND_PCI_QUIRK(0x1028, 0x0a58, "Dell", ALC255_FIXUP_DELL_HEADSET_MIC),
9711	SND_PCI_QUIRK(0x1028, 0x0a61, "Dell XPS 15 9510", ALC289_FIXUP_DUAL_SPK),
9712	SND_PCI_QUIRK(0x1028, 0x0a62, "Dell Precision 5560", ALC289_FIXUP_DUAL_SPK),
9713	SND_PCI_QUIRK(0x1028, 0x0a9d, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
9714	SND_PCI_QUIRK(0x1028, 0x0a9e, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
9715	SND_PCI_QUIRK(0x1028, 0x0b19, "Dell XPS 15 9520", ALC289_FIXUP_DUAL_SPK),
9716	SND_PCI_QUIRK(0x1028, 0x0b1a, "Dell Precision 5570", ALC289_FIXUP_DUAL_SPK),
9717	SND_PCI_QUIRK(0x1028, 0x0b37, "Dell Inspiron 16 Plus 7620 2-in-1", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS),
9718	SND_PCI_QUIRK(0x1028, 0x0b71, "Dell Inspiron 16 Plus 7620", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS),
9719	SND_PCI_QUIRK(0x1028, 0x0beb, "Dell XPS 15 9530 (2023)", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9720	SND_PCI_QUIRK(0x1028, 0x0c03, "Dell Precision 5340", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
9721	SND_PCI_QUIRK(0x1028, 0x0c0b, "Dell Oasis 14 RPL-P", ALC289_FIXUP_RTK_AMP_DUAL_SPK),
9722	SND_PCI_QUIRK(0x1028, 0x0c0d, "Dell Oasis", ALC289_FIXUP_RTK_AMP_DUAL_SPK),
9723	SND_PCI_QUIRK(0x1028, 0x0c0e, "Dell Oasis 16", ALC289_FIXUP_RTK_AMP_DUAL_SPK),
9724	SND_PCI_QUIRK(0x1028, 0x0c19, "Dell Precision 3340", ALC236_FIXUP_DELL_DUAL_CODECS),
9725	SND_PCI_QUIRK(0x1028, 0x0c1a, "Dell Precision 3340", ALC236_FIXUP_DELL_DUAL_CODECS),
9726	SND_PCI_QUIRK(0x1028, 0x0c1b, "Dell Precision 3440", ALC236_FIXUP_DELL_DUAL_CODECS),
9727	SND_PCI_QUIRK(0x1028, 0x0c1c, "Dell Precision 3540", ALC236_FIXUP_DELL_DUAL_CODECS),
9728	SND_PCI_QUIRK(0x1028, 0x0c1d, "Dell Precision 3440", ALC236_FIXUP_DELL_DUAL_CODECS),
9729	SND_PCI_QUIRK(0x1028, 0x0c1e, "Dell Precision 3540", ALC236_FIXUP_DELL_DUAL_CODECS),
9730	SND_PCI_QUIRK(0x1028, 0x0cbd, "Dell Oasis 13 CS MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9731	SND_PCI_QUIRK(0x1028, 0x0cbe, "Dell Oasis 13 2-IN-1 MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9732	SND_PCI_QUIRK(0x1028, 0x0cbf, "Dell Oasis 13 Low Weight MTU-L", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9733	SND_PCI_QUIRK(0x1028, 0x0cc0, "Dell Oasis 13", ALC289_FIXUP_RTK_AMP_DUAL_SPK),
9734	SND_PCI_QUIRK(0x1028, 0x0cc1, "Dell Oasis 14 MTL-H/U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9735	SND_PCI_QUIRK(0x1028, 0x0cc2, "Dell Oasis 14 2-in-1 MTL-H/U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9736	SND_PCI_QUIRK(0x1028, 0x0cc3, "Dell Oasis 14 Low Weight MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9737	SND_PCI_QUIRK(0x1028, 0x0cc4, "Dell Oasis 16 MTL-H/U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9738	SND_PCI_QUIRK(0x1028, 0x0cc5, "Dell Oasis 14", ALC289_FIXUP_RTK_AMP_DUAL_SPK),
9739	SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9740	SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9741	SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
9742	SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),
9743	SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED),
9744	SND_PCI_QUIRK(0x103c, 0x21f9, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9745	SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9746	SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9747	SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9748	SND_PCI_QUIRK(0x103c, 0x221c, "HP EliteBook 755 G2", ALC280_FIXUP_HP_HEADSET_MIC),
9749	SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9750	SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9751	SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9752	SND_PCI_QUIRK(0x103c, 0x2237, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9753	SND_PCI_QUIRK(0x103c, 0x2238, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9754	SND_PCI_QUIRK(0x103c, 0x2239, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9755	SND_PCI_QUIRK(0x103c, 0x224b, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9756	SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9757	SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9758	SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9759	SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9760	SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9761	SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9762	SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED),
9763	SND_PCI_QUIRK(0x103c, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY),
9764	SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9765	SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9766	SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9767	SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9768	SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9769	SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9770	SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9771	SND_PCI_QUIRK(0x103c, 0x226e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9772	SND_PCI_QUIRK(0x103c, 0x2271, "HP", ALC286_FIXUP_HP_GPIO_LED),
9773	SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9774	SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC280_FIXUP_HP_DOCK_PINS),
9775	SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9776	SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC280_FIXUP_HP_DOCK_PINS),
9777	SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9778	SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9779	SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9780	SND_PCI_QUIRK(0x103c, 0x228b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9781	SND_PCI_QUIRK(0x103c, 0x228e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9782	SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9783	SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9784	SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9785	SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9786	SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9787	SND_PCI_QUIRK(0x103c, 0x22c5, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9788	SND_PCI_QUIRK(0x103c, 0x22c7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9789	SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9790	SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9791	SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC280_FIXUP_HP_9480M),
9792	SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9793	SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9794	SND_PCI_QUIRK(0x103c, 0x2334, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9795	SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9796	SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9797	SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9798	SND_PCI_QUIRK(0x103c, 0x2b5e, "HP 288 Pro G2 MT", ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE),
9799	SND_PCI_QUIRK(0x103c, 0x802e, "HP Z240 SFF", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9800	SND_PCI_QUIRK(0x103c, 0x802f, "HP Z240", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9801	SND_PCI_QUIRK(0x103c, 0x8077, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
9802	SND_PCI_QUIRK(0x103c, 0x8158, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
9803	SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC295_FIXUP_HP_X360),
9804	SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC),
9805	SND_PCI_QUIRK(0x103c, 0x827e, "HP x360", ALC295_FIXUP_HP_X360),
9806	SND_PCI_QUIRK(0x103c, 0x827f, "HP x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9807	SND_PCI_QUIRK(0x103c, 0x82bf, "HP G3 mini", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9808	SND_PCI_QUIRK(0x103c, 0x82c0, "HP G3 mini premium", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9809	SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9810	SND_PCI_QUIRK(0x103c, 0x841c, "HP Pavilion 15-CK0xx", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9811	SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9812	SND_PCI_QUIRK(0x103c, 0x84ae, "HP 15-db0403ng", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
9813	SND_PCI_QUIRK(0x103c, 0x84da, "HP OMEN dc0019-ur", ALC295_FIXUP_HP_OMEN),
9814	SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9815	SND_PCI_QUIRK(0x103c, 0x8519, "HP Spectre x360 15-df0xxx", ALC285_FIXUP_HP_SPECTRE_X360),
9816	SND_PCI_QUIRK(0x103c, 0x8537, "HP ProBook 440 G6", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9817	SND_PCI_QUIRK(0x103c, 0x85de, "HP Envy x360 13-ar0xxx", ALC285_FIXUP_HP_ENVY_X360),
9818	SND_PCI_QUIRK(0x103c, 0x860f, "HP ZBook 15 G6", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9819	SND_PCI_QUIRK(0x103c, 0x861f, "HP Elite Dragonfly G1", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9820	SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED),
9821	SND_PCI_QUIRK(0x103c, 0x86c7, "HP Envy AiO 32", ALC274_FIXUP_HP_ENVY_GPIO),
9822	SND_PCI_QUIRK(0x103c, 0x86e7, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
9823	SND_PCI_QUIRK(0x103c, 0x86e8, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
9824	SND_PCI_QUIRK(0x103c, 0x86f9, "HP Spectre x360 13-aw0xxx", ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED),
9825	SND_PCI_QUIRK(0x103c, 0x8716, "HP Elite Dragonfly G2 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9826	SND_PCI_QUIRK(0x103c, 0x8720, "HP EliteBook x360 1040 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9827	SND_PCI_QUIRK(0x103c, 0x8724, "HP EliteBook 850 G7", ALC285_FIXUP_HP_GPIO_LED),
9828	SND_PCI_QUIRK(0x103c, 0x8728, "HP EliteBook 840 G7", ALC285_FIXUP_HP_GPIO_LED),
9829	SND_PCI_QUIRK(0x103c, 0x8729, "HP", ALC285_FIXUP_HP_GPIO_LED),
9830	SND_PCI_QUIRK(0x103c, 0x8730, "HP ProBook 445 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9831	SND_PCI_QUIRK(0x103c, 0x8735, "HP ProBook 435 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9832	SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9833	SND_PCI_QUIRK(0x103c, 0x8760, "HP", ALC285_FIXUP_HP_MUTE_LED),
9834	SND_PCI_QUIRK(0x103c, 0x876e, "HP ENVY x360 Convertible 13-ay0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS),
9835	SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED),
9836	SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED),
9837	SND_PCI_QUIRK(0x103c, 0x8780, "HP ZBook Fury 17 G7 Mobile Workstation",
9838		      ALC285_FIXUP_HP_GPIO_AMP_INIT),
9839	SND_PCI_QUIRK(0x103c, 0x8783, "HP ZBook Fury 15 G7 Mobile Workstation",
9840		      ALC285_FIXUP_HP_GPIO_AMP_INIT),
9841	SND_PCI_QUIRK(0x103c, 0x8786, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
9842	SND_PCI_QUIRK(0x103c, 0x8787, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
9843	SND_PCI_QUIRK(0x103c, 0x8788, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
9844	SND_PCI_QUIRK(0x103c, 0x87b7, "HP Laptop 14-fq0xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
9845	SND_PCI_QUIRK(0x103c, 0x87c8, "HP", ALC287_FIXUP_HP_GPIO_LED),
9846	SND_PCI_QUIRK(0x103c, 0x87e5, "HP ProBook 440 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9847	SND_PCI_QUIRK(0x103c, 0x87e7, "HP ProBook 450 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9848	SND_PCI_QUIRK(0x103c, 0x87f1, "HP ProBook 630 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9849	SND_PCI_QUIRK(0x103c, 0x87f2, "HP ProBook 640 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9850	SND_PCI_QUIRK(0x103c, 0x87f4, "HP", ALC287_FIXUP_HP_GPIO_LED),
9851	SND_PCI_QUIRK(0x103c, 0x87f5, "HP", ALC287_FIXUP_HP_GPIO_LED),
9852	SND_PCI_QUIRK(0x103c, 0x87f6, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
9853	SND_PCI_QUIRK(0x103c, 0x87f7, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
9854	SND_PCI_QUIRK(0x103c, 0x87fe, "HP Laptop 15s-fq2xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
9855	SND_PCI_QUIRK(0x103c, 0x8805, "HP ProBook 650 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9856	SND_PCI_QUIRK(0x103c, 0x880d, "HP EliteBook 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9857	SND_PCI_QUIRK(0x103c, 0x8811, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
9858	SND_PCI_QUIRK(0x103c, 0x8812, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
9859	SND_PCI_QUIRK(0x103c, 0x881d, "HP 250 G8 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
9860	SND_PCI_QUIRK(0x103c, 0x8846, "HP EliteBook 850 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9861	SND_PCI_QUIRK(0x103c, 0x8847, "HP EliteBook x360 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9862	SND_PCI_QUIRK(0x103c, 0x884b, "HP EliteBook 840 Aero G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9863	SND_PCI_QUIRK(0x103c, 0x884c, "HP EliteBook 840 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9864	SND_PCI_QUIRK(0x103c, 0x8862, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST),
9865	SND_PCI_QUIRK(0x103c, 0x8863, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST),
9866	SND_PCI_QUIRK(0x103c, 0x886d, "HP ZBook Fury 17.3 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9867	SND_PCI_QUIRK(0x103c, 0x8870, "HP ZBook Fury 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9868	SND_PCI_QUIRK(0x103c, 0x8873, "HP ZBook Studio 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9869	SND_PCI_QUIRK(0x103c, 0x887a, "HP Laptop 15s-eq2xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
9870	SND_PCI_QUIRK(0x103c, 0x888a, "HP ENVY x360 Convertible 15-eu0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS),
9871	SND_PCI_QUIRK(0x103c, 0x888d, "HP ZBook Power 15.6 inch G8 Mobile Workstation PC", ALC236_FIXUP_HP_GPIO_LED),
9872	SND_PCI_QUIRK(0x103c, 0x8895, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED),
9873	SND_PCI_QUIRK(0x103c, 0x8896, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_MUTE_LED),
9874	SND_PCI_QUIRK(0x103c, 0x8898, "HP EliteBook 845 G8 Notebook PC", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),
9875	SND_PCI_QUIRK(0x103c, 0x88d0, "HP Pavilion 15-eh1xxx (mainboard 88D0)", ALC287_FIXUP_HP_GPIO_LED),
9876	SND_PCI_QUIRK(0x103c, 0x8902, "HP OMEN 16", ALC285_FIXUP_HP_MUTE_LED),
9877	SND_PCI_QUIRK(0x103c, 0x890e, "HP 255 G8 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
9878	SND_PCI_QUIRK(0x103c, 0x8919, "HP Pavilion Aero Laptop 13-be0xxx", ALC287_FIXUP_HP_GPIO_LED),
9879	SND_PCI_QUIRK(0x103c, 0x896d, "HP ZBook Firefly 16 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9880	SND_PCI_QUIRK(0x103c, 0x896e, "HP EliteBook x360 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9881	SND_PCI_QUIRK(0x103c, 0x8971, "HP EliteBook 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9882	SND_PCI_QUIRK(0x103c, 0x8972, "HP EliteBook 840 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9883	SND_PCI_QUIRK(0x103c, 0x8973, "HP EliteBook 860 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9884	SND_PCI_QUIRK(0x103c, 0x8974, "HP EliteBook 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9885	SND_PCI_QUIRK(0x103c, 0x8975, "HP EliteBook x360 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9886	SND_PCI_QUIRK(0x103c, 0x897d, "HP mt440 Mobile Thin Client U74", ALC236_FIXUP_HP_GPIO_LED),
9887	SND_PCI_QUIRK(0x103c, 0x8981, "HP Elite Dragonfly G3", ALC245_FIXUP_CS35L41_SPI_4),
9888	SND_PCI_QUIRK(0x103c, 0x898e, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2),
9889	SND_PCI_QUIRK(0x103c, 0x898f, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2),
9890	SND_PCI_QUIRK(0x103c, 0x8991, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9891	SND_PCI_QUIRK(0x103c, 0x8992, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2),
9892	SND_PCI_QUIRK(0x103c, 0x8994, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9893	SND_PCI_QUIRK(0x103c, 0x8995, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2),
9894	SND_PCI_QUIRK(0x103c, 0x89a4, "HP ProBook 440 G9", ALC236_FIXUP_HP_GPIO_LED),
9895	SND_PCI_QUIRK(0x103c, 0x89a6, "HP ProBook 450 G9", ALC236_FIXUP_HP_GPIO_LED),
9896	SND_PCI_QUIRK(0x103c, 0x89aa, "HP EliteBook 630 G9", ALC236_FIXUP_HP_GPIO_LED),
9897	SND_PCI_QUIRK(0x103c, 0x89ac, "HP EliteBook 640 G9", ALC236_FIXUP_HP_GPIO_LED),
9898	SND_PCI_QUIRK(0x103c, 0x89ae, "HP EliteBook 650 G9", ALC236_FIXUP_HP_GPIO_LED),
9899	SND_PCI_QUIRK(0x103c, 0x89c0, "HP ZBook Power 15.6 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9900	SND_PCI_QUIRK(0x103c, 0x89c3, "Zbook Studio G9", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
9901	SND_PCI_QUIRK(0x103c, 0x89c6, "Zbook Fury 17 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9902	SND_PCI_QUIRK(0x103c, 0x89ca, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9903	SND_PCI_QUIRK(0x103c, 0x89d3, "HP EliteBook 645 G9 (MB 89D2)", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9904	SND_PCI_QUIRK(0x103c, 0x8a0f, "HP Pavilion 14-ec1xxx", ALC287_FIXUP_HP_GPIO_LED),
9905	SND_PCI_QUIRK(0x103c, 0x8a20, "HP Laptop 15s-fq5xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
9906	SND_PCI_QUIRK(0x103c, 0x8a25, "HP Victus 16-d1xxx (MB 8A25)", ALC245_FIXUP_HP_MUTE_LED_COEFBIT),
9907	SND_PCI_QUIRK(0x103c, 0x8a78, "HP Dev One", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),
9908	SND_PCI_QUIRK(0x103c, 0x8aa0, "HP ProBook 440 G9 (MB 8A9E)", ALC236_FIXUP_HP_GPIO_LED),
9909	SND_PCI_QUIRK(0x103c, 0x8aa3, "HP ProBook 450 G9 (MB 8AA1)", ALC236_FIXUP_HP_GPIO_LED),
9910	SND_PCI_QUIRK(0x103c, 0x8aa8, "HP EliteBook 640 G9 (MB 8AA6)", ALC236_FIXUP_HP_GPIO_LED),
9911	SND_PCI_QUIRK(0x103c, 0x8aab, "HP EliteBook 650 G9 (MB 8AA9)", ALC236_FIXUP_HP_GPIO_LED),
9912	SND_PCI_QUIRK(0x103c, 0x8ab9, "HP EliteBook 840 G8 (MB 8AB8)", ALC285_FIXUP_HP_GPIO_LED),
9913	SND_PCI_QUIRK(0x103c, 0x8abb, "HP ZBook Firefly 14 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9914	SND_PCI_QUIRK(0x103c, 0x8ad1, "HP EliteBook 840 14 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9915	SND_PCI_QUIRK(0x103c, 0x8ad2, "HP EliteBook 860 16 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9916	SND_PCI_QUIRK(0x103c, 0x8b0f, "HP Elite mt645 G7 Mobile Thin Client U81", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9917	SND_PCI_QUIRK(0x103c, 0x8b2f, "HP 255 15.6 inch G10 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
9918	SND_PCI_QUIRK(0x103c, 0x8b3f, "HP mt440 Mobile Thin Client U91", ALC236_FIXUP_HP_GPIO_LED),
9919	SND_PCI_QUIRK(0x103c, 0x8b42, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9920	SND_PCI_QUIRK(0x103c, 0x8b43, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9921	SND_PCI_QUIRK(0x103c, 0x8b44, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9922	SND_PCI_QUIRK(0x103c, 0x8b45, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9923	SND_PCI_QUIRK(0x103c, 0x8b46, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9924	SND_PCI_QUIRK(0x103c, 0x8b47, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9925	SND_PCI_QUIRK(0x103c, 0x8b59, "HP Elite mt645 G7 Mobile Thin Client U89", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9926	SND_PCI_QUIRK(0x103c, 0x8b5d, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9927	SND_PCI_QUIRK(0x103c, 0x8b5e, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9928	SND_PCI_QUIRK(0x103c, 0x8b63, "HP Elite Dragonfly 13.5 inch G4", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
9929	SND_PCI_QUIRK(0x103c, 0x8b65, "HP ProBook 455 15.6 inch G10 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9930	SND_PCI_QUIRK(0x103c, 0x8b66, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9931	SND_PCI_QUIRK(0x103c, 0x8b70, "HP EliteBook 835 G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9932	SND_PCI_QUIRK(0x103c, 0x8b72, "HP EliteBook 845 G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9933	SND_PCI_QUIRK(0x103c, 0x8b74, "HP EliteBook 845W G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9934	SND_PCI_QUIRK(0x103c, 0x8b77, "HP ElieBook 865 G10", ALC287_FIXUP_CS35L41_I2C_2),
9935	SND_PCI_QUIRK(0x103c, 0x8b7a, "HP", ALC236_FIXUP_HP_GPIO_LED),
9936	SND_PCI_QUIRK(0x103c, 0x8b7d, "HP", ALC236_FIXUP_HP_GPIO_LED),
9937	SND_PCI_QUIRK(0x103c, 0x8b87, "HP", ALC236_FIXUP_HP_GPIO_LED),
9938	SND_PCI_QUIRK(0x103c, 0x8b8a, "HP", ALC236_FIXUP_HP_GPIO_LED),
9939	SND_PCI_QUIRK(0x103c, 0x8b8b, "HP", ALC236_FIXUP_HP_GPIO_LED),
9940	SND_PCI_QUIRK(0x103c, 0x8b8d, "HP", ALC236_FIXUP_HP_GPIO_LED),
9941	SND_PCI_QUIRK(0x103c, 0x8b8f, "HP", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
9942	SND_PCI_QUIRK(0x103c, 0x8b92, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9943	SND_PCI_QUIRK(0x103c, 0x8b96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9944	SND_PCI_QUIRK(0x103c, 0x8b97, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9945	SND_PCI_QUIRK(0x103c, 0x8bf0, "HP", ALC236_FIXUP_HP_GPIO_LED),
9946	SND_PCI_QUIRK(0x103c, 0x8c46, "HP EliteBook 830 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9947	SND_PCI_QUIRK(0x103c, 0x8c47, "HP EliteBook 840 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9948	SND_PCI_QUIRK(0x103c, 0x8c48, "HP EliteBook 860 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9949	SND_PCI_QUIRK(0x103c, 0x8c49, "HP Elite x360 830 2-in-1 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9950	SND_PCI_QUIRK(0x103c, 0x8c70, "HP EliteBook 835 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9951	SND_PCI_QUIRK(0x103c, 0x8c71, "HP EliteBook 845 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9952	SND_PCI_QUIRK(0x103c, 0x8c72, "HP EliteBook 865 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9953	SND_PCI_QUIRK(0x103c, 0x8c96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9954	SND_PCI_QUIRK(0x103c, 0x8c97, "HP ZBook", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9955	SND_PCI_QUIRK(0x103c, 0x8ca1, "HP ZBook Power", ALC236_FIXUP_HP_GPIO_LED),
9956	SND_PCI_QUIRK(0x103c, 0x8ca2, "HP ZBook Power", ALC236_FIXUP_HP_GPIO_LED),
9957	SND_PCI_QUIRK(0x103c, 0x8ca4, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9958	SND_PCI_QUIRK(0x103c, 0x8ca7, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9959	SND_PCI_QUIRK(0x103c, 0x8cf5, "HP ZBook Studio 16", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
9960	SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
9961	SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
9962	SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9963	SND_PCI_QUIRK(0x1043, 0x10a1, "ASUS UX391UA", ALC294_FIXUP_ASUS_SPK),
9964	SND_PCI_QUIRK(0x1043, 0x10c0, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
9965	SND_PCI_QUIRK(0x1043, 0x10d0, "ASUS X540LA/X540LJ", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
9966	SND_PCI_QUIRK(0x1043, 0x10d3, "ASUS K6500ZC", ALC294_FIXUP_ASUS_SPK),
9967	SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9968	SND_PCI_QUIRK(0x1043, 0x11c0, "ASUS X556UR", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
9969	SND_PCI_QUIRK(0x1043, 0x125e, "ASUS Q524UQK", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
9970	SND_PCI_QUIRK(0x1043, 0x1271, "ASUS X430UN", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
9971	SND_PCI_QUIRK(0x1043, 0x1290, "ASUS X441SA", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
9972	SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
9973	SND_PCI_QUIRK(0x1043, 0x12a3, "Asus N7691ZM", ALC269_FIXUP_ASUS_N7601ZM),
9974	SND_PCI_QUIRK(0x1043, 0x12af, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2),
9975	SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),
9976	SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC),
9977	SND_PCI_QUIRK(0x1043, 0x1313, "Asus K42JZ", ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE),
9978	SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
9979	SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
9980	SND_PCI_QUIRK(0x1043, 0x1433, "ASUS GX650P", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
9981	SND_PCI_QUIRK(0x1043, 0x1463, "Asus GA402X", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
9982	SND_PCI_QUIRK(0x1043, 0x1473, "ASUS GU604V", ALC285_FIXUP_ASUS_HEADSET_MIC),
9983	SND_PCI_QUIRK(0x1043, 0x1483, "ASUS GU603V", ALC285_FIXUP_ASUS_HEADSET_MIC),
9984	SND_PCI_QUIRK(0x1043, 0x1493, "ASUS GV601V", ALC285_FIXUP_ASUS_HEADSET_MIC),
9985	SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
9986	SND_PCI_QUIRK(0x1043, 0x1533, "ASUS GV302XA", ALC287_FIXUP_CS35L41_I2C_2),
9987	SND_PCI_QUIRK(0x1043, 0x1573, "ASUS GZ301V", ALC285_FIXUP_ASUS_HEADSET_MIC),
9988	SND_PCI_QUIRK(0x1043, 0x1662, "ASUS GV301QH", ALC294_FIXUP_ASUS_DUAL_SPK),
9989	SND_PCI_QUIRK(0x1043, 0x1663, "ASUS GU603ZV", ALC285_FIXUP_ASUS_HEADSET_MIC),
9990	SND_PCI_QUIRK(0x1043, 0x1683, "ASUS UM3402YAR", ALC287_FIXUP_CS35L41_I2C_2),
9991	SND_PCI_QUIRK(0x1043, 0x16b2, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),
9992	SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
9993	SND_PCI_QUIRK(0x1043, 0x1740, "ASUS UX430UA", ALC295_FIXUP_ASUS_DACS),
9994	SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_DUAL_SPK),
9995	SND_PCI_QUIRK(0x1043, 0x17f3, "ROG Ally RC71L_RC71L", ALC294_FIXUP_ASUS_ALLY),
9996	SND_PCI_QUIRK(0x1043, 0x1881, "ASUS Zephyrus S/M", ALC294_FIXUP_ASUS_GX502_PINS),
9997	SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC),
9998	SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS UM3504DA", ALC294_FIXUP_CS35L41_I2C_2),
9999	SND_PCI_QUIRK(0x1043, 0x18f1, "Asus FX505DT", ALC256_FIXUP_ASUS_HEADSET_MIC),
10000	SND_PCI_QUIRK(0x1043, 0x194e, "ASUS UX563FD", ALC294_FIXUP_ASUS_HPE),
10001	SND_PCI_QUIRK(0x1043, 0x1970, "ASUS UX550VE", ALC289_FIXUP_ASUS_GA401),
10002	SND_PCI_QUIRK(0x1043, 0x1982, "ASUS B1400CEPE", ALC256_FIXUP_ASUS_HPE),
10003	SND_PCI_QUIRK(0x1043, 0x19ce, "ASUS B9450FA", ALC294_FIXUP_ASUS_HPE),
10004	SND_PCI_QUIRK(0x1043, 0x19e1, "ASUS UX581LV", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE),
10005	SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
10006	SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC),
10007	SND_PCI_QUIRK(0x1043, 0x1a63, "ASUS UX3405MA", ALC245_FIXUP_CS35L41_SPI_2),
10008	SND_PCI_QUIRK(0x1043, 0x1a83, "ASUS UM5302LA", ALC294_FIXUP_CS35L41_I2C_2),
10009	SND_PCI_QUIRK(0x1043, 0x1a8f, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2),
10010	SND_PCI_QUIRK(0x1043, 0x1b11, "ASUS UX431DA", ALC294_FIXUP_ASUS_COEF_1B),
10011	SND_PCI_QUIRK(0x1043, 0x1b13, "Asus U41SV", ALC269_FIXUP_INV_DMIC),
10012	SND_PCI_QUIRK(0x1043, 0x1b93, "ASUS G614JVR/JIR", ALC245_FIXUP_CS35L41_SPI_2),
10013	SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
10014	SND_PCI_QUIRK(0x1043, 0x1c03, "ASUS UM3406HA", ALC287_FIXUP_CS35L41_I2C_2),
10015	SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
10016	SND_PCI_QUIRK(0x1043, 0x1c33, "ASUS UX5304MA", ALC245_FIXUP_CS35L41_SPI_2),
10017	SND_PCI_QUIRK(0x1043, 0x1c43, "ASUS UX8406MA", ALC245_FIXUP_CS35L41_SPI_2),
10018	SND_PCI_QUIRK(0x1043, 0x1c62, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),
10019	SND_PCI_QUIRK(0x1043, 0x1c92, "ASUS ROG Strix G15", ALC285_FIXUP_ASUS_G533Z_PINS),
10020	SND_PCI_QUIRK(0x1043, 0x1c9f, "ASUS G614JI", ALC285_FIXUP_ASUS_HEADSET_MIC),
10021	SND_PCI_QUIRK(0x1043, 0x1caf, "ASUS G634JYR/JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
10022	SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
10023	SND_PCI_QUIRK(0x1043, 0x1d1f, "ASUS ROG Strix G17 2023 (G713PV)", ALC287_FIXUP_CS35L41_I2C_2),
10024	SND_PCI_QUIRK(0x1043, 0x1d42, "ASUS Zephyrus G14 2022", ALC289_FIXUP_ASUS_GA401),
10025	SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE),
10026	SND_PCI_QUIRK(0x1043, 0x1da2, "ASUS UP6502ZA/ZD", ALC245_FIXUP_CS35L41_SPI_2),
10027	SND_PCI_QUIRK(0x1043, 0x1e02, "ASUS UX3402ZA", ALC245_FIXUP_CS35L41_SPI_2),
10028	SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS UX3402VA", ALC245_FIXUP_CS35L41_SPI_2),
10029	SND_PCI_QUIRK(0x1043, 0x1f62, "ASUS UX7602ZM", ALC245_FIXUP_CS35L41_SPI_2),
10030	SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502),
10031	SND_PCI_QUIRK(0x1043, 0x1e12, "ASUS UM6702RA/RC", ALC287_FIXUP_CS35L41_I2C_2),
10032	SND_PCI_QUIRK(0x1043, 0x1e51, "ASUS Zephyrus M15", ALC294_FIXUP_ASUS_GU502_PINS),
10033	SND_PCI_QUIRK(0x1043, 0x1e5e, "ASUS ROG Strix G513", ALC294_FIXUP_ASUS_G513_PINS),
10034	SND_PCI_QUIRK(0x1043, 0x1e8e, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA401),
10035	SND_PCI_QUIRK(0x1043, 0x1ee2, "ASUS UM3402", ALC287_FIXUP_CS35L41_I2C_2),
10036	SND_PCI_QUIRK(0x1043, 0x1c52, "ASUS Zephyrus G15 2022", ALC289_FIXUP_ASUS_GA401),
10037	SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401),
10038	SND_PCI_QUIRK(0x1043, 0x1f12, "ASUS UM5302", ALC287_FIXUP_CS35L41_I2C_2),
10039	SND_PCI_QUIRK(0x1043, 0x1f62, "ASUS UX7602ZM", ALC245_FIXUP_CS35L41_SPI_2),
10040	SND_PCI_QUIRK(0x1043, 0x1f92, "ASUS ROG Flow X16", ALC289_FIXUP_ASUS_GA401),
10041	SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
10042	SND_PCI_QUIRK(0x1043, 0x3a20, "ASUS G614JZR", ALC245_FIXUP_CS35L41_SPI_2),
10043	SND_PCI_QUIRK(0x1043, 0x3a30, "ASUS G814JVR/JIR", ALC245_FIXUP_CS35L41_SPI_2),
10044	SND_PCI_QUIRK(0x1043, 0x3a40, "ASUS G814JZR", ALC245_FIXUP_CS35L41_SPI_2),
10045	SND_PCI_QUIRK(0x1043, 0x3a50, "ASUS G834JYR/JZR", ALC245_FIXUP_CS35L41_SPI_2),
10046	SND_PCI_QUIRK(0x1043, 0x3a60, "ASUS G634JYR/JZR", ALC245_FIXUP_CS35L41_SPI_2),
10047	SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
10048	SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
10049	SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
10050	SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
10051	SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
10052	SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
10053	SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
10054	SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
10055	SND_PCI_QUIRK(0x104d, 0x9099, "Sony VAIO S13", ALC275_FIXUP_SONY_DISABLE_AAMIX),
10056	SND_PCI_QUIRK(0x104d, 0x90b5, "Sony VAIO Pro 11", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
10057	SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
10058	SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),
10059	SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT),
10060	SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN),
10061	SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC),
10062	SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN),
10063	SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),
10064	SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE),
10065	SND_PCI_QUIRK(0x10ec, 0x118c, "Medion EE4254 MD62100", ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE),
10066	SND_PCI_QUIRK(0x10ec, 0x1230, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
10067	SND_PCI_QUIRK(0x10ec, 0x124c, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
10068	SND_PCI_QUIRK(0x10ec, 0x1252, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
10069	SND_PCI_QUIRK(0x10ec, 0x1254, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
10070	SND_PCI_QUIRK(0x10ec, 0x12cc, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
10071	SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-SZ6", ALC269_FIXUP_HEADSET_MODE),
10072	SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
10073	SND_PCI_QUIRK(0x144d, 0xc169, "Samsung Notebook 9 Pen (NP930SBE-K01US)", ALC298_FIXUP_SAMSUNG_AMP),
10074	SND_PCI_QUIRK(0x144d, 0xc176, "Samsung Notebook 9 Pro (NP930MBE-K04US)", ALC298_FIXUP_SAMSUNG_AMP),
10075	SND_PCI_QUIRK(0x144d, 0xc189, "Samsung Galaxy Flex Book (NT950QCG-X716)", ALC298_FIXUP_SAMSUNG_AMP),
10076	SND_PCI_QUIRK(0x144d, 0xc18a, "Samsung Galaxy Book Ion (NP930XCJ-K01US)", ALC298_FIXUP_SAMSUNG_AMP),
10077	SND_PCI_QUIRK(0x144d, 0xc1a3, "Samsung Galaxy Book Pro (NP935XDB-KC1SE)", ALC298_FIXUP_SAMSUNG_AMP),
10078	SND_PCI_QUIRK(0x144d, 0xc1a6, "Samsung Galaxy Book Pro 360 (NP930QBD)", ALC298_FIXUP_SAMSUNG_AMP),
10079	SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
10080	SND_PCI_QUIRK(0x144d, 0xc812, "Samsung Notebook Pen S (NT950SBE-X58)", ALC298_FIXUP_SAMSUNG_AMP),
10081	SND_PCI_QUIRK(0x144d, 0xc830, "Samsung Galaxy Book Ion (NT950XCJ-X716A)", ALC298_FIXUP_SAMSUNG_AMP),
10082	SND_PCI_QUIRK(0x144d, 0xc832, "Samsung Galaxy Book Flex Alpha (NP730QCJ)", ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
10083	SND_PCI_QUIRK(0x144d, 0xca03, "Samsung Galaxy Book2 Pro 360 (NP930QED)", ALC298_FIXUP_SAMSUNG_AMP),
10084	SND_PCI_QUIRK(0x144d, 0xc868, "Samsung Galaxy Book2 Pro (NP930XED)", ALC298_FIXUP_SAMSUNG_AMP),
10085	SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
10086	SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),
10087	SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC),
10088	SND_PCI_QUIRK(0x152d, 0x1082, "Quanta NL3", ALC269_FIXUP_LIFEBOOK),
10089	SND_PCI_QUIRK(0x1558, 0x1323, "Clevo N130ZU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10090	SND_PCI_QUIRK(0x1558, 0x1325, "Clevo N15[01][CW]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10091	SND_PCI_QUIRK(0x1558, 0x1401, "Clevo L140[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10092	SND_PCI_QUIRK(0x1558, 0x1403, "Clevo N140CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10093	SND_PCI_QUIRK(0x1558, 0x1404, "Clevo N150CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10094	SND_PCI_QUIRK(0x1558, 0x14a1, "Clevo L141MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10095	SND_PCI_QUIRK(0x1558, 0x4018, "Clevo NV40M[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10096	SND_PCI_QUIRK(0x1558, 0x4019, "Clevo NV40MZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10097	SND_PCI_QUIRK(0x1558, 0x4020, "Clevo NV40MB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10098	SND_PCI_QUIRK(0x1558, 0x4041, "Clevo NV4[15]PZ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10099	SND_PCI_QUIRK(0x1558, 0x40a1, "Clevo NL40GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10100	SND_PCI_QUIRK(0x1558, 0x40c1, "Clevo NL40[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10101	SND_PCI_QUIRK(0x1558, 0x40d1, "Clevo NL41DU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10102	SND_PCI_QUIRK(0x1558, 0x5015, "Clevo NH5[58]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10103	SND_PCI_QUIRK(0x1558, 0x5017, "Clevo NH7[79]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10104	SND_PCI_QUIRK(0x1558, 0x50a3, "Clevo NJ51GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10105	SND_PCI_QUIRK(0x1558, 0x50b3, "Clevo NK50S[BEZ]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10106	SND_PCI_QUIRK(0x1558, 0x50b6, "Clevo NK50S5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10107	SND_PCI_QUIRK(0x1558, 0x50b8, "Clevo NK50SZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10108	SND_PCI_QUIRK(0x1558, 0x50d5, "Clevo NP50D5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10109	SND_PCI_QUIRK(0x1558, 0x50e1, "Clevo NH5[58]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10110	SND_PCI_QUIRK(0x1558, 0x50e2, "Clevo NH7[79]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10111	SND_PCI_QUIRK(0x1558, 0x50f0, "Clevo NH50A[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10112	SND_PCI_QUIRK(0x1558, 0x50f2, "Clevo NH50E[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10113	SND_PCI_QUIRK(0x1558, 0x50f3, "Clevo NH58DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10114	SND_PCI_QUIRK(0x1558, 0x50f5, "Clevo NH55EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10115	SND_PCI_QUIRK(0x1558, 0x50f6, "Clevo NH55DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10116	SND_PCI_QUIRK(0x1558, 0x5101, "Clevo S510WU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10117	SND_PCI_QUIRK(0x1558, 0x5157, "Clevo W517GU1", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10118	SND_PCI_QUIRK(0x1558, 0x51a1, "Clevo NS50MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10119	SND_PCI_QUIRK(0x1558, 0x51b1, "Clevo NS50AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10120	SND_PCI_QUIRK(0x1558, 0x51b3, "Clevo NS70AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10121	SND_PCI_QUIRK(0x1558, 0x5630, "Clevo NP50RNJS", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10122	SND_PCI_QUIRK(0x1558, 0x70a1, "Clevo NB70T[HJK]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10123	SND_PCI_QUIRK(0x1558, 0x70b3, "Clevo NK70SB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10124	SND_PCI_QUIRK(0x1558, 0x70f2, "Clevo NH79EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10125	SND_PCI_QUIRK(0x1558, 0x70f3, "Clevo NH77DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10126	SND_PCI_QUIRK(0x1558, 0x70f4, "Clevo NH77EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10127	SND_PCI_QUIRK(0x1558, 0x70f6, "Clevo NH77DPQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10128	SND_PCI_QUIRK(0x1558, 0x7716, "Clevo NS50PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10129	SND_PCI_QUIRK(0x1558, 0x7717, "Clevo NS70PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10130	SND_PCI_QUIRK(0x1558, 0x7718, "Clevo L140PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10131	SND_PCI_QUIRK(0x1558, 0x7724, "Clevo L140AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10132	SND_PCI_QUIRK(0x1558, 0x8228, "Clevo NR40BU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10133	SND_PCI_QUIRK(0x1558, 0x8520, "Clevo NH50D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10134	SND_PCI_QUIRK(0x1558, 0x8521, "Clevo NH77D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10135	SND_PCI_QUIRK(0x1558, 0x8535, "Clevo NH50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10136	SND_PCI_QUIRK(0x1558, 0x8536, "Clevo NH79D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10137	SND_PCI_QUIRK(0x1558, 0x8550, "Clevo NH[57][0-9][ER][ACDH]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10138	SND_PCI_QUIRK(0x1558, 0x8551, "Clevo NH[57][0-9][ER][ACDH]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10139	SND_PCI_QUIRK(0x1558, 0x8560, "Clevo NH[57][0-9][ER][ACDH]Q", ALC269_FIXUP_HEADSET_MIC),
10140	SND_PCI_QUIRK(0x1558, 0x8561, "Clevo NH[57][0-9][ER][ACDH]Q", ALC269_FIXUP_HEADSET_MIC),
10141	SND_PCI_QUIRK(0x1558, 0x8562, "Clevo NH[57][0-9]RZ[Q]", ALC269_FIXUP_DMIC),
10142	SND_PCI_QUIRK(0x1558, 0x8668, "Clevo NP50B[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10143	SND_PCI_QUIRK(0x1558, 0x866d, "Clevo NP5[05]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10144	SND_PCI_QUIRK(0x1558, 0x867c, "Clevo NP7[01]PNP", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10145	SND_PCI_QUIRK(0x1558, 0x867d, "Clevo NP7[01]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10146	SND_PCI_QUIRK(0x1558, 0x8680, "Clevo NJ50LU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10147	SND_PCI_QUIRK(0x1558, 0x8686, "Clevo NH50[CZ]U", ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME),
10148	SND_PCI_QUIRK(0x1558, 0x8a20, "Clevo NH55DCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10149	SND_PCI_QUIRK(0x1558, 0x8a51, "Clevo NH70RCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10150	SND_PCI_QUIRK(0x1558, 0x8d50, "Clevo NH55RCQ-M", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10151	SND_PCI_QUIRK(0x1558, 0x951d, "Clevo N950T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10152	SND_PCI_QUIRK(0x1558, 0x9600, "Clevo N960K[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10153	SND_PCI_QUIRK(0x1558, 0x961d, "Clevo N960S[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10154	SND_PCI_QUIRK(0x1558, 0x971d, "Clevo N970T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10155	SND_PCI_QUIRK(0x1558, 0xa500, "Clevo NL5[03]RU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10156	SND_PCI_QUIRK(0x1558, 0xa600, "Clevo NL50NU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10157	SND_PCI_QUIRK(0x1558, 0xa650, "Clevo NP[567]0SN[CD]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10158	SND_PCI_QUIRK(0x1558, 0xa671, "Clevo NP70SN[CDE]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10159	SND_PCI_QUIRK(0x1558, 0xb018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10160	SND_PCI_QUIRK(0x1558, 0xb019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10161	SND_PCI_QUIRK(0x1558, 0xb022, "Clevo NH77D[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10162	SND_PCI_QUIRK(0x1558, 0xc018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10163	SND_PCI_QUIRK(0x1558, 0xc019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10164	SND_PCI_QUIRK(0x1558, 0xc022, "Clevo NH77[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10165	SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
10166	SND_PCI_QUIRK(0x17aa, 0x1048, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),
10167	SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
10168	SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
10169	SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
10170	SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
10171	SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
10172	SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),
10173	SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST),
10174	SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK),
10175	SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),
10176	SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK),
10177	SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK),
10178	SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440),
10179	SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK),
10180	SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK),
10181	SND_PCI_QUIRK(0x17aa, 0x2211, "Thinkpad W541", ALC292_FIXUP_TPT440_DOCK),
10182	SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK),
10183	SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK),
10184	SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
10185	SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK),
10186	SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK),
10187	SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK),
10188	SND_PCI_QUIRK(0x17aa, 0x222d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10189	SND_PCI_QUIRK(0x17aa, 0x222e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10190	SND_PCI_QUIRK(0x17aa, 0x2231, "Thinkpad T560", ALC292_FIXUP_TPT460),
10191	SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460),
10192	SND_PCI_QUIRK(0x17aa, 0x2245, "Thinkpad T470", ALC298_FIXUP_TPT470_DOCK),
10193	SND_PCI_QUIRK(0x17aa, 0x2246, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10194	SND_PCI_QUIRK(0x17aa, 0x2247, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10195	SND_PCI_QUIRK(0x17aa, 0x2249, "Thinkpad", ALC292_FIXUP_TPT460),
10196	SND_PCI_QUIRK(0x17aa, 0x224b, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10197	SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10198	SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10199	SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
10200	SND_PCI_QUIRK(0x17aa, 0x2292, "Thinkpad X1 Carbon 7th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
10201	SND_PCI_QUIRK(0x17aa, 0x22be, "Thinkpad X1 Carbon 8th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
10202	SND_PCI_QUIRK(0x17aa, 0x22c1, "Thinkpad P1 Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
10203	SND_PCI_QUIRK(0x17aa, 0x22c2, "Thinkpad X1 Extreme Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
10204	SND_PCI_QUIRK(0x17aa, 0x22f1, "Thinkpad", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10205	SND_PCI_QUIRK(0x17aa, 0x22f2, "Thinkpad", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10206	SND_PCI_QUIRK(0x17aa, 0x22f3, "Thinkpad", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10207	SND_PCI_QUIRK(0x17aa, 0x2316, "Thinkpad P1 Gen 6", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10208	SND_PCI_QUIRK(0x17aa, 0x2317, "Thinkpad P1 Gen 6", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10209	SND_PCI_QUIRK(0x17aa, 0x2318, "Thinkpad Z13 Gen2", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10210	SND_PCI_QUIRK(0x17aa, 0x2319, "Thinkpad Z16 Gen2", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10211	SND_PCI_QUIRK(0x17aa, 0x231a, "Thinkpad Z16 Gen2", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10212	SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
10213	SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
10214	SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
10215	SND_PCI_QUIRK(0x17aa, 0x3111, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
10216	SND_PCI_QUIRK(0x17aa, 0x312a, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
10217	SND_PCI_QUIRK(0x17aa, 0x312f, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
10218	SND_PCI_QUIRK(0x17aa, 0x313c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
10219	SND_PCI_QUIRK(0x17aa, 0x3151, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
10220	SND_PCI_QUIRK(0x17aa, 0x3176, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
10221	SND_PCI_QUIRK(0x17aa, 0x3178, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
10222	SND_PCI_QUIRK(0x17aa, 0x31af, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),
10223	SND_PCI_QUIRK(0x17aa, 0x334b, "Lenovo ThinkCentre M70 Gen5", ALC283_FIXUP_HEADSET_MIC),
10224	SND_PCI_QUIRK(0x17aa, 0x3801, "Lenovo Yoga9 14IAP7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
10225	SND_PCI_QUIRK(0x17aa, 0x3802, "Lenovo Yoga Pro 9 14IRP8 / DuetITL 2021", ALC287_FIXUP_LENOVO_14IRP8_DUETITL),
10226	SND_PCI_QUIRK(0x17aa, 0x3813, "Legion 7i 15IMHG05", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
10227	SND_PCI_QUIRK(0x17aa, 0x3818, "Lenovo C940 / Yoga Duet 7", ALC298_FIXUP_LENOVO_C940_DUET7),
10228	SND_PCI_QUIRK(0x17aa, 0x3819, "Lenovo 13s Gen2 ITL", ALC287_FIXUP_13S_GEN2_SPEAKERS),
10229	SND_PCI_QUIRK(0x17aa, 0x3820, "Yoga Duet 7 13ITL6", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
10230	SND_PCI_QUIRK(0x17aa, 0x3824, "Legion Y9000X 2020", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),
10231	SND_PCI_QUIRK(0x17aa, 0x3827, "Ideapad S740", ALC285_FIXUP_IDEAPAD_S740_COEF),
10232	SND_PCI_QUIRK(0x17aa, 0x3834, "Lenovo IdeaPad Slim 9i 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
10233	SND_PCI_QUIRK(0x17aa, 0x383d, "Legion Y9000X 2019", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),
10234	SND_PCI_QUIRK(0x17aa, 0x3843, "Yoga 9i", ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP),
10235	SND_PCI_QUIRK(0x17aa, 0x3847, "Legion 7 16ACHG6", ALC287_FIXUP_LEGION_16ACHG6),
10236	SND_PCI_QUIRK(0x17aa, 0x384a, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
10237	SND_PCI_QUIRK(0x17aa, 0x3852, "Lenovo Yoga 7 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
10238	SND_PCI_QUIRK(0x17aa, 0x3853, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
10239	SND_PCI_QUIRK(0x17aa, 0x3855, "Legion 7 16ITHG6", ALC287_FIXUP_LEGION_16ITHG6),
10240	SND_PCI_QUIRK(0x17aa, 0x3869, "Lenovo Yoga7 14IAL7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
10241	SND_PCI_QUIRK(0x17aa, 0x387d, "Yoga S780-16 pro Quad AAC", ALC287_FIXUP_TAS2781_I2C),
10242	SND_PCI_QUIRK(0x17aa, 0x387e, "Yoga S780-16 pro Quad YC", ALC287_FIXUP_TAS2781_I2C),
10243	SND_PCI_QUIRK(0x17aa, 0x3881, "YB9 dual power mode2 YC", ALC287_FIXUP_TAS2781_I2C),
10244	SND_PCI_QUIRK(0x17aa, 0x3882, "Lenovo Yoga Pro 7 14APH8", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
10245	SND_PCI_QUIRK(0x17aa, 0x3884, "Y780 YG DUAL", ALC287_FIXUP_TAS2781_I2C),
10246	SND_PCI_QUIRK(0x17aa, 0x3886, "Y780 VECO DUAL", ALC287_FIXUP_TAS2781_I2C),
10247	SND_PCI_QUIRK(0x17aa, 0x38a7, "Y780P AMD YG dual", ALC287_FIXUP_TAS2781_I2C),
10248	SND_PCI_QUIRK(0x17aa, 0x38a8, "Y780P AMD VECO dual", ALC287_FIXUP_TAS2781_I2C),
10249	SND_PCI_QUIRK(0x17aa, 0x38ba, "Yoga S780-14.5 Air AMD quad YC", ALC287_FIXUP_TAS2781_I2C),
10250	SND_PCI_QUIRK(0x17aa, 0x38bb, "Yoga S780-14.5 Air AMD quad AAC", ALC287_FIXUP_TAS2781_I2C),
10251	SND_PCI_QUIRK(0x17aa, 0x38be, "Yoga S980-14.5 proX YC Dual", ALC287_FIXUP_TAS2781_I2C),
10252	SND_PCI_QUIRK(0x17aa, 0x38bf, "Yoga S980-14.5 proX LX Dual", ALC287_FIXUP_TAS2781_I2C),
10253	SND_PCI_QUIRK(0x17aa, 0x38c3, "Y980 DUAL", ALC287_FIXUP_TAS2781_I2C),
10254	SND_PCI_QUIRK(0x17aa, 0x38cb, "Y790 YG DUAL", ALC287_FIXUP_TAS2781_I2C),
10255	SND_PCI_QUIRK(0x17aa, 0x38cd, "Y790 VECO DUAL", ALC287_FIXUP_TAS2781_I2C),
10256	SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
10257	SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
10258	SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
10259	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
10260	SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
10261	SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC),
10262	SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK),
10263	SND_PCI_QUIRK(0x17aa, 0x5026, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
10264	SND_PCI_QUIRK(0x17aa, 0x5034, "Thinkpad T450", ALC292_FIXUP_TPT440_DOCK),
10265	SND_PCI_QUIRK(0x17aa, 0x5036, "Thinkpad T450s", ALC292_FIXUP_TPT440_DOCK),
10266	SND_PCI_QUIRK(0x17aa, 0x503c, "Thinkpad L450", ALC292_FIXUP_TPT440_DOCK),
10267	SND_PCI_QUIRK(0x17aa, 0x504a, "ThinkPad X260", ALC292_FIXUP_TPT440_DOCK),
10268	SND_PCI_QUIRK(0x17aa, 0x504b, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
10269	SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460),
10270	SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460),
10271	SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460),
10272	SND_PCI_QUIRK(0x17aa, 0x505d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10273	SND_PCI_QUIRK(0x17aa, 0x505f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10274	SND_PCI_QUIRK(0x17aa, 0x5062, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10275	SND_PCI_QUIRK(0x17aa, 0x508b, "Thinkpad X12 Gen 1", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
10276	SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
10277	SND_PCI_QUIRK(0x17aa, 0x511e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10278	SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10279	SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
10280	SND_PCI_QUIRK(0x17aa, 0x9e56, "Lenovo ZhaoYang CF4620Z", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
10281	SND_PCI_QUIRK(0x1849, 0x1233, "ASRock NUC Box 1100", ALC233_FIXUP_NO_AUDIO_JACK),
10282	SND_PCI_QUIRK(0x1849, 0xa233, "Positivo Master C6300", ALC269_FIXUP_HEADSET_MIC),
10283	SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS),
10284	SND_PCI_QUIRK(0x19e5, 0x320f, "Huawei WRT-WX9 ", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
10285	SND_PCI_QUIRK(0x1b35, 0x1235, "CZC B20", ALC269_FIXUP_CZC_B20),
10286	SND_PCI_QUIRK(0x1b35, 0x1236, "CZC TMI", ALC269_FIXUP_CZC_TMI),
10287	SND_PCI_QUIRK(0x1b35, 0x1237, "CZC L101", ALC269_FIXUP_CZC_L101),
10288	SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */
10289	SND_PCI_QUIRK(0x1c06, 0x2013, "Lemote A1802", ALC269_FIXUP_LEMOTE_A1802),
10290	SND_PCI_QUIRK(0x1c06, 0x2015, "Lemote A190X", ALC269_FIXUP_LEMOTE_A190X),
10291	SND_PCI_QUIRK(0x1c6c, 0x1251, "Positivo N14KP6-TG", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE),
10292	SND_PCI_QUIRK(0x1d05, 0x1132, "TongFang PHxTxX1", ALC256_FIXUP_SET_COEF_DEFAULTS),
10293	SND_PCI_QUIRK(0x1d05, 0x1096, "TongFang GMxMRxx", ALC269_FIXUP_NO_SHUTUP),
10294	SND_PCI_QUIRK(0x1d05, 0x1100, "TongFang GKxNRxx", ALC269_FIXUP_NO_SHUTUP),
10295	SND_PCI_QUIRK(0x1d05, 0x1111, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
10296	SND_PCI_QUIRK(0x1d05, 0x1119, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
10297	SND_PCI_QUIRK(0x1d05, 0x1129, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
10298	SND_PCI_QUIRK(0x1d05, 0x1147, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP),
10299	SND_PCI_QUIRK(0x1d05, 0x115c, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP),
10300	SND_PCI_QUIRK(0x1d05, 0x121b, "TongFang GMxAGxx", ALC269_FIXUP_NO_SHUTUP),
10301	SND_PCI_QUIRK(0x1d72, 0x1602, "RedmiBook", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
10302	SND_PCI_QUIRK(0x1d72, 0x1701, "XiaomiNotebook Pro", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE),
10303	SND_PCI_QUIRK(0x1d72, 0x1901, "RedmiBook 14", ALC256_FIXUP_ASUS_HEADSET_MIC),
10304	SND_PCI_QUIRK(0x1d72, 0x1945, "Redmi G", ALC256_FIXUP_ASUS_HEADSET_MIC),
10305	SND_PCI_QUIRK(0x1d72, 0x1947, "RedmiBook Air", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
10306	SND_PCI_QUIRK(0x2782, 0x0232, "CHUWI CoreBook XPro", ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO),
10307	SND_PCI_QUIRK(0x2782, 0x1707, "Vaio VJFE-ADL", ALC298_FIXUP_SPK_VOLUME),
10308	SND_PCI_QUIRK(0x8086, 0x2074, "Intel NUC 8", ALC233_FIXUP_INTEL_NUC8_DMIC),
10309	SND_PCI_QUIRK(0x8086, 0x2080, "Intel NUC 8 Rugged", ALC256_FIXUP_INTEL_NUC8_RUGGED),
10310	SND_PCI_QUIRK(0x8086, 0x2081, "Intel NUC 10", ALC256_FIXUP_INTEL_NUC10),
10311	SND_PCI_QUIRK(0x8086, 0x3038, "Intel NUC 13", ALC295_FIXUP_CHROME_BOOK),
10312	SND_PCI_QUIRK(0xf111, 0x0001, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
10313	SND_PCI_QUIRK(0xf111, 0x0005, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
10314	SND_PCI_QUIRK(0xf111, 0x0006, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
10315
10316#if 0
10317	/* Below is a quirk table taken from the old code.
10318	 * Basically the device should work as is without the fixup table.
10319	 * If BIOS doesn't give a proper info, enable the corresponding
10320	 * fixup entry.
10321	 */
10322	SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
10323		      ALC269_FIXUP_AMIC),
10324	SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC),
10325	SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC),
10326	SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC),
10327	SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC),
10328	SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269_FIXUP_AMIC),
10329	SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269_FIXUP_AMIC),
10330	SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269_FIXUP_AMIC),
10331	SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_FIXUP_AMIC),
10332	SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269_FIXUP_AMIC),
10333	SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_FIXUP_AMIC),
10334	SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_FIXUP_AMIC),
10335	SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_FIXUP_AMIC),
10336	SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_FIXUP_AMIC),
10337	SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_FIXUP_AMIC),
10338	SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_FIXUP_AMIC),
10339	SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_FIXUP_AMIC),
10340	SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_FIXUP_AMIC),
10341	SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_FIXUP_AMIC),
10342	SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_FIXUP_AMIC),
10343	SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_FIXUP_AMIC),
10344	SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_FIXUP_AMIC),
10345	SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_FIXUP_AMIC),
10346	SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_FIXUP_AMIC),
10347	SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_FIXUP_AMIC),
10348	SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_FIXUP_AMIC),
10349	SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_FIXUP_AMIC),
10350	SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_FIXUP_AMIC),
10351	SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_FIXUP_AMIC),
10352	SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_FIXUP_AMIC),
10353	SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_FIXUP_AMIC),
10354	SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_FIXUP_AMIC),
10355	SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_FIXUP_AMIC),
10356	SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_FIXUP_AMIC),
10357	SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_FIXUP_AMIC),
10358	SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_FIXUP_DMIC),
10359	SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_FIXUP_AMIC),
10360	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_AMIC),
10361	SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_FIXUP_DMIC),
10362	SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_FIXUP_DMIC),
10363#endif
10364	{}
10365};
10366
10367static const struct snd_pci_quirk alc269_fixup_vendor_tbl[] = {
10368	SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
10369	SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED),
10370	SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
10371	SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", ALC269_FIXUP_THINKPAD_ACPI),
10372	SND_PCI_QUIRK_VENDOR(0x19e5, "Huawei Matebook", ALC255_FIXUP_MIC_MUTE_LED),
10373	{}
10374};
10375
10376static const struct hda_model_fixup alc269_fixup_models[] = {
10377	{.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"},
10378	{.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"},
10379	{.id = ALC269_FIXUP_STEREO_DMIC, .name = "alc269-dmic"},
10380	{.id = ALC271_FIXUP_DMIC, .name = "alc271-dmic"},
10381	{.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"},
10382	{.id = ALC269_FIXUP_HEADSET_MIC, .name = "headset-mic"},
10383	{.id = ALC269_FIXUP_HEADSET_MODE, .name = "headset-mode"},
10384	{.id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, .name = "headset-mode-no-hp-mic"},
10385	{.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
10386	{.id = ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST, .name = "lenovo-dock-limit-boost"},
10387	{.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
10388	{.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic1-led"},
10389	{.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
10390	{.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
10391	{.id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, .name = "dell-headset3"},
10392	{.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, .name = "dell-headset4"},
10393	{.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},
10394	{.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"},
10395	{.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
10396	{.id = ALC292_FIXUP_TPT440, .name = "tpt440"},
10397	{.id = ALC292_FIXUP_TPT460, .name = "tpt460"},
10398	{.id = ALC298_FIXUP_TPT470_DOCK_FIX, .name = "tpt470-dock-fix"},
10399	{.id = ALC298_FIXUP_TPT470_DOCK, .name = "tpt470-dock"},
10400	{.id = ALC233_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
10401	{.id = ALC700_FIXUP_INTEL_REFERENCE, .name = "alc700-ref"},
10402	{.id = ALC269_FIXUP_SONY_VAIO, .name = "vaio"},
10403	{.id = ALC269_FIXUP_DELL_M101Z, .name = "dell-m101z"},
10404	{.id = ALC269_FIXUP_ASUS_G73JW, .name = "asus-g73jw"},
10405	{.id = ALC269_FIXUP_LENOVO_EAPD, .name = "lenovo-eapd"},
10406	{.id = ALC275_FIXUP_SONY_HWEQ, .name = "sony-hweq"},
10407	{.id = ALC269_FIXUP_PCM_44K, .name = "pcm44k"},
10408	{.id = ALC269_FIXUP_LIFEBOOK, .name = "lifebook"},
10409	{.id = ALC269_FIXUP_LIFEBOOK_EXTMIC, .name = "lifebook-extmic"},
10410	{.id = ALC269_FIXUP_LIFEBOOK_HP_PIN, .name = "lifebook-hp-pin"},
10411	{.id = ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC, .name = "lifebook-u7x7"},
10412	{.id = ALC269VB_FIXUP_AMIC, .name = "alc269vb-amic"},
10413	{.id = ALC269VB_FIXUP_DMIC, .name = "alc269vb-dmic"},
10414	{.id = ALC269_FIXUP_HP_MUTE_LED_MIC1, .name = "hp-mute-led-mic1"},
10415	{.id = ALC269_FIXUP_HP_MUTE_LED_MIC2, .name = "hp-mute-led-mic2"},
10416	{.id = ALC269_FIXUP_HP_MUTE_LED_MIC3, .name = "hp-mute-led-mic3"},
10417	{.id = ALC269_FIXUP_HP_GPIO_MIC1_LED, .name = "hp-gpio-mic1"},
10418	{.id = ALC269_FIXUP_HP_LINE1_MIC1_LED, .name = "hp-line1-mic1"},
10419	{.id = ALC269_FIXUP_NO_SHUTUP, .name = "noshutup"},
10420	{.id = ALC286_FIXUP_SONY_MIC_NO_PRESENCE, .name = "sony-nomic"},
10421	{.id = ALC269_FIXUP_ASPIRE_HEADSET_MIC, .name = "aspire-headset-mic"},
10422	{.id = ALC269_FIXUP_ASUS_X101, .name = "asus-x101"},
10423	{.id = ALC271_FIXUP_HP_GATE_MIC_JACK, .name = "acer-ao7xx"},
10424	{.id = ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572, .name = "acer-aspire-e1"},
10425	{.id = ALC269_FIXUP_ACER_AC700, .name = "acer-ac700"},
10426	{.id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST, .name = "limit-mic-boost"},
10427	{.id = ALC269VB_FIXUP_ASUS_ZENBOOK, .name = "asus-zenbook"},
10428	{.id = ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A, .name = "asus-zenbook-ux31a"},
10429	{.id = ALC269VB_FIXUP_ORDISSIMO_EVE2, .name = "ordissimo"},
10430	{.id = ALC282_FIXUP_ASUS_TX300, .name = "asus-tx300"},
10431	{.id = ALC283_FIXUP_INT_MIC, .name = "alc283-int-mic"},
10432	{.id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK, .name = "mono-speakers"},
10433	{.id = ALC290_FIXUP_SUBWOOFER_HSJACK, .name = "alc290-subwoofer"},
10434	{.id = ALC269_FIXUP_THINKPAD_ACPI, .name = "thinkpad"},
10435	{.id = ALC269_FIXUP_DMIC_THINKPAD_ACPI, .name = "dmic-thinkpad"},
10436	{.id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE, .name = "alc255-acer"},
10437	{.id = ALC255_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc255-asus"},
10438	{.id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc255-dell1"},
10439	{.id = ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "alc255-dell2"},
10440	{.id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc293-dell1"},
10441	{.id = ALC283_FIXUP_HEADSET_MIC, .name = "alc283-headset"},
10442	{.id = ALC255_FIXUP_MIC_MUTE_LED, .name = "alc255-dell-mute"},
10443	{.id = ALC282_FIXUP_ASPIRE_V5_PINS, .name = "aspire-v5"},
10444	{.id = ALC269VB_FIXUP_ASPIRE_E1_COEF, .name = "aspire-e1-coef"},
10445	{.id = ALC280_FIXUP_HP_GPIO4, .name = "hp-gpio4"},
10446	{.id = ALC286_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
10447	{.id = ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY, .name = "hp-gpio2-hotkey"},
10448	{.id = ALC280_FIXUP_HP_DOCK_PINS, .name = "hp-dock-pins"},
10449	{.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic"},
10450	{.id = ALC280_FIXUP_HP_9480M, .name = "hp-9480m"},
10451	{.id = ALC288_FIXUP_DELL_HEADSET_MODE, .name = "alc288-dell-headset"},
10452	{.id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc288-dell1"},
10453	{.id = ALC288_FIXUP_DELL_XPS_13, .name = "alc288-dell-xps13"},
10454	{.id = ALC292_FIXUP_DELL_E7X, .name = "dell-e7x"},
10455	{.id = ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK, .name = "alc293-dell"},
10456	{.id = ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc298-dell1"},
10457	{.id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, .name = "alc298-dell-aio"},
10458	{.id = ALC275_FIXUP_DELL_XPS, .name = "alc275-dell-xps"},
10459	{.id = ALC293_FIXUP_LENOVO_SPK_NOISE, .name = "lenovo-spk-noise"},
10460	{.id = ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, .name = "lenovo-hotkey"},
10461	{.id = ALC255_FIXUP_DELL_SPK_NOISE, .name = "dell-spk-noise"},
10462	{.id = ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc225-dell1"},
10463	{.id = ALC295_FIXUP_DISABLE_DAC3, .name = "alc295-disable-dac3"},
10464	{.id = ALC285_FIXUP_SPEAKER2_TO_DAC1, .name = "alc285-speaker2-to-dac1"},
10465	{.id = ALC280_FIXUP_HP_HEADSET_MIC, .name = "alc280-hp-headset"},
10466	{.id = ALC221_FIXUP_HP_FRONT_MIC, .name = "alc221-hp-mic"},
10467	{.id = ALC298_FIXUP_SPK_VOLUME, .name = "alc298-spk-volume"},
10468	{.id = ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER, .name = "dell-inspiron-7559"},
10469	{.id = ALC269_FIXUP_ATIV_BOOK_8, .name = "ativ-book"},
10470	{.id = ALC221_FIXUP_HP_MIC_NO_PRESENCE, .name = "alc221-hp-mic"},
10471	{.id = ALC256_FIXUP_ASUS_HEADSET_MODE, .name = "alc256-asus-headset"},
10472	{.id = ALC256_FIXUP_ASUS_MIC, .name = "alc256-asus-mic"},
10473	{.id = ALC256_FIXUP_ASUS_AIO_GPIO2, .name = "alc256-asus-aio"},
10474	{.id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc233-asus"},
10475	{.id = ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE, .name = "alc233-eapd"},
10476	{.id = ALC294_FIXUP_LENOVO_MIC_LOCATION, .name = "alc294-lenovo-mic"},
10477	{.id = ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE, .name = "alc225-wyse"},
10478	{.id = ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, .name = "alc274-dell-aio"},
10479	{.id = ALC255_FIXUP_DUMMY_LINEOUT_VERB, .name = "alc255-dummy-lineout"},
10480	{.id = ALC255_FIXUP_DELL_HEADSET_MIC, .name = "alc255-dell-headset"},
10481	{.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"},
10482	{.id = ALC225_FIXUP_HEADSET_JACK, .name = "alc-headset-jack"},
10483	{.id = ALC295_FIXUP_CHROME_BOOK, .name = "alc-chrome-book"},
10484	{.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"},
10485	{.id = ALC298_FIXUP_HUAWEI_MBX_STEREO, .name = "huawei-mbx-stereo"},
10486	{.id = ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, .name = "alc256-medion-headset"},
10487	{.id = ALC298_FIXUP_SAMSUNG_AMP, .name = "alc298-samsung-amp"},
10488	{.id = ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET, .name = "alc256-samsung-headphone"},
10489	{.id = ALC255_FIXUP_XIAOMI_HEADSET_MIC, .name = "alc255-xiaomi-headset"},
10490	{.id = ALC274_FIXUP_HP_MIC, .name = "alc274-hp-mic-detect"},
10491	{.id = ALC245_FIXUP_HP_X360_AMP, .name = "alc245-hp-x360-amp"},
10492	{.id = ALC295_FIXUP_HP_OMEN, .name = "alc295-hp-omen"},
10493	{.id = ALC285_FIXUP_HP_SPECTRE_X360, .name = "alc285-hp-spectre-x360"},
10494	{.id = ALC285_FIXUP_HP_SPECTRE_X360_EB1, .name = "alc285-hp-spectre-x360-eb1"},
10495	{.id = ALC285_FIXUP_HP_ENVY_X360, .name = "alc285-hp-envy-x360"},
10496	{.id = ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP, .name = "alc287-ideapad-bass-spk-amp"},
10497	{.id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN, .name = "alc287-yoga9-bass-spk-pin"},
10498	{.id = ALC623_FIXUP_LENOVO_THINKSTATION_P340, .name = "alc623-lenovo-thinkstation-p340"},
10499	{.id = ALC255_FIXUP_ACER_HEADPHONE_AND_MIC, .name = "alc255-acer-headphone-and-mic"},
10500	{.id = ALC285_FIXUP_HP_GPIO_AMP_INIT, .name = "alc285-hp-amp-init"},
10501	{}
10502};
10503#define ALC225_STANDARD_PINS \
10504	{0x21, 0x04211020}
10505
10506#define ALC256_STANDARD_PINS \
10507	{0x12, 0x90a60140}, \
10508	{0x14, 0x90170110}, \
10509	{0x21, 0x02211020}
10510
10511#define ALC282_STANDARD_PINS \
10512	{0x14, 0x90170110}
10513
10514#define ALC290_STANDARD_PINS \
10515	{0x12, 0x99a30130}
10516
10517#define ALC292_STANDARD_PINS \
10518	{0x14, 0x90170110}, \
10519	{0x15, 0x0221401f}
10520
10521#define ALC295_STANDARD_PINS \
10522	{0x12, 0xb7a60130}, \
10523	{0x14, 0x90170110}, \
10524	{0x21, 0x04211020}
10525
10526#define ALC298_STANDARD_PINS \
10527	{0x12, 0x90a60130}, \
10528	{0x21, 0x03211020}
10529
10530static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
10531	SND_HDA_PIN_QUIRK(0x10ec0221, 0x103c, "HP Workstation", ALC221_FIXUP_HP_HEADSET_MIC,
10532		{0x14, 0x01014020},
10533		{0x17, 0x90170110},
10534		{0x18, 0x02a11030},
10535		{0x19, 0x0181303F},
10536		{0x21, 0x0221102f}),
10537	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1025, "Acer", ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
10538		{0x12, 0x90a601c0},
10539		{0x14, 0x90171120},
10540		{0x21, 0x02211030}),
10541	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
10542		{0x14, 0x90170110},
10543		{0x1b, 0x90a70130},
10544		{0x21, 0x03211020}),
10545	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
10546		{0x1a, 0x90a70130},
10547		{0x1b, 0x90170110},
10548		{0x21, 0x03211020}),
10549	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10550		ALC225_STANDARD_PINS,
10551		{0x12, 0xb7a60130},
10552		{0x14, 0x901701a0}),
10553	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10554		ALC225_STANDARD_PINS,
10555		{0x12, 0xb7a60130},
10556		{0x14, 0x901701b0}),
10557	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10558		ALC225_STANDARD_PINS,
10559		{0x12, 0xb7a60150},
10560		{0x14, 0x901701a0}),
10561	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10562		ALC225_STANDARD_PINS,
10563		{0x12, 0xb7a60150},
10564		{0x14, 0x901701b0}),
10565	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10566		ALC225_STANDARD_PINS,
10567		{0x12, 0xb7a60130},
10568		{0x1b, 0x90170110}),
10569	SND_HDA_PIN_QUIRK(0x10ec0233, 0x8086, "Intel NUC Skull Canyon", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10570		{0x1b, 0x01111010},
10571		{0x1e, 0x01451130},
10572		{0x21, 0x02211020}),
10573	SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
10574		{0x12, 0x90a60140},
10575		{0x14, 0x90170110},
10576		{0x19, 0x02a11030},
10577		{0x21, 0x02211020}),
10578	SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
10579		{0x14, 0x90170110},
10580		{0x19, 0x02a11030},
10581		{0x1a, 0x02a11040},
10582		{0x1b, 0x01014020},
10583		{0x21, 0x0221101f}),
10584	SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
10585		{0x14, 0x90170110},
10586		{0x19, 0x02a11030},
10587		{0x1a, 0x02a11040},
10588		{0x1b, 0x01011020},
10589		{0x21, 0x0221101f}),
10590	SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
10591		{0x14, 0x90170110},
10592		{0x19, 0x02a11020},
10593		{0x1a, 0x02a11030},
10594		{0x21, 0x0221101f}),
10595	SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
10596		{0x21, 0x02211010}),
10597	SND_HDA_PIN_QUIRK(0x10ec0236, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
10598		{0x14, 0x90170110},
10599		{0x19, 0x02a11020},
10600		{0x21, 0x02211030}),
10601	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
10602		{0x14, 0x90170110},
10603		{0x21, 0x02211020}),
10604	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10605		{0x14, 0x90170130},
10606		{0x21, 0x02211040}),
10607	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10608		{0x12, 0x90a60140},
10609		{0x14, 0x90170110},
10610		{0x21, 0x02211020}),
10611	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10612		{0x12, 0x90a60160},
10613		{0x14, 0x90170120},
10614		{0x21, 0x02211030}),
10615	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10616		{0x14, 0x90170110},
10617		{0x1b, 0x02011020},
10618		{0x21, 0x0221101f}),
10619	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10620		{0x14, 0x90170110},
10621		{0x1b, 0x01011020},
10622		{0x21, 0x0221101f}),
10623	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10624		{0x14, 0x90170130},
10625		{0x1b, 0x01014020},
10626		{0x21, 0x0221103f}),
10627	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10628		{0x14, 0x90170130},
10629		{0x1b, 0x01011020},
10630		{0x21, 0x0221103f}),
10631	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10632		{0x14, 0x90170130},
10633		{0x1b, 0x02011020},
10634		{0x21, 0x0221103f}),
10635	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10636		{0x14, 0x90170150},
10637		{0x1b, 0x02011020},
10638		{0x21, 0x0221105f}),
10639	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10640		{0x14, 0x90170110},
10641		{0x1b, 0x01014020},
10642		{0x21, 0x0221101f}),
10643	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10644		{0x12, 0x90a60160},
10645		{0x14, 0x90170120},
10646		{0x17, 0x90170140},
10647		{0x21, 0x0321102f}),
10648	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10649		{0x12, 0x90a60160},
10650		{0x14, 0x90170130},
10651		{0x21, 0x02211040}),
10652	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10653		{0x12, 0x90a60160},
10654		{0x14, 0x90170140},
10655		{0x21, 0x02211050}),
10656	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10657		{0x12, 0x90a60170},
10658		{0x14, 0x90170120},
10659		{0x21, 0x02211030}),
10660	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10661		{0x12, 0x90a60170},
10662		{0x14, 0x90170130},
10663		{0x21, 0x02211040}),
10664	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10665		{0x12, 0x90a60170},
10666		{0x14, 0x90171130},
10667		{0x21, 0x02211040}),
10668	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10669		{0x12, 0x90a60170},
10670		{0x14, 0x90170140},
10671		{0x21, 0x02211050}),
10672	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5548", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10673		{0x12, 0x90a60180},
10674		{0x14, 0x90170130},
10675		{0x21, 0x02211040}),
10676	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5565", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10677		{0x12, 0x90a60180},
10678		{0x14, 0x90170120},
10679		{0x21, 0x02211030}),
10680	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10681		{0x1b, 0x01011020},
10682		{0x21, 0x02211010}),
10683	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
10684		{0x14, 0x90170110},
10685		{0x1b, 0x90a70130},
10686		{0x21, 0x04211020}),
10687	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
10688		{0x14, 0x90170110},
10689		{0x1b, 0x90a70130},
10690		{0x21, 0x03211020}),
10691	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
10692		{0x12, 0x90a60130},
10693		{0x14, 0x90170110},
10694		{0x21, 0x03211020}),
10695	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
10696		{0x12, 0x90a60130},
10697		{0x14, 0x90170110},
10698		{0x21, 0x04211020}),
10699	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
10700		{0x1a, 0x90a70130},
10701		{0x1b, 0x90170110},
10702		{0x21, 0x03211020}),
10703       SND_HDA_PIN_QUIRK(0x10ec0256, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
10704		{0x14, 0x90170110},
10705		{0x19, 0x02a11020},
10706		{0x21, 0x0221101f}),
10707       SND_HDA_PIN_QUIRK(0x10ec0274, 0x103c, "HP", ALC274_FIXUP_HP_HEADSET_MIC,
10708		{0x17, 0x90170110},
10709		{0x19, 0x03a11030},
10710		{0x21, 0x03211020}),
10711	SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
10712		{0x12, 0x90a60130},
10713		{0x14, 0x90170110},
10714		{0x15, 0x0421101f},
10715		{0x1a, 0x04a11020}),
10716	SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED,
10717		{0x12, 0x90a60140},
10718		{0x14, 0x90170110},
10719		{0x15, 0x0421101f},
10720		{0x18, 0x02811030},
10721		{0x1a, 0x04a1103f},
10722		{0x1b, 0x02011020}),
10723	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP 15 Touchsmart", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10724		ALC282_STANDARD_PINS,
10725		{0x12, 0x99a30130},
10726		{0x19, 0x03a11020},
10727		{0x21, 0x0321101f}),
10728	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10729		ALC282_STANDARD_PINS,
10730		{0x12, 0x99a30130},
10731		{0x19, 0x03a11020},
10732		{0x21, 0x03211040}),
10733	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10734		ALC282_STANDARD_PINS,
10735		{0x12, 0x99a30130},
10736		{0x19, 0x03a11030},
10737		{0x21, 0x03211020}),
10738	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10739		ALC282_STANDARD_PINS,
10740		{0x12, 0x99a30130},
10741		{0x19, 0x04a11020},
10742		{0x21, 0x0421101f}),
10743	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED,
10744		ALC282_STANDARD_PINS,
10745		{0x12, 0x90a60140},
10746		{0x19, 0x04a11030},
10747		{0x21, 0x04211020}),
10748	SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
10749		ALC282_STANDARD_PINS,
10750		{0x12, 0x90a609c0},
10751		{0x18, 0x03a11830},
10752		{0x19, 0x04a19831},
10753		{0x1a, 0x0481303f},
10754		{0x1b, 0x04211020},
10755		{0x21, 0x0321101f}),
10756	SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
10757		ALC282_STANDARD_PINS,
10758		{0x12, 0x90a60940},
10759		{0x18, 0x03a11830},
10760		{0x19, 0x04a19831},
10761		{0x1a, 0x0481303f},
10762		{0x1b, 0x04211020},
10763		{0x21, 0x0321101f}),
10764	SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10765		ALC282_STANDARD_PINS,
10766		{0x12, 0x90a60130},
10767		{0x21, 0x0321101f}),
10768	SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10769		{0x12, 0x90a60160},
10770		{0x14, 0x90170120},
10771		{0x21, 0x02211030}),
10772	SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10773		ALC282_STANDARD_PINS,
10774		{0x12, 0x90a60130},
10775		{0x19, 0x03a11020},
10776		{0x21, 0x0321101f}),
10777	SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
10778		{0x12, 0x90a60130},
10779		{0x14, 0x90170110},
10780		{0x19, 0x04a11040},
10781		{0x21, 0x04211020}),
10782	SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
10783		{0x14, 0x90170110},
10784		{0x19, 0x04a11040},
10785		{0x1d, 0x40600001},
10786		{0x21, 0x04211020}),
10787	SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
10788		{0x14, 0x90170110},
10789		{0x19, 0x04a11040},
10790		{0x21, 0x04211020}),
10791	SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_HEADSET_JACK,
10792		{0x14, 0x90170110},
10793		{0x17, 0x90170111},
10794		{0x19, 0x03a11030},
10795		{0x21, 0x03211020}),
10796	SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC287_FIXUP_THINKPAD_I2S_SPK,
10797		{0x17, 0x90170110},
10798		{0x19, 0x03a11030},
10799		{0x21, 0x03211020}),
10800	SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC287_FIXUP_THINKPAD_I2S_SPK,
10801		{0x17, 0x90170110}, /* 0x231f with RTK I2S AMP */
10802		{0x19, 0x04a11040},
10803		{0x21, 0x04211020}),
10804	SND_HDA_PIN_QUIRK(0x10ec0286, 0x1025, "Acer", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
10805		{0x12, 0x90a60130},
10806		{0x17, 0x90170110},
10807		{0x21, 0x02211020}),
10808	SND_HDA_PIN_QUIRK(0x10ec0288, 0x1028, "Dell", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
10809		{0x12, 0x90a60120},
10810		{0x14, 0x90170110},
10811		{0x21, 0x0321101f}),
10812	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10813		ALC290_STANDARD_PINS,
10814		{0x15, 0x04211040},
10815		{0x18, 0x90170112},
10816		{0x1a, 0x04a11020}),
10817	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10818		ALC290_STANDARD_PINS,
10819		{0x15, 0x04211040},
10820		{0x18, 0x90170110},
10821		{0x1a, 0x04a11020}),
10822	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10823		ALC290_STANDARD_PINS,
10824		{0x15, 0x0421101f},
10825		{0x1a, 0x04a11020}),
10826	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10827		ALC290_STANDARD_PINS,
10828		{0x15, 0x04211020},
10829		{0x1a, 0x04a11040}),
10830	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10831		ALC290_STANDARD_PINS,
10832		{0x14, 0x90170110},
10833		{0x15, 0x04211020},
10834		{0x1a, 0x04a11040}),
10835	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10836		ALC290_STANDARD_PINS,
10837		{0x14, 0x90170110},
10838		{0x15, 0x04211020},
10839		{0x1a, 0x04a11020}),
10840	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10841		ALC290_STANDARD_PINS,
10842		{0x14, 0x90170110},
10843		{0x15, 0x0421101f},
10844		{0x1a, 0x04a11020}),
10845	SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
10846		ALC292_STANDARD_PINS,
10847		{0x12, 0x90a60140},
10848		{0x16, 0x01014020},
10849		{0x19, 0x01a19030}),
10850	SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
10851		ALC292_STANDARD_PINS,
10852		{0x12, 0x90a60140},
10853		{0x16, 0x01014020},
10854		{0x18, 0x02a19031},
10855		{0x19, 0x01a1903e}),
10856	SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
10857		ALC292_STANDARD_PINS,
10858		{0x12, 0x90a60140}),
10859	SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
10860		ALC292_STANDARD_PINS,
10861		{0x13, 0x90a60140},
10862		{0x16, 0x21014020},
10863		{0x19, 0x21a19030}),
10864	SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
10865		ALC292_STANDARD_PINS,
10866		{0x13, 0x90a60140}),
10867	SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_HPE,
10868		{0x17, 0x90170110},
10869		{0x21, 0x04211020}),
10870	SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_MIC,
10871		{0x14, 0x90170110},
10872		{0x1b, 0x90a70130},
10873		{0x21, 0x04211020}),
10874	SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
10875		{0x12, 0x90a60130},
10876		{0x17, 0x90170110},
10877		{0x21, 0x03211020}),
10878	SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
10879		{0x12, 0x90a60130},
10880		{0x17, 0x90170110},
10881		{0x21, 0x04211020}),
10882	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
10883		{0x12, 0x90a60130},
10884		{0x17, 0x90170110},
10885		{0x21, 0x03211020}),
10886	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
10887		{0x12, 0x90a60120},
10888		{0x17, 0x90170110},
10889		{0x21, 0x04211030}),
10890	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
10891		{0x12, 0x90a60130},
10892		{0x17, 0x90170110},
10893		{0x21, 0x03211020}),
10894	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
10895		{0x12, 0x90a60130},
10896		{0x17, 0x90170110},
10897		{0x21, 0x03211020}),
10898	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
10899		ALC298_STANDARD_PINS,
10900		{0x17, 0x90170110}),
10901	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
10902		ALC298_STANDARD_PINS,
10903		{0x17, 0x90170140}),
10904	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
10905		ALC298_STANDARD_PINS,
10906		{0x17, 0x90170150}),
10907	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_SPK_VOLUME,
10908		{0x12, 0xb7a60140},
10909		{0x13, 0xb7a60150},
10910		{0x17, 0x90170110},
10911		{0x1a, 0x03011020},
10912		{0x21, 0x03211030}),
10913	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
10914		{0x12, 0xb7a60140},
10915		{0x17, 0x90170110},
10916		{0x1a, 0x03a11030},
10917		{0x21, 0x03211020}),
10918	SND_HDA_PIN_QUIRK(0x10ec0299, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
10919		ALC225_STANDARD_PINS,
10920		{0x12, 0xb7a60130},
10921		{0x17, 0x90170110}),
10922	SND_HDA_PIN_QUIRK(0x10ec0623, 0x17aa, "Lenovo", ALC283_FIXUP_HEADSET_MIC,
10923		{0x14, 0x01014010},
10924		{0x17, 0x90170120},
10925		{0x18, 0x02a11030},
10926		{0x19, 0x02a1103f},
10927		{0x21, 0x0221101f}),
10928	{}
10929};
10930
10931/* This is the fallback pin_fixup_tbl for alc269 family, to make the tbl match
10932 * more machines, don't need to match all valid pins, just need to match
10933 * all the pins defined in the tbl. Just because of this reason, it is possible
10934 * that a single machine matches multiple tbls, so there is one limitation:
10935 *   at most one tbl is allowed to define for the same vendor and same codec
10936 */
10937static const struct snd_hda_pin_quirk alc269_fallback_pin_fixup_tbl[] = {
10938	SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
10939		{0x19, 0x40000000},
10940		{0x1b, 0x40000000}),
10941	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
10942		{0x19, 0x40000000},
10943		{0x1b, 0x40000000}),
10944	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10945		{0x19, 0x40000000},
10946		{0x1a, 0x40000000}),
10947	SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10948		{0x19, 0x40000000},
10949		{0x1a, 0x40000000}),
10950	SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
10951		{0x19, 0x40000000},
10952		{0x1a, 0x40000000}),
10953	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC2XX_FIXUP_HEADSET_MIC,
10954		{0x19, 0x40000000}),
10955	{}
10956};
10957
10958static void alc269_fill_coef(struct hda_codec *codec)
10959{
10960	struct alc_spec *spec = codec->spec;
10961	int val;
10962
10963	if (spec->codec_variant != ALC269_TYPE_ALC269VB)
10964		return;
10965
10966	if ((alc_get_coef0(codec) & 0x00ff) < 0x015) {
10967		alc_write_coef_idx(codec, 0xf, 0x960b);
10968		alc_write_coef_idx(codec, 0xe, 0x8817);
10969	}
10970
10971	if ((alc_get_coef0(codec) & 0x00ff) == 0x016) {
10972		alc_write_coef_idx(codec, 0xf, 0x960b);
10973		alc_write_coef_idx(codec, 0xe, 0x8814);
10974	}
10975
10976	if ((alc_get_coef0(codec) & 0x00ff) == 0x017) {
10977		/* Power up output pin */
10978		alc_update_coef_idx(codec, 0x04, 0, 1<<11);
10979	}
10980
10981	if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {
10982		val = alc_read_coef_idx(codec, 0xd);
10983		if (val != -1 && (val & 0x0c00) >> 10 != 0x1) {
10984			/* Capless ramp up clock control */
10985			alc_write_coef_idx(codec, 0xd, val | (1<<10));
10986		}
10987		val = alc_read_coef_idx(codec, 0x17);
10988		if (val != -1 && (val & 0x01c0) >> 6 != 0x4) {
10989			/* Class D power on reset */
10990			alc_write_coef_idx(codec, 0x17, val | (1<<7));
10991		}
10992	}
10993
10994	/* HP */
10995	alc_update_coef_idx(codec, 0x4, 0, 1<<11);
10996}
10997
10998/*
10999 */
11000static int patch_alc269(struct hda_codec *codec)
11001{
11002	struct alc_spec *spec;
11003	int err;
11004
11005	err = alc_alloc_spec(codec, 0x0b);
11006	if (err < 0)
11007		return err;
11008
11009	spec = codec->spec;
11010	spec->gen.shared_mic_vref_pin = 0x18;
11011	codec->power_save_node = 0;
11012	spec->en_3kpull_low = true;
11013
11014#ifdef CONFIG_PM
11015	codec->patch_ops.suspend = alc269_suspend;
11016	codec->patch_ops.resume = alc269_resume;
11017#endif
11018	spec->shutup = alc_default_shutup;
11019	spec->init_hook = alc_default_init;
11020
11021	switch (codec->core.vendor_id) {
11022	case 0x10ec0269:
11023		spec->codec_variant = ALC269_TYPE_ALC269VA;
11024		switch (alc_get_coef0(codec) & 0x00f0) {
11025		case 0x0010:
11026			if (codec->bus->pci &&
11027			    codec->bus->pci->subsystem_vendor == 0x1025 &&
11028			    spec->cdefine.platform_type == 1)
11029				err = alc_codec_rename(codec, "ALC271X");
11030			spec->codec_variant = ALC269_TYPE_ALC269VB;
11031			break;
11032		case 0x0020:
11033			if (codec->bus->pci &&
11034			    codec->bus->pci->subsystem_vendor == 0x17aa &&
11035			    codec->bus->pci->subsystem_device == 0x21f3)
11036				err = alc_codec_rename(codec, "ALC3202");
11037			spec->codec_variant = ALC269_TYPE_ALC269VC;
11038			break;
11039		case 0x0030:
11040			spec->codec_variant = ALC269_TYPE_ALC269VD;
11041			break;
11042		default:
11043			alc_fix_pll_init(codec, 0x20, 0x04, 15);
11044		}
11045		if (err < 0)
11046			goto error;
11047		spec->shutup = alc269_shutup;
11048		spec->init_hook = alc269_fill_coef;
11049		alc269_fill_coef(codec);
11050		break;
11051
11052	case 0x10ec0280:
11053	case 0x10ec0290:
11054		spec->codec_variant = ALC269_TYPE_ALC280;
11055		break;
11056	case 0x10ec0282:
11057		spec->codec_variant = ALC269_TYPE_ALC282;
11058		spec->shutup = alc282_shutup;
11059		spec->init_hook = alc282_init;
11060		break;
11061	case 0x10ec0233:
11062	case 0x10ec0283:
11063		spec->codec_variant = ALC269_TYPE_ALC283;
11064		spec->shutup = alc283_shutup;
11065		spec->init_hook = alc283_init;
11066		break;
11067	case 0x10ec0284:
11068	case 0x10ec0292:
11069		spec->codec_variant = ALC269_TYPE_ALC284;
11070		break;
11071	case 0x10ec0293:
11072		spec->codec_variant = ALC269_TYPE_ALC293;
11073		break;
11074	case 0x10ec0286:
11075	case 0x10ec0288:
11076		spec->codec_variant = ALC269_TYPE_ALC286;
11077		break;
11078	case 0x10ec0298:
11079		spec->codec_variant = ALC269_TYPE_ALC298;
11080		break;
11081	case 0x10ec0235:
11082	case 0x10ec0255:
11083		spec->codec_variant = ALC269_TYPE_ALC255;
11084		spec->shutup = alc256_shutup;
11085		spec->init_hook = alc256_init;
11086		break;
11087	case 0x10ec0230:
11088	case 0x10ec0236:
11089	case 0x10ec0256:
11090	case 0x19e58326:
11091		spec->codec_variant = ALC269_TYPE_ALC256;
11092		spec->shutup = alc256_shutup;
11093		spec->init_hook = alc256_init;
11094		spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */
11095		if (codec->core.vendor_id == 0x10ec0236 &&
11096		    codec->bus->pci->vendor != PCI_VENDOR_ID_AMD)
11097			spec->en_3kpull_low = false;
11098		break;
11099	case 0x10ec0257:
11100		spec->codec_variant = ALC269_TYPE_ALC257;
11101		spec->shutup = alc256_shutup;
11102		spec->init_hook = alc256_init;
11103		spec->gen.mixer_nid = 0;
11104		spec->en_3kpull_low = false;
11105		break;
11106	case 0x10ec0215:
11107	case 0x10ec0245:
11108	case 0x10ec0285:
11109	case 0x10ec0289:
11110		if (alc_get_coef0(codec) & 0x0010)
11111			spec->codec_variant = ALC269_TYPE_ALC245;
11112		else
11113			spec->codec_variant = ALC269_TYPE_ALC215;
11114		spec->shutup = alc225_shutup;
11115		spec->init_hook = alc225_init;
11116		spec->gen.mixer_nid = 0;
11117		break;
11118	case 0x10ec0225:
11119	case 0x10ec0295:
11120	case 0x10ec0299:
11121		spec->codec_variant = ALC269_TYPE_ALC225;
11122		spec->shutup = alc225_shutup;
11123		spec->init_hook = alc225_init;
11124		spec->gen.mixer_nid = 0; /* no loopback on ALC225, ALC295 and ALC299 */
11125		break;
11126	case 0x10ec0287:
11127		spec->codec_variant = ALC269_TYPE_ALC287;
11128		spec->shutup = alc225_shutup;
11129		spec->init_hook = alc225_init;
11130		spec->gen.mixer_nid = 0; /* no loopback on ALC287 */
11131		break;
11132	case 0x10ec0234:
11133	case 0x10ec0274:
11134	case 0x10ec0294:
11135		spec->codec_variant = ALC269_TYPE_ALC294;
11136		spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */
11137		alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */
11138		spec->init_hook = alc294_init;
11139		break;
11140	case 0x10ec0300:
11141		spec->codec_variant = ALC269_TYPE_ALC300;
11142		spec->gen.mixer_nid = 0; /* no loopback on ALC300 */
11143		break;
11144	case 0x10ec0623:
11145		spec->codec_variant = ALC269_TYPE_ALC623;
11146		break;
11147	case 0x10ec0700:
11148	case 0x10ec0701:
11149	case 0x10ec0703:
11150	case 0x10ec0711:
11151		spec->codec_variant = ALC269_TYPE_ALC700;
11152		spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */
11153		alc_update_coef_idx(codec, 0x4a, 1 << 15, 0); /* Combo jack auto trigger control */
11154		spec->init_hook = alc294_init;
11155		break;
11156
11157	}
11158
11159	if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) {
11160		spec->has_alc5505_dsp = 1;
11161		spec->init_hook = alc5505_dsp_init;
11162	}
11163
11164	alc_pre_init(codec);
11165
11166	snd_hda_pick_fixup(codec, alc269_fixup_models,
11167		       alc269_fixup_tbl, alc269_fixups);
11168	/* FIXME: both TX300 and ROG Strix G17 have the same SSID, and
11169	 * the quirk breaks the latter (bko#214101).
11170	 * Clear the wrong entry.
11171	 */
11172	if (codec->fixup_id == ALC282_FIXUP_ASUS_TX300 &&
11173	    codec->core.vendor_id == 0x10ec0294) {
11174		codec_dbg(codec, "Clear wrong fixup for ASUS ROG Strix G17\n");
11175		codec->fixup_id = HDA_FIXUP_ID_NOT_SET;
11176	}
11177
11178	snd_hda_pick_pin_fixup(codec, alc269_pin_fixup_tbl, alc269_fixups, true);
11179	snd_hda_pick_pin_fixup(codec, alc269_fallback_pin_fixup_tbl, alc269_fixups, false);
11180	snd_hda_pick_fixup(codec, NULL,	alc269_fixup_vendor_tbl,
11181			   alc269_fixups);
11182	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
11183
11184	alc_auto_parse_customize_define(codec);
11185
11186	if (has_cdefine_beep(codec))
11187		spec->gen.beep_nid = 0x01;
11188
11189	/* automatic parse from the BIOS config */
11190	err = alc269_parse_auto_config(codec);
11191	if (err < 0)
11192		goto error;
11193
11194	if (!spec->gen.no_analog && spec->gen.beep_nid && spec->gen.mixer_nid) {
11195		err = set_beep_amp(spec, spec->gen.mixer_nid, 0x04, HDA_INPUT);
11196		if (err < 0)
11197			goto error;
11198	}
11199
11200	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
11201
11202	return 0;
11203
11204 error:
11205	alc_free(codec);
11206	return err;
11207}
11208
11209/*
11210 * ALC861
11211 */
11212
11213static int alc861_parse_auto_config(struct hda_codec *codec)
11214{
11215	static const hda_nid_t alc861_ignore[] = { 0x1d, 0 };
11216	static const hda_nid_t alc861_ssids[] = { 0x0e, 0x0f, 0x0b, 0 };
11217	return alc_parse_auto_config(codec, alc861_ignore, alc861_ssids);
11218}
11219
11220/* Pin config fixes */
11221enum {
11222	ALC861_FIXUP_FSC_AMILO_PI1505,
11223	ALC861_FIXUP_AMP_VREF_0F,
11224	ALC861_FIXUP_NO_JACK_DETECT,
11225	ALC861_FIXUP_ASUS_A6RP,
11226	ALC660_FIXUP_ASUS_W7J,
11227};
11228
11229/* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */
11230static void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec,
11231			const struct hda_fixup *fix, int action)
11232{
11233	struct alc_spec *spec = codec->spec;
11234	unsigned int val;
11235
11236	if (action != HDA_FIXUP_ACT_INIT)
11237		return;
11238	val = snd_hda_codec_get_pin_target(codec, 0x0f);
11239	if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)))
11240		val |= AC_PINCTL_IN_EN;
11241	val |= AC_PINCTL_VREF_50;
11242	snd_hda_set_pin_ctl(codec, 0x0f, val);
11243	spec->gen.keep_vref_in_automute = 1;
11244}
11245
11246/* suppress the jack-detection */
11247static void alc_fixup_no_jack_detect(struct hda_codec *codec,
11248				     const struct hda_fixup *fix, int action)
11249{
11250	if (action == HDA_FIXUP_ACT_PRE_PROBE)
11251		codec->no_jack_detect = 1;
11252}
11253
11254static const struct hda_fixup alc861_fixups[] = {
11255	[ALC861_FIXUP_FSC_AMILO_PI1505] = {
11256		.type = HDA_FIXUP_PINS,
11257		.v.pins = (const struct hda_pintbl[]) {
11258			{ 0x0b, 0x0221101f }, /* HP */
11259			{ 0x0f, 0x90170310 }, /* speaker */
11260			{ }
11261		}
11262	},
11263	[ALC861_FIXUP_AMP_VREF_0F] = {
11264		.type = HDA_FIXUP_FUNC,
11265		.v.func = alc861_fixup_asus_amp_vref_0f,
11266	},
11267	[ALC861_FIXUP_NO_JACK_DETECT] = {
11268		.type = HDA_FIXUP_FUNC,
11269		.v.func = alc_fixup_no_jack_detect,
11270	},
11271	[ALC861_FIXUP_ASUS_A6RP] = {
11272		.type = HDA_FIXUP_FUNC,
11273		.v.func = alc861_fixup_asus_amp_vref_0f,
11274		.chained = true,
11275		.chain_id = ALC861_FIXUP_NO_JACK_DETECT,
11276	},
11277	[ALC660_FIXUP_ASUS_W7J] = {
11278		.type = HDA_FIXUP_VERBS,
11279		.v.verbs = (const struct hda_verb[]) {
11280			/* ASUS W7J needs a magic pin setup on unused NID 0x10
11281			 * for enabling outputs
11282			 */
11283			{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11284			{ }
11285		},
11286	}
11287};
11288
11289static const struct snd_pci_quirk alc861_fixup_tbl[] = {
11290	SND_PCI_QUIRK(0x1043, 0x1253, "ASUS W7J", ALC660_FIXUP_ASUS_W7J),
11291	SND_PCI_QUIRK(0x1043, 0x1263, "ASUS Z35HL", ALC660_FIXUP_ASUS_W7J),
11292	SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP),
11293	SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", ALC861_FIXUP_AMP_VREF_0F),
11294	SND_PCI_QUIRK(0x1462, 0x7254, "HP DX2200", ALC861_FIXUP_NO_JACK_DETECT),
11295	SND_PCI_QUIRK_VENDOR(0x1584, "Haier/Uniwill", ALC861_FIXUP_AMP_VREF_0F),
11296	SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", ALC861_FIXUP_FSC_AMILO_PI1505),
11297	{}
11298};
11299
11300/*
11301 */
11302static int patch_alc861(struct hda_codec *codec)
11303{
11304	struct alc_spec *spec;
11305	int err;
11306
11307	err = alc_alloc_spec(codec, 0x15);
11308	if (err < 0)
11309		return err;
11310
11311	spec = codec->spec;
11312	if (has_cdefine_beep(codec))
11313		spec->gen.beep_nid = 0x23;
11314
11315#ifdef CONFIG_PM
11316	spec->power_hook = alc_power_eapd;
11317#endif
11318
11319	alc_pre_init(codec);
11320
11321	snd_hda_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);
11322	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
11323
11324	/* automatic parse from the BIOS config */
11325	err = alc861_parse_auto_config(codec);
11326	if (err < 0)
11327		goto error;
11328
11329	if (!spec->gen.no_analog) {
11330		err = set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
11331		if (err < 0)
11332			goto error;
11333	}
11334
11335	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
11336
11337	return 0;
11338
11339 error:
11340	alc_free(codec);
11341	return err;
11342}
11343
11344/*
11345 * ALC861-VD support
11346 *
11347 * Based on ALC882
11348 *
11349 * In addition, an independent DAC
11350 */
11351static int alc861vd_parse_auto_config(struct hda_codec *codec)
11352{
11353	static const hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
11354	static const hda_nid_t alc861vd_ssids[] = { 0x15, 0x1b, 0x14, 0 };
11355	return alc_parse_auto_config(codec, alc861vd_ignore, alc861vd_ssids);
11356}
11357
11358enum {
11359	ALC660VD_FIX_ASUS_GPIO1,
11360	ALC861VD_FIX_DALLAS,
11361};
11362
11363/* exclude VREF80 */
11364static void alc861vd_fixup_dallas(struct hda_codec *codec,
11365				  const struct hda_fixup *fix, int action)
11366{
11367	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
11368		snd_hda_override_pin_caps(codec, 0x18, 0x00000734);
11369		snd_hda_override_pin_caps(codec, 0x19, 0x0000073c);
11370	}
11371}
11372
11373/* reset GPIO1 */
11374static void alc660vd_fixup_asus_gpio1(struct hda_codec *codec,
11375				      const struct hda_fixup *fix, int action)
11376{
11377	struct alc_spec *spec = codec->spec;
11378
11379	if (action == HDA_FIXUP_ACT_PRE_PROBE)
11380		spec->gpio_mask |= 0x02;
11381	alc_fixup_gpio(codec, action, 0x01);
11382}
11383
11384static const struct hda_fixup alc861vd_fixups[] = {
11385	[ALC660VD_FIX_ASUS_GPIO1] = {
11386		.type = HDA_FIXUP_FUNC,
11387		.v.func = alc660vd_fixup_asus_gpio1,
11388	},
11389	[ALC861VD_FIX_DALLAS] = {
11390		.type = HDA_FIXUP_FUNC,
11391		.v.func = alc861vd_fixup_dallas,
11392	},
11393};
11394
11395static const struct snd_pci_quirk alc861vd_fixup_tbl[] = {
11396	SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_FIX_DALLAS),
11397	SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
11398	SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_FIX_DALLAS),
11399	{}
11400};
11401
11402/*
11403 */
11404static int patch_alc861vd(struct hda_codec *codec)
11405{
11406	struct alc_spec *spec;
11407	int err;
11408
11409	err = alc_alloc_spec(codec, 0x0b);
11410	if (err < 0)
11411		return err;
11412
11413	spec = codec->spec;
11414	if (has_cdefine_beep(codec))
11415		spec->gen.beep_nid = 0x23;
11416
11417	spec->shutup = alc_eapd_shutup;
11418
11419	alc_pre_init(codec);
11420
11421	snd_hda_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);
11422	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
11423
11424	/* automatic parse from the BIOS config */
11425	err = alc861vd_parse_auto_config(codec);
11426	if (err < 0)
11427		goto error;
11428
11429	if (!spec->gen.no_analog) {
11430		err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
11431		if (err < 0)
11432			goto error;
11433	}
11434
11435	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
11436
11437	return 0;
11438
11439 error:
11440	alc_free(codec);
11441	return err;
11442}
11443
11444/*
11445 * ALC662 support
11446 *
11447 * ALC662 is almost identical with ALC880 but has cleaner and more flexible
11448 * configuration.  Each pin widget can choose any input DACs and a mixer.
11449 * Each ADC is connected from a mixer of all inputs.  This makes possible
11450 * 6-channel independent captures.
11451 *
11452 * In addition, an independent DAC for the multi-playback (not used in this
11453 * driver yet).
11454 */
11455
11456/*
11457 * BIOS auto configuration
11458 */
11459
11460static int alc662_parse_auto_config(struct hda_codec *codec)
11461{
11462	static const hda_nid_t alc662_ignore[] = { 0x1d, 0 };
11463	static const hda_nid_t alc663_ssids[] = { 0x15, 0x1b, 0x14, 0x21 };
11464	static const hda_nid_t alc662_ssids[] = { 0x15, 0x1b, 0x14, 0 };
11465	const hda_nid_t *ssids;
11466
11467	if (codec->core.vendor_id == 0x10ec0272 || codec->core.vendor_id == 0x10ec0663 ||
11468	    codec->core.vendor_id == 0x10ec0665 || codec->core.vendor_id == 0x10ec0670 ||
11469	    codec->core.vendor_id == 0x10ec0671)
11470		ssids = alc663_ssids;
11471	else
11472		ssids = alc662_ssids;
11473	return alc_parse_auto_config(codec, alc662_ignore, ssids);
11474}
11475
11476static void alc272_fixup_mario(struct hda_codec *codec,
11477			       const struct hda_fixup *fix, int action)
11478{
11479	if (action != HDA_FIXUP_ACT_PRE_PROBE)
11480		return;
11481	if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
11482				      (0x3b << AC_AMPCAP_OFFSET_SHIFT) |
11483				      (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |
11484				      (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |
11485				      (0 << AC_AMPCAP_MUTE_SHIFT)))
11486		codec_warn(codec, "failed to override amp caps for NID 0x2\n");
11487}
11488
11489static const struct snd_pcm_chmap_elem asus_pcm_2_1_chmaps[] = {
11490	{ .channels = 2,
11491	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
11492	{ .channels = 4,
11493	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
11494		   SNDRV_CHMAP_NA, SNDRV_CHMAP_LFE } }, /* LFE only on right */
11495	{ }
11496};
11497
11498/* override the 2.1 chmap */
11499static void alc_fixup_bass_chmap(struct hda_codec *codec,
11500				    const struct hda_fixup *fix, int action)
11501{
11502	if (action == HDA_FIXUP_ACT_BUILD) {
11503		struct alc_spec *spec = codec->spec;
11504		spec->gen.pcm_rec[0]->stream[0].chmap = asus_pcm_2_1_chmaps;
11505	}
11506}
11507
11508/* avoid D3 for keeping GPIO up */
11509static unsigned int gpio_led_power_filter(struct hda_codec *codec,
11510					  hda_nid_t nid,
11511					  unsigned int power_state)
11512{
11513	struct alc_spec *spec = codec->spec;
11514	if (nid == codec->core.afg && power_state == AC_PWRST_D3 && spec->gpio_data)
11515		return AC_PWRST_D0;
11516	return power_state;
11517}
11518
11519static void alc662_fixup_led_gpio1(struct hda_codec *codec,
11520				   const struct hda_fixup *fix, int action)
11521{
11522	struct alc_spec *spec = codec->spec;
11523
11524	alc_fixup_hp_gpio_led(codec, action, 0x01, 0);
11525	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
11526		spec->mute_led_polarity = 1;
11527		codec->power_filter = gpio_led_power_filter;
11528	}
11529}
11530
11531static void alc662_usi_automute_hook(struct hda_codec *codec,
11532					 struct hda_jack_callback *jack)
11533{
11534	struct alc_spec *spec = codec->spec;
11535	int vref;
11536	msleep(200);
11537	snd_hda_gen_hp_automute(codec, jack);
11538
11539	vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
11540	msleep(100);
11541	snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
11542			    vref);
11543}
11544
11545static void alc662_fixup_usi_headset_mic(struct hda_codec *codec,
11546				     const struct hda_fixup *fix, int action)
11547{
11548	struct alc_spec *spec = codec->spec;
11549	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
11550		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
11551		spec->gen.hp_automute_hook = alc662_usi_automute_hook;
11552	}
11553}
11554
11555static void alc662_aspire_ethos_mute_speakers(struct hda_codec *codec,
11556					struct hda_jack_callback *cb)
11557{
11558	/* surround speakers at 0x1b already get muted automatically when
11559	 * headphones are plugged in, but we have to mute/unmute the remaining
11560	 * channels manually:
11561	 * 0x15 - front left/front right
11562	 * 0x18 - front center/ LFE
11563	 */
11564	if (snd_hda_jack_detect_state(codec, 0x1b) == HDA_JACK_PRESENT) {
11565		snd_hda_set_pin_ctl_cache(codec, 0x15, 0);
11566		snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
11567	} else {
11568		snd_hda_set_pin_ctl_cache(codec, 0x15, PIN_OUT);
11569		snd_hda_set_pin_ctl_cache(codec, 0x18, PIN_OUT);
11570	}
11571}
11572
11573static void alc662_fixup_aspire_ethos_hp(struct hda_codec *codec,
11574					const struct hda_fixup *fix, int action)
11575{
11576    /* Pin 0x1b: shared headphones jack and surround speakers */
11577	if (!is_jack_detectable(codec, 0x1b))
11578		return;
11579
11580	switch (action) {
11581	case HDA_FIXUP_ACT_PRE_PROBE:
11582		snd_hda_jack_detect_enable_callback(codec, 0x1b,
11583				alc662_aspire_ethos_mute_speakers);
11584		/* subwoofer needs an extra GPIO setting to become audible */
11585		alc_setup_gpio(codec, 0x02);
11586		break;
11587	case HDA_FIXUP_ACT_INIT:
11588		/* Make sure to start in a correct state, i.e. if
11589		 * headphones have been plugged in before powering up the system
11590		 */
11591		alc662_aspire_ethos_mute_speakers(codec, NULL);
11592		break;
11593	}
11594}
11595
11596static void alc671_fixup_hp_headset_mic2(struct hda_codec *codec,
11597					     const struct hda_fixup *fix, int action)
11598{
11599	struct alc_spec *spec = codec->spec;
11600
11601	static const struct hda_pintbl pincfgs[] = {
11602		{ 0x19, 0x02a11040 }, /* use as headset mic, with its own jack detect */
11603		{ 0x1b, 0x0181304f },
11604		{ }
11605	};
11606
11607	switch (action) {
11608	case HDA_FIXUP_ACT_PRE_PROBE:
11609		spec->gen.mixer_nid = 0;
11610		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
11611		snd_hda_apply_pincfgs(codec, pincfgs);
11612		break;
11613	case HDA_FIXUP_ACT_INIT:
11614		alc_write_coef_idx(codec, 0x19, 0xa054);
11615		break;
11616	}
11617}
11618
11619static void alc897_hp_automute_hook(struct hda_codec *codec,
11620					 struct hda_jack_callback *jack)
11621{
11622	struct alc_spec *spec = codec->spec;
11623	int vref;
11624
11625	snd_hda_gen_hp_automute(codec, jack);
11626	vref = spec->gen.hp_jack_present ? (PIN_HP | AC_PINCTL_VREF_100) : PIN_HP;
11627	snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
11628			    vref);
11629}
11630
11631static void alc897_fixup_lenovo_headset_mic(struct hda_codec *codec,
11632				     const struct hda_fixup *fix, int action)
11633{
11634	struct alc_spec *spec = codec->spec;
11635	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
11636		spec->gen.hp_automute_hook = alc897_hp_automute_hook;
11637	}
11638}
11639
11640static void alc897_fixup_lenovo_headset_mode(struct hda_codec *codec,
11641				     const struct hda_fixup *fix, int action)
11642{
11643	struct alc_spec *spec = codec->spec;
11644
11645	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
11646		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
11647		spec->gen.hp_automute_hook = alc897_hp_automute_hook;
11648	}
11649}
11650
11651static const struct coef_fw alc668_coefs[] = {
11652	WRITE_COEF(0x01, 0xbebe), WRITE_COEF(0x02, 0xaaaa), WRITE_COEF(0x03,    0x0),
11653	WRITE_COEF(0x04, 0x0180), WRITE_COEF(0x06,    0x0), WRITE_COEF(0x07, 0x0f80),
11654	WRITE_COEF(0x08, 0x0031), WRITE_COEF(0x0a, 0x0060), WRITE_COEF(0x0b,    0x0),
11655	WRITE_COEF(0x0c, 0x7cf7), WRITE_COEF(0x0d, 0x1080), WRITE_COEF(0x0e, 0x7f7f),
11656	WRITE_COEF(0x0f, 0xcccc), WRITE_COEF(0x10, 0xddcc), WRITE_COEF(0x11, 0x0001),
11657	WRITE_COEF(0x13,    0x0), WRITE_COEF(0x14, 0x2aa0), WRITE_COEF(0x17, 0xa940),
11658	WRITE_COEF(0x19,    0x0), WRITE_COEF(0x1a,    0x0), WRITE_COEF(0x1b,    0x0),
11659	WRITE_COEF(0x1c,    0x0), WRITE_COEF(0x1d,    0x0), WRITE_COEF(0x1e, 0x7418),
11660	WRITE_COEF(0x1f, 0x0804), WRITE_COEF(0x20, 0x4200), WRITE_COEF(0x21, 0x0468),
11661	WRITE_COEF(0x22, 0x8ccc), WRITE_COEF(0x23, 0x0250), WRITE_COEF(0x24, 0x7418),
11662	WRITE_COEF(0x27,    0x0), WRITE_COEF(0x28, 0x8ccc), WRITE_COEF(0x2a, 0xff00),
11663	WRITE_COEF(0x2b, 0x8000), WRITE_COEF(0xa7, 0xff00), WRITE_COEF(0xa8, 0x8000),
11664	WRITE_COEF(0xaa, 0x2e17), WRITE_COEF(0xab, 0xa0c0), WRITE_COEF(0xac,    0x0),
11665	WRITE_COEF(0xad,    0x0), WRITE_COEF(0xae, 0x2ac6), WRITE_COEF(0xaf, 0xa480),
11666	WRITE_COEF(0xb0,    0x0), WRITE_COEF(0xb1,    0x0), WRITE_COEF(0xb2,    0x0),
11667	WRITE_COEF(0xb3,    0x0), WRITE_COEF(0xb4,    0x0), WRITE_COEF(0xb5, 0x1040),
11668	WRITE_COEF(0xb6, 0xd697), WRITE_COEF(0xb7, 0x902b), WRITE_COEF(0xb8, 0xd697),
11669	WRITE_COEF(0xb9, 0x902b), WRITE_COEF(0xba, 0xb8ba), WRITE_COEF(0xbb, 0xaaab),
11670	WRITE_COEF(0xbc, 0xaaaf), WRITE_COEF(0xbd, 0x6aaa), WRITE_COEF(0xbe, 0x1c02),
11671	WRITE_COEF(0xc0, 0x00ff), WRITE_COEF(0xc1, 0x0fa6),
11672	{}
11673};
11674
11675static void alc668_restore_default_value(struct hda_codec *codec)
11676{
11677	alc_process_coef_fw(codec, alc668_coefs);
11678}
11679
11680enum {
11681	ALC662_FIXUP_ASPIRE,
11682	ALC662_FIXUP_LED_GPIO1,
11683	ALC662_FIXUP_IDEAPAD,
11684	ALC272_FIXUP_MARIO,
11685	ALC662_FIXUP_CZC_ET26,
11686	ALC662_FIXUP_CZC_P10T,
11687	ALC662_FIXUP_SKU_IGNORE,
11688	ALC662_FIXUP_HP_RP5800,
11689	ALC662_FIXUP_ASUS_MODE1,
11690	ALC662_FIXUP_ASUS_MODE2,
11691	ALC662_FIXUP_ASUS_MODE3,
11692	ALC662_FIXUP_ASUS_MODE4,
11693	ALC662_FIXUP_ASUS_MODE5,
11694	ALC662_FIXUP_ASUS_MODE6,
11695	ALC662_FIXUP_ASUS_MODE7,
11696	ALC662_FIXUP_ASUS_MODE8,
11697	ALC662_FIXUP_NO_JACK_DETECT,
11698	ALC662_FIXUP_ZOTAC_Z68,
11699	ALC662_FIXUP_INV_DMIC,
11700	ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
11701	ALC668_FIXUP_DELL_MIC_NO_PRESENCE,
11702	ALC662_FIXUP_HEADSET_MODE,
11703	ALC668_FIXUP_HEADSET_MODE,
11704	ALC662_FIXUP_BASS_MODE4_CHMAP,
11705	ALC662_FIXUP_BASS_16,
11706	ALC662_FIXUP_BASS_1A,
11707	ALC662_FIXUP_BASS_CHMAP,
11708	ALC668_FIXUP_AUTO_MUTE,
11709	ALC668_FIXUP_DELL_DISABLE_AAMIX,
11710	ALC668_FIXUP_DELL_XPS13,
11711	ALC662_FIXUP_ASUS_Nx50,
11712	ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
11713	ALC668_FIXUP_ASUS_Nx51,
11714	ALC668_FIXUP_MIC_COEF,
11715	ALC668_FIXUP_ASUS_G751,
11716	ALC891_FIXUP_HEADSET_MODE,
11717	ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
11718	ALC662_FIXUP_ACER_VERITON,
11719	ALC892_FIXUP_ASROCK_MOBO,
11720	ALC662_FIXUP_USI_FUNC,
11721	ALC662_FIXUP_USI_HEADSET_MODE,
11722	ALC662_FIXUP_LENOVO_MULTI_CODECS,
11723	ALC669_FIXUP_ACER_ASPIRE_ETHOS,
11724	ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET,
11725	ALC671_FIXUP_HP_HEADSET_MIC2,
11726	ALC662_FIXUP_ACER_X2660G_HEADSET_MODE,
11727	ALC662_FIXUP_ACER_NITRO_HEADSET_MODE,
11728	ALC668_FIXUP_ASUS_NO_HEADSET_MIC,
11729	ALC668_FIXUP_HEADSET_MIC,
11730	ALC668_FIXUP_MIC_DET_COEF,
11731	ALC897_FIXUP_LENOVO_HEADSET_MIC,
11732	ALC897_FIXUP_HEADSET_MIC_PIN,
11733	ALC897_FIXUP_HP_HSMIC_VERB,
11734	ALC897_FIXUP_LENOVO_HEADSET_MODE,
11735	ALC897_FIXUP_HEADSET_MIC_PIN2,
11736	ALC897_FIXUP_UNIS_H3C_X500S,
11737};
11738
11739static const struct hda_fixup alc662_fixups[] = {
11740	[ALC662_FIXUP_ASPIRE] = {
11741		.type = HDA_FIXUP_PINS,
11742		.v.pins = (const struct hda_pintbl[]) {
11743			{ 0x15, 0x99130112 }, /* subwoofer */
11744			{ }
11745		}
11746	},
11747	[ALC662_FIXUP_LED_GPIO1] = {
11748		.type = HDA_FIXUP_FUNC,
11749		.v.func = alc662_fixup_led_gpio1,
11750	},
11751	[ALC662_FIXUP_IDEAPAD] = {
11752		.type = HDA_FIXUP_PINS,
11753		.v.pins = (const struct hda_pintbl[]) {
11754			{ 0x17, 0x99130112 }, /* subwoofer */
11755			{ }
11756		},
11757		.chained = true,
11758		.chain_id = ALC662_FIXUP_LED_GPIO1,
11759	},
11760	[ALC272_FIXUP_MARIO] = {
11761		.type = HDA_FIXUP_FUNC,
11762		.v.func = alc272_fixup_mario,
11763	},
11764	[ALC662_FIXUP_CZC_ET26] = {
11765		.type = HDA_FIXUP_PINS,
11766		.v.pins = (const struct hda_pintbl[]) {
11767			{0x12, 0x403cc000},
11768			{0x14, 0x90170110}, /* speaker */
11769			{0x15, 0x411111f0},
11770			{0x16, 0x411111f0},
11771			{0x18, 0x01a19030}, /* mic */
11772			{0x19, 0x90a7013f}, /* int-mic */
11773			{0x1a, 0x01014020},
11774			{0x1b, 0x0121401f},
11775			{0x1c, 0x411111f0},
11776			{0x1d, 0x411111f0},
11777			{0x1e, 0x40478e35},
11778			{}
11779		},
11780		.chained = true,
11781		.chain_id = ALC662_FIXUP_SKU_IGNORE
11782	},
11783	[ALC662_FIXUP_CZC_P10T] = {
11784		.type = HDA_FIXUP_VERBS,
11785		.v.verbs = (const struct hda_verb[]) {
11786			{0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
11787			{}
11788		}
11789	},
11790	[ALC662_FIXUP_SKU_IGNORE] = {
11791		.type = HDA_FIXUP_FUNC,
11792		.v.func = alc_fixup_sku_ignore,
11793	},
11794	[ALC662_FIXUP_HP_RP5800] = {
11795		.type = HDA_FIXUP_PINS,
11796		.v.pins = (const struct hda_pintbl[]) {
11797			{ 0x14, 0x0221201f }, /* HP out */
11798			{ }
11799		},
11800		.chained = true,
11801		.chain_id = ALC662_FIXUP_SKU_IGNORE
11802	},
11803	[ALC662_FIXUP_ASUS_MODE1] = {
11804		.type = HDA_FIXUP_PINS,
11805		.v.pins = (const struct hda_pintbl[]) {
11806			{ 0x14, 0x99130110 }, /* speaker */
11807			{ 0x18, 0x01a19c20 }, /* mic */
11808			{ 0x19, 0x99a3092f }, /* int-mic */
11809			{ 0x21, 0x0121401f }, /* HP out */
11810			{ }
11811		},
11812		.chained = true,
11813		.chain_id = ALC662_FIXUP_SKU_IGNORE
11814	},
11815	[ALC662_FIXUP_ASUS_MODE2] = {
11816		.type = HDA_FIXUP_PINS,
11817		.v.pins = (const struct hda_pintbl[]) {
11818			{ 0x14, 0x99130110 }, /* speaker */
11819			{ 0x18, 0x01a19820 }, /* mic */
11820			{ 0x19, 0x99a3092f }, /* int-mic */
11821			{ 0x1b, 0x0121401f }, /* HP out */
11822			{ }
11823		},
11824		.chained = true,
11825		.chain_id = ALC662_FIXUP_SKU_IGNORE
11826	},
11827	[ALC662_FIXUP_ASUS_MODE3] = {
11828		.type = HDA_FIXUP_PINS,
11829		.v.pins = (const struct hda_pintbl[]) {
11830			{ 0x14, 0x99130110 }, /* speaker */
11831			{ 0x15, 0x0121441f }, /* HP */
11832			{ 0x18, 0x01a19840 }, /* mic */
11833			{ 0x19, 0x99a3094f }, /* int-mic */
11834			{ 0x21, 0x01211420 }, /* HP2 */
11835			{ }
11836		},
11837		.chained = true,
11838		.chain_id = ALC662_FIXUP_SKU_IGNORE
11839	},
11840	[ALC662_FIXUP_ASUS_MODE4] = {
11841		.type = HDA_FIXUP_PINS,
11842		.v.pins = (const struct hda_pintbl[]) {
11843			{ 0x14, 0x99130110 }, /* speaker */
11844			{ 0x16, 0x99130111 }, /* speaker */
11845			{ 0x18, 0x01a19840 }, /* mic */
11846			{ 0x19, 0x99a3094f }, /* int-mic */
11847			{ 0x21, 0x0121441f }, /* HP */
11848			{ }
11849		},
11850		.chained = true,
11851		.chain_id = ALC662_FIXUP_SKU_IGNORE
11852	},
11853	[ALC662_FIXUP_ASUS_MODE5] = {
11854		.type = HDA_FIXUP_PINS,
11855		.v.pins = (const struct hda_pintbl[]) {
11856			{ 0x14, 0x99130110 }, /* speaker */
11857			{ 0x15, 0x0121441f }, /* HP */
11858			{ 0x16, 0x99130111 }, /* speaker */
11859			{ 0x18, 0x01a19840 }, /* mic */
11860			{ 0x19, 0x99a3094f }, /* int-mic */
11861			{ }
11862		},
11863		.chained = true,
11864		.chain_id = ALC662_FIXUP_SKU_IGNORE
11865	},
11866	[ALC662_FIXUP_ASUS_MODE6] = {
11867		.type = HDA_FIXUP_PINS,
11868		.v.pins = (const struct hda_pintbl[]) {
11869			{ 0x14, 0x99130110 }, /* speaker */
11870			{ 0x15, 0x01211420 }, /* HP2 */
11871			{ 0x18, 0x01a19840 }, /* mic */
11872			{ 0x19, 0x99a3094f }, /* int-mic */
11873			{ 0x1b, 0x0121441f }, /* HP */
11874			{ }
11875		},
11876		.chained = true,
11877		.chain_id = ALC662_FIXUP_SKU_IGNORE
11878	},
11879	[ALC662_FIXUP_ASUS_MODE7] = {
11880		.type = HDA_FIXUP_PINS,
11881		.v.pins = (const struct hda_pintbl[]) {
11882			{ 0x14, 0x99130110 }, /* speaker */
11883			{ 0x17, 0x99130111 }, /* speaker */
11884			{ 0x18, 0x01a19840 }, /* mic */
11885			{ 0x19, 0x99a3094f }, /* int-mic */
11886			{ 0x1b, 0x01214020 }, /* HP */
11887			{ 0x21, 0x0121401f }, /* HP */
11888			{ }
11889		},
11890		.chained = true,
11891		.chain_id = ALC662_FIXUP_SKU_IGNORE
11892	},
11893	[ALC662_FIXUP_ASUS_MODE8] = {
11894		.type = HDA_FIXUP_PINS,
11895		.v.pins = (const struct hda_pintbl[]) {
11896			{ 0x14, 0x99130110 }, /* speaker */
11897			{ 0x12, 0x99a30970 }, /* int-mic */
11898			{ 0x15, 0x01214020 }, /* HP */
11899			{ 0x17, 0x99130111 }, /* speaker */
11900			{ 0x18, 0x01a19840 }, /* mic */
11901			{ 0x21, 0x0121401f }, /* HP */
11902			{ }
11903		},
11904		.chained = true,
11905		.chain_id = ALC662_FIXUP_SKU_IGNORE
11906	},
11907	[ALC662_FIXUP_NO_JACK_DETECT] = {
11908		.type = HDA_FIXUP_FUNC,
11909		.v.func = alc_fixup_no_jack_detect,
11910	},
11911	[ALC662_FIXUP_ZOTAC_Z68] = {
11912		.type = HDA_FIXUP_PINS,
11913		.v.pins = (const struct hda_pintbl[]) {
11914			{ 0x1b, 0x02214020 }, /* Front HP */
11915			{ }
11916		}
11917	},
11918	[ALC662_FIXUP_INV_DMIC] = {
11919		.type = HDA_FIXUP_FUNC,
11920		.v.func = alc_fixup_inv_dmic,
11921	},
11922	[ALC668_FIXUP_DELL_XPS13] = {
11923		.type = HDA_FIXUP_FUNC,
11924		.v.func = alc_fixup_dell_xps13,
11925		.chained = true,
11926		.chain_id = ALC668_FIXUP_DELL_DISABLE_AAMIX
11927	},
11928	[ALC668_FIXUP_DELL_DISABLE_AAMIX] = {
11929		.type = HDA_FIXUP_FUNC,
11930		.v.func = alc_fixup_disable_aamix,
11931		.chained = true,
11932		.chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
11933	},
11934	[ALC668_FIXUP_AUTO_MUTE] = {
11935		.type = HDA_FIXUP_FUNC,
11936		.v.func = alc_fixup_auto_mute_via_amp,
11937		.chained = true,
11938		.chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
11939	},
11940	[ALC662_FIXUP_DELL_MIC_NO_PRESENCE] = {
11941		.type = HDA_FIXUP_PINS,
11942		.v.pins = (const struct hda_pintbl[]) {
11943			{ 0x19, 0x03a1113c }, /* use as headset mic, without its own jack detect */
11944			/* headphone mic by setting pin control of 0x1b (headphone out) to in + vref_50 */
11945			{ }
11946		},
11947		.chained = true,
11948		.chain_id = ALC662_FIXUP_HEADSET_MODE
11949	},
11950	[ALC662_FIXUP_HEADSET_MODE] = {
11951		.type = HDA_FIXUP_FUNC,
11952		.v.func = alc_fixup_headset_mode_alc662,
11953	},
11954	[ALC668_FIXUP_DELL_MIC_NO_PRESENCE] = {
11955		.type = HDA_FIXUP_PINS,
11956		.v.pins = (const struct hda_pintbl[]) {
11957			{ 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
11958			{ 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
11959			{ }
11960		},
11961		.chained = true,
11962		.chain_id = ALC668_FIXUP_HEADSET_MODE
11963	},
11964	[ALC668_FIXUP_HEADSET_MODE] = {
11965		.type = HDA_FIXUP_FUNC,
11966		.v.func = alc_fixup_headset_mode_alc668,
11967	},
11968	[ALC662_FIXUP_BASS_MODE4_CHMAP] = {
11969		.type = HDA_FIXUP_FUNC,
11970		.v.func = alc_fixup_bass_chmap,
11971		.chained = true,
11972		.chain_id = ALC662_FIXUP_ASUS_MODE4
11973	},
11974	[ALC662_FIXUP_BASS_16] = {
11975		.type = HDA_FIXUP_PINS,
11976		.v.pins = (const struct hda_pintbl[]) {
11977			{0x16, 0x80106111}, /* bass speaker */
11978			{}
11979		},
11980		.chained = true,
11981		.chain_id = ALC662_FIXUP_BASS_CHMAP,
11982	},
11983	[ALC662_FIXUP_BASS_1A] = {
11984		.type = HDA_FIXUP_PINS,
11985		.v.pins = (const struct hda_pintbl[]) {
11986			{0x1a, 0x80106111}, /* bass speaker */
11987			{}
11988		},
11989		.chained = true,
11990		.chain_id = ALC662_FIXUP_BASS_CHMAP,
11991	},
11992	[ALC662_FIXUP_BASS_CHMAP] = {
11993		.type = HDA_FIXUP_FUNC,
11994		.v.func = alc_fixup_bass_chmap,
11995	},
11996	[ALC662_FIXUP_ASUS_Nx50] = {
11997		.type = HDA_FIXUP_FUNC,
11998		.v.func = alc_fixup_auto_mute_via_amp,
11999		.chained = true,
12000		.chain_id = ALC662_FIXUP_BASS_1A
12001	},
12002	[ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE] = {
12003		.type = HDA_FIXUP_FUNC,
12004		.v.func = alc_fixup_headset_mode_alc668,
12005		.chain_id = ALC662_FIXUP_BASS_CHMAP
12006	},
12007	[ALC668_FIXUP_ASUS_Nx51] = {
12008		.type = HDA_FIXUP_PINS,
12009		.v.pins = (const struct hda_pintbl[]) {
12010			{ 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
12011			{ 0x1a, 0x90170151 }, /* bass speaker */
12012			{ 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
12013			{}
12014		},
12015		.chained = true,
12016		.chain_id = ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
12017	},
12018	[ALC668_FIXUP_MIC_COEF] = {
12019		.type = HDA_FIXUP_VERBS,
12020		.v.verbs = (const struct hda_verb[]) {
12021			{ 0x20, AC_VERB_SET_COEF_INDEX, 0xc3 },
12022			{ 0x20, AC_VERB_SET_PROC_COEF, 0x4000 },
12023			{}
12024		},
12025	},
12026	[ALC668_FIXUP_ASUS_G751] = {
12027		.type = HDA_FIXUP_PINS,
12028		.v.pins = (const struct hda_pintbl[]) {
12029			{ 0x16, 0x0421101f }, /* HP */
12030			{}
12031		},
12032		.chained = true,
12033		.chain_id = ALC668_FIXUP_MIC_COEF
12034	},
12035	[ALC891_FIXUP_HEADSET_MODE] = {
12036		.type = HDA_FIXUP_FUNC,
12037		.v.func = alc_fixup_headset_mode,
12038	},
12039	[ALC891_FIXUP_DELL_MIC_NO_PRESENCE] = {
12040		.type = HDA_FIXUP_PINS,
12041		.v.pins = (const struct hda_pintbl[]) {
12042			{ 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
12043			{ 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
12044			{ }
12045		},
12046		.chained = true,
12047		.chain_id = ALC891_FIXUP_HEADSET_MODE
12048	},
12049	[ALC662_FIXUP_ACER_VERITON] = {
12050		.type = HDA_FIXUP_PINS,
12051		.v.pins = (const struct hda_pintbl[]) {
12052			{ 0x15, 0x50170120 }, /* no internal speaker */
12053			{ }
12054		}
12055	},
12056	[ALC892_FIXUP_ASROCK_MOBO] = {
12057		.type = HDA_FIXUP_PINS,
12058		.v.pins = (const struct hda_pintbl[]) {
12059			{ 0x15, 0x40f000f0 }, /* disabled */
12060			{ 0x16, 0x40f000f0 }, /* disabled */
12061			{ }
12062		}
12063	},
12064	[ALC662_FIXUP_USI_FUNC] = {
12065		.type = HDA_FIXUP_FUNC,
12066		.v.func = alc662_fixup_usi_headset_mic,
12067	},
12068	[ALC662_FIXUP_USI_HEADSET_MODE] = {
12069		.type = HDA_FIXUP_PINS,
12070		.v.pins = (const struct hda_pintbl[]) {
12071			{ 0x19, 0x02a1913c }, /* use as headset mic, without its own jack detect */
12072			{ 0x18, 0x01a1903d },
12073			{ }
12074		},
12075		.chained = true,
12076		.chain_id = ALC662_FIXUP_USI_FUNC
12077	},
12078	[ALC662_FIXUP_LENOVO_MULTI_CODECS] = {
12079		.type = HDA_FIXUP_FUNC,
12080		.v.func = alc233_alc662_fixup_lenovo_dual_codecs,
12081	},
12082	[ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET] = {
12083		.type = HDA_FIXUP_FUNC,
12084		.v.func = alc662_fixup_aspire_ethos_hp,
12085	},
12086	[ALC669_FIXUP_ACER_ASPIRE_ETHOS] = {
12087		.type = HDA_FIXUP_PINS,
12088		.v.pins = (const struct hda_pintbl[]) {
12089			{ 0x15, 0x92130110 }, /* front speakers */
12090			{ 0x18, 0x99130111 }, /* center/subwoofer */
12091			{ 0x1b, 0x11130012 }, /* surround plus jack for HP */
12092			{ }
12093		},
12094		.chained = true,
12095		.chain_id = ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET
12096	},
12097	[ALC671_FIXUP_HP_HEADSET_MIC2] = {
12098		.type = HDA_FIXUP_FUNC,
12099		.v.func = alc671_fixup_hp_headset_mic2,
12100	},
12101	[ALC662_FIXUP_ACER_X2660G_HEADSET_MODE] = {
12102		.type = HDA_FIXUP_PINS,
12103		.v.pins = (const struct hda_pintbl[]) {
12104			{ 0x1a, 0x02a1113c }, /* use as headset mic, without its own jack detect */
12105			{ }
12106		},
12107		.chained = true,
12108		.chain_id = ALC662_FIXUP_USI_FUNC
12109	},
12110	[ALC662_FIXUP_ACER_NITRO_HEADSET_MODE] = {
12111		.type = HDA_FIXUP_PINS,
12112		.v.pins = (const struct hda_pintbl[]) {
12113			{ 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */
12114			{ 0x1b, 0x0221144f },
12115			{ }
12116		},
12117		.chained = true,
12118		.chain_id = ALC662_FIXUP_USI_FUNC
12119	},
12120	[ALC668_FIXUP_ASUS_NO_HEADSET_MIC] = {
12121		.type = HDA_FIXUP_PINS,
12122		.v.pins = (const struct hda_pintbl[]) {
12123			{ 0x1b, 0x04a1112c },
12124			{ }
12125		},
12126		.chained = true,
12127		.chain_id = ALC668_FIXUP_HEADSET_MIC
12128	},
12129	[ALC668_FIXUP_HEADSET_MIC] = {
12130		.type = HDA_FIXUP_FUNC,
12131		.v.func = alc269_fixup_headset_mic,
12132		.chained = true,
12133		.chain_id = ALC668_FIXUP_MIC_DET_COEF
12134	},
12135	[ALC668_FIXUP_MIC_DET_COEF] = {
12136		.type = HDA_FIXUP_VERBS,
12137		.v.verbs = (const struct hda_verb[]) {
12138			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x15 },
12139			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0d60 },
12140			{}
12141		},
12142	},
12143	[ALC897_FIXUP_LENOVO_HEADSET_MIC] = {
12144		.type = HDA_FIXUP_FUNC,
12145		.v.func = alc897_fixup_lenovo_headset_mic,
12146	},
12147	[ALC897_FIXUP_HEADSET_MIC_PIN] = {
12148		.type = HDA_FIXUP_PINS,
12149		.v.pins = (const struct hda_pintbl[]) {
12150			{ 0x1a, 0x03a11050 },
12151			{ }
12152		},
12153		.chained = true,
12154		.chain_id = ALC897_FIXUP_LENOVO_HEADSET_MIC
12155	},
12156	[ALC897_FIXUP_HP_HSMIC_VERB] = {
12157		.type = HDA_FIXUP_PINS,
12158		.v.pins = (const struct hda_pintbl[]) {
12159			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
12160			{ }
12161		},
12162	},
12163	[ALC897_FIXUP_LENOVO_HEADSET_MODE] = {
12164		.type = HDA_FIXUP_FUNC,
12165		.v.func = alc897_fixup_lenovo_headset_mode,
12166	},
12167	[ALC897_FIXUP_HEADSET_MIC_PIN2] = {
12168		.type = HDA_FIXUP_PINS,
12169		.v.pins = (const struct hda_pintbl[]) {
12170			{ 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */
12171			{ }
12172		},
12173		.chained = true,
12174		.chain_id = ALC897_FIXUP_LENOVO_HEADSET_MODE
12175	},
12176	[ALC897_FIXUP_UNIS_H3C_X500S] = {
12177		.type = HDA_FIXUP_VERBS,
12178		.v.verbs = (const struct hda_verb[]) {
12179			{ 0x14, AC_VERB_SET_EAPD_BTLENABLE, 0 },
12180			{}
12181		},
12182	},
12183};
12184
12185static const struct snd_pci_quirk alc662_fixup_tbl[] = {
12186	SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2),
12187	SND_PCI_QUIRK(0x1025, 0x022f, "Acer Aspire One", ALC662_FIXUP_INV_DMIC),
12188	SND_PCI_QUIRK(0x1025, 0x0241, "Packard Bell DOTS", ALC662_FIXUP_INV_DMIC),
12189	SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
12190	SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),
12191	SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC),
12192	SND_PCI_QUIRK(0x1025, 0x034a, "Gateway LT27", ALC662_FIXUP_INV_DMIC),
12193	SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
12194	SND_PCI_QUIRK(0x1025, 0x0566, "Acer Aspire Ethos 8951G", ALC669_FIXUP_ACER_ASPIRE_ETHOS),
12195	SND_PCI_QUIRK(0x1025, 0x123c, "Acer Nitro N50-600", ALC662_FIXUP_ACER_NITRO_HEADSET_MODE),
12196	SND_PCI_QUIRK(0x1025, 0x124e, "Acer 2660G", ALC662_FIXUP_ACER_X2660G_HEADSET_MODE),
12197	SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
12198	SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
12199	SND_PCI_QUIRK(0x1028, 0x05fe, "Dell XPS 15", ALC668_FIXUP_DELL_XPS13),
12200	SND_PCI_QUIRK(0x1028, 0x060a, "Dell XPS 13", ALC668_FIXUP_DELL_XPS13),
12201	SND_PCI_QUIRK(0x1028, 0x060d, "Dell M3800", ALC668_FIXUP_DELL_XPS13),
12202	SND_PCI_QUIRK(0x1028, 0x0625, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
12203	SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
12204	SND_PCI_QUIRK(0x1028, 0x0696, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
12205	SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
12206	SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
12207	SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
12208	SND_PCI_QUIRK(0x103c, 0x870c, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
12209	SND_PCI_QUIRK(0x103c, 0x8719, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
12210	SND_PCI_QUIRK(0x103c, 0x872b, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
12211	SND_PCI_QUIRK(0x103c, 0x873e, "HP", ALC671_FIXUP_HP_HEADSET_MIC2),
12212	SND_PCI_QUIRK(0x103c, 0x8768, "HP Slim Desktop S01", ALC671_FIXUP_HP_HEADSET_MIC2),
12213	SND_PCI_QUIRK(0x103c, 0x877e, "HP 288 Pro G6", ALC671_FIXUP_HP_HEADSET_MIC2),
12214	SND_PCI_QUIRK(0x103c, 0x885f, "HP 288 Pro G8", ALC671_FIXUP_HP_HEADSET_MIC2),
12215	SND_PCI_QUIRK(0x1043, 0x1080, "Asus UX501VW", ALC668_FIXUP_HEADSET_MODE),
12216	SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_ASUS_Nx50),
12217	SND_PCI_QUIRK(0x1043, 0x129d, "Asus N750", ALC662_FIXUP_ASUS_Nx50),
12218	SND_PCI_QUIRK(0x1043, 0x12ff, "ASUS G751", ALC668_FIXUP_ASUS_G751),
12219	SND_PCI_QUIRK(0x1043, 0x13df, "Asus N550JX", ALC662_FIXUP_BASS_1A),
12220	SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
12221	SND_PCI_QUIRK(0x1043, 0x15a7, "ASUS UX51VZH", ALC662_FIXUP_BASS_16),
12222	SND_PCI_QUIRK(0x1043, 0x177d, "ASUS N551", ALC668_FIXUP_ASUS_Nx51),
12223	SND_PCI_QUIRK(0x1043, 0x17bd, "ASUS N751", ALC668_FIXUP_ASUS_Nx51),
12224	SND_PCI_QUIRK(0x1043, 0x185d, "ASUS G551JW", ALC668_FIXUP_ASUS_NO_HEADSET_MIC),
12225	SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71SL", ALC662_FIXUP_ASUS_MODE8),
12226	SND_PCI_QUIRK(0x1043, 0x1b73, "ASUS N55SF", ALC662_FIXUP_BASS_16),
12227	SND_PCI_QUIRK(0x1043, 0x1bf3, "ASUS N76VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
12228	SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),
12229	SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
12230	SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
12231	SND_PCI_QUIRK(0x14cd, 0x5003, "USI", ALC662_FIXUP_USI_HEADSET_MODE),
12232	SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC662_FIXUP_LENOVO_MULTI_CODECS),
12233	SND_PCI_QUIRK(0x17aa, 0x1057, "Lenovo P360", ALC897_FIXUP_HEADSET_MIC_PIN),
12234	SND_PCI_QUIRK(0x17aa, 0x1064, "Lenovo P3 Tower", ALC897_FIXUP_HEADSET_MIC_PIN),
12235	SND_PCI_QUIRK(0x17aa, 0x32ca, "Lenovo ThinkCentre M80", ALC897_FIXUP_HEADSET_MIC_PIN),
12236	SND_PCI_QUIRK(0x17aa, 0x32cb, "Lenovo ThinkCentre M70", ALC897_FIXUP_HEADSET_MIC_PIN),
12237	SND_PCI_QUIRK(0x17aa, 0x32cf, "Lenovo ThinkCentre M950", ALC897_FIXUP_HEADSET_MIC_PIN),
12238	SND_PCI_QUIRK(0x17aa, 0x32f7, "Lenovo ThinkCentre M90", ALC897_FIXUP_HEADSET_MIC_PIN),
12239	SND_PCI_QUIRK(0x17aa, 0x3321, "Lenovo ThinkCentre M70 Gen4", ALC897_FIXUP_HEADSET_MIC_PIN),
12240	SND_PCI_QUIRK(0x17aa, 0x331b, "Lenovo ThinkCentre M90 Gen4", ALC897_FIXUP_HEADSET_MIC_PIN),
12241	SND_PCI_QUIRK(0x17aa, 0x3364, "Lenovo ThinkCentre M90 Gen5", ALC897_FIXUP_HEADSET_MIC_PIN),
12242	SND_PCI_QUIRK(0x17aa, 0x3742, "Lenovo TianYi510Pro-14IOB", ALC897_FIXUP_HEADSET_MIC_PIN2),
12243	SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
12244	SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
12245	SND_PCI_QUIRK(0x1849, 0x5892, "ASRock B150M", ALC892_FIXUP_ASROCK_MOBO),
12246	SND_PCI_QUIRK(0x19da, 0xa130, "Zotac Z68", ALC662_FIXUP_ZOTAC_Z68),
12247	SND_PCI_QUIRK(0x1b0a, 0x01b8, "ACER Veriton", ALC662_FIXUP_ACER_VERITON),
12248	SND_PCI_QUIRK(0x1b35, 0x1234, "CZC ET26", ALC662_FIXUP_CZC_ET26),
12249	SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
12250	SND_PCI_QUIRK(0x1c6c, 0x1239, "Compaq N14JP6-V2", ALC897_FIXUP_HP_HSMIC_VERB),
12251
12252#if 0
12253	/* Below is a quirk table taken from the old code.
12254	 * Basically the device should work as is without the fixup table.
12255	 * If BIOS doesn't give a proper info, enable the corresponding
12256	 * fixup entry.
12257	 */
12258	SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1),
12259	SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3),
12260	SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1),
12261	SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC662_FIXUP_ASUS_MODE3),
12262	SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
12263	SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12264	SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
12265	SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC662_FIXUP_ASUS_MODE1),
12266	SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC662_FIXUP_ASUS_MODE1),
12267	SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12268	SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC662_FIXUP_ASUS_MODE7),
12269	SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC662_FIXUP_ASUS_MODE7),
12270	SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC662_FIXUP_ASUS_MODE8),
12271	SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC662_FIXUP_ASUS_MODE3),
12272	SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC662_FIXUP_ASUS_MODE1),
12273	SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12274	SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_FIXUP_ASUS_MODE2),
12275	SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC662_FIXUP_ASUS_MODE1),
12276	SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12277	SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
12278	SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
12279	SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12280	SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC662_FIXUP_ASUS_MODE1),
12281	SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC662_FIXUP_ASUS_MODE3),
12282	SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_FIXUP_ASUS_MODE2),
12283	SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12284	SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC662_FIXUP_ASUS_MODE5),
12285	SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
12286	SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12287	SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC662_FIXUP_ASUS_MODE1),
12288	SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12289	SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12290	SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC662_FIXUP_ASUS_MODE3),
12291	SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC662_FIXUP_ASUS_MODE3),
12292	SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC662_FIXUP_ASUS_MODE1),
12293	SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC662_FIXUP_ASUS_MODE1),
12294	SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC662_FIXUP_ASUS_MODE1),
12295	SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC662_FIXUP_ASUS_MODE1),
12296	SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC662_FIXUP_ASUS_MODE1),
12297	SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12298	SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_FIXUP_ASUS_MODE2),
12299	SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC662_FIXUP_ASUS_MODE1),
12300	SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
12301	SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC662_FIXUP_ASUS_MODE3),
12302	SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC662_FIXUP_ASUS_MODE1),
12303	SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC662_FIXUP_ASUS_MODE1),
12304	SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC662_FIXUP_ASUS_MODE1),
12305	SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_FIXUP_ASUS_MODE2),
12306	SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
12307	SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE4),
12308#endif
12309	{}
12310};
12311
12312static const struct hda_model_fixup alc662_fixup_models[] = {
12313	{.id = ALC662_FIXUP_ASPIRE, .name = "aspire"},
12314	{.id = ALC662_FIXUP_IDEAPAD, .name = "ideapad"},
12315	{.id = ALC272_FIXUP_MARIO, .name = "mario"},
12316	{.id = ALC662_FIXUP_HP_RP5800, .name = "hp-rp5800"},
12317	{.id = ALC662_FIXUP_ASUS_MODE1, .name = "asus-mode1"},
12318	{.id = ALC662_FIXUP_ASUS_MODE2, .name = "asus-mode2"},
12319	{.id = ALC662_FIXUP_ASUS_MODE3, .name = "asus-mode3"},
12320	{.id = ALC662_FIXUP_ASUS_MODE4, .name = "asus-mode4"},
12321	{.id = ALC662_FIXUP_ASUS_MODE5, .name = "asus-mode5"},
12322	{.id = ALC662_FIXUP_ASUS_MODE6, .name = "asus-mode6"},
12323	{.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},
12324	{.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},
12325	{.id = ALC662_FIXUP_ZOTAC_Z68, .name = "zotac-z68"},
12326	{.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"},
12327	{.id = ALC662_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc662-headset-multi"},
12328	{.id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
12329	{.id = ALC662_FIXUP_HEADSET_MODE, .name = "alc662-headset"},
12330	{.id = ALC668_FIXUP_HEADSET_MODE, .name = "alc668-headset"},
12331	{.id = ALC662_FIXUP_BASS_16, .name = "bass16"},
12332	{.id = ALC662_FIXUP_BASS_1A, .name = "bass1a"},
12333	{.id = ALC668_FIXUP_AUTO_MUTE, .name = "automute"},
12334	{.id = ALC668_FIXUP_DELL_XPS13, .name = "dell-xps13"},
12335	{.id = ALC662_FIXUP_ASUS_Nx50, .name = "asus-nx50"},
12336	{.id = ALC668_FIXUP_ASUS_Nx51, .name = "asus-nx51"},
12337	{.id = ALC668_FIXUP_ASUS_G751, .name = "asus-g751"},
12338	{.id = ALC891_FIXUP_HEADSET_MODE, .name = "alc891-headset"},
12339	{.id = ALC891_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc891-headset-multi"},
12340	{.id = ALC662_FIXUP_ACER_VERITON, .name = "acer-veriton"},
12341	{.id = ALC892_FIXUP_ASROCK_MOBO, .name = "asrock-mobo"},
12342	{.id = ALC662_FIXUP_USI_HEADSET_MODE, .name = "usi-headset"},
12343	{.id = ALC662_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
12344	{.id = ALC669_FIXUP_ACER_ASPIRE_ETHOS, .name = "aspire-ethos"},
12345	{.id = ALC897_FIXUP_UNIS_H3C_X500S, .name = "unis-h3c-x500s"},
12346	{}
12347};
12348
12349static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = {
12350	SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
12351		{0x17, 0x02211010},
12352		{0x18, 0x01a19030},
12353		{0x1a, 0x01813040},
12354		{0x21, 0x01014020}),
12355	SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
12356		{0x16, 0x01813030},
12357		{0x17, 0x02211010},
12358		{0x18, 0x01a19040},
12359		{0x21, 0x01014020}),
12360	SND_HDA_PIN_QUIRK(0x10ec0662, 0x1028, "Dell", ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
12361		{0x14, 0x01014010},
12362		{0x18, 0x01a19020},
12363		{0x1a, 0x0181302f},
12364		{0x1b, 0x0221401f}),
12365	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
12366		{0x12, 0x99a30130},
12367		{0x14, 0x90170110},
12368		{0x15, 0x0321101f},
12369		{0x16, 0x03011020}),
12370	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
12371		{0x12, 0x99a30140},
12372		{0x14, 0x90170110},
12373		{0x15, 0x0321101f},
12374		{0x16, 0x03011020}),
12375	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
12376		{0x12, 0x99a30150},
12377		{0x14, 0x90170110},
12378		{0x15, 0x0321101f},
12379		{0x16, 0x03011020}),
12380	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
12381		{0x14, 0x90170110},
12382		{0x15, 0x0321101f},
12383		{0x16, 0x03011020}),
12384	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell XPS 15", ALC668_FIXUP_AUTO_MUTE,
12385		{0x12, 0x90a60130},
12386		{0x14, 0x90170110},
12387		{0x15, 0x0321101f}),
12388	SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
12389		{0x14, 0x01014010},
12390		{0x17, 0x90170150},
12391		{0x19, 0x02a11060},
12392		{0x1b, 0x01813030},
12393		{0x21, 0x02211020}),
12394	SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
12395		{0x14, 0x01014010},
12396		{0x18, 0x01a19040},
12397		{0x1b, 0x01813030},
12398		{0x21, 0x02211020}),
12399	SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
12400		{0x14, 0x01014020},
12401		{0x17, 0x90170110},
12402		{0x18, 0x01a19050},
12403		{0x1b, 0x01813040},
12404		{0x21, 0x02211030}),
12405	{}
12406};
12407
12408/*
12409 */
12410static int patch_alc662(struct hda_codec *codec)
12411{
12412	struct alc_spec *spec;
12413	int err;
12414
12415	err = alc_alloc_spec(codec, 0x0b);
12416	if (err < 0)
12417		return err;
12418
12419	spec = codec->spec;
12420
12421	spec->shutup = alc_eapd_shutup;
12422
12423	/* handle multiple HPs as is */
12424	spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
12425
12426	alc_fix_pll_init(codec, 0x20, 0x04, 15);
12427
12428	switch (codec->core.vendor_id) {
12429	case 0x10ec0668:
12430		spec->init_hook = alc668_restore_default_value;
12431		break;
12432	}
12433
12434	alc_pre_init(codec);
12435
12436	snd_hda_pick_fixup(codec, alc662_fixup_models,
12437		       alc662_fixup_tbl, alc662_fixups);
12438	snd_hda_pick_pin_fixup(codec, alc662_pin_fixup_tbl, alc662_fixups, true);
12439	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
12440
12441	alc_auto_parse_customize_define(codec);
12442
12443	if (has_cdefine_beep(codec))
12444		spec->gen.beep_nid = 0x01;
12445
12446	if ((alc_get_coef0(codec) & (1 << 14)) &&
12447	    codec->bus->pci && codec->bus->pci->subsystem_vendor == 0x1025 &&
12448	    spec->cdefine.platform_type == 1) {
12449		err = alc_codec_rename(codec, "ALC272X");
12450		if (err < 0)
12451			goto error;
12452	}
12453
12454	/* automatic parse from the BIOS config */
12455	err = alc662_parse_auto_config(codec);
12456	if (err < 0)
12457		goto error;
12458
12459	if (!spec->gen.no_analog && spec->gen.beep_nid) {
12460		switch (codec->core.vendor_id) {
12461		case 0x10ec0662:
12462			err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
12463			break;
12464		case 0x10ec0272:
12465		case 0x10ec0663:
12466		case 0x10ec0665:
12467		case 0x10ec0668:
12468			err = set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
12469			break;
12470		case 0x10ec0273:
12471			err = set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
12472			break;
12473		}
12474		if (err < 0)
12475			goto error;
12476	}
12477
12478	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
12479
12480	return 0;
12481
12482 error:
12483	alc_free(codec);
12484	return err;
12485}
12486
12487/*
12488 * ALC680 support
12489 */
12490
12491static int alc680_parse_auto_config(struct hda_codec *codec)
12492{
12493	return alc_parse_auto_config(codec, NULL, NULL);
12494}
12495
12496/*
12497 */
12498static int patch_alc680(struct hda_codec *codec)
12499{
12500	int err;
12501
12502	/* ALC680 has no aa-loopback mixer */
12503	err = alc_alloc_spec(codec, 0);
12504	if (err < 0)
12505		return err;
12506
12507	/* automatic parse from the BIOS config */
12508	err = alc680_parse_auto_config(codec);
12509	if (err < 0) {
12510		alc_free(codec);
12511		return err;
12512	}
12513
12514	return 0;
12515}
12516
12517/*
12518 * patch entries
12519 */
12520static const struct hda_device_id snd_hda_id_realtek[] = {
12521	HDA_CODEC_ENTRY(0x10ec0215, "ALC215", patch_alc269),
12522	HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269),
12523	HDA_CODEC_ENTRY(0x10ec0222, "ALC222", patch_alc269),
12524	HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269),
12525	HDA_CODEC_ENTRY(0x10ec0230, "ALC236", patch_alc269),
12526	HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269),
12527	HDA_CODEC_ENTRY(0x10ec0233, "ALC233", patch_alc269),
12528	HDA_CODEC_ENTRY(0x10ec0234, "ALC234", patch_alc269),
12529	HDA_CODEC_ENTRY(0x10ec0235, "ALC233", patch_alc269),
12530	HDA_CODEC_ENTRY(0x10ec0236, "ALC236", patch_alc269),
12531	HDA_CODEC_ENTRY(0x10ec0245, "ALC245", patch_alc269),
12532	HDA_CODEC_ENTRY(0x10ec0255, "ALC255", patch_alc269),
12533	HDA_CODEC_ENTRY(0x10ec0256, "ALC256", patch_alc269),
12534	HDA_CODEC_ENTRY(0x10ec0257, "ALC257", patch_alc269),
12535	HDA_CODEC_ENTRY(0x10ec0260, "ALC260", patch_alc260),
12536	HDA_CODEC_ENTRY(0x10ec0262, "ALC262", patch_alc262),
12537	HDA_CODEC_ENTRY(0x10ec0267, "ALC267", patch_alc268),
12538	HDA_CODEC_ENTRY(0x10ec0268, "ALC268", patch_alc268),
12539	HDA_CODEC_ENTRY(0x10ec0269, "ALC269", patch_alc269),
12540	HDA_CODEC_ENTRY(0x10ec0270, "ALC270", patch_alc269),
12541	HDA_CODEC_ENTRY(0x10ec0272, "ALC272", patch_alc662),
12542	HDA_CODEC_ENTRY(0x10ec0274, "ALC274", patch_alc269),
12543	HDA_CODEC_ENTRY(0x10ec0275, "ALC275", patch_alc269),
12544	HDA_CODEC_ENTRY(0x10ec0276, "ALC276", patch_alc269),
12545	HDA_CODEC_ENTRY(0x10ec0280, "ALC280", patch_alc269),
12546	HDA_CODEC_ENTRY(0x10ec0282, "ALC282", patch_alc269),
12547	HDA_CODEC_ENTRY(0x10ec0283, "ALC283", patch_alc269),
12548	HDA_CODEC_ENTRY(0x10ec0284, "ALC284", patch_alc269),
12549	HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269),
12550	HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269),
12551	HDA_CODEC_ENTRY(0x10ec0287, "ALC287", patch_alc269),
12552	HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269),
12553	HDA_CODEC_ENTRY(0x10ec0289, "ALC289", patch_alc269),
12554	HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269),
12555	HDA_CODEC_ENTRY(0x10ec0292, "ALC292", patch_alc269),
12556	HDA_CODEC_ENTRY(0x10ec0293, "ALC293", patch_alc269),
12557	HDA_CODEC_ENTRY(0x10ec0294, "ALC294", patch_alc269),
12558	HDA_CODEC_ENTRY(0x10ec0295, "ALC295", patch_alc269),
12559	HDA_CODEC_ENTRY(0x10ec0298, "ALC298", patch_alc269),
12560	HDA_CODEC_ENTRY(0x10ec0299, "ALC299", patch_alc269),
12561	HDA_CODEC_ENTRY(0x10ec0300, "ALC300", patch_alc269),
12562	HDA_CODEC_ENTRY(0x10ec0623, "ALC623", patch_alc269),
12563	HDA_CODEC_REV_ENTRY(0x10ec0861, 0x100340, "ALC660", patch_alc861),
12564	HDA_CODEC_ENTRY(0x10ec0660, "ALC660-VD", patch_alc861vd),
12565	HDA_CODEC_ENTRY(0x10ec0861, "ALC861", patch_alc861),
12566	HDA_CODEC_ENTRY(0x10ec0862, "ALC861-VD", patch_alc861vd),
12567	HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100002, "ALC662 rev2", patch_alc882),
12568	HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100101, "ALC662 rev1", patch_alc662),
12569	HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100300, "ALC662 rev3", patch_alc662),
12570	HDA_CODEC_ENTRY(0x10ec0663, "ALC663", patch_alc662),
12571	HDA_CODEC_ENTRY(0x10ec0665, "ALC665", patch_alc662),
12572	HDA_CODEC_ENTRY(0x10ec0667, "ALC667", patch_alc662),
12573	HDA_CODEC_ENTRY(0x10ec0668, "ALC668", patch_alc662),
12574	HDA_CODEC_ENTRY(0x10ec0670, "ALC670", patch_alc662),
12575	HDA_CODEC_ENTRY(0x10ec0671, "ALC671", patch_alc662),
12576	HDA_CODEC_ENTRY(0x10ec0680, "ALC680", patch_alc680),
12577	HDA_CODEC_ENTRY(0x10ec0700, "ALC700", patch_alc269),
12578	HDA_CODEC_ENTRY(0x10ec0701, "ALC701", patch_alc269),
12579	HDA_CODEC_ENTRY(0x10ec0703, "ALC703", patch_alc269),
12580	HDA_CODEC_ENTRY(0x10ec0711, "ALC711", patch_alc269),
12581	HDA_CODEC_ENTRY(0x10ec0867, "ALC891", patch_alc662),
12582	HDA_CODEC_ENTRY(0x10ec0880, "ALC880", patch_alc880),
12583	HDA_CODEC_ENTRY(0x10ec0882, "ALC882", patch_alc882),
12584	HDA_CODEC_ENTRY(0x10ec0883, "ALC883", patch_alc882),
12585	HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100101, "ALC889A", patch_alc882),
12586	HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100103, "ALC889A", patch_alc882),
12587	HDA_CODEC_ENTRY(0x10ec0885, "ALC885", patch_alc882),
12588	HDA_CODEC_ENTRY(0x10ec0887, "ALC887", patch_alc882),
12589	HDA_CODEC_REV_ENTRY(0x10ec0888, 0x100101, "ALC1200", patch_alc882),
12590	HDA_CODEC_ENTRY(0x10ec0888, "ALC888", patch_alc882),
12591	HDA_CODEC_ENTRY(0x10ec0889, "ALC889", patch_alc882),
12592	HDA_CODEC_ENTRY(0x10ec0892, "ALC892", patch_alc662),
12593	HDA_CODEC_ENTRY(0x10ec0897, "ALC897", patch_alc662),
12594	HDA_CODEC_ENTRY(0x10ec0899, "ALC898", patch_alc882),
12595	HDA_CODEC_ENTRY(0x10ec0900, "ALC1150", patch_alc882),
12596	HDA_CODEC_ENTRY(0x10ec0b00, "ALCS1200A", patch_alc882),
12597	HDA_CODEC_ENTRY(0x10ec1168, "ALC1220", patch_alc882),
12598	HDA_CODEC_ENTRY(0x10ec1220, "ALC1220", patch_alc882),
12599	HDA_CODEC_ENTRY(0x19e58326, "HW8326", patch_alc269),
12600	{} /* terminator */
12601};
12602MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_realtek);
12603
12604MODULE_LICENSE("GPL");
12605MODULE_DESCRIPTION("Realtek HD-audio codec");
12606
12607static struct hda_codec_driver realtek_driver = {
12608	.id = snd_hda_id_realtek,
12609};
12610
12611module_hda_codec_driver(realtek_driver);
12612