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 <sound/core.h>
22 #include <sound/jack.h>
23 #include <sound/hda_codec.h>
24 #include "hda_local.h"
25 #include "hda_auto_parser.h"
26 #include "hda_jack.h"
27 #include "hda_generic.h"
28 #include "hda_controller.h"
29 
30 /* keep halting ALC5505 DSP, for power saving */
31 #define HALT_REALTEK_ALC5505
32 
33 /* extra amp-initialization sequence types */
34 enum {
35 	ALC_INIT_UNDEFINED,
36 	ALC_INIT_NONE,
37 	ALC_INIT_DEFAULT,
38 };
39 
40 enum {
41 	ALC_HEADSET_MODE_UNKNOWN,
42 	ALC_HEADSET_MODE_UNPLUGGED,
43 	ALC_HEADSET_MODE_HEADSET,
44 	ALC_HEADSET_MODE_MIC,
45 	ALC_HEADSET_MODE_HEADPHONE,
46 };
47 
48 enum {
49 	ALC_HEADSET_TYPE_UNKNOWN,
50 	ALC_HEADSET_TYPE_CTIA,
51 	ALC_HEADSET_TYPE_OMTP,
52 };
53 
54 enum {
55 	ALC_KEY_MICMUTE_INDEX,
56 };
57 
58 struct alc_customize_define {
59 	unsigned int  sku_cfg;
60 	unsigned char port_connectivity;
61 	unsigned char check_sum;
62 	unsigned char customization;
63 	unsigned char external_amp;
64 	unsigned int  enable_pcbeep:1;
65 	unsigned int  platform_type:1;
66 	unsigned int  swap:1;
67 	unsigned int  override:1;
68 	unsigned int  fixup:1; /* Means that this sku is set by driver, not read from hw */
69 };
70 
71 struct alc_coef_led {
72 	unsigned int idx;
73 	unsigned int mask;
74 	unsigned int on;
75 	unsigned int off;
76 };
77 
78 struct alc_spec {
79 	struct hda_gen_spec gen; /* must be at head */
80 
81 	/* codec parameterization */
82 	struct alc_customize_define cdefine;
83 	unsigned int parse_flags; /* flag for snd_hda_parse_pin_defcfg() */
84 
85 	/* GPIO bits */
86 	unsigned int gpio_mask;
87 	unsigned int gpio_dir;
88 	unsigned int gpio_data;
89 	bool gpio_write_delay;	/* add a delay before writing gpio_data */
90 
91 	/* mute LED for HP laptops, see vref_mute_led_set() */
92 	int mute_led_polarity;
93 	int micmute_led_polarity;
94 	hda_nid_t mute_led_nid;
95 	hda_nid_t cap_mute_led_nid;
96 
97 	unsigned int gpio_mute_led_mask;
98 	unsigned int gpio_mic_led_mask;
99 	struct alc_coef_led mute_led_coef;
100 	struct alc_coef_led mic_led_coef;
101 	struct mutex coef_mutex;
102 
103 	hda_nid_t headset_mic_pin;
104 	hda_nid_t headphone_mic_pin;
105 	int current_headset_mode;
106 	int current_headset_type;
107 
108 	/* hooks */
109 	void (*init_hook)(struct hda_codec *codec);
110 #ifdef CONFIG_PM
111 	void (*power_hook)(struct hda_codec *codec);
112 #endif
113 	void (*shutup)(struct hda_codec *codec);
114 	void (*reboot_notify)(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 
135 /*
136  * COEF access helper functions
137  */
138 
coef_mutex_lock(struct hda_codec *codec)139 static void coef_mutex_lock(struct hda_codec *codec)
140 {
141 	struct alc_spec *spec = codec->spec;
142 
143 	snd_hda_power_up_pm(codec);
144 	mutex_lock(&spec->coef_mutex);
145 }
146 
coef_mutex_unlock(struct hda_codec *codec)147 static void coef_mutex_unlock(struct hda_codec *codec)
148 {
149 	struct alc_spec *spec = codec->spec;
150 
151 	mutex_unlock(&spec->coef_mutex);
152 	snd_hda_power_down_pm(codec);
153 }
154 
__alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid, unsigned int coef_idx)155 static int __alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
156 				 unsigned int coef_idx)
157 {
158 	unsigned int val;
159 
160 	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
161 	val = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PROC_COEF, 0);
162 	return val;
163 }
164 
alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid, unsigned int coef_idx)165 static int alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
166 			       unsigned int coef_idx)
167 {
168 	unsigned int val;
169 
170 	coef_mutex_lock(codec);
171 	val = __alc_read_coefex_idx(codec, nid, coef_idx);
172 	coef_mutex_unlock(codec);
173 	return val;
174 }
175 
176 #define alc_read_coef_idx(codec, coef_idx) \
177 	alc_read_coefex_idx(codec, 0x20, coef_idx)
178 
__alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid, unsigned int coef_idx, unsigned int coef_val)179 static void __alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
180 				   unsigned int coef_idx, unsigned int coef_val)
181 {
182 	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
183 	snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PROC_COEF, coef_val);
184 }
185 
alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid, unsigned int coef_idx, unsigned int coef_val)186 static void alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
187 				 unsigned int coef_idx, unsigned int coef_val)
188 {
189 	coef_mutex_lock(codec);
190 	__alc_write_coefex_idx(codec, nid, coef_idx, coef_val);
191 	coef_mutex_unlock(codec);
192 }
193 
194 #define alc_write_coef_idx(codec, coef_idx, coef_val) \
195 	alc_write_coefex_idx(codec, 0x20, coef_idx, coef_val)
196 
__alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid, unsigned int coef_idx, unsigned int mask, unsigned int bits_set)197 static void __alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
198 				    unsigned int coef_idx, unsigned int mask,
199 				    unsigned int bits_set)
200 {
201 	unsigned int val = __alc_read_coefex_idx(codec, nid, coef_idx);
202 
203 	if (val != -1)
204 		__alc_write_coefex_idx(codec, nid, coef_idx,
205 				       (val & ~mask) | bits_set);
206 }
207 
alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid, unsigned int coef_idx, unsigned int mask, unsigned int bits_set)208 static void alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
209 				  unsigned int coef_idx, unsigned int mask,
210 				  unsigned int bits_set)
211 {
212 	coef_mutex_lock(codec);
213 	__alc_update_coefex_idx(codec, nid, coef_idx, mask, bits_set);
214 	coef_mutex_unlock(codec);
215 }
216 
217 #define alc_update_coef_idx(codec, coef_idx, mask, bits_set)	\
218 	alc_update_coefex_idx(codec, 0x20, coef_idx, mask, bits_set)
219 
220 /* a special bypass for COEF 0; read the cached value at the second time */
alc_get_coef0(struct hda_codec *codec)221 static unsigned int alc_get_coef0(struct hda_codec *codec)
222 {
223 	struct alc_spec *spec = codec->spec;
224 
225 	if (!spec->coef0)
226 		spec->coef0 = alc_read_coef_idx(codec, 0);
227 	return spec->coef0;
228 }
229 
230 /* coef writes/updates batch */
231 struct coef_fw {
232 	unsigned char nid;
233 	unsigned char idx;
234 	unsigned short mask;
235 	unsigned short val;
236 };
237 
238 #define UPDATE_COEFEX(_nid, _idx, _mask, _val) \
239 	{ .nid = (_nid), .idx = (_idx), .mask = (_mask), .val = (_val) }
240 #define WRITE_COEFEX(_nid, _idx, _val) UPDATE_COEFEX(_nid, _idx, -1, _val)
241 #define WRITE_COEF(_idx, _val) WRITE_COEFEX(0x20, _idx, _val)
242 #define UPDATE_COEF(_idx, _mask, _val) UPDATE_COEFEX(0x20, _idx, _mask, _val)
243 
alc_process_coef_fw(struct hda_codec *codec, const struct coef_fw *fw)244 static void alc_process_coef_fw(struct hda_codec *codec,
245 				const struct coef_fw *fw)
246 {
247 	coef_mutex_lock(codec);
248 	for (; fw->nid; fw++) {
249 		if (fw->mask == (unsigned short)-1)
250 			__alc_write_coefex_idx(codec, fw->nid, fw->idx, fw->val);
251 		else
252 			__alc_update_coefex_idx(codec, fw->nid, fw->idx,
253 						fw->mask, fw->val);
254 	}
255 	coef_mutex_unlock(codec);
256 }
257 
258 /*
259  * GPIO setup tables, used in initialization
260  */
261 
262 /* Enable GPIO mask and set output */
alc_setup_gpio(struct hda_codec *codec, unsigned int mask)263 static void alc_setup_gpio(struct hda_codec *codec, unsigned int mask)
264 {
265 	struct alc_spec *spec = codec->spec;
266 
267 	spec->gpio_mask |= mask;
268 	spec->gpio_dir |= mask;
269 	spec->gpio_data |= mask;
270 }
271 
alc_write_gpio_data(struct hda_codec *codec)272 static void alc_write_gpio_data(struct hda_codec *codec)
273 {
274 	struct alc_spec *spec = codec->spec;
275 
276 	snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
277 			    spec->gpio_data);
278 }
279 
alc_update_gpio_data(struct hda_codec *codec, unsigned int mask, bool on)280 static void alc_update_gpio_data(struct hda_codec *codec, unsigned int mask,
281 				 bool on)
282 {
283 	struct alc_spec *spec = codec->spec;
284 	unsigned int oldval = spec->gpio_data;
285 
286 	if (on)
287 		spec->gpio_data |= mask;
288 	else
289 		spec->gpio_data &= ~mask;
290 	if (oldval != spec->gpio_data)
291 		alc_write_gpio_data(codec);
292 }
293 
alc_write_gpio(struct hda_codec *codec)294 static void alc_write_gpio(struct hda_codec *codec)
295 {
296 	struct alc_spec *spec = codec->spec;
297 
298 	if (!spec->gpio_mask)
299 		return;
300 
301 	snd_hda_codec_write(codec, codec->core.afg, 0,
302 			    AC_VERB_SET_GPIO_MASK, spec->gpio_mask);
303 	snd_hda_codec_write(codec, codec->core.afg, 0,
304 			    AC_VERB_SET_GPIO_DIRECTION, spec->gpio_dir);
305 	if (spec->gpio_write_delay)
306 		msleep(1);
307 	alc_write_gpio_data(codec);
308 }
309 
alc_fixup_gpio(struct hda_codec *codec, int action, unsigned int mask)310 static void alc_fixup_gpio(struct hda_codec *codec, int action,
311 			   unsigned int mask)
312 {
313 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
314 		alc_setup_gpio(codec, mask);
315 }
316 
alc_fixup_gpio1(struct hda_codec *codec, const struct hda_fixup *fix, int action)317 static void alc_fixup_gpio1(struct hda_codec *codec,
318 			    const struct hda_fixup *fix, int action)
319 {
320 	alc_fixup_gpio(codec, action, 0x01);
321 }
322 
alc_fixup_gpio2(struct hda_codec *codec, const struct hda_fixup *fix, int action)323 static void alc_fixup_gpio2(struct hda_codec *codec,
324 			    const struct hda_fixup *fix, int action)
325 {
326 	alc_fixup_gpio(codec, action, 0x02);
327 }
328 
alc_fixup_gpio3(struct hda_codec *codec, const struct hda_fixup *fix, int action)329 static void alc_fixup_gpio3(struct hda_codec *codec,
330 			    const struct hda_fixup *fix, int action)
331 {
332 	alc_fixup_gpio(codec, action, 0x03);
333 }
334 
alc_fixup_gpio4(struct hda_codec *codec, const struct hda_fixup *fix, int action)335 static void alc_fixup_gpio4(struct hda_codec *codec,
336 			    const struct hda_fixup *fix, int action)
337 {
338 	alc_fixup_gpio(codec, action, 0x04);
339 }
340 
alc_fixup_micmute_led(struct hda_codec *codec, const struct hda_fixup *fix, int action)341 static void alc_fixup_micmute_led(struct hda_codec *codec,
342 				  const struct hda_fixup *fix, int action)
343 {
344 	if (action == HDA_FIXUP_ACT_PROBE)
345 		snd_hda_gen_add_micmute_led_cdev(codec, NULL);
346 }
347 
has_loongson_workaround(struct hda_codec *codec)348 int has_loongson_workaround(struct hda_codec *codec)
349 {
350 	struct azx *chip = bus_to_azx(&codec->bus->core);
351 
352 	return chip->driver_caps & AZX_DCAPS_LS2X_WORKAROUND;
353 }
354 
355 /*
356  * Fix hardware PLL issue
357  * On some codecs, the analog PLL gating control must be off while
358  * the default value is 1.
359  */
alc_fix_pll(struct hda_codec *codec)360 static void alc_fix_pll(struct hda_codec *codec)
361 {
362 	struct alc_spec *spec = codec->spec;
363 
364 	if (spec->pll_nid)
365 		alc_update_coefex_idx(codec, spec->pll_nid, spec->pll_coef_idx,
366 				      1 << spec->pll_coef_bit, 0);
367 }
368 
alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid, unsigned int coef_idx, unsigned int coef_bit)369 static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
370 			     unsigned int coef_idx, unsigned int coef_bit)
371 {
372 	struct alc_spec *spec = codec->spec;
373 	spec->pll_nid = nid;
374 	spec->pll_coef_idx = coef_idx;
375 	spec->pll_coef_bit = coef_bit;
376 	alc_fix_pll(codec);
377 }
378 
379 /* update the master volume per volume-knob's unsol event */
alc_update_knob_master(struct hda_codec *codec, struct hda_jack_callback *jack)380 static void alc_update_knob_master(struct hda_codec *codec,
381 				   struct hda_jack_callback *jack)
382 {
383 	unsigned int val;
384 	struct snd_kcontrol *kctl;
385 	struct snd_ctl_elem_value *uctl;
386 
387 	kctl = snd_hda_find_mixer_ctl(codec, "Master Playback Volume");
388 	if (!kctl)
389 		return;
390 	uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
391 	if (!uctl)
392 		return;
393 	val = snd_hda_codec_read(codec, jack->nid, 0,
394 				 AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
395 	val &= HDA_AMP_VOLMASK;
396 	uctl->value.integer.value[0] = val;
397 	uctl->value.integer.value[1] = val;
398 	kctl->put(kctl, uctl);
399 	kfree(uctl);
400 }
401 
alc880_unsol_event(struct hda_codec *codec, unsigned int res)402 static void alc880_unsol_event(struct hda_codec *codec, unsigned int res)
403 {
404 	/* For some reason, the res given from ALC880 is broken.
405 	   Here we adjust it properly. */
406 	snd_hda_jack_unsol_event(codec, res >> 2);
407 }
408 
409 /* Change EAPD to verb control */
alc_fill_eapd_coef(struct hda_codec *codec)410 static void alc_fill_eapd_coef(struct hda_codec *codec)
411 {
412 	int coef;
413 
414 	coef = alc_get_coef0(codec);
415 
416 	switch (codec->core.vendor_id) {
417 	case 0x10ec0262:
418 		alc_update_coef_idx(codec, 0x7, 0, 1<<5);
419 		break;
420 	case 0x10ec0267:
421 	case 0x10ec0268:
422 		alc_update_coef_idx(codec, 0x7, 0, 1<<13);
423 		break;
424 	case 0x10ec0269:
425 		if ((coef & 0x00f0) == 0x0010)
426 			alc_update_coef_idx(codec, 0xd, 0, 1<<14);
427 		if ((coef & 0x00f0) == 0x0020)
428 			alc_update_coef_idx(codec, 0x4, 1<<15, 0);
429 		if ((coef & 0x00f0) == 0x0030)
430 			alc_update_coef_idx(codec, 0x10, 1<<9, 0);
431 		break;
432 	case 0x10ec0280:
433 	case 0x10ec0284:
434 	case 0x10ec0290:
435 	case 0x10ec0292:
436 		alc_update_coef_idx(codec, 0x4, 1<<15, 0);
437 		break;
438 	case 0x10ec0225:
439 	case 0x10ec0295:
440 	case 0x10ec0299:
441 		alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
442 		fallthrough;
443 	case 0x10ec0215:
444 	case 0x10ec0230:
445 	case 0x10ec0233:
446 	case 0x10ec0235:
447 	case 0x10ec0236:
448 	case 0x10ec0245:
449 	case 0x10ec0255:
450 	case 0x10ec0256:
451 	case 0x19e58326:
452 	case 0x10ec0257:
453 	case 0x10ec0282:
454 	case 0x10ec0283:
455 	case 0x10ec0286:
456 	case 0x10ec0288:
457 	case 0x10ec0285:
458 	case 0x10ec0298:
459 	case 0x10ec0289:
460 	case 0x10ec0300:
461 		alc_update_coef_idx(codec, 0x10, 1<<9, 0);
462 		break;
463 	case 0x10ec0275:
464 		alc_update_coef_idx(codec, 0xe, 0, 1<<0);
465 		break;
466 	case 0x10ec0287:
467 		alc_update_coef_idx(codec, 0x10, 1<<9, 0);
468 		alc_write_coef_idx(codec, 0x8, 0x4ab7);
469 		break;
470 	case 0x10ec0293:
471 		alc_update_coef_idx(codec, 0xa, 1<<13, 0);
472 		break;
473 	case 0x10ec0234:
474 	case 0x10ec0274:
475 	case 0x10ec0294:
476 	case 0x10ec0700:
477 	case 0x10ec0701:
478 	case 0x10ec0703:
479 	case 0x10ec0711:
480 		alc_update_coef_idx(codec, 0x10, 1<<15, 0);
481 		break;
482 	case 0x10ec0662:
483 		if ((coef & 0x00f0) == 0x0030)
484 			alc_update_coef_idx(codec, 0x4, 1<<10, 0); /* EAPD Ctrl */
485 		break;
486 	case 0x10ec0272:
487 	case 0x10ec0273:
488 	case 0x10ec0663:
489 	case 0x10ec0665:
490 	case 0x10ec0670:
491 	case 0x10ec0671:
492 	case 0x10ec0672:
493 		alc_update_coef_idx(codec, 0xd, 0, 1<<14); /* EAPD Ctrl */
494 		break;
495 	case 0x10ec0222:
496 	case 0x10ec0623:
497 		alc_update_coef_idx(codec, 0x19, 1<<13, 0);
498 		break;
499 	case 0x10ec0668:
500 		alc_update_coef_idx(codec, 0x7, 3<<13, 0);
501 		break;
502 	case 0x10ec0867:
503 		alc_update_coef_idx(codec, 0x4, 1<<10, 0);
504 		break;
505 	case 0x10ec0888:
506 		if ((coef & 0x00f0) == 0x0020 || (coef & 0x00f0) == 0x0030)
507 			alc_update_coef_idx(codec, 0x7, 1<<5, 0);
508 		break;
509 	case 0x10ec0892:
510 	case 0x10ec0897:
511 		alc_update_coef_idx(codec, 0x7, 1<<5, 0);
512 		break;
513 	case 0x10ec0899:
514 	case 0x10ec0900:
515 	case 0x10ec0b00:
516 	case 0x10ec1168:
517 	case 0x10ec1220:
518 		alc_update_coef_idx(codec, 0x7, 1<<1, 0);
519 		break;
520 	}
521 }
522 
523 /* additional initialization for ALC888 variants */
alc888_coef_init(struct hda_codec *codec)524 static void alc888_coef_init(struct hda_codec *codec)
525 {
526 	switch (alc_get_coef0(codec) & 0x00f0) {
527 	/* alc888-VA */
528 	case 0x00:
529 	/* alc888-VB */
530 	case 0x10:
531 		alc_update_coef_idx(codec, 7, 0, 0x2030); /* Turn EAPD to High */
532 		break;
533 	}
534 }
535 
536 /* turn on/off EAPD control (only if available) */
set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)537 static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
538 {
539 	if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
540 		return;
541 	if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
542 		snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
543 				    on ? 2 : 0);
544 }
545 
546 /* turn on/off EAPD controls of the codec */
alc_auto_setup_eapd(struct hda_codec *codec, bool on)547 static void alc_auto_setup_eapd(struct hda_codec *codec, bool on)
548 {
549 	/* We currently only handle front, HP */
550 	static const hda_nid_t pins[] = {
551 		0x0f, 0x10, 0x14, 0x15, 0x17, 0
552 	};
553 	const hda_nid_t *p;
554 	for (p = pins; *p; p++)
555 		set_eapd(codec, *p, on);
556 }
557 
558 static int find_ext_mic_pin(struct hda_codec *codec);
559 
alc_headset_mic_no_shutup(struct hda_codec *codec)560 static void alc_headset_mic_no_shutup(struct hda_codec *codec)
561 {
562 	const struct hda_pincfg *pin;
563 	int mic_pin = find_ext_mic_pin(codec);
564 	int i;
565 
566 	/* don't shut up pins when unloading the driver; otherwise it breaks
567 	 * the default pin setup at the next load of the driver
568 	 */
569 	if (codec->bus->shutdown)
570 		return;
571 
572 	snd_array_for_each(&codec->init_pins, i, pin) {
573 		/* use read here for syncing after issuing each verb */
574 		if (pin->nid != mic_pin)
575 			snd_hda_codec_read(codec, pin->nid, 0,
576 					AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
577 	}
578 
579 	codec->pins_shutup = 1;
580 }
581 
alc_shutup_pins(struct hda_codec *codec)582 static void alc_shutup_pins(struct hda_codec *codec)
583 {
584 	struct alc_spec *spec = codec->spec;
585 
586 	switch (codec->core.vendor_id) {
587 	case 0x10ec0236:
588 	case 0x10ec0256:
589 	case 0x19e58326:
590 	case 0x10ec0283:
591 	case 0x10ec0286:
592 	case 0x10ec0288:
593 	case 0x10ec0298:
594 		alc_headset_mic_no_shutup(codec);
595 		break;
596 	default:
597 		if (!spec->no_shutup_pins)
598 			snd_hda_shutup_pins(codec);
599 		break;
600 	}
601 }
602 
603 /* generic shutup callback;
604  * just turning off EAPD and a little pause for avoiding pop-noise
605  */
alc_eapd_shutup(struct hda_codec *codec)606 static void alc_eapd_shutup(struct hda_codec *codec)
607 {
608 	struct alc_spec *spec = codec->spec;
609 
610 	alc_auto_setup_eapd(codec, false);
611 	if (!spec->no_depop_delay)
612 		msleep(200);
613 	alc_shutup_pins(codec);
614 }
615 
616 /* generic EAPD initialization */
alc_auto_init_amp(struct hda_codec *codec, int type)617 static void alc_auto_init_amp(struct hda_codec *codec, int type)
618 {
619 	alc_auto_setup_eapd(codec, true);
620 	alc_write_gpio(codec);
621 	switch (type) {
622 	case ALC_INIT_DEFAULT:
623 		switch (codec->core.vendor_id) {
624 		case 0x10ec0260:
625 			alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x2010);
626 			break;
627 		case 0x10ec0880:
628 		case 0x10ec0882:
629 		case 0x10ec0883:
630 		case 0x10ec0885:
631 			alc_update_coef_idx(codec, 7, 0, 0x2030);
632 			break;
633 		case 0x10ec0888:
634 			alc888_coef_init(codec);
635 			break;
636 		}
637 		break;
638 	}
639 }
640 
641 /* get a primary headphone pin if available */
alc_get_hp_pin(struct alc_spec *spec)642 static hda_nid_t alc_get_hp_pin(struct alc_spec *spec)
643 {
644 	if (spec->gen.autocfg.hp_pins[0])
645 		return spec->gen.autocfg.hp_pins[0];
646 	if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
647 		return spec->gen.autocfg.line_out_pins[0];
648 	return 0;
649 }
650 
651 /*
652  * Realtek SSID verification
653  */
654 
655 /* Could be any non-zero and even value. When used as fixup, tells
656  * the driver to ignore any present sku defines.
657  */
658 #define ALC_FIXUP_SKU_IGNORE (2)
659 
alc_fixup_sku_ignore(struct hda_codec *codec, const struct hda_fixup *fix, int action)660 static void alc_fixup_sku_ignore(struct hda_codec *codec,
661 				 const struct hda_fixup *fix, int action)
662 {
663 	struct alc_spec *spec = codec->spec;
664 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
665 		spec->cdefine.fixup = 1;
666 		spec->cdefine.sku_cfg = ALC_FIXUP_SKU_IGNORE;
667 	}
668 }
669 
alc_fixup_no_depop_delay(struct hda_codec *codec, const struct hda_fixup *fix, int action)670 static void alc_fixup_no_depop_delay(struct hda_codec *codec,
671 				    const struct hda_fixup *fix, int action)
672 {
673 	struct alc_spec *spec = codec->spec;
674 
675 	if (action == HDA_FIXUP_ACT_PROBE) {
676 		spec->no_depop_delay = 1;
677 		codec->depop_delay = 0;
678 	}
679 }
680 
alc_auto_parse_customize_define(struct hda_codec *codec)681 static int alc_auto_parse_customize_define(struct hda_codec *codec)
682 {
683 	unsigned int ass, tmp, i;
684 	unsigned nid = 0;
685 	struct alc_spec *spec = codec->spec;
686 
687 	spec->cdefine.enable_pcbeep = 1; /* assume always enabled */
688 
689 	if (spec->cdefine.fixup) {
690 		ass = spec->cdefine.sku_cfg;
691 		if (ass == ALC_FIXUP_SKU_IGNORE)
692 			return -1;
693 		goto do_sku;
694 	}
695 
696 	if (!codec->bus->pci && !has_loongson_workaround(codec))
697 		return -1;
698 	ass = codec->core.subsystem_id & 0xffff;
699 	if (codec->bus->pci && ass != codec->bus->pci->subsystem_device && (ass & 1))
700 		goto do_sku;
701 
702 	nid = 0x1d;
703 	if (codec->core.vendor_id == 0x10ec0260)
704 		nid = 0x17;
705 	ass = snd_hda_codec_get_pincfg(codec, nid);
706 
707 	if (!(ass & 1)) {
708 		codec_info(codec, "%s: SKU not ready 0x%08x\n",
709 			   codec->core.chip_name, ass);
710 		return -1;
711 	}
712 
713 	/* check sum */
714 	tmp = 0;
715 	for (i = 1; i < 16; i++) {
716 		if ((ass >> i) & 1)
717 			tmp++;
718 	}
719 	if (((ass >> 16) & 0xf) != tmp)
720 		return -1;
721 
722 	spec->cdefine.port_connectivity = ass >> 30;
723 	spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
724 	spec->cdefine.check_sum = (ass >> 16) & 0xf;
725 	spec->cdefine.customization = ass >> 8;
726 do_sku:
727 	spec->cdefine.sku_cfg = ass;
728 	spec->cdefine.external_amp = (ass & 0x38) >> 3;
729 	spec->cdefine.platform_type = (ass & 0x4) >> 2;
730 	spec->cdefine.swap = (ass & 0x2) >> 1;
731 	spec->cdefine.override = ass & 0x1;
732 
733 	codec_dbg(codec, "SKU: Nid=0x%x sku_cfg=0x%08x\n",
734 		   nid, spec->cdefine.sku_cfg);
735 	codec_dbg(codec, "SKU: port_connectivity=0x%x\n",
736 		   spec->cdefine.port_connectivity);
737 	codec_dbg(codec, "SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
738 	codec_dbg(codec, "SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
739 	codec_dbg(codec, "SKU: customization=0x%08x\n", spec->cdefine.customization);
740 	codec_dbg(codec, "SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
741 	codec_dbg(codec, "SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
742 	codec_dbg(codec, "SKU: swap=0x%x\n", spec->cdefine.swap);
743 	codec_dbg(codec, "SKU: override=0x%x\n", spec->cdefine.override);
744 
745 	return 0;
746 }
747 
748 /* return the position of NID in the list, or -1 if not found */
find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)749 static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
750 {
751 	int i;
752 	for (i = 0; i < nums; i++)
753 		if (list[i] == nid)
754 			return i;
755 	return -1;
756 }
757 /* return true if the given NID is found in the list */
found_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)758 static bool found_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
759 {
760 	return find_idx_in_nid_list(nid, list, nums) >= 0;
761 }
762 
763 /* check subsystem ID and set up device-specific initialization;
764  * return 1 if initialized, 0 if invalid SSID
765  */
766 /* 32-bit subsystem ID for BIOS loading in HD Audio codec.
767  *	31 ~ 16 :	Manufacture ID
768  *	15 ~ 8	:	SKU ID
769  *	7  ~ 0	:	Assembly ID
770  *	port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
771  */
alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports)772 static int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports)
773 {
774 	unsigned int ass, tmp, i;
775 	unsigned nid;
776 	struct alc_spec *spec = codec->spec;
777 
778 	if (spec->cdefine.fixup) {
779 		ass = spec->cdefine.sku_cfg;
780 		if (ass == ALC_FIXUP_SKU_IGNORE)
781 			return 0;
782 		goto do_sku;
783 	}
784 
785 	ass = codec->core.subsystem_id & 0xffff;
786 	if (codec->bus->pci &&
787 	    ass != codec->bus->pci->subsystem_device && (ass & 1))
788 		goto do_sku;
789 
790 	/* invalid SSID, check the special NID pin defcfg instead */
791 	/*
792 	 * 31~30	: port connectivity
793 	 * 29~21	: reserve
794 	 * 20		: PCBEEP input
795 	 * 19~16	: Check sum (15:1)
796 	 * 15~1		: Custom
797 	 * 0		: override
798 	*/
799 	nid = 0x1d;
800 	if (codec->core.vendor_id == 0x10ec0260)
801 		nid = 0x17;
802 	ass = snd_hda_codec_get_pincfg(codec, nid);
803 	codec_dbg(codec,
804 		  "realtek: No valid SSID, checking pincfg 0x%08x for NID 0x%x\n",
805 		   ass, nid);
806 	if (!(ass & 1))
807 		return 0;
808 	if ((ass >> 30) != 1)	/* no physical connection */
809 		return 0;
810 
811 	/* check sum */
812 	tmp = 0;
813 	for (i = 1; i < 16; i++) {
814 		if ((ass >> i) & 1)
815 			tmp++;
816 	}
817 	if (((ass >> 16) & 0xf) != tmp)
818 		return 0;
819 do_sku:
820 	codec_dbg(codec, "realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
821 		   ass & 0xffff, codec->core.vendor_id);
822 	/*
823 	 * 0 : override
824 	 * 1 :	Swap Jack
825 	 * 2 : 0 --> Desktop, 1 --> Laptop
826 	 * 3~5 : External Amplifier control
827 	 * 7~6 : Reserved
828 	*/
829 	tmp = (ass & 0x38) >> 3;	/* external Amp control */
830 	if (spec->init_amp == ALC_INIT_UNDEFINED) {
831 		switch (tmp) {
832 		case 1:
833 			alc_setup_gpio(codec, 0x01);
834 			break;
835 		case 3:
836 			alc_setup_gpio(codec, 0x02);
837 			break;
838 		case 7:
839 			alc_setup_gpio(codec, 0x04);
840 			break;
841 		case 5:
842 		default:
843 			spec->init_amp = ALC_INIT_DEFAULT;
844 			break;
845 		}
846 	}
847 
848 	/* is laptop or Desktop and enable the function "Mute internal speaker
849 	 * when the external headphone out jack is plugged"
850 	 */
851 	if (!(ass & 0x8000))
852 		return 1;
853 	/*
854 	 * 10~8 : Jack location
855 	 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
856 	 * 14~13: Resvered
857 	 * 15   : 1 --> enable the function "Mute internal speaker
858 	 *	        when the external headphone out jack is plugged"
859 	 */
860 	if (!alc_get_hp_pin(spec)) {
861 		hda_nid_t nid;
862 		tmp = (ass >> 11) & 0x3;	/* HP to chassis */
863 		nid = ports[tmp];
864 		if (found_in_nid_list(nid, spec->gen.autocfg.line_out_pins,
865 				      spec->gen.autocfg.line_outs))
866 			return 1;
867 		spec->gen.autocfg.hp_pins[0] = nid;
868 	}
869 	return 1;
870 }
871 
872 /* Check the validity of ALC subsystem-id
873  * ports contains an array of 4 pin NIDs for port-A, E, D and I */
alc_ssid_check(struct hda_codec *codec, const hda_nid_t *ports)874 static void alc_ssid_check(struct hda_codec *codec, const hda_nid_t *ports)
875 {
876 	if (!alc_subsystem_id(codec, ports)) {
877 		struct alc_spec *spec = codec->spec;
878 		if (spec->init_amp == ALC_INIT_UNDEFINED) {
879 			codec_dbg(codec,
880 				  "realtek: Enable default setup for auto mode as fallback\n");
881 			spec->init_amp = ALC_INIT_DEFAULT;
882 		}
883 	}
884 }
885 
886 /*
887  */
888 
alc_fixup_inv_dmic(struct hda_codec *codec, const struct hda_fixup *fix, int action)889 static void alc_fixup_inv_dmic(struct hda_codec *codec,
890 			       const struct hda_fixup *fix, int action)
891 {
892 	struct alc_spec *spec = codec->spec;
893 
894 	spec->gen.inv_dmic_split = 1;
895 }
896 
897 
alc_build_controls(struct hda_codec *codec)898 static int alc_build_controls(struct hda_codec *codec)
899 {
900 	int err;
901 
902 	err = snd_hda_gen_build_controls(codec);
903 	if (err < 0)
904 		return err;
905 
906 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_BUILD);
907 	return 0;
908 }
909 
910 
911 /*
912  * Common callbacks
913  */
914 
alc_pre_init(struct hda_codec *codec)915 static void alc_pre_init(struct hda_codec *codec)
916 {
917 	alc_fill_eapd_coef(codec);
918 }
919 
920 #define is_s3_resume(codec) \
921 	((codec)->core.dev.power.power_state.event == PM_EVENT_RESUME)
922 #define is_s4_resume(codec) \
923 	((codec)->core.dev.power.power_state.event == PM_EVENT_RESTORE)
924 
alc_init(struct hda_codec *codec)925 static int alc_init(struct hda_codec *codec)
926 {
927 	struct alc_spec *spec = codec->spec;
928 
929 	/* hibernation resume needs the full chip initialization */
930 	if (is_s4_resume(codec))
931 		alc_pre_init(codec);
932 
933 	if (spec->init_hook)
934 		spec->init_hook(codec);
935 
936 	spec->gen.skip_verbs = 1; /* applied in below */
937 	snd_hda_gen_init(codec);
938 	alc_fix_pll(codec);
939 	alc_auto_init_amp(codec, spec->init_amp);
940 	snd_hda_apply_verbs(codec); /* apply verbs here after own init */
941 
942 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT);
943 
944 	return 0;
945 }
946 
alc_shutup(struct hda_codec *codec)947 static inline void alc_shutup(struct hda_codec *codec)
948 {
949 	struct alc_spec *spec = codec->spec;
950 
951 	if (!snd_hda_get_bool_hint(codec, "shutup"))
952 		return; /* disabled explicitly by hints */
953 
954 	if (spec && spec->shutup)
955 		spec->shutup(codec);
956 	else
957 		alc_shutup_pins(codec);
958 }
959 
alc_reboot_notify(struct hda_codec *codec)960 static void alc_reboot_notify(struct hda_codec *codec)
961 {
962 	struct alc_spec *spec = codec->spec;
963 
964 	if (spec && spec->reboot_notify)
965 		spec->reboot_notify(codec);
966 	else
967 		alc_shutup(codec);
968 }
969 
970 #define alc_free	snd_hda_gen_free
971 
972 #ifdef CONFIG_PM
alc_power_eapd(struct hda_codec *codec)973 static void alc_power_eapd(struct hda_codec *codec)
974 {
975 	alc_auto_setup_eapd(codec, false);
976 }
977 
alc_suspend(struct hda_codec *codec)978 static int alc_suspend(struct hda_codec *codec)
979 {
980 	struct alc_spec *spec = codec->spec;
981 	alc_shutup(codec);
982 	if (spec && spec->power_hook)
983 		spec->power_hook(codec);
984 	return 0;
985 }
986 #endif
987 
988 #ifdef CONFIG_PM
alc_resume(struct hda_codec *codec)989 static int alc_resume(struct hda_codec *codec)
990 {
991 	struct alc_spec *spec = codec->spec;
992 
993 	if (!spec->no_depop_delay)
994 		msleep(150); /* to avoid pop noise */
995 	codec->patch_ops.init(codec);
996 	snd_hda_regmap_sync(codec);
997 	hda_call_check_power_status(codec, 0x01);
998 	return 0;
999 }
1000 #endif
1001 
1002 /*
1003  */
1004 static const struct hda_codec_ops alc_patch_ops = {
1005 	.build_controls = alc_build_controls,
1006 	.build_pcms = snd_hda_gen_build_pcms,
1007 	.init = alc_init,
1008 	.free = alc_free,
1009 	.unsol_event = snd_hda_jack_unsol_event,
1010 #ifdef CONFIG_PM
1011 	.resume = alc_resume,
1012 	.suspend = alc_suspend,
1013 	.check_power_status = snd_hda_gen_check_power_status,
1014 #endif
1015 	.reboot_notify = alc_reboot_notify,
1016 };
1017 
1018 
1019 #define alc_codec_rename(codec, name) snd_hda_codec_set_name(codec, name)
1020 
1021 /*
1022  * Rename codecs appropriately from COEF value or subvendor id
1023  */
1024 struct alc_codec_rename_table {
1025 	unsigned int vendor_id;
1026 	unsigned short coef_mask;
1027 	unsigned short coef_bits;
1028 	const char *name;
1029 };
1030 
1031 struct alc_codec_rename_pci_table {
1032 	unsigned int codec_vendor_id;
1033 	unsigned short pci_subvendor;
1034 	unsigned short pci_subdevice;
1035 	const char *name;
1036 };
1037 
1038 static const struct alc_codec_rename_table rename_tbl[] = {
1039 	{ 0x10ec0221, 0xf00f, 0x1003, "ALC231" },
1040 	{ 0x10ec0269, 0xfff0, 0x3010, "ALC277" },
1041 	{ 0x10ec0269, 0xf0f0, 0x2010, "ALC259" },
1042 	{ 0x10ec0269, 0xf0f0, 0x3010, "ALC258" },
1043 	{ 0x10ec0269, 0x00f0, 0x0010, "ALC269VB" },
1044 	{ 0x10ec0269, 0xffff, 0xa023, "ALC259" },
1045 	{ 0x10ec0269, 0xffff, 0x6023, "ALC281X" },
1046 	{ 0x10ec0269, 0x00f0, 0x0020, "ALC269VC" },
1047 	{ 0x10ec0269, 0x00f0, 0x0030, "ALC269VD" },
1048 	{ 0x10ec0662, 0xffff, 0x4020, "ALC656" },
1049 	{ 0x10ec0887, 0x00f0, 0x0030, "ALC887-VD" },
1050 	{ 0x10ec0888, 0x00f0, 0x0030, "ALC888-VD" },
1051 	{ 0x10ec0888, 0xf0f0, 0x3020, "ALC886" },
1052 	{ 0x10ec0899, 0x2000, 0x2000, "ALC899" },
1053 	{ 0x10ec0892, 0xffff, 0x8020, "ALC661" },
1054 	{ 0x10ec0892, 0xffff, 0x8011, "ALC661" },
1055 	{ 0x10ec0892, 0xffff, 0x4011, "ALC656" },
1056 	{ } /* terminator */
1057 };
1058 
1059 static const struct alc_codec_rename_pci_table rename_pci_tbl[] = {
1060 	{ 0x10ec0280, 0x1028, 0, "ALC3220" },
1061 	{ 0x10ec0282, 0x1028, 0, "ALC3221" },
1062 	{ 0x10ec0283, 0x1028, 0, "ALC3223" },
1063 	{ 0x10ec0288, 0x1028, 0, "ALC3263" },
1064 	{ 0x10ec0292, 0x1028, 0, "ALC3226" },
1065 	{ 0x10ec0293, 0x1028, 0, "ALC3235" },
1066 	{ 0x10ec0255, 0x1028, 0, "ALC3234" },
1067 	{ 0x10ec0668, 0x1028, 0, "ALC3661" },
1068 	{ 0x10ec0275, 0x1028, 0, "ALC3260" },
1069 	{ 0x10ec0899, 0x1028, 0, "ALC3861" },
1070 	{ 0x10ec0298, 0x1028, 0, "ALC3266" },
1071 	{ 0x10ec0236, 0x1028, 0, "ALC3204" },
1072 	{ 0x10ec0256, 0x1028, 0, "ALC3246" },
1073 	{ 0x10ec0225, 0x1028, 0, "ALC3253" },
1074 	{ 0x10ec0295, 0x1028, 0, "ALC3254" },
1075 	{ 0x10ec0299, 0x1028, 0, "ALC3271" },
1076 	{ 0x10ec0670, 0x1025, 0, "ALC669X" },
1077 	{ 0x10ec0676, 0x1025, 0, "ALC679X" },
1078 	{ 0x10ec0282, 0x1043, 0, "ALC3229" },
1079 	{ 0x10ec0233, 0x1043, 0, "ALC3236" },
1080 	{ 0x10ec0280, 0x103c, 0, "ALC3228" },
1081 	{ 0x10ec0282, 0x103c, 0, "ALC3227" },
1082 	{ 0x10ec0286, 0x103c, 0, "ALC3242" },
1083 	{ 0x10ec0290, 0x103c, 0, "ALC3241" },
1084 	{ 0x10ec0668, 0x103c, 0, "ALC3662" },
1085 	{ 0x10ec0283, 0x17aa, 0, "ALC3239" },
1086 	{ 0x10ec0292, 0x17aa, 0, "ALC3232" },
1087 	{ } /* terminator */
1088 };
1089 
alc_codec_rename_from_preset(struct hda_codec *codec)1090 static int alc_codec_rename_from_preset(struct hda_codec *codec)
1091 {
1092 	const struct alc_codec_rename_table *p;
1093 	const struct alc_codec_rename_pci_table *q;
1094 
1095 	for (p = rename_tbl; p->vendor_id; p++) {
1096 		if (p->vendor_id != codec->core.vendor_id)
1097 			continue;
1098 		if ((alc_get_coef0(codec) & p->coef_mask) == p->coef_bits)
1099 			return alc_codec_rename(codec, p->name);
1100 	}
1101 
1102 	if (!codec->bus->pci)
1103 		return 0;
1104 	for (q = rename_pci_tbl; q->codec_vendor_id; q++) {
1105 		if (q->codec_vendor_id != codec->core.vendor_id)
1106 			continue;
1107 		if (q->pci_subvendor != codec->bus->pci->subsystem_vendor)
1108 			continue;
1109 		if (!q->pci_subdevice ||
1110 		    q->pci_subdevice == codec->bus->pci->subsystem_device)
1111 			return alc_codec_rename(codec, q->name);
1112 	}
1113 
1114 	return 0;
1115 }
1116 
1117 
1118 /*
1119  * Digital-beep handlers
1120  */
1121 #ifdef CONFIG_SND_HDA_INPUT_BEEP
1122 
1123 /* additional beep mixers; private_value will be overwritten */
1124 static const struct snd_kcontrol_new alc_beep_mixer[] = {
1125 	HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
1126 	HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
1127 };
1128 
1129 /* set up and create beep controls */
set_beep_amp(struct alc_spec *spec, hda_nid_t nid, int idx, int dir)1130 static int set_beep_amp(struct alc_spec *spec, hda_nid_t nid,
1131 			int idx, int dir)
1132 {
1133 	struct snd_kcontrol_new *knew;
1134 	unsigned int beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir);
1135 	int i;
1136 
1137 	for (i = 0; i < ARRAY_SIZE(alc_beep_mixer); i++) {
1138 		knew = snd_hda_gen_add_kctl(&spec->gen, NULL,
1139 					    &alc_beep_mixer[i]);
1140 		if (!knew)
1141 			return -ENOMEM;
1142 		knew->private_value = beep_amp;
1143 	}
1144 	return 0;
1145 }
1146 
1147 static const struct snd_pci_quirk beep_allow_list[] = {
1148 	SND_PCI_QUIRK(0x1043, 0x103c, "ASUS", 1),
1149 	SND_PCI_QUIRK(0x1043, 0x115d, "ASUS", 1),
1150 	SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),
1151 	SND_PCI_QUIRK(0x1043, 0x8376, "EeePC", 1),
1152 	SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1),
1153 	SND_PCI_QUIRK(0x1043, 0x831a, "EeePC", 1),
1154 	SND_PCI_QUIRK(0x1043, 0x834a, "EeePC", 1),
1155 	SND_PCI_QUIRK(0x1458, 0xa002, "GA-MA790X", 1),
1156 	SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),
1157 	/* denylist -- no beep available */
1158 	SND_PCI_QUIRK(0x17aa, 0x309e, "Lenovo ThinkCentre M73", 0),
1159 	SND_PCI_QUIRK(0x17aa, 0x30a3, "Lenovo ThinkCentre M93", 0),
1160 	{}
1161 };
1162 
has_cdefine_beep(struct hda_codec *codec)1163 static inline int has_cdefine_beep(struct hda_codec *codec)
1164 {
1165 	struct alc_spec *spec = codec->spec;
1166 	const struct snd_pci_quirk *q;
1167 	q = snd_pci_quirk_lookup(codec->bus->pci, beep_allow_list);
1168 	if (q)
1169 		return q->value;
1170 	return spec->cdefine.enable_pcbeep;
1171 }
1172 #else
1173 #define set_beep_amp(spec, nid, idx, dir)	0
1174 #define has_cdefine_beep(codec)		0
1175 #endif
1176 
1177 /* parse the BIOS configuration and set up the alc_spec */
1178 /* return 1 if successful, 0 if the proper config is not found,
1179  * or a negative error code
1180  */
alc_parse_auto_config(struct hda_codec *codec, const hda_nid_t *ignore_nids, const hda_nid_t *ssid_nids)1181 static int alc_parse_auto_config(struct hda_codec *codec,
1182 				 const hda_nid_t *ignore_nids,
1183 				 const hda_nid_t *ssid_nids)
1184 {
1185 	struct alc_spec *spec = codec->spec;
1186 	struct auto_pin_cfg *cfg = &spec->gen.autocfg;
1187 	int err;
1188 
1189 	err = snd_hda_parse_pin_defcfg(codec, cfg, ignore_nids,
1190 				       spec->parse_flags);
1191 	if (err < 0)
1192 		return err;
1193 
1194 	if (ssid_nids)
1195 		alc_ssid_check(codec, ssid_nids);
1196 
1197 	err = snd_hda_gen_parse_auto_config(codec, cfg);
1198 	if (err < 0)
1199 		return err;
1200 
1201 	return 1;
1202 }
1203 
1204 /* common preparation job for alc_spec */
alc_alloc_spec(struct hda_codec *codec, hda_nid_t mixer_nid)1205 static int alc_alloc_spec(struct hda_codec *codec, hda_nid_t mixer_nid)
1206 {
1207 	struct alc_spec *spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1208 	int err;
1209 
1210 	if (!spec)
1211 		return -ENOMEM;
1212 	codec->spec = spec;
1213 	snd_hda_gen_spec_init(&spec->gen);
1214 	spec->gen.mixer_nid = mixer_nid;
1215 	spec->gen.own_eapd_ctl = 1;
1216 	codec->single_adc_amp = 1;
1217 	/* FIXME: do we need this for all Realtek codec models? */
1218 	codec->spdif_status_reset = 1;
1219 	codec->forced_resume = 1;
1220 	codec->patch_ops = alc_patch_ops;
1221 	mutex_init(&spec->coef_mutex);
1222 
1223 	err = alc_codec_rename_from_preset(codec);
1224 	if (err < 0) {
1225 		kfree(spec);
1226 		return err;
1227 	}
1228 	return 0;
1229 }
1230 
alc880_parse_auto_config(struct hda_codec *codec)1231 static int alc880_parse_auto_config(struct hda_codec *codec)
1232 {
1233 	static const hda_nid_t alc880_ignore[] = { 0x1d, 0 };
1234 	static const hda_nid_t alc880_ssids[] = { 0x15, 0x1b, 0x14, 0 };
1235 	return alc_parse_auto_config(codec, alc880_ignore, alc880_ssids);
1236 }
1237 
1238 /*
1239  * ALC880 fix-ups
1240  */
1241 enum {
1242 	ALC880_FIXUP_GPIO1,
1243 	ALC880_FIXUP_GPIO2,
1244 	ALC880_FIXUP_MEDION_RIM,
1245 	ALC880_FIXUP_LG,
1246 	ALC880_FIXUP_LG_LW25,
1247 	ALC880_FIXUP_W810,
1248 	ALC880_FIXUP_EAPD_COEF,
1249 	ALC880_FIXUP_TCL_S700,
1250 	ALC880_FIXUP_VOL_KNOB,
1251 	ALC880_FIXUP_FUJITSU,
1252 	ALC880_FIXUP_F1734,
1253 	ALC880_FIXUP_UNIWILL,
1254 	ALC880_FIXUP_UNIWILL_DIG,
1255 	ALC880_FIXUP_Z71V,
1256 	ALC880_FIXUP_ASUS_W5A,
1257 	ALC880_FIXUP_3ST_BASE,
1258 	ALC880_FIXUP_3ST,
1259 	ALC880_FIXUP_3ST_DIG,
1260 	ALC880_FIXUP_5ST_BASE,
1261 	ALC880_FIXUP_5ST,
1262 	ALC880_FIXUP_5ST_DIG,
1263 	ALC880_FIXUP_6ST_BASE,
1264 	ALC880_FIXUP_6ST,
1265 	ALC880_FIXUP_6ST_DIG,
1266 	ALC880_FIXUP_6ST_AUTOMUTE,
1267 };
1268 
1269 /* enable the volume-knob widget support on NID 0x21 */
alc880_fixup_vol_knob(struct hda_codec *codec, const struct hda_fixup *fix, int action)1270 static void alc880_fixup_vol_knob(struct hda_codec *codec,
1271 				  const struct hda_fixup *fix, int action)
1272 {
1273 	if (action == HDA_FIXUP_ACT_PROBE)
1274 		snd_hda_jack_detect_enable_callback(codec, 0x21,
1275 						    alc_update_knob_master);
1276 }
1277 
1278 static const struct hda_fixup alc880_fixups[] = {
1279 	[ALC880_FIXUP_GPIO1] = {
1280 		.type = HDA_FIXUP_FUNC,
1281 		.v.func = alc_fixup_gpio1,
1282 	},
1283 	[ALC880_FIXUP_GPIO2] = {
1284 		.type = HDA_FIXUP_FUNC,
1285 		.v.func = alc_fixup_gpio2,
1286 	},
1287 	[ALC880_FIXUP_MEDION_RIM] = {
1288 		.type = HDA_FIXUP_VERBS,
1289 		.v.verbs = (const struct hda_verb[]) {
1290 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1291 			{ 0x20, AC_VERB_SET_PROC_COEF,  0x3060 },
1292 			{ }
1293 		},
1294 		.chained = true,
1295 		.chain_id = ALC880_FIXUP_GPIO2,
1296 	},
1297 	[ALC880_FIXUP_LG] = {
1298 		.type = HDA_FIXUP_PINS,
1299 		.v.pins = (const struct hda_pintbl[]) {
1300 			/* disable bogus unused pins */
1301 			{ 0x16, 0x411111f0 },
1302 			{ 0x18, 0x411111f0 },
1303 			{ 0x1a, 0x411111f0 },
1304 			{ }
1305 		}
1306 	},
1307 	[ALC880_FIXUP_LG_LW25] = {
1308 		.type = HDA_FIXUP_PINS,
1309 		.v.pins = (const struct hda_pintbl[]) {
1310 			{ 0x1a, 0x0181344f }, /* line-in */
1311 			{ 0x1b, 0x0321403f }, /* headphone */
1312 			{ }
1313 		}
1314 	},
1315 	[ALC880_FIXUP_W810] = {
1316 		.type = HDA_FIXUP_PINS,
1317 		.v.pins = (const struct hda_pintbl[]) {
1318 			/* disable bogus unused pins */
1319 			{ 0x17, 0x411111f0 },
1320 			{ }
1321 		},
1322 		.chained = true,
1323 		.chain_id = ALC880_FIXUP_GPIO2,
1324 	},
1325 	[ALC880_FIXUP_EAPD_COEF] = {
1326 		.type = HDA_FIXUP_VERBS,
1327 		.v.verbs = (const struct hda_verb[]) {
1328 			/* change to EAPD mode */
1329 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1330 			{ 0x20, AC_VERB_SET_PROC_COEF,  0x3060 },
1331 			{}
1332 		},
1333 	},
1334 	[ALC880_FIXUP_TCL_S700] = {
1335 		.type = HDA_FIXUP_VERBS,
1336 		.v.verbs = (const struct hda_verb[]) {
1337 			/* change to EAPD mode */
1338 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1339 			{ 0x20, AC_VERB_SET_PROC_COEF,  0x3070 },
1340 			{}
1341 		},
1342 		.chained = true,
1343 		.chain_id = ALC880_FIXUP_GPIO2,
1344 	},
1345 	[ALC880_FIXUP_VOL_KNOB] = {
1346 		.type = HDA_FIXUP_FUNC,
1347 		.v.func = alc880_fixup_vol_knob,
1348 	},
1349 	[ALC880_FIXUP_FUJITSU] = {
1350 		/* override all pins as BIOS on old Amilo is broken */
1351 		.type = HDA_FIXUP_PINS,
1352 		.v.pins = (const struct hda_pintbl[]) {
1353 			{ 0x14, 0x0121401f }, /* HP */
1354 			{ 0x15, 0x99030120 }, /* speaker */
1355 			{ 0x16, 0x99030130 }, /* bass speaker */
1356 			{ 0x17, 0x411111f0 }, /* N/A */
1357 			{ 0x18, 0x411111f0 }, /* N/A */
1358 			{ 0x19, 0x01a19950 }, /* mic-in */
1359 			{ 0x1a, 0x411111f0 }, /* N/A */
1360 			{ 0x1b, 0x411111f0 }, /* N/A */
1361 			{ 0x1c, 0x411111f0 }, /* N/A */
1362 			{ 0x1d, 0x411111f0 }, /* N/A */
1363 			{ 0x1e, 0x01454140 }, /* SPDIF out */
1364 			{ }
1365 		},
1366 		.chained = true,
1367 		.chain_id = ALC880_FIXUP_VOL_KNOB,
1368 	},
1369 	[ALC880_FIXUP_F1734] = {
1370 		/* almost compatible with FUJITSU, but no bass and SPDIF */
1371 		.type = HDA_FIXUP_PINS,
1372 		.v.pins = (const struct hda_pintbl[]) {
1373 			{ 0x14, 0x0121401f }, /* HP */
1374 			{ 0x15, 0x99030120 }, /* speaker */
1375 			{ 0x16, 0x411111f0 }, /* N/A */
1376 			{ 0x17, 0x411111f0 }, /* N/A */
1377 			{ 0x18, 0x411111f0 }, /* N/A */
1378 			{ 0x19, 0x01a19950 }, /* mic-in */
1379 			{ 0x1a, 0x411111f0 }, /* N/A */
1380 			{ 0x1b, 0x411111f0 }, /* N/A */
1381 			{ 0x1c, 0x411111f0 }, /* N/A */
1382 			{ 0x1d, 0x411111f0 }, /* N/A */
1383 			{ 0x1e, 0x411111f0 }, /* N/A */
1384 			{ }
1385 		},
1386 		.chained = true,
1387 		.chain_id = ALC880_FIXUP_VOL_KNOB,
1388 	},
1389 	[ALC880_FIXUP_UNIWILL] = {
1390 		/* need to fix HP and speaker pins to be parsed correctly */
1391 		.type = HDA_FIXUP_PINS,
1392 		.v.pins = (const struct hda_pintbl[]) {
1393 			{ 0x14, 0x0121411f }, /* HP */
1394 			{ 0x15, 0x99030120 }, /* speaker */
1395 			{ 0x16, 0x99030130 }, /* bass speaker */
1396 			{ }
1397 		},
1398 	},
1399 	[ALC880_FIXUP_UNIWILL_DIG] = {
1400 		.type = HDA_FIXUP_PINS,
1401 		.v.pins = (const struct hda_pintbl[]) {
1402 			/* disable bogus unused pins */
1403 			{ 0x17, 0x411111f0 },
1404 			{ 0x19, 0x411111f0 },
1405 			{ 0x1b, 0x411111f0 },
1406 			{ 0x1f, 0x411111f0 },
1407 			{ }
1408 		}
1409 	},
1410 	[ALC880_FIXUP_Z71V] = {
1411 		.type = HDA_FIXUP_PINS,
1412 		.v.pins = (const struct hda_pintbl[]) {
1413 			/* set up the whole pins as BIOS is utterly broken */
1414 			{ 0x14, 0x99030120 }, /* speaker */
1415 			{ 0x15, 0x0121411f }, /* HP */
1416 			{ 0x16, 0x411111f0 }, /* N/A */
1417 			{ 0x17, 0x411111f0 }, /* N/A */
1418 			{ 0x18, 0x01a19950 }, /* mic-in */
1419 			{ 0x19, 0x411111f0 }, /* N/A */
1420 			{ 0x1a, 0x01813031 }, /* line-in */
1421 			{ 0x1b, 0x411111f0 }, /* N/A */
1422 			{ 0x1c, 0x411111f0 }, /* N/A */
1423 			{ 0x1d, 0x411111f0 }, /* N/A */
1424 			{ 0x1e, 0x0144111e }, /* SPDIF */
1425 			{ }
1426 		}
1427 	},
1428 	[ALC880_FIXUP_ASUS_W5A] = {
1429 		.type = HDA_FIXUP_PINS,
1430 		.v.pins = (const struct hda_pintbl[]) {
1431 			/* set up the whole pins as BIOS is utterly broken */
1432 			{ 0x14, 0x0121411f }, /* HP */
1433 			{ 0x15, 0x411111f0 }, /* N/A */
1434 			{ 0x16, 0x411111f0 }, /* N/A */
1435 			{ 0x17, 0x411111f0 }, /* N/A */
1436 			{ 0x18, 0x90a60160 }, /* mic */
1437 			{ 0x19, 0x411111f0 }, /* N/A */
1438 			{ 0x1a, 0x411111f0 }, /* N/A */
1439 			{ 0x1b, 0x411111f0 }, /* N/A */
1440 			{ 0x1c, 0x411111f0 }, /* N/A */
1441 			{ 0x1d, 0x411111f0 }, /* N/A */
1442 			{ 0x1e, 0xb743111e }, /* SPDIF out */
1443 			{ }
1444 		},
1445 		.chained = true,
1446 		.chain_id = ALC880_FIXUP_GPIO1,
1447 	},
1448 	[ALC880_FIXUP_3ST_BASE] = {
1449 		.type = HDA_FIXUP_PINS,
1450 		.v.pins = (const struct hda_pintbl[]) {
1451 			{ 0x14, 0x01014010 }, /* line-out */
1452 			{ 0x15, 0x411111f0 }, /* N/A */
1453 			{ 0x16, 0x411111f0 }, /* N/A */
1454 			{ 0x17, 0x411111f0 }, /* N/A */
1455 			{ 0x18, 0x01a19c30 }, /* mic-in */
1456 			{ 0x19, 0x0121411f }, /* HP */
1457 			{ 0x1a, 0x01813031 }, /* line-in */
1458 			{ 0x1b, 0x02a19c40 }, /* front-mic */
1459 			{ 0x1c, 0x411111f0 }, /* N/A */
1460 			{ 0x1d, 0x411111f0 }, /* N/A */
1461 			/* 0x1e is filled in below */
1462 			{ 0x1f, 0x411111f0 }, /* N/A */
1463 			{ }
1464 		}
1465 	},
1466 	[ALC880_FIXUP_3ST] = {
1467 		.type = HDA_FIXUP_PINS,
1468 		.v.pins = (const struct hda_pintbl[]) {
1469 			{ 0x1e, 0x411111f0 }, /* N/A */
1470 			{ }
1471 		},
1472 		.chained = true,
1473 		.chain_id = ALC880_FIXUP_3ST_BASE,
1474 	},
1475 	[ALC880_FIXUP_3ST_DIG] = {
1476 		.type = HDA_FIXUP_PINS,
1477 		.v.pins = (const struct hda_pintbl[]) {
1478 			{ 0x1e, 0x0144111e }, /* SPDIF */
1479 			{ }
1480 		},
1481 		.chained = true,
1482 		.chain_id = ALC880_FIXUP_3ST_BASE,
1483 	},
1484 	[ALC880_FIXUP_5ST_BASE] = {
1485 		.type = HDA_FIXUP_PINS,
1486 		.v.pins = (const struct hda_pintbl[]) {
1487 			{ 0x14, 0x01014010 }, /* front */
1488 			{ 0x15, 0x411111f0 }, /* N/A */
1489 			{ 0x16, 0x01011411 }, /* CLFE */
1490 			{ 0x17, 0x01016412 }, /* surr */
1491 			{ 0x18, 0x01a19c30 }, /* mic-in */
1492 			{ 0x19, 0x0121411f }, /* HP */
1493 			{ 0x1a, 0x01813031 }, /* line-in */
1494 			{ 0x1b, 0x02a19c40 }, /* front-mic */
1495 			{ 0x1c, 0x411111f0 }, /* N/A */
1496 			{ 0x1d, 0x411111f0 }, /* N/A */
1497 			/* 0x1e is filled in below */
1498 			{ 0x1f, 0x411111f0 }, /* N/A */
1499 			{ }
1500 		}
1501 	},
1502 	[ALC880_FIXUP_5ST] = {
1503 		.type = HDA_FIXUP_PINS,
1504 		.v.pins = (const struct hda_pintbl[]) {
1505 			{ 0x1e, 0x411111f0 }, /* N/A */
1506 			{ }
1507 		},
1508 		.chained = true,
1509 		.chain_id = ALC880_FIXUP_5ST_BASE,
1510 	},
1511 	[ALC880_FIXUP_5ST_DIG] = {
1512 		.type = HDA_FIXUP_PINS,
1513 		.v.pins = (const struct hda_pintbl[]) {
1514 			{ 0x1e, 0x0144111e }, /* SPDIF */
1515 			{ }
1516 		},
1517 		.chained = true,
1518 		.chain_id = ALC880_FIXUP_5ST_BASE,
1519 	},
1520 	[ALC880_FIXUP_6ST_BASE] = {
1521 		.type = HDA_FIXUP_PINS,
1522 		.v.pins = (const struct hda_pintbl[]) {
1523 			{ 0x14, 0x01014010 }, /* front */
1524 			{ 0x15, 0x01016412 }, /* surr */
1525 			{ 0x16, 0x01011411 }, /* CLFE */
1526 			{ 0x17, 0x01012414 }, /* side */
1527 			{ 0x18, 0x01a19c30 }, /* mic-in */
1528 			{ 0x19, 0x02a19c40 }, /* front-mic */
1529 			{ 0x1a, 0x01813031 }, /* line-in */
1530 			{ 0x1b, 0x0121411f }, /* HP */
1531 			{ 0x1c, 0x411111f0 }, /* N/A */
1532 			{ 0x1d, 0x411111f0 }, /* N/A */
1533 			/* 0x1e is filled in below */
1534 			{ 0x1f, 0x411111f0 }, /* N/A */
1535 			{ }
1536 		}
1537 	},
1538 	[ALC880_FIXUP_6ST] = {
1539 		.type = HDA_FIXUP_PINS,
1540 		.v.pins = (const struct hda_pintbl[]) {
1541 			{ 0x1e, 0x411111f0 }, /* N/A */
1542 			{ }
1543 		},
1544 		.chained = true,
1545 		.chain_id = ALC880_FIXUP_6ST_BASE,
1546 	},
1547 	[ALC880_FIXUP_6ST_DIG] = {
1548 		.type = HDA_FIXUP_PINS,
1549 		.v.pins = (const struct hda_pintbl[]) {
1550 			{ 0x1e, 0x0144111e }, /* SPDIF */
1551 			{ }
1552 		},
1553 		.chained = true,
1554 		.chain_id = ALC880_FIXUP_6ST_BASE,
1555 	},
1556 	[ALC880_FIXUP_6ST_AUTOMUTE] = {
1557 		.type = HDA_FIXUP_PINS,
1558 		.v.pins = (const struct hda_pintbl[]) {
1559 			{ 0x1b, 0x0121401f }, /* HP with jack detect */
1560 			{ }
1561 		},
1562 		.chained_before = true,
1563 		.chain_id = ALC880_FIXUP_6ST_BASE,
1564 	},
1565 };
1566 
1567 static const struct snd_pci_quirk alc880_fixup_tbl[] = {
1568 	SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_FIXUP_W810),
1569 	SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS W5A", ALC880_FIXUP_ASUS_W5A),
1570 	SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_FIXUP_Z71V),
1571 	SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_FIXUP_GPIO1),
1572 	SND_PCI_QUIRK(0x147b, 0x1045, "ABit AA8XE", ALC880_FIXUP_6ST_AUTOMUTE),
1573 	SND_PCI_QUIRK(0x1558, 0x5401, "Clevo GPIO2", ALC880_FIXUP_GPIO2),
1574 	SND_PCI_QUIRK_VENDOR(0x1558, "Clevo", ALC880_FIXUP_EAPD_COEF),
1575 	SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_FIXUP_UNIWILL_DIG),
1576 	SND_PCI_QUIRK(0x1584, 0x9054, "Uniwill", ALC880_FIXUP_F1734),
1577 	SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_FIXUP_UNIWILL),
1578 	SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_FIXUP_VOL_KNOB),
1579 	SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_FIXUP_W810),
1580 	SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_FIXUP_MEDION_RIM),
1581 	SND_PCI_QUIRK(0x1631, 0xe011, "PB 13201056", ALC880_FIXUP_6ST_AUTOMUTE),
1582 	SND_PCI_QUIRK(0x1734, 0x107c, "FSC Amilo M1437", ALC880_FIXUP_FUJITSU),
1583 	SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FIXUP_FUJITSU),
1584 	SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_FIXUP_F1734),
1585 	SND_PCI_QUIRK(0x1734, 0x10b0, "FSC Amilo Pi1556", ALC880_FIXUP_FUJITSU),
1586 	SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_FIXUP_LG),
1587 	SND_PCI_QUIRK(0x1854, 0x005f, "LG P1 Express", ALC880_FIXUP_LG),
1588 	SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_FIXUP_LG),
1589 	SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_FIXUP_LG_LW25),
1590 	SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_FIXUP_TCL_S700),
1591 
1592 	/* Below is the copied entries from alc880_quirks.c.
1593 	 * It's not quite sure whether BIOS sets the correct pin-config table
1594 	 * on these machines, thus they are kept to be compatible with
1595 	 * the old static quirks.  Once when it's confirmed to work without
1596 	 * these overrides, it'd be better to remove.
1597 	 */
1598 	SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_FIXUP_5ST_DIG),
1599 	SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_FIXUP_6ST),
1600 	SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_FIXUP_3ST_DIG),
1601 	SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_FIXUP_6ST_DIG),
1602 	SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_FIXUP_6ST_DIG),
1603 	SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_FIXUP_6ST_DIG),
1604 	SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_FIXUP_3ST_DIG),
1605 	SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_FIXUP_3ST),
1606 	SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_FIXUP_6ST_DIG),
1607 	SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_FIXUP_3ST),
1608 	SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_FIXUP_3ST),
1609 	SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_FIXUP_5ST),
1610 	SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_FIXUP_5ST),
1611 	SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_FIXUP_5ST),
1612 	SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_FIXUP_6ST_DIG),
1613 	SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_FIXUP_6ST_DIG),
1614 	SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_FIXUP_6ST_DIG),
1615 	SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_FIXUP_6ST_DIG),
1616 	SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_FIXUP_5ST_DIG),
1617 	SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_FIXUP_5ST_DIG),
1618 	SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_FIXUP_5ST_DIG),
1619 	SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_FIXUP_6ST_DIG), /* broken BIOS */
1620 	SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_FIXUP_6ST_DIG),
1621 	SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1622 	SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1623 	SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1624 	SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1625 	SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1626 	SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1627 	SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1628 	SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1629 	SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1630 	SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1631 	/* default Intel */
1632 	SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_FIXUP_3ST),
1633 	SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_FIXUP_5ST_DIG),
1634 	SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_FIXUP_6ST_DIG),
1635 	{}
1636 };
1637 
1638 static const struct hda_model_fixup alc880_fixup_models[] = {
1639 	{.id = ALC880_FIXUP_3ST, .name = "3stack"},
1640 	{.id = ALC880_FIXUP_3ST_DIG, .name = "3stack-digout"},
1641 	{.id = ALC880_FIXUP_5ST, .name = "5stack"},
1642 	{.id = ALC880_FIXUP_5ST_DIG, .name = "5stack-digout"},
1643 	{.id = ALC880_FIXUP_6ST, .name = "6stack"},
1644 	{.id = ALC880_FIXUP_6ST_DIG, .name = "6stack-digout"},
1645 	{.id = ALC880_FIXUP_6ST_AUTOMUTE, .name = "6stack-automute"},
1646 	{}
1647 };
1648 
1649 
1650 /*
1651  * OK, here we have finally the patch for ALC880
1652  */
patch_alc880(struct hda_codec *codec)1653 static int patch_alc880(struct hda_codec *codec)
1654 {
1655 	struct alc_spec *spec;
1656 	int err;
1657 
1658 	err = alc_alloc_spec(codec, 0x0b);
1659 	if (err < 0)
1660 		return err;
1661 
1662 	spec = codec->spec;
1663 	spec->gen.need_dac_fix = 1;
1664 	spec->gen.beep_nid = 0x01;
1665 
1666 	codec->patch_ops.unsol_event = alc880_unsol_event;
1667 
1668 	alc_pre_init(codec);
1669 
1670 	snd_hda_pick_fixup(codec, alc880_fixup_models, alc880_fixup_tbl,
1671 		       alc880_fixups);
1672 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1673 
1674 	/* automatic parse from the BIOS config */
1675 	err = alc880_parse_auto_config(codec);
1676 	if (err < 0)
1677 		goto error;
1678 
1679 	if (!spec->gen.no_analog) {
1680 		err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
1681 		if (err < 0)
1682 			goto error;
1683 	}
1684 
1685 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
1686 
1687 	return 0;
1688 
1689  error:
1690 	alc_free(codec);
1691 	return err;
1692 }
1693 
1694 
1695 /*
1696  * ALC260 support
1697  */
alc260_parse_auto_config(struct hda_codec *codec)1698 static int alc260_parse_auto_config(struct hda_codec *codec)
1699 {
1700 	static const hda_nid_t alc260_ignore[] = { 0x17, 0 };
1701 	static const hda_nid_t alc260_ssids[] = { 0x10, 0x15, 0x0f, 0 };
1702 	return alc_parse_auto_config(codec, alc260_ignore, alc260_ssids);
1703 }
1704 
1705 /*
1706  * Pin config fixes
1707  */
1708 enum {
1709 	ALC260_FIXUP_HP_DC5750,
1710 	ALC260_FIXUP_HP_PIN_0F,
1711 	ALC260_FIXUP_COEF,
1712 	ALC260_FIXUP_GPIO1,
1713 	ALC260_FIXUP_GPIO1_TOGGLE,
1714 	ALC260_FIXUP_REPLACER,
1715 	ALC260_FIXUP_HP_B1900,
1716 	ALC260_FIXUP_KN1,
1717 	ALC260_FIXUP_FSC_S7020,
1718 	ALC260_FIXUP_FSC_S7020_JWSE,
1719 	ALC260_FIXUP_VAIO_PINS,
1720 };
1721 
alc260_gpio1_automute(struct hda_codec *codec)1722 static void alc260_gpio1_automute(struct hda_codec *codec)
1723 {
1724 	struct alc_spec *spec = codec->spec;
1725 
1726 	alc_update_gpio_data(codec, 0x01, spec->gen.hp_jack_present);
1727 }
1728 
alc260_fixup_gpio1_toggle(struct hda_codec *codec, const struct hda_fixup *fix, int action)1729 static void alc260_fixup_gpio1_toggle(struct hda_codec *codec,
1730 				      const struct hda_fixup *fix, int action)
1731 {
1732 	struct alc_spec *spec = codec->spec;
1733 	if (action == HDA_FIXUP_ACT_PROBE) {
1734 		/* although the machine has only one output pin, we need to
1735 		 * toggle GPIO1 according to the jack state
1736 		 */
1737 		spec->gen.automute_hook = alc260_gpio1_automute;
1738 		spec->gen.detect_hp = 1;
1739 		spec->gen.automute_speaker = 1;
1740 		spec->gen.autocfg.hp_pins[0] = 0x0f; /* copy it for automute */
1741 		snd_hda_jack_detect_enable_callback(codec, 0x0f,
1742 						    snd_hda_gen_hp_automute);
1743 		alc_setup_gpio(codec, 0x01);
1744 	}
1745 }
1746 
alc260_fixup_kn1(struct hda_codec *codec, const struct hda_fixup *fix, int action)1747 static void alc260_fixup_kn1(struct hda_codec *codec,
1748 			     const struct hda_fixup *fix, int action)
1749 {
1750 	struct alc_spec *spec = codec->spec;
1751 	static const struct hda_pintbl pincfgs[] = {
1752 		{ 0x0f, 0x02214000 }, /* HP/speaker */
1753 		{ 0x12, 0x90a60160 }, /* int mic */
1754 		{ 0x13, 0x02a19000 }, /* ext mic */
1755 		{ 0x18, 0x01446000 }, /* SPDIF out */
1756 		/* disable bogus I/O pins */
1757 		{ 0x10, 0x411111f0 },
1758 		{ 0x11, 0x411111f0 },
1759 		{ 0x14, 0x411111f0 },
1760 		{ 0x15, 0x411111f0 },
1761 		{ 0x16, 0x411111f0 },
1762 		{ 0x17, 0x411111f0 },
1763 		{ 0x19, 0x411111f0 },
1764 		{ }
1765 	};
1766 
1767 	switch (action) {
1768 	case HDA_FIXUP_ACT_PRE_PROBE:
1769 		snd_hda_apply_pincfgs(codec, pincfgs);
1770 		spec->init_amp = ALC_INIT_NONE;
1771 		break;
1772 	}
1773 }
1774 
alc260_fixup_fsc_s7020(struct hda_codec *codec, const struct hda_fixup *fix, int action)1775 static void alc260_fixup_fsc_s7020(struct hda_codec *codec,
1776 				   const struct hda_fixup *fix, int action)
1777 {
1778 	struct alc_spec *spec = codec->spec;
1779 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
1780 		spec->init_amp = ALC_INIT_NONE;
1781 }
1782 
alc260_fixup_fsc_s7020_jwse(struct hda_codec *codec, const struct hda_fixup *fix, int action)1783 static void alc260_fixup_fsc_s7020_jwse(struct hda_codec *codec,
1784 				   const struct hda_fixup *fix, int action)
1785 {
1786 	struct alc_spec *spec = codec->spec;
1787 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1788 		spec->gen.add_jack_modes = 1;
1789 		spec->gen.hp_mic = 1;
1790 	}
1791 }
1792 
1793 static const struct hda_fixup alc260_fixups[] = {
1794 	[ALC260_FIXUP_HP_DC5750] = {
1795 		.type = HDA_FIXUP_PINS,
1796 		.v.pins = (const struct hda_pintbl[]) {
1797 			{ 0x11, 0x90130110 }, /* speaker */
1798 			{ }
1799 		}
1800 	},
1801 	[ALC260_FIXUP_HP_PIN_0F] = {
1802 		.type = HDA_FIXUP_PINS,
1803 		.v.pins = (const struct hda_pintbl[]) {
1804 			{ 0x0f, 0x01214000 }, /* HP */
1805 			{ }
1806 		}
1807 	},
1808 	[ALC260_FIXUP_COEF] = {
1809 		.type = HDA_FIXUP_VERBS,
1810 		.v.verbs = (const struct hda_verb[]) {
1811 			{ 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1812 			{ 0x1a, AC_VERB_SET_PROC_COEF,  0x3040 },
1813 			{ }
1814 		},
1815 	},
1816 	[ALC260_FIXUP_GPIO1] = {
1817 		.type = HDA_FIXUP_FUNC,
1818 		.v.func = alc_fixup_gpio1,
1819 	},
1820 	[ALC260_FIXUP_GPIO1_TOGGLE] = {
1821 		.type = HDA_FIXUP_FUNC,
1822 		.v.func = alc260_fixup_gpio1_toggle,
1823 		.chained = true,
1824 		.chain_id = ALC260_FIXUP_HP_PIN_0F,
1825 	},
1826 	[ALC260_FIXUP_REPLACER] = {
1827 		.type = HDA_FIXUP_VERBS,
1828 		.v.verbs = (const struct hda_verb[]) {
1829 			{ 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1830 			{ 0x1a, AC_VERB_SET_PROC_COEF,  0x3050 },
1831 			{ }
1832 		},
1833 		.chained = true,
1834 		.chain_id = ALC260_FIXUP_GPIO1_TOGGLE,
1835 	},
1836 	[ALC260_FIXUP_HP_B1900] = {
1837 		.type = HDA_FIXUP_FUNC,
1838 		.v.func = alc260_fixup_gpio1_toggle,
1839 		.chained = true,
1840 		.chain_id = ALC260_FIXUP_COEF,
1841 	},
1842 	[ALC260_FIXUP_KN1] = {
1843 		.type = HDA_FIXUP_FUNC,
1844 		.v.func = alc260_fixup_kn1,
1845 	},
1846 	[ALC260_FIXUP_FSC_S7020] = {
1847 		.type = HDA_FIXUP_FUNC,
1848 		.v.func = alc260_fixup_fsc_s7020,
1849 	},
1850 	[ALC260_FIXUP_FSC_S7020_JWSE] = {
1851 		.type = HDA_FIXUP_FUNC,
1852 		.v.func = alc260_fixup_fsc_s7020_jwse,
1853 		.chained = true,
1854 		.chain_id = ALC260_FIXUP_FSC_S7020,
1855 	},
1856 	[ALC260_FIXUP_VAIO_PINS] = {
1857 		.type = HDA_FIXUP_PINS,
1858 		.v.pins = (const struct hda_pintbl[]) {
1859 			/* Pin configs are missing completely on some VAIOs */
1860 			{ 0x0f, 0x01211020 },
1861 			{ 0x10, 0x0001003f },
1862 			{ 0x11, 0x411111f0 },
1863 			{ 0x12, 0x01a15930 },
1864 			{ 0x13, 0x411111f0 },
1865 			{ 0x14, 0x411111f0 },
1866 			{ 0x15, 0x411111f0 },
1867 			{ 0x16, 0x411111f0 },
1868 			{ 0x17, 0x411111f0 },
1869 			{ 0x18, 0x411111f0 },
1870 			{ 0x19, 0x411111f0 },
1871 			{ }
1872 		}
1873 	},
1874 };
1875 
1876 static const struct snd_pci_quirk alc260_fixup_tbl[] = {
1877 	SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_FIXUP_GPIO1),
1878 	SND_PCI_QUIRK(0x1025, 0x007f, "Acer Aspire 9500", ALC260_FIXUP_COEF),
1879 	SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_FIXUP_GPIO1),
1880 	SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", ALC260_FIXUP_HP_DC5750),
1881 	SND_PCI_QUIRK(0x103c, 0x30ba, "HP Presario B1900", ALC260_FIXUP_HP_B1900),
1882 	SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_FIXUP_VAIO_PINS),
1883 	SND_PCI_QUIRK(0x104d, 0x81e2, "Sony VAIO TX", ALC260_FIXUP_HP_PIN_0F),
1884 	SND_PCI_QUIRK(0x10cf, 0x1326, "FSC LifeBook S7020", ALC260_FIXUP_FSC_S7020),
1885 	SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FIXUP_GPIO1),
1886 	SND_PCI_QUIRK(0x152d, 0x0729, "Quanta KN1", ALC260_FIXUP_KN1),
1887 	SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_FIXUP_REPLACER),
1888 	SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_FIXUP_COEF),
1889 	{}
1890 };
1891 
1892 static const struct hda_model_fixup alc260_fixup_models[] = {
1893 	{.id = ALC260_FIXUP_GPIO1, .name = "gpio1"},
1894 	{.id = ALC260_FIXUP_COEF, .name = "coef"},
1895 	{.id = ALC260_FIXUP_FSC_S7020, .name = "fujitsu"},
1896 	{.id = ALC260_FIXUP_FSC_S7020_JWSE, .name = "fujitsu-jwse"},
1897 	{}
1898 };
1899 
1900 /*
1901  */
patch_alc260(struct hda_codec *codec)1902 static int patch_alc260(struct hda_codec *codec)
1903 {
1904 	struct alc_spec *spec;
1905 	int err;
1906 
1907 	err = alc_alloc_spec(codec, 0x07);
1908 	if (err < 0)
1909 		return err;
1910 
1911 	spec = codec->spec;
1912 	/* as quite a few machines require HP amp for speaker outputs,
1913 	 * it's easier to enable it unconditionally; even if it's unneeded,
1914 	 * it's almost harmless.
1915 	 */
1916 	spec->gen.prefer_hp_amp = 1;
1917 	spec->gen.beep_nid = 0x01;
1918 
1919 	spec->shutup = alc_eapd_shutup;
1920 
1921 	alc_pre_init(codec);
1922 
1923 	snd_hda_pick_fixup(codec, alc260_fixup_models, alc260_fixup_tbl,
1924 			   alc260_fixups);
1925 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1926 
1927 	/* automatic parse from the BIOS config */
1928 	err = alc260_parse_auto_config(codec);
1929 	if (err < 0)
1930 		goto error;
1931 
1932 	if (!spec->gen.no_analog) {
1933 		err = set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
1934 		if (err < 0)
1935 			goto error;
1936 	}
1937 
1938 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
1939 
1940 	return 0;
1941 
1942  error:
1943 	alc_free(codec);
1944 	return err;
1945 }
1946 
1947 
1948 /*
1949  * ALC882/883/885/888/889 support
1950  *
1951  * ALC882 is almost identical with ALC880 but has cleaner and more flexible
1952  * configuration.  Each pin widget can choose any input DACs and a mixer.
1953  * Each ADC is connected from a mixer of all inputs.  This makes possible
1954  * 6-channel independent captures.
1955  *
1956  * In addition, an independent DAC for the multi-playback (not used in this
1957  * driver yet).
1958  */
1959 
1960 /*
1961  * Pin config fixes
1962  */
1963 enum {
1964 	ALC882_FIXUP_ABIT_AW9D_MAX,
1965 	ALC882_FIXUP_LENOVO_Y530,
1966 	ALC882_FIXUP_PB_M5210,
1967 	ALC882_FIXUP_ACER_ASPIRE_7736,
1968 	ALC882_FIXUP_ASUS_W90V,
1969 	ALC889_FIXUP_CD,
1970 	ALC889_FIXUP_FRONT_HP_NO_PRESENCE,
1971 	ALC889_FIXUP_VAIO_TT,
1972 	ALC888_FIXUP_EEE1601,
1973 	ALC886_FIXUP_EAPD,
1974 	ALC882_FIXUP_EAPD,
1975 	ALC883_FIXUP_EAPD,
1976 	ALC883_FIXUP_ACER_EAPD,
1977 	ALC882_FIXUP_GPIO1,
1978 	ALC882_FIXUP_GPIO2,
1979 	ALC882_FIXUP_GPIO3,
1980 	ALC889_FIXUP_COEF,
1981 	ALC882_FIXUP_ASUS_W2JC,
1982 	ALC882_FIXUP_ACER_ASPIRE_4930G,
1983 	ALC882_FIXUP_ACER_ASPIRE_8930G,
1984 	ALC882_FIXUP_ASPIRE_8930G_VERBS,
1985 	ALC885_FIXUP_MACPRO_GPIO,
1986 	ALC889_FIXUP_DAC_ROUTE,
1987 	ALC889_FIXUP_MBP_VREF,
1988 	ALC889_FIXUP_IMAC91_VREF,
1989 	ALC889_FIXUP_MBA11_VREF,
1990 	ALC889_FIXUP_MBA21_VREF,
1991 	ALC889_FIXUP_MP11_VREF,
1992 	ALC889_FIXUP_MP41_VREF,
1993 	ALC882_FIXUP_INV_DMIC,
1994 	ALC882_FIXUP_NO_PRIMARY_HP,
1995 	ALC887_FIXUP_ASUS_BASS,
1996 	ALC887_FIXUP_BASS_CHMAP,
1997 	ALC1220_FIXUP_GB_DUAL_CODECS,
1998 	ALC1220_FIXUP_GB_X570,
1999 	ALC1220_FIXUP_CLEVO_P950,
2000 	ALC1220_FIXUP_CLEVO_PB51ED,
2001 	ALC1220_FIXUP_CLEVO_PB51ED_PINS,
2002 	ALC887_FIXUP_ASUS_AUDIO,
2003 	ALC887_FIXUP_ASUS_HMIC,
2004 	ALCS1200A_FIXUP_MIC_VREF,
2005 	ALC888VD_FIXUP_MIC_100VREF,
2006 };
2007 
alc889_fixup_coef(struct hda_codec *codec, const struct hda_fixup *fix, int action)2008 static void alc889_fixup_coef(struct hda_codec *codec,
2009 			      const struct hda_fixup *fix, int action)
2010 {
2011 	if (action != HDA_FIXUP_ACT_INIT)
2012 		return;
2013 	alc_update_coef_idx(codec, 7, 0, 0x2030);
2014 }
2015 
2016 /* set up GPIO at initialization */
alc885_fixup_macpro_gpio(struct hda_codec *codec, const struct hda_fixup *fix, int action)2017 static void alc885_fixup_macpro_gpio(struct hda_codec *codec,
2018 				     const struct hda_fixup *fix, int action)
2019 {
2020 	struct alc_spec *spec = codec->spec;
2021 
2022 	spec->gpio_write_delay = true;
2023 	alc_fixup_gpio3(codec, fix, action);
2024 }
2025 
2026 /* Fix the connection of some pins for ALC889:
2027  * At least, Acer Aspire 5935 shows the connections to DAC3/4 don't
2028  * work correctly (bko#42740)
2029  */
alc889_fixup_dac_route(struct hda_codec *codec, const struct hda_fixup *fix, int action)2030 static void alc889_fixup_dac_route(struct hda_codec *codec,
2031 				   const struct hda_fixup *fix, int action)
2032 {
2033 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2034 		/* fake the connections during parsing the tree */
2035 		static const hda_nid_t conn1[] = { 0x0c, 0x0d };
2036 		static const hda_nid_t conn2[] = { 0x0e, 0x0f };
2037 		snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2038 		snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
2039 		snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn2), conn2);
2040 		snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn2), conn2);
2041 	} else if (action == HDA_FIXUP_ACT_PROBE) {
2042 		/* restore the connections */
2043 		static const hda_nid_t conn[] = { 0x0c, 0x0d, 0x0e, 0x0f, 0x26 };
2044 		snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
2045 		snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn), conn);
2046 		snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn), conn);
2047 		snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn), conn);
2048 	}
2049 }
2050 
2051 /* Set VREF on HP pin */
alc889_fixup_mbp_vref(struct hda_codec *codec, const struct hda_fixup *fix, int action)2052 static void alc889_fixup_mbp_vref(struct hda_codec *codec,
2053 				  const struct hda_fixup *fix, int action)
2054 {
2055 	static const hda_nid_t nids[] = { 0x14, 0x15, 0x19 };
2056 	struct alc_spec *spec = codec->spec;
2057 	int i;
2058 
2059 	if (action != HDA_FIXUP_ACT_INIT)
2060 		return;
2061 	for (i = 0; i < ARRAY_SIZE(nids); i++) {
2062 		unsigned int val = snd_hda_codec_get_pincfg(codec, nids[i]);
2063 		if (get_defcfg_device(val) != AC_JACK_HP_OUT)
2064 			continue;
2065 		val = snd_hda_codec_get_pin_target(codec, nids[i]);
2066 		val |= AC_PINCTL_VREF_80;
2067 		snd_hda_set_pin_ctl(codec, nids[i], val);
2068 		spec->gen.keep_vref_in_automute = 1;
2069 		break;
2070 	}
2071 }
2072 
alc889_fixup_mac_pins(struct hda_codec *codec, const hda_nid_t *nids, int num_nids)2073 static void alc889_fixup_mac_pins(struct hda_codec *codec,
2074 				  const hda_nid_t *nids, int num_nids)
2075 {
2076 	struct alc_spec *spec = codec->spec;
2077 	int i;
2078 
2079 	for (i = 0; i < num_nids; i++) {
2080 		unsigned int val;
2081 		val = snd_hda_codec_get_pin_target(codec, nids[i]);
2082 		val |= AC_PINCTL_VREF_50;
2083 		snd_hda_set_pin_ctl(codec, nids[i], val);
2084 	}
2085 	spec->gen.keep_vref_in_automute = 1;
2086 }
2087 
2088 /* Set VREF on speaker pins on imac91 */
alc889_fixup_imac91_vref(struct hda_codec *codec, const struct hda_fixup *fix, int action)2089 static void alc889_fixup_imac91_vref(struct hda_codec *codec,
2090 				     const struct hda_fixup *fix, int action)
2091 {
2092 	static const hda_nid_t nids[] = { 0x18, 0x1a };
2093 
2094 	if (action == HDA_FIXUP_ACT_INIT)
2095 		alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2096 }
2097 
2098 /* Set VREF on speaker pins on mba11 */
alc889_fixup_mba11_vref(struct hda_codec *codec, const struct hda_fixup *fix, int action)2099 static void alc889_fixup_mba11_vref(struct hda_codec *codec,
2100 				    const struct hda_fixup *fix, int action)
2101 {
2102 	static const hda_nid_t nids[] = { 0x18 };
2103 
2104 	if (action == HDA_FIXUP_ACT_INIT)
2105 		alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2106 }
2107 
2108 /* Set VREF on speaker pins on mba21 */
alc889_fixup_mba21_vref(struct hda_codec *codec, const struct hda_fixup *fix, int action)2109 static void alc889_fixup_mba21_vref(struct hda_codec *codec,
2110 				    const struct hda_fixup *fix, int action)
2111 {
2112 	static const hda_nid_t nids[] = { 0x18, 0x19 };
2113 
2114 	if (action == HDA_FIXUP_ACT_INIT)
2115 		alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2116 }
2117 
2118 /* Don't take HP output as primary
2119  * Strangely, the speaker output doesn't work on Vaio Z and some Vaio
2120  * all-in-one desktop PCs (for example VGC-LN51JGB) through DAC 0x05
2121  */
alc882_fixup_no_primary_hp(struct hda_codec *codec, const struct hda_fixup *fix, int action)2122 static void alc882_fixup_no_primary_hp(struct hda_codec *codec,
2123 				       const struct hda_fixup *fix, int action)
2124 {
2125 	struct alc_spec *spec = codec->spec;
2126 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2127 		spec->gen.no_primary_hp = 1;
2128 		spec->gen.no_multi_io = 1;
2129 	}
2130 }
2131 
2132 static void alc_fixup_bass_chmap(struct hda_codec *codec,
2133 				 const struct hda_fixup *fix, int action);
2134 
2135 /* For dual-codec configuration, we need to disable some features to avoid
2136  * conflicts of kctls and PCM streams
2137  */
alc_fixup_dual_codecs(struct hda_codec *codec, const struct hda_fixup *fix, int action)2138 static void alc_fixup_dual_codecs(struct hda_codec *codec,
2139 				  const struct hda_fixup *fix, int action)
2140 {
2141 	struct alc_spec *spec = codec->spec;
2142 
2143 	if (action != HDA_FIXUP_ACT_PRE_PROBE)
2144 		return;
2145 	/* disable vmaster */
2146 	spec->gen.suppress_vmaster = 1;
2147 	/* auto-mute and auto-mic switch don't work with multiple codecs */
2148 	spec->gen.suppress_auto_mute = 1;
2149 	spec->gen.suppress_auto_mic = 1;
2150 	/* disable aamix as well */
2151 	spec->gen.mixer_nid = 0;
2152 	/* add location prefix to avoid conflicts */
2153 	codec->force_pin_prefix = 1;
2154 }
2155 
rename_ctl(struct hda_codec *codec, const char *oldname, const char *newname)2156 static void rename_ctl(struct hda_codec *codec, const char *oldname,
2157 		       const char *newname)
2158 {
2159 	struct snd_kcontrol *kctl;
2160 
2161 	kctl = snd_hda_find_mixer_ctl(codec, oldname);
2162 	if (kctl)
2163 		strcpy(kctl->id.name, newname);
2164 }
2165 
alc1220_fixup_gb_dual_codecs(struct hda_codec *codec, const struct hda_fixup *fix, int action)2166 static void alc1220_fixup_gb_dual_codecs(struct hda_codec *codec,
2167 					 const struct hda_fixup *fix,
2168 					 int action)
2169 {
2170 	alc_fixup_dual_codecs(codec, fix, action);
2171 	switch (action) {
2172 	case HDA_FIXUP_ACT_PRE_PROBE:
2173 		/* override card longname to provide a unique UCM profile */
2174 		strcpy(codec->card->longname, "HDAudio-Gigabyte-ALC1220DualCodecs");
2175 		break;
2176 	case HDA_FIXUP_ACT_BUILD:
2177 		/* rename Capture controls depending on the codec */
2178 		rename_ctl(codec, "Capture Volume",
2179 			   codec->addr == 0 ?
2180 			   "Rear-Panel Capture Volume" :
2181 			   "Front-Panel Capture Volume");
2182 		rename_ctl(codec, "Capture Switch",
2183 			   codec->addr == 0 ?
2184 			   "Rear-Panel Capture Switch" :
2185 			   "Front-Panel Capture Switch");
2186 		break;
2187 	}
2188 }
2189 
alc1220_fixup_gb_x570(struct hda_codec *codec, const struct hda_fixup *fix, int action)2190 static void alc1220_fixup_gb_x570(struct hda_codec *codec,
2191 				     const struct hda_fixup *fix,
2192 				     int action)
2193 {
2194 	static const hda_nid_t conn1[] = { 0x0c };
2195 	static const struct coef_fw gb_x570_coefs[] = {
2196 		WRITE_COEF(0x07, 0x03c0),
2197 		WRITE_COEF(0x1a, 0x01c1),
2198 		WRITE_COEF(0x1b, 0x0202),
2199 		WRITE_COEF(0x43, 0x3005),
2200 		{}
2201 	};
2202 
2203 	switch (action) {
2204 	case HDA_FIXUP_ACT_PRE_PROBE:
2205 		snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2206 		snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
2207 		break;
2208 	case HDA_FIXUP_ACT_INIT:
2209 		alc_process_coef_fw(codec, gb_x570_coefs);
2210 		break;
2211 	}
2212 }
2213 
alc1220_fixup_clevo_p950(struct hda_codec *codec, const struct hda_fixup *fix, int action)2214 static void alc1220_fixup_clevo_p950(struct hda_codec *codec,
2215 				     const struct hda_fixup *fix,
2216 				     int action)
2217 {
2218 	static const hda_nid_t conn1[] = { 0x0c };
2219 
2220 	if (action != HDA_FIXUP_ACT_PRE_PROBE)
2221 		return;
2222 
2223 	alc_update_coef_idx(codec, 0x7, 0, 0x3c3);
2224 	/* We therefore want to make sure 0x14 (front headphone) and
2225 	 * 0x1b (speakers) use the stereo DAC 0x02
2226 	 */
2227 	snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2228 	snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
2229 }
2230 
2231 static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
2232 				const struct hda_fixup *fix, int action);
2233 
alc1220_fixup_clevo_pb51ed(struct hda_codec *codec, const struct hda_fixup *fix, int action)2234 static void alc1220_fixup_clevo_pb51ed(struct hda_codec *codec,
2235 				     const struct hda_fixup *fix,
2236 				     int action)
2237 {
2238 	alc1220_fixup_clevo_p950(codec, fix, action);
2239 	alc_fixup_headset_mode_no_hp_mic(codec, fix, action);
2240 }
2241 
alc887_asus_hp_automute_hook(struct hda_codec *codec, struct hda_jack_callback *jack)2242 static void alc887_asus_hp_automute_hook(struct hda_codec *codec,
2243 					 struct hda_jack_callback *jack)
2244 {
2245 	struct alc_spec *spec = codec->spec;
2246 	unsigned int vref;
2247 
2248 	snd_hda_gen_hp_automute(codec, jack);
2249 
2250 	if (spec->gen.hp_jack_present)
2251 		vref = AC_PINCTL_VREF_80;
2252 	else
2253 		vref = AC_PINCTL_VREF_HIZ;
2254 	snd_hda_set_pin_ctl(codec, 0x19, PIN_HP | vref);
2255 }
2256 
alc887_fixup_asus_jack(struct hda_codec *codec, const struct hda_fixup *fix, int action)2257 static void alc887_fixup_asus_jack(struct hda_codec *codec,
2258 				     const struct hda_fixup *fix, int action)
2259 {
2260 	struct alc_spec *spec = codec->spec;
2261 	if (action != HDA_FIXUP_ACT_PROBE)
2262 		return;
2263 	snd_hda_set_pin_ctl_cache(codec, 0x1b, PIN_HP);
2264 	spec->gen.hp_automute_hook = alc887_asus_hp_automute_hook;
2265 }
2266 
2267 static const struct hda_fixup alc882_fixups[] = {
2268 	[ALC882_FIXUP_ABIT_AW9D_MAX] = {
2269 		.type = HDA_FIXUP_PINS,
2270 		.v.pins = (const struct hda_pintbl[]) {
2271 			{ 0x15, 0x01080104 }, /* side */
2272 			{ 0x16, 0x01011012 }, /* rear */
2273 			{ 0x17, 0x01016011 }, /* clfe */
2274 			{ }
2275 		}
2276 	},
2277 	[ALC882_FIXUP_LENOVO_Y530] = {
2278 		.type = HDA_FIXUP_PINS,
2279 		.v.pins = (const struct hda_pintbl[]) {
2280 			{ 0x15, 0x99130112 }, /* rear int speakers */
2281 			{ 0x16, 0x99130111 }, /* subwoofer */
2282 			{ }
2283 		}
2284 	},
2285 	[ALC882_FIXUP_PB_M5210] = {
2286 		.type = HDA_FIXUP_PINCTLS,
2287 		.v.pins = (const struct hda_pintbl[]) {
2288 			{ 0x19, PIN_VREF50 },
2289 			{}
2290 		}
2291 	},
2292 	[ALC882_FIXUP_ACER_ASPIRE_7736] = {
2293 		.type = HDA_FIXUP_FUNC,
2294 		.v.func = alc_fixup_sku_ignore,
2295 	},
2296 	[ALC882_FIXUP_ASUS_W90V] = {
2297 		.type = HDA_FIXUP_PINS,
2298 		.v.pins = (const struct hda_pintbl[]) {
2299 			{ 0x16, 0x99130110 }, /* fix sequence for CLFE */
2300 			{ }
2301 		}
2302 	},
2303 	[ALC889_FIXUP_CD] = {
2304 		.type = HDA_FIXUP_PINS,
2305 		.v.pins = (const struct hda_pintbl[]) {
2306 			{ 0x1c, 0x993301f0 }, /* CD */
2307 			{ }
2308 		}
2309 	},
2310 	[ALC889_FIXUP_FRONT_HP_NO_PRESENCE] = {
2311 		.type = HDA_FIXUP_PINS,
2312 		.v.pins = (const struct hda_pintbl[]) {
2313 			{ 0x1b, 0x02214120 }, /* Front HP jack is flaky, disable jack detect */
2314 			{ }
2315 		},
2316 		.chained = true,
2317 		.chain_id = ALC889_FIXUP_CD,
2318 	},
2319 	[ALC889_FIXUP_VAIO_TT] = {
2320 		.type = HDA_FIXUP_PINS,
2321 		.v.pins = (const struct hda_pintbl[]) {
2322 			{ 0x17, 0x90170111 }, /* hidden surround speaker */
2323 			{ }
2324 		}
2325 	},
2326 	[ALC888_FIXUP_EEE1601] = {
2327 		.type = HDA_FIXUP_VERBS,
2328 		.v.verbs = (const struct hda_verb[]) {
2329 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2330 			{ 0x20, AC_VERB_SET_PROC_COEF,  0x0838 },
2331 			{ }
2332 		}
2333 	},
2334 	[ALC886_FIXUP_EAPD] = {
2335 		.type = HDA_FIXUP_VERBS,
2336 		.v.verbs = (const struct hda_verb[]) {
2337 			/* change to EAPD mode */
2338 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2339 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0068 },
2340 			{ }
2341 		}
2342 	},
2343 	[ALC882_FIXUP_EAPD] = {
2344 		.type = HDA_FIXUP_VERBS,
2345 		.v.verbs = (const struct hda_verb[]) {
2346 			/* change to EAPD mode */
2347 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2348 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
2349 			{ }
2350 		}
2351 	},
2352 	[ALC883_FIXUP_EAPD] = {
2353 		.type = HDA_FIXUP_VERBS,
2354 		.v.verbs = (const struct hda_verb[]) {
2355 			/* change to EAPD mode */
2356 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2357 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2358 			{ }
2359 		}
2360 	},
2361 	[ALC883_FIXUP_ACER_EAPD] = {
2362 		.type = HDA_FIXUP_VERBS,
2363 		.v.verbs = (const struct hda_verb[]) {
2364 			/* eanable EAPD on Acer laptops */
2365 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2366 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2367 			{ }
2368 		}
2369 	},
2370 	[ALC882_FIXUP_GPIO1] = {
2371 		.type = HDA_FIXUP_FUNC,
2372 		.v.func = alc_fixup_gpio1,
2373 	},
2374 	[ALC882_FIXUP_GPIO2] = {
2375 		.type = HDA_FIXUP_FUNC,
2376 		.v.func = alc_fixup_gpio2,
2377 	},
2378 	[ALC882_FIXUP_GPIO3] = {
2379 		.type = HDA_FIXUP_FUNC,
2380 		.v.func = alc_fixup_gpio3,
2381 	},
2382 	[ALC882_FIXUP_ASUS_W2JC] = {
2383 		.type = HDA_FIXUP_FUNC,
2384 		.v.func = alc_fixup_gpio1,
2385 		.chained = true,
2386 		.chain_id = ALC882_FIXUP_EAPD,
2387 	},
2388 	[ALC889_FIXUP_COEF] = {
2389 		.type = HDA_FIXUP_FUNC,
2390 		.v.func = alc889_fixup_coef,
2391 	},
2392 	[ALC882_FIXUP_ACER_ASPIRE_4930G] = {
2393 		.type = HDA_FIXUP_PINS,
2394 		.v.pins = (const struct hda_pintbl[]) {
2395 			{ 0x16, 0x99130111 }, /* CLFE speaker */
2396 			{ 0x17, 0x99130112 }, /* surround speaker */
2397 			{ }
2398 		},
2399 		.chained = true,
2400 		.chain_id = ALC882_FIXUP_GPIO1,
2401 	},
2402 	[ALC882_FIXUP_ACER_ASPIRE_8930G] = {
2403 		.type = HDA_FIXUP_PINS,
2404 		.v.pins = (const struct hda_pintbl[]) {
2405 			{ 0x16, 0x99130111 }, /* CLFE speaker */
2406 			{ 0x1b, 0x99130112 }, /* surround speaker */
2407 			{ }
2408 		},
2409 		.chained = true,
2410 		.chain_id = ALC882_FIXUP_ASPIRE_8930G_VERBS,
2411 	},
2412 	[ALC882_FIXUP_ASPIRE_8930G_VERBS] = {
2413 		/* additional init verbs for Acer Aspire 8930G */
2414 		.type = HDA_FIXUP_VERBS,
2415 		.v.verbs = (const struct hda_verb[]) {
2416 			/* Enable all DACs */
2417 			/* DAC DISABLE/MUTE 1? */
2418 			/*  setting bits 1-5 disables DAC nids 0x02-0x06
2419 			 *  apparently. Init=0x38 */
2420 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x03 },
2421 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2422 			/* DAC DISABLE/MUTE 2? */
2423 			/*  some bit here disables the other DACs.
2424 			 *  Init=0x4900 */
2425 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x08 },
2426 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2427 			/* DMIC fix
2428 			 * This laptop has a stereo digital microphone.
2429 			 * The mics are only 1cm apart which makes the stereo
2430 			 * useless. However, either the mic or the ALC889
2431 			 * makes the signal become a difference/sum signal
2432 			 * instead of standard stereo, which is annoying.
2433 			 * So instead we flip this bit which makes the
2434 			 * codec replicate the sum signal to both channels,
2435 			 * turning it into a normal mono mic.
2436 			 */
2437 			/* DMIC_CONTROL? Init value = 0x0001 */
2438 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2439 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0003 },
2440 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2441 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2442 			{ }
2443 		},
2444 		.chained = true,
2445 		.chain_id = ALC882_FIXUP_GPIO1,
2446 	},
2447 	[ALC885_FIXUP_MACPRO_GPIO] = {
2448 		.type = HDA_FIXUP_FUNC,
2449 		.v.func = alc885_fixup_macpro_gpio,
2450 	},
2451 	[ALC889_FIXUP_DAC_ROUTE] = {
2452 		.type = HDA_FIXUP_FUNC,
2453 		.v.func = alc889_fixup_dac_route,
2454 	},
2455 	[ALC889_FIXUP_MBP_VREF] = {
2456 		.type = HDA_FIXUP_FUNC,
2457 		.v.func = alc889_fixup_mbp_vref,
2458 		.chained = true,
2459 		.chain_id = ALC882_FIXUP_GPIO1,
2460 	},
2461 	[ALC889_FIXUP_IMAC91_VREF] = {
2462 		.type = HDA_FIXUP_FUNC,
2463 		.v.func = alc889_fixup_imac91_vref,
2464 		.chained = true,
2465 		.chain_id = ALC882_FIXUP_GPIO1,
2466 	},
2467 	[ALC889_FIXUP_MBA11_VREF] = {
2468 		.type = HDA_FIXUP_FUNC,
2469 		.v.func = alc889_fixup_mba11_vref,
2470 		.chained = true,
2471 		.chain_id = ALC889_FIXUP_MBP_VREF,
2472 	},
2473 	[ALC889_FIXUP_MBA21_VREF] = {
2474 		.type = HDA_FIXUP_FUNC,
2475 		.v.func = alc889_fixup_mba21_vref,
2476 		.chained = true,
2477 		.chain_id = ALC889_FIXUP_MBP_VREF,
2478 	},
2479 	[ALC889_FIXUP_MP11_VREF] = {
2480 		.type = HDA_FIXUP_FUNC,
2481 		.v.func = alc889_fixup_mba11_vref,
2482 		.chained = true,
2483 		.chain_id = ALC885_FIXUP_MACPRO_GPIO,
2484 	},
2485 	[ALC889_FIXUP_MP41_VREF] = {
2486 		.type = HDA_FIXUP_FUNC,
2487 		.v.func = alc889_fixup_mbp_vref,
2488 		.chained = true,
2489 		.chain_id = ALC885_FIXUP_MACPRO_GPIO,
2490 	},
2491 	[ALC882_FIXUP_INV_DMIC] = {
2492 		.type = HDA_FIXUP_FUNC,
2493 		.v.func = alc_fixup_inv_dmic,
2494 	},
2495 	[ALC882_FIXUP_NO_PRIMARY_HP] = {
2496 		.type = HDA_FIXUP_FUNC,
2497 		.v.func = alc882_fixup_no_primary_hp,
2498 	},
2499 	[ALC887_FIXUP_ASUS_BASS] = {
2500 		.type = HDA_FIXUP_PINS,
2501 		.v.pins = (const struct hda_pintbl[]) {
2502 			{0x16, 0x99130130}, /* bass speaker */
2503 			{}
2504 		},
2505 		.chained = true,
2506 		.chain_id = ALC887_FIXUP_BASS_CHMAP,
2507 	},
2508 	[ALC887_FIXUP_BASS_CHMAP] = {
2509 		.type = HDA_FIXUP_FUNC,
2510 		.v.func = alc_fixup_bass_chmap,
2511 	},
2512 	[ALC1220_FIXUP_GB_DUAL_CODECS] = {
2513 		.type = HDA_FIXUP_FUNC,
2514 		.v.func = alc1220_fixup_gb_dual_codecs,
2515 	},
2516 	[ALC1220_FIXUP_GB_X570] = {
2517 		.type = HDA_FIXUP_FUNC,
2518 		.v.func = alc1220_fixup_gb_x570,
2519 	},
2520 	[ALC1220_FIXUP_CLEVO_P950] = {
2521 		.type = HDA_FIXUP_FUNC,
2522 		.v.func = alc1220_fixup_clevo_p950,
2523 	},
2524 	[ALC1220_FIXUP_CLEVO_PB51ED] = {
2525 		.type = HDA_FIXUP_FUNC,
2526 		.v.func = alc1220_fixup_clevo_pb51ed,
2527 	},
2528 	[ALC1220_FIXUP_CLEVO_PB51ED_PINS] = {
2529 		.type = HDA_FIXUP_PINS,
2530 		.v.pins = (const struct hda_pintbl[]) {
2531 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
2532 			{}
2533 		},
2534 		.chained = true,
2535 		.chain_id = ALC1220_FIXUP_CLEVO_PB51ED,
2536 	},
2537 	[ALC887_FIXUP_ASUS_AUDIO] = {
2538 		.type = HDA_FIXUP_PINS,
2539 		.v.pins = (const struct hda_pintbl[]) {
2540 			{ 0x15, 0x02a14150 }, /* use as headset mic, without its own jack detect */
2541 			{ 0x19, 0x22219420 },
2542 			{}
2543 		},
2544 	},
2545 	[ALC887_FIXUP_ASUS_HMIC] = {
2546 		.type = HDA_FIXUP_FUNC,
2547 		.v.func = alc887_fixup_asus_jack,
2548 		.chained = true,
2549 		.chain_id = ALC887_FIXUP_ASUS_AUDIO,
2550 	},
2551 	[ALCS1200A_FIXUP_MIC_VREF] = {
2552 		.type = HDA_FIXUP_PINCTLS,
2553 		.v.pins = (const struct hda_pintbl[]) {
2554 			{ 0x18, PIN_VREF50 }, /* rear mic */
2555 			{ 0x19, PIN_VREF50 }, /* front mic */
2556 			{}
2557 		}
2558 	},
2559 	[ALC888VD_FIXUP_MIC_100VREF] = {
2560 		.type = HDA_FIXUP_PINCTLS,
2561 		.v.pins = (const struct hda_pintbl[]) {
2562 			{ 0x18, PIN_VREF100 }, /* headset mic */
2563 			{}
2564 		}
2565 	},
2566 };
2567 
2568 static const struct snd_pci_quirk alc882_fixup_tbl[] = {
2569 	SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD),
2570 	SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2571 	SND_PCI_QUIRK(0x1025, 0x0107, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2572 	SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD),
2573 	SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2574 	SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD),
2575 	SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_FIXUP_ACER_EAPD),
2576 	SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
2577 		      ALC882_FIXUP_ACER_ASPIRE_4930G),
2578 	SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
2579 		      ALC882_FIXUP_ACER_ASPIRE_4930G),
2580 	SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
2581 		      ALC882_FIXUP_ACER_ASPIRE_8930G),
2582 	SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
2583 		      ALC882_FIXUP_ACER_ASPIRE_8930G),
2584 	SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
2585 		      ALC882_FIXUP_ACER_ASPIRE_4930G),
2586 	SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
2587 	SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
2588 		      ALC882_FIXUP_ACER_ASPIRE_4930G),
2589 	SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
2590 		      ALC882_FIXUP_ACER_ASPIRE_4930G),
2591 	SND_PCI_QUIRK(0x1025, 0x021e, "Acer Aspire 5739G",
2592 		      ALC882_FIXUP_ACER_ASPIRE_4930G),
2593 	SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),
2594 	SND_PCI_QUIRK(0x1025, 0x026b, "Acer Aspire 8940G", ALC882_FIXUP_ACER_ASPIRE_8930G),
2595 	SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736),
2596 	SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD),
2597 	SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),
2598 	SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_FIXUP_ASUS_W2JC),
2599 	SND_PCI_QUIRK(0x1043, 0x2390, "Asus D700SA", ALC887_FIXUP_ASUS_HMIC),
2600 	SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601),
2601 	SND_PCI_QUIRK(0x1043, 0x84bc, "ASUS ET2700", ALC887_FIXUP_ASUS_BASS),
2602 	SND_PCI_QUIRK(0x1043, 0x8691, "ASUS ROG Ranger VIII", ALC882_FIXUP_GPIO3),
2603 	SND_PCI_QUIRK(0x1043, 0x8797, "ASUS TUF B550M-PLUS", ALCS1200A_FIXUP_MIC_VREF),
2604 	SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP),
2605 	SND_PCI_QUIRK(0x104d, 0x9044, "Sony VAIO AiO", ALC882_FIXUP_NO_PRIMARY_HP),
2606 	SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT),
2607 	SND_PCI_QUIRK(0x104d, 0x905a, "Sony Vaio Z", ALC882_FIXUP_NO_PRIMARY_HP),
2608 	SND_PCI_QUIRK(0x104d, 0x9060, "Sony Vaio VPCL14M1R", ALC882_FIXUP_NO_PRIMARY_HP),
2609 
2610 	/* All Apple entries are in codec SSIDs */
2611 	SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF),
2612 	SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC889_FIXUP_MBP_VREF),
2613 	SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
2614 	SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC889_FIXUP_MP11_VREF),
2615 	SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_FIXUP_MACPRO_GPIO),
2616 	SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_FIXUP_MACPRO_GPIO),
2617 	SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC889_FIXUP_MBP_VREF),
2618 	SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889_FIXUP_MBP_VREF),
2619 	SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD),
2620 	SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC889_FIXUP_MBA11_VREF),
2621 	SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBA21_VREF),
2622 	SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889_FIXUP_MBP_VREF),
2623 	SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
2624 	SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO),
2625 	SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF),
2626 	SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF),
2627 	SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF),
2628 	SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 4,1/5,1", ALC889_FIXUP_MP41_VREF),
2629 	SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF),
2630 	SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),
2631 	SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),
2632 	SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_MBA11_VREF),
2633 
2634 	SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),
2635 	SND_PCI_QUIRK(0x10ec, 0x12d8, "iBase Elo Touch", ALC888VD_FIXUP_MIC_100VREF),
2636 	SND_PCI_QUIRK(0x13fe, 0x1009, "Advantech MIT-W101", ALC886_FIXUP_EAPD),
2637 	SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE),
2638 	SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
2639 	SND_PCI_QUIRK(0x1458, 0xa0cd, "Gigabyte X570 Aorus Master", ALC1220_FIXUP_GB_X570),
2640 	SND_PCI_QUIRK(0x1458, 0xa0ce, "Gigabyte X570 Aorus Xtreme", ALC1220_FIXUP_GB_X570),
2641 	SND_PCI_QUIRK(0x1458, 0xa0d5, "Gigabyte X570S Aorus Master", ALC1220_FIXUP_GB_X570),
2642 	SND_PCI_QUIRK(0x1462, 0x11f7, "MSI-GE63", ALC1220_FIXUP_CLEVO_P950),
2643 	SND_PCI_QUIRK(0x1462, 0x1228, "MSI-GP63", ALC1220_FIXUP_CLEVO_P950),
2644 	SND_PCI_QUIRK(0x1462, 0x1229, "MSI-GP73", ALC1220_FIXUP_CLEVO_P950),
2645 	SND_PCI_QUIRK(0x1462, 0x1275, "MSI-GL63", ALC1220_FIXUP_CLEVO_P950),
2646 	SND_PCI_QUIRK(0x1462, 0x1276, "MSI-GL73", ALC1220_FIXUP_CLEVO_P950),
2647 	SND_PCI_QUIRK(0x1462, 0x1293, "MSI-GP65", ALC1220_FIXUP_CLEVO_P950),
2648 	SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),
2649 	SND_PCI_QUIRK(0x1462, 0xcc34, "MSI Godlike X570", ALC1220_FIXUP_GB_DUAL_CODECS),
2650 	SND_PCI_QUIRK(0x1462, 0xda57, "MSI Z270-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
2651 	SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
2652 	SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
2653 	SND_PCI_QUIRK(0x1558, 0x3702, "Clevo X370SN[VW]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2654 	SND_PCI_QUIRK(0x1558, 0x50d3, "Clevo PC50[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2655 	SND_PCI_QUIRK(0x1558, 0x65d1, "Clevo PB51[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2656 	SND_PCI_QUIRK(0x1558, 0x65d2, "Clevo PB51R[CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2657 	SND_PCI_QUIRK(0x1558, 0x65e1, "Clevo PB51[ED][DF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2658 	SND_PCI_QUIRK(0x1558, 0x65e5, "Clevo PC50D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2659 	SND_PCI_QUIRK(0x1558, 0x65f1, "Clevo PC50HS", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2660 	SND_PCI_QUIRK(0x1558, 0x65f5, "Clevo PD50PN[NRT]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2661 	SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2662 	SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2663 	SND_PCI_QUIRK(0x1558, 0x67e5, "Clevo PC70D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2664 	SND_PCI_QUIRK(0x1558, 0x67f1, "Clevo PC70H[PRS]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2665 	SND_PCI_QUIRK(0x1558, 0x67f5, "Clevo PD70PN[NRT]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2666 	SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2667 	SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170SM", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2668 	SND_PCI_QUIRK(0x1558, 0x7715, "Clevo X170KM-G", ALC1220_FIXUP_CLEVO_PB51ED),
2669 	SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),
2670 	SND_PCI_QUIRK(0x1558, 0x9506, "Clevo P955HQ", ALC1220_FIXUP_CLEVO_P950),
2671 	SND_PCI_QUIRK(0x1558, 0x950a, "Clevo P955H[PR]", ALC1220_FIXUP_CLEVO_P950),
2672 	SND_PCI_QUIRK(0x1558, 0x95e1, "Clevo P95xER", ALC1220_FIXUP_CLEVO_P950),
2673 	SND_PCI_QUIRK(0x1558, 0x95e2, "Clevo P950ER", ALC1220_FIXUP_CLEVO_P950),
2674 	SND_PCI_QUIRK(0x1558, 0x95e3, "Clevo P955[ER]T", ALC1220_FIXUP_CLEVO_P950),
2675 	SND_PCI_QUIRK(0x1558, 0x95e4, "Clevo P955ER", ALC1220_FIXUP_CLEVO_P950),
2676 	SND_PCI_QUIRK(0x1558, 0x95e5, "Clevo P955EE6", ALC1220_FIXUP_CLEVO_P950),
2677 	SND_PCI_QUIRK(0x1558, 0x95e6, "Clevo P950R[CDF]", ALC1220_FIXUP_CLEVO_P950),
2678 	SND_PCI_QUIRK(0x1558, 0x96e1, "Clevo P960[ER][CDFN]-K", ALC1220_FIXUP_CLEVO_P950),
2679 	SND_PCI_QUIRK(0x1558, 0x97e1, "Clevo P970[ER][CDFN]", ALC1220_FIXUP_CLEVO_P950),
2680 	SND_PCI_QUIRK(0x1558, 0x97e2, "Clevo P970RC-M", ALC1220_FIXUP_CLEVO_P950),
2681 	SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
2682 	SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),
2683 	SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),
2684 	SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_FIXUP_COEF),
2685 	{}
2686 };
2687 
2688 static const struct hda_model_fixup alc882_fixup_models[] = {
2689 	{.id = ALC882_FIXUP_ABIT_AW9D_MAX, .name = "abit-aw9d"},
2690 	{.id = ALC882_FIXUP_LENOVO_Y530, .name = "lenovo-y530"},
2691 	{.id = ALC882_FIXUP_ACER_ASPIRE_7736, .name = "acer-aspire-7736"},
2692 	{.id = ALC882_FIXUP_ASUS_W90V, .name = "asus-w90v"},
2693 	{.id = ALC889_FIXUP_CD, .name = "cd"},
2694 	{.id = ALC889_FIXUP_FRONT_HP_NO_PRESENCE, .name = "no-front-hp"},
2695 	{.id = ALC889_FIXUP_VAIO_TT, .name = "vaio-tt"},
2696 	{.id = ALC888_FIXUP_EEE1601, .name = "eee1601"},
2697 	{.id = ALC882_FIXUP_EAPD, .name = "alc882-eapd"},
2698 	{.id = ALC883_FIXUP_EAPD, .name = "alc883-eapd"},
2699 	{.id = ALC882_FIXUP_GPIO1, .name = "gpio1"},
2700 	{.id = ALC882_FIXUP_GPIO2, .name = "gpio2"},
2701 	{.id = ALC882_FIXUP_GPIO3, .name = "gpio3"},
2702 	{.id = ALC889_FIXUP_COEF, .name = "alc889-coef"},
2703 	{.id = ALC882_FIXUP_ASUS_W2JC, .name = "asus-w2jc"},
2704 	{.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name = "acer-aspire-4930g"},
2705 	{.id = ALC882_FIXUP_ACER_ASPIRE_8930G, .name = "acer-aspire-8930g"},
2706 	{.id = ALC883_FIXUP_ACER_EAPD, .name = "acer-aspire"},
2707 	{.id = ALC885_FIXUP_MACPRO_GPIO, .name = "macpro-gpio"},
2708 	{.id = ALC889_FIXUP_DAC_ROUTE, .name = "dac-route"},
2709 	{.id = ALC889_FIXUP_MBP_VREF, .name = "mbp-vref"},
2710 	{.id = ALC889_FIXUP_IMAC91_VREF, .name = "imac91-vref"},
2711 	{.id = ALC889_FIXUP_MBA11_VREF, .name = "mba11-vref"},
2712 	{.id = ALC889_FIXUP_MBA21_VREF, .name = "mba21-vref"},
2713 	{.id = ALC889_FIXUP_MP11_VREF, .name = "mp11-vref"},
2714 	{.id = ALC889_FIXUP_MP41_VREF, .name = "mp41-vref"},
2715 	{.id = ALC882_FIXUP_INV_DMIC, .name = "inv-dmic"},
2716 	{.id = ALC882_FIXUP_NO_PRIMARY_HP, .name = "no-primary-hp"},
2717 	{.id = ALC887_FIXUP_ASUS_BASS, .name = "asus-bass"},
2718 	{.id = ALC1220_FIXUP_GB_DUAL_CODECS, .name = "dual-codecs"},
2719 	{.id = ALC1220_FIXUP_GB_X570, .name = "gb-x570"},
2720 	{.id = ALC1220_FIXUP_CLEVO_P950, .name = "clevo-p950"},
2721 	{}
2722 };
2723 
2724 static const struct snd_hda_pin_quirk alc882_pin_fixup_tbl[] = {
2725 	SND_HDA_PIN_QUIRK(0x10ec1220, 0x1043, "ASUS", ALC1220_FIXUP_CLEVO_P950,
2726 		{0x14, 0x01014010},
2727 		{0x15, 0x01011012},
2728 		{0x16, 0x01016011},
2729 		{0x18, 0x01a19040},
2730 		{0x19, 0x02a19050},
2731 		{0x1a, 0x0181304f},
2732 		{0x1b, 0x0221401f},
2733 		{0x1e, 0x01456130}),
2734 	SND_HDA_PIN_QUIRK(0x10ec1220, 0x1462, "MS-7C35", ALC1220_FIXUP_CLEVO_P950,
2735 		{0x14, 0x01015010},
2736 		{0x15, 0x01011012},
2737 		{0x16, 0x01011011},
2738 		{0x18, 0x01a11040},
2739 		{0x19, 0x02a19050},
2740 		{0x1a, 0x0181104f},
2741 		{0x1b, 0x0221401f},
2742 		{0x1e, 0x01451130}),
2743 	{}
2744 };
2745 
2746 /*
2747  * BIOS auto configuration
2748  */
2749 /* almost identical with ALC880 parser... */
alc882_parse_auto_config(struct hda_codec *codec)2750 static int alc882_parse_auto_config(struct hda_codec *codec)
2751 {
2752 	static const hda_nid_t alc882_ignore[] = { 0x1d, 0 };
2753 	static const hda_nid_t alc882_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2754 	return alc_parse_auto_config(codec, alc882_ignore, alc882_ssids);
2755 }
2756 
2757 /*
2758  */
patch_alc882(struct hda_codec *codec)2759 static int patch_alc882(struct hda_codec *codec)
2760 {
2761 	struct alc_spec *spec;
2762 	int err;
2763 
2764 	err = alc_alloc_spec(codec, 0x0b);
2765 	if (err < 0)
2766 		return err;
2767 
2768 	spec = codec->spec;
2769 
2770 	switch (codec->core.vendor_id) {
2771 	case 0x10ec0882:
2772 	case 0x10ec0885:
2773 	case 0x10ec0900:
2774 	case 0x10ec0b00:
2775 	case 0x10ec1220:
2776 		break;
2777 	default:
2778 		/* ALC883 and variants */
2779 		alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2780 		break;
2781 	}
2782 
2783 	alc_pre_init(codec);
2784 
2785 	snd_hda_pick_fixup(codec, alc882_fixup_models, alc882_fixup_tbl,
2786 		       alc882_fixups);
2787 	snd_hda_pick_pin_fixup(codec, alc882_pin_fixup_tbl, alc882_fixups, true);
2788 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2789 
2790 	alc_auto_parse_customize_define(codec);
2791 
2792 	if (has_cdefine_beep(codec))
2793 		spec->gen.beep_nid = 0x01;
2794 
2795 	/* automatic parse from the BIOS config */
2796 	err = alc882_parse_auto_config(codec);
2797 	if (err < 0)
2798 		goto error;
2799 
2800 	if (!spec->gen.no_analog && spec->gen.beep_nid) {
2801 		err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2802 		if (err < 0)
2803 			goto error;
2804 	}
2805 
2806 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2807 
2808 	return 0;
2809 
2810  error:
2811 	alc_free(codec);
2812 	return err;
2813 }
2814 
2815 
2816 /*
2817  * ALC262 support
2818  */
alc262_parse_auto_config(struct hda_codec *codec)2819 static int alc262_parse_auto_config(struct hda_codec *codec)
2820 {
2821 	static const hda_nid_t alc262_ignore[] = { 0x1d, 0 };
2822 	static const hda_nid_t alc262_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2823 	return alc_parse_auto_config(codec, alc262_ignore, alc262_ssids);
2824 }
2825 
2826 /*
2827  * Pin config fixes
2828  */
2829 enum {
2830 	ALC262_FIXUP_FSC_H270,
2831 	ALC262_FIXUP_FSC_S7110,
2832 	ALC262_FIXUP_HP_Z200,
2833 	ALC262_FIXUP_TYAN,
2834 	ALC262_FIXUP_LENOVO_3000,
2835 	ALC262_FIXUP_BENQ,
2836 	ALC262_FIXUP_BENQ_T31,
2837 	ALC262_FIXUP_INV_DMIC,
2838 	ALC262_FIXUP_INTEL_BAYLEYBAY,
2839 };
2840 
2841 static const struct hda_fixup alc262_fixups[] = {
2842 	[ALC262_FIXUP_FSC_H270] = {
2843 		.type = HDA_FIXUP_PINS,
2844 		.v.pins = (const struct hda_pintbl[]) {
2845 			{ 0x14, 0x99130110 }, /* speaker */
2846 			{ 0x15, 0x0221142f }, /* front HP */
2847 			{ 0x1b, 0x0121141f }, /* rear HP */
2848 			{ }
2849 		}
2850 	},
2851 	[ALC262_FIXUP_FSC_S7110] = {
2852 		.type = HDA_FIXUP_PINS,
2853 		.v.pins = (const struct hda_pintbl[]) {
2854 			{ 0x15, 0x90170110 }, /* speaker */
2855 			{ }
2856 		},
2857 		.chained = true,
2858 		.chain_id = ALC262_FIXUP_BENQ,
2859 	},
2860 	[ALC262_FIXUP_HP_Z200] = {
2861 		.type = HDA_FIXUP_PINS,
2862 		.v.pins = (const struct hda_pintbl[]) {
2863 			{ 0x16, 0x99130120 }, /* internal speaker */
2864 			{ }
2865 		}
2866 	},
2867 	[ALC262_FIXUP_TYAN] = {
2868 		.type = HDA_FIXUP_PINS,
2869 		.v.pins = (const struct hda_pintbl[]) {
2870 			{ 0x14, 0x1993e1f0 }, /* int AUX */
2871 			{ }
2872 		}
2873 	},
2874 	[ALC262_FIXUP_LENOVO_3000] = {
2875 		.type = HDA_FIXUP_PINCTLS,
2876 		.v.pins = (const struct hda_pintbl[]) {
2877 			{ 0x19, PIN_VREF50 },
2878 			{}
2879 		},
2880 		.chained = true,
2881 		.chain_id = ALC262_FIXUP_BENQ,
2882 	},
2883 	[ALC262_FIXUP_BENQ] = {
2884 		.type = HDA_FIXUP_VERBS,
2885 		.v.verbs = (const struct hda_verb[]) {
2886 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2887 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2888 			{}
2889 		}
2890 	},
2891 	[ALC262_FIXUP_BENQ_T31] = {
2892 		.type = HDA_FIXUP_VERBS,
2893 		.v.verbs = (const struct hda_verb[]) {
2894 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2895 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2896 			{}
2897 		}
2898 	},
2899 	[ALC262_FIXUP_INV_DMIC] = {
2900 		.type = HDA_FIXUP_FUNC,
2901 		.v.func = alc_fixup_inv_dmic,
2902 	},
2903 	[ALC262_FIXUP_INTEL_BAYLEYBAY] = {
2904 		.type = HDA_FIXUP_FUNC,
2905 		.v.func = alc_fixup_no_depop_delay,
2906 	},
2907 };
2908 
2909 static const struct snd_pci_quirk alc262_fixup_tbl[] = {
2910 	SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", ALC262_FIXUP_HP_Z200),
2911 	SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu Lifebook S7110", ALC262_FIXUP_FSC_S7110),
2912 	SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ),
2913 	SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN),
2914 	SND_PCI_QUIRK(0x1734, 0x1141, "FSC ESPRIMO U9210", ALC262_FIXUP_FSC_H270),
2915 	SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270),
2916 	SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000),
2917 	SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ),
2918 	SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_FIXUP_BENQ_T31),
2919 	SND_PCI_QUIRK(0x8086, 0x7270, "BayleyBay", ALC262_FIXUP_INTEL_BAYLEYBAY),
2920 	{}
2921 };
2922 
2923 static const struct hda_model_fixup alc262_fixup_models[] = {
2924 	{.id = ALC262_FIXUP_INV_DMIC, .name = "inv-dmic"},
2925 	{.id = ALC262_FIXUP_FSC_H270, .name = "fsc-h270"},
2926 	{.id = ALC262_FIXUP_FSC_S7110, .name = "fsc-s7110"},
2927 	{.id = ALC262_FIXUP_HP_Z200, .name = "hp-z200"},
2928 	{.id = ALC262_FIXUP_TYAN, .name = "tyan"},
2929 	{.id = ALC262_FIXUP_LENOVO_3000, .name = "lenovo-3000"},
2930 	{.id = ALC262_FIXUP_BENQ, .name = "benq"},
2931 	{.id = ALC262_FIXUP_BENQ_T31, .name = "benq-t31"},
2932 	{.id = ALC262_FIXUP_INTEL_BAYLEYBAY, .name = "bayleybay"},
2933 	{}
2934 };
2935 
2936 /*
2937  */
patch_alc262(struct hda_codec *codec)2938 static int patch_alc262(struct hda_codec *codec)
2939 {
2940 	struct alc_spec *spec;
2941 	int err;
2942 
2943 	err = alc_alloc_spec(codec, 0x0b);
2944 	if (err < 0)
2945 		return err;
2946 
2947 	spec = codec->spec;
2948 	spec->gen.shared_mic_vref_pin = 0x18;
2949 
2950 	spec->shutup = alc_eapd_shutup;
2951 
2952 #if 0
2953 	/* pshou 07/11/05  set a zero PCM sample to DAC when FIFO is
2954 	 * under-run
2955 	 */
2956 	alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x80);
2957 #endif
2958 	alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2959 
2960 	alc_pre_init(codec);
2961 
2962 	snd_hda_pick_fixup(codec, alc262_fixup_models, alc262_fixup_tbl,
2963 		       alc262_fixups);
2964 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2965 
2966 	alc_auto_parse_customize_define(codec);
2967 
2968 	if (has_cdefine_beep(codec))
2969 		spec->gen.beep_nid = 0x01;
2970 
2971 	/* automatic parse from the BIOS config */
2972 	err = alc262_parse_auto_config(codec);
2973 	if (err < 0)
2974 		goto error;
2975 
2976 	if (!spec->gen.no_analog && spec->gen.beep_nid) {
2977 		err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2978 		if (err < 0)
2979 			goto error;
2980 	}
2981 
2982 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2983 
2984 	return 0;
2985 
2986  error:
2987 	alc_free(codec);
2988 	return err;
2989 }
2990 
2991 /*
2992  *  ALC268
2993  */
2994 /* bind Beep switches of both NID 0x0f and 0x10 */
alc268_beep_switch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)2995 static int alc268_beep_switch_put(struct snd_kcontrol *kcontrol,
2996 				  struct snd_ctl_elem_value *ucontrol)
2997 {
2998 	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2999 	unsigned long pval;
3000 	int err;
3001 
3002 	mutex_lock(&codec->control_mutex);
3003 	pval = kcontrol->private_value;
3004 	kcontrol->private_value = (pval & ~0xff) | 0x0f;
3005 	err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
3006 	if (err >= 0) {
3007 		kcontrol->private_value = (pval & ~0xff) | 0x10;
3008 		err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
3009 	}
3010 	kcontrol->private_value = pval;
3011 	mutex_unlock(&codec->control_mutex);
3012 	return err;
3013 }
3014 
3015 static const struct snd_kcontrol_new alc268_beep_mixer[] = {
3016 	HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
3017 	{
3018 		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3019 		.name = "Beep Playback Switch",
3020 		.subdevice = HDA_SUBDEV_AMP_FLAG,
3021 		.info = snd_hda_mixer_amp_switch_info,
3022 		.get = snd_hda_mixer_amp_switch_get,
3023 		.put = alc268_beep_switch_put,
3024 		.private_value = HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT)
3025 	},
3026 };
3027 
3028 /* set PCBEEP vol = 0, mute connections */
3029 static const struct hda_verb alc268_beep_init_verbs[] = {
3030 	{0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3031 	{0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3032 	{0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3033 	{ }
3034 };
3035 
3036 enum {
3037 	ALC268_FIXUP_INV_DMIC,
3038 	ALC268_FIXUP_HP_EAPD,
3039 	ALC268_FIXUP_SPDIF,
3040 };
3041 
3042 static const struct hda_fixup alc268_fixups[] = {
3043 	[ALC268_FIXUP_INV_DMIC] = {
3044 		.type = HDA_FIXUP_FUNC,
3045 		.v.func = alc_fixup_inv_dmic,
3046 	},
3047 	[ALC268_FIXUP_HP_EAPD] = {
3048 		.type = HDA_FIXUP_VERBS,
3049 		.v.verbs = (const struct hda_verb[]) {
3050 			{0x15, AC_VERB_SET_EAPD_BTLENABLE, 0},
3051 			{}
3052 		}
3053 	},
3054 	[ALC268_FIXUP_SPDIF] = {
3055 		.type = HDA_FIXUP_PINS,
3056 		.v.pins = (const struct hda_pintbl[]) {
3057 			{ 0x1e, 0x014b1180 }, /* enable SPDIF out */
3058 			{}
3059 		}
3060 	},
3061 };
3062 
3063 static const struct hda_model_fixup alc268_fixup_models[] = {
3064 	{.id = ALC268_FIXUP_INV_DMIC, .name = "inv-dmic"},
3065 	{.id = ALC268_FIXUP_HP_EAPD, .name = "hp-eapd"},
3066 	{.id = ALC268_FIXUP_SPDIF, .name = "spdif"},
3067 	{}
3068 };
3069 
3070 static const struct snd_pci_quirk alc268_fixup_tbl[] = {
3071 	SND_PCI_QUIRK(0x1025, 0x0139, "Acer TravelMate 6293", ALC268_FIXUP_SPDIF),
3072 	SND_PCI_QUIRK(0x1025, 0x015b, "Acer AOA 150 (ZG5)", ALC268_FIXUP_INV_DMIC),
3073 	/* below is codec SSID since multiple Toshiba laptops have the
3074 	 * same PCI SSID 1179:ff00
3075 	 */
3076 	SND_PCI_QUIRK(0x1179, 0xff06, "Toshiba P200", ALC268_FIXUP_HP_EAPD),
3077 	{}
3078 };
3079 
3080 /*
3081  * BIOS auto configuration
3082  */
alc268_parse_auto_config(struct hda_codec *codec)3083 static int alc268_parse_auto_config(struct hda_codec *codec)
3084 {
3085 	static const hda_nid_t alc268_ssids[] = { 0x15, 0x1b, 0x14, 0 };
3086 	return alc_parse_auto_config(codec, NULL, alc268_ssids);
3087 }
3088 
3089 /*
3090  */
patch_alc268(struct hda_codec *codec)3091 static int patch_alc268(struct hda_codec *codec)
3092 {
3093 	struct alc_spec *spec;
3094 	int i, err;
3095 
3096 	/* ALC268 has no aa-loopback mixer */
3097 	err = alc_alloc_spec(codec, 0);
3098 	if (err < 0)
3099 		return err;
3100 
3101 	spec = codec->spec;
3102 	if (has_cdefine_beep(codec))
3103 		spec->gen.beep_nid = 0x01;
3104 
3105 	spec->shutup = alc_eapd_shutup;
3106 
3107 	alc_pre_init(codec);
3108 
3109 	snd_hda_pick_fixup(codec, alc268_fixup_models, alc268_fixup_tbl, alc268_fixups);
3110 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
3111 
3112 	/* automatic parse from the BIOS config */
3113 	err = alc268_parse_auto_config(codec);
3114 	if (err < 0)
3115 		goto error;
3116 
3117 	if (err > 0 && !spec->gen.no_analog &&
3118 	    spec->gen.autocfg.speaker_pins[0] != 0x1d) {
3119 		for (i = 0; i < ARRAY_SIZE(alc268_beep_mixer); i++) {
3120 			if (!snd_hda_gen_add_kctl(&spec->gen, NULL,
3121 						  &alc268_beep_mixer[i])) {
3122 				err = -ENOMEM;
3123 				goto error;
3124 			}
3125 		}
3126 		snd_hda_add_verbs(codec, alc268_beep_init_verbs);
3127 		if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
3128 			/* override the amp caps for beep generator */
3129 			snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
3130 					  (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
3131 					  (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
3132 					  (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
3133 					  (0 << AC_AMPCAP_MUTE_SHIFT));
3134 	}
3135 
3136 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
3137 
3138 	return 0;
3139 
3140  error:
3141 	alc_free(codec);
3142 	return err;
3143 }
3144 
3145 /*
3146  * ALC269
3147  */
3148 
3149 static const struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
3150 	.rates = SNDRV_PCM_RATE_44100, /* fixed rate */
3151 };
3152 
3153 static const struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
3154 	.rates = SNDRV_PCM_RATE_44100, /* fixed rate */
3155 };
3156 
3157 /* different alc269-variants */
3158 enum {
3159 	ALC269_TYPE_ALC269VA,
3160 	ALC269_TYPE_ALC269VB,
3161 	ALC269_TYPE_ALC269VC,
3162 	ALC269_TYPE_ALC269VD,
3163 	ALC269_TYPE_ALC280,
3164 	ALC269_TYPE_ALC282,
3165 	ALC269_TYPE_ALC283,
3166 	ALC269_TYPE_ALC284,
3167 	ALC269_TYPE_ALC293,
3168 	ALC269_TYPE_ALC286,
3169 	ALC269_TYPE_ALC298,
3170 	ALC269_TYPE_ALC255,
3171 	ALC269_TYPE_ALC256,
3172 	ALC269_TYPE_ALC257,
3173 	ALC269_TYPE_ALC215,
3174 	ALC269_TYPE_ALC225,
3175 	ALC269_TYPE_ALC294,
3176 	ALC269_TYPE_ALC300,
3177 	ALC269_TYPE_ALC623,
3178 	ALC269_TYPE_ALC700,
3179 };
3180 
3181 /*
3182  * BIOS auto configuration
3183  */
alc269_parse_auto_config(struct hda_codec *codec)3184 static int alc269_parse_auto_config(struct hda_codec *codec)
3185 {
3186 	static const hda_nid_t alc269_ignore[] = { 0x1d, 0 };
3187 	static const hda_nid_t alc269_ssids[] = { 0, 0x1b, 0x14, 0x21 };
3188 	static const hda_nid_t alc269va_ssids[] = { 0x15, 0x1b, 0x14, 0 };
3189 	struct alc_spec *spec = codec->spec;
3190 	const hda_nid_t *ssids;
3191 
3192 	switch (spec->codec_variant) {
3193 	case ALC269_TYPE_ALC269VA:
3194 	case ALC269_TYPE_ALC269VC:
3195 	case ALC269_TYPE_ALC280:
3196 	case ALC269_TYPE_ALC284:
3197 	case ALC269_TYPE_ALC293:
3198 		ssids = alc269va_ssids;
3199 		break;
3200 	case ALC269_TYPE_ALC269VB:
3201 	case ALC269_TYPE_ALC269VD:
3202 	case ALC269_TYPE_ALC282:
3203 	case ALC269_TYPE_ALC283:
3204 	case ALC269_TYPE_ALC286:
3205 	case ALC269_TYPE_ALC298:
3206 	case ALC269_TYPE_ALC255:
3207 	case ALC269_TYPE_ALC256:
3208 	case ALC269_TYPE_ALC257:
3209 	case ALC269_TYPE_ALC215:
3210 	case ALC269_TYPE_ALC225:
3211 	case ALC269_TYPE_ALC294:
3212 	case ALC269_TYPE_ALC300:
3213 	case ALC269_TYPE_ALC623:
3214 	case ALC269_TYPE_ALC700:
3215 		ssids = alc269_ssids;
3216 		break;
3217 	default:
3218 		ssids = alc269_ssids;
3219 		break;
3220 	}
3221 
3222 	return alc_parse_auto_config(codec, alc269_ignore, ssids);
3223 }
3224 
3225 static const struct hda_jack_keymap alc_headset_btn_keymap[] = {
3226 	{ SND_JACK_BTN_0, KEY_PLAYPAUSE },
3227 	{ SND_JACK_BTN_1, KEY_VOICECOMMAND },
3228 	{ SND_JACK_BTN_2, KEY_VOLUMEUP },
3229 	{ SND_JACK_BTN_3, KEY_VOLUMEDOWN },
3230 	{}
3231 };
3232 
alc_headset_btn_callback(struct hda_codec *codec, struct hda_jack_callback *jack)3233 static void alc_headset_btn_callback(struct hda_codec *codec,
3234 				     struct hda_jack_callback *jack)
3235 {
3236 	int report = 0;
3237 
3238 	if (jack->unsol_res & (7 << 13))
3239 		report |= SND_JACK_BTN_0;
3240 
3241 	if (jack->unsol_res  & (1 << 16 | 3 << 8))
3242 		report |= SND_JACK_BTN_1;
3243 
3244 	/* Volume up key */
3245 	if (jack->unsol_res & (7 << 23))
3246 		report |= SND_JACK_BTN_2;
3247 
3248 	/* Volume down key */
3249 	if (jack->unsol_res & (7 << 10))
3250 		report |= SND_JACK_BTN_3;
3251 
3252 	jack->jack->button_state = report;
3253 }
3254 
alc_disable_headset_jack_key(struct hda_codec *codec)3255 static void alc_disable_headset_jack_key(struct hda_codec *codec)
3256 {
3257 	struct alc_spec *spec = codec->spec;
3258 
3259 	if (!spec->has_hs_key)
3260 		return;
3261 
3262 	switch (codec->core.vendor_id) {
3263 	case 0x10ec0215:
3264 	case 0x10ec0225:
3265 	case 0x10ec0285:
3266 	case 0x10ec0287:
3267 	case 0x10ec0295:
3268 	case 0x10ec0289:
3269 	case 0x10ec0299:
3270 		alc_write_coef_idx(codec, 0x48, 0x0);
3271 		alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3272 		alc_update_coef_idx(codec, 0x44, 0x0045 << 8, 0x0);
3273 		break;
3274 	case 0x10ec0230:
3275 	case 0x10ec0236:
3276 	case 0x10ec0256:
3277 	case 0x10ec0257:
3278 	case 0x19e58326:
3279 		alc_write_coef_idx(codec, 0x48, 0x0);
3280 		alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3281 		break;
3282 	}
3283 }
3284 
alc_enable_headset_jack_key(struct hda_codec *codec)3285 static void alc_enable_headset_jack_key(struct hda_codec *codec)
3286 {
3287 	struct alc_spec *spec = codec->spec;
3288 
3289 	if (!spec->has_hs_key)
3290 		return;
3291 
3292 	switch (codec->core.vendor_id) {
3293 	case 0x10ec0215:
3294 	case 0x10ec0225:
3295 	case 0x10ec0285:
3296 	case 0x10ec0287:
3297 	case 0x10ec0295:
3298 	case 0x10ec0289:
3299 	case 0x10ec0299:
3300 		alc_write_coef_idx(codec, 0x48, 0xd011);
3301 		alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3302 		alc_update_coef_idx(codec, 0x44, 0x007f << 8, 0x0045 << 8);
3303 		break;
3304 	case 0x10ec0230:
3305 	case 0x10ec0236:
3306 	case 0x10ec0256:
3307 	case 0x10ec0257:
3308 	case 0x19e58326:
3309 		alc_write_coef_idx(codec, 0x48, 0xd011);
3310 		alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3311 		break;
3312 	}
3313 }
3314 
alc_fixup_headset_jack(struct hda_codec *codec, const struct hda_fixup *fix, int action)3315 static void alc_fixup_headset_jack(struct hda_codec *codec,
3316 				    const struct hda_fixup *fix, int action)
3317 {
3318 	struct alc_spec *spec = codec->spec;
3319 
3320 	switch (action) {
3321 	case HDA_FIXUP_ACT_PRE_PROBE:
3322 		spec->has_hs_key = 1;
3323 		snd_hda_jack_detect_enable_callback(codec, 0x55,
3324 						    alc_headset_btn_callback);
3325 		snd_hda_jack_add_kctl(codec, 0x55, "Headset Jack", false,
3326 				      SND_JACK_HEADSET, alc_headset_btn_keymap);
3327 		break;
3328 	case HDA_FIXUP_ACT_INIT:
3329 		alc_enable_headset_jack_key(codec);
3330 		break;
3331 	}
3332 }
3333 
alc269vb_toggle_power_output(struct hda_codec *codec, int power_up)3334 static void alc269vb_toggle_power_output(struct hda_codec *codec, int power_up)
3335 {
3336 	alc_update_coef_idx(codec, 0x04, 1 << 11, power_up ? (1 << 11) : 0);
3337 }
3338 
alc269_shutup(struct hda_codec *codec)3339 static void alc269_shutup(struct hda_codec *codec)
3340 {
3341 	struct alc_spec *spec = codec->spec;
3342 
3343 	if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3344 		alc269vb_toggle_power_output(codec, 0);
3345 	if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
3346 			(alc_get_coef0(codec) & 0x00ff) == 0x018) {
3347 		msleep(150);
3348 	}
3349 	alc_shutup_pins(codec);
3350 }
3351 
3352 static const struct coef_fw alc282_coefs[] = {
3353 	WRITE_COEF(0x03, 0x0002), /* Power Down Control */
3354 	UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
3355 	WRITE_COEF(0x07, 0x0200), /* DMIC control */
3356 	UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
3357 	UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
3358 	WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
3359 	WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
3360 	WRITE_COEF(0x0e, 0x6e00), /* LDO1/2/3, DAC/ADC */
3361 	UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
3362 	UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
3363 	WRITE_COEF(0x6f, 0x0), /* Class D test 4 */
3364 	UPDATE_COEF(0x0c, 0xfe00, 0), /* IO power down directly */
3365 	WRITE_COEF(0x34, 0xa0c0), /* ANC */
3366 	UPDATE_COEF(0x16, 0x0008, 0), /* AGC MUX */
3367 	UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
3368 	UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
3369 	WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
3370 	WRITE_COEF(0x63, 0x2902), /* PLL */
3371 	WRITE_COEF(0x68, 0xa080), /* capless control 2 */
3372 	WRITE_COEF(0x69, 0x3400), /* capless control 3 */
3373 	WRITE_COEF(0x6a, 0x2f3e), /* capless control 4 */
3374 	WRITE_COEF(0x6b, 0x0), /* capless control 5 */
3375 	UPDATE_COEF(0x6d, 0x0fff, 0x0900), /* class D test 2 */
3376 	WRITE_COEF(0x6e, 0x110a), /* class D test 3 */
3377 	UPDATE_COEF(0x70, 0x00f8, 0x00d8), /* class D test 5 */
3378 	WRITE_COEF(0x71, 0x0014), /* class D test 6 */
3379 	WRITE_COEF(0x72, 0xc2ba), /* classD OCP */
3380 	UPDATE_COEF(0x77, 0x0f80, 0), /* classD pure DC test */
3381 	WRITE_COEF(0x6c, 0xfc06), /* Class D amp control */
3382 	{}
3383 };
3384 
alc282_restore_default_value(struct hda_codec *codec)3385 static void alc282_restore_default_value(struct hda_codec *codec)
3386 {
3387 	alc_process_coef_fw(codec, alc282_coefs);
3388 }
3389 
alc282_init(struct hda_codec *codec)3390 static void alc282_init(struct hda_codec *codec)
3391 {
3392 	struct alc_spec *spec = codec->spec;
3393 	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3394 	bool hp_pin_sense;
3395 	int coef78;
3396 
3397 	alc282_restore_default_value(codec);
3398 
3399 	if (!hp_pin)
3400 		return;
3401 	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3402 	coef78 = alc_read_coef_idx(codec, 0x78);
3403 
3404 	/* Index 0x78 Direct Drive HP AMP LPM Control 1 */
3405 	/* Headphone capless set to high power mode */
3406 	alc_write_coef_idx(codec, 0x78, 0x9004);
3407 
3408 	if (hp_pin_sense)
3409 		msleep(2);
3410 
3411 	snd_hda_codec_write(codec, hp_pin, 0,
3412 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3413 
3414 	if (hp_pin_sense)
3415 		msleep(85);
3416 
3417 	snd_hda_codec_write(codec, hp_pin, 0,
3418 			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3419 
3420 	if (hp_pin_sense)
3421 		msleep(100);
3422 
3423 	/* Headphone capless set to normal mode */
3424 	alc_write_coef_idx(codec, 0x78, coef78);
3425 }
3426 
alc282_shutup(struct hda_codec *codec)3427 static void alc282_shutup(struct hda_codec *codec)
3428 {
3429 	struct alc_spec *spec = codec->spec;
3430 	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3431 	bool hp_pin_sense;
3432 	int coef78;
3433 
3434 	if (!hp_pin) {
3435 		alc269_shutup(codec);
3436 		return;
3437 	}
3438 
3439 	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3440 	coef78 = alc_read_coef_idx(codec, 0x78);
3441 	alc_write_coef_idx(codec, 0x78, 0x9004);
3442 
3443 	if (hp_pin_sense)
3444 		msleep(2);
3445 
3446 	snd_hda_codec_write(codec, hp_pin, 0,
3447 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3448 
3449 	if (hp_pin_sense)
3450 		msleep(85);
3451 
3452 	if (!spec->no_shutup_pins)
3453 		snd_hda_codec_write(codec, hp_pin, 0,
3454 				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3455 
3456 	if (hp_pin_sense)
3457 		msleep(100);
3458 
3459 	alc_auto_setup_eapd(codec, false);
3460 	alc_shutup_pins(codec);
3461 	alc_write_coef_idx(codec, 0x78, coef78);
3462 }
3463 
3464 static const struct coef_fw alc283_coefs[] = {
3465 	WRITE_COEF(0x03, 0x0002), /* Power Down Control */
3466 	UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
3467 	WRITE_COEF(0x07, 0x0200), /* DMIC control */
3468 	UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
3469 	UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
3470 	WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
3471 	WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
3472 	WRITE_COEF(0x0e, 0x6fc0), /* LDO1/2/3, DAC/ADC */
3473 	UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
3474 	UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
3475 	WRITE_COEF(0x3a, 0x0), /* Class D test 4 */
3476 	UPDATE_COEF(0x0c, 0xfe00, 0x0), /* IO power down directly */
3477 	WRITE_COEF(0x22, 0xa0c0), /* ANC */
3478 	UPDATE_COEFEX(0x53, 0x01, 0x000f, 0x0008), /* AGC MUX */
3479 	UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
3480 	UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
3481 	WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
3482 	WRITE_COEF(0x2e, 0x2902), /* PLL */
3483 	WRITE_COEF(0x33, 0xa080), /* capless control 2 */
3484 	WRITE_COEF(0x34, 0x3400), /* capless control 3 */
3485 	WRITE_COEF(0x35, 0x2f3e), /* capless control 4 */
3486 	WRITE_COEF(0x36, 0x0), /* capless control 5 */
3487 	UPDATE_COEF(0x38, 0x0fff, 0x0900), /* class D test 2 */
3488 	WRITE_COEF(0x39, 0x110a), /* class D test 3 */
3489 	UPDATE_COEF(0x3b, 0x00f8, 0x00d8), /* class D test 5 */
3490 	WRITE_COEF(0x3c, 0x0014), /* class D test 6 */
3491 	WRITE_COEF(0x3d, 0xc2ba), /* classD OCP */
3492 	UPDATE_COEF(0x42, 0x0f80, 0x0), /* classD pure DC test */
3493 	WRITE_COEF(0x49, 0x0), /* test mode */
3494 	UPDATE_COEF(0x40, 0xf800, 0x9800), /* Class D DC enable */
3495 	UPDATE_COEF(0x42, 0xf000, 0x2000), /* DC offset */
3496 	WRITE_COEF(0x37, 0xfc06), /* Class D amp control */
3497 	UPDATE_COEF(0x1b, 0x8000, 0), /* HP JD control */
3498 	{}
3499 };
3500 
alc283_restore_default_value(struct hda_codec *codec)3501 static void alc283_restore_default_value(struct hda_codec *codec)
3502 {
3503 	alc_process_coef_fw(codec, alc283_coefs);
3504 }
3505 
alc283_init(struct hda_codec *codec)3506 static void alc283_init(struct hda_codec *codec)
3507 {
3508 	struct alc_spec *spec = codec->spec;
3509 	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3510 	bool hp_pin_sense;
3511 
3512 	alc283_restore_default_value(codec);
3513 
3514 	if (!hp_pin)
3515 		return;
3516 
3517 	msleep(30);
3518 	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3519 
3520 	/* Index 0x43 Direct Drive HP AMP LPM Control 1 */
3521 	/* Headphone capless set to high power mode */
3522 	alc_write_coef_idx(codec, 0x43, 0x9004);
3523 
3524 	snd_hda_codec_write(codec, hp_pin, 0,
3525 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3526 
3527 	if (hp_pin_sense)
3528 		msleep(85);
3529 
3530 	snd_hda_codec_write(codec, hp_pin, 0,
3531 			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3532 
3533 	if (hp_pin_sense)
3534 		msleep(85);
3535 	/* Index 0x46 Combo jack auto switch control 2 */
3536 	/* 3k pull low control for Headset jack. */
3537 	alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
3538 	/* Headphone capless set to normal mode */
3539 	alc_write_coef_idx(codec, 0x43, 0x9614);
3540 }
3541 
alc283_shutup(struct hda_codec *codec)3542 static void alc283_shutup(struct hda_codec *codec)
3543 {
3544 	struct alc_spec *spec = codec->spec;
3545 	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3546 	bool hp_pin_sense;
3547 
3548 	if (!hp_pin) {
3549 		alc269_shutup(codec);
3550 		return;
3551 	}
3552 
3553 	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3554 
3555 	alc_write_coef_idx(codec, 0x43, 0x9004);
3556 
3557 	/*depop hp during suspend*/
3558 	alc_write_coef_idx(codec, 0x06, 0x2100);
3559 
3560 	snd_hda_codec_write(codec, hp_pin, 0,
3561 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3562 
3563 	if (hp_pin_sense)
3564 		msleep(100);
3565 
3566 	if (!spec->no_shutup_pins)
3567 		snd_hda_codec_write(codec, hp_pin, 0,
3568 				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3569 
3570 	alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
3571 
3572 	if (hp_pin_sense)
3573 		msleep(100);
3574 	alc_auto_setup_eapd(codec, false);
3575 	alc_shutup_pins(codec);
3576 	alc_write_coef_idx(codec, 0x43, 0x9614);
3577 }
3578 
alc256_init(struct hda_codec *codec)3579 static void alc256_init(struct hda_codec *codec)
3580 {
3581 	struct alc_spec *spec = codec->spec;
3582 	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3583 	bool hp_pin_sense;
3584 
3585 	if (spec->ultra_low_power) {
3586 		alc_update_coef_idx(codec, 0x03, 1<<1, 1<<1);
3587 		alc_update_coef_idx(codec, 0x08, 3<<2, 3<<2);
3588 		alc_update_coef_idx(codec, 0x08, 7<<4, 0);
3589 		alc_update_coef_idx(codec, 0x3b, 1<<15, 0);
3590 		alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3591 		msleep(30);
3592 	}
3593 
3594 	if (!hp_pin)
3595 		hp_pin = 0x21;
3596 
3597 	msleep(30);
3598 
3599 	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3600 
3601 	if (hp_pin_sense)
3602 		msleep(2);
3603 
3604 	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
3605 
3606 	snd_hda_codec_write(codec, hp_pin, 0,
3607 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3608 
3609 	if (hp_pin_sense || spec->ultra_low_power)
3610 		msleep(85);
3611 
3612 	snd_hda_codec_write(codec, hp_pin, 0,
3613 			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3614 
3615 	if (hp_pin_sense || spec->ultra_low_power)
3616 		msleep(100);
3617 
3618 	alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
3619 	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
3620 	alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15); /* Clear bit */
3621 	alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15);
3622 	/*
3623 	 * Expose headphone mic (or possibly Line In on some machines) instead
3624 	 * of PC Beep on 1Ah, and disable 1Ah loopback for all outputs. See
3625 	 * Documentation/sound/hd-audio/realtek-pc-beep.rst for details of
3626 	 * this register.
3627 	 */
3628 	alc_write_coef_idx(codec, 0x36, 0x5757);
3629 }
3630 
alc256_shutup(struct hda_codec *codec)3631 static void alc256_shutup(struct hda_codec *codec)
3632 {
3633 	struct alc_spec *spec = codec->spec;
3634 	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3635 	bool hp_pin_sense;
3636 
3637 	if (!hp_pin)
3638 		hp_pin = 0x21;
3639 
3640 	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
3641 	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3642 
3643 	if (hp_pin_sense)
3644 		msleep(2);
3645 
3646 	snd_hda_codec_write(codec, hp_pin, 0,
3647 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3648 
3649 	if (hp_pin_sense || spec->ultra_low_power)
3650 		msleep(85);
3651 
3652 	/* 3k pull low control for Headset jack. */
3653 	/* NOTE: call this before clearing the pin, otherwise codec stalls */
3654 	/* If disable 3k pulldown control for alc257, the Mic detection will not work correctly
3655 	 * when booting with headset plugged. So skip setting it for the codec alc257
3656 	 */
3657 	if (spec->en_3kpull_low)
3658 		alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
3659 
3660 	if (!spec->no_shutup_pins)
3661 		snd_hda_codec_write(codec, hp_pin, 0,
3662 				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3663 
3664 	if (hp_pin_sense || spec->ultra_low_power)
3665 		msleep(100);
3666 
3667 	alc_auto_setup_eapd(codec, false);
3668 	alc_shutup_pins(codec);
3669 	if (spec->ultra_low_power) {
3670 		msleep(50);
3671 		alc_update_coef_idx(codec, 0x03, 1<<1, 0);
3672 		alc_update_coef_idx(codec, 0x08, 7<<4, 7<<4);
3673 		alc_update_coef_idx(codec, 0x08, 3<<2, 0);
3674 		alc_update_coef_idx(codec, 0x3b, 1<<15, 1<<15);
3675 		alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3676 		msleep(30);
3677 	}
3678 }
3679 
alc225_init(struct hda_codec *codec)3680 static void alc225_init(struct hda_codec *codec)
3681 {
3682 	struct alc_spec *spec = codec->spec;
3683 	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3684 	bool hp1_pin_sense, hp2_pin_sense;
3685 
3686 	if (spec->ultra_low_power) {
3687 		alc_update_coef_idx(codec, 0x08, 0x0f << 2, 3<<2);
3688 		alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3689 		alc_update_coef_idx(codec, 0x33, 1<<11, 0);
3690 		msleep(30);
3691 	}
3692 
3693 	if (!hp_pin)
3694 		hp_pin = 0x21;
3695 	msleep(30);
3696 
3697 	hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3698 	hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3699 
3700 	if (hp1_pin_sense || hp2_pin_sense)
3701 		msleep(2);
3702 
3703 	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
3704 
3705 	if (hp1_pin_sense || spec->ultra_low_power)
3706 		snd_hda_codec_write(codec, hp_pin, 0,
3707 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3708 	if (hp2_pin_sense)
3709 		snd_hda_codec_write(codec, 0x16, 0,
3710 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3711 
3712 	if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3713 		msleep(85);
3714 
3715 	if (hp1_pin_sense || spec->ultra_low_power)
3716 		snd_hda_codec_write(codec, hp_pin, 0,
3717 			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3718 	if (hp2_pin_sense)
3719 		snd_hda_codec_write(codec, 0x16, 0,
3720 			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3721 
3722 	if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3723 		msleep(100);
3724 
3725 	alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3726 	alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
3727 }
3728 
alc225_shutup(struct hda_codec *codec)3729 static void alc225_shutup(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 (!hp_pin)
3736 		hp_pin = 0x21;
3737 
3738 	alc_disable_headset_jack_key(codec);
3739 	/* 3k pull low control for Headset jack. */
3740 	alc_update_coef_idx(codec, 0x4a, 0, 3 << 10);
3741 
3742 	hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3743 	hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3744 
3745 	if (hp1_pin_sense || hp2_pin_sense)
3746 		msleep(2);
3747 
3748 	if (hp1_pin_sense || spec->ultra_low_power)
3749 		snd_hda_codec_write(codec, hp_pin, 0,
3750 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3751 	if (hp2_pin_sense)
3752 		snd_hda_codec_write(codec, 0x16, 0,
3753 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3754 
3755 	if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3756 		msleep(85);
3757 
3758 	if (hp1_pin_sense || spec->ultra_low_power)
3759 		snd_hda_codec_write(codec, hp_pin, 0,
3760 			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3761 	if (hp2_pin_sense)
3762 		snd_hda_codec_write(codec, 0x16, 0,
3763 			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3764 
3765 	if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3766 		msleep(100);
3767 
3768 	alc_auto_setup_eapd(codec, false);
3769 	alc_shutup_pins(codec);
3770 	if (spec->ultra_low_power) {
3771 		msleep(50);
3772 		alc_update_coef_idx(codec, 0x08, 0x0f << 2, 0x0c << 2);
3773 		alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3774 		alc_update_coef_idx(codec, 0x33, 1<<11, 1<<11);
3775 		alc_update_coef_idx(codec, 0x4a, 3<<4, 2<<4);
3776 		msleep(30);
3777 	}
3778 
3779 	alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3780 	alc_enable_headset_jack_key(codec);
3781 }
3782 
alc_default_init(struct hda_codec *codec)3783 static void alc_default_init(struct hda_codec *codec)
3784 {
3785 	struct alc_spec *spec = codec->spec;
3786 	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3787 	bool hp_pin_sense;
3788 
3789 	if (!hp_pin)
3790 		return;
3791 
3792 	msleep(30);
3793 
3794 	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3795 
3796 	if (hp_pin_sense)
3797 		msleep(2);
3798 
3799 	snd_hda_codec_write(codec, hp_pin, 0,
3800 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3801 
3802 	if (hp_pin_sense)
3803 		msleep(85);
3804 
3805 	snd_hda_codec_write(codec, hp_pin, 0,
3806 			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3807 
3808 	if (hp_pin_sense)
3809 		msleep(100);
3810 }
3811 
alc_default_shutup(struct hda_codec *codec)3812 static void alc_default_shutup(struct hda_codec *codec)
3813 {
3814 	struct alc_spec *spec = codec->spec;
3815 	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3816 	bool hp_pin_sense;
3817 
3818 	if (!hp_pin) {
3819 		alc269_shutup(codec);
3820 		return;
3821 	}
3822 
3823 	hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3824 
3825 	if (hp_pin_sense)
3826 		msleep(2);
3827 
3828 	snd_hda_codec_write(codec, hp_pin, 0,
3829 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3830 
3831 	if (hp_pin_sense)
3832 		msleep(85);
3833 
3834 	if (!spec->no_shutup_pins)
3835 		snd_hda_codec_write(codec, hp_pin, 0,
3836 				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3837 
3838 	if (hp_pin_sense)
3839 		msleep(100);
3840 
3841 	alc_auto_setup_eapd(codec, false);
3842 	alc_shutup_pins(codec);
3843 }
3844 
alc294_hp_init(struct hda_codec *codec)3845 static void alc294_hp_init(struct hda_codec *codec)
3846 {
3847 	struct alc_spec *spec = codec->spec;
3848 	hda_nid_t hp_pin = alc_get_hp_pin(spec);
3849 	int i, val;
3850 
3851 	if (!hp_pin)
3852 		return;
3853 
3854 	snd_hda_codec_write(codec, hp_pin, 0,
3855 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3856 
3857 	msleep(100);
3858 
3859 	if (!spec->no_shutup_pins)
3860 		snd_hda_codec_write(codec, hp_pin, 0,
3861 				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3862 
3863 	alc_update_coef_idx(codec, 0x6f, 0x000f, 0);/* Set HP depop to manual mode */
3864 	alc_update_coefex_idx(codec, 0x58, 0x00, 0x8000, 0x8000); /* HP depop procedure start */
3865 
3866 	/* Wait for depop procedure finish  */
3867 	val = alc_read_coefex_idx(codec, 0x58, 0x01);
3868 	for (i = 0; i < 20 && val & 0x0080; i++) {
3869 		msleep(50);
3870 		val = alc_read_coefex_idx(codec, 0x58, 0x01);
3871 	}
3872 	/* Set HP depop to auto mode */
3873 	alc_update_coef_idx(codec, 0x6f, 0x000f, 0x000b);
3874 	msleep(50);
3875 }
3876 
alc294_init(struct hda_codec *codec)3877 static void alc294_init(struct hda_codec *codec)
3878 {
3879 	struct alc_spec *spec = codec->spec;
3880 
3881 	/* required only at boot or S4 resume time */
3882 	if (!spec->done_hp_init ||
3883 	    codec->core.dev.power.power_state.event == PM_EVENT_RESTORE) {
3884 		alc294_hp_init(codec);
3885 		spec->done_hp_init = true;
3886 	}
3887 	alc_default_init(codec);
3888 }
3889 
alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg, unsigned int val)3890 static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg,
3891 			     unsigned int val)
3892 {
3893 	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3894 	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val & 0xffff); /* LSB */
3895 	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val >> 16); /* MSB */
3896 }
3897 
alc5505_coef_get(struct hda_codec *codec, unsigned int index_reg)3898 static int alc5505_coef_get(struct hda_codec *codec, unsigned int index_reg)
3899 {
3900 	unsigned int val;
3901 
3902 	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3903 	val = snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3904 		& 0xffff;
3905 	val |= snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3906 		<< 16;
3907 	return val;
3908 }
3909 
alc5505_dsp_halt(struct hda_codec *codec)3910 static void alc5505_dsp_halt(struct hda_codec *codec)
3911 {
3912 	unsigned int val;
3913 
3914 	alc5505_coef_set(codec, 0x3000, 0x000c); /* DSP CPU stop */
3915 	alc5505_coef_set(codec, 0x880c, 0x0008); /* DDR enter self refresh */
3916 	alc5505_coef_set(codec, 0x61c0, 0x11110080); /* Clock control for PLL and CPU */
3917 	alc5505_coef_set(codec, 0x6230, 0xfc0d4011); /* Disable Input OP */
3918 	alc5505_coef_set(codec, 0x61b4, 0x040a2b03); /* Stop PLL2 */
3919 	alc5505_coef_set(codec, 0x61b0, 0x00005b17); /* Stop PLL1 */
3920 	alc5505_coef_set(codec, 0x61b8, 0x04133303); /* Stop PLL3 */
3921 	val = alc5505_coef_get(codec, 0x6220);
3922 	alc5505_coef_set(codec, 0x6220, (val | 0x3000)); /* switch Ringbuffer clock to DBUS clock */
3923 }
3924 
alc5505_dsp_back_from_halt(struct hda_codec *codec)3925 static void alc5505_dsp_back_from_halt(struct hda_codec *codec)
3926 {
3927 	alc5505_coef_set(codec, 0x61b8, 0x04133302);
3928 	alc5505_coef_set(codec, 0x61b0, 0x00005b16);
3929 	alc5505_coef_set(codec, 0x61b4, 0x040a2b02);
3930 	alc5505_coef_set(codec, 0x6230, 0xf80d4011);
3931 	alc5505_coef_set(codec, 0x6220, 0x2002010f);
3932 	alc5505_coef_set(codec, 0x880c, 0x00000004);
3933 }
3934 
alc5505_dsp_init(struct hda_codec *codec)3935 static void alc5505_dsp_init(struct hda_codec *codec)
3936 {
3937 	unsigned int val;
3938 
3939 	alc5505_dsp_halt(codec);
3940 	alc5505_dsp_back_from_halt(codec);
3941 	alc5505_coef_set(codec, 0x61b0, 0x5b14); /* PLL1 control */
3942 	alc5505_coef_set(codec, 0x61b0, 0x5b16);
3943 	alc5505_coef_set(codec, 0x61b4, 0x04132b00); /* PLL2 control */
3944 	alc5505_coef_set(codec, 0x61b4, 0x04132b02);
3945 	alc5505_coef_set(codec, 0x61b8, 0x041f3300); /* PLL3 control*/
3946 	alc5505_coef_set(codec, 0x61b8, 0x041f3302);
3947 	snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_CODEC_RESET, 0); /* Function reset */
3948 	alc5505_coef_set(codec, 0x61b8, 0x041b3302);
3949 	alc5505_coef_set(codec, 0x61b8, 0x04173302);
3950 	alc5505_coef_set(codec, 0x61b8, 0x04163302);
3951 	alc5505_coef_set(codec, 0x8800, 0x348b328b); /* DRAM control */
3952 	alc5505_coef_set(codec, 0x8808, 0x00020022); /* DRAM control */
3953 	alc5505_coef_set(codec, 0x8818, 0x00000400); /* DRAM control */
3954 
3955 	val = alc5505_coef_get(codec, 0x6200) >> 16; /* Read revision ID */
3956 	if (val <= 3)
3957 		alc5505_coef_set(codec, 0x6220, 0x2002010f); /* I/O PAD Configuration */
3958 	else
3959 		alc5505_coef_set(codec, 0x6220, 0x6002018f);
3960 
3961 	alc5505_coef_set(codec, 0x61ac, 0x055525f0); /**/
3962 	alc5505_coef_set(codec, 0x61c0, 0x12230080); /* Clock control */
3963 	alc5505_coef_set(codec, 0x61b4, 0x040e2b02); /* PLL2 control */
3964 	alc5505_coef_set(codec, 0x61bc, 0x010234f8); /* OSC Control */
3965 	alc5505_coef_set(codec, 0x880c, 0x00000004); /* DRAM Function control */
3966 	alc5505_coef_set(codec, 0x880c, 0x00000003);
3967 	alc5505_coef_set(codec, 0x880c, 0x00000010);
3968 
3969 #ifdef HALT_REALTEK_ALC5505
3970 	alc5505_dsp_halt(codec);
3971 #endif
3972 }
3973 
3974 #ifdef HALT_REALTEK_ALC5505
3975 #define alc5505_dsp_suspend(codec)	do { } while (0) /* NOP */
3976 #define alc5505_dsp_resume(codec)	do { } while (0) /* NOP */
3977 #else
3978 #define alc5505_dsp_suspend(codec)	alc5505_dsp_halt(codec)
3979 #define alc5505_dsp_resume(codec)	alc5505_dsp_back_from_halt(codec)
3980 #endif
3981 
3982 #ifdef CONFIG_PM
alc269_suspend(struct hda_codec *codec)3983 static int alc269_suspend(struct hda_codec *codec)
3984 {
3985 	struct alc_spec *spec = codec->spec;
3986 
3987 	if (spec->has_alc5505_dsp)
3988 		alc5505_dsp_suspend(codec);
3989 	return alc_suspend(codec);
3990 }
3991 
alc269_resume(struct hda_codec *codec)3992 static int alc269_resume(struct hda_codec *codec)
3993 {
3994 	struct alc_spec *spec = codec->spec;
3995 
3996 	if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3997 		alc269vb_toggle_power_output(codec, 0);
3998 	if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
3999 			(alc_get_coef0(codec) & 0x00ff) == 0x018) {
4000 		msleep(150);
4001 	}
4002 
4003 	codec->patch_ops.init(codec);
4004 
4005 	if (spec->codec_variant == ALC269_TYPE_ALC269VB)
4006 		alc269vb_toggle_power_output(codec, 1);
4007 	if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
4008 			(alc_get_coef0(codec) & 0x00ff) == 0x017) {
4009 		msleep(200);
4010 	}
4011 
4012 	snd_hda_regmap_sync(codec);
4013 	hda_call_check_power_status(codec, 0x01);
4014 
4015 	/* on some machine, the BIOS will clear the codec gpio data when enter
4016 	 * suspend, and won't restore the data after resume, so we restore it
4017 	 * in the driver.
4018 	 */
4019 	if (spec->gpio_data)
4020 		alc_write_gpio_data(codec);
4021 
4022 	if (spec->has_alc5505_dsp)
4023 		alc5505_dsp_resume(codec);
4024 
4025 	return 0;
4026 }
4027 #endif /* CONFIG_PM */
4028 
alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec, const struct hda_fixup *fix, int action)4029 static void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec,
4030 						 const struct hda_fixup *fix, int action)
4031 {
4032 	struct alc_spec *spec = codec->spec;
4033 
4034 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
4035 		spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
4036 }
4037 
alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec *codec, const struct hda_fixup *fix, int action)4038 static void alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec *codec,
4039 						 const struct hda_fixup *fix,
4040 						 int action)
4041 {
4042 	unsigned int cfg_headphone = snd_hda_codec_get_pincfg(codec, 0x21);
4043 	unsigned int cfg_headset_mic = snd_hda_codec_get_pincfg(codec, 0x19);
4044 
4045 	if (cfg_headphone && cfg_headset_mic == 0x411111f0)
4046 		snd_hda_codec_set_pincfg(codec, 0x19,
4047 			(cfg_headphone & ~AC_DEFCFG_DEVICE) |
4048 			(AC_JACK_MIC_IN << AC_DEFCFG_DEVICE_SHIFT));
4049 }
4050 
alc269_fixup_hweq(struct hda_codec *codec, const struct hda_fixup *fix, int action)4051 static void alc269_fixup_hweq(struct hda_codec *codec,
4052 			       const struct hda_fixup *fix, int action)
4053 {
4054 	if (action == HDA_FIXUP_ACT_INIT)
4055 		alc_update_coef_idx(codec, 0x1e, 0, 0x80);
4056 }
4057 
alc269_fixup_headset_mic(struct hda_codec *codec, const struct hda_fixup *fix, int action)4058 static void alc269_fixup_headset_mic(struct hda_codec *codec,
4059 				       const struct hda_fixup *fix, int action)
4060 {
4061 	struct alc_spec *spec = codec->spec;
4062 
4063 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
4064 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
4065 }
4066 
alc271_fixup_dmic(struct hda_codec *codec, const struct hda_fixup *fix, int action)4067 static void alc271_fixup_dmic(struct hda_codec *codec,
4068 			      const struct hda_fixup *fix, int action)
4069 {
4070 	static const struct hda_verb verbs[] = {
4071 		{0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
4072 		{0x20, AC_VERB_SET_PROC_COEF, 0x4000},
4073 		{}
4074 	};
4075 	unsigned int cfg;
4076 
4077 	if (strcmp(codec->core.chip_name, "ALC271X") &&
4078 	    strcmp(codec->core.chip_name, "ALC269VB"))
4079 		return;
4080 	cfg = snd_hda_codec_get_pincfg(codec, 0x12);
4081 	if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED)
4082 		snd_hda_sequence_write(codec, verbs);
4083 }
4084 
4085 /* Fix the speaker amp after resume, etc */
alc269vb_fixup_aspire_e1_coef(struct hda_codec *codec, const struct hda_fixup *fix, int action)4086 static void alc269vb_fixup_aspire_e1_coef(struct hda_codec *codec,
4087 					  const struct hda_fixup *fix,
4088 					  int action)
4089 {
4090 	if (action == HDA_FIXUP_ACT_INIT)
4091 		alc_update_coef_idx(codec, 0x0d, 0x6000, 0x6000);
4092 }
4093 
alc269_fixup_pcm_44k(struct hda_codec *codec, const struct hda_fixup *fix, int action)4094 static void alc269_fixup_pcm_44k(struct hda_codec *codec,
4095 				 const struct hda_fixup *fix, int action)
4096 {
4097 	struct alc_spec *spec = codec->spec;
4098 
4099 	if (action != HDA_FIXUP_ACT_PROBE)
4100 		return;
4101 
4102 	/* Due to a hardware problem on Lenovo Ideadpad, we need to
4103 	 * fix the sample rate of analog I/O to 44.1kHz
4104 	 */
4105 	spec->gen.stream_analog_playback = &alc269_44k_pcm_analog_playback;
4106 	spec->gen.stream_analog_capture = &alc269_44k_pcm_analog_capture;
4107 }
4108 
alc269_fixup_stereo_dmic(struct hda_codec *codec, const struct hda_fixup *fix, int action)4109 static void alc269_fixup_stereo_dmic(struct hda_codec *codec,
4110 				     const struct hda_fixup *fix, int action)
4111 {
4112 	/* The digital-mic unit sends PDM (differential signal) instead of
4113 	 * the standard PCM, thus you can't record a valid mono stream as is.
4114 	 * Below is a workaround specific to ALC269 to control the dmic
4115 	 * signal source as mono.
4116 	 */
4117 	if (action == HDA_FIXUP_ACT_INIT)
4118 		alc_update_coef_idx(codec, 0x07, 0, 0x80);
4119 }
4120 
alc269_quanta_automute(struct hda_codec *codec)4121 static void alc269_quanta_automute(struct hda_codec *codec)
4122 {
4123 	snd_hda_gen_update_outputs(codec);
4124 
4125 	alc_write_coef_idx(codec, 0x0c, 0x680);
4126 	alc_write_coef_idx(codec, 0x0c, 0x480);
4127 }
4128 
alc269_fixup_quanta_mute(struct hda_codec *codec, const struct hda_fixup *fix, int action)4129 static void alc269_fixup_quanta_mute(struct hda_codec *codec,
4130 				     const struct hda_fixup *fix, int action)
4131 {
4132 	struct alc_spec *spec = codec->spec;
4133 	if (action != HDA_FIXUP_ACT_PROBE)
4134 		return;
4135 	spec->gen.automute_hook = alc269_quanta_automute;
4136 }
4137 
alc269_x101_hp_automute_hook(struct hda_codec *codec, struct hda_jack_callback *jack)4138 static void alc269_x101_hp_automute_hook(struct hda_codec *codec,
4139 					 struct hda_jack_callback *jack)
4140 {
4141 	struct alc_spec *spec = codec->spec;
4142 	int vref;
4143 	msleep(200);
4144 	snd_hda_gen_hp_automute(codec, jack);
4145 
4146 	vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
4147 	msleep(100);
4148 	snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4149 			    vref);
4150 	msleep(500);
4151 	snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4152 			    vref);
4153 }
4154 
4155 /*
4156  * Magic sequence to make Huawei Matebook X right speaker working (bko#197801)
4157  */
4158 struct hda_alc298_mbxinit {
4159 	unsigned char value_0x23;
4160 	unsigned char value_0x25;
4161 };
4162 
alc298_huawei_mbx_stereo_seq(struct hda_codec *codec, const struct hda_alc298_mbxinit *initval, bool first)4163 static void alc298_huawei_mbx_stereo_seq(struct hda_codec *codec,
4164 					 const struct hda_alc298_mbxinit *initval,
4165 					 bool first)
4166 {
4167 	snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x0);
4168 	alc_write_coef_idx(codec, 0x26, 0xb000);
4169 
4170 	if (first)
4171 		snd_hda_codec_write(codec, 0x21, 0, AC_VERB_GET_PIN_SENSE, 0x0);
4172 
4173 	snd_hda_codec_write(codec, 0x6, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
4174 	alc_write_coef_idx(codec, 0x26, 0xf000);
4175 	alc_write_coef_idx(codec, 0x23, initval->value_0x23);
4176 
4177 	if (initval->value_0x23 != 0x1e)
4178 		alc_write_coef_idx(codec, 0x25, initval->value_0x25);
4179 
4180 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
4181 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
4182 }
4183 
alc298_fixup_huawei_mbx_stereo(struct hda_codec *codec, const struct hda_fixup *fix, int action)4184 static void alc298_fixup_huawei_mbx_stereo(struct hda_codec *codec,
4185 					   const struct hda_fixup *fix,
4186 					   int action)
4187 {
4188 	/* Initialization magic */
4189 	static const struct hda_alc298_mbxinit dac_init[] = {
4190 		{0x0c, 0x00}, {0x0d, 0x00}, {0x0e, 0x00}, {0x0f, 0x00},
4191 		{0x10, 0x00}, {0x1a, 0x40}, {0x1b, 0x82}, {0x1c, 0x00},
4192 		{0x1d, 0x00}, {0x1e, 0x00}, {0x1f, 0x00},
4193 		{0x20, 0xc2}, {0x21, 0xc8}, {0x22, 0x26}, {0x23, 0x24},
4194 		{0x27, 0xff}, {0x28, 0xff}, {0x29, 0xff}, {0x2a, 0x8f},
4195 		{0x2b, 0x02}, {0x2c, 0x48}, {0x2d, 0x34}, {0x2e, 0x00},
4196 		{0x2f, 0x00},
4197 		{0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00},
4198 		{0x34, 0x00}, {0x35, 0x01}, {0x36, 0x93}, {0x37, 0x0c},
4199 		{0x38, 0x00}, {0x39, 0x00}, {0x3a, 0xf8}, {0x38, 0x80},
4200 		{}
4201 	};
4202 	const struct hda_alc298_mbxinit *seq;
4203 
4204 	if (action != HDA_FIXUP_ACT_INIT)
4205 		return;
4206 
4207 	/* Start */
4208 	snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x00);
4209 	snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
4210 	alc_write_coef_idx(codec, 0x26, 0xf000);
4211 	alc_write_coef_idx(codec, 0x22, 0x31);
4212 	alc_write_coef_idx(codec, 0x23, 0x0b);
4213 	alc_write_coef_idx(codec, 0x25, 0x00);
4214 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
4215 	snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
4216 
4217 	for (seq = dac_init; seq->value_0x23; seq++)
4218 		alc298_huawei_mbx_stereo_seq(codec, seq, seq == dac_init);
4219 }
4220 
alc269_fixup_x101_headset_mic(struct hda_codec *codec, const struct hda_fixup *fix, int action)4221 static void alc269_fixup_x101_headset_mic(struct hda_codec *codec,
4222 				     const struct hda_fixup *fix, int action)
4223 {
4224 	struct alc_spec *spec = codec->spec;
4225 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4226 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
4227 		spec->gen.hp_automute_hook = alc269_x101_hp_automute_hook;
4228 	}
4229 }
4230 
alc_update_vref_led(struct hda_codec *codec, hda_nid_t pin, bool polarity, bool on)4231 static void alc_update_vref_led(struct hda_codec *codec, hda_nid_t pin,
4232 				bool polarity, bool on)
4233 {
4234 	unsigned int pinval;
4235 
4236 	if (!pin)
4237 		return;
4238 	if (polarity)
4239 		on = !on;
4240 	pinval = snd_hda_codec_get_pin_target(codec, pin);
4241 	pinval &= ~AC_PINCTL_VREFEN;
4242 	pinval |= on ? AC_PINCTL_VREF_80 : AC_PINCTL_VREF_HIZ;
4243 	/* temporarily power up/down for setting VREF */
4244 	snd_hda_power_up_pm(codec);
4245 	snd_hda_set_pin_ctl_cache(codec, pin, pinval);
4246 	snd_hda_power_down_pm(codec);
4247 }
4248 
4249 /* update mute-LED according to the speaker mute state via mic VREF pin */
vref_mute_led_set(struct led_classdev *led_cdev, enum led_brightness brightness)4250 static int vref_mute_led_set(struct led_classdev *led_cdev,
4251 			     enum led_brightness brightness)
4252 {
4253 	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4254 	struct alc_spec *spec = codec->spec;
4255 
4256 	alc_update_vref_led(codec, spec->mute_led_nid,
4257 			    spec->mute_led_polarity, brightness);
4258 	return 0;
4259 }
4260 
4261 /* Make sure the led works even in runtime suspend */
led_power_filter(struct hda_codec *codec, hda_nid_t nid, unsigned int power_state)4262 static unsigned int led_power_filter(struct hda_codec *codec,
4263 						  hda_nid_t nid,
4264 						  unsigned int power_state)
4265 {
4266 	struct alc_spec *spec = codec->spec;
4267 
4268 	if (power_state != AC_PWRST_D3 || nid == 0 ||
4269 	    (nid != spec->mute_led_nid && nid != spec->cap_mute_led_nid))
4270 		return power_state;
4271 
4272 	/* Set pin ctl again, it might have just been set to 0 */
4273 	snd_hda_set_pin_ctl(codec, nid,
4274 			    snd_hda_codec_get_pin_target(codec, nid));
4275 
4276 	return snd_hda_gen_path_power_filter(codec, nid, power_state);
4277 }
4278 
alc269_fixup_hp_mute_led(struct hda_codec *codec, const struct hda_fixup *fix, int action)4279 static void alc269_fixup_hp_mute_led(struct hda_codec *codec,
4280 				     const struct hda_fixup *fix, int action)
4281 {
4282 	struct alc_spec *spec = codec->spec;
4283 	const struct dmi_device *dev = NULL;
4284 
4285 	if (action != HDA_FIXUP_ACT_PRE_PROBE)
4286 		return;
4287 
4288 	while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) {
4289 		int pol, pin;
4290 		if (sscanf(dev->name, "HP_Mute_LED_%d_%x", &pol, &pin) != 2)
4291 			continue;
4292 		if (pin < 0x0a || pin >= 0x10)
4293 			break;
4294 		spec->mute_led_polarity = pol;
4295 		spec->mute_led_nid = pin - 0x0a + 0x18;
4296 		snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
4297 		codec->power_filter = led_power_filter;
4298 		codec_dbg(codec,
4299 			  "Detected mute LED for %x:%d\n", spec->mute_led_nid,
4300 			   spec->mute_led_polarity);
4301 		break;
4302 	}
4303 }
4304 
alc269_fixup_hp_mute_led_micx(struct hda_codec *codec, const struct hda_fixup *fix, int action, hda_nid_t pin)4305 static void alc269_fixup_hp_mute_led_micx(struct hda_codec *codec,
4306 					  const struct hda_fixup *fix,
4307 					  int action, hda_nid_t pin)
4308 {
4309 	struct alc_spec *spec = codec->spec;
4310 
4311 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4312 		spec->mute_led_polarity = 0;
4313 		spec->mute_led_nid = pin;
4314 		snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
4315 		codec->power_filter = led_power_filter;
4316 	}
4317 }
4318 
alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec, const struct hda_fixup *fix, int action)4319 static void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec,
4320 				const struct hda_fixup *fix, int action)
4321 {
4322 	alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x18);
4323 }
4324 
alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec, const struct hda_fixup *fix, int action)4325 static void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec,
4326 				const struct hda_fixup *fix, int action)
4327 {
4328 	alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x19);
4329 }
4330 
alc269_fixup_hp_mute_led_mic3(struct hda_codec *codec, const struct hda_fixup *fix, int action)4331 static void alc269_fixup_hp_mute_led_mic3(struct hda_codec *codec,
4332 				const struct hda_fixup *fix, int action)
4333 {
4334 	alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1b);
4335 }
4336 
4337 /* update LED status via GPIO */
alc_update_gpio_led(struct hda_codec *codec, unsigned int mask, int polarity, bool enabled)4338 static void alc_update_gpio_led(struct hda_codec *codec, unsigned int mask,
4339 				int polarity, bool enabled)
4340 {
4341 	if (polarity)
4342 		enabled = !enabled;
4343 	alc_update_gpio_data(codec, mask, !enabled); /* muted -> LED on */
4344 }
4345 
4346 /* turn on/off mute LED via GPIO per vmaster hook */
gpio_mute_led_set(struct led_classdev *led_cdev, enum led_brightness brightness)4347 static int gpio_mute_led_set(struct led_classdev *led_cdev,
4348 			     enum led_brightness brightness)
4349 {
4350 	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4351 	struct alc_spec *spec = codec->spec;
4352 
4353 	alc_update_gpio_led(codec, spec->gpio_mute_led_mask,
4354 			    spec->mute_led_polarity, !brightness);
4355 	return 0;
4356 }
4357 
4358 /* turn on/off mic-mute LED via GPIO per capture hook */
micmute_led_set(struct led_classdev *led_cdev, enum led_brightness brightness)4359 static int micmute_led_set(struct led_classdev *led_cdev,
4360 			   enum led_brightness brightness)
4361 {
4362 	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4363 	struct alc_spec *spec = codec->spec;
4364 
4365 	alc_update_gpio_led(codec, spec->gpio_mic_led_mask,
4366 			    spec->micmute_led_polarity, !brightness);
4367 	return 0;
4368 }
4369 
4370 /* setup mute and mic-mute GPIO bits, add hooks appropriately */
alc_fixup_hp_gpio_led(struct hda_codec *codec, int action, unsigned int mute_mask, unsigned int micmute_mask)4371 static void alc_fixup_hp_gpio_led(struct hda_codec *codec,
4372 				  int action,
4373 				  unsigned int mute_mask,
4374 				  unsigned int micmute_mask)
4375 {
4376 	struct alc_spec *spec = codec->spec;
4377 
4378 	alc_fixup_gpio(codec, action, mute_mask | micmute_mask);
4379 
4380 	if (action != HDA_FIXUP_ACT_PRE_PROBE)
4381 		return;
4382 	if (mute_mask) {
4383 		spec->gpio_mute_led_mask = mute_mask;
4384 		snd_hda_gen_add_mute_led_cdev(codec, gpio_mute_led_set);
4385 	}
4386 	if (micmute_mask) {
4387 		spec->gpio_mic_led_mask = micmute_mask;
4388 		snd_hda_gen_add_micmute_led_cdev(codec, micmute_led_set);
4389 	}
4390 }
4391 
alc236_fixup_hp_gpio_led(struct hda_codec *codec, const struct hda_fixup *fix, int action)4392 static void alc236_fixup_hp_gpio_led(struct hda_codec *codec,
4393 				const struct hda_fixup *fix, int action)
4394 {
4395 	alc_fixup_hp_gpio_led(codec, action, 0x02, 0x01);
4396 }
4397 
alc269_fixup_hp_gpio_led(struct hda_codec *codec, const struct hda_fixup *fix, int action)4398 static void alc269_fixup_hp_gpio_led(struct hda_codec *codec,
4399 				const struct hda_fixup *fix, int action)
4400 {
4401 	alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
4402 }
4403 
alc285_fixup_hp_gpio_led(struct hda_codec *codec, const struct hda_fixup *fix, int action)4404 static void alc285_fixup_hp_gpio_led(struct hda_codec *codec,
4405 				const struct hda_fixup *fix, int action)
4406 {
4407 	alc_fixup_hp_gpio_led(codec, action, 0x04, 0x01);
4408 }
4409 
alc286_fixup_hp_gpio_led(struct hda_codec *codec, const struct hda_fixup *fix, int action)4410 static void alc286_fixup_hp_gpio_led(struct hda_codec *codec,
4411 				const struct hda_fixup *fix, int action)
4412 {
4413 	alc_fixup_hp_gpio_led(codec, action, 0x02, 0x20);
4414 }
4415 
alc287_fixup_hp_gpio_led(struct hda_codec *codec, const struct hda_fixup *fix, int action)4416 static void alc287_fixup_hp_gpio_led(struct hda_codec *codec,
4417 				const struct hda_fixup *fix, int action)
4418 {
4419 	alc_fixup_hp_gpio_led(codec, action, 0x10, 0);
4420 }
4421 
alc245_fixup_hp_gpio_led(struct hda_codec *codec, const struct hda_fixup *fix, int action)4422 static void alc245_fixup_hp_gpio_led(struct hda_codec *codec,
4423 				const struct hda_fixup *fix, int action)
4424 {
4425 	struct alc_spec *spec = codec->spec;
4426 
4427 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
4428 		spec->micmute_led_polarity = 1;
4429 	alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
4430 }
4431 
4432 /* turn on/off mic-mute LED per capture hook via VREF change */
vref_micmute_led_set(struct led_classdev *led_cdev, enum led_brightness brightness)4433 static int vref_micmute_led_set(struct led_classdev *led_cdev,
4434 				enum led_brightness brightness)
4435 {
4436 	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4437 	struct alc_spec *spec = codec->spec;
4438 
4439 	alc_update_vref_led(codec, spec->cap_mute_led_nid,
4440 			    spec->micmute_led_polarity, brightness);
4441 	return 0;
4442 }
4443 
alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec, const struct hda_fixup *fix, int action)4444 static void alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec,
4445 				const struct hda_fixup *fix, int action)
4446 {
4447 	struct alc_spec *spec = codec->spec;
4448 
4449 	alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
4450 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4451 		/* Like hp_gpio_mic1_led, but also needs GPIO4 low to
4452 		 * enable headphone amp
4453 		 */
4454 		spec->gpio_mask |= 0x10;
4455 		spec->gpio_dir |= 0x10;
4456 		spec->cap_mute_led_nid = 0x18;
4457 		snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4458 		codec->power_filter = led_power_filter;
4459 	}
4460 }
4461 
alc280_fixup_hp_gpio4(struct hda_codec *codec, const struct hda_fixup *fix, int action)4462 static void alc280_fixup_hp_gpio4(struct hda_codec *codec,
4463 				   const struct hda_fixup *fix, int action)
4464 {
4465 	struct alc_spec *spec = codec->spec;
4466 
4467 	alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
4468 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4469 		spec->cap_mute_led_nid = 0x18;
4470 		snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4471 		codec->power_filter = led_power_filter;
4472 	}
4473 }
4474 
4475 /* HP Spectre x360 14 model needs a unique workaround for enabling the amp;
4476  * it needs to toggle the GPIO0 once on and off at each time (bko#210633)
4477  */
alc245_fixup_hp_x360_amp(struct hda_codec *codec, const struct hda_fixup *fix, int action)4478 static void alc245_fixup_hp_x360_amp(struct hda_codec *codec,
4479 				     const struct hda_fixup *fix, int action)
4480 {
4481 	struct alc_spec *spec = codec->spec;
4482 
4483 	switch (action) {
4484 	case HDA_FIXUP_ACT_PRE_PROBE:
4485 		spec->gpio_mask |= 0x01;
4486 		spec->gpio_dir |= 0x01;
4487 		break;
4488 	case HDA_FIXUP_ACT_INIT:
4489 		/* need to toggle GPIO to enable the amp */
4490 		alc_update_gpio_data(codec, 0x01, true);
4491 		msleep(100);
4492 		alc_update_gpio_data(codec, 0x01, false);
4493 		break;
4494 	}
4495 }
4496 
4497 /* toggle GPIO2 at each time stream is started; we use PREPARE state instead */
alc274_hp_envy_pcm_hook(struct hda_pcm_stream *hinfo, struct hda_codec *codec, struct snd_pcm_substream *substream, int action)4498 static void alc274_hp_envy_pcm_hook(struct hda_pcm_stream *hinfo,
4499 				    struct hda_codec *codec,
4500 				    struct snd_pcm_substream *substream,
4501 				    int action)
4502 {
4503 	switch (action) {
4504 	case HDA_GEN_PCM_ACT_PREPARE:
4505 		alc_update_gpio_data(codec, 0x04, true);
4506 		break;
4507 	case HDA_GEN_PCM_ACT_CLEANUP:
4508 		alc_update_gpio_data(codec, 0x04, false);
4509 		break;
4510 	}
4511 }
4512 
alc274_fixup_hp_envy_gpio(struct hda_codec *codec, const struct hda_fixup *fix, int action)4513 static void alc274_fixup_hp_envy_gpio(struct hda_codec *codec,
4514 				      const struct hda_fixup *fix,
4515 				      int action)
4516 {
4517 	struct alc_spec *spec = codec->spec;
4518 
4519 	if (action == HDA_FIXUP_ACT_PROBE) {
4520 		spec->gpio_mask |= 0x04;
4521 		spec->gpio_dir |= 0x04;
4522 		spec->gen.pcm_playback_hook = alc274_hp_envy_pcm_hook;
4523 	}
4524 }
4525 
alc_update_coef_led(struct hda_codec *codec, struct alc_coef_led *led, bool polarity, bool on)4526 static void alc_update_coef_led(struct hda_codec *codec,
4527 				struct alc_coef_led *led,
4528 				bool polarity, bool on)
4529 {
4530 	if (polarity)
4531 		on = !on;
4532 	/* temporarily power up/down for setting COEF bit */
4533 	alc_update_coef_idx(codec, led->idx, led->mask,
4534 			    on ? led->on : led->off);
4535 }
4536 
4537 /* update mute-LED according to the speaker mute state via COEF bit */
coef_mute_led_set(struct led_classdev *led_cdev, enum led_brightness brightness)4538 static int coef_mute_led_set(struct led_classdev *led_cdev,
4539 			     enum led_brightness brightness)
4540 {
4541 	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4542 	struct alc_spec *spec = codec->spec;
4543 
4544 	alc_update_coef_led(codec, &spec->mute_led_coef,
4545 			    spec->mute_led_polarity, brightness);
4546 	return 0;
4547 }
4548 
alc285_fixup_hp_mute_led_coefbit(struct hda_codec *codec, const struct hda_fixup *fix, int action)4549 static void alc285_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4550 					  const struct hda_fixup *fix,
4551 					  int action)
4552 {
4553 	struct alc_spec *spec = codec->spec;
4554 
4555 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4556 		spec->mute_led_polarity = 0;
4557 		spec->mute_led_coef.idx = 0x0b;
4558 		spec->mute_led_coef.mask = 1 << 3;
4559 		spec->mute_led_coef.on = 1 << 3;
4560 		spec->mute_led_coef.off = 0;
4561 		snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4562 	}
4563 }
4564 
alc236_fixup_hp_mute_led_coefbit(struct hda_codec *codec, const struct hda_fixup *fix, int action)4565 static void alc236_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4566 					  const struct hda_fixup *fix,
4567 					  int action)
4568 {
4569 	struct alc_spec *spec = codec->spec;
4570 
4571 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4572 		spec->mute_led_polarity = 0;
4573 		spec->mute_led_coef.idx = 0x34;
4574 		spec->mute_led_coef.mask = 1 << 5;
4575 		spec->mute_led_coef.on = 0;
4576 		spec->mute_led_coef.off = 1 << 5;
4577 		snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4578 	}
4579 }
4580 
alc236_fixup_hp_mute_led_coefbit2(struct hda_codec *codec, const struct hda_fixup *fix, int action)4581 static void alc236_fixup_hp_mute_led_coefbit2(struct hda_codec *codec,
4582 					  const struct hda_fixup *fix, int action)
4583 {
4584 	struct alc_spec *spec = codec->spec;
4585 
4586 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4587 		spec->mute_led_polarity = 0;
4588 		spec->mute_led_coef.idx = 0x07;
4589 		spec->mute_led_coef.mask = 1;
4590 		spec->mute_led_coef.on = 1;
4591 		spec->mute_led_coef.off = 0;
4592 		snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4593 	}
4594 }
4595 
4596 /* turn on/off mic-mute LED per capture hook by coef bit */
coef_micmute_led_set(struct led_classdev *led_cdev, enum led_brightness brightness)4597 static int coef_micmute_led_set(struct led_classdev *led_cdev,
4598 				enum led_brightness brightness)
4599 {
4600 	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4601 	struct alc_spec *spec = codec->spec;
4602 
4603 	alc_update_coef_led(codec, &spec->mic_led_coef,
4604 			    spec->micmute_led_polarity, brightness);
4605 	return 0;
4606 }
4607 
alc285_fixup_hp_coef_micmute_led(struct hda_codec *codec, const struct hda_fixup *fix, int action)4608 static void alc285_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4609 				const struct hda_fixup *fix, int action)
4610 {
4611 	struct alc_spec *spec = codec->spec;
4612 
4613 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4614 		spec->mic_led_coef.idx = 0x19;
4615 		spec->mic_led_coef.mask = 1 << 13;
4616 		spec->mic_led_coef.on = 1 << 13;
4617 		spec->mic_led_coef.off = 0;
4618 		snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
4619 	}
4620 }
4621 
alc285_fixup_hp_gpio_micmute_led(struct hda_codec *codec, const struct hda_fixup *fix, int action)4622 static void alc285_fixup_hp_gpio_micmute_led(struct hda_codec *codec,
4623 				const struct hda_fixup *fix, int action)
4624 {
4625 	struct alc_spec *spec = codec->spec;
4626 
4627 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
4628 		spec->micmute_led_polarity = 1;
4629 	alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
4630 }
4631 
alc236_fixup_hp_coef_micmute_led(struct hda_codec *codec, const struct hda_fixup *fix, int action)4632 static void alc236_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4633 				const struct hda_fixup *fix, int action)
4634 {
4635 	struct alc_spec *spec = codec->spec;
4636 
4637 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4638 		spec->mic_led_coef.idx = 0x35;
4639 		spec->mic_led_coef.mask = 3 << 2;
4640 		spec->mic_led_coef.on = 2 << 2;
4641 		spec->mic_led_coef.off = 1 << 2;
4642 		snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
4643 	}
4644 }
4645 
alc285_fixup_hp_mute_led(struct hda_codec *codec, const struct hda_fixup *fix, int action)4646 static void alc285_fixup_hp_mute_led(struct hda_codec *codec,
4647 				const struct hda_fixup *fix, int action)
4648 {
4649 	alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
4650 	alc285_fixup_hp_coef_micmute_led(codec, fix, action);
4651 }
4652 
alc285_fixup_hp_spectre_x360_mute_led(struct hda_codec *codec, const struct hda_fixup *fix, int action)4653 static void alc285_fixup_hp_spectre_x360_mute_led(struct hda_codec *codec,
4654 				const struct hda_fixup *fix, int action)
4655 {
4656 	alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
4657 	alc285_fixup_hp_gpio_micmute_led(codec, fix, action);
4658 }
4659 
alc236_fixup_hp_mute_led(struct hda_codec *codec, const struct hda_fixup *fix, int action)4660 static void alc236_fixup_hp_mute_led(struct hda_codec *codec,
4661 				const struct hda_fixup *fix, int action)
4662 {
4663 	alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
4664 	alc236_fixup_hp_coef_micmute_led(codec, fix, action);
4665 }
4666 
alc236_fixup_hp_micmute_led_vref(struct hda_codec *codec, const struct hda_fixup *fix, int action)4667 static void alc236_fixup_hp_micmute_led_vref(struct hda_codec *codec,
4668 				const struct hda_fixup *fix, int action)
4669 {
4670 	struct alc_spec *spec = codec->spec;
4671 
4672 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4673 		spec->cap_mute_led_nid = 0x1a;
4674 		snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4675 		codec->power_filter = led_power_filter;
4676 	}
4677 }
4678 
alc236_fixup_hp_mute_led_micmute_vref(struct hda_codec *codec, const struct hda_fixup *fix, int action)4679 static void alc236_fixup_hp_mute_led_micmute_vref(struct hda_codec *codec,
4680 				const struct hda_fixup *fix, int action)
4681 {
4682 	alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
4683 	alc236_fixup_hp_micmute_led_vref(codec, fix, action);
4684 }
4685 
alc298_samsung_write_coef_pack(struct hda_codec *codec, const unsigned short coefs[2])4686 static inline void alc298_samsung_write_coef_pack(struct hda_codec *codec,
4687 						  const unsigned short coefs[2])
4688 {
4689 	alc_write_coef_idx(codec, 0x23, coefs[0]);
4690 	alc_write_coef_idx(codec, 0x25, coefs[1]);
4691 	alc_write_coef_idx(codec, 0x26, 0xb011);
4692 }
4693 
4694 struct alc298_samsung_amp_desc {
4695 	unsigned char nid;
4696 	unsigned short init_seq[2][2];
4697 };
4698 
alc298_fixup_samsung_amp(struct hda_codec *codec, const struct hda_fixup *fix, int action)4699 static void alc298_fixup_samsung_amp(struct hda_codec *codec,
4700 				     const struct hda_fixup *fix, int action)
4701 {
4702 	int i, j;
4703 	static const unsigned short init_seq[][2] = {
4704 		{ 0x19, 0x00 }, { 0x20, 0xc0 }, { 0x22, 0x44 }, { 0x23, 0x08 },
4705 		{ 0x24, 0x85 }, { 0x25, 0x41 }, { 0x35, 0x40 }, { 0x36, 0x01 },
4706 		{ 0x38, 0x81 }, { 0x3a, 0x03 }, { 0x3b, 0x81 }, { 0x40, 0x3e },
4707 		{ 0x41, 0x07 }, { 0x400, 0x1 }
4708 	};
4709 	static const struct alc298_samsung_amp_desc amps[] = {
4710 		{ 0x3a, { { 0x18, 0x1 }, { 0x26, 0x0 } } },
4711 		{ 0x39, { { 0x18, 0x2 }, { 0x26, 0x1 } } }
4712 	};
4713 
4714 	if (action != HDA_FIXUP_ACT_INIT)
4715 		return;
4716 
4717 	for (i = 0; i < ARRAY_SIZE(amps); i++) {
4718 		alc_write_coef_idx(codec, 0x22, amps[i].nid);
4719 
4720 		for (j = 0; j < ARRAY_SIZE(amps[i].init_seq); j++)
4721 			alc298_samsung_write_coef_pack(codec, amps[i].init_seq[j]);
4722 
4723 		for (j = 0; j < ARRAY_SIZE(init_seq); j++)
4724 			alc298_samsung_write_coef_pack(codec, init_seq[j]);
4725 	}
4726 }
4727 
4728 #if IS_REACHABLE(CONFIG_INPUT)
gpio2_mic_hotkey_event(struct hda_codec *codec, struct hda_jack_callback *event)4729 static void gpio2_mic_hotkey_event(struct hda_codec *codec,
4730 				   struct hda_jack_callback *event)
4731 {
4732 	struct alc_spec *spec = codec->spec;
4733 
4734 	/* GPIO2 just toggles on a keypress/keyrelease cycle. Therefore
4735 	   send both key on and key off event for every interrupt. */
4736 	input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 1);
4737 	input_sync(spec->kb_dev);
4738 	input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 0);
4739 	input_sync(spec->kb_dev);
4740 }
4741 
alc_register_micmute_input_device(struct hda_codec *codec)4742 static int alc_register_micmute_input_device(struct hda_codec *codec)
4743 {
4744 	struct alc_spec *spec = codec->spec;
4745 	int i;
4746 
4747 	spec->kb_dev = input_allocate_device();
4748 	if (!spec->kb_dev) {
4749 		codec_err(codec, "Out of memory (input_allocate_device)\n");
4750 		return -ENOMEM;
4751 	}
4752 
4753 	spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX] = KEY_MICMUTE;
4754 
4755 	spec->kb_dev->name = "Microphone Mute Button";
4756 	spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY);
4757 	spec->kb_dev->keycodesize = sizeof(spec->alc_mute_keycode_map[0]);
4758 	spec->kb_dev->keycodemax = ARRAY_SIZE(spec->alc_mute_keycode_map);
4759 	spec->kb_dev->keycode = spec->alc_mute_keycode_map;
4760 	for (i = 0; i < ARRAY_SIZE(spec->alc_mute_keycode_map); i++)
4761 		set_bit(spec->alc_mute_keycode_map[i], spec->kb_dev->keybit);
4762 
4763 	if (input_register_device(spec->kb_dev)) {
4764 		codec_err(codec, "input_register_device failed\n");
4765 		input_free_device(spec->kb_dev);
4766 		spec->kb_dev = NULL;
4767 		return -ENOMEM;
4768 	}
4769 
4770 	return 0;
4771 }
4772 
4773 /* GPIO1 = set according to SKU external amp
4774  * GPIO2 = mic mute hotkey
4775  * GPIO3 = mute LED
4776  * GPIO4 = mic mute LED
4777  */
alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec, const struct hda_fixup *fix, int action)4778 static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec,
4779 					     const struct hda_fixup *fix, int action)
4780 {
4781 	struct alc_spec *spec = codec->spec;
4782 
4783 	alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
4784 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4785 		spec->init_amp = ALC_INIT_DEFAULT;
4786 		if (alc_register_micmute_input_device(codec) != 0)
4787 			return;
4788 
4789 		spec->gpio_mask |= 0x06;
4790 		spec->gpio_dir |= 0x02;
4791 		spec->gpio_data |= 0x02;
4792 		snd_hda_codec_write_cache(codec, codec->core.afg, 0,
4793 					  AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x04);
4794 		snd_hda_jack_detect_enable_callback(codec, codec->core.afg,
4795 						    gpio2_mic_hotkey_event);
4796 		return;
4797 	}
4798 
4799 	if (!spec->kb_dev)
4800 		return;
4801 
4802 	switch (action) {
4803 	case HDA_FIXUP_ACT_FREE:
4804 		input_unregister_device(spec->kb_dev);
4805 		spec->kb_dev = NULL;
4806 	}
4807 }
4808 
4809 /* Line2 = mic mute hotkey
4810  * GPIO2 = mic mute LED
4811  */
alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec, const struct hda_fixup *fix, int action)4812 static void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec,
4813 					     const struct hda_fixup *fix, int action)
4814 {
4815 	struct alc_spec *spec = codec->spec;
4816 
4817 	alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
4818 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4819 		spec->init_amp = ALC_INIT_DEFAULT;
4820 		if (alc_register_micmute_input_device(codec) != 0)
4821 			return;
4822 
4823 		snd_hda_jack_detect_enable_callback(codec, 0x1b,
4824 						    gpio2_mic_hotkey_event);
4825 		return;
4826 	}
4827 
4828 	if (!spec->kb_dev)
4829 		return;
4830 
4831 	switch (action) {
4832 	case HDA_FIXUP_ACT_FREE:
4833 		input_unregister_device(spec->kb_dev);
4834 		spec->kb_dev = NULL;
4835 	}
4836 }
4837 #else /* INPUT */
4838 #define alc280_fixup_hp_gpio2_mic_hotkey	NULL
4839 #define alc233_fixup_lenovo_line2_mic_hotkey	NULL
4840 #endif /* INPUT */
4841 
alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec, const struct hda_fixup *fix, int action)4842 static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec,
4843 				const struct hda_fixup *fix, int action)
4844 {
4845 	struct alc_spec *spec = codec->spec;
4846 
4847 	alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1a);
4848 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4849 		spec->cap_mute_led_nid = 0x18;
4850 		snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4851 	}
4852 }
4853 
4854 static const struct coef_fw alc225_pre_hsmode[] = {
4855 	UPDATE_COEF(0x4a, 1<<8, 0),
4856 	UPDATE_COEFEX(0x57, 0x05, 1<<14, 0),
4857 	UPDATE_COEF(0x63, 3<<14, 3<<14),
4858 	UPDATE_COEF(0x4a, 3<<4, 2<<4),
4859 	UPDATE_COEF(0x4a, 3<<10, 3<<10),
4860 	UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10),
4861 	UPDATE_COEF(0x4a, 3<<10, 0),
4862 	{}
4863 };
4864 
alc_headset_mode_unplugged(struct hda_codec *codec)4865 static void alc_headset_mode_unplugged(struct hda_codec *codec)
4866 {
4867 	struct alc_spec *spec = codec->spec;
4868 	static const struct coef_fw coef0255[] = {
4869 		WRITE_COEF(0x1b, 0x0c0b), /* LDO and MISC control */
4870 		WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
4871 		UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
4872 		WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
4873 		WRITE_COEFEX(0x57, 0x03, 0x8aa6), /* Direct Drive HP Amp control */
4874 		{}
4875 	};
4876 	static const struct coef_fw coef0256[] = {
4877 		WRITE_COEF(0x1b, 0x0c4b), /* LDO and MISC control */
4878 		WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
4879 		WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
4880 		WRITE_COEFEX(0x57, 0x03, 0x09a3), /* Direct Drive HP Amp control */
4881 		UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
4882 		{}
4883 	};
4884 	static const struct coef_fw coef0233[] = {
4885 		WRITE_COEF(0x1b, 0x0c0b),
4886 		WRITE_COEF(0x45, 0xc429),
4887 		UPDATE_COEF(0x35, 0x4000, 0),
4888 		WRITE_COEF(0x06, 0x2104),
4889 		WRITE_COEF(0x1a, 0x0001),
4890 		WRITE_COEF(0x26, 0x0004),
4891 		WRITE_COEF(0x32, 0x42a3),
4892 		{}
4893 	};
4894 	static const struct coef_fw coef0288[] = {
4895 		UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
4896 		UPDATE_COEF(0x50, 0x2000, 0x2000),
4897 		UPDATE_COEF(0x56, 0x0006, 0x0006),
4898 		UPDATE_COEF(0x66, 0x0008, 0),
4899 		UPDATE_COEF(0x67, 0x2000, 0),
4900 		{}
4901 	};
4902 	static const struct coef_fw coef0298[] = {
4903 		UPDATE_COEF(0x19, 0x1300, 0x0300),
4904 		{}
4905 	};
4906 	static const struct coef_fw coef0292[] = {
4907 		WRITE_COEF(0x76, 0x000e),
4908 		WRITE_COEF(0x6c, 0x2400),
4909 		WRITE_COEF(0x18, 0x7308),
4910 		WRITE_COEF(0x6b, 0xc429),
4911 		{}
4912 	};
4913 	static const struct coef_fw coef0293[] = {
4914 		UPDATE_COEF(0x10, 7<<8, 6<<8), /* SET Line1 JD to 0 */
4915 		UPDATE_COEFEX(0x57, 0x05, 1<<15|1<<13, 0x0), /* SET charge pump by verb */
4916 		UPDATE_COEFEX(0x57, 0x03, 1<<10, 1<<10), /* SET EN_OSW to 1 */
4917 		UPDATE_COEF(0x1a, 1<<3, 1<<3), /* Combo JD gating with LINE1-VREFO */
4918 		WRITE_COEF(0x45, 0xc429), /* Set to TRS type */
4919 		UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
4920 		{}
4921 	};
4922 	static const struct coef_fw coef0668[] = {
4923 		WRITE_COEF(0x15, 0x0d40),
4924 		WRITE_COEF(0xb7, 0x802b),
4925 		{}
4926 	};
4927 	static const struct coef_fw coef0225[] = {
4928 		UPDATE_COEF(0x63, 3<<14, 0),
4929 		{}
4930 	};
4931 	static const struct coef_fw coef0274[] = {
4932 		UPDATE_COEF(0x4a, 0x0100, 0),
4933 		UPDATE_COEFEX(0x57, 0x05, 0x4000, 0),
4934 		UPDATE_COEF(0x6b, 0xf000, 0x5000),
4935 		UPDATE_COEF(0x4a, 0x0010, 0),
4936 		UPDATE_COEF(0x4a, 0x0c00, 0x0c00),
4937 		WRITE_COEF(0x45, 0x5289),
4938 		UPDATE_COEF(0x4a, 0x0c00, 0),
4939 		{}
4940 	};
4941 
4942 	if (spec->no_internal_mic_pin) {
4943 		alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
4944 		return;
4945 	}
4946 
4947 	switch (codec->core.vendor_id) {
4948 	case 0x10ec0255:
4949 		alc_process_coef_fw(codec, coef0255);
4950 		break;
4951 	case 0x10ec0230:
4952 	case 0x10ec0236:
4953 	case 0x10ec0256:
4954 	case 0x19e58326:
4955 		alc_process_coef_fw(codec, coef0256);
4956 		break;
4957 	case 0x10ec0234:
4958 	case 0x10ec0274:
4959 	case 0x10ec0294:
4960 		alc_process_coef_fw(codec, coef0274);
4961 		break;
4962 	case 0x10ec0233:
4963 	case 0x10ec0283:
4964 		alc_process_coef_fw(codec, coef0233);
4965 		break;
4966 	case 0x10ec0286:
4967 	case 0x10ec0288:
4968 		alc_process_coef_fw(codec, coef0288);
4969 		break;
4970 	case 0x10ec0298:
4971 		alc_process_coef_fw(codec, coef0298);
4972 		alc_process_coef_fw(codec, coef0288);
4973 		break;
4974 	case 0x10ec0292:
4975 		alc_process_coef_fw(codec, coef0292);
4976 		break;
4977 	case 0x10ec0293:
4978 		alc_process_coef_fw(codec, coef0293);
4979 		break;
4980 	case 0x10ec0668:
4981 		alc_process_coef_fw(codec, coef0668);
4982 		break;
4983 	case 0x10ec0215:
4984 	case 0x10ec0225:
4985 	case 0x10ec0285:
4986 	case 0x10ec0295:
4987 	case 0x10ec0289:
4988 	case 0x10ec0299:
4989 		alc_process_coef_fw(codec, alc225_pre_hsmode);
4990 		alc_process_coef_fw(codec, coef0225);
4991 		break;
4992 	case 0x10ec0867:
4993 		alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
4994 		break;
4995 	}
4996 	codec_dbg(codec, "Headset jack set to unplugged mode.\n");
4997 }
4998 
4999 
alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin, hda_nid_t mic_pin)5000 static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
5001 				    hda_nid_t mic_pin)
5002 {
5003 	static const struct coef_fw coef0255[] = {
5004 		WRITE_COEFEX(0x57, 0x03, 0x8aa6),
5005 		WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
5006 		{}
5007 	};
5008 	static const struct coef_fw coef0256[] = {
5009 		UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14), /* Direct Drive HP Amp control(Set to verb control)*/
5010 		WRITE_COEFEX(0x57, 0x03, 0x09a3),
5011 		WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
5012 		{}
5013 	};
5014 	static const struct coef_fw coef0233[] = {
5015 		UPDATE_COEF(0x35, 0, 1<<14),
5016 		WRITE_COEF(0x06, 0x2100),
5017 		WRITE_COEF(0x1a, 0x0021),
5018 		WRITE_COEF(0x26, 0x008c),
5019 		{}
5020 	};
5021 	static const struct coef_fw coef0288[] = {
5022 		UPDATE_COEF(0x4f, 0x00c0, 0),
5023 		UPDATE_COEF(0x50, 0x2000, 0),
5024 		UPDATE_COEF(0x56, 0x0006, 0),
5025 		UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
5026 		UPDATE_COEF(0x66, 0x0008, 0x0008),
5027 		UPDATE_COEF(0x67, 0x2000, 0x2000),
5028 		{}
5029 	};
5030 	static const struct coef_fw coef0292[] = {
5031 		WRITE_COEF(0x19, 0xa208),
5032 		WRITE_COEF(0x2e, 0xacf0),
5033 		{}
5034 	};
5035 	static const struct coef_fw coef0293[] = {
5036 		UPDATE_COEFEX(0x57, 0x05, 0, 1<<15|1<<13), /* SET charge pump by verb */
5037 		UPDATE_COEFEX(0x57, 0x03, 1<<10, 0), /* SET EN_OSW to 0 */
5038 		UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
5039 		{}
5040 	};
5041 	static const struct coef_fw coef0688[] = {
5042 		WRITE_COEF(0xb7, 0x802b),
5043 		WRITE_COEF(0xb5, 0x1040),
5044 		UPDATE_COEF(0xc3, 0, 1<<12),
5045 		{}
5046 	};
5047 	static const struct coef_fw coef0225[] = {
5048 		UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14),
5049 		UPDATE_COEF(0x4a, 3<<4, 2<<4),
5050 		UPDATE_COEF(0x63, 3<<14, 0),
5051 		{}
5052 	};
5053 	static const struct coef_fw coef0274[] = {
5054 		UPDATE_COEFEX(0x57, 0x05, 0x4000, 0x4000),
5055 		UPDATE_COEF(0x4a, 0x0010, 0),
5056 		UPDATE_COEF(0x6b, 0xf000, 0),
5057 		{}
5058 	};
5059 
5060 	switch (codec->core.vendor_id) {
5061 	case 0x10ec0255:
5062 		alc_write_coef_idx(codec, 0x45, 0xc489);
5063 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5064 		alc_process_coef_fw(codec, coef0255);
5065 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5066 		break;
5067 	case 0x10ec0230:
5068 	case 0x10ec0236:
5069 	case 0x10ec0256:
5070 	case 0x19e58326:
5071 		alc_write_coef_idx(codec, 0x45, 0xc489);
5072 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5073 		alc_process_coef_fw(codec, coef0256);
5074 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5075 		break;
5076 	case 0x10ec0234:
5077 	case 0x10ec0274:
5078 	case 0x10ec0294:
5079 		alc_write_coef_idx(codec, 0x45, 0x4689);
5080 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5081 		alc_process_coef_fw(codec, coef0274);
5082 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5083 		break;
5084 	case 0x10ec0233:
5085 	case 0x10ec0283:
5086 		alc_write_coef_idx(codec, 0x45, 0xc429);
5087 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5088 		alc_process_coef_fw(codec, coef0233);
5089 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5090 		break;
5091 	case 0x10ec0286:
5092 	case 0x10ec0288:
5093 	case 0x10ec0298:
5094 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5095 		alc_process_coef_fw(codec, coef0288);
5096 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5097 		break;
5098 	case 0x10ec0292:
5099 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5100 		alc_process_coef_fw(codec, coef0292);
5101 		break;
5102 	case 0x10ec0293:
5103 		/* Set to TRS mode */
5104 		alc_write_coef_idx(codec, 0x45, 0xc429);
5105 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5106 		alc_process_coef_fw(codec, coef0293);
5107 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5108 		break;
5109 	case 0x10ec0867:
5110 		alc_update_coefex_idx(codec, 0x57, 0x5, 0, 1<<14);
5111 		fallthrough;
5112 	case 0x10ec0221:
5113 	case 0x10ec0662:
5114 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5115 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5116 		break;
5117 	case 0x10ec0668:
5118 		alc_write_coef_idx(codec, 0x11, 0x0001);
5119 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5120 		alc_process_coef_fw(codec, coef0688);
5121 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5122 		break;
5123 	case 0x10ec0215:
5124 	case 0x10ec0225:
5125 	case 0x10ec0285:
5126 	case 0x10ec0295:
5127 	case 0x10ec0289:
5128 	case 0x10ec0299:
5129 		alc_process_coef_fw(codec, alc225_pre_hsmode);
5130 		alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x31<<10);
5131 		snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5132 		alc_process_coef_fw(codec, coef0225);
5133 		snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5134 		break;
5135 	}
5136 	codec_dbg(codec, "Headset jack set to mic-in mode.\n");
5137 }
5138 
alc_headset_mode_default(struct hda_codec *codec)5139 static void alc_headset_mode_default(struct hda_codec *codec)
5140 {
5141 	static const struct coef_fw coef0225[] = {
5142 		UPDATE_COEF(0x45, 0x3f<<10, 0x30<<10),
5143 		UPDATE_COEF(0x45, 0x3f<<10, 0x31<<10),
5144 		UPDATE_COEF(0x49, 3<<8, 0<<8),
5145 		UPDATE_COEF(0x4a, 3<<4, 3<<4),
5146 		UPDATE_COEF(0x63, 3<<14, 0),
5147 		UPDATE_COEF(0x67, 0xf000, 0x3000),
5148 		{}
5149 	};
5150 	static const struct coef_fw coef0255[] = {
5151 		WRITE_COEF(0x45, 0xc089),
5152 		WRITE_COEF(0x45, 0xc489),
5153 		WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5154 		WRITE_COEF(0x49, 0x0049),
5155 		{}
5156 	};
5157 	static const struct coef_fw coef0256[] = {
5158 		WRITE_COEF(0x45, 0xc489),
5159 		WRITE_COEFEX(0x57, 0x03, 0x0da3),
5160 		WRITE_COEF(0x49, 0x0049),
5161 		UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
5162 		WRITE_COEF(0x06, 0x6100),
5163 		{}
5164 	};
5165 	static const struct coef_fw coef0233[] = {
5166 		WRITE_COEF(0x06, 0x2100),
5167 		WRITE_COEF(0x32, 0x4ea3),
5168 		{}
5169 	};
5170 	static const struct coef_fw coef0288[] = {
5171 		UPDATE_COEF(0x4f, 0xfcc0, 0xc400), /* Set to TRS type */
5172 		UPDATE_COEF(0x50, 0x2000, 0x2000),
5173 		UPDATE_COEF(0x56, 0x0006, 0x0006),
5174 		UPDATE_COEF(0x66, 0x0008, 0),
5175 		UPDATE_COEF(0x67, 0x2000, 0),
5176 		{}
5177 	};
5178 	static const struct coef_fw coef0292[] = {
5179 		WRITE_COEF(0x76, 0x000e),
5180 		WRITE_COEF(0x6c, 0x2400),
5181 		WRITE_COEF(0x6b, 0xc429),
5182 		WRITE_COEF(0x18, 0x7308),
5183 		{}
5184 	};
5185 	static const struct coef_fw coef0293[] = {
5186 		UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
5187 		WRITE_COEF(0x45, 0xC429), /* Set to TRS type */
5188 		UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
5189 		{}
5190 	};
5191 	static const struct coef_fw coef0688[] = {
5192 		WRITE_COEF(0x11, 0x0041),
5193 		WRITE_COEF(0x15, 0x0d40),
5194 		WRITE_COEF(0xb7, 0x802b),
5195 		{}
5196 	};
5197 	static const struct coef_fw coef0274[] = {
5198 		WRITE_COEF(0x45, 0x4289),
5199 		UPDATE_COEF(0x4a, 0x0010, 0x0010),
5200 		UPDATE_COEF(0x6b, 0x0f00, 0),
5201 		UPDATE_COEF(0x49, 0x0300, 0x0300),
5202 		{}
5203 	};
5204 
5205 	switch (codec->core.vendor_id) {
5206 	case 0x10ec0215:
5207 	case 0x10ec0225:
5208 	case 0x10ec0285:
5209 	case 0x10ec0295:
5210 	case 0x10ec0289:
5211 	case 0x10ec0299:
5212 		alc_process_coef_fw(codec, alc225_pre_hsmode);
5213 		alc_process_coef_fw(codec, coef0225);
5214 		break;
5215 	case 0x10ec0255:
5216 		alc_process_coef_fw(codec, coef0255);
5217 		break;
5218 	case 0x10ec0230:
5219 	case 0x10ec0236:
5220 	case 0x10ec0256:
5221 	case 0x19e58326:
5222 		alc_write_coef_idx(codec, 0x1b, 0x0e4b);
5223 		alc_write_coef_idx(codec, 0x45, 0xc089);
5224 		msleep(50);
5225 		alc_process_coef_fw(codec, coef0256);
5226 		break;
5227 	case 0x10ec0234:
5228 	case 0x10ec0274:
5229 	case 0x10ec0294:
5230 		alc_process_coef_fw(codec, coef0274);
5231 		break;
5232 	case 0x10ec0233:
5233 	case 0x10ec0283:
5234 		alc_process_coef_fw(codec, coef0233);
5235 		break;
5236 	case 0x10ec0286:
5237 	case 0x10ec0288:
5238 	case 0x10ec0298:
5239 		alc_process_coef_fw(codec, coef0288);
5240 		break;
5241 	case 0x10ec0292:
5242 		alc_process_coef_fw(codec, coef0292);
5243 		break;
5244 	case 0x10ec0293:
5245 		alc_process_coef_fw(codec, coef0293);
5246 		break;
5247 	case 0x10ec0668:
5248 		alc_process_coef_fw(codec, coef0688);
5249 		break;
5250 	case 0x10ec0867:
5251 		alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5252 		break;
5253 	}
5254 	codec_dbg(codec, "Headset jack set to headphone (default) mode.\n");
5255 }
5256 
5257 /* Iphone type */
alc_headset_mode_ctia(struct hda_codec *codec)5258 static void alc_headset_mode_ctia(struct hda_codec *codec)
5259 {
5260 	int val;
5261 
5262 	static const struct coef_fw coef0255[] = {
5263 		WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
5264 		WRITE_COEF(0x1b, 0x0c2b),
5265 		WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5266 		{}
5267 	};
5268 	static const struct coef_fw coef0256[] = {
5269 		WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
5270 		WRITE_COEF(0x1b, 0x0e6b),
5271 		{}
5272 	};
5273 	static const struct coef_fw coef0233[] = {
5274 		WRITE_COEF(0x45, 0xd429),
5275 		WRITE_COEF(0x1b, 0x0c2b),
5276 		WRITE_COEF(0x32, 0x4ea3),
5277 		{}
5278 	};
5279 	static const struct coef_fw coef0288[] = {
5280 		UPDATE_COEF(0x50, 0x2000, 0x2000),
5281 		UPDATE_COEF(0x56, 0x0006, 0x0006),
5282 		UPDATE_COEF(0x66, 0x0008, 0),
5283 		UPDATE_COEF(0x67, 0x2000, 0),
5284 		{}
5285 	};
5286 	static const struct coef_fw coef0292[] = {
5287 		WRITE_COEF(0x6b, 0xd429),
5288 		WRITE_COEF(0x76, 0x0008),
5289 		WRITE_COEF(0x18, 0x7388),
5290 		{}
5291 	};
5292 	static const struct coef_fw coef0293[] = {
5293 		WRITE_COEF(0x45, 0xd429), /* Set to ctia type */
5294 		UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
5295 		{}
5296 	};
5297 	static const struct coef_fw coef0688[] = {
5298 		WRITE_COEF(0x11, 0x0001),
5299 		WRITE_COEF(0x15, 0x0d60),
5300 		WRITE_COEF(0xc3, 0x0000),
5301 		{}
5302 	};
5303 	static const struct coef_fw coef0225_1[] = {
5304 		UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
5305 		UPDATE_COEF(0x63, 3<<14, 2<<14),
5306 		{}
5307 	};
5308 	static const struct coef_fw coef0225_2[] = {
5309 		UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
5310 		UPDATE_COEF(0x63, 3<<14, 1<<14),
5311 		{}
5312 	};
5313 
5314 	switch (codec->core.vendor_id) {
5315 	case 0x10ec0255:
5316 		alc_process_coef_fw(codec, coef0255);
5317 		break;
5318 	case 0x10ec0230:
5319 	case 0x10ec0236:
5320 	case 0x10ec0256:
5321 	case 0x19e58326:
5322 		alc_process_coef_fw(codec, coef0256);
5323 		break;
5324 	case 0x10ec0234:
5325 	case 0x10ec0274:
5326 	case 0x10ec0294:
5327 		alc_write_coef_idx(codec, 0x45, 0xd689);
5328 		break;
5329 	case 0x10ec0233:
5330 	case 0x10ec0283:
5331 		alc_process_coef_fw(codec, coef0233);
5332 		break;
5333 	case 0x10ec0298:
5334 		val = alc_read_coef_idx(codec, 0x50);
5335 		if (val & (1 << 12)) {
5336 			alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
5337 			alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5338 			msleep(300);
5339 		} else {
5340 			alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
5341 			alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5342 			msleep(300);
5343 		}
5344 		break;
5345 	case 0x10ec0286:
5346 	case 0x10ec0288:
5347 		alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5348 		msleep(300);
5349 		alc_process_coef_fw(codec, coef0288);
5350 		break;
5351 	case 0x10ec0292:
5352 		alc_process_coef_fw(codec, coef0292);
5353 		break;
5354 	case 0x10ec0293:
5355 		alc_process_coef_fw(codec, coef0293);
5356 		break;
5357 	case 0x10ec0668:
5358 		alc_process_coef_fw(codec, coef0688);
5359 		break;
5360 	case 0x10ec0215:
5361 	case 0x10ec0225:
5362 	case 0x10ec0285:
5363 	case 0x10ec0295:
5364 	case 0x10ec0289:
5365 	case 0x10ec0299:
5366 		val = alc_read_coef_idx(codec, 0x45);
5367 		if (val & (1 << 9))
5368 			alc_process_coef_fw(codec, coef0225_2);
5369 		else
5370 			alc_process_coef_fw(codec, coef0225_1);
5371 		break;
5372 	case 0x10ec0867:
5373 		alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5374 		break;
5375 	}
5376 	codec_dbg(codec, "Headset jack set to iPhone-style headset mode.\n");
5377 }
5378 
5379 /* Nokia type */
alc_headset_mode_omtp(struct hda_codec *codec)5380 static void alc_headset_mode_omtp(struct hda_codec *codec)
5381 {
5382 	static const struct coef_fw coef0255[] = {
5383 		WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
5384 		WRITE_COEF(0x1b, 0x0c2b),
5385 		WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5386 		{}
5387 	};
5388 	static const struct coef_fw coef0256[] = {
5389 		WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
5390 		WRITE_COEF(0x1b, 0x0e6b),
5391 		{}
5392 	};
5393 	static const struct coef_fw coef0233[] = {
5394 		WRITE_COEF(0x45, 0xe429),
5395 		WRITE_COEF(0x1b, 0x0c2b),
5396 		WRITE_COEF(0x32, 0x4ea3),
5397 		{}
5398 	};
5399 	static const struct coef_fw coef0288[] = {
5400 		UPDATE_COEF(0x50, 0x2000, 0x2000),
5401 		UPDATE_COEF(0x56, 0x0006, 0x0006),
5402 		UPDATE_COEF(0x66, 0x0008, 0),
5403 		UPDATE_COEF(0x67, 0x2000, 0),
5404 		{}
5405 	};
5406 	static const struct coef_fw coef0292[] = {
5407 		WRITE_COEF(0x6b, 0xe429),
5408 		WRITE_COEF(0x76, 0x0008),
5409 		WRITE_COEF(0x18, 0x7388),
5410 		{}
5411 	};
5412 	static const struct coef_fw coef0293[] = {
5413 		WRITE_COEF(0x45, 0xe429), /* Set to omtp type */
5414 		UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
5415 		{}
5416 	};
5417 	static const struct coef_fw coef0688[] = {
5418 		WRITE_COEF(0x11, 0x0001),
5419 		WRITE_COEF(0x15, 0x0d50),
5420 		WRITE_COEF(0xc3, 0x0000),
5421 		{}
5422 	};
5423 	static const struct coef_fw coef0225[] = {
5424 		UPDATE_COEF(0x45, 0x3f<<10, 0x39<<10),
5425 		UPDATE_COEF(0x63, 3<<14, 2<<14),
5426 		{}
5427 	};
5428 
5429 	switch (codec->core.vendor_id) {
5430 	case 0x10ec0255:
5431 		alc_process_coef_fw(codec, coef0255);
5432 		break;
5433 	case 0x10ec0230:
5434 	case 0x10ec0236:
5435 	case 0x10ec0256:
5436 	case 0x19e58326:
5437 		alc_process_coef_fw(codec, coef0256);
5438 		break;
5439 	case 0x10ec0234:
5440 	case 0x10ec0274:
5441 	case 0x10ec0294:
5442 		alc_write_coef_idx(codec, 0x45, 0xe689);
5443 		break;
5444 	case 0x10ec0233:
5445 	case 0x10ec0283:
5446 		alc_process_coef_fw(codec, coef0233);
5447 		break;
5448 	case 0x10ec0298:
5449 		alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);/* Headset output enable */
5450 		alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5451 		msleep(300);
5452 		break;
5453 	case 0x10ec0286:
5454 	case 0x10ec0288:
5455 		alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5456 		msleep(300);
5457 		alc_process_coef_fw(codec, coef0288);
5458 		break;
5459 	case 0x10ec0292:
5460 		alc_process_coef_fw(codec, coef0292);
5461 		break;
5462 	case 0x10ec0293:
5463 		alc_process_coef_fw(codec, coef0293);
5464 		break;
5465 	case 0x10ec0668:
5466 		alc_process_coef_fw(codec, coef0688);
5467 		break;
5468 	case 0x10ec0215:
5469 	case 0x10ec0225:
5470 	case 0x10ec0285:
5471 	case 0x10ec0295:
5472 	case 0x10ec0289:
5473 	case 0x10ec0299:
5474 		alc_process_coef_fw(codec, coef0225);
5475 		break;
5476 	}
5477 	codec_dbg(codec, "Headset jack set to Nokia-style headset mode.\n");
5478 }
5479 
alc_determine_headset_type(struct hda_codec *codec)5480 static void alc_determine_headset_type(struct hda_codec *codec)
5481 {
5482 	int val;
5483 	bool is_ctia = false;
5484 	struct alc_spec *spec = codec->spec;
5485 	static const struct coef_fw coef0255[] = {
5486 		WRITE_COEF(0x45, 0xd089), /* combo jack auto switch control(Check type)*/
5487 		WRITE_COEF(0x49, 0x0149), /* combo jack auto switch control(Vref
5488  conteol) */
5489 		{}
5490 	};
5491 	static const struct coef_fw coef0288[] = {
5492 		UPDATE_COEF(0x4f, 0xfcc0, 0xd400), /* Check Type */
5493 		{}
5494 	};
5495 	static const struct coef_fw coef0298[] = {
5496 		UPDATE_COEF(0x50, 0x2000, 0x2000),
5497 		UPDATE_COEF(0x56, 0x0006, 0x0006),
5498 		UPDATE_COEF(0x66, 0x0008, 0),
5499 		UPDATE_COEF(0x67, 0x2000, 0),
5500 		UPDATE_COEF(0x19, 0x1300, 0x1300),
5501 		{}
5502 	};
5503 	static const struct coef_fw coef0293[] = {
5504 		UPDATE_COEF(0x4a, 0x000f, 0x0008), /* Combo Jack auto detect */
5505 		WRITE_COEF(0x45, 0xD429), /* Set to ctia type */
5506 		{}
5507 	};
5508 	static const struct coef_fw coef0688[] = {
5509 		WRITE_COEF(0x11, 0x0001),
5510 		WRITE_COEF(0xb7, 0x802b),
5511 		WRITE_COEF(0x15, 0x0d60),
5512 		WRITE_COEF(0xc3, 0x0c00),
5513 		{}
5514 	};
5515 	static const struct coef_fw coef0274[] = {
5516 		UPDATE_COEF(0x4a, 0x0010, 0),
5517 		UPDATE_COEF(0x4a, 0x8000, 0),
5518 		WRITE_COEF(0x45, 0xd289),
5519 		UPDATE_COEF(0x49, 0x0300, 0x0300),
5520 		{}
5521 	};
5522 
5523 	if (spec->no_internal_mic_pin) {
5524 		alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
5525 		return;
5526 	}
5527 
5528 	switch (codec->core.vendor_id) {
5529 	case 0x10ec0255:
5530 		alc_process_coef_fw(codec, coef0255);
5531 		msleep(300);
5532 		val = alc_read_coef_idx(codec, 0x46);
5533 		is_ctia = (val & 0x0070) == 0x0070;
5534 		break;
5535 	case 0x10ec0230:
5536 	case 0x10ec0236:
5537 	case 0x10ec0256:
5538 	case 0x19e58326:
5539 		alc_write_coef_idx(codec, 0x1b, 0x0e4b);
5540 		alc_write_coef_idx(codec, 0x06, 0x6104);
5541 		alc_write_coefex_idx(codec, 0x57, 0x3, 0x09a3);
5542 
5543 		snd_hda_codec_write(codec, 0x21, 0,
5544 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5545 		msleep(80);
5546 		snd_hda_codec_write(codec, 0x21, 0,
5547 			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5548 
5549 		alc_process_coef_fw(codec, coef0255);
5550 		msleep(300);
5551 		val = alc_read_coef_idx(codec, 0x46);
5552 		is_ctia = (val & 0x0070) == 0x0070;
5553 
5554 		alc_write_coefex_idx(codec, 0x57, 0x3, 0x0da3);
5555 		alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5556 
5557 		snd_hda_codec_write(codec, 0x21, 0,
5558 			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5559 		msleep(80);
5560 		snd_hda_codec_write(codec, 0x21, 0,
5561 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5562 		break;
5563 	case 0x10ec0234:
5564 	case 0x10ec0274:
5565 	case 0x10ec0294:
5566 		alc_process_coef_fw(codec, coef0274);
5567 		msleep(850);
5568 		val = alc_read_coef_idx(codec, 0x46);
5569 		is_ctia = (val & 0x00f0) == 0x00f0;
5570 		break;
5571 	case 0x10ec0233:
5572 	case 0x10ec0283:
5573 		alc_write_coef_idx(codec, 0x45, 0xd029);
5574 		msleep(300);
5575 		val = alc_read_coef_idx(codec, 0x46);
5576 		is_ctia = (val & 0x0070) == 0x0070;
5577 		break;
5578 	case 0x10ec0298:
5579 		snd_hda_codec_write(codec, 0x21, 0,
5580 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5581 		msleep(100);
5582 		snd_hda_codec_write(codec, 0x21, 0,
5583 			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5584 		msleep(200);
5585 
5586 		val = alc_read_coef_idx(codec, 0x50);
5587 		if (val & (1 << 12)) {
5588 			alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
5589 			alc_process_coef_fw(codec, coef0288);
5590 			msleep(350);
5591 			val = alc_read_coef_idx(codec, 0x50);
5592 			is_ctia = (val & 0x0070) == 0x0070;
5593 		} else {
5594 			alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
5595 			alc_process_coef_fw(codec, coef0288);
5596 			msleep(350);
5597 			val = alc_read_coef_idx(codec, 0x50);
5598 			is_ctia = (val & 0x0070) == 0x0070;
5599 		}
5600 		alc_process_coef_fw(codec, coef0298);
5601 		snd_hda_codec_write(codec, 0x21, 0,
5602 			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP);
5603 		msleep(75);
5604 		snd_hda_codec_write(codec, 0x21, 0,
5605 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5606 		break;
5607 	case 0x10ec0286:
5608 	case 0x10ec0288:
5609 		alc_process_coef_fw(codec, coef0288);
5610 		msleep(350);
5611 		val = alc_read_coef_idx(codec, 0x50);
5612 		is_ctia = (val & 0x0070) == 0x0070;
5613 		break;
5614 	case 0x10ec0292:
5615 		alc_write_coef_idx(codec, 0x6b, 0xd429);
5616 		msleep(300);
5617 		val = alc_read_coef_idx(codec, 0x6c);
5618 		is_ctia = (val & 0x001c) == 0x001c;
5619 		break;
5620 	case 0x10ec0293:
5621 		alc_process_coef_fw(codec, coef0293);
5622 		msleep(300);
5623 		val = alc_read_coef_idx(codec, 0x46);
5624 		is_ctia = (val & 0x0070) == 0x0070;
5625 		break;
5626 	case 0x10ec0668:
5627 		alc_process_coef_fw(codec, coef0688);
5628 		msleep(300);
5629 		val = alc_read_coef_idx(codec, 0xbe);
5630 		is_ctia = (val & 0x1c02) == 0x1c02;
5631 		break;
5632 	case 0x10ec0215:
5633 	case 0x10ec0225:
5634 	case 0x10ec0285:
5635 	case 0x10ec0295:
5636 	case 0x10ec0289:
5637 	case 0x10ec0299:
5638 		snd_hda_codec_write(codec, 0x21, 0,
5639 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5640 		msleep(80);
5641 		snd_hda_codec_write(codec, 0x21, 0,
5642 			    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5643 
5644 		alc_process_coef_fw(codec, alc225_pre_hsmode);
5645 		alc_update_coef_idx(codec, 0x67, 0xf000, 0x1000);
5646 		val = alc_read_coef_idx(codec, 0x45);
5647 		if (val & (1 << 9)) {
5648 			alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5649 			alc_update_coef_idx(codec, 0x49, 3<<8, 2<<8);
5650 			msleep(800);
5651 			val = alc_read_coef_idx(codec, 0x46);
5652 			is_ctia = (val & 0x00f0) == 0x00f0;
5653 		} else {
5654 			alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5655 			alc_update_coef_idx(codec, 0x49, 3<<8, 1<<8);
5656 			msleep(800);
5657 			val = alc_read_coef_idx(codec, 0x46);
5658 			is_ctia = (val & 0x00f0) == 0x00f0;
5659 		}
5660 		alc_update_coef_idx(codec, 0x4a, 7<<6, 7<<6);
5661 		alc_update_coef_idx(codec, 0x4a, 3<<4, 3<<4);
5662 		alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
5663 
5664 		snd_hda_codec_write(codec, 0x21, 0,
5665 			    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5666 		msleep(80);
5667 		snd_hda_codec_write(codec, 0x21, 0,
5668 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5669 		break;
5670 	case 0x10ec0867:
5671 		is_ctia = true;
5672 		break;
5673 	}
5674 
5675 	codec_dbg(codec, "Headset jack detected iPhone-style headset: %s\n",
5676 		    is_ctia ? "yes" : "no");
5677 	spec->current_headset_type = is_ctia ? ALC_HEADSET_TYPE_CTIA : ALC_HEADSET_TYPE_OMTP;
5678 }
5679 
alc_update_headset_mode(struct hda_codec *codec)5680 static void alc_update_headset_mode(struct hda_codec *codec)
5681 {
5682 	struct alc_spec *spec = codec->spec;
5683 
5684 	hda_nid_t mux_pin = spec->gen.imux_pins[spec->gen.cur_mux[0]];
5685 	hda_nid_t hp_pin = alc_get_hp_pin(spec);
5686 
5687 	int new_headset_mode;
5688 
5689 	if (!snd_hda_jack_detect(codec, hp_pin))
5690 		new_headset_mode = ALC_HEADSET_MODE_UNPLUGGED;
5691 	else if (mux_pin == spec->headset_mic_pin)
5692 		new_headset_mode = ALC_HEADSET_MODE_HEADSET;
5693 	else if (mux_pin == spec->headphone_mic_pin)
5694 		new_headset_mode = ALC_HEADSET_MODE_MIC;
5695 	else
5696 		new_headset_mode = ALC_HEADSET_MODE_HEADPHONE;
5697 
5698 	if (new_headset_mode == spec->current_headset_mode) {
5699 		snd_hda_gen_update_outputs(codec);
5700 		return;
5701 	}
5702 
5703 	switch (new_headset_mode) {
5704 	case ALC_HEADSET_MODE_UNPLUGGED:
5705 		alc_headset_mode_unplugged(codec);
5706 		spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5707 		spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
5708 		spec->gen.hp_jack_present = false;
5709 		break;
5710 	case ALC_HEADSET_MODE_HEADSET:
5711 		if (spec->current_headset_type == ALC_HEADSET_TYPE_UNKNOWN)
5712 			alc_determine_headset_type(codec);
5713 		if (spec->current_headset_type == ALC_HEADSET_TYPE_CTIA)
5714 			alc_headset_mode_ctia(codec);
5715 		else if (spec->current_headset_type == ALC_HEADSET_TYPE_OMTP)
5716 			alc_headset_mode_omtp(codec);
5717 		spec->gen.hp_jack_present = true;
5718 		break;
5719 	case ALC_HEADSET_MODE_MIC:
5720 		alc_headset_mode_mic_in(codec, hp_pin, spec->headphone_mic_pin);
5721 		spec->gen.hp_jack_present = false;
5722 		break;
5723 	case ALC_HEADSET_MODE_HEADPHONE:
5724 		alc_headset_mode_default(codec);
5725 		spec->gen.hp_jack_present = true;
5726 		break;
5727 	}
5728 	if (new_headset_mode != ALC_HEADSET_MODE_MIC) {
5729 		snd_hda_set_pin_ctl_cache(codec, hp_pin,
5730 					  AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
5731 		if (spec->headphone_mic_pin && spec->headphone_mic_pin != hp_pin)
5732 			snd_hda_set_pin_ctl_cache(codec, spec->headphone_mic_pin,
5733 						  PIN_VREFHIZ);
5734 	}
5735 	spec->current_headset_mode = new_headset_mode;
5736 
5737 	snd_hda_gen_update_outputs(codec);
5738 }
5739 
alc_update_headset_mode_hook(struct hda_codec *codec, struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)5740 static void alc_update_headset_mode_hook(struct hda_codec *codec,
5741 					 struct snd_kcontrol *kcontrol,
5742 					 struct snd_ctl_elem_value *ucontrol)
5743 {
5744 	alc_update_headset_mode(codec);
5745 }
5746 
alc_update_headset_jack_cb(struct hda_codec *codec, struct hda_jack_callback *jack)5747 static void alc_update_headset_jack_cb(struct hda_codec *codec,
5748 				       struct hda_jack_callback *jack)
5749 {
5750 	snd_hda_gen_hp_automute(codec, jack);
5751 	alc_update_headset_mode(codec);
5752 }
5753 
alc_probe_headset_mode(struct hda_codec *codec)5754 static void alc_probe_headset_mode(struct hda_codec *codec)
5755 {
5756 	int i;
5757 	struct alc_spec *spec = codec->spec;
5758 	struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5759 
5760 	/* Find mic pins */
5761 	for (i = 0; i < cfg->num_inputs; i++) {
5762 		if (cfg->inputs[i].is_headset_mic && !spec->headset_mic_pin)
5763 			spec->headset_mic_pin = cfg->inputs[i].pin;
5764 		if (cfg->inputs[i].is_headphone_mic && !spec->headphone_mic_pin)
5765 			spec->headphone_mic_pin = cfg->inputs[i].pin;
5766 	}
5767 
5768 	WARN_ON(spec->gen.cap_sync_hook);
5769 	spec->gen.cap_sync_hook = alc_update_headset_mode_hook;
5770 	spec->gen.automute_hook = alc_update_headset_mode;
5771 	spec->gen.hp_automute_hook = alc_update_headset_jack_cb;
5772 }
5773 
alc_fixup_headset_mode(struct hda_codec *codec, const struct hda_fixup *fix, int action)5774 static void alc_fixup_headset_mode(struct hda_codec *codec,
5775 				const struct hda_fixup *fix, int action)
5776 {
5777 	struct alc_spec *spec = codec->spec;
5778 
5779 	switch (action) {
5780 	case HDA_FIXUP_ACT_PRE_PROBE:
5781 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC | HDA_PINCFG_HEADPHONE_MIC;
5782 		break;
5783 	case HDA_FIXUP_ACT_PROBE:
5784 		alc_probe_headset_mode(codec);
5785 		break;
5786 	case HDA_FIXUP_ACT_INIT:
5787 		if (is_s3_resume(codec) || is_s4_resume(codec)) {
5788 			spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5789 			spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
5790 		}
5791 		alc_update_headset_mode(codec);
5792 		break;
5793 	}
5794 }
5795 
alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec, const struct hda_fixup *fix, int action)5796 static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
5797 				const struct hda_fixup *fix, int action)
5798 {
5799 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5800 		struct alc_spec *spec = codec->spec;
5801 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5802 	}
5803 	else
5804 		alc_fixup_headset_mode(codec, fix, action);
5805 }
5806 
alc255_set_default_jack_type(struct hda_codec *codec)5807 static void alc255_set_default_jack_type(struct hda_codec *codec)
5808 {
5809 	/* Set to iphone type */
5810 	static const struct coef_fw alc255fw[] = {
5811 		WRITE_COEF(0x1b, 0x880b),
5812 		WRITE_COEF(0x45, 0xd089),
5813 		WRITE_COEF(0x1b, 0x080b),
5814 		WRITE_COEF(0x46, 0x0004),
5815 		WRITE_COEF(0x1b, 0x0c0b),
5816 		{}
5817 	};
5818 	static const struct coef_fw alc256fw[] = {
5819 		WRITE_COEF(0x1b, 0x884b),
5820 		WRITE_COEF(0x45, 0xd089),
5821 		WRITE_COEF(0x1b, 0x084b),
5822 		WRITE_COEF(0x46, 0x0004),
5823 		WRITE_COEF(0x1b, 0x0c4b),
5824 		{}
5825 	};
5826 	switch (codec->core.vendor_id) {
5827 	case 0x10ec0255:
5828 		alc_process_coef_fw(codec, alc255fw);
5829 		break;
5830 	case 0x10ec0230:
5831 	case 0x10ec0236:
5832 	case 0x10ec0256:
5833 	case 0x19e58326:
5834 		alc_process_coef_fw(codec, alc256fw);
5835 		break;
5836 	}
5837 	msleep(30);
5838 }
5839 
alc_fixup_headset_mode_alc255(struct hda_codec *codec, const struct hda_fixup *fix, int action)5840 static void alc_fixup_headset_mode_alc255(struct hda_codec *codec,
5841 				const struct hda_fixup *fix, int action)
5842 {
5843 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5844 		alc255_set_default_jack_type(codec);
5845 	}
5846 	alc_fixup_headset_mode(codec, fix, action);
5847 }
5848 
alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec, const struct hda_fixup *fix, int action)5849 static void alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec,
5850 				const struct hda_fixup *fix, int action)
5851 {
5852 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5853 		struct alc_spec *spec = codec->spec;
5854 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5855 		alc255_set_default_jack_type(codec);
5856 	}
5857 	else
5858 		alc_fixup_headset_mode(codec, fix, action);
5859 }
5860 
alc288_update_headset_jack_cb(struct hda_codec *codec, struct hda_jack_callback *jack)5861 static void alc288_update_headset_jack_cb(struct hda_codec *codec,
5862 				       struct hda_jack_callback *jack)
5863 {
5864 	struct alc_spec *spec = codec->spec;
5865 
5866 	alc_update_headset_jack_cb(codec, jack);
5867 	/* Headset Mic enable or disable, only for Dell Dino */
5868 	alc_update_gpio_data(codec, 0x40, spec->gen.hp_jack_present);
5869 }
5870 
alc_fixup_headset_mode_dell_alc288(struct hda_codec *codec, const struct hda_fixup *fix, int action)5871 static void alc_fixup_headset_mode_dell_alc288(struct hda_codec *codec,
5872 				const struct hda_fixup *fix, int action)
5873 {
5874 	alc_fixup_headset_mode(codec, fix, action);
5875 	if (action == HDA_FIXUP_ACT_PROBE) {
5876 		struct alc_spec *spec = codec->spec;
5877 		/* toggled via hp_automute_hook */
5878 		spec->gpio_mask |= 0x40;
5879 		spec->gpio_dir |= 0x40;
5880 		spec->gen.hp_automute_hook = alc288_update_headset_jack_cb;
5881 	}
5882 }
5883 
alc_fixup_auto_mute_via_amp(struct hda_codec *codec, const struct hda_fixup *fix, int action)5884 static void alc_fixup_auto_mute_via_amp(struct hda_codec *codec,
5885 					const struct hda_fixup *fix, int action)
5886 {
5887 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5888 		struct alc_spec *spec = codec->spec;
5889 		spec->gen.auto_mute_via_amp = 1;
5890 	}
5891 }
5892 
alc_fixup_no_shutup(struct hda_codec *codec, const struct hda_fixup *fix, int action)5893 static void alc_fixup_no_shutup(struct hda_codec *codec,
5894 				const struct hda_fixup *fix, int action)
5895 {
5896 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5897 		struct alc_spec *spec = codec->spec;
5898 		spec->no_shutup_pins = 1;
5899 	}
5900 }
5901 
alc_fixup_disable_aamix(struct hda_codec *codec, const struct hda_fixup *fix, int action)5902 static void alc_fixup_disable_aamix(struct hda_codec *codec,
5903 				    const struct hda_fixup *fix, int action)
5904 {
5905 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5906 		struct alc_spec *spec = codec->spec;
5907 		/* Disable AA-loopback as it causes white noise */
5908 		spec->gen.mixer_nid = 0;
5909 	}
5910 }
5911 
5912 /* fixup for Thinkpad docks: add dock pins, avoid HP parser fixup */
alc_fixup_tpt440_dock(struct hda_codec *codec, const struct hda_fixup *fix, int action)5913 static void alc_fixup_tpt440_dock(struct hda_codec *codec,
5914 				  const struct hda_fixup *fix, int action)
5915 {
5916 	static const struct hda_pintbl pincfgs[] = {
5917 		{ 0x16, 0x21211010 }, /* dock headphone */
5918 		{ 0x19, 0x21a11010 }, /* dock mic */
5919 		{ }
5920 	};
5921 	struct alc_spec *spec = codec->spec;
5922 
5923 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5924 		spec->reboot_notify = snd_hda_gen_reboot_notify; /* reduce noise */
5925 		spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
5926 		codec->power_save_node = 0; /* avoid click noises */
5927 		snd_hda_apply_pincfgs(codec, pincfgs);
5928 	}
5929 }
5930 
alc_fixup_tpt470_dock(struct hda_codec *codec, const struct hda_fixup *fix, int action)5931 static void alc_fixup_tpt470_dock(struct hda_codec *codec,
5932 				  const struct hda_fixup *fix, int action)
5933 {
5934 	static const struct hda_pintbl pincfgs[] = {
5935 		{ 0x17, 0x21211010 }, /* dock headphone */
5936 		{ 0x19, 0x21a11010 }, /* dock mic */
5937 		{ }
5938 	};
5939 	struct alc_spec *spec = codec->spec;
5940 
5941 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5942 		spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
5943 		snd_hda_apply_pincfgs(codec, pincfgs);
5944 	} else if (action == HDA_FIXUP_ACT_INIT) {
5945 		/* Enable DOCK device */
5946 		snd_hda_codec_write(codec, 0x17, 0,
5947 			    AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
5948 		/* Enable DOCK device */
5949 		snd_hda_codec_write(codec, 0x19, 0,
5950 			    AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
5951 	}
5952 }
5953 
alc_fixup_tpt470_dacs(struct hda_codec *codec, const struct hda_fixup *fix, int action)5954 static void alc_fixup_tpt470_dacs(struct hda_codec *codec,
5955 				  const struct hda_fixup *fix, int action)
5956 {
5957 	/* Assure the speaker pin to be coupled with DAC NID 0x03; otherwise
5958 	 * the speaker output becomes too low by some reason on Thinkpads with
5959 	 * ALC298 codec
5960 	 */
5961 	static const hda_nid_t preferred_pairs[] = {
5962 		0x14, 0x03, 0x17, 0x02, 0x21, 0x02,
5963 		0
5964 	};
5965 	struct alc_spec *spec = codec->spec;
5966 
5967 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
5968 		spec->gen.preferred_dacs = preferred_pairs;
5969 }
5970 
alc295_fixup_asus_dacs(struct hda_codec *codec, const struct hda_fixup *fix, int action)5971 static void alc295_fixup_asus_dacs(struct hda_codec *codec,
5972 				   const struct hda_fixup *fix, int action)
5973 {
5974 	static const hda_nid_t preferred_pairs[] = {
5975 		0x17, 0x02, 0x21, 0x03, 0
5976 	};
5977 	struct alc_spec *spec = codec->spec;
5978 
5979 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
5980 		spec->gen.preferred_dacs = preferred_pairs;
5981 }
5982 
alc_shutup_dell_xps13(struct hda_codec *codec)5983 static void alc_shutup_dell_xps13(struct hda_codec *codec)
5984 {
5985 	struct alc_spec *spec = codec->spec;
5986 	int hp_pin = alc_get_hp_pin(spec);
5987 
5988 	/* Prevent pop noises when headphones are plugged in */
5989 	snd_hda_codec_write(codec, hp_pin, 0,
5990 			    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5991 	msleep(20);
5992 }
5993 
alc_fixup_dell_xps13(struct hda_codec *codec, const struct hda_fixup *fix, int action)5994 static void alc_fixup_dell_xps13(struct hda_codec *codec,
5995 				const struct hda_fixup *fix, int action)
5996 {
5997 	struct alc_spec *spec = codec->spec;
5998 	struct hda_input_mux *imux = &spec->gen.input_mux;
5999 	int i;
6000 
6001 	switch (action) {
6002 	case HDA_FIXUP_ACT_PRE_PROBE:
6003 		/* mic pin 0x19 must be initialized with Vref Hi-Z, otherwise
6004 		 * it causes a click noise at start up
6005 		 */
6006 		snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
6007 		spec->shutup = alc_shutup_dell_xps13;
6008 		break;
6009 	case HDA_FIXUP_ACT_PROBE:
6010 		/* Make the internal mic the default input source. */
6011 		for (i = 0; i < imux->num_items; i++) {
6012 			if (spec->gen.imux_pins[i] == 0x12) {
6013 				spec->gen.cur_mux[0] = i;
6014 				break;
6015 			}
6016 		}
6017 		break;
6018 	}
6019 }
6020 
alc_fixup_headset_mode_alc662(struct hda_codec *codec, const struct hda_fixup *fix, int action)6021 static void alc_fixup_headset_mode_alc662(struct hda_codec *codec,
6022 				const struct hda_fixup *fix, int action)
6023 {
6024 	struct alc_spec *spec = codec->spec;
6025 
6026 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6027 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
6028 		spec->gen.hp_mic = 1; /* Mic-in is same pin as headphone */
6029 
6030 		/* Disable boost for mic-in permanently. (This code is only called
6031 		   from quirks that guarantee that the headphone is at NID 0x1b.) */
6032 		snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000);
6033 		snd_hda_override_wcaps(codec, 0x1b, get_wcaps(codec, 0x1b) & ~AC_WCAP_IN_AMP);
6034 	} else
6035 		alc_fixup_headset_mode(codec, fix, action);
6036 }
6037 
alc_fixup_headset_mode_alc668(struct hda_codec *codec, const struct hda_fixup *fix, int action)6038 static void alc_fixup_headset_mode_alc668(struct hda_codec *codec,
6039 				const struct hda_fixup *fix, int action)
6040 {
6041 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6042 		alc_write_coef_idx(codec, 0xc4, 0x8000);
6043 		alc_update_coef_idx(codec, 0xc2, ~0xfe, 0);
6044 		snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
6045 	}
6046 	alc_fixup_headset_mode(codec, fix, action);
6047 }
6048 
6049 /* Returns the nid of the external mic input pin, or 0 if it cannot be found. */
find_ext_mic_pin(struct hda_codec *codec)6050 static int find_ext_mic_pin(struct hda_codec *codec)
6051 {
6052 	struct alc_spec *spec = codec->spec;
6053 	struct auto_pin_cfg *cfg = &spec->gen.autocfg;
6054 	hda_nid_t nid;
6055 	unsigned int defcfg;
6056 	int i;
6057 
6058 	for (i = 0; i < cfg->num_inputs; i++) {
6059 		if (cfg->inputs[i].type != AUTO_PIN_MIC)
6060 			continue;
6061 		nid = cfg->inputs[i].pin;
6062 		defcfg = snd_hda_codec_get_pincfg(codec, nid);
6063 		if (snd_hda_get_input_pin_attr(defcfg) == INPUT_PIN_ATTR_INT)
6064 			continue;
6065 		return nid;
6066 	}
6067 
6068 	return 0;
6069 }
6070 
alc271_hp_gate_mic_jack(struct hda_codec *codec, const struct hda_fixup *fix, int action)6071 static void alc271_hp_gate_mic_jack(struct hda_codec *codec,
6072 				    const struct hda_fixup *fix,
6073 				    int action)
6074 {
6075 	struct alc_spec *spec = codec->spec;
6076 
6077 	if (action == HDA_FIXUP_ACT_PROBE) {
6078 		int mic_pin = find_ext_mic_pin(codec);
6079 		int hp_pin = alc_get_hp_pin(spec);
6080 
6081 		if (snd_BUG_ON(!mic_pin || !hp_pin))
6082 			return;
6083 		snd_hda_jack_set_gating_jack(codec, mic_pin, hp_pin);
6084 	}
6085 }
6086 
alc269_fixup_limit_int_mic_boost(struct hda_codec *codec, const struct hda_fixup *fix, int action)6087 static void alc269_fixup_limit_int_mic_boost(struct hda_codec *codec,
6088 					     const struct hda_fixup *fix,
6089 					     int action)
6090 {
6091 	struct alc_spec *spec = codec->spec;
6092 	struct auto_pin_cfg *cfg = &spec->gen.autocfg;
6093 	int i;
6094 
6095 	/* The mic boosts on level 2 and 3 are too noisy
6096 	   on the internal mic input.
6097 	   Therefore limit the boost to 0 or 1. */
6098 
6099 	if (action != HDA_FIXUP_ACT_PROBE)
6100 		return;
6101 
6102 	for (i = 0; i < cfg->num_inputs; i++) {
6103 		hda_nid_t nid = cfg->inputs[i].pin;
6104 		unsigned int defcfg;
6105 		if (cfg->inputs[i].type != AUTO_PIN_MIC)
6106 			continue;
6107 		defcfg = snd_hda_codec_get_pincfg(codec, nid);
6108 		if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
6109 			continue;
6110 
6111 		snd_hda_override_amp_caps(codec, nid, HDA_INPUT,
6112 					  (0x00 << AC_AMPCAP_OFFSET_SHIFT) |
6113 					  (0x01 << AC_AMPCAP_NUM_STEPS_SHIFT) |
6114 					  (0x2f << AC_AMPCAP_STEP_SIZE_SHIFT) |
6115 					  (0 << AC_AMPCAP_MUTE_SHIFT));
6116 	}
6117 }
6118 
alc283_hp_automute_hook(struct hda_codec *codec, struct hda_jack_callback *jack)6119 static void alc283_hp_automute_hook(struct hda_codec *codec,
6120 				    struct hda_jack_callback *jack)
6121 {
6122 	struct alc_spec *spec = codec->spec;
6123 	int vref;
6124 
6125 	msleep(200);
6126 	snd_hda_gen_hp_automute(codec, jack);
6127 
6128 	vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
6129 
6130 	msleep(600);
6131 	snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
6132 			    vref);
6133 }
6134 
alc283_fixup_chromebook(struct hda_codec *codec, const struct hda_fixup *fix, int action)6135 static void alc283_fixup_chromebook(struct hda_codec *codec,
6136 				    const struct hda_fixup *fix, int action)
6137 {
6138 	struct alc_spec *spec = codec->spec;
6139 
6140 	switch (action) {
6141 	case HDA_FIXUP_ACT_PRE_PROBE:
6142 		snd_hda_override_wcaps(codec, 0x03, 0);
6143 		/* Disable AA-loopback as it causes white noise */
6144 		spec->gen.mixer_nid = 0;
6145 		break;
6146 	case HDA_FIXUP_ACT_INIT:
6147 		/* MIC2-VREF control */
6148 		/* Set to manual mode */
6149 		alc_update_coef_idx(codec, 0x06, 0x000c, 0);
6150 		/* Enable Line1 input control by verb */
6151 		alc_update_coef_idx(codec, 0x1a, 0, 1 << 4);
6152 		break;
6153 	}
6154 }
6155 
alc283_fixup_sense_combo_jack(struct hda_codec *codec, const struct hda_fixup *fix, int action)6156 static void alc283_fixup_sense_combo_jack(struct hda_codec *codec,
6157 				    const struct hda_fixup *fix, int action)
6158 {
6159 	struct alc_spec *spec = codec->spec;
6160 
6161 	switch (action) {
6162 	case HDA_FIXUP_ACT_PRE_PROBE:
6163 		spec->gen.hp_automute_hook = alc283_hp_automute_hook;
6164 		break;
6165 	case HDA_FIXUP_ACT_INIT:
6166 		/* MIC2-VREF control */
6167 		/* Set to manual mode */
6168 		alc_update_coef_idx(codec, 0x06, 0x000c, 0);
6169 		break;
6170 	}
6171 }
6172 
6173 /* mute tablet speaker pin (0x14) via dock plugging in addition */
asus_tx300_automute(struct hda_codec *codec)6174 static void asus_tx300_automute(struct hda_codec *codec)
6175 {
6176 	struct alc_spec *spec = codec->spec;
6177 	snd_hda_gen_update_outputs(codec);
6178 	if (snd_hda_jack_detect(codec, 0x1b))
6179 		spec->gen.mute_bits |= (1ULL << 0x14);
6180 }
6181 
alc282_fixup_asus_tx300(struct hda_codec *codec, const struct hda_fixup *fix, int action)6182 static void alc282_fixup_asus_tx300(struct hda_codec *codec,
6183 				    const struct hda_fixup *fix, int action)
6184 {
6185 	struct alc_spec *spec = codec->spec;
6186 	static const struct hda_pintbl dock_pins[] = {
6187 		{ 0x1b, 0x21114000 }, /* dock speaker pin */
6188 		{}
6189 	};
6190 
6191 	switch (action) {
6192 	case HDA_FIXUP_ACT_PRE_PROBE:
6193 		spec->init_amp = ALC_INIT_DEFAULT;
6194 		/* TX300 needs to set up GPIO2 for the speaker amp */
6195 		alc_setup_gpio(codec, 0x04);
6196 		snd_hda_apply_pincfgs(codec, dock_pins);
6197 		spec->gen.auto_mute_via_amp = 1;
6198 		spec->gen.automute_hook = asus_tx300_automute;
6199 		snd_hda_jack_detect_enable_callback(codec, 0x1b,
6200 						    snd_hda_gen_hp_automute);
6201 		break;
6202 	case HDA_FIXUP_ACT_PROBE:
6203 		spec->init_amp = ALC_INIT_DEFAULT;
6204 		break;
6205 	case HDA_FIXUP_ACT_BUILD:
6206 		/* this is a bit tricky; give more sane names for the main
6207 		 * (tablet) speaker and the dock speaker, respectively
6208 		 */
6209 		rename_ctl(codec, "Speaker Playback Switch",
6210 			   "Dock Speaker Playback Switch");
6211 		rename_ctl(codec, "Bass Speaker Playback Switch",
6212 			   "Speaker Playback Switch");
6213 		break;
6214 	}
6215 }
6216 
alc290_fixup_mono_speakers(struct hda_codec *codec, const struct hda_fixup *fix, int action)6217 static void alc290_fixup_mono_speakers(struct hda_codec *codec,
6218 				       const struct hda_fixup *fix, int action)
6219 {
6220 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6221 		/* DAC node 0x03 is giving mono output. We therefore want to
6222 		   make sure 0x14 (front speaker) and 0x15 (headphones) use the
6223 		   stereo DAC, while leaving 0x17 (bass speaker) for node 0x03. */
6224 		static const hda_nid_t conn1[] = { 0x0c };
6225 		snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
6226 		snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
6227 	}
6228 }
6229 
alc298_fixup_speaker_volume(struct hda_codec *codec, const struct hda_fixup *fix, int action)6230 static void alc298_fixup_speaker_volume(struct hda_codec *codec,
6231 					const struct hda_fixup *fix, int action)
6232 {
6233 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6234 		/* The speaker is routed to the Node 0x06 by a mistake, as a result
6235 		   we can't adjust the speaker's volume since this node does not has
6236 		   Amp-out capability. we change the speaker's route to:
6237 		   Node 0x02 (Audio Output) -> Node 0x0c (Audio Mixer) -> Node 0x17 (
6238 		   Pin Complex), since Node 0x02 has Amp-out caps, we can adjust
6239 		   speaker's volume now. */
6240 
6241 		static const hda_nid_t conn1[] = { 0x0c };
6242 		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn1), conn1);
6243 	}
6244 }
6245 
6246 /* disable DAC3 (0x06) selection on NID 0x17 as it has no volume amp control */
alc295_fixup_disable_dac3(struct hda_codec *codec, const struct hda_fixup *fix, int action)6247 static void alc295_fixup_disable_dac3(struct hda_codec *codec,
6248 				      const struct hda_fixup *fix, int action)
6249 {
6250 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6251 		static const hda_nid_t conn[] = { 0x02, 0x03 };
6252 		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6253 	}
6254 }
6255 
6256 /* force NID 0x17 (Bass Speaker) to DAC1 to share it with the main speaker */
alc285_fixup_speaker2_to_dac1(struct hda_codec *codec, const struct hda_fixup *fix, int action)6257 static void alc285_fixup_speaker2_to_dac1(struct hda_codec *codec,
6258 					  const struct hda_fixup *fix, int action)
6259 {
6260 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6261 		static const hda_nid_t conn[] = { 0x02 };
6262 		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6263 	}
6264 }
6265 
6266 /* Hook to update amp GPIO4 for automute */
alc280_hp_gpio4_automute_hook(struct hda_codec *codec, struct hda_jack_callback *jack)6267 static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec,
6268 					  struct hda_jack_callback *jack)
6269 {
6270 	struct alc_spec *spec = codec->spec;
6271 
6272 	snd_hda_gen_hp_automute(codec, jack);
6273 	/* mute_led_polarity is set to 0, so we pass inverted value here */
6274 	alc_update_gpio_led(codec, 0x10, spec->mute_led_polarity,
6275 			    !spec->gen.hp_jack_present);
6276 }
6277 
6278 /* Manage GPIOs for HP EliteBook Folio 9480m.
6279  *
6280  * GPIO4 is the headphone amplifier power control
6281  * GPIO3 is the audio output mute indicator LED
6282  */
6283 
alc280_fixup_hp_9480m(struct hda_codec *codec, const struct hda_fixup *fix, int action)6284 static void alc280_fixup_hp_9480m(struct hda_codec *codec,
6285 				  const struct hda_fixup *fix,
6286 				  int action)
6287 {
6288 	struct alc_spec *spec = codec->spec;
6289 
6290 	alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
6291 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6292 		/* amp at GPIO4; toggled via alc280_hp_gpio4_automute_hook() */
6293 		spec->gpio_mask |= 0x10;
6294 		spec->gpio_dir |= 0x10;
6295 		spec->gen.hp_automute_hook = alc280_hp_gpio4_automute_hook;
6296 	}
6297 }
6298 
alc275_fixup_gpio4_off(struct hda_codec *codec, const struct hda_fixup *fix, int action)6299 static void alc275_fixup_gpio4_off(struct hda_codec *codec,
6300 				   const struct hda_fixup *fix,
6301 				   int action)
6302 {
6303 	struct alc_spec *spec = codec->spec;
6304 
6305 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6306 		spec->gpio_mask |= 0x04;
6307 		spec->gpio_dir |= 0x04;
6308 		/* set data bit low */
6309 	}
6310 }
6311 
6312 /* Quirk for Thinkpad X1 7th and 8th Gen
6313  * The following fixed routing needed
6314  * DAC1 (NID 0x02) -> Speaker (NID 0x14); some eq applied secretly
6315  * DAC2 (NID 0x03) -> Bass (NID 0x17) & Headphone (NID 0x21); sharing a DAC
6316  * DAC3 (NID 0x06) -> Unused, due to the lack of volume amp
6317  */
alc285_fixup_thinkpad_x1_gen7(struct hda_codec *codec, const struct hda_fixup *fix, int action)6318 static void alc285_fixup_thinkpad_x1_gen7(struct hda_codec *codec,
6319 					  const struct hda_fixup *fix, int action)
6320 {
6321 	static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */
6322 	static const hda_nid_t preferred_pairs[] = {
6323 		0x14, 0x02, 0x17, 0x03, 0x21, 0x03, 0
6324 	};
6325 	struct alc_spec *spec = codec->spec;
6326 
6327 	switch (action) {
6328 	case HDA_FIXUP_ACT_PRE_PROBE:
6329 		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6330 		spec->gen.preferred_dacs = preferred_pairs;
6331 		break;
6332 	case HDA_FIXUP_ACT_BUILD:
6333 		/* The generic parser creates somewhat unintuitive volume ctls
6334 		 * with the fixed routing above, and the shared DAC2 may be
6335 		 * confusing for PA.
6336 		 * Rename those to unique names so that PA doesn't touch them
6337 		 * and use only Master volume.
6338 		 */
6339 		rename_ctl(codec, "Front Playback Volume", "DAC1 Playback Volume");
6340 		rename_ctl(codec, "Bass Speaker Playback Volume", "DAC2 Playback Volume");
6341 		break;
6342 	}
6343 }
6344 
alc233_alc662_fixup_lenovo_dual_codecs(struct hda_codec *codec, const struct hda_fixup *fix, int action)6345 static void alc233_alc662_fixup_lenovo_dual_codecs(struct hda_codec *codec,
6346 					 const struct hda_fixup *fix,
6347 					 int action)
6348 {
6349 	alc_fixup_dual_codecs(codec, fix, action);
6350 	switch (action) {
6351 	case HDA_FIXUP_ACT_PRE_PROBE:
6352 		/* override card longname to provide a unique UCM profile */
6353 		strcpy(codec->card->longname, "HDAudio-Lenovo-DualCodecs");
6354 		break;
6355 	case HDA_FIXUP_ACT_BUILD:
6356 		/* rename Capture controls depending on the codec */
6357 		rename_ctl(codec, "Capture Volume",
6358 			   codec->addr == 0 ?
6359 			   "Rear-Panel Capture Volume" :
6360 			   "Front-Panel Capture Volume");
6361 		rename_ctl(codec, "Capture Switch",
6362 			   codec->addr == 0 ?
6363 			   "Rear-Panel Capture Switch" :
6364 			   "Front-Panel Capture Switch");
6365 		break;
6366 	}
6367 }
6368 
alc225_fixup_s3_pop_noise(struct hda_codec *codec, const struct hda_fixup *fix, int action)6369 static void alc225_fixup_s3_pop_noise(struct hda_codec *codec,
6370 				      const struct hda_fixup *fix, int action)
6371 {
6372 	if (action != HDA_FIXUP_ACT_PRE_PROBE)
6373 		return;
6374 
6375 	codec->power_save_node = 1;
6376 }
6377 
6378 /* Forcibly assign NID 0x03 to HP/LO while NID 0x02 to SPK for EQ */
alc274_fixup_bind_dacs(struct hda_codec *codec, const struct hda_fixup *fix, int action)6379 static void alc274_fixup_bind_dacs(struct hda_codec *codec,
6380 				    const struct hda_fixup *fix, int action)
6381 {
6382 	struct alc_spec *spec = codec->spec;
6383 	static const hda_nid_t preferred_pairs[] = {
6384 		0x21, 0x03, 0x1b, 0x03, 0x16, 0x02,
6385 		0
6386 	};
6387 
6388 	if (action != HDA_FIXUP_ACT_PRE_PROBE)
6389 		return;
6390 
6391 	spec->gen.preferred_dacs = preferred_pairs;
6392 	spec->gen.auto_mute_via_amp = 1;
6393 	codec->power_save_node = 0;
6394 }
6395 
6396 /* avoid DAC 0x06 for bass speaker 0x17; it has no volume control */
alc289_fixup_asus_ga401(struct hda_codec *codec, const struct hda_fixup *fix, int action)6397 static void alc289_fixup_asus_ga401(struct hda_codec *codec,
6398 				    const struct hda_fixup *fix, int action)
6399 {
6400 	static const hda_nid_t preferred_pairs[] = {
6401 		0x14, 0x02, 0x17, 0x02, 0x21, 0x03, 0
6402 	};
6403 	struct alc_spec *spec = codec->spec;
6404 
6405 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6406 		spec->gen.preferred_dacs = preferred_pairs;
6407 		spec->gen.obey_preferred_dacs = 1;
6408 	}
6409 }
6410 
6411 /* The DAC of NID 0x3 will introduce click/pop noise on headphones, so invalidate it */
alc285_fixup_invalidate_dacs(struct hda_codec *codec, const struct hda_fixup *fix, int action)6412 static void alc285_fixup_invalidate_dacs(struct hda_codec *codec,
6413 			      const struct hda_fixup *fix, int action)
6414 {
6415 	if (action != HDA_FIXUP_ACT_PRE_PROBE)
6416 		return;
6417 
6418 	snd_hda_override_wcaps(codec, 0x03, 0);
6419 }
6420 
alc_combo_jack_hp_jd_restart(struct hda_codec *codec)6421 static void alc_combo_jack_hp_jd_restart(struct hda_codec *codec)
6422 {
6423 	switch (codec->core.vendor_id) {
6424 	case 0x10ec0274:
6425 	case 0x10ec0294:
6426 	case 0x10ec0225:
6427 	case 0x10ec0295:
6428 	case 0x10ec0299:
6429 		alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15); /* Reset HP JD */
6430 		alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15);
6431 		break;
6432 	case 0x10ec0230:
6433 	case 0x10ec0235:
6434 	case 0x10ec0236:
6435 	case 0x10ec0255:
6436 	case 0x10ec0256:
6437 	case 0x10ec0257:
6438 	case 0x19e58326:
6439 		alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15); /* Reset HP JD */
6440 		alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15);
6441 		break;
6442 	}
6443 }
6444 
alc295_fixup_chromebook(struct hda_codec *codec, const struct hda_fixup *fix, int action)6445 static void alc295_fixup_chromebook(struct hda_codec *codec,
6446 				    const struct hda_fixup *fix, int action)
6447 {
6448 	struct alc_spec *spec = codec->spec;
6449 
6450 	switch (action) {
6451 	case HDA_FIXUP_ACT_PRE_PROBE:
6452 		spec->ultra_low_power = true;
6453 		break;
6454 	case HDA_FIXUP_ACT_INIT:
6455 		alc_combo_jack_hp_jd_restart(codec);
6456 		break;
6457 	}
6458 }
6459 
alc_fixup_disable_mic_vref(struct hda_codec *codec, const struct hda_fixup *fix, int action)6460 static void alc_fixup_disable_mic_vref(struct hda_codec *codec,
6461 				  const struct hda_fixup *fix, int action)
6462 {
6463 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
6464 		snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
6465 }
6466 
6467 
alc294_gx502_toggle_output(struct hda_codec *codec, struct hda_jack_callback *cb)6468 static void alc294_gx502_toggle_output(struct hda_codec *codec,
6469 					struct hda_jack_callback *cb)
6470 {
6471 	/* The Windows driver sets the codec up in a very different way where
6472 	 * it appears to leave 0x10 = 0x8a20 set. For Linux we need to toggle it
6473 	 */
6474 	if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
6475 		alc_write_coef_idx(codec, 0x10, 0x8a20);
6476 	else
6477 		alc_write_coef_idx(codec, 0x10, 0x0a20);
6478 }
6479 
alc294_fixup_gx502_hp(struct hda_codec *codec, const struct hda_fixup *fix, int action)6480 static void alc294_fixup_gx502_hp(struct hda_codec *codec,
6481 					const struct hda_fixup *fix, int action)
6482 {
6483 	/* Pin 0x21: headphones/headset mic */
6484 	if (!is_jack_detectable(codec, 0x21))
6485 		return;
6486 
6487 	switch (action) {
6488 	case HDA_FIXUP_ACT_PRE_PROBE:
6489 		snd_hda_jack_detect_enable_callback(codec, 0x21,
6490 				alc294_gx502_toggle_output);
6491 		break;
6492 	case HDA_FIXUP_ACT_INIT:
6493 		/* Make sure to start in a correct state, i.e. if
6494 		 * headphones have been plugged in before powering up the system
6495 		 */
6496 		alc294_gx502_toggle_output(codec, NULL);
6497 		break;
6498 	}
6499 }
6500 
alc294_gu502_toggle_output(struct hda_codec *codec, struct hda_jack_callback *cb)6501 static void alc294_gu502_toggle_output(struct hda_codec *codec,
6502 				       struct hda_jack_callback *cb)
6503 {
6504 	/* Windows sets 0x10 to 0x8420 for Node 0x20 which is
6505 	 * responsible from changes between speakers and headphones
6506 	 */
6507 	if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
6508 		alc_write_coef_idx(codec, 0x10, 0x8420);
6509 	else
6510 		alc_write_coef_idx(codec, 0x10, 0x0a20);
6511 }
6512 
alc294_fixup_gu502_hp(struct hda_codec *codec, const struct hda_fixup *fix, int action)6513 static void alc294_fixup_gu502_hp(struct hda_codec *codec,
6514 				  const struct hda_fixup *fix, int action)
6515 {
6516 	if (!is_jack_detectable(codec, 0x21))
6517 		return;
6518 
6519 	switch (action) {
6520 	case HDA_FIXUP_ACT_PRE_PROBE:
6521 		snd_hda_jack_detect_enable_callback(codec, 0x21,
6522 				alc294_gu502_toggle_output);
6523 		break;
6524 	case HDA_FIXUP_ACT_INIT:
6525 		alc294_gu502_toggle_output(codec, NULL);
6526 		break;
6527 	}
6528 }
6529 
alc285_fixup_hp_gpio_amp_init(struct hda_codec *codec, const struct hda_fixup *fix, int action)6530 static void  alc285_fixup_hp_gpio_amp_init(struct hda_codec *codec,
6531 			      const struct hda_fixup *fix, int action)
6532 {
6533 	if (action != HDA_FIXUP_ACT_INIT)
6534 		return;
6535 
6536 	msleep(100);
6537 	alc_write_coef_idx(codec, 0x65, 0x0);
6538 }
6539 
alc274_fixup_hp_headset_mic(struct hda_codec *codec, const struct hda_fixup *fix, int action)6540 static void alc274_fixup_hp_headset_mic(struct hda_codec *codec,
6541 				    const struct hda_fixup *fix, int action)
6542 {
6543 	switch (action) {
6544 	case HDA_FIXUP_ACT_INIT:
6545 		alc_combo_jack_hp_jd_restart(codec);
6546 		break;
6547 	}
6548 }
6549 
alc_fixup_no_int_mic(struct hda_codec *codec, const struct hda_fixup *fix, int action)6550 static void alc_fixup_no_int_mic(struct hda_codec *codec,
6551 				    const struct hda_fixup *fix, int action)
6552 {
6553 	struct alc_spec *spec = codec->spec;
6554 
6555 	switch (action) {
6556 	case HDA_FIXUP_ACT_PRE_PROBE:
6557 		/* Mic RING SLEEVE swap for combo jack */
6558 		alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
6559 		spec->no_internal_mic_pin = true;
6560 		break;
6561 	case HDA_FIXUP_ACT_INIT:
6562 		alc_combo_jack_hp_jd_restart(codec);
6563 		break;
6564 	}
6565 }
6566 
6567 /* GPIO1 = amplifier on/off
6568  * GPIO3 = mic mute LED
6569  */
alc285_fixup_hp_spectre_x360_eb1(struct hda_codec *codec, const struct hda_fixup *fix, int action)6570 static void alc285_fixup_hp_spectre_x360_eb1(struct hda_codec *codec,
6571 					  const struct hda_fixup *fix, int action)
6572 {
6573 	static const hda_nid_t conn[] = { 0x02 };
6574 
6575 	struct alc_spec *spec = codec->spec;
6576 	static const struct hda_pintbl pincfgs[] = {
6577 		{ 0x14, 0x90170110 },  /* front/high speakers */
6578 		{ 0x17, 0x90170130 },  /* back/bass speakers */
6579 		{ }
6580 	};
6581 
6582 	//enable micmute led
6583 	alc_fixup_hp_gpio_led(codec, action, 0x00, 0x04);
6584 
6585 	switch (action) {
6586 	case HDA_FIXUP_ACT_PRE_PROBE:
6587 		spec->micmute_led_polarity = 1;
6588 		/* needed for amp of back speakers */
6589 		spec->gpio_mask |= 0x01;
6590 		spec->gpio_dir |= 0x01;
6591 		snd_hda_apply_pincfgs(codec, pincfgs);
6592 		/* share DAC to have unified volume control */
6593 		snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
6594 		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6595 		break;
6596 	case HDA_FIXUP_ACT_INIT:
6597 		/* need to toggle GPIO to enable the amp of back speakers */
6598 		alc_update_gpio_data(codec, 0x01, true);
6599 		msleep(100);
6600 		alc_update_gpio_data(codec, 0x01, false);
6601 		break;
6602 	}
6603 }
6604 
alc285_fixup_hp_spectre_x360(struct hda_codec *codec, const struct hda_fixup *fix, int action)6605 static void alc285_fixup_hp_spectre_x360(struct hda_codec *codec,
6606 					  const struct hda_fixup *fix, int action)
6607 {
6608 	static const hda_nid_t conn[] = { 0x02 };
6609 	static const struct hda_pintbl pincfgs[] = {
6610 		{ 0x14, 0x90170110 },  /* rear speaker */
6611 		{ }
6612 	};
6613 
6614 	switch (action) {
6615 	case HDA_FIXUP_ACT_PRE_PROBE:
6616 		snd_hda_apply_pincfgs(codec, pincfgs);
6617 		/* force front speaker to DAC1 */
6618 		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6619 		break;
6620 	}
6621 }
6622 
6623 /* for hda_fixup_thinkpad_acpi() */
6624 #include "thinkpad_helper.c"
6625 
alc_fixup_thinkpad_acpi(struct hda_codec *codec, const struct hda_fixup *fix, int action)6626 static void alc_fixup_thinkpad_acpi(struct hda_codec *codec,
6627 				    const struct hda_fixup *fix, int action)
6628 {
6629 	alc_fixup_no_shutup(codec, fix, action); /* reduce click noise */
6630 	hda_fixup_thinkpad_acpi(codec, fix, action);
6631 }
6632 
6633 /* Fixup for Lenovo Legion 15IMHg05 speaker output on headset removal. */
alc287_fixup_legion_15imhg05_speakers(struct hda_codec *codec, const struct hda_fixup *fix, int action)6634 static void alc287_fixup_legion_15imhg05_speakers(struct hda_codec *codec,
6635 						  const struct hda_fixup *fix,
6636 						  int action)
6637 {
6638 	struct alc_spec *spec = codec->spec;
6639 
6640 	switch (action) {
6641 	case HDA_FIXUP_ACT_PRE_PROBE:
6642 		spec->gen.suppress_auto_mute = 1;
6643 		break;
6644 	}
6645 }
6646 
6647 /* for alc295_fixup_hp_top_speakers */
6648 #include "hp_x360_helper.c"
6649 
6650 /* for alc285_fixup_ideapad_s740_coef() */
6651 #include "ideapad_s740_helper.c"
6652 
6653 static const struct coef_fw alc256_fixup_set_coef_defaults_coefs[] = {
6654 	WRITE_COEF(0x10, 0x0020), WRITE_COEF(0x24, 0x0000),
6655 	WRITE_COEF(0x26, 0x0000), WRITE_COEF(0x29, 0x3000),
6656 	WRITE_COEF(0x37, 0xfe05), WRITE_COEF(0x45, 0x5089),
6657 	{}
6658 };
6659 
alc256_fixup_set_coef_defaults(struct hda_codec *codec, const struct hda_fixup *fix, int action)6660 static void alc256_fixup_set_coef_defaults(struct hda_codec *codec,
6661 					   const struct hda_fixup *fix,
6662 					   int action)
6663 {
6664 	/*
6665 	 * A certain other OS sets these coeffs to different values. On at least
6666 	 * one TongFang barebone these settings might survive even a cold
6667 	 * reboot. So to restore a clean slate the values are explicitly reset
6668 	 * to default here. Without this, the external microphone is always in a
6669 	 * plugged-in state, while the internal microphone is always in an
6670 	 * unplugged state, breaking the ability to use the internal microphone.
6671 	 */
6672 	alc_process_coef_fw(codec, alc256_fixup_set_coef_defaults_coefs);
6673 }
6674 
6675 static const struct coef_fw alc233_fixup_no_audio_jack_coefs[] = {
6676 	WRITE_COEF(0x1a, 0x9003), WRITE_COEF(0x1b, 0x0e2b), WRITE_COEF(0x37, 0xfe06),
6677 	WRITE_COEF(0x38, 0x4981), WRITE_COEF(0x45, 0xd489), WRITE_COEF(0x46, 0x0074),
6678 	WRITE_COEF(0x49, 0x0149),
6679 	{}
6680 };
6681 
alc233_fixup_no_audio_jack(struct hda_codec *codec, const struct hda_fixup *fix, int action)6682 static void alc233_fixup_no_audio_jack(struct hda_codec *codec,
6683 				       const struct hda_fixup *fix,
6684 				       int action)
6685 {
6686 	/*
6687 	 * The audio jack input and output is not detected on the ASRock NUC Box
6688 	 * 1100 series when cold booting without this fix. Warm rebooting from a
6689 	 * certain other OS makes the audio functional, as COEF settings are
6690 	 * preserved in this case. This fix sets these altered COEF values as
6691 	 * the default.
6692 	 */
6693 	alc_process_coef_fw(codec, alc233_fixup_no_audio_jack_coefs);
6694 }
6695 
alc256_fixup_mic_no_presence_and_resume(struct hda_codec *codec, const struct hda_fixup *fix, int action)6696 static void alc256_fixup_mic_no_presence_and_resume(struct hda_codec *codec,
6697 						    const struct hda_fixup *fix,
6698 						    int action)
6699 {
6700 	/*
6701 	 * The Clevo NJ51CU comes either with the ALC293 or the ALC256 codec,
6702 	 * but uses the 0x8686 subproduct id in both cases. The ALC256 codec
6703 	 * needs an additional quirk for sound working after suspend and resume.
6704 	 */
6705 	if (codec->core.vendor_id == 0x10ec0256) {
6706 		alc_update_coef_idx(codec, 0x10, 1<<9, 0);
6707 		snd_hda_codec_set_pincfg(codec, 0x19, 0x04a11120);
6708 	} else {
6709 		snd_hda_codec_set_pincfg(codec, 0x1a, 0x04a1113c);
6710 	}
6711 }
6712 
alc295_fixup_dell_inspiron_top_speakers(struct hda_codec *codec, const struct hda_fixup *fix, int action)6713 static void alc295_fixup_dell_inspiron_top_speakers(struct hda_codec *codec,
6714 					  const struct hda_fixup *fix, int action)
6715 {
6716 	static const struct hda_pintbl pincfgs[] = {
6717 		{ 0x14, 0x90170151 },
6718 		{ 0x17, 0x90170150 },
6719 		{ }
6720 	};
6721 	static const hda_nid_t conn[] = { 0x02, 0x03 };
6722 	static const hda_nid_t preferred_pairs[] = {
6723 		0x14, 0x02,
6724 		0x17, 0x03,
6725 		0x21, 0x02,
6726 		0
6727 	};
6728 	struct alc_spec *spec = codec->spec;
6729 
6730 	alc_fixup_no_shutup(codec, fix, action);
6731 
6732 	switch (action) {
6733 	case HDA_FIXUP_ACT_PRE_PROBE:
6734 		snd_hda_apply_pincfgs(codec, pincfgs);
6735 		snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6736 		spec->gen.preferred_dacs = preferred_pairs;
6737 		break;
6738 	}
6739 }
6740 
6741 enum {
6742 	ALC269_FIXUP_GPIO2,
6743 	ALC269_FIXUP_SONY_VAIO,
6744 	ALC275_FIXUP_SONY_VAIO_GPIO2,
6745 	ALC269_FIXUP_DELL_M101Z,
6746 	ALC269_FIXUP_SKU_IGNORE,
6747 	ALC269_FIXUP_ASUS_G73JW,
6748 	ALC269_FIXUP_LENOVO_EAPD,
6749 	ALC275_FIXUP_SONY_HWEQ,
6750 	ALC275_FIXUP_SONY_DISABLE_AAMIX,
6751 	ALC271_FIXUP_DMIC,
6752 	ALC269_FIXUP_PCM_44K,
6753 	ALC269_FIXUP_STEREO_DMIC,
6754 	ALC269_FIXUP_HEADSET_MIC,
6755 	ALC269_FIXUP_QUANTA_MUTE,
6756 	ALC269_FIXUP_LIFEBOOK,
6757 	ALC269_FIXUP_LIFEBOOK_EXTMIC,
6758 	ALC269_FIXUP_LIFEBOOK_HP_PIN,
6759 	ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT,
6760 	ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC,
6761 	ALC269_FIXUP_AMIC,
6762 	ALC269_FIXUP_DMIC,
6763 	ALC269VB_FIXUP_AMIC,
6764 	ALC269VB_FIXUP_DMIC,
6765 	ALC269_FIXUP_HP_MUTE_LED,
6766 	ALC269_FIXUP_HP_MUTE_LED_MIC1,
6767 	ALC269_FIXUP_HP_MUTE_LED_MIC2,
6768 	ALC269_FIXUP_HP_MUTE_LED_MIC3,
6769 	ALC269_FIXUP_HP_GPIO_LED,
6770 	ALC269_FIXUP_HP_GPIO_MIC1_LED,
6771 	ALC269_FIXUP_HP_LINE1_MIC1_LED,
6772 	ALC269_FIXUP_INV_DMIC,
6773 	ALC269_FIXUP_LENOVO_DOCK,
6774 	ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST,
6775 	ALC269_FIXUP_NO_SHUTUP,
6776 	ALC286_FIXUP_SONY_MIC_NO_PRESENCE,
6777 	ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
6778 	ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
6779 	ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
6780 	ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
6781 	ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
6782 	ALC269_FIXUP_HEADSET_MODE,
6783 	ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
6784 	ALC269_FIXUP_ASPIRE_HEADSET_MIC,
6785 	ALC269_FIXUP_ASUS_X101_FUNC,
6786 	ALC269_FIXUP_ASUS_X101_VERB,
6787 	ALC269_FIXUP_ASUS_X101,
6788 	ALC271_FIXUP_AMIC_MIC2,
6789 	ALC271_FIXUP_HP_GATE_MIC_JACK,
6790 	ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572,
6791 	ALC269_FIXUP_ACER_AC700,
6792 	ALC269_FIXUP_LIMIT_INT_MIC_BOOST,
6793 	ALC269VB_FIXUP_ASUS_ZENBOOK,
6794 	ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A,
6795 	ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE,
6796 	ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED,
6797 	ALC269VB_FIXUP_ORDISSIMO_EVE2,
6798 	ALC283_FIXUP_CHROME_BOOK,
6799 	ALC283_FIXUP_SENSE_COMBO_JACK,
6800 	ALC282_FIXUP_ASUS_TX300,
6801 	ALC283_FIXUP_INT_MIC,
6802 	ALC290_FIXUP_MONO_SPEAKERS,
6803 	ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
6804 	ALC290_FIXUP_SUBWOOFER,
6805 	ALC290_FIXUP_SUBWOOFER_HSJACK,
6806 	ALC269_FIXUP_THINKPAD_ACPI,
6807 	ALC269_FIXUP_DMIC_THINKPAD_ACPI,
6808 	ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO,
6809 	ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
6810 	ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
6811 	ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6812 	ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
6813 	ALC255_FIXUP_HEADSET_MODE,
6814 	ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,
6815 	ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
6816 	ALC292_FIXUP_TPT440_DOCK,
6817 	ALC292_FIXUP_TPT440,
6818 	ALC283_FIXUP_HEADSET_MIC,
6819 	ALC255_FIXUP_MIC_MUTE_LED,
6820 	ALC282_FIXUP_ASPIRE_V5_PINS,
6821 	ALC269VB_FIXUP_ASPIRE_E1_COEF,
6822 	ALC280_FIXUP_HP_GPIO4,
6823 	ALC286_FIXUP_HP_GPIO_LED,
6824 	ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY,
6825 	ALC280_FIXUP_HP_DOCK_PINS,
6826 	ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED,
6827 	ALC280_FIXUP_HP_9480M,
6828 	ALC245_FIXUP_HP_X360_AMP,
6829 	ALC285_FIXUP_HP_SPECTRE_X360_EB1,
6830 	ALC288_FIXUP_DELL_HEADSET_MODE,
6831 	ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
6832 	ALC288_FIXUP_DELL_XPS_13,
6833 	ALC288_FIXUP_DISABLE_AAMIX,
6834 	ALC292_FIXUP_DELL_E7X_AAMIX,
6835 	ALC292_FIXUP_DELL_E7X,
6836 	ALC292_FIXUP_DISABLE_AAMIX,
6837 	ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK,
6838 	ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
6839 	ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
6840 	ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
6841 	ALC275_FIXUP_DELL_XPS,
6842 	ALC293_FIXUP_LENOVO_SPK_NOISE,
6843 	ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
6844 	ALC255_FIXUP_DELL_SPK_NOISE,
6845 	ALC225_FIXUP_DISABLE_MIC_VREF,
6846 	ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
6847 	ALC295_FIXUP_DISABLE_DAC3,
6848 	ALC285_FIXUP_SPEAKER2_TO_DAC1,
6849 	ALC280_FIXUP_HP_HEADSET_MIC,
6850 	ALC221_FIXUP_HP_FRONT_MIC,
6851 	ALC292_FIXUP_TPT460,
6852 	ALC298_FIXUP_SPK_VOLUME,
6853 	ALC298_FIXUP_LENOVO_SPK_VOLUME,
6854 	ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER,
6855 	ALC269_FIXUP_ATIV_BOOK_8,
6856 	ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE,
6857 	ALC221_FIXUP_HP_MIC_NO_PRESENCE,
6858 	ALC256_FIXUP_ASUS_HEADSET_MODE,
6859 	ALC256_FIXUP_ASUS_MIC,
6860 	ALC256_FIXUP_ASUS_AIO_GPIO2,
6861 	ALC233_FIXUP_ASUS_MIC_NO_PRESENCE,
6862 	ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE,
6863 	ALC233_FIXUP_LENOVO_MULTI_CODECS,
6864 	ALC233_FIXUP_ACER_HEADSET_MIC,
6865 	ALC294_FIXUP_LENOVO_MIC_LOCATION,
6866 	ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE,
6867 	ALC225_FIXUP_S3_POP_NOISE,
6868 	ALC700_FIXUP_INTEL_REFERENCE,
6869 	ALC274_FIXUP_DELL_BIND_DACS,
6870 	ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
6871 	ALC298_FIXUP_TPT470_DOCK_FIX,
6872 	ALC298_FIXUP_TPT470_DOCK,
6873 	ALC255_FIXUP_DUMMY_LINEOUT_VERB,
6874 	ALC255_FIXUP_DELL_HEADSET_MIC,
6875 	ALC256_FIXUP_HUAWEI_MACH_WX9_PINS,
6876 	ALC298_FIXUP_HUAWEI_MBX_STEREO,
6877 	ALC295_FIXUP_HP_X360,
6878 	ALC221_FIXUP_HP_HEADSET_MIC,
6879 	ALC285_FIXUP_LENOVO_HEADPHONE_NOISE,
6880 	ALC295_FIXUP_HP_AUTO_MUTE,
6881 	ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
6882 	ALC294_FIXUP_ASUS_MIC,
6883 	ALC294_FIXUP_ASUS_HEADSET_MIC,
6884 	ALC294_FIXUP_ASUS_SPK,
6885 	ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
6886 	ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
6887 	ALC255_FIXUP_ACER_HEADSET_MIC,
6888 	ALC295_FIXUP_CHROME_BOOK,
6889 	ALC225_FIXUP_HEADSET_JACK,
6890 	ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE,
6891 	ALC225_FIXUP_WYSE_AUTO_MUTE,
6892 	ALC225_FIXUP_WYSE_DISABLE_MIC_VREF,
6893 	ALC286_FIXUP_ACER_AIO_HEADSET_MIC,
6894 	ALC256_FIXUP_ASUS_HEADSET_MIC,
6895 	ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
6896 	ALC299_FIXUP_PREDATOR_SPK,
6897 	ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE,
6898 	ALC289_FIXUP_DELL_SPK2,
6899 	ALC289_FIXUP_DUAL_SPK,
6900 	ALC294_FIXUP_SPK2_TO_DAC1,
6901 	ALC294_FIXUP_ASUS_DUAL_SPK,
6902 	ALC285_FIXUP_THINKPAD_X1_GEN7,
6903 	ALC285_FIXUP_THINKPAD_HEADSET_JACK,
6904 	ALC294_FIXUP_ASUS_HPE,
6905 	ALC294_FIXUP_ASUS_COEF_1B,
6906 	ALC294_FIXUP_ASUS_GX502_HP,
6907 	ALC294_FIXUP_ASUS_GX502_PINS,
6908 	ALC294_FIXUP_ASUS_GX502_VERBS,
6909 	ALC294_FIXUP_ASUS_GU502_HP,
6910 	ALC294_FIXUP_ASUS_GU502_PINS,
6911 	ALC294_FIXUP_ASUS_GU502_VERBS,
6912 	ALC294_FIXUP_ASUS_G513_PINS,
6913 	ALC285_FIXUP_ASUS_G533Z_PINS,
6914 	ALC285_FIXUP_HP_GPIO_LED,
6915 	ALC285_FIXUP_HP_MUTE_LED,
6916 	ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED,
6917 	ALC236_FIXUP_HP_MUTE_LED_COEFBIT2,
6918 	ALC236_FIXUP_HP_GPIO_LED,
6919 	ALC236_FIXUP_HP_MUTE_LED,
6920 	ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,
6921 	ALC298_FIXUP_SAMSUNG_AMP,
6922 	ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
6923 	ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
6924 	ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
6925 	ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS,
6926 	ALC269VC_FIXUP_ACER_HEADSET_MIC,
6927 	ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE,
6928 	ALC289_FIXUP_ASUS_GA401,
6929 	ALC289_FIXUP_ASUS_GA502,
6930 	ALC256_FIXUP_ACER_MIC_NO_PRESENCE,
6931 	ALC285_FIXUP_HP_GPIO_AMP_INIT,
6932 	ALC269_FIXUP_CZC_B20,
6933 	ALC269_FIXUP_CZC_TMI,
6934 	ALC269_FIXUP_CZC_L101,
6935 	ALC269_FIXUP_LEMOTE_A1802,
6936 	ALC269_FIXUP_LEMOTE_A190X,
6937 	ALC256_FIXUP_INTEL_NUC8_RUGGED,
6938 	ALC233_FIXUP_INTEL_NUC8_DMIC,
6939 	ALC233_FIXUP_INTEL_NUC8_BOOST,
6940 	ALC256_FIXUP_INTEL_NUC10,
6941 	ALC255_FIXUP_XIAOMI_HEADSET_MIC,
6942 	ALC274_FIXUP_HP_MIC,
6943 	ALC274_FIXUP_HP_HEADSET_MIC,
6944 	ALC274_FIXUP_HP_ENVY_GPIO,
6945 	ALC256_FIXUP_ASUS_HPE,
6946 	ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
6947 	ALC287_FIXUP_HP_GPIO_LED,
6948 	ALC256_FIXUP_HP_HEADSET_MIC,
6949 	ALC245_FIXUP_HP_GPIO_LED,
6950 	ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
6951 	ALC282_FIXUP_ACER_DISABLE_LINEOUT,
6952 	ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST,
6953 	ALC256_FIXUP_ACER_HEADSET_MIC,
6954 	ALC285_FIXUP_IDEAPAD_S740_COEF,
6955 	ALC295_FIXUP_ASUS_DACS,
6956 	ALC295_FIXUP_HP_OMEN,
6957 	ALC285_FIXUP_HP_SPECTRE_X360,
6958 	ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP,
6959 	ALC623_FIXUP_LENOVO_THINKSTATION_P340,
6960 	ALC255_FIXUP_ACER_HEADPHONE_AND_MIC,
6961 	ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST,
6962 	ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS,
6963 	ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,
6964 	ALC287_FIXUP_YOGA7_14ITL_SPEAKERS,
6965 	ALC298_FIXUP_LENOVO_C940_DUET7,
6966 	ALC287_FIXUP_13S_GEN2_SPEAKERS,
6967 	ALC256_FIXUP_SET_COEF_DEFAULTS,
6968 	ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
6969 	ALC233_FIXUP_NO_AUDIO_JACK,
6970 	ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME,
6971 	ALC285_FIXUP_LEGION_Y9000X_SPEAKERS,
6972 	ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,
6973 	ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED,
6974 	ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS,
6975 	ALC236_FIXUP_DELL_DUAL_CODECS,
6976 };
6977 
6978 /* A special fixup for Lenovo C940 and Yoga Duet 7;
6979  * both have the very same PCI SSID, and we need to apply different fixups
6980  * depending on the codec ID
6981  */
alc298_fixup_lenovo_c940_duet7(struct hda_codec *codec, const struct hda_fixup *fix, int action)6982 static void alc298_fixup_lenovo_c940_duet7(struct hda_codec *codec,
6983 					   const struct hda_fixup *fix,
6984 					   int action)
6985 {
6986 	int id;
6987 
6988 	if (codec->core.vendor_id == 0x10ec0298)
6989 		id = ALC298_FIXUP_LENOVO_SPK_VOLUME; /* C940 */
6990 	else
6991 		id = ALC287_FIXUP_YOGA7_14ITL_SPEAKERS; /* Duet 7 */
6992 	__snd_hda_apply_fixup(codec, id, action, 0);
6993 }
6994 
6995 static const struct hda_fixup alc269_fixups[] = {
6996 	[ALC269_FIXUP_GPIO2] = {
6997 		.type = HDA_FIXUP_FUNC,
6998 		.v.func = alc_fixup_gpio2,
6999 	},
7000 	[ALC269_FIXUP_SONY_VAIO] = {
7001 		.type = HDA_FIXUP_PINCTLS,
7002 		.v.pins = (const struct hda_pintbl[]) {
7003 			{0x19, PIN_VREFGRD},
7004 			{}
7005 		}
7006 	},
7007 	[ALC275_FIXUP_SONY_VAIO_GPIO2] = {
7008 		.type = HDA_FIXUP_FUNC,
7009 		.v.func = alc275_fixup_gpio4_off,
7010 		.chained = true,
7011 		.chain_id = ALC269_FIXUP_SONY_VAIO
7012 	},
7013 	[ALC269_FIXUP_DELL_M101Z] = {
7014 		.type = HDA_FIXUP_VERBS,
7015 		.v.verbs = (const struct hda_verb[]) {
7016 			/* Enables internal speaker */
7017 			{0x20, AC_VERB_SET_COEF_INDEX, 13},
7018 			{0x20, AC_VERB_SET_PROC_COEF, 0x4040},
7019 			{}
7020 		}
7021 	},
7022 	[ALC269_FIXUP_SKU_IGNORE] = {
7023 		.type = HDA_FIXUP_FUNC,
7024 		.v.func = alc_fixup_sku_ignore,
7025 	},
7026 	[ALC269_FIXUP_ASUS_G73JW] = {
7027 		.type = HDA_FIXUP_PINS,
7028 		.v.pins = (const struct hda_pintbl[]) {
7029 			{ 0x17, 0x99130111 }, /* subwoofer */
7030 			{ }
7031 		}
7032 	},
7033 	[ALC269_FIXUP_LENOVO_EAPD] = {
7034 		.type = HDA_FIXUP_VERBS,
7035 		.v.verbs = (const struct hda_verb[]) {
7036 			{0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
7037 			{}
7038 		}
7039 	},
7040 	[ALC275_FIXUP_SONY_HWEQ] = {
7041 		.type = HDA_FIXUP_FUNC,
7042 		.v.func = alc269_fixup_hweq,
7043 		.chained = true,
7044 		.chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
7045 	},
7046 	[ALC275_FIXUP_SONY_DISABLE_AAMIX] = {
7047 		.type = HDA_FIXUP_FUNC,
7048 		.v.func = alc_fixup_disable_aamix,
7049 		.chained = true,
7050 		.chain_id = ALC269_FIXUP_SONY_VAIO
7051 	},
7052 	[ALC271_FIXUP_DMIC] = {
7053 		.type = HDA_FIXUP_FUNC,
7054 		.v.func = alc271_fixup_dmic,
7055 	},
7056 	[ALC269_FIXUP_PCM_44K] = {
7057 		.type = HDA_FIXUP_FUNC,
7058 		.v.func = alc269_fixup_pcm_44k,
7059 		.chained = true,
7060 		.chain_id = ALC269_FIXUP_QUANTA_MUTE
7061 	},
7062 	[ALC269_FIXUP_STEREO_DMIC] = {
7063 		.type = HDA_FIXUP_FUNC,
7064 		.v.func = alc269_fixup_stereo_dmic,
7065 	},
7066 	[ALC269_FIXUP_HEADSET_MIC] = {
7067 		.type = HDA_FIXUP_FUNC,
7068 		.v.func = alc269_fixup_headset_mic,
7069 	},
7070 	[ALC269_FIXUP_QUANTA_MUTE] = {
7071 		.type = HDA_FIXUP_FUNC,
7072 		.v.func = alc269_fixup_quanta_mute,
7073 	},
7074 	[ALC269_FIXUP_LIFEBOOK] = {
7075 		.type = HDA_FIXUP_PINS,
7076 		.v.pins = (const struct hda_pintbl[]) {
7077 			{ 0x1a, 0x2101103f }, /* dock line-out */
7078 			{ 0x1b, 0x23a11040 }, /* dock mic-in */
7079 			{ }
7080 		},
7081 		.chained = true,
7082 		.chain_id = ALC269_FIXUP_QUANTA_MUTE
7083 	},
7084 	[ALC269_FIXUP_LIFEBOOK_EXTMIC] = {
7085 		.type = HDA_FIXUP_PINS,
7086 		.v.pins = (const struct hda_pintbl[]) {
7087 			{ 0x19, 0x01a1903c }, /* headset mic, with jack detect */
7088 			{ }
7089 		},
7090 	},
7091 	[ALC269_FIXUP_LIFEBOOK_HP_PIN] = {
7092 		.type = HDA_FIXUP_PINS,
7093 		.v.pins = (const struct hda_pintbl[]) {
7094 			{ 0x21, 0x0221102f }, /* HP out */
7095 			{ }
7096 		},
7097 	},
7098 	[ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT] = {
7099 		.type = HDA_FIXUP_FUNC,
7100 		.v.func = alc269_fixup_pincfg_no_hp_to_lineout,
7101 	},
7102 	[ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC] = {
7103 		.type = HDA_FIXUP_FUNC,
7104 		.v.func = alc269_fixup_pincfg_U7x7_headset_mic,
7105 	},
7106 	[ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO] = {
7107 		.type = HDA_FIXUP_PINS,
7108 		.v.pins = (const struct hda_pintbl[]) {
7109 			{ 0x18, 0x03a19020 }, /* headset mic */
7110 			{ 0x1b, 0x90170150 }, /* speaker */
7111 			{ }
7112 		},
7113 	},
7114 	[ALC269_FIXUP_AMIC] = {
7115 		.type = HDA_FIXUP_PINS,
7116 		.v.pins = (const struct hda_pintbl[]) {
7117 			{ 0x14, 0x99130110 }, /* speaker */
7118 			{ 0x15, 0x0121401f }, /* HP out */
7119 			{ 0x18, 0x01a19c20 }, /* mic */
7120 			{ 0x19, 0x99a3092f }, /* int-mic */
7121 			{ }
7122 		},
7123 	},
7124 	[ALC269_FIXUP_DMIC] = {
7125 		.type = HDA_FIXUP_PINS,
7126 		.v.pins = (const struct hda_pintbl[]) {
7127 			{ 0x12, 0x99a3092f }, /* int-mic */
7128 			{ 0x14, 0x99130110 }, /* speaker */
7129 			{ 0x15, 0x0121401f }, /* HP out */
7130 			{ 0x18, 0x01a19c20 }, /* mic */
7131 			{ }
7132 		},
7133 	},
7134 	[ALC269VB_FIXUP_AMIC] = {
7135 		.type = HDA_FIXUP_PINS,
7136 		.v.pins = (const struct hda_pintbl[]) {
7137 			{ 0x14, 0x99130110 }, /* speaker */
7138 			{ 0x18, 0x01a19c20 }, /* mic */
7139 			{ 0x19, 0x99a3092f }, /* int-mic */
7140 			{ 0x21, 0x0121401f }, /* HP out */
7141 			{ }
7142 		},
7143 	},
7144 	[ALC269VB_FIXUP_DMIC] = {
7145 		.type = HDA_FIXUP_PINS,
7146 		.v.pins = (const struct hda_pintbl[]) {
7147 			{ 0x12, 0x99a3092f }, /* int-mic */
7148 			{ 0x14, 0x99130110 }, /* speaker */
7149 			{ 0x18, 0x01a19c20 }, /* mic */
7150 			{ 0x21, 0x0121401f }, /* HP out */
7151 			{ }
7152 		},
7153 	},
7154 	[ALC269_FIXUP_HP_MUTE_LED] = {
7155 		.type = HDA_FIXUP_FUNC,
7156 		.v.func = alc269_fixup_hp_mute_led,
7157 	},
7158 	[ALC269_FIXUP_HP_MUTE_LED_MIC1] = {
7159 		.type = HDA_FIXUP_FUNC,
7160 		.v.func = alc269_fixup_hp_mute_led_mic1,
7161 	},
7162 	[ALC269_FIXUP_HP_MUTE_LED_MIC2] = {
7163 		.type = HDA_FIXUP_FUNC,
7164 		.v.func = alc269_fixup_hp_mute_led_mic2,
7165 	},
7166 	[ALC269_FIXUP_HP_MUTE_LED_MIC3] = {
7167 		.type = HDA_FIXUP_FUNC,
7168 		.v.func = alc269_fixup_hp_mute_led_mic3,
7169 		.chained = true,
7170 		.chain_id = ALC295_FIXUP_HP_AUTO_MUTE
7171 	},
7172 	[ALC269_FIXUP_HP_GPIO_LED] = {
7173 		.type = HDA_FIXUP_FUNC,
7174 		.v.func = alc269_fixup_hp_gpio_led,
7175 	},
7176 	[ALC269_FIXUP_HP_GPIO_MIC1_LED] = {
7177 		.type = HDA_FIXUP_FUNC,
7178 		.v.func = alc269_fixup_hp_gpio_mic1_led,
7179 	},
7180 	[ALC269_FIXUP_HP_LINE1_MIC1_LED] = {
7181 		.type = HDA_FIXUP_FUNC,
7182 		.v.func = alc269_fixup_hp_line1_mic1_led,
7183 	},
7184 	[ALC269_FIXUP_INV_DMIC] = {
7185 		.type = HDA_FIXUP_FUNC,
7186 		.v.func = alc_fixup_inv_dmic,
7187 	},
7188 	[ALC269_FIXUP_NO_SHUTUP] = {
7189 		.type = HDA_FIXUP_FUNC,
7190 		.v.func = alc_fixup_no_shutup,
7191 	},
7192 	[ALC269_FIXUP_LENOVO_DOCK] = {
7193 		.type = HDA_FIXUP_PINS,
7194 		.v.pins = (const struct hda_pintbl[]) {
7195 			{ 0x19, 0x23a11040 }, /* dock mic */
7196 			{ 0x1b, 0x2121103f }, /* dock headphone */
7197 			{ }
7198 		},
7199 		.chained = true,
7200 		.chain_id = ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT
7201 	},
7202 	[ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST] = {
7203 		.type = HDA_FIXUP_FUNC,
7204 		.v.func = alc269_fixup_limit_int_mic_boost,
7205 		.chained = true,
7206 		.chain_id = ALC269_FIXUP_LENOVO_DOCK,
7207 	},
7208 	[ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT] = {
7209 		.type = HDA_FIXUP_FUNC,
7210 		.v.func = alc269_fixup_pincfg_no_hp_to_lineout,
7211 		.chained = true,
7212 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
7213 	},
7214 	[ALC269_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7215 		.type = HDA_FIXUP_PINS,
7216 		.v.pins = (const struct hda_pintbl[]) {
7217 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7218 			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7219 			{ }
7220 		},
7221 		.chained = true,
7222 		.chain_id = ALC269_FIXUP_HEADSET_MODE
7223 	},
7224 	[ALC269_FIXUP_DELL2_MIC_NO_PRESENCE] = {
7225 		.type = HDA_FIXUP_PINS,
7226 		.v.pins = (const struct hda_pintbl[]) {
7227 			{ 0x16, 0x21014020 }, /* dock line out */
7228 			{ 0x19, 0x21a19030 }, /* dock mic */
7229 			{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7230 			{ }
7231 		},
7232 		.chained = true,
7233 		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7234 	},
7235 	[ALC269_FIXUP_DELL3_MIC_NO_PRESENCE] = {
7236 		.type = HDA_FIXUP_PINS,
7237 		.v.pins = (const struct hda_pintbl[]) {
7238 			{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7239 			{ }
7240 		},
7241 		.chained = true,
7242 		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7243 	},
7244 	[ALC269_FIXUP_DELL4_MIC_NO_PRESENCE] = {
7245 		.type = HDA_FIXUP_PINS,
7246 		.v.pins = (const struct hda_pintbl[]) {
7247 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7248 			{ 0x1b, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7249 			{ }
7250 		},
7251 		.chained = true,
7252 		.chain_id = ALC269_FIXUP_HEADSET_MODE
7253 	},
7254 	[ALC269_FIXUP_HEADSET_MODE] = {
7255 		.type = HDA_FIXUP_FUNC,
7256 		.v.func = alc_fixup_headset_mode,
7257 		.chained = true,
7258 		.chain_id = ALC255_FIXUP_MIC_MUTE_LED
7259 	},
7260 	[ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
7261 		.type = HDA_FIXUP_FUNC,
7262 		.v.func = alc_fixup_headset_mode_no_hp_mic,
7263 	},
7264 	[ALC269_FIXUP_ASPIRE_HEADSET_MIC] = {
7265 		.type = HDA_FIXUP_PINS,
7266 		.v.pins = (const struct hda_pintbl[]) {
7267 			{ 0x19, 0x01a1913c }, /* headset mic w/o jack detect */
7268 			{ }
7269 		},
7270 		.chained = true,
7271 		.chain_id = ALC269_FIXUP_HEADSET_MODE,
7272 	},
7273 	[ALC286_FIXUP_SONY_MIC_NO_PRESENCE] = {
7274 		.type = HDA_FIXUP_PINS,
7275 		.v.pins = (const struct hda_pintbl[]) {
7276 			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7277 			{ }
7278 		},
7279 		.chained = true,
7280 		.chain_id = ALC269_FIXUP_HEADSET_MIC
7281 	},
7282 	[ALC256_FIXUP_HUAWEI_MACH_WX9_PINS] = {
7283 		.type = HDA_FIXUP_PINS,
7284 		.v.pins = (const struct hda_pintbl[]) {
7285 			{0x12, 0x90a60130},
7286 			{0x13, 0x40000000},
7287 			{0x14, 0x90170110},
7288 			{0x18, 0x411111f0},
7289 			{0x19, 0x04a11040},
7290 			{0x1a, 0x411111f0},
7291 			{0x1b, 0x90170112},
7292 			{0x1d, 0x40759a05},
7293 			{0x1e, 0x411111f0},
7294 			{0x21, 0x04211020},
7295 			{ }
7296 		},
7297 		.chained = true,
7298 		.chain_id = ALC255_FIXUP_MIC_MUTE_LED
7299 	},
7300 	[ALC298_FIXUP_HUAWEI_MBX_STEREO] = {
7301 		.type = HDA_FIXUP_FUNC,
7302 		.v.func = alc298_fixup_huawei_mbx_stereo,
7303 		.chained = true,
7304 		.chain_id = ALC255_FIXUP_MIC_MUTE_LED
7305 	},
7306 	[ALC269_FIXUP_ASUS_X101_FUNC] = {
7307 		.type = HDA_FIXUP_FUNC,
7308 		.v.func = alc269_fixup_x101_headset_mic,
7309 	},
7310 	[ALC269_FIXUP_ASUS_X101_VERB] = {
7311 		.type = HDA_FIXUP_VERBS,
7312 		.v.verbs = (const struct hda_verb[]) {
7313 			{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
7314 			{0x20, AC_VERB_SET_COEF_INDEX, 0x08},
7315 			{0x20, AC_VERB_SET_PROC_COEF,  0x0310},
7316 			{ }
7317 		},
7318 		.chained = true,
7319 		.chain_id = ALC269_FIXUP_ASUS_X101_FUNC
7320 	},
7321 	[ALC269_FIXUP_ASUS_X101] = {
7322 		.type = HDA_FIXUP_PINS,
7323 		.v.pins = (const struct hda_pintbl[]) {
7324 			{ 0x18, 0x04a1182c }, /* Headset mic */
7325 			{ }
7326 		},
7327 		.chained = true,
7328 		.chain_id = ALC269_FIXUP_ASUS_X101_VERB
7329 	},
7330 	[ALC271_FIXUP_AMIC_MIC2] = {
7331 		.type = HDA_FIXUP_PINS,
7332 		.v.pins = (const struct hda_pintbl[]) {
7333 			{ 0x14, 0x99130110 }, /* speaker */
7334 			{ 0x19, 0x01a19c20 }, /* mic */
7335 			{ 0x1b, 0x99a7012f }, /* int-mic */
7336 			{ 0x21, 0x0121401f }, /* HP out */
7337 			{ }
7338 		},
7339 	},
7340 	[ALC271_FIXUP_HP_GATE_MIC_JACK] = {
7341 		.type = HDA_FIXUP_FUNC,
7342 		.v.func = alc271_hp_gate_mic_jack,
7343 		.chained = true,
7344 		.chain_id = ALC271_FIXUP_AMIC_MIC2,
7345 	},
7346 	[ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572] = {
7347 		.type = HDA_FIXUP_FUNC,
7348 		.v.func = alc269_fixup_limit_int_mic_boost,
7349 		.chained = true,
7350 		.chain_id = ALC271_FIXUP_HP_GATE_MIC_JACK,
7351 	},
7352 	[ALC269_FIXUP_ACER_AC700] = {
7353 		.type = HDA_FIXUP_PINS,
7354 		.v.pins = (const struct hda_pintbl[]) {
7355 			{ 0x12, 0x99a3092f }, /* int-mic */
7356 			{ 0x14, 0x99130110 }, /* speaker */
7357 			{ 0x18, 0x03a11c20 }, /* mic */
7358 			{ 0x1e, 0x0346101e }, /* SPDIF1 */
7359 			{ 0x21, 0x0321101f }, /* HP out */
7360 			{ }
7361 		},
7362 		.chained = true,
7363 		.chain_id = ALC271_FIXUP_DMIC,
7364 	},
7365 	[ALC269_FIXUP_LIMIT_INT_MIC_BOOST] = {
7366 		.type = HDA_FIXUP_FUNC,
7367 		.v.func = alc269_fixup_limit_int_mic_boost,
7368 		.chained = true,
7369 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
7370 	},
7371 	[ALC269VB_FIXUP_ASUS_ZENBOOK] = {
7372 		.type = HDA_FIXUP_FUNC,
7373 		.v.func = alc269_fixup_limit_int_mic_boost,
7374 		.chained = true,
7375 		.chain_id = ALC269VB_FIXUP_DMIC,
7376 	},
7377 	[ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A] = {
7378 		.type = HDA_FIXUP_VERBS,
7379 		.v.verbs = (const struct hda_verb[]) {
7380 			/* class-D output amp +5dB */
7381 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x12 },
7382 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2800 },
7383 			{}
7384 		},
7385 		.chained = true,
7386 		.chain_id = ALC269VB_FIXUP_ASUS_ZENBOOK,
7387 	},
7388 	[ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7389 		.type = HDA_FIXUP_PINS,
7390 		.v.pins = (const struct hda_pintbl[]) {
7391 			{ 0x18, 0x01a110f0 },  /* use as headset mic */
7392 			{ }
7393 		},
7394 		.chained = true,
7395 		.chain_id = ALC269_FIXUP_HEADSET_MIC
7396 	},
7397 	[ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED] = {
7398 		.type = HDA_FIXUP_FUNC,
7399 		.v.func = alc269_fixup_limit_int_mic_boost,
7400 		.chained = true,
7401 		.chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC1,
7402 	},
7403 	[ALC269VB_FIXUP_ORDISSIMO_EVE2] = {
7404 		.type = HDA_FIXUP_PINS,
7405 		.v.pins = (const struct hda_pintbl[]) {
7406 			{ 0x12, 0x99a3092f }, /* int-mic */
7407 			{ 0x18, 0x03a11d20 }, /* mic */
7408 			{ 0x19, 0x411111f0 }, /* Unused bogus pin */
7409 			{ }
7410 		},
7411 	},
7412 	[ALC283_FIXUP_CHROME_BOOK] = {
7413 		.type = HDA_FIXUP_FUNC,
7414 		.v.func = alc283_fixup_chromebook,
7415 	},
7416 	[ALC283_FIXUP_SENSE_COMBO_JACK] = {
7417 		.type = HDA_FIXUP_FUNC,
7418 		.v.func = alc283_fixup_sense_combo_jack,
7419 		.chained = true,
7420 		.chain_id = ALC283_FIXUP_CHROME_BOOK,
7421 	},
7422 	[ALC282_FIXUP_ASUS_TX300] = {
7423 		.type = HDA_FIXUP_FUNC,
7424 		.v.func = alc282_fixup_asus_tx300,
7425 	},
7426 	[ALC283_FIXUP_INT_MIC] = {
7427 		.type = HDA_FIXUP_VERBS,
7428 		.v.verbs = (const struct hda_verb[]) {
7429 			{0x20, AC_VERB_SET_COEF_INDEX, 0x1a},
7430 			{0x20, AC_VERB_SET_PROC_COEF, 0x0011},
7431 			{ }
7432 		},
7433 		.chained = true,
7434 		.chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
7435 	},
7436 	[ALC290_FIXUP_SUBWOOFER_HSJACK] = {
7437 		.type = HDA_FIXUP_PINS,
7438 		.v.pins = (const struct hda_pintbl[]) {
7439 			{ 0x17, 0x90170112 }, /* subwoofer */
7440 			{ }
7441 		},
7442 		.chained = true,
7443 		.chain_id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
7444 	},
7445 	[ALC290_FIXUP_SUBWOOFER] = {
7446 		.type = HDA_FIXUP_PINS,
7447 		.v.pins = (const struct hda_pintbl[]) {
7448 			{ 0x17, 0x90170112 }, /* subwoofer */
7449 			{ }
7450 		},
7451 		.chained = true,
7452 		.chain_id = ALC290_FIXUP_MONO_SPEAKERS,
7453 	},
7454 	[ALC290_FIXUP_MONO_SPEAKERS] = {
7455 		.type = HDA_FIXUP_FUNC,
7456 		.v.func = alc290_fixup_mono_speakers,
7457 	},
7458 	[ALC290_FIXUP_MONO_SPEAKERS_HSJACK] = {
7459 		.type = HDA_FIXUP_FUNC,
7460 		.v.func = alc290_fixup_mono_speakers,
7461 		.chained = true,
7462 		.chain_id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
7463 	},
7464 	[ALC269_FIXUP_THINKPAD_ACPI] = {
7465 		.type = HDA_FIXUP_FUNC,
7466 		.v.func = alc_fixup_thinkpad_acpi,
7467 		.chained = true,
7468 		.chain_id = ALC269_FIXUP_SKU_IGNORE,
7469 	},
7470 	[ALC269_FIXUP_DMIC_THINKPAD_ACPI] = {
7471 		.type = HDA_FIXUP_FUNC,
7472 		.v.func = alc_fixup_inv_dmic,
7473 		.chained = true,
7474 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
7475 	},
7476 	[ALC255_FIXUP_ACER_MIC_NO_PRESENCE] = {
7477 		.type = HDA_FIXUP_PINS,
7478 		.v.pins = (const struct hda_pintbl[]) {
7479 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7480 			{ }
7481 		},
7482 		.chained = true,
7483 		.chain_id = ALC255_FIXUP_HEADSET_MODE
7484 	},
7485 	[ALC255_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7486 		.type = HDA_FIXUP_PINS,
7487 		.v.pins = (const struct hda_pintbl[]) {
7488 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7489 			{ }
7490 		},
7491 		.chained = true,
7492 		.chain_id = ALC255_FIXUP_HEADSET_MODE
7493 	},
7494 	[ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7495 		.type = HDA_FIXUP_PINS,
7496 		.v.pins = (const struct hda_pintbl[]) {
7497 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7498 			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7499 			{ }
7500 		},
7501 		.chained = true,
7502 		.chain_id = ALC255_FIXUP_HEADSET_MODE
7503 	},
7504 	[ALC255_FIXUP_DELL2_MIC_NO_PRESENCE] = {
7505 		.type = HDA_FIXUP_PINS,
7506 		.v.pins = (const struct hda_pintbl[]) {
7507 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7508 			{ }
7509 		},
7510 		.chained = true,
7511 		.chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
7512 	},
7513 	[ALC255_FIXUP_HEADSET_MODE] = {
7514 		.type = HDA_FIXUP_FUNC,
7515 		.v.func = alc_fixup_headset_mode_alc255,
7516 		.chained = true,
7517 		.chain_id = ALC255_FIXUP_MIC_MUTE_LED
7518 	},
7519 	[ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
7520 		.type = HDA_FIXUP_FUNC,
7521 		.v.func = alc_fixup_headset_mode_alc255_no_hp_mic,
7522 	},
7523 	[ALC293_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7524 		.type = HDA_FIXUP_PINS,
7525 		.v.pins = (const struct hda_pintbl[]) {
7526 			{ 0x18, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7527 			{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7528 			{ }
7529 		},
7530 		.chained = true,
7531 		.chain_id = ALC269_FIXUP_HEADSET_MODE
7532 	},
7533 	[ALC292_FIXUP_TPT440_DOCK] = {
7534 		.type = HDA_FIXUP_FUNC,
7535 		.v.func = alc_fixup_tpt440_dock,
7536 		.chained = true,
7537 		.chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
7538 	},
7539 	[ALC292_FIXUP_TPT440] = {
7540 		.type = HDA_FIXUP_FUNC,
7541 		.v.func = alc_fixup_disable_aamix,
7542 		.chained = true,
7543 		.chain_id = ALC292_FIXUP_TPT440_DOCK,
7544 	},
7545 	[ALC283_FIXUP_HEADSET_MIC] = {
7546 		.type = HDA_FIXUP_PINS,
7547 		.v.pins = (const struct hda_pintbl[]) {
7548 			{ 0x19, 0x04a110f0 },
7549 			{ },
7550 		},
7551 	},
7552 	[ALC255_FIXUP_MIC_MUTE_LED] = {
7553 		.type = HDA_FIXUP_FUNC,
7554 		.v.func = alc_fixup_micmute_led,
7555 	},
7556 	[ALC282_FIXUP_ASPIRE_V5_PINS] = {
7557 		.type = HDA_FIXUP_PINS,
7558 		.v.pins = (const struct hda_pintbl[]) {
7559 			{ 0x12, 0x90a60130 },
7560 			{ 0x14, 0x90170110 },
7561 			{ 0x17, 0x40000008 },
7562 			{ 0x18, 0x411111f0 },
7563 			{ 0x19, 0x01a1913c },
7564 			{ 0x1a, 0x411111f0 },
7565 			{ 0x1b, 0x411111f0 },
7566 			{ 0x1d, 0x40f89b2d },
7567 			{ 0x1e, 0x411111f0 },
7568 			{ 0x21, 0x0321101f },
7569 			{ },
7570 		},
7571 	},
7572 	[ALC269VB_FIXUP_ASPIRE_E1_COEF] = {
7573 		.type = HDA_FIXUP_FUNC,
7574 		.v.func = alc269vb_fixup_aspire_e1_coef,
7575 	},
7576 	[ALC280_FIXUP_HP_GPIO4] = {
7577 		.type = HDA_FIXUP_FUNC,
7578 		.v.func = alc280_fixup_hp_gpio4,
7579 	},
7580 	[ALC286_FIXUP_HP_GPIO_LED] = {
7581 		.type = HDA_FIXUP_FUNC,
7582 		.v.func = alc286_fixup_hp_gpio_led,
7583 	},
7584 	[ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY] = {
7585 		.type = HDA_FIXUP_FUNC,
7586 		.v.func = alc280_fixup_hp_gpio2_mic_hotkey,
7587 	},
7588 	[ALC280_FIXUP_HP_DOCK_PINS] = {
7589 		.type = HDA_FIXUP_PINS,
7590 		.v.pins = (const struct hda_pintbl[]) {
7591 			{ 0x1b, 0x21011020 }, /* line-out */
7592 			{ 0x1a, 0x01a1903c }, /* headset mic */
7593 			{ 0x18, 0x2181103f }, /* line-in */
7594 			{ },
7595 		},
7596 		.chained = true,
7597 		.chain_id = ALC280_FIXUP_HP_GPIO4
7598 	},
7599 	[ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED] = {
7600 		.type = HDA_FIXUP_PINS,
7601 		.v.pins = (const struct hda_pintbl[]) {
7602 			{ 0x1b, 0x21011020 }, /* line-out */
7603 			{ 0x18, 0x2181103f }, /* line-in */
7604 			{ },
7605 		},
7606 		.chained = true,
7607 		.chain_id = ALC269_FIXUP_HP_GPIO_MIC1_LED
7608 	},
7609 	[ALC280_FIXUP_HP_9480M] = {
7610 		.type = HDA_FIXUP_FUNC,
7611 		.v.func = alc280_fixup_hp_9480m,
7612 	},
7613 	[ALC245_FIXUP_HP_X360_AMP] = {
7614 		.type = HDA_FIXUP_FUNC,
7615 		.v.func = alc245_fixup_hp_x360_amp,
7616 		.chained = true,
7617 		.chain_id = ALC245_FIXUP_HP_GPIO_LED
7618 	},
7619 	[ALC288_FIXUP_DELL_HEADSET_MODE] = {
7620 		.type = HDA_FIXUP_FUNC,
7621 		.v.func = alc_fixup_headset_mode_dell_alc288,
7622 		.chained = true,
7623 		.chain_id = ALC255_FIXUP_MIC_MUTE_LED
7624 	},
7625 	[ALC288_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7626 		.type = HDA_FIXUP_PINS,
7627 		.v.pins = (const struct hda_pintbl[]) {
7628 			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7629 			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7630 			{ }
7631 		},
7632 		.chained = true,
7633 		.chain_id = ALC288_FIXUP_DELL_HEADSET_MODE
7634 	},
7635 	[ALC288_FIXUP_DISABLE_AAMIX] = {
7636 		.type = HDA_FIXUP_FUNC,
7637 		.v.func = alc_fixup_disable_aamix,
7638 		.chained = true,
7639 		.chain_id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE
7640 	},
7641 	[ALC288_FIXUP_DELL_XPS_13] = {
7642 		.type = HDA_FIXUP_FUNC,
7643 		.v.func = alc_fixup_dell_xps13,
7644 		.chained = true,
7645 		.chain_id = ALC288_FIXUP_DISABLE_AAMIX
7646 	},
7647 	[ALC292_FIXUP_DISABLE_AAMIX] = {
7648 		.type = HDA_FIXUP_FUNC,
7649 		.v.func = alc_fixup_disable_aamix,
7650 		.chained = true,
7651 		.chain_id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE
7652 	},
7653 	[ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK] = {
7654 		.type = HDA_FIXUP_FUNC,
7655 		.v.func = alc_fixup_disable_aamix,
7656 		.chained = true,
7657 		.chain_id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE
7658 	},
7659 	[ALC292_FIXUP_DELL_E7X_AAMIX] = {
7660 		.type = HDA_FIXUP_FUNC,
7661 		.v.func = alc_fixup_dell_xps13,
7662 		.chained = true,
7663 		.chain_id = ALC292_FIXUP_DISABLE_AAMIX
7664 	},
7665 	[ALC292_FIXUP_DELL_E7X] = {
7666 		.type = HDA_FIXUP_FUNC,
7667 		.v.func = alc_fixup_micmute_led,
7668 		/* micmute fixup must be applied at last */
7669 		.chained_before = true,
7670 		.chain_id = ALC292_FIXUP_DELL_E7X_AAMIX,
7671 	},
7672 	[ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE] = {
7673 		.type = HDA_FIXUP_PINS,
7674 		.v.pins = (const struct hda_pintbl[]) {
7675 			{ 0x18, 0x01a1913c }, /* headset mic w/o jack detect */
7676 			{ }
7677 		},
7678 		.chained_before = true,
7679 		.chain_id = ALC269_FIXUP_HEADSET_MODE,
7680 	},
7681 	[ALC298_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7682 		.type = HDA_FIXUP_PINS,
7683 		.v.pins = (const struct hda_pintbl[]) {
7684 			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7685 			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7686 			{ }
7687 		},
7688 		.chained = true,
7689 		.chain_id = ALC269_FIXUP_HEADSET_MODE
7690 	},
7691 	[ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE] = {
7692 		.type = HDA_FIXUP_PINS,
7693 		.v.pins = (const struct hda_pintbl[]) {
7694 			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7695 			{ }
7696 		},
7697 		.chained = true,
7698 		.chain_id = ALC269_FIXUP_HEADSET_MODE
7699 	},
7700 	[ALC275_FIXUP_DELL_XPS] = {
7701 		.type = HDA_FIXUP_VERBS,
7702 		.v.verbs = (const struct hda_verb[]) {
7703 			/* Enables internal speaker */
7704 			{0x20, AC_VERB_SET_COEF_INDEX, 0x1f},
7705 			{0x20, AC_VERB_SET_PROC_COEF, 0x00c0},
7706 			{0x20, AC_VERB_SET_COEF_INDEX, 0x30},
7707 			{0x20, AC_VERB_SET_PROC_COEF, 0x00b1},
7708 			{}
7709 		}
7710 	},
7711 	[ALC293_FIXUP_LENOVO_SPK_NOISE] = {
7712 		.type = HDA_FIXUP_FUNC,
7713 		.v.func = alc_fixup_disable_aamix,
7714 		.chained = true,
7715 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI
7716 	},
7717 	[ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY] = {
7718 		.type = HDA_FIXUP_FUNC,
7719 		.v.func = alc233_fixup_lenovo_line2_mic_hotkey,
7720 	},
7721 	[ALC233_FIXUP_INTEL_NUC8_DMIC] = {
7722 		.type = HDA_FIXUP_FUNC,
7723 		.v.func = alc_fixup_inv_dmic,
7724 		.chained = true,
7725 		.chain_id = ALC233_FIXUP_INTEL_NUC8_BOOST,
7726 	},
7727 	[ALC233_FIXUP_INTEL_NUC8_BOOST] = {
7728 		.type = HDA_FIXUP_FUNC,
7729 		.v.func = alc269_fixup_limit_int_mic_boost
7730 	},
7731 	[ALC255_FIXUP_DELL_SPK_NOISE] = {
7732 		.type = HDA_FIXUP_FUNC,
7733 		.v.func = alc_fixup_disable_aamix,
7734 		.chained = true,
7735 		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
7736 	},
7737 	[ALC225_FIXUP_DISABLE_MIC_VREF] = {
7738 		.type = HDA_FIXUP_FUNC,
7739 		.v.func = alc_fixup_disable_mic_vref,
7740 		.chained = true,
7741 		.chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
7742 	},
7743 	[ALC225_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7744 		.type = HDA_FIXUP_VERBS,
7745 		.v.verbs = (const struct hda_verb[]) {
7746 			/* Disable pass-through path for FRONT 14h */
7747 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
7748 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
7749 			{}
7750 		},
7751 		.chained = true,
7752 		.chain_id = ALC225_FIXUP_DISABLE_MIC_VREF
7753 	},
7754 	[ALC280_FIXUP_HP_HEADSET_MIC] = {
7755 		.type = HDA_FIXUP_FUNC,
7756 		.v.func = alc_fixup_disable_aamix,
7757 		.chained = true,
7758 		.chain_id = ALC269_FIXUP_HEADSET_MIC,
7759 	},
7760 	[ALC221_FIXUP_HP_FRONT_MIC] = {
7761 		.type = HDA_FIXUP_PINS,
7762 		.v.pins = (const struct hda_pintbl[]) {
7763 			{ 0x19, 0x02a19020 }, /* Front Mic */
7764 			{ }
7765 		},
7766 	},
7767 	[ALC292_FIXUP_TPT460] = {
7768 		.type = HDA_FIXUP_FUNC,
7769 		.v.func = alc_fixup_tpt440_dock,
7770 		.chained = true,
7771 		.chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE,
7772 	},
7773 	[ALC298_FIXUP_SPK_VOLUME] = {
7774 		.type = HDA_FIXUP_FUNC,
7775 		.v.func = alc298_fixup_speaker_volume,
7776 		.chained = true,
7777 		.chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
7778 	},
7779 	[ALC298_FIXUP_LENOVO_SPK_VOLUME] = {
7780 		.type = HDA_FIXUP_FUNC,
7781 		.v.func = alc298_fixup_speaker_volume,
7782 	},
7783 	[ALC295_FIXUP_DISABLE_DAC3] = {
7784 		.type = HDA_FIXUP_FUNC,
7785 		.v.func = alc295_fixup_disable_dac3,
7786 	},
7787 	[ALC285_FIXUP_SPEAKER2_TO_DAC1] = {
7788 		.type = HDA_FIXUP_FUNC,
7789 		.v.func = alc285_fixup_speaker2_to_dac1,
7790 		.chained = true,
7791 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI
7792 	},
7793 	[ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {
7794 		.type = HDA_FIXUP_PINS,
7795 		.v.pins = (const struct hda_pintbl[]) {
7796 			{ 0x1b, 0x90170151 },
7797 			{ }
7798 		},
7799 		.chained = true,
7800 		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
7801 	},
7802 	[ALC269_FIXUP_ATIV_BOOK_8] = {
7803 		.type = HDA_FIXUP_FUNC,
7804 		.v.func = alc_fixup_auto_mute_via_amp,
7805 		.chained = true,
7806 		.chain_id = ALC269_FIXUP_NO_SHUTUP
7807 	},
7808 	[ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE] = {
7809 		.type = HDA_FIXUP_PINS,
7810 		.v.pins = (const struct hda_pintbl[]) {
7811 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7812 			{ 0x1a, 0x01813030 }, /* use as headphone mic, without its own jack detect */
7813 			{ }
7814 		},
7815 		.chained = true,
7816 		.chain_id = ALC269_FIXUP_HEADSET_MODE
7817 	},
7818 	[ALC221_FIXUP_HP_MIC_NO_PRESENCE] = {
7819 		.type = HDA_FIXUP_PINS,
7820 		.v.pins = (const struct hda_pintbl[]) {
7821 			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7822 			{ 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7823 			{ }
7824 		},
7825 		.chained = true,
7826 		.chain_id = ALC269_FIXUP_HEADSET_MODE
7827 	},
7828 	[ALC256_FIXUP_ASUS_HEADSET_MODE] = {
7829 		.type = HDA_FIXUP_FUNC,
7830 		.v.func = alc_fixup_headset_mode,
7831 	},
7832 	[ALC256_FIXUP_ASUS_MIC] = {
7833 		.type = HDA_FIXUP_PINS,
7834 		.v.pins = (const struct hda_pintbl[]) {
7835 			{ 0x13, 0x90a60160 }, /* use as internal mic */
7836 			{ 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
7837 			{ }
7838 		},
7839 		.chained = true,
7840 		.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7841 	},
7842 	[ALC256_FIXUP_ASUS_AIO_GPIO2] = {
7843 		.type = HDA_FIXUP_FUNC,
7844 		/* Set up GPIO2 for the speaker amp */
7845 		.v.func = alc_fixup_gpio4,
7846 	},
7847 	[ALC233_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7848 		.type = HDA_FIXUP_PINS,
7849 		.v.pins = (const struct hda_pintbl[]) {
7850 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7851 			{ }
7852 		},
7853 		.chained = true,
7854 		.chain_id = ALC269_FIXUP_HEADSET_MIC
7855 	},
7856 	[ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE] = {
7857 		.type = HDA_FIXUP_VERBS,
7858 		.v.verbs = (const struct hda_verb[]) {
7859 			/* Enables internal speaker */
7860 			{0x20, AC_VERB_SET_COEF_INDEX, 0x40},
7861 			{0x20, AC_VERB_SET_PROC_COEF, 0x8800},
7862 			{}
7863 		},
7864 		.chained = true,
7865 		.chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
7866 	},
7867 	[ALC233_FIXUP_LENOVO_MULTI_CODECS] = {
7868 		.type = HDA_FIXUP_FUNC,
7869 		.v.func = alc233_alc662_fixup_lenovo_dual_codecs,
7870 		.chained = true,
7871 		.chain_id = ALC269_FIXUP_GPIO2
7872 	},
7873 	[ALC233_FIXUP_ACER_HEADSET_MIC] = {
7874 		.type = HDA_FIXUP_VERBS,
7875 		.v.verbs = (const struct hda_verb[]) {
7876 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
7877 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
7878 			{ }
7879 		},
7880 		.chained = true,
7881 		.chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
7882 	},
7883 	[ALC294_FIXUP_LENOVO_MIC_LOCATION] = {
7884 		.type = HDA_FIXUP_PINS,
7885 		.v.pins = (const struct hda_pintbl[]) {
7886 			/* Change the mic location from front to right, otherwise there are
7887 			   two front mics with the same name, pulseaudio can't handle them.
7888 			   This is just a temporary workaround, after applying this fixup,
7889 			   there will be one "Front Mic" and one "Mic" in this machine.
7890 			 */
7891 			{ 0x1a, 0x04a19040 },
7892 			{ }
7893 		},
7894 	},
7895 	[ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE] = {
7896 		.type = HDA_FIXUP_PINS,
7897 		.v.pins = (const struct hda_pintbl[]) {
7898 			{ 0x16, 0x0101102f }, /* Rear Headset HP */
7899 			{ 0x19, 0x02a1913c }, /* use as Front headset mic, without its own jack detect */
7900 			{ 0x1a, 0x01a19030 }, /* Rear Headset MIC */
7901 			{ 0x1b, 0x02011020 },
7902 			{ }
7903 		},
7904 		.chained = true,
7905 		.chain_id = ALC225_FIXUP_S3_POP_NOISE
7906 	},
7907 	[ALC225_FIXUP_S3_POP_NOISE] = {
7908 		.type = HDA_FIXUP_FUNC,
7909 		.v.func = alc225_fixup_s3_pop_noise,
7910 		.chained = true,
7911 		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7912 	},
7913 	[ALC700_FIXUP_INTEL_REFERENCE] = {
7914 		.type = HDA_FIXUP_VERBS,
7915 		.v.verbs = (const struct hda_verb[]) {
7916 			/* Enables internal speaker */
7917 			{0x20, AC_VERB_SET_COEF_INDEX, 0x45},
7918 			{0x20, AC_VERB_SET_PROC_COEF, 0x5289},
7919 			{0x20, AC_VERB_SET_COEF_INDEX, 0x4A},
7920 			{0x20, AC_VERB_SET_PROC_COEF, 0x001b},
7921 			{0x58, AC_VERB_SET_COEF_INDEX, 0x00},
7922 			{0x58, AC_VERB_SET_PROC_COEF, 0x3888},
7923 			{0x20, AC_VERB_SET_COEF_INDEX, 0x6f},
7924 			{0x20, AC_VERB_SET_PROC_COEF, 0x2c0b},
7925 			{}
7926 		}
7927 	},
7928 	[ALC274_FIXUP_DELL_BIND_DACS] = {
7929 		.type = HDA_FIXUP_FUNC,
7930 		.v.func = alc274_fixup_bind_dacs,
7931 		.chained = true,
7932 		.chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
7933 	},
7934 	[ALC274_FIXUP_DELL_AIO_LINEOUT_VERB] = {
7935 		.type = HDA_FIXUP_PINS,
7936 		.v.pins = (const struct hda_pintbl[]) {
7937 			{ 0x1b, 0x0401102f },
7938 			{ }
7939 		},
7940 		.chained = true,
7941 		.chain_id = ALC274_FIXUP_DELL_BIND_DACS
7942 	},
7943 	[ALC298_FIXUP_TPT470_DOCK_FIX] = {
7944 		.type = HDA_FIXUP_FUNC,
7945 		.v.func = alc_fixup_tpt470_dock,
7946 		.chained = true,
7947 		.chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE
7948 	},
7949 	[ALC298_FIXUP_TPT470_DOCK] = {
7950 		.type = HDA_FIXUP_FUNC,
7951 		.v.func = alc_fixup_tpt470_dacs,
7952 		.chained = true,
7953 		.chain_id = ALC298_FIXUP_TPT470_DOCK_FIX
7954 	},
7955 	[ALC255_FIXUP_DUMMY_LINEOUT_VERB] = {
7956 		.type = HDA_FIXUP_PINS,
7957 		.v.pins = (const struct hda_pintbl[]) {
7958 			{ 0x14, 0x0201101f },
7959 			{ }
7960 		},
7961 		.chained = true,
7962 		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
7963 	},
7964 	[ALC255_FIXUP_DELL_HEADSET_MIC] = {
7965 		.type = HDA_FIXUP_PINS,
7966 		.v.pins = (const struct hda_pintbl[]) {
7967 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7968 			{ }
7969 		},
7970 		.chained = true,
7971 		.chain_id = ALC269_FIXUP_HEADSET_MIC
7972 	},
7973 	[ALC295_FIXUP_HP_X360] = {
7974 		.type = HDA_FIXUP_FUNC,
7975 		.v.func = alc295_fixup_hp_top_speakers,
7976 		.chained = true,
7977 		.chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC3
7978 	},
7979 	[ALC221_FIXUP_HP_HEADSET_MIC] = {
7980 		.type = HDA_FIXUP_PINS,
7981 		.v.pins = (const struct hda_pintbl[]) {
7982 			{ 0x19, 0x0181313f},
7983 			{ }
7984 		},
7985 		.chained = true,
7986 		.chain_id = ALC269_FIXUP_HEADSET_MIC
7987 	},
7988 	[ALC285_FIXUP_LENOVO_HEADPHONE_NOISE] = {
7989 		.type = HDA_FIXUP_FUNC,
7990 		.v.func = alc285_fixup_invalidate_dacs,
7991 		.chained = true,
7992 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI
7993 	},
7994 	[ALC295_FIXUP_HP_AUTO_MUTE] = {
7995 		.type = HDA_FIXUP_FUNC,
7996 		.v.func = alc_fixup_auto_mute_via_amp,
7997 	},
7998 	[ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE] = {
7999 		.type = HDA_FIXUP_PINS,
8000 		.v.pins = (const struct hda_pintbl[]) {
8001 			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8002 			{ }
8003 		},
8004 		.chained = true,
8005 		.chain_id = ALC269_FIXUP_HEADSET_MIC
8006 	},
8007 	[ALC294_FIXUP_ASUS_MIC] = {
8008 		.type = HDA_FIXUP_PINS,
8009 		.v.pins = (const struct hda_pintbl[]) {
8010 			{ 0x13, 0x90a60160 }, /* use as internal mic */
8011 			{ 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
8012 			{ }
8013 		},
8014 		.chained = true,
8015 		.chain_id = ALC269_FIXUP_HEADSET_MIC
8016 	},
8017 	[ALC294_FIXUP_ASUS_HEADSET_MIC] = {
8018 		.type = HDA_FIXUP_PINS,
8019 		.v.pins = (const struct hda_pintbl[]) {
8020 			{ 0x19, 0x01a1103c }, /* use as headset mic */
8021 			{ }
8022 		},
8023 		.chained = true,
8024 		.chain_id = ALC269_FIXUP_HEADSET_MIC
8025 	},
8026 	[ALC294_FIXUP_ASUS_SPK] = {
8027 		.type = HDA_FIXUP_VERBS,
8028 		.v.verbs = (const struct hda_verb[]) {
8029 			/* Set EAPD high */
8030 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x40 },
8031 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x8800 },
8032 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
8033 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
8034 			{ }
8035 		},
8036 		.chained = true,
8037 		.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8038 	},
8039 	[ALC295_FIXUP_CHROME_BOOK] = {
8040 		.type = HDA_FIXUP_FUNC,
8041 		.v.func = alc295_fixup_chromebook,
8042 		.chained = true,
8043 		.chain_id = ALC225_FIXUP_HEADSET_JACK
8044 	},
8045 	[ALC225_FIXUP_HEADSET_JACK] = {
8046 		.type = HDA_FIXUP_FUNC,
8047 		.v.func = alc_fixup_headset_jack,
8048 	},
8049 	[ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
8050 		.type = HDA_FIXUP_PINS,
8051 		.v.pins = (const struct hda_pintbl[]) {
8052 			{ 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8053 			{ }
8054 		},
8055 		.chained = true,
8056 		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8057 	},
8058 	[ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE] = {
8059 		.type = HDA_FIXUP_VERBS,
8060 		.v.verbs = (const struct hda_verb[]) {
8061 			/* Disable PCBEEP-IN passthrough */
8062 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
8063 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
8064 			{ }
8065 		},
8066 		.chained = true,
8067 		.chain_id = ALC285_FIXUP_LENOVO_HEADPHONE_NOISE
8068 	},
8069 	[ALC255_FIXUP_ACER_HEADSET_MIC] = {
8070 		.type = HDA_FIXUP_PINS,
8071 		.v.pins = (const struct hda_pintbl[]) {
8072 			{ 0x19, 0x03a11130 },
8073 			{ 0x1a, 0x90a60140 }, /* use as internal mic */
8074 			{ }
8075 		},
8076 		.chained = true,
8077 		.chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
8078 	},
8079 	[ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE] = {
8080 		.type = HDA_FIXUP_PINS,
8081 		.v.pins = (const struct hda_pintbl[]) {
8082 			{ 0x16, 0x01011020 }, /* Rear Line out */
8083 			{ 0x19, 0x01a1913c }, /* use as Front headset mic, without its own jack detect */
8084 			{ }
8085 		},
8086 		.chained = true,
8087 		.chain_id = ALC225_FIXUP_WYSE_AUTO_MUTE
8088 	},
8089 	[ALC225_FIXUP_WYSE_AUTO_MUTE] = {
8090 		.type = HDA_FIXUP_FUNC,
8091 		.v.func = alc_fixup_auto_mute_via_amp,
8092 		.chained = true,
8093 		.chain_id = ALC225_FIXUP_WYSE_DISABLE_MIC_VREF
8094 	},
8095 	[ALC225_FIXUP_WYSE_DISABLE_MIC_VREF] = {
8096 		.type = HDA_FIXUP_FUNC,
8097 		.v.func = alc_fixup_disable_mic_vref,
8098 		.chained = true,
8099 		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8100 	},
8101 	[ALC286_FIXUP_ACER_AIO_HEADSET_MIC] = {
8102 		.type = HDA_FIXUP_VERBS,
8103 		.v.verbs = (const struct hda_verb[]) {
8104 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x4f },
8105 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x5029 },
8106 			{ }
8107 		},
8108 		.chained = true,
8109 		.chain_id = ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE
8110 	},
8111 	[ALC256_FIXUP_ASUS_HEADSET_MIC] = {
8112 		.type = HDA_FIXUP_PINS,
8113 		.v.pins = (const struct hda_pintbl[]) {
8114 			{ 0x19, 0x03a11020 }, /* headset mic with jack detect */
8115 			{ }
8116 		},
8117 		.chained = true,
8118 		.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8119 	},
8120 	[ALC256_FIXUP_ASUS_MIC_NO_PRESENCE] = {
8121 		.type = HDA_FIXUP_PINS,
8122 		.v.pins = (const struct hda_pintbl[]) {
8123 			{ 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
8124 			{ }
8125 		},
8126 		.chained = true,
8127 		.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8128 	},
8129 	[ALC299_FIXUP_PREDATOR_SPK] = {
8130 		.type = HDA_FIXUP_PINS,
8131 		.v.pins = (const struct hda_pintbl[]) {
8132 			{ 0x21, 0x90170150 }, /* use as headset mic, without its own jack detect */
8133 			{ }
8134 		}
8135 	},
8136 	[ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE] = {
8137 		.type = HDA_FIXUP_PINS,
8138 		.v.pins = (const struct hda_pintbl[]) {
8139 			{ 0x19, 0x04a11040 },
8140 			{ 0x21, 0x04211020 },
8141 			{ }
8142 		},
8143 		.chained = true,
8144 		.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8145 	},
8146 	[ALC289_FIXUP_DELL_SPK2] = {
8147 		.type = HDA_FIXUP_PINS,
8148 		.v.pins = (const struct hda_pintbl[]) {
8149 			{ 0x17, 0x90170130 }, /* bass spk */
8150 			{ }
8151 		},
8152 		.chained = true,
8153 		.chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE
8154 	},
8155 	[ALC289_FIXUP_DUAL_SPK] = {
8156 		.type = HDA_FIXUP_FUNC,
8157 		.v.func = alc285_fixup_speaker2_to_dac1,
8158 		.chained = true,
8159 		.chain_id = ALC289_FIXUP_DELL_SPK2
8160 	},
8161 	[ALC294_FIXUP_SPK2_TO_DAC1] = {
8162 		.type = HDA_FIXUP_FUNC,
8163 		.v.func = alc285_fixup_speaker2_to_dac1,
8164 		.chained = true,
8165 		.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8166 	},
8167 	[ALC294_FIXUP_ASUS_DUAL_SPK] = {
8168 		.type = HDA_FIXUP_FUNC,
8169 		/* The GPIO must be pulled to initialize the AMP */
8170 		.v.func = alc_fixup_gpio4,
8171 		.chained = true,
8172 		.chain_id = ALC294_FIXUP_SPK2_TO_DAC1
8173 	},
8174 	[ALC285_FIXUP_THINKPAD_X1_GEN7] = {
8175 		.type = HDA_FIXUP_FUNC,
8176 		.v.func = alc285_fixup_thinkpad_x1_gen7,
8177 		.chained = true,
8178 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI
8179 	},
8180 	[ALC285_FIXUP_THINKPAD_HEADSET_JACK] = {
8181 		.type = HDA_FIXUP_FUNC,
8182 		.v.func = alc_fixup_headset_jack,
8183 		.chained = true,
8184 		.chain_id = ALC285_FIXUP_THINKPAD_X1_GEN7
8185 	},
8186 	[ALC294_FIXUP_ASUS_HPE] = {
8187 		.type = HDA_FIXUP_VERBS,
8188 		.v.verbs = (const struct hda_verb[]) {
8189 			/* Set EAPD high */
8190 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
8191 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
8192 			{ }
8193 		},
8194 		.chained = true,
8195 		.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8196 	},
8197 	[ALC294_FIXUP_ASUS_GX502_PINS] = {
8198 		.type = HDA_FIXUP_PINS,
8199 		.v.pins = (const struct hda_pintbl[]) {
8200 			{ 0x19, 0x03a11050 }, /* front HP mic */
8201 			{ 0x1a, 0x01a11830 }, /* rear external mic */
8202 			{ 0x21, 0x03211020 }, /* front HP out */
8203 			{ }
8204 		},
8205 		.chained = true,
8206 		.chain_id = ALC294_FIXUP_ASUS_GX502_VERBS
8207 	},
8208 	[ALC294_FIXUP_ASUS_GX502_VERBS] = {
8209 		.type = HDA_FIXUP_VERBS,
8210 		.v.verbs = (const struct hda_verb[]) {
8211 			/* set 0x15 to HP-OUT ctrl */
8212 			{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
8213 			/* unmute the 0x15 amp */
8214 			{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
8215 			{ }
8216 		},
8217 		.chained = true,
8218 		.chain_id = ALC294_FIXUP_ASUS_GX502_HP
8219 	},
8220 	[ALC294_FIXUP_ASUS_GX502_HP] = {
8221 		.type = HDA_FIXUP_FUNC,
8222 		.v.func = alc294_fixup_gx502_hp,
8223 	},
8224 	[ALC294_FIXUP_ASUS_GU502_PINS] = {
8225 		.type = HDA_FIXUP_PINS,
8226 		.v.pins = (const struct hda_pintbl[]) {
8227 			{ 0x19, 0x01a11050 }, /* rear HP mic */
8228 			{ 0x1a, 0x01a11830 }, /* rear external mic */
8229 			{ 0x21, 0x012110f0 }, /* rear HP out */
8230 			{ }
8231 		},
8232 		.chained = true,
8233 		.chain_id = ALC294_FIXUP_ASUS_GU502_VERBS
8234 	},
8235 	[ALC294_FIXUP_ASUS_GU502_VERBS] = {
8236 		.type = HDA_FIXUP_VERBS,
8237 		.v.verbs = (const struct hda_verb[]) {
8238 			/* set 0x15 to HP-OUT ctrl */
8239 			{ 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
8240 			/* unmute the 0x15 amp */
8241 			{ 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
8242 			/* set 0x1b to HP-OUT */
8243 			{ 0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
8244 			{ }
8245 		},
8246 		.chained = true,
8247 		.chain_id = ALC294_FIXUP_ASUS_GU502_HP
8248 	},
8249 	[ALC294_FIXUP_ASUS_GU502_HP] = {
8250 		.type = HDA_FIXUP_FUNC,
8251 		.v.func = alc294_fixup_gu502_hp,
8252 	},
8253 	 [ALC294_FIXUP_ASUS_G513_PINS] = {
8254 		.type = HDA_FIXUP_PINS,
8255 		.v.pins = (const struct hda_pintbl[]) {
8256 				{ 0x19, 0x03a11050 }, /* front HP mic */
8257 				{ 0x1a, 0x03a11c30 }, /* rear external mic */
8258 				{ 0x21, 0x03211420 }, /* front HP out */
8259 				{ }
8260 		},
8261 	},
8262 	[ALC285_FIXUP_ASUS_G533Z_PINS] = {
8263 		.type = HDA_FIXUP_PINS,
8264 		.v.pins = (const struct hda_pintbl[]) {
8265 			{ 0x14, 0x90170152 }, /* Speaker Surround Playback Switch */
8266 			{ 0x19, 0x03a19020 }, /* Mic Boost Volume */
8267 			{ 0x1a, 0x03a11c30 }, /* Mic Boost Volume */
8268 			{ 0x1e, 0x90170151 }, /* Rear jack, IN OUT EAPD Detect */
8269 			{ 0x21, 0x03211420 },
8270 			{ }
8271 		},
8272 	},
8273 	[ALC294_FIXUP_ASUS_COEF_1B] = {
8274 		.type = HDA_FIXUP_VERBS,
8275 		.v.verbs = (const struct hda_verb[]) {
8276 			/* Set bit 10 to correct noisy output after reboot from
8277 			 * Windows 10 (due to pop noise reduction?)
8278 			 */
8279 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x1b },
8280 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x4e4b },
8281 			{ }
8282 		},
8283 		.chained = true,
8284 		.chain_id = ALC289_FIXUP_ASUS_GA401,
8285 	},
8286 	[ALC285_FIXUP_HP_GPIO_LED] = {
8287 		.type = HDA_FIXUP_FUNC,
8288 		.v.func = alc285_fixup_hp_gpio_led,
8289 	},
8290 	[ALC285_FIXUP_HP_MUTE_LED] = {
8291 		.type = HDA_FIXUP_FUNC,
8292 		.v.func = alc285_fixup_hp_mute_led,
8293 	},
8294 	[ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED] = {
8295 		.type = HDA_FIXUP_FUNC,
8296 		.v.func = alc285_fixup_hp_spectre_x360_mute_led,
8297 	},
8298 	[ALC236_FIXUP_HP_MUTE_LED_COEFBIT2] = {
8299 	    .type = HDA_FIXUP_FUNC,
8300 	    .v.func = alc236_fixup_hp_mute_led_coefbit2,
8301 	},
8302 	[ALC236_FIXUP_HP_GPIO_LED] = {
8303 		.type = HDA_FIXUP_FUNC,
8304 		.v.func = alc236_fixup_hp_gpio_led,
8305 	},
8306 	[ALC236_FIXUP_HP_MUTE_LED] = {
8307 		.type = HDA_FIXUP_FUNC,
8308 		.v.func = alc236_fixup_hp_mute_led,
8309 	},
8310 	[ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF] = {
8311 		.type = HDA_FIXUP_FUNC,
8312 		.v.func = alc236_fixup_hp_mute_led_micmute_vref,
8313 	},
8314 	[ALC298_FIXUP_SAMSUNG_AMP] = {
8315 		.type = HDA_FIXUP_FUNC,
8316 		.v.func = alc298_fixup_samsung_amp,
8317 		.chained = true,
8318 		.chain_id = ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET
8319 	},
8320 	[ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
8321 		.type = HDA_FIXUP_VERBS,
8322 		.v.verbs = (const struct hda_verb[]) {
8323 			{ 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc5 },
8324 			{ }
8325 		},
8326 	},
8327 	[ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
8328 		.type = HDA_FIXUP_VERBS,
8329 		.v.verbs = (const struct hda_verb[]) {
8330 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x08},
8331 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2fcf},
8332 			{ }
8333 		},
8334 	},
8335 	[ALC295_FIXUP_ASUS_MIC_NO_PRESENCE] = {
8336 		.type = HDA_FIXUP_PINS,
8337 		.v.pins = (const struct hda_pintbl[]) {
8338 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8339 			{ }
8340 		},
8341 		.chained = true,
8342 		.chain_id = ALC269_FIXUP_HEADSET_MODE
8343 	},
8344 	[ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS] = {
8345 		.type = HDA_FIXUP_PINS,
8346 		.v.pins = (const struct hda_pintbl[]) {
8347 			{ 0x14, 0x90100120 }, /* use as internal speaker */
8348 			{ 0x18, 0x02a111f0 }, /* use as headset mic, without its own jack detect */
8349 			{ 0x1a, 0x01011020 }, /* use as line out */
8350 			{ },
8351 		},
8352 		.chained = true,
8353 		.chain_id = ALC269_FIXUP_HEADSET_MIC
8354 	},
8355 	[ALC269VC_FIXUP_ACER_HEADSET_MIC] = {
8356 		.type = HDA_FIXUP_PINS,
8357 		.v.pins = (const struct hda_pintbl[]) {
8358 			{ 0x18, 0x02a11030 }, /* use as headset mic */
8359 			{ }
8360 		},
8361 		.chained = true,
8362 		.chain_id = ALC269_FIXUP_HEADSET_MIC
8363 	},
8364 	[ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE] = {
8365 		.type = HDA_FIXUP_PINS,
8366 		.v.pins = (const struct hda_pintbl[]) {
8367 			{ 0x18, 0x01a11130 }, /* use as headset mic, without its own jack detect */
8368 			{ }
8369 		},
8370 		.chained = true,
8371 		.chain_id = ALC269_FIXUP_HEADSET_MIC
8372 	},
8373 	[ALC289_FIXUP_ASUS_GA401] = {
8374 		.type = HDA_FIXUP_FUNC,
8375 		.v.func = alc289_fixup_asus_ga401,
8376 		.chained = true,
8377 		.chain_id = ALC289_FIXUP_ASUS_GA502,
8378 	},
8379 	[ALC289_FIXUP_ASUS_GA502] = {
8380 		.type = HDA_FIXUP_PINS,
8381 		.v.pins = (const struct hda_pintbl[]) {
8382 			{ 0x19, 0x03a11020 }, /* headset mic with jack detect */
8383 			{ }
8384 		},
8385 	},
8386 	[ALC256_FIXUP_ACER_MIC_NO_PRESENCE] = {
8387 		.type = HDA_FIXUP_PINS,
8388 		.v.pins = (const struct hda_pintbl[]) {
8389 			{ 0x19, 0x02a11120 }, /* use as headset mic, without its own jack detect */
8390 			{ }
8391 		},
8392 		.chained = true,
8393 		.chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8394 	},
8395 	[ALC285_FIXUP_HP_GPIO_AMP_INIT] = {
8396 		.type = HDA_FIXUP_FUNC,
8397 		.v.func = alc285_fixup_hp_gpio_amp_init,
8398 		.chained = true,
8399 		.chain_id = ALC285_FIXUP_HP_GPIO_LED
8400 	},
8401 	[ALC269_FIXUP_CZC_B20] = {
8402 		.type = HDA_FIXUP_PINS,
8403 		.v.pins = (const struct hda_pintbl[]) {
8404 			{ 0x12, 0x411111f0 },
8405 			{ 0x14, 0x90170110 }, /* speaker */
8406 			{ 0x15, 0x032f1020 }, /* HP out */
8407 			{ 0x17, 0x411111f0 },
8408 			{ 0x18, 0x03ab1040 }, /* mic */
8409 			{ 0x19, 0xb7a7013f },
8410 			{ 0x1a, 0x0181305f },
8411 			{ 0x1b, 0x411111f0 },
8412 			{ 0x1d, 0x411111f0 },
8413 			{ 0x1e, 0x411111f0 },
8414 			{ }
8415 		},
8416 		.chain_id = ALC269_FIXUP_DMIC,
8417 	},
8418 	[ALC269_FIXUP_CZC_TMI] = {
8419 		.type = HDA_FIXUP_PINS,
8420 		.v.pins = (const struct hda_pintbl[]) {
8421 			{ 0x12, 0x4000c000 },
8422 			{ 0x14, 0x90170110 }, /* speaker */
8423 			{ 0x15, 0x0421401f }, /* HP out */
8424 			{ 0x17, 0x411111f0 },
8425 			{ 0x18, 0x04a19020 }, /* mic */
8426 			{ 0x19, 0x411111f0 },
8427 			{ 0x1a, 0x411111f0 },
8428 			{ 0x1b, 0x411111f0 },
8429 			{ 0x1d, 0x40448505 },
8430 			{ 0x1e, 0x411111f0 },
8431 			{ 0x20, 0x8000ffff },
8432 			{ }
8433 		},
8434 		.chain_id = ALC269_FIXUP_DMIC,
8435 	},
8436 	[ALC269_FIXUP_CZC_L101] = {
8437 		.type = HDA_FIXUP_PINS,
8438 		.v.pins = (const struct hda_pintbl[]) {
8439 			{ 0x12, 0x40000000 },
8440 			{ 0x14, 0x01014010 }, /* speaker */
8441 			{ 0x15, 0x411111f0 }, /* HP out */
8442 			{ 0x16, 0x411111f0 },
8443 			{ 0x18, 0x01a19020 }, /* mic */
8444 			{ 0x19, 0x02a19021 },
8445 			{ 0x1a, 0x0181302f },
8446 			{ 0x1b, 0x0221401f },
8447 			{ 0x1c, 0x411111f0 },
8448 			{ 0x1d, 0x4044c601 },
8449 			{ 0x1e, 0x411111f0 },
8450 			{ }
8451 		},
8452 		.chain_id = ALC269_FIXUP_DMIC,
8453 	},
8454 	[ALC269_FIXUP_LEMOTE_A1802] = {
8455 		.type = HDA_FIXUP_PINS,
8456 		.v.pins = (const struct hda_pintbl[]) {
8457 			{ 0x12, 0x40000000 },
8458 			{ 0x14, 0x90170110 }, /* speaker */
8459 			{ 0x17, 0x411111f0 },
8460 			{ 0x18, 0x03a19040 }, /* mic1 */
8461 			{ 0x19, 0x90a70130 }, /* mic2 */
8462 			{ 0x1a, 0x411111f0 },
8463 			{ 0x1b, 0x411111f0 },
8464 			{ 0x1d, 0x40489d2d },
8465 			{ 0x1e, 0x411111f0 },
8466 			{ 0x20, 0x0003ffff },
8467 			{ 0x21, 0x03214020 },
8468 			{ }
8469 		},
8470 		.chain_id = ALC269_FIXUP_DMIC,
8471 	},
8472 	[ALC269_FIXUP_LEMOTE_A190X] = {
8473 		.type = HDA_FIXUP_PINS,
8474 		.v.pins = (const struct hda_pintbl[]) {
8475 			{ 0x14, 0x99130110 }, /* speaker */
8476 			{ 0x15, 0x0121401f }, /* HP out */
8477 			{ 0x18, 0x01a19c20 }, /* rear  mic */
8478 			{ 0x19, 0x99a3092f }, /* front mic */
8479 			{ 0x1b, 0x0201401f }, /* front lineout */
8480 			{ }
8481 		},
8482 		.chain_id = ALC269_FIXUP_DMIC,
8483 	},
8484 	[ALC256_FIXUP_INTEL_NUC8_RUGGED] = {
8485 		.type = HDA_FIXUP_PINS,
8486 		.v.pins = (const struct hda_pintbl[]) {
8487 			{ 0x1b, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8488 			{ }
8489 		},
8490 		.chained = true,
8491 		.chain_id = ALC269_FIXUP_HEADSET_MODE
8492 	},
8493 	[ALC256_FIXUP_INTEL_NUC10] = {
8494 		.type = HDA_FIXUP_PINS,
8495 		.v.pins = (const struct hda_pintbl[]) {
8496 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8497 			{ }
8498 		},
8499 		.chained = true,
8500 		.chain_id = ALC269_FIXUP_HEADSET_MODE
8501 	},
8502 	[ALC255_FIXUP_XIAOMI_HEADSET_MIC] = {
8503 		.type = HDA_FIXUP_VERBS,
8504 		.v.verbs = (const struct hda_verb[]) {
8505 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
8506 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
8507 			{ }
8508 		},
8509 		.chained = true,
8510 		.chain_id = ALC289_FIXUP_ASUS_GA502
8511 	},
8512 	[ALC274_FIXUP_HP_MIC] = {
8513 		.type = HDA_FIXUP_VERBS,
8514 		.v.verbs = (const struct hda_verb[]) {
8515 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
8516 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
8517 			{ }
8518 		},
8519 	},
8520 	[ALC274_FIXUP_HP_HEADSET_MIC] = {
8521 		.type = HDA_FIXUP_FUNC,
8522 		.v.func = alc274_fixup_hp_headset_mic,
8523 		.chained = true,
8524 		.chain_id = ALC274_FIXUP_HP_MIC
8525 	},
8526 	[ALC274_FIXUP_HP_ENVY_GPIO] = {
8527 		.type = HDA_FIXUP_FUNC,
8528 		.v.func = alc274_fixup_hp_envy_gpio,
8529 	},
8530 	[ALC256_FIXUP_ASUS_HPE] = {
8531 		.type = HDA_FIXUP_VERBS,
8532 		.v.verbs = (const struct hda_verb[]) {
8533 			/* Set EAPD high */
8534 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
8535 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x7778 },
8536 			{ }
8537 		},
8538 		.chained = true,
8539 		.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8540 	},
8541 	[ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK] = {
8542 		.type = HDA_FIXUP_FUNC,
8543 		.v.func = alc_fixup_headset_jack,
8544 		.chained = true,
8545 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI
8546 	},
8547 	[ALC287_FIXUP_HP_GPIO_LED] = {
8548 		.type = HDA_FIXUP_FUNC,
8549 		.v.func = alc287_fixup_hp_gpio_led,
8550 	},
8551 	[ALC256_FIXUP_HP_HEADSET_MIC] = {
8552 		.type = HDA_FIXUP_FUNC,
8553 		.v.func = alc274_fixup_hp_headset_mic,
8554 	},
8555 	[ALC236_FIXUP_DELL_AIO_HEADSET_MIC] = {
8556 		.type = HDA_FIXUP_FUNC,
8557 		.v.func = alc_fixup_no_int_mic,
8558 		.chained = true,
8559 		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
8560 	},
8561 	[ALC282_FIXUP_ACER_DISABLE_LINEOUT] = {
8562 		.type = HDA_FIXUP_PINS,
8563 		.v.pins = (const struct hda_pintbl[]) {
8564 			{ 0x1b, 0x411111f0 },
8565 			{ 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8566 			{ },
8567 		},
8568 		.chained = true,
8569 		.chain_id = ALC269_FIXUP_HEADSET_MODE
8570 	},
8571 	[ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST] = {
8572 		.type = HDA_FIXUP_FUNC,
8573 		.v.func = alc269_fixup_limit_int_mic_boost,
8574 		.chained = true,
8575 		.chain_id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
8576 	},
8577 	[ALC256_FIXUP_ACER_HEADSET_MIC] = {
8578 		.type = HDA_FIXUP_PINS,
8579 		.v.pins = (const struct hda_pintbl[]) {
8580 			{ 0x19, 0x02a1113c }, /* use as headset mic, without its own jack detect */
8581 			{ 0x1a, 0x90a1092f }, /* use as internal mic */
8582 			{ }
8583 		},
8584 		.chained = true,
8585 		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8586 	},
8587 	[ALC285_FIXUP_IDEAPAD_S740_COEF] = {
8588 		.type = HDA_FIXUP_FUNC,
8589 		.v.func = alc285_fixup_ideapad_s740_coef,
8590 		.chained = true,
8591 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
8592 	},
8593 	[ALC295_FIXUP_ASUS_DACS] = {
8594 		.type = HDA_FIXUP_FUNC,
8595 		.v.func = alc295_fixup_asus_dacs,
8596 	},
8597 	[ALC295_FIXUP_HP_OMEN] = {
8598 		.type = HDA_FIXUP_PINS,
8599 		.v.pins = (const struct hda_pintbl[]) {
8600 			{ 0x12, 0xb7a60130 },
8601 			{ 0x13, 0x40000000 },
8602 			{ 0x14, 0x411111f0 },
8603 			{ 0x16, 0x411111f0 },
8604 			{ 0x17, 0x90170110 },
8605 			{ 0x18, 0x411111f0 },
8606 			{ 0x19, 0x02a11030 },
8607 			{ 0x1a, 0x411111f0 },
8608 			{ 0x1b, 0x04a19030 },
8609 			{ 0x1d, 0x40600001 },
8610 			{ 0x1e, 0x411111f0 },
8611 			{ 0x21, 0x03211020 },
8612 			{}
8613 		},
8614 		.chained = true,
8615 		.chain_id = ALC269_FIXUP_HP_LINE1_MIC1_LED,
8616 	},
8617 	[ALC285_FIXUP_HP_SPECTRE_X360] = {
8618 		.type = HDA_FIXUP_FUNC,
8619 		.v.func = alc285_fixup_hp_spectre_x360,
8620 	},
8621 	[ALC285_FIXUP_HP_SPECTRE_X360_EB1] = {
8622 		.type = HDA_FIXUP_FUNC,
8623 		.v.func = alc285_fixup_hp_spectre_x360_eb1
8624 	},
8625 	[ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP] = {
8626 		.type = HDA_FIXUP_FUNC,
8627 		.v.func = alc285_fixup_ideapad_s740_coef,
8628 		.chained = true,
8629 		.chain_id = ALC285_FIXUP_THINKPAD_HEADSET_JACK,
8630 	},
8631 	[ALC623_FIXUP_LENOVO_THINKSTATION_P340] = {
8632 		.type = HDA_FIXUP_FUNC,
8633 		.v.func = alc_fixup_no_shutup,
8634 		.chained = true,
8635 		.chain_id = ALC283_FIXUP_HEADSET_MIC,
8636 	},
8637 	[ALC255_FIXUP_ACER_HEADPHONE_AND_MIC] = {
8638 		.type = HDA_FIXUP_PINS,
8639 		.v.pins = (const struct hda_pintbl[]) {
8640 			{ 0x21, 0x03211030 }, /* Change the Headphone location to Left */
8641 			{ }
8642 		},
8643 		.chained = true,
8644 		.chain_id = ALC255_FIXUP_XIAOMI_HEADSET_MIC
8645 	},
8646 	[ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST] = {
8647 		.type = HDA_FIXUP_FUNC,
8648 		.v.func = alc269_fixup_limit_int_mic_boost,
8649 		.chained = true,
8650 		.chain_id = ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,
8651 	},
8652 	[ALC285_FIXUP_LEGION_Y9000X_SPEAKERS] = {
8653 		.type = HDA_FIXUP_FUNC,
8654 		.v.func = alc285_fixup_ideapad_s740_coef,
8655 		.chained = true,
8656 		.chain_id = ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,
8657 	},
8658 	[ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE] = {
8659 		.type = HDA_FIXUP_FUNC,
8660 		.v.func = alc287_fixup_legion_15imhg05_speakers,
8661 		.chained = true,
8662 		.chain_id = ALC269_FIXUP_THINKPAD_ACPI,
8663 	},
8664 	[ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS] = {
8665 		.type = HDA_FIXUP_VERBS,
8666 		//.v.verbs = legion_15imhg05_coefs,
8667 		.v.verbs = (const struct hda_verb[]) {
8668 			 // set left speaker Legion 7i.
8669 			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
8670 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
8671 
8672 			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8673 			 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
8674 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8675 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
8676 			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8677 
8678 			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8679 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
8680 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8681 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8682 			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8683 
8684 			 // set right speaker Legion 7i.
8685 			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
8686 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
8687 
8688 			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8689 			 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
8690 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8691 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
8692 			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8693 
8694 			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8695 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
8696 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8697 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8698 			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8699 			 {}
8700 		},
8701 		.chained = true,
8702 		.chain_id = ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,
8703 	},
8704 	[ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE] = {
8705 		.type = HDA_FIXUP_FUNC,
8706 		.v.func = alc287_fixup_legion_15imhg05_speakers,
8707 		.chained = true,
8708 		.chain_id = ALC269_FIXUP_HEADSET_MODE,
8709 	},
8710 	[ALC287_FIXUP_YOGA7_14ITL_SPEAKERS] = {
8711 		.type = HDA_FIXUP_VERBS,
8712 		.v.verbs = (const struct hda_verb[]) {
8713 			 // set left speaker Yoga 7i.
8714 			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
8715 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
8716 
8717 			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8718 			 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
8719 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8720 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
8721 			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8722 
8723 			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8724 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
8725 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8726 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8727 			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8728 
8729 			 // set right speaker Yoga 7i.
8730 			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
8731 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
8732 
8733 			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8734 			 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
8735 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8736 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
8737 			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8738 
8739 			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8740 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
8741 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8742 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8743 			 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8744 			 {}
8745 		},
8746 		.chained = true,
8747 		.chain_id = ALC269_FIXUP_HEADSET_MODE,
8748 	},
8749 	[ALC298_FIXUP_LENOVO_C940_DUET7] = {
8750 		.type = HDA_FIXUP_FUNC,
8751 		.v.func = alc298_fixup_lenovo_c940_duet7,
8752 	},
8753 	[ALC287_FIXUP_13S_GEN2_SPEAKERS] = {
8754 		.type = HDA_FIXUP_VERBS,
8755 		.v.verbs = (const struct hda_verb[]) {
8756 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
8757 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
8758 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8759 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
8760 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8761 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8762 			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8763 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
8764 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
8765 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8766 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
8767 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8768 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8769 			{ 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8770 			{}
8771 		},
8772 		.chained = true,
8773 		.chain_id = ALC269_FIXUP_HEADSET_MODE,
8774 	},
8775 	[ALC256_FIXUP_SET_COEF_DEFAULTS] = {
8776 		.type = HDA_FIXUP_FUNC,
8777 		.v.func = alc256_fixup_set_coef_defaults,
8778 	},
8779 	[ALC245_FIXUP_HP_GPIO_LED] = {
8780 		.type = HDA_FIXUP_FUNC,
8781 		.v.func = alc245_fixup_hp_gpio_led,
8782 	},
8783 	[ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
8784 		.type = HDA_FIXUP_PINS,
8785 		.v.pins = (const struct hda_pintbl[]) {
8786 			{ 0x19, 0x03a11120 }, /* use as headset mic, without its own jack detect */
8787 			{ }
8788 		},
8789 		.chained = true,
8790 		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
8791 	},
8792 	[ALC233_FIXUP_NO_AUDIO_JACK] = {
8793 		.type = HDA_FIXUP_FUNC,
8794 		.v.func = alc233_fixup_no_audio_jack,
8795 	},
8796 	[ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME] = {
8797 		.type = HDA_FIXUP_FUNC,
8798 		.v.func = alc256_fixup_mic_no_presence_and_resume,
8799 		.chained = true,
8800 		.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8801 	},
8802 	[ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED] = {
8803 		.type = HDA_FIXUP_VERBS,
8804 		.v.verbs = (const struct hda_verb[]) {
8805 			 { 0x20, AC_VERB_SET_COEF_INDEX, 0x19 },
8806 			 { 0x20, AC_VERB_SET_PROC_COEF, 0x8e11 },
8807 			 { }
8808 		},
8809 		.chained = true,
8810 		.chain_id = ALC285_FIXUP_HP_MUTE_LED,
8811 	},
8812 	[ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS] = {
8813 		.type = HDA_FIXUP_FUNC,
8814 		.v.func = alc295_fixup_dell_inspiron_top_speakers,
8815 		.chained = true,
8816 		.chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
8817 	},
8818 	[ALC236_FIXUP_DELL_DUAL_CODECS] = {
8819 		.type = HDA_FIXUP_PINS,
8820 		.v.func = alc1220_fixup_gb_dual_codecs,
8821 		.chained = true,
8822 		.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8823 	},
8824 };
8825 
8826 static const struct snd_pci_quirk alc269_fixup_tbl[] = {
8827 	SND_PCI_QUIRK(0x1025, 0x0283, "Acer TravelMate 8371", ALC269_FIXUP_INV_DMIC),
8828 	SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC),
8829 	SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC),
8830 	SND_PCI_QUIRK(0x1025, 0x047c, "Acer AC700", ALC269_FIXUP_ACER_AC700),
8831 	SND_PCI_QUIRK(0x1025, 0x072d, "Acer Aspire V5-571G", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
8832 	SND_PCI_QUIRK(0x1025, 0x0740, "Acer AO725", ALC271_FIXUP_HP_GATE_MIC_JACK),
8833 	SND_PCI_QUIRK(0x1025, 0x0742, "Acer AO756", ALC271_FIXUP_HP_GATE_MIC_JACK),
8834 	SND_PCI_QUIRK(0x1025, 0x0762, "Acer Aspire E1-472", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
8835 	SND_PCI_QUIRK(0x1025, 0x0775, "Acer Aspire E1-572", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
8836 	SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS),
8837 	SND_PCI_QUIRK(0x1025, 0x080d, "Acer Aspire V5-122P", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
8838 	SND_PCI_QUIRK(0x1025, 0x0840, "Acer Aspire E1", ALC269VB_FIXUP_ASPIRE_E1_COEF),
8839 	SND_PCI_QUIRK(0x1025, 0x101c, "Acer Veriton N2510G", ALC269_FIXUP_LIFEBOOK),
8840 	SND_PCI_QUIRK(0x1025, 0x102b, "Acer Aspire C24-860", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE),
8841 	SND_PCI_QUIRK(0x1025, 0x1065, "Acer Aspire C20-820", ALC269VC_FIXUP_ACER_HEADSET_MIC),
8842 	SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK),
8843 	SND_PCI_QUIRK(0x1025, 0x1094, "Acer Aspire E5-575T", ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST),
8844 	SND_PCI_QUIRK(0x1025, 0x1099, "Acer Aspire E5-523G", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
8845 	SND_PCI_QUIRK(0x1025, 0x110e, "Acer Aspire ES1-432", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
8846 	SND_PCI_QUIRK(0x1025, 0x1166, "Acer Veriton N4640G", ALC269_FIXUP_LIFEBOOK),
8847 	SND_PCI_QUIRK(0x1025, 0x1167, "Acer Veriton N6640G", ALC269_FIXUP_LIFEBOOK),
8848 	SND_PCI_QUIRK(0x1025, 0x1246, "Acer Predator Helios 500", ALC299_FIXUP_PREDATOR_SPK),
8849 	SND_PCI_QUIRK(0x1025, 0x1247, "Acer vCopperbox", ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS),
8850 	SND_PCI_QUIRK(0x1025, 0x1248, "Acer Veriton N4660G", ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE),
8851 	SND_PCI_QUIRK(0x1025, 0x1269, "Acer SWIFT SF314-54", ALC256_FIXUP_ACER_HEADSET_MIC),
8852 	SND_PCI_QUIRK(0x1025, 0x126a, "Acer Swift SF114-32", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
8853 	SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
8854 	SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
8855 	SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
8856 	SND_PCI_QUIRK(0x1025, 0x129c, "Acer SWIFT SF314-55", ALC256_FIXUP_ACER_HEADSET_MIC),
8857 	SND_PCI_QUIRK(0x1025, 0x129d, "Acer SWIFT SF313-51", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
8858 	SND_PCI_QUIRK(0x1025, 0x1300, "Acer SWIFT SF314-56", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
8859 	SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
8860 	SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", ALC233_FIXUP_ACER_HEADSET_MIC),
8861 	SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC),
8862 	SND_PCI_QUIRK(0x1025, 0x141f, "Acer Spin SP513-54N", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
8863 	SND_PCI_QUIRK(0x1025, 0x142b, "Acer Swift SF314-42", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
8864 	SND_PCI_QUIRK(0x1025, 0x1430, "Acer TravelMate B311R-31", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
8865 	SND_PCI_QUIRK(0x1025, 0x1466, "Acer Aspire A515-56", ALC255_FIXUP_ACER_HEADPHONE_AND_MIC),
8866 	SND_PCI_QUIRK(0x1025, 0x1534, "Acer Predator PH315-54", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
8867 	SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
8868 	SND_PCI_QUIRK(0x1028, 0x053c, "Dell Latitude E5430", ALC292_FIXUP_DELL_E7X),
8869 	SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS),
8870 	SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X),
8871 	SND_PCI_QUIRK(0x1028, 0x05be, "Dell Latitude E6540", ALC292_FIXUP_DELL_E7X),
8872 	SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X),
8873 	SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X),
8874 	SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER),
8875 	SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
8876 	SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
8877 	SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
8878 	SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
8879 	SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
8880 	SND_PCI_QUIRK(0x1028, 0x062c, "Dell Latitude E5550", ALC292_FIXUP_DELL_E7X),
8881 	SND_PCI_QUIRK(0x1028, 0x062e, "Dell Latitude E7450", ALC292_FIXUP_DELL_E7X),
8882 	SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),
8883 	SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
8884 	SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
8885 	SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13),
8886 	SND_PCI_QUIRK(0x1028, 0x0669, "Dell Optiplex 9020m", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
8887 	SND_PCI_QUIRK(0x1028, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK),
8888 	SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
8889 	SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
8890 	SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
8891 	SND_PCI_QUIRK(0x1028, 0x06db, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
8892 	SND_PCI_QUIRK(0x1028, 0x06dd, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
8893 	SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
8894 	SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
8895 	SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
8896 	SND_PCI_QUIRK(0x1028, 0x0706, "Dell Inspiron 7559", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
8897 	SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE),
8898 	SND_PCI_QUIRK(0x1028, 0x0738, "Dell Precision 5820", ALC269_FIXUP_NO_SHUTUP),
8899 	SND_PCI_QUIRK(0x1028, 0x075c, "Dell XPS 27 7760", ALC298_FIXUP_SPK_VOLUME),
8900 	SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME),
8901 	SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
8902 	SND_PCI_QUIRK(0x1028, 0x07b0, "Dell Precision 7520", ALC295_FIXUP_DISABLE_DAC3),
8903 	SND_PCI_QUIRK(0x1028, 0x080c, "Dell WYSE", ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE),
8904 	SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
8905 	SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
8906 	SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
8907 	SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
8908 	SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB),
8909 	SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE),
8910 	SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE),
8911 	SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
8912 	SND_PCI_QUIRK(0x1028, 0x097d, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
8913 	SND_PCI_QUIRK(0x1028, 0x097e, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
8914 	SND_PCI_QUIRK(0x1028, 0x098d, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
8915 	SND_PCI_QUIRK(0x1028, 0x09bf, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
8916 	SND_PCI_QUIRK(0x1028, 0x0a2e, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
8917 	SND_PCI_QUIRK(0x1028, 0x0a30, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
8918 	SND_PCI_QUIRK(0x1028, 0x0a58, "Dell", ALC255_FIXUP_DELL_HEADSET_MIC),
8919 	SND_PCI_QUIRK(0x1028, 0x0a61, "Dell XPS 15 9510", ALC289_FIXUP_DUAL_SPK),
8920 	SND_PCI_QUIRK(0x1028, 0x0a62, "Dell Precision 5560", ALC289_FIXUP_DUAL_SPK),
8921 	SND_PCI_QUIRK(0x1028, 0x0a9d, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
8922 	SND_PCI_QUIRK(0x1028, 0x0a9e, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
8923 	SND_PCI_QUIRK(0x1028, 0x0b19, "Dell XPS 15 9520", ALC289_FIXUP_DUAL_SPK),
8924 	SND_PCI_QUIRK(0x1028, 0x0b1a, "Dell Precision 5570", ALC289_FIXUP_DUAL_SPK),
8925 	SND_PCI_QUIRK(0x1028, 0x0b37, "Dell Inspiron 16 Plus 7620 2-in-1", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS),
8926 	SND_PCI_QUIRK(0x1028, 0x0b71, "Dell Inspiron 16 Plus 7620", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS),
8927 	SND_PCI_QUIRK(0x1028, 0x0c03, "Dell Precision 5340", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
8928 	SND_PCI_QUIRK(0x1028, 0x0c19, "Dell Precision 3340", ALC236_FIXUP_DELL_DUAL_CODECS),
8929 	SND_PCI_QUIRK(0x1028, 0x0c1a, "Dell Precision 3340", ALC236_FIXUP_DELL_DUAL_CODECS),
8930 	SND_PCI_QUIRK(0x1028, 0x0c1b, "Dell Precision 3440", ALC236_FIXUP_DELL_DUAL_CODECS),
8931 	SND_PCI_QUIRK(0x1028, 0x0c1c, "Dell Precision 3540", ALC236_FIXUP_DELL_DUAL_CODECS),
8932 	SND_PCI_QUIRK(0x1028, 0x0c1d, "Dell Precision 3440", ALC236_FIXUP_DELL_DUAL_CODECS),
8933 	SND_PCI_QUIRK(0x1028, 0x0c1e, "Dell Precision 3540", ALC236_FIXUP_DELL_DUAL_CODECS),
8934 	SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
8935 	SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
8936 	SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
8937 	SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),
8938 	SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED),
8939 	SND_PCI_QUIRK(0x103c, 0x21f9, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8940 	SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8941 	SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8942 	SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8943 	SND_PCI_QUIRK(0x103c, 0x221c, "HP EliteBook 755 G2", ALC280_FIXUP_HP_HEADSET_MIC),
8944 	SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8945 	SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8946 	SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
8947 	SND_PCI_QUIRK(0x103c, 0x2237, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
8948 	SND_PCI_QUIRK(0x103c, 0x2238, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
8949 	SND_PCI_QUIRK(0x103c, 0x2239, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
8950 	SND_PCI_QUIRK(0x103c, 0x224b, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
8951 	SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8952 	SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8953 	SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8954 	SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8955 	SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8956 	SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8957 	SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED),
8958 	SND_PCI_QUIRK(0x103c, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY),
8959 	SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8960 	SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8961 	SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8962 	SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8963 	SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8964 	SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8965 	SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8966 	SND_PCI_QUIRK(0x103c, 0x226e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8967 	SND_PCI_QUIRK(0x103c, 0x2271, "HP", ALC286_FIXUP_HP_GPIO_LED),
8968 	SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8969 	SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC280_FIXUP_HP_DOCK_PINS),
8970 	SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8971 	SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC280_FIXUP_HP_DOCK_PINS),
8972 	SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8973 	SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8974 	SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8975 	SND_PCI_QUIRK(0x103c, 0x228b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8976 	SND_PCI_QUIRK(0x103c, 0x228e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8977 	SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8978 	SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8979 	SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8980 	SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8981 	SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8982 	SND_PCI_QUIRK(0x103c, 0x22c5, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8983 	SND_PCI_QUIRK(0x103c, 0x22c7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8984 	SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8985 	SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8986 	SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC280_FIXUP_HP_9480M),
8987 	SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8988 	SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8989 	SND_PCI_QUIRK(0x103c, 0x2334, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8990 	SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8991 	SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8992 	SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8993 	SND_PCI_QUIRK(0x103c, 0x2b5e, "HP 288 Pro G2 MT", ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE),
8994 	SND_PCI_QUIRK(0x103c, 0x802e, "HP Z240 SFF", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
8995 	SND_PCI_QUIRK(0x103c, 0x802f, "HP Z240", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
8996 	SND_PCI_QUIRK(0x103c, 0x8077, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
8997 	SND_PCI_QUIRK(0x103c, 0x8158, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
8998 	SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC295_FIXUP_HP_X360),
8999 	SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC),
9000 	SND_PCI_QUIRK(0x103c, 0x827e, "HP x360", ALC295_FIXUP_HP_X360),
9001 	SND_PCI_QUIRK(0x103c, 0x827f, "HP x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9002 	SND_PCI_QUIRK(0x103c, 0x82bf, "HP G3 mini", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9003 	SND_PCI_QUIRK(0x103c, 0x82c0, "HP G3 mini premium", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9004 	SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9005 	SND_PCI_QUIRK(0x103c, 0x841c, "HP Pavilion 15-CK0xx", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9006 	SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9007 	SND_PCI_QUIRK(0x103c, 0x84ae, "HP 15-db0403ng", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
9008 	SND_PCI_QUIRK(0x103c, 0x84da, "HP OMEN dc0019-ur", ALC295_FIXUP_HP_OMEN),
9009 	SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9010 	SND_PCI_QUIRK(0x103c, 0x8519, "HP Spectre x360 15-df0xxx", ALC285_FIXUP_HP_SPECTRE_X360),
9011 	SND_PCI_QUIRK(0x103c, 0x8537, "HP ProBook 440 G6", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9012 	SND_PCI_QUIRK(0x103c, 0x860f, "HP ZBook 15 G6", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9013 	SND_PCI_QUIRK(0x103c, 0x861f, "HP Elite Dragonfly G1", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9014 	SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED),
9015 	SND_PCI_QUIRK(0x103c, 0x86c7, "HP Envy AiO 32", ALC274_FIXUP_HP_ENVY_GPIO),
9016 	SND_PCI_QUIRK(0x103c, 0x86e7, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
9017 	SND_PCI_QUIRK(0x103c, 0x86e8, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
9018 	SND_PCI_QUIRK(0x103c, 0x86f9, "HP Spectre x360 13-aw0xxx", ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED),
9019 	SND_PCI_QUIRK(0x103c, 0x8716, "HP Elite Dragonfly G2 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9020 	SND_PCI_QUIRK(0x103c, 0x8720, "HP EliteBook x360 1040 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9021 	SND_PCI_QUIRK(0x103c, 0x8724, "HP EliteBook 850 G7", ALC285_FIXUP_HP_GPIO_LED),
9022 	SND_PCI_QUIRK(0x103c, 0x8728, "HP EliteBook 840 G7", ALC285_FIXUP_HP_GPIO_LED),
9023 	SND_PCI_QUIRK(0x103c, 0x8729, "HP", ALC285_FIXUP_HP_GPIO_LED),
9024 	SND_PCI_QUIRK(0x103c, 0x8730, "HP ProBook 445 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9025 	SND_PCI_QUIRK(0x103c, 0x8735, "HP ProBook 435 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9026 	SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9027 	SND_PCI_QUIRK(0x103c, 0x8760, "HP", ALC285_FIXUP_HP_MUTE_LED),
9028 	SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED),
9029 	SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED),
9030 	SND_PCI_QUIRK(0x103c, 0x8780, "HP ZBook Fury 17 G7 Mobile Workstation",
9031 		      ALC285_FIXUP_HP_GPIO_AMP_INIT),
9032 	SND_PCI_QUIRK(0x103c, 0x8783, "HP ZBook Fury 15 G7 Mobile Workstation",
9033 		      ALC285_FIXUP_HP_GPIO_AMP_INIT),
9034 	SND_PCI_QUIRK(0x103c, 0x8786, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
9035 	SND_PCI_QUIRK(0x103c, 0x8787, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
9036 	SND_PCI_QUIRK(0x103c, 0x8788, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
9037 	SND_PCI_QUIRK(0x103c, 0x87b7, "HP Laptop 14-fq0xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
9038 	SND_PCI_QUIRK(0x103c, 0x87c8, "HP", ALC287_FIXUP_HP_GPIO_LED),
9039 	SND_PCI_QUIRK(0x103c, 0x87e5, "HP ProBook 440 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9040 	SND_PCI_QUIRK(0x103c, 0x87e7, "HP ProBook 450 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9041 	SND_PCI_QUIRK(0x103c, 0x87f1, "HP ProBook 630 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9042 	SND_PCI_QUIRK(0x103c, 0x87f2, "HP ProBook 640 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9043 	SND_PCI_QUIRK(0x103c, 0x87f4, "HP", ALC287_FIXUP_HP_GPIO_LED),
9044 	SND_PCI_QUIRK(0x103c, 0x87f5, "HP", ALC287_FIXUP_HP_GPIO_LED),
9045 	SND_PCI_QUIRK(0x103c, 0x87f6, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
9046 	SND_PCI_QUIRK(0x103c, 0x87f7, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
9047 	SND_PCI_QUIRK(0x103c, 0x87fe, "HP Laptop 15s-fq2xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
9048 	SND_PCI_QUIRK(0x103c, 0x8805, "HP ProBook 650 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9049 	SND_PCI_QUIRK(0x103c, 0x880d, "HP EliteBook 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9050 	SND_PCI_QUIRK(0x103c, 0x8811, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
9051 	SND_PCI_QUIRK(0x103c, 0x8812, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
9052 	SND_PCI_QUIRK(0x103c, 0x881d, "HP 250 G8 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
9053 	SND_PCI_QUIRK(0x103c, 0x8846, "HP EliteBook 850 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9054 	SND_PCI_QUIRK(0x103c, 0x8847, "HP EliteBook x360 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9055 	SND_PCI_QUIRK(0x103c, 0x884b, "HP EliteBook 840 Aero G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9056 	SND_PCI_QUIRK(0x103c, 0x884c, "HP EliteBook 840 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9057 	SND_PCI_QUIRK(0x103c, 0x8862, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST),
9058 	SND_PCI_QUIRK(0x103c, 0x8863, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST),
9059 	SND_PCI_QUIRK(0x103c, 0x886d, "HP ZBook Fury 17.3 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9060 	SND_PCI_QUIRK(0x103c, 0x8870, "HP ZBook Fury 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9061 	SND_PCI_QUIRK(0x103c, 0x8873, "HP ZBook Studio 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9062 	SND_PCI_QUIRK(0x103c, 0x887a, "HP Laptop 15s-eq2xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
9063 	SND_PCI_QUIRK(0x103c, 0x888d, "HP ZBook Power 15.6 inch G8 Mobile Workstation PC", ALC236_FIXUP_HP_GPIO_LED),
9064 	SND_PCI_QUIRK(0x103c, 0x8895, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED),
9065 	SND_PCI_QUIRK(0x103c, 0x8896, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_MUTE_LED),
9066 	SND_PCI_QUIRK(0x103c, 0x89aa, "HP EliteBook 630 G9", ALC236_FIXUP_HP_GPIO_LED),
9067 	SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
9068 	SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
9069 	SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9070 	SND_PCI_QUIRK(0x1043, 0x10a1, "ASUS UX391UA", ALC294_FIXUP_ASUS_SPK),
9071 	SND_PCI_QUIRK(0x1043, 0x10c0, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
9072 	SND_PCI_QUIRK(0x1043, 0x10d0, "ASUS X540LA/X540LJ", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
9073 	SND_PCI_QUIRK(0x1043, 0x10d3, "ASUS K6500ZC", ALC294_FIXUP_ASUS_SPK),
9074 	SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9075 	SND_PCI_QUIRK(0x1043, 0x11c0, "ASUS X556UR", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
9076 	SND_PCI_QUIRK(0x1043, 0x125e, "ASUS Q524UQK", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
9077 	SND_PCI_QUIRK(0x1043, 0x1271, "ASUS X430UN", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
9078 	SND_PCI_QUIRK(0x1043, 0x1290, "ASUS X441SA", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
9079 	SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
9080 	SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),
9081 	SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC),
9082 	SND_PCI_QUIRK(0x1043, 0x1313, "Asus K42JZ", ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE),
9083 	SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
9084 	SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
9085 	SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
9086 	SND_PCI_QUIRK(0x1043, 0x1662, "ASUS GV301QH", ALC294_FIXUP_ASUS_DUAL_SPK),
9087 	SND_PCI_QUIRK(0x1043, 0x16b2, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),
9088 	SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
9089 	SND_PCI_QUIRK(0x1043, 0x1740, "ASUS UX430UA", ALC295_FIXUP_ASUS_DACS),
9090 	SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_DUAL_SPK),
9091 	SND_PCI_QUIRK(0x1043, 0x1881, "ASUS Zephyrus S/M", ALC294_FIXUP_ASUS_GX502_PINS),
9092 	SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC),
9093 	SND_PCI_QUIRK(0x1043, 0x18f1, "Asus FX505DT", ALC256_FIXUP_ASUS_HEADSET_MIC),
9094 	SND_PCI_QUIRK(0x1043, 0x194e, "ASUS UX563FD", ALC294_FIXUP_ASUS_HPE),
9095 	SND_PCI_QUIRK(0x1043, 0x1970, "ASUS UX550VE", ALC289_FIXUP_ASUS_GA401),
9096 	SND_PCI_QUIRK(0x1043, 0x1982, "ASUS B1400CEPE", ALC256_FIXUP_ASUS_HPE),
9097 	SND_PCI_QUIRK(0x1043, 0x19ce, "ASUS B9450FA", ALC294_FIXUP_ASUS_HPE),
9098 	SND_PCI_QUIRK(0x1043, 0x19e1, "ASUS UX581LV", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE),
9099 	SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
9100 	SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC),
9101 	SND_PCI_QUIRK(0x1043, 0x1b11, "ASUS UX431DA", ALC294_FIXUP_ASUS_COEF_1B),
9102 	SND_PCI_QUIRK(0x1043, 0x1b13, "Asus U41SV", ALC269_FIXUP_INV_DMIC),
9103 	SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
9104 	SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9105 	SND_PCI_QUIRK(0x1043, 0x1c62, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),
9106 	SND_PCI_QUIRK(0x1043, 0x1c92, "ASUS ROG Strix G15", ALC285_FIXUP_ASUS_G533Z_PINS),
9107 	SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
9108 	SND_PCI_QUIRK(0x1043, 0x1d42, "ASUS Zephyrus G14 2022", ALC289_FIXUP_ASUS_GA401),
9109 	SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE),
9110 	SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502),
9111 	SND_PCI_QUIRK(0x1043, 0x1e51, "ASUS Zephyrus M15", ALC294_FIXUP_ASUS_GU502_PINS),
9112 	SND_PCI_QUIRK(0x1043, 0x1e5e, "ASUS ROG Strix G513", ALC294_FIXUP_ASUS_G513_PINS),
9113 	SND_PCI_QUIRK(0x1043, 0x1e8e, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA401),
9114 	SND_PCI_QUIRK(0x1043, 0x1c52, "ASUS Zephyrus G15 2022", ALC289_FIXUP_ASUS_GA401),
9115 	SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401),
9116 	SND_PCI_QUIRK(0x1043, 0x1f92, "ASUS ROG Flow X16", ALC289_FIXUP_ASUS_GA401),
9117 	SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
9118 	SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
9119 	SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
9120 	SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
9121 	SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
9122 	SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
9123 	SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
9124 	SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
9125 	SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
9126 	SND_PCI_QUIRK(0x104d, 0x9099, "Sony VAIO S13", ALC275_FIXUP_SONY_DISABLE_AAMIX),
9127 	SND_PCI_QUIRK(0x104d, 0x90b5, "Sony VAIO Pro 11", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
9128 	SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
9129 	SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),
9130 	SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT),
9131 	SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN),
9132 	SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC),
9133 	SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN),
9134 	SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),
9135 	SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE),
9136 	SND_PCI_QUIRK(0x10ec, 0x118c, "Medion EE4254 MD62100", ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE),
9137 	SND_PCI_QUIRK(0x10ec, 0x1230, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
9138 	SND_PCI_QUIRK(0x10ec, 0x124c, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
9139 	SND_PCI_QUIRK(0x10ec, 0x1252, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
9140 	SND_PCI_QUIRK(0x10ec, 0x1254, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
9141 	SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-SZ6", ALC269_FIXUP_HEADSET_MODE),
9142 	SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
9143 	SND_PCI_QUIRK(0x144d, 0xc169, "Samsung Notebook 9 Pen (NP930SBE-K01US)", ALC298_FIXUP_SAMSUNG_AMP),
9144 	SND_PCI_QUIRK(0x144d, 0xc176, "Samsung Notebook 9 Pro (NP930MBE-K04US)", ALC298_FIXUP_SAMSUNG_AMP),
9145 	SND_PCI_QUIRK(0x144d, 0xc189, "Samsung Galaxy Flex Book (NT950QCG-X716)", ALC298_FIXUP_SAMSUNG_AMP),
9146 	SND_PCI_QUIRK(0x144d, 0xc18a, "Samsung Galaxy Book Ion (NP930XCJ-K01US)", ALC298_FIXUP_SAMSUNG_AMP),
9147 	SND_PCI_QUIRK(0x144d, 0xc1a3, "Samsung Galaxy Book Pro (NP935XDB-KC1SE)", ALC298_FIXUP_SAMSUNG_AMP),
9148 	SND_PCI_QUIRK(0x144d, 0xc1a6, "Samsung Galaxy Book Pro 360 (NP930QBD)", ALC298_FIXUP_SAMSUNG_AMP),
9149 	SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
9150 	SND_PCI_QUIRK(0x144d, 0xc812, "Samsung Notebook Pen S (NT950SBE-X58)", ALC298_FIXUP_SAMSUNG_AMP),
9151 	SND_PCI_QUIRK(0x144d, 0xc830, "Samsung Galaxy Book Ion (NT950XCJ-X716A)", ALC298_FIXUP_SAMSUNG_AMP),
9152 	SND_PCI_QUIRK(0x144d, 0xc832, "Samsung Galaxy Book Flex Alpha (NP730QCJ)", ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
9153 	SND_PCI_QUIRK(0x144d, 0xca03, "Samsung Galaxy Book2 Pro 360 (NP930QED)", ALC298_FIXUP_SAMSUNG_AMP),
9154 	SND_PCI_QUIRK(0x144d, 0xc868, "Samsung Galaxy Book2 Pro (NP930XED)", ALC298_FIXUP_SAMSUNG_AMP),
9155 	SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
9156 	SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),
9157 	SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC),
9158 	SND_PCI_QUIRK(0x152d, 0x1082, "Quanta NL3", ALC269_FIXUP_LIFEBOOK),
9159 	SND_PCI_QUIRK(0x1558, 0x1323, "Clevo N130ZU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9160 	SND_PCI_QUIRK(0x1558, 0x1325, "System76 Darter Pro (darp5)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9161 	SND_PCI_QUIRK(0x1558, 0x1401, "Clevo L140[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9162 	SND_PCI_QUIRK(0x1558, 0x1403, "Clevo N140CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9163 	SND_PCI_QUIRK(0x1558, 0x1404, "Clevo N150CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9164 	SND_PCI_QUIRK(0x1558, 0x14a1, "Clevo L141MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9165 	SND_PCI_QUIRK(0x1558, 0x4018, "Clevo NV40M[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9166 	SND_PCI_QUIRK(0x1558, 0x4019, "Clevo NV40MZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9167 	SND_PCI_QUIRK(0x1558, 0x4020, "Clevo NV40MB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9168 	SND_PCI_QUIRK(0x1558, 0x4041, "Clevo NV4[15]PZ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9169 	SND_PCI_QUIRK(0x1558, 0x40a1, "Clevo NL40GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9170 	SND_PCI_QUIRK(0x1558, 0x40c1, "Clevo NL40[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9171 	SND_PCI_QUIRK(0x1558, 0x40d1, "Clevo NL41DU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9172 	SND_PCI_QUIRK(0x1558, 0x5015, "Clevo NH5[58]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9173 	SND_PCI_QUIRK(0x1558, 0x5017, "Clevo NH7[79]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9174 	SND_PCI_QUIRK(0x1558, 0x50a3, "Clevo NJ51GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9175 	SND_PCI_QUIRK(0x1558, 0x50b3, "Clevo NK50S[BEZ]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9176 	SND_PCI_QUIRK(0x1558, 0x50b6, "Clevo NK50S5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9177 	SND_PCI_QUIRK(0x1558, 0x50b8, "Clevo NK50SZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9178 	SND_PCI_QUIRK(0x1558, 0x50d5, "Clevo NP50D5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9179 	SND_PCI_QUIRK(0x1558, 0x50e1, "Clevo NH5[58]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9180 	SND_PCI_QUIRK(0x1558, 0x50e2, "Clevo NH7[79]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9181 	SND_PCI_QUIRK(0x1558, 0x50f0, "Clevo NH50A[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9182 	SND_PCI_QUIRK(0x1558, 0x50f2, "Clevo NH50E[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9183 	SND_PCI_QUIRK(0x1558, 0x50f3, "Clevo NH58DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9184 	SND_PCI_QUIRK(0x1558, 0x50f5, "Clevo NH55EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9185 	SND_PCI_QUIRK(0x1558, 0x50f6, "Clevo NH55DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9186 	SND_PCI_QUIRK(0x1558, 0x5101, "Clevo S510WU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9187 	SND_PCI_QUIRK(0x1558, 0x5157, "Clevo W517GU1", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9188 	SND_PCI_QUIRK(0x1558, 0x51a1, "Clevo NS50MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9189 	SND_PCI_QUIRK(0x1558, 0x70a1, "Clevo NB70T[HJK]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9190 	SND_PCI_QUIRK(0x1558, 0x70b3, "Clevo NK70SB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9191 	SND_PCI_QUIRK(0x1558, 0x70f2, "Clevo NH79EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9192 	SND_PCI_QUIRK(0x1558, 0x70f3, "Clevo NH77DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9193 	SND_PCI_QUIRK(0x1558, 0x70f4, "Clevo NH77EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9194 	SND_PCI_QUIRK(0x1558, 0x70f6, "Clevo NH77DPQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9195 	SND_PCI_QUIRK(0x1558, 0x7716, "Clevo NS50PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9196 	SND_PCI_QUIRK(0x1558, 0x7717, "Clevo NS70PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9197 	SND_PCI_QUIRK(0x1558, 0x7718, "Clevo L140PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9198 	SND_PCI_QUIRK(0x1558, 0x7724, "Clevo L140AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9199 	SND_PCI_QUIRK(0x1558, 0x8228, "Clevo NR40BU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9200 	SND_PCI_QUIRK(0x1558, 0x8520, "Clevo NH50D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9201 	SND_PCI_QUIRK(0x1558, 0x8521, "Clevo NH77D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9202 	SND_PCI_QUIRK(0x1558, 0x8535, "Clevo NH50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9203 	SND_PCI_QUIRK(0x1558, 0x8536, "Clevo NH79D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9204 	SND_PCI_QUIRK(0x1558, 0x8550, "System76 Gazelle (gaze14)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9205 	SND_PCI_QUIRK(0x1558, 0x8551, "System76 Gazelle (gaze14)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9206 	SND_PCI_QUIRK(0x1558, 0x8560, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
9207 	SND_PCI_QUIRK(0x1558, 0x8561, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
9208 	SND_PCI_QUIRK(0x1558, 0x8562, "Clevo NH[5|7][0-9]RZ[Q]", ALC269_FIXUP_DMIC),
9209 	SND_PCI_QUIRK(0x1558, 0x8668, "Clevo NP50B[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9210 	SND_PCI_QUIRK(0x1558, 0x866d, "Clevo NP5[05]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9211 	SND_PCI_QUIRK(0x1558, 0x867c, "Clevo NP7[01]PNP", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9212 	SND_PCI_QUIRK(0x1558, 0x867d, "Clevo NP7[01]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9213 	SND_PCI_QUIRK(0x1558, 0x8680, "Clevo NJ50LU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9214 	SND_PCI_QUIRK(0x1558, 0x8686, "Clevo NH50[CZ]U", ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME),
9215 	SND_PCI_QUIRK(0x1558, 0x8a20, "Clevo NH55DCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9216 	SND_PCI_QUIRK(0x1558, 0x8a51, "Clevo NH70RCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9217 	SND_PCI_QUIRK(0x1558, 0x8d50, "Clevo NH55RCQ-M", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9218 	SND_PCI_QUIRK(0x1558, 0x951d, "Clevo N950T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9219 	SND_PCI_QUIRK(0x1558, 0x9600, "Clevo N960K[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9220 	SND_PCI_QUIRK(0x1558, 0x961d, "Clevo N960S[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9221 	SND_PCI_QUIRK(0x1558, 0x971d, "Clevo N970T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9222 	SND_PCI_QUIRK(0x1558, 0xa500, "Clevo NL53RU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9223 	SND_PCI_QUIRK(0x1558, 0xa600, "Clevo NL5XNU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9224 	SND_PCI_QUIRK(0x1558, 0xb018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9225 	SND_PCI_QUIRK(0x1558, 0xb019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9226 	SND_PCI_QUIRK(0x1558, 0xb022, "Clevo NH77D[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9227 	SND_PCI_QUIRK(0x1558, 0xc018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9228 	SND_PCI_QUIRK(0x1558, 0xc019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9229 	SND_PCI_QUIRK(0x1558, 0xc022, "Clevo NH77[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9230 	SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
9231 	SND_PCI_QUIRK(0x17aa, 0x1048, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),
9232 	SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
9233 	SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
9234 	SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
9235 	SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
9236 	SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
9237 	SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),
9238 	SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST),
9239 	SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK),
9240 	SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),
9241 	SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK),
9242 	SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK),
9243 	SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440),
9244 	SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK),
9245 	SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK),
9246 	SND_PCI_QUIRK(0x17aa, 0x2211, "Thinkpad W541", ALC292_FIXUP_TPT440_DOCK),
9247 	SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK),
9248 	SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK),
9249 	SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9250 	SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK),
9251 	SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK),
9252 	SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK),
9253 	SND_PCI_QUIRK(0x17aa, 0x222d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9254 	SND_PCI_QUIRK(0x17aa, 0x222e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9255 	SND_PCI_QUIRK(0x17aa, 0x2231, "Thinkpad T560", ALC292_FIXUP_TPT460),
9256 	SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460),
9257 	SND_PCI_QUIRK(0x17aa, 0x2245, "Thinkpad T470", ALC298_FIXUP_TPT470_DOCK),
9258 	SND_PCI_QUIRK(0x17aa, 0x2246, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9259 	SND_PCI_QUIRK(0x17aa, 0x2247, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9260 	SND_PCI_QUIRK(0x17aa, 0x2249, "Thinkpad", ALC292_FIXUP_TPT460),
9261 	SND_PCI_QUIRK(0x17aa, 0x224b, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9262 	SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9263 	SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9264 	SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9265 	SND_PCI_QUIRK(0x17aa, 0x2292, "Thinkpad X1 Carbon 7th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
9266 	SND_PCI_QUIRK(0x17aa, 0x22be, "Thinkpad X1 Carbon 8th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
9267 	SND_PCI_QUIRK(0x17aa, 0x22c1, "Thinkpad P1 Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
9268 	SND_PCI_QUIRK(0x17aa, 0x22c2, "Thinkpad X1 Extreme Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
9269 	SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
9270 	SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
9271 	SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
9272 	SND_PCI_QUIRK(0x17aa, 0x3111, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
9273 	SND_PCI_QUIRK(0x17aa, 0x312a, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
9274 	SND_PCI_QUIRK(0x17aa, 0x312f, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
9275 	SND_PCI_QUIRK(0x17aa, 0x313c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
9276 	SND_PCI_QUIRK(0x17aa, 0x3151, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
9277 	SND_PCI_QUIRK(0x17aa, 0x3176, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
9278 	SND_PCI_QUIRK(0x17aa, 0x3178, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
9279 	SND_PCI_QUIRK(0x17aa, 0x31af, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),
9280 	SND_PCI_QUIRK(0x17aa, 0x3802, "Lenovo Yoga DuetITL 2021", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
9281 	SND_PCI_QUIRK(0x17aa, 0x3813, "Legion 7i 15IMHG05", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
9282 	SND_PCI_QUIRK(0x17aa, 0x3818, "Lenovo C940 / Yoga Duet 7", ALC298_FIXUP_LENOVO_C940_DUET7),
9283 	SND_PCI_QUIRK(0x17aa, 0x3819, "Lenovo 13s Gen2 ITL", ALC287_FIXUP_13S_GEN2_SPEAKERS),
9284 	SND_PCI_QUIRK(0x17aa, 0x3820, "Yoga Duet 7 13ITL6", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
9285 	SND_PCI_QUIRK(0x17aa, 0x3824, "Legion Y9000X 2020", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),
9286 	SND_PCI_QUIRK(0x17aa, 0x3827, "Ideapad S740", ALC285_FIXUP_IDEAPAD_S740_COEF),
9287 	SND_PCI_QUIRK(0x17aa, 0x3834, "Lenovo IdeaPad Slim 9i 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
9288 	SND_PCI_QUIRK(0x17aa, 0x383d, "Legion Y9000X 2019", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),
9289 	SND_PCI_QUIRK(0x17aa, 0x3843, "Yoga 9i", ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP),
9290 	SND_PCI_QUIRK(0x17aa, 0x384a, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
9291 	SND_PCI_QUIRK(0x17aa, 0x3852, "Lenovo Yoga 7 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
9292 	SND_PCI_QUIRK(0x17aa, 0x3853, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
9293 	SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
9294 	SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
9295 	SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
9296 	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
9297 	SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9298 	SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC),
9299 	SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK),
9300 	SND_PCI_QUIRK(0x17aa, 0x5026, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9301 	SND_PCI_QUIRK(0x17aa, 0x5034, "Thinkpad T450", ALC292_FIXUP_TPT440_DOCK),
9302 	SND_PCI_QUIRK(0x17aa, 0x5036, "Thinkpad T450s", ALC292_FIXUP_TPT440_DOCK),
9303 	SND_PCI_QUIRK(0x17aa, 0x503c, "Thinkpad L450", ALC292_FIXUP_TPT440_DOCK),
9304 	SND_PCI_QUIRK(0x17aa, 0x504a, "ThinkPad X260", ALC292_FIXUP_TPT440_DOCK),
9305 	SND_PCI_QUIRK(0x17aa, 0x504b, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
9306 	SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460),
9307 	SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460),
9308 	SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460),
9309 	SND_PCI_QUIRK(0x17aa, 0x505d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9310 	SND_PCI_QUIRK(0x17aa, 0x505f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9311 	SND_PCI_QUIRK(0x17aa, 0x5062, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9312 	SND_PCI_QUIRK(0x17aa, 0x508b, "Thinkpad X12 Gen 1", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
9313 	SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9314 	SND_PCI_QUIRK(0x17aa, 0x511e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9315 	SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9316 	SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
9317 	SND_PCI_QUIRK(0x17aa, 0x9e56, "Lenovo ZhaoYang CF4620Z", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
9318 	SND_PCI_QUIRK(0x1849, 0x1233, "ASRock NUC Box 1100", ALC233_FIXUP_NO_AUDIO_JACK),
9319 	SND_PCI_QUIRK(0x1849, 0xa233, "Positivo Master C6300", ALC269_FIXUP_HEADSET_MIC),
9320 	SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS),
9321 	SND_PCI_QUIRK(0x19e5, 0x320f, "Huawei WRT-WX9 ", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
9322 	SND_PCI_QUIRK(0x1b35, 0x1235, "CZC B20", ALC269_FIXUP_CZC_B20),
9323 	SND_PCI_QUIRK(0x1b35, 0x1236, "CZC TMI", ALC269_FIXUP_CZC_TMI),
9324 	SND_PCI_QUIRK(0x1b35, 0x1237, "CZC L101", ALC269_FIXUP_CZC_L101),
9325 	SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */
9326 	SND_PCI_QUIRK(0x1c06, 0x2013, "Lemote A1802", ALC269_FIXUP_LEMOTE_A1802),
9327 	SND_PCI_QUIRK(0x1c06, 0x2015, "Lemote A190X", ALC269_FIXUP_LEMOTE_A190X),
9328 	SND_PCI_QUIRK(0x1c6c, 0x1251, "Positivo N14KP6-TG", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE),
9329 	SND_PCI_QUIRK(0x1d05, 0x1132, "TongFang PHxTxX1", ALC256_FIXUP_SET_COEF_DEFAULTS),
9330 	SND_PCI_QUIRK(0x1d05, 0x1096, "TongFang GMxMRxx", ALC269_FIXUP_NO_SHUTUP),
9331 	SND_PCI_QUIRK(0x1d05, 0x1100, "TongFang GKxNRxx", ALC269_FIXUP_NO_SHUTUP),
9332 	SND_PCI_QUIRK(0x1d05, 0x1111, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
9333 	SND_PCI_QUIRK(0x1d05, 0x1119, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
9334 	SND_PCI_QUIRK(0x1d05, 0x1129, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
9335 	SND_PCI_QUIRK(0x1d05, 0x1147, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP),
9336 	SND_PCI_QUIRK(0x1d05, 0x115c, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP),
9337 	SND_PCI_QUIRK(0x1d05, 0x121b, "TongFang GMxAGxx", ALC269_FIXUP_NO_SHUTUP),
9338 	SND_PCI_QUIRK(0x1d72, 0x1602, "RedmiBook", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
9339 	SND_PCI_QUIRK(0x1d72, 0x1701, "XiaomiNotebook Pro", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE),
9340 	SND_PCI_QUIRK(0x1d72, 0x1901, "RedmiBook 14", ALC256_FIXUP_ASUS_HEADSET_MIC),
9341 	SND_PCI_QUIRK(0x1d72, 0x1945, "Redmi G", ALC256_FIXUP_ASUS_HEADSET_MIC),
9342 	SND_PCI_QUIRK(0x1d72, 0x1947, "RedmiBook Air", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
9343 	SND_PCI_QUIRK(0x2782, 0x0232, "CHUWI CoreBook XPro", ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO),
9344 	SND_PCI_QUIRK(0x2782, 0x1707, "Vaio VJFE-ADL", ALC298_FIXUP_SPK_VOLUME),
9345 	SND_PCI_QUIRK(0x8086, 0x2074, "Intel NUC 8", ALC233_FIXUP_INTEL_NUC8_DMIC),
9346 	SND_PCI_QUIRK(0x8086, 0x2080, "Intel NUC 8 Rugged", ALC256_FIXUP_INTEL_NUC8_RUGGED),
9347 	SND_PCI_QUIRK(0x8086, 0x2081, "Intel NUC 10", ALC256_FIXUP_INTEL_NUC10),
9348 
9349 #if 0
9350 	/* Below is a quirk table taken from the old code.
9351 	 * Basically the device should work as is without the fixup table.
9352 	 * If BIOS doesn't give a proper info, enable the corresponding
9353 	 * fixup entry.
9354 	 */
9355 	SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
9356 		      ALC269_FIXUP_AMIC),
9357 	SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC),
9358 	SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC),
9359 	SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC),
9360 	SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC),
9361 	SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269_FIXUP_AMIC),
9362 	SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269_FIXUP_AMIC),
9363 	SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269_FIXUP_AMIC),
9364 	SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_FIXUP_AMIC),
9365 	SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269_FIXUP_AMIC),
9366 	SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_FIXUP_AMIC),
9367 	SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_FIXUP_AMIC),
9368 	SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_FIXUP_AMIC),
9369 	SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_FIXUP_AMIC),
9370 	SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_FIXUP_AMIC),
9371 	SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_FIXUP_AMIC),
9372 	SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_FIXUP_AMIC),
9373 	SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_FIXUP_AMIC),
9374 	SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_FIXUP_AMIC),
9375 	SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_FIXUP_AMIC),
9376 	SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_FIXUP_AMIC),
9377 	SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_FIXUP_AMIC),
9378 	SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_FIXUP_AMIC),
9379 	SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_FIXUP_AMIC),
9380 	SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_FIXUP_AMIC),
9381 	SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_FIXUP_AMIC),
9382 	SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_FIXUP_AMIC),
9383 	SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_FIXUP_AMIC),
9384 	SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_FIXUP_AMIC),
9385 	SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_FIXUP_AMIC),
9386 	SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_FIXUP_AMIC),
9387 	SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_FIXUP_AMIC),
9388 	SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_FIXUP_AMIC),
9389 	SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_FIXUP_AMIC),
9390 	SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_FIXUP_AMIC),
9391 	SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_FIXUP_DMIC),
9392 	SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_FIXUP_AMIC),
9393 	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_AMIC),
9394 	SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_FIXUP_DMIC),
9395 	SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_FIXUP_DMIC),
9396 #endif
9397 	{}
9398 };
9399 
9400 static const struct snd_pci_quirk alc269_fixup_vendor_tbl[] = {
9401 	SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
9402 	SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED),
9403 	SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
9404 	SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", ALC269_FIXUP_THINKPAD_ACPI),
9405 	SND_PCI_QUIRK_VENDOR(0x19e5, "Huawei Matebook", ALC255_FIXUP_MIC_MUTE_LED),
9406 	{}
9407 };
9408 
9409 static const struct hda_model_fixup alc269_fixup_models[] = {
9410 	{.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"},
9411 	{.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"},
9412 	{.id = ALC269_FIXUP_STEREO_DMIC, .name = "alc269-dmic"},
9413 	{.id = ALC271_FIXUP_DMIC, .name = "alc271-dmic"},
9414 	{.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"},
9415 	{.id = ALC269_FIXUP_HEADSET_MIC, .name = "headset-mic"},
9416 	{.id = ALC269_FIXUP_HEADSET_MODE, .name = "headset-mode"},
9417 	{.id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, .name = "headset-mode-no-hp-mic"},
9418 	{.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
9419 	{.id = ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST, .name = "lenovo-dock-limit-boost"},
9420 	{.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
9421 	{.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic1-led"},
9422 	{.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
9423 	{.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
9424 	{.id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, .name = "dell-headset3"},
9425 	{.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, .name = "dell-headset4"},
9426 	{.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},
9427 	{.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"},
9428 	{.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
9429 	{.id = ALC292_FIXUP_TPT440, .name = "tpt440"},
9430 	{.id = ALC292_FIXUP_TPT460, .name = "tpt460"},
9431 	{.id = ALC298_FIXUP_TPT470_DOCK_FIX, .name = "tpt470-dock-fix"},
9432 	{.id = ALC298_FIXUP_TPT470_DOCK, .name = "tpt470-dock"},
9433 	{.id = ALC233_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
9434 	{.id = ALC700_FIXUP_INTEL_REFERENCE, .name = "alc700-ref"},
9435 	{.id = ALC269_FIXUP_SONY_VAIO, .name = "vaio"},
9436 	{.id = ALC269_FIXUP_DELL_M101Z, .name = "dell-m101z"},
9437 	{.id = ALC269_FIXUP_ASUS_G73JW, .name = "asus-g73jw"},
9438 	{.id = ALC269_FIXUP_LENOVO_EAPD, .name = "lenovo-eapd"},
9439 	{.id = ALC275_FIXUP_SONY_HWEQ, .name = "sony-hweq"},
9440 	{.id = ALC269_FIXUP_PCM_44K, .name = "pcm44k"},
9441 	{.id = ALC269_FIXUP_LIFEBOOK, .name = "lifebook"},
9442 	{.id = ALC269_FIXUP_LIFEBOOK_EXTMIC, .name = "lifebook-extmic"},
9443 	{.id = ALC269_FIXUP_LIFEBOOK_HP_PIN, .name = "lifebook-hp-pin"},
9444 	{.id = ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC, .name = "lifebook-u7x7"},
9445 	{.id = ALC269VB_FIXUP_AMIC, .name = "alc269vb-amic"},
9446 	{.id = ALC269VB_FIXUP_DMIC, .name = "alc269vb-dmic"},
9447 	{.id = ALC269_FIXUP_HP_MUTE_LED_MIC1, .name = "hp-mute-led-mic1"},
9448 	{.id = ALC269_FIXUP_HP_MUTE_LED_MIC2, .name = "hp-mute-led-mic2"},
9449 	{.id = ALC269_FIXUP_HP_MUTE_LED_MIC3, .name = "hp-mute-led-mic3"},
9450 	{.id = ALC269_FIXUP_HP_GPIO_MIC1_LED, .name = "hp-gpio-mic1"},
9451 	{.id = ALC269_FIXUP_HP_LINE1_MIC1_LED, .name = "hp-line1-mic1"},
9452 	{.id = ALC269_FIXUP_NO_SHUTUP, .name = "noshutup"},
9453 	{.id = ALC286_FIXUP_SONY_MIC_NO_PRESENCE, .name = "sony-nomic"},
9454 	{.id = ALC269_FIXUP_ASPIRE_HEADSET_MIC, .name = "aspire-headset-mic"},
9455 	{.id = ALC269_FIXUP_ASUS_X101, .name = "asus-x101"},
9456 	{.id = ALC271_FIXUP_HP_GATE_MIC_JACK, .name = "acer-ao7xx"},
9457 	{.id = ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572, .name = "acer-aspire-e1"},
9458 	{.id = ALC269_FIXUP_ACER_AC700, .name = "acer-ac700"},
9459 	{.id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST, .name = "limit-mic-boost"},
9460 	{.id = ALC269VB_FIXUP_ASUS_ZENBOOK, .name = "asus-zenbook"},
9461 	{.id = ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A, .name = "asus-zenbook-ux31a"},
9462 	{.id = ALC269VB_FIXUP_ORDISSIMO_EVE2, .name = "ordissimo"},
9463 	{.id = ALC282_FIXUP_ASUS_TX300, .name = "asus-tx300"},
9464 	{.id = ALC283_FIXUP_INT_MIC, .name = "alc283-int-mic"},
9465 	{.id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK, .name = "mono-speakers"},
9466 	{.id = ALC290_FIXUP_SUBWOOFER_HSJACK, .name = "alc290-subwoofer"},
9467 	{.id = ALC269_FIXUP_THINKPAD_ACPI, .name = "thinkpad"},
9468 	{.id = ALC269_FIXUP_DMIC_THINKPAD_ACPI, .name = "dmic-thinkpad"},
9469 	{.id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE, .name = "alc255-acer"},
9470 	{.id = ALC255_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc255-asus"},
9471 	{.id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc255-dell1"},
9472 	{.id = ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "alc255-dell2"},
9473 	{.id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc293-dell1"},
9474 	{.id = ALC283_FIXUP_HEADSET_MIC, .name = "alc283-headset"},
9475 	{.id = ALC255_FIXUP_MIC_MUTE_LED, .name = "alc255-dell-mute"},
9476 	{.id = ALC282_FIXUP_ASPIRE_V5_PINS, .name = "aspire-v5"},
9477 	{.id = ALC269VB_FIXUP_ASPIRE_E1_COEF, .name = "aspire-e1-coef"},
9478 	{.id = ALC280_FIXUP_HP_GPIO4, .name = "hp-gpio4"},
9479 	{.id = ALC286_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
9480 	{.id = ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY, .name = "hp-gpio2-hotkey"},
9481 	{.id = ALC280_FIXUP_HP_DOCK_PINS, .name = "hp-dock-pins"},
9482 	{.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic"},
9483 	{.id = ALC280_FIXUP_HP_9480M, .name = "hp-9480m"},
9484 	{.id = ALC288_FIXUP_DELL_HEADSET_MODE, .name = "alc288-dell-headset"},
9485 	{.id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc288-dell1"},
9486 	{.id = ALC288_FIXUP_DELL_XPS_13, .name = "alc288-dell-xps13"},
9487 	{.id = ALC292_FIXUP_DELL_E7X, .name = "dell-e7x"},
9488 	{.id = ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK, .name = "alc293-dell"},
9489 	{.id = ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc298-dell1"},
9490 	{.id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, .name = "alc298-dell-aio"},
9491 	{.id = ALC275_FIXUP_DELL_XPS, .name = "alc275-dell-xps"},
9492 	{.id = ALC293_FIXUP_LENOVO_SPK_NOISE, .name = "lenovo-spk-noise"},
9493 	{.id = ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, .name = "lenovo-hotkey"},
9494 	{.id = ALC255_FIXUP_DELL_SPK_NOISE, .name = "dell-spk-noise"},
9495 	{.id = ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc225-dell1"},
9496 	{.id = ALC295_FIXUP_DISABLE_DAC3, .name = "alc295-disable-dac3"},
9497 	{.id = ALC285_FIXUP_SPEAKER2_TO_DAC1, .name = "alc285-speaker2-to-dac1"},
9498 	{.id = ALC280_FIXUP_HP_HEADSET_MIC, .name = "alc280-hp-headset"},
9499 	{.id = ALC221_FIXUP_HP_FRONT_MIC, .name = "alc221-hp-mic"},
9500 	{.id = ALC298_FIXUP_SPK_VOLUME, .name = "alc298-spk-volume"},
9501 	{.id = ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER, .name = "dell-inspiron-7559"},
9502 	{.id = ALC269_FIXUP_ATIV_BOOK_8, .name = "ativ-book"},
9503 	{.id = ALC221_FIXUP_HP_MIC_NO_PRESENCE, .name = "alc221-hp-mic"},
9504 	{.id = ALC256_FIXUP_ASUS_HEADSET_MODE, .name = "alc256-asus-headset"},
9505 	{.id = ALC256_FIXUP_ASUS_MIC, .name = "alc256-asus-mic"},
9506 	{.id = ALC256_FIXUP_ASUS_AIO_GPIO2, .name = "alc256-asus-aio"},
9507 	{.id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc233-asus"},
9508 	{.id = ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE, .name = "alc233-eapd"},
9509 	{.id = ALC294_FIXUP_LENOVO_MIC_LOCATION, .name = "alc294-lenovo-mic"},
9510 	{.id = ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE, .name = "alc225-wyse"},
9511 	{.id = ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, .name = "alc274-dell-aio"},
9512 	{.id = ALC255_FIXUP_DUMMY_LINEOUT_VERB, .name = "alc255-dummy-lineout"},
9513 	{.id = ALC255_FIXUP_DELL_HEADSET_MIC, .name = "alc255-dell-headset"},
9514 	{.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"},
9515 	{.id = ALC225_FIXUP_HEADSET_JACK, .name = "alc-headset-jack"},
9516 	{.id = ALC295_FIXUP_CHROME_BOOK, .name = "alc-chrome-book"},
9517 	{.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"},
9518 	{.id = ALC298_FIXUP_HUAWEI_MBX_STEREO, .name = "huawei-mbx-stereo"},
9519 	{.id = ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, .name = "alc256-medion-headset"},
9520 	{.id = ALC298_FIXUP_SAMSUNG_AMP, .name = "alc298-samsung-amp"},
9521 	{.id = ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET, .name = "alc256-samsung-headphone"},
9522 	{.id = ALC255_FIXUP_XIAOMI_HEADSET_MIC, .name = "alc255-xiaomi-headset"},
9523 	{.id = ALC274_FIXUP_HP_MIC, .name = "alc274-hp-mic-detect"},
9524 	{.id = ALC245_FIXUP_HP_X360_AMP, .name = "alc245-hp-x360-amp"},
9525 	{.id = ALC295_FIXUP_HP_OMEN, .name = "alc295-hp-omen"},
9526 	{.id = ALC285_FIXUP_HP_SPECTRE_X360, .name = "alc285-hp-spectre-x360"},
9527 	{.id = ALC285_FIXUP_HP_SPECTRE_X360_EB1, .name = "alc285-hp-spectre-x360-eb1"},
9528 	{.id = ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP, .name = "alc287-ideapad-bass-spk-amp"},
9529 	{.id = ALC623_FIXUP_LENOVO_THINKSTATION_P340, .name = "alc623-lenovo-thinkstation-p340"},
9530 	{.id = ALC255_FIXUP_ACER_HEADPHONE_AND_MIC, .name = "alc255-acer-headphone-and-mic"},
9531 	{.id = ALC285_FIXUP_HP_GPIO_AMP_INIT, .name = "alc285-hp-amp-init"},
9532 	{}
9533 };
9534 #define ALC225_STANDARD_PINS \
9535 	{0x21, 0x04211020}
9536 
9537 #define ALC256_STANDARD_PINS \
9538 	{0x12, 0x90a60140}, \
9539 	{0x14, 0x90170110}, \
9540 	{0x21, 0x02211020}
9541 
9542 #define ALC282_STANDARD_PINS \
9543 	{0x14, 0x90170110}
9544 
9545 #define ALC290_STANDARD_PINS \
9546 	{0x12, 0x99a30130}
9547 
9548 #define ALC292_STANDARD_PINS \
9549 	{0x14, 0x90170110}, \
9550 	{0x15, 0x0221401f}
9551 
9552 #define ALC295_STANDARD_PINS \
9553 	{0x12, 0xb7a60130}, \
9554 	{0x14, 0x90170110}, \
9555 	{0x21, 0x04211020}
9556 
9557 #define ALC298_STANDARD_PINS \
9558 	{0x12, 0x90a60130}, \
9559 	{0x21, 0x03211020}
9560 
9561 static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
9562 	SND_HDA_PIN_QUIRK(0x10ec0221, 0x103c, "HP Workstation", ALC221_FIXUP_HP_HEADSET_MIC,
9563 		{0x14, 0x01014020},
9564 		{0x17, 0x90170110},
9565 		{0x18, 0x02a11030},
9566 		{0x19, 0x0181303F},
9567 		{0x21, 0x0221102f}),
9568 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1025, "Acer", ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
9569 		{0x12, 0x90a601c0},
9570 		{0x14, 0x90171120},
9571 		{0x21, 0x02211030}),
9572 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
9573 		{0x14, 0x90170110},
9574 		{0x1b, 0x90a70130},
9575 		{0x21, 0x03211020}),
9576 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
9577 		{0x1a, 0x90a70130},
9578 		{0x1b, 0x90170110},
9579 		{0x21, 0x03211020}),
9580 	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
9581 		ALC225_STANDARD_PINS,
9582 		{0x12, 0xb7a60130},
9583 		{0x14, 0x901701a0}),
9584 	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
9585 		ALC225_STANDARD_PINS,
9586 		{0x12, 0xb7a60130},
9587 		{0x14, 0x901701b0}),
9588 	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
9589 		ALC225_STANDARD_PINS,
9590 		{0x12, 0xb7a60150},
9591 		{0x14, 0x901701a0}),
9592 	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
9593 		ALC225_STANDARD_PINS,
9594 		{0x12, 0xb7a60150},
9595 		{0x14, 0x901701b0}),
9596 	SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
9597 		ALC225_STANDARD_PINS,
9598 		{0x12, 0xb7a60130},
9599 		{0x1b, 0x90170110}),
9600 	SND_HDA_PIN_QUIRK(0x10ec0233, 0x8086, "Intel NUC Skull Canyon", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
9601 		{0x1b, 0x01111010},
9602 		{0x1e, 0x01451130},
9603 		{0x21, 0x02211020}),
9604 	SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
9605 		{0x12, 0x90a60140},
9606 		{0x14, 0x90170110},
9607 		{0x19, 0x02a11030},
9608 		{0x21, 0x02211020}),
9609 	SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
9610 		{0x14, 0x90170110},
9611 		{0x19, 0x02a11030},
9612 		{0x1a, 0x02a11040},
9613 		{0x1b, 0x01014020},
9614 		{0x21, 0x0221101f}),
9615 	SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
9616 		{0x14, 0x90170110},
9617 		{0x19, 0x02a11030},
9618 		{0x1a, 0x02a11040},
9619 		{0x1b, 0x01011020},
9620 		{0x21, 0x0221101f}),
9621 	SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
9622 		{0x14, 0x90170110},
9623 		{0x19, 0x02a11020},
9624 		{0x1a, 0x02a11030},
9625 		{0x21, 0x0221101f}),
9626 	SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
9627 		{0x21, 0x02211010}),
9628 	SND_HDA_PIN_QUIRK(0x10ec0236, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
9629 		{0x14, 0x90170110},
9630 		{0x19, 0x02a11020},
9631 		{0x21, 0x02211030}),
9632 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
9633 		{0x14, 0x90170110},
9634 		{0x21, 0x02211020}),
9635 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9636 		{0x14, 0x90170130},
9637 		{0x21, 0x02211040}),
9638 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9639 		{0x12, 0x90a60140},
9640 		{0x14, 0x90170110},
9641 		{0x21, 0x02211020}),
9642 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9643 		{0x12, 0x90a60160},
9644 		{0x14, 0x90170120},
9645 		{0x21, 0x02211030}),
9646 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9647 		{0x14, 0x90170110},
9648 		{0x1b, 0x02011020},
9649 		{0x21, 0x0221101f}),
9650 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9651 		{0x14, 0x90170110},
9652 		{0x1b, 0x01011020},
9653 		{0x21, 0x0221101f}),
9654 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9655 		{0x14, 0x90170130},
9656 		{0x1b, 0x01014020},
9657 		{0x21, 0x0221103f}),
9658 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9659 		{0x14, 0x90170130},
9660 		{0x1b, 0x01011020},
9661 		{0x21, 0x0221103f}),
9662 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9663 		{0x14, 0x90170130},
9664 		{0x1b, 0x02011020},
9665 		{0x21, 0x0221103f}),
9666 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9667 		{0x14, 0x90170150},
9668 		{0x1b, 0x02011020},
9669 		{0x21, 0x0221105f}),
9670 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9671 		{0x14, 0x90170110},
9672 		{0x1b, 0x01014020},
9673 		{0x21, 0x0221101f}),
9674 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9675 		{0x12, 0x90a60160},
9676 		{0x14, 0x90170120},
9677 		{0x17, 0x90170140},
9678 		{0x21, 0x0321102f}),
9679 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9680 		{0x12, 0x90a60160},
9681 		{0x14, 0x90170130},
9682 		{0x21, 0x02211040}),
9683 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9684 		{0x12, 0x90a60160},
9685 		{0x14, 0x90170140},
9686 		{0x21, 0x02211050}),
9687 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9688 		{0x12, 0x90a60170},
9689 		{0x14, 0x90170120},
9690 		{0x21, 0x02211030}),
9691 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9692 		{0x12, 0x90a60170},
9693 		{0x14, 0x90170130},
9694 		{0x21, 0x02211040}),
9695 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9696 		{0x12, 0x90a60170},
9697 		{0x14, 0x90171130},
9698 		{0x21, 0x02211040}),
9699 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9700 		{0x12, 0x90a60170},
9701 		{0x14, 0x90170140},
9702 		{0x21, 0x02211050}),
9703 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5548", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9704 		{0x12, 0x90a60180},
9705 		{0x14, 0x90170130},
9706 		{0x21, 0x02211040}),
9707 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5565", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9708 		{0x12, 0x90a60180},
9709 		{0x14, 0x90170120},
9710 		{0x21, 0x02211030}),
9711 	SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9712 		{0x1b, 0x01011020},
9713 		{0x21, 0x02211010}),
9714 	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
9715 		{0x14, 0x90170110},
9716 		{0x1b, 0x90a70130},
9717 		{0x21, 0x04211020}),
9718 	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
9719 		{0x14, 0x90170110},
9720 		{0x1b, 0x90a70130},
9721 		{0x21, 0x03211020}),
9722 	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
9723 		{0x12, 0x90a60130},
9724 		{0x14, 0x90170110},
9725 		{0x21, 0x03211020}),
9726 	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
9727 		{0x12, 0x90a60130},
9728 		{0x14, 0x90170110},
9729 		{0x21, 0x04211020}),
9730 	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
9731 		{0x1a, 0x90a70130},
9732 		{0x1b, 0x90170110},
9733 		{0x21, 0x03211020}),
9734        SND_HDA_PIN_QUIRK(0x10ec0256, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
9735 		{0x14, 0x90170110},
9736 		{0x19, 0x02a11020},
9737 		{0x21, 0x0221101f}),
9738        SND_HDA_PIN_QUIRK(0x10ec0274, 0x103c, "HP", ALC274_FIXUP_HP_HEADSET_MIC,
9739 		{0x17, 0x90170110},
9740 		{0x19, 0x03a11030},
9741 		{0x21, 0x03211020}),
9742 	SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
9743 		{0x12, 0x90a60130},
9744 		{0x14, 0x90170110},
9745 		{0x15, 0x0421101f},
9746 		{0x1a, 0x04a11020}),
9747 	SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED,
9748 		{0x12, 0x90a60140},
9749 		{0x14, 0x90170110},
9750 		{0x15, 0x0421101f},
9751 		{0x18, 0x02811030},
9752 		{0x1a, 0x04a1103f},
9753 		{0x1b, 0x02011020}),
9754 	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP 15 Touchsmart", ALC269_FIXUP_HP_MUTE_LED_MIC1,
9755 		ALC282_STANDARD_PINS,
9756 		{0x12, 0x99a30130},
9757 		{0x19, 0x03a11020},
9758 		{0x21, 0x0321101f}),
9759 	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
9760 		ALC282_STANDARD_PINS,
9761 		{0x12, 0x99a30130},
9762 		{0x19, 0x03a11020},
9763 		{0x21, 0x03211040}),
9764 	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
9765 		ALC282_STANDARD_PINS,
9766 		{0x12, 0x99a30130},
9767 		{0x19, 0x03a11030},
9768 		{0x21, 0x03211020}),
9769 	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
9770 		ALC282_STANDARD_PINS,
9771 		{0x12, 0x99a30130},
9772 		{0x19, 0x04a11020},
9773 		{0x21, 0x0421101f}),
9774 	SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED,
9775 		ALC282_STANDARD_PINS,
9776 		{0x12, 0x90a60140},
9777 		{0x19, 0x04a11030},
9778 		{0x21, 0x04211020}),
9779 	SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
9780 		ALC282_STANDARD_PINS,
9781 		{0x12, 0x90a609c0},
9782 		{0x18, 0x03a11830},
9783 		{0x19, 0x04a19831},
9784 		{0x1a, 0x0481303f},
9785 		{0x1b, 0x04211020},
9786 		{0x21, 0x0321101f}),
9787 	SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
9788 		ALC282_STANDARD_PINS,
9789 		{0x12, 0x90a60940},
9790 		{0x18, 0x03a11830},
9791 		{0x19, 0x04a19831},
9792 		{0x1a, 0x0481303f},
9793 		{0x1b, 0x04211020},
9794 		{0x21, 0x0321101f}),
9795 	SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
9796 		ALC282_STANDARD_PINS,
9797 		{0x12, 0x90a60130},
9798 		{0x21, 0x0321101f}),
9799 	SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
9800 		{0x12, 0x90a60160},
9801 		{0x14, 0x90170120},
9802 		{0x21, 0x02211030}),
9803 	SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
9804 		ALC282_STANDARD_PINS,
9805 		{0x12, 0x90a60130},
9806 		{0x19, 0x03a11020},
9807 		{0x21, 0x0321101f}),
9808 	SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
9809 		{0x12, 0x90a60130},
9810 		{0x14, 0x90170110},
9811 		{0x19, 0x04a11040},
9812 		{0x21, 0x04211020}),
9813 	SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
9814 		{0x14, 0x90170110},
9815 		{0x19, 0x04a11040},
9816 		{0x1d, 0x40600001},
9817 		{0x21, 0x04211020}),
9818 	SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
9819 		{0x14, 0x90170110},
9820 		{0x19, 0x04a11040},
9821 		{0x21, 0x04211020}),
9822 	SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_HEADSET_JACK,
9823 		{0x14, 0x90170110},
9824 		{0x17, 0x90170111},
9825 		{0x19, 0x03a11030},
9826 		{0x21, 0x03211020}),
9827 	SND_HDA_PIN_QUIRK(0x10ec0286, 0x1025, "Acer", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
9828 		{0x12, 0x90a60130},
9829 		{0x17, 0x90170110},
9830 		{0x21, 0x02211020}),
9831 	SND_HDA_PIN_QUIRK(0x10ec0288, 0x1028, "Dell", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
9832 		{0x12, 0x90a60120},
9833 		{0x14, 0x90170110},
9834 		{0x21, 0x0321101f}),
9835 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
9836 		ALC290_STANDARD_PINS,
9837 		{0x15, 0x04211040},
9838 		{0x18, 0x90170112},
9839 		{0x1a, 0x04a11020}),
9840 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
9841 		ALC290_STANDARD_PINS,
9842 		{0x15, 0x04211040},
9843 		{0x18, 0x90170110},
9844 		{0x1a, 0x04a11020}),
9845 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
9846 		ALC290_STANDARD_PINS,
9847 		{0x15, 0x0421101f},
9848 		{0x1a, 0x04a11020}),
9849 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
9850 		ALC290_STANDARD_PINS,
9851 		{0x15, 0x04211020},
9852 		{0x1a, 0x04a11040}),
9853 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
9854 		ALC290_STANDARD_PINS,
9855 		{0x14, 0x90170110},
9856 		{0x15, 0x04211020},
9857 		{0x1a, 0x04a11040}),
9858 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
9859 		ALC290_STANDARD_PINS,
9860 		{0x14, 0x90170110},
9861 		{0x15, 0x04211020},
9862 		{0x1a, 0x04a11020}),
9863 	SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
9864 		ALC290_STANDARD_PINS,
9865 		{0x14, 0x90170110},
9866 		{0x15, 0x0421101f},
9867 		{0x1a, 0x04a11020}),
9868 	SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
9869 		ALC292_STANDARD_PINS,
9870 		{0x12, 0x90a60140},
9871 		{0x16, 0x01014020},
9872 		{0x19, 0x01a19030}),
9873 	SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
9874 		ALC292_STANDARD_PINS,
9875 		{0x12, 0x90a60140},
9876 		{0x16, 0x01014020},
9877 		{0x18, 0x02a19031},
9878 		{0x19, 0x01a1903e}),
9879 	SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
9880 		ALC292_STANDARD_PINS,
9881 		{0x12, 0x90a60140}),
9882 	SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
9883 		ALC292_STANDARD_PINS,
9884 		{0x13, 0x90a60140},
9885 		{0x16, 0x21014020},
9886 		{0x19, 0x21a19030}),
9887 	SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
9888 		ALC292_STANDARD_PINS,
9889 		{0x13, 0x90a60140}),
9890 	SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_HPE,
9891 		{0x17, 0x90170110},
9892 		{0x21, 0x04211020}),
9893 	SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_MIC,
9894 		{0x14, 0x90170110},
9895 		{0x1b, 0x90a70130},
9896 		{0x21, 0x04211020}),
9897 	SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
9898 		{0x12, 0x90a60130},
9899 		{0x17, 0x90170110},
9900 		{0x21, 0x03211020}),
9901 	SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
9902 		{0x12, 0x90a60130},
9903 		{0x17, 0x90170110},
9904 		{0x21, 0x04211020}),
9905 	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
9906 		{0x12, 0x90a60130},
9907 		{0x17, 0x90170110},
9908 		{0x21, 0x03211020}),
9909 	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
9910 		{0x12, 0x90a60120},
9911 		{0x17, 0x90170110},
9912 		{0x21, 0x04211030}),
9913 	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
9914 		{0x12, 0x90a60130},
9915 		{0x17, 0x90170110},
9916 		{0x21, 0x03211020}),
9917 	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
9918 		{0x12, 0x90a60130},
9919 		{0x17, 0x90170110},
9920 		{0x21, 0x03211020}),
9921 	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
9922 		ALC298_STANDARD_PINS,
9923 		{0x17, 0x90170110}),
9924 	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
9925 		ALC298_STANDARD_PINS,
9926 		{0x17, 0x90170140}),
9927 	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
9928 		ALC298_STANDARD_PINS,
9929 		{0x17, 0x90170150}),
9930 	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_SPK_VOLUME,
9931 		{0x12, 0xb7a60140},
9932 		{0x13, 0xb7a60150},
9933 		{0x17, 0x90170110},
9934 		{0x1a, 0x03011020},
9935 		{0x21, 0x03211030}),
9936 	SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
9937 		{0x12, 0xb7a60140},
9938 		{0x17, 0x90170110},
9939 		{0x1a, 0x03a11030},
9940 		{0x21, 0x03211020}),
9941 	SND_HDA_PIN_QUIRK(0x10ec0299, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
9942 		ALC225_STANDARD_PINS,
9943 		{0x12, 0xb7a60130},
9944 		{0x17, 0x90170110}),
9945 	SND_HDA_PIN_QUIRK(0x10ec0623, 0x17aa, "Lenovo", ALC283_FIXUP_HEADSET_MIC,
9946 		{0x14, 0x01014010},
9947 		{0x17, 0x90170120},
9948 		{0x18, 0x02a11030},
9949 		{0x19, 0x02a1103f},
9950 		{0x21, 0x0221101f}),
9951 	{}
9952 };
9953 
9954 /* This is the fallback pin_fixup_tbl for alc269 family, to make the tbl match
9955  * more machines, don't need to match all valid pins, just need to match
9956  * all the pins defined in the tbl. Just because of this reason, it is possible
9957  * that a single machine matches multiple tbls, so there is one limitation:
9958  *   at most one tbl is allowed to define for the same vendor and same codec
9959  */
9960 static const struct snd_hda_pin_quirk alc269_fallback_pin_fixup_tbl[] = {
9961 	SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
9962 		{0x19, 0x40000000},
9963 		{0x1b, 0x40000000}),
9964 	SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
9965 		{0x19, 0x40000000},
9966 		{0x1b, 0x40000000}),
9967 	SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9968 		{0x19, 0x40000000},
9969 		{0x1a, 0x40000000}),
9970 	SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9971 		{0x19, 0x40000000},
9972 		{0x1a, 0x40000000}),
9973 	SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
9974 		{0x19, 0x40000000},
9975 		{0x1a, 0x40000000}),
9976 	{}
9977 };
9978 
alc269_fill_coef(struct hda_codec *codec)9979 static void alc269_fill_coef(struct hda_codec *codec)
9980 {
9981 	struct alc_spec *spec = codec->spec;
9982 	int val;
9983 
9984 	if (spec->codec_variant != ALC269_TYPE_ALC269VB)
9985 		return;
9986 
9987 	if ((alc_get_coef0(codec) & 0x00ff) < 0x015) {
9988 		alc_write_coef_idx(codec, 0xf, 0x960b);
9989 		alc_write_coef_idx(codec, 0xe, 0x8817);
9990 	}
9991 
9992 	if ((alc_get_coef0(codec) & 0x00ff) == 0x016) {
9993 		alc_write_coef_idx(codec, 0xf, 0x960b);
9994 		alc_write_coef_idx(codec, 0xe, 0x8814);
9995 	}
9996 
9997 	if ((alc_get_coef0(codec) & 0x00ff) == 0x017) {
9998 		/* Power up output pin */
9999 		alc_update_coef_idx(codec, 0x04, 0, 1<<11);
10000 	}
10001 
10002 	if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {
10003 		val = alc_read_coef_idx(codec, 0xd);
10004 		if (val != -1 && (val & 0x0c00) >> 10 != 0x1) {
10005 			/* Capless ramp up clock control */
10006 			alc_write_coef_idx(codec, 0xd, val | (1<<10));
10007 		}
10008 		val = alc_read_coef_idx(codec, 0x17);
10009 		if (val != -1 && (val & 0x01c0) >> 6 != 0x4) {
10010 			/* Class D power on reset */
10011 			alc_write_coef_idx(codec, 0x17, val | (1<<7));
10012 		}
10013 	}
10014 
10015 	/* HP */
10016 	alc_update_coef_idx(codec, 0x4, 0, 1<<11);
10017 }
10018 
10019 /*
10020  */
patch_alc269(struct hda_codec *codec)10021 static int patch_alc269(struct hda_codec *codec)
10022 {
10023 	struct alc_spec *spec;
10024 	int err;
10025 
10026 	err = alc_alloc_spec(codec, 0x0b);
10027 	if (err < 0)
10028 		return err;
10029 
10030 	spec = codec->spec;
10031 	spec->gen.shared_mic_vref_pin = 0x18;
10032 	codec->power_save_node = 0;
10033 	spec->en_3kpull_low = true;
10034 
10035 #ifdef CONFIG_PM
10036 	codec->patch_ops.suspend = alc269_suspend;
10037 	codec->patch_ops.resume = alc269_resume;
10038 #endif
10039 	spec->shutup = alc_default_shutup;
10040 	spec->init_hook = alc_default_init;
10041 
10042 	switch (codec->core.vendor_id) {
10043 	case 0x10ec0269:
10044 		spec->codec_variant = ALC269_TYPE_ALC269VA;
10045 		switch (alc_get_coef0(codec) & 0x00f0) {
10046 		case 0x0010:
10047 			if (codec->bus->pci &&
10048 			    codec->bus->pci->subsystem_vendor == 0x1025 &&
10049 			    spec->cdefine.platform_type == 1)
10050 				err = alc_codec_rename(codec, "ALC271X");
10051 			spec->codec_variant = ALC269_TYPE_ALC269VB;
10052 			break;
10053 		case 0x0020:
10054 			if (codec->bus->pci &&
10055 			    codec->bus->pci->subsystem_vendor == 0x17aa &&
10056 			    codec->bus->pci->subsystem_device == 0x21f3)
10057 				err = alc_codec_rename(codec, "ALC3202");
10058 			spec->codec_variant = ALC269_TYPE_ALC269VC;
10059 			break;
10060 		case 0x0030:
10061 			spec->codec_variant = ALC269_TYPE_ALC269VD;
10062 			break;
10063 		default:
10064 			alc_fix_pll_init(codec, 0x20, 0x04, 15);
10065 		}
10066 		if (err < 0)
10067 			goto error;
10068 		spec->shutup = alc269_shutup;
10069 		spec->init_hook = alc269_fill_coef;
10070 		alc269_fill_coef(codec);
10071 		break;
10072 
10073 	case 0x10ec0280:
10074 	case 0x10ec0290:
10075 		spec->codec_variant = ALC269_TYPE_ALC280;
10076 		break;
10077 	case 0x10ec0282:
10078 		spec->codec_variant = ALC269_TYPE_ALC282;
10079 		spec->shutup = alc282_shutup;
10080 		spec->init_hook = alc282_init;
10081 		break;
10082 	case 0x10ec0233:
10083 	case 0x10ec0283:
10084 		spec->codec_variant = ALC269_TYPE_ALC283;
10085 		spec->shutup = alc283_shutup;
10086 		spec->init_hook = alc283_init;
10087 		break;
10088 	case 0x10ec0284:
10089 	case 0x10ec0292:
10090 		spec->codec_variant = ALC269_TYPE_ALC284;
10091 		break;
10092 	case 0x10ec0293:
10093 		spec->codec_variant = ALC269_TYPE_ALC293;
10094 		break;
10095 	case 0x10ec0286:
10096 	case 0x10ec0288:
10097 		spec->codec_variant = ALC269_TYPE_ALC286;
10098 		break;
10099 	case 0x10ec0298:
10100 		spec->codec_variant = ALC269_TYPE_ALC298;
10101 		break;
10102 	case 0x10ec0235:
10103 	case 0x10ec0255:
10104 		spec->codec_variant = ALC269_TYPE_ALC255;
10105 		spec->shutup = alc256_shutup;
10106 		spec->init_hook = alc256_init;
10107 		break;
10108 	case 0x10ec0230:
10109 	case 0x10ec0236:
10110 	case 0x10ec0256:
10111 	case 0x19e58326:
10112 		spec->codec_variant = ALC269_TYPE_ALC256;
10113 		spec->shutup = alc256_shutup;
10114 		spec->init_hook = alc256_init;
10115 		spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */
10116 		if (codec->core.vendor_id == 0x10ec0236 &&
10117 		    codec->bus->pci->vendor != PCI_VENDOR_ID_AMD)
10118 			spec->en_3kpull_low = false;
10119 		break;
10120 	case 0x10ec0257:
10121 		spec->codec_variant = ALC269_TYPE_ALC257;
10122 		spec->shutup = alc256_shutup;
10123 		spec->init_hook = alc256_init;
10124 		spec->gen.mixer_nid = 0;
10125 		spec->en_3kpull_low = false;
10126 		break;
10127 	case 0x10ec0215:
10128 	case 0x10ec0245:
10129 	case 0x10ec0285:
10130 	case 0x10ec0287:
10131 	case 0x10ec0289:
10132 		spec->codec_variant = ALC269_TYPE_ALC215;
10133 		spec->shutup = alc225_shutup;
10134 		spec->init_hook = alc225_init;
10135 		spec->gen.mixer_nid = 0;
10136 		break;
10137 	case 0x10ec0225:
10138 	case 0x10ec0295:
10139 	case 0x10ec0299:
10140 		spec->codec_variant = ALC269_TYPE_ALC225;
10141 		spec->shutup = alc225_shutup;
10142 		spec->init_hook = alc225_init;
10143 		spec->gen.mixer_nid = 0; /* no loopback on ALC225, ALC295 and ALC299 */
10144 		break;
10145 	case 0x10ec0234:
10146 	case 0x10ec0274:
10147 	case 0x10ec0294:
10148 		spec->codec_variant = ALC269_TYPE_ALC294;
10149 		spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */
10150 		alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */
10151 		spec->init_hook = alc294_init;
10152 		break;
10153 	case 0x10ec0300:
10154 		spec->codec_variant = ALC269_TYPE_ALC300;
10155 		spec->gen.mixer_nid = 0; /* no loopback on ALC300 */
10156 		break;
10157 	case 0x10ec0623:
10158 		spec->codec_variant = ALC269_TYPE_ALC623;
10159 		break;
10160 	case 0x10ec0700:
10161 	case 0x10ec0701:
10162 	case 0x10ec0703:
10163 	case 0x10ec0711:
10164 		spec->codec_variant = ALC269_TYPE_ALC700;
10165 		spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */
10166 		alc_update_coef_idx(codec, 0x4a, 1 << 15, 0); /* Combo jack auto trigger control */
10167 		spec->init_hook = alc294_init;
10168 		break;
10169 
10170 	}
10171 
10172 	if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) {
10173 		spec->has_alc5505_dsp = 1;
10174 		spec->init_hook = alc5505_dsp_init;
10175 	}
10176 
10177 	alc_pre_init(codec);
10178 
10179 	snd_hda_pick_fixup(codec, alc269_fixup_models,
10180 		       alc269_fixup_tbl, alc269_fixups);
10181 	/* FIXME: both TX300 and ROG Strix G17 have the same SSID, and
10182 	 * the quirk breaks the latter (bko#214101).
10183 	 * Clear the wrong entry.
10184 	 */
10185 	if (codec->fixup_id == ALC282_FIXUP_ASUS_TX300 &&
10186 	    codec->core.vendor_id == 0x10ec0294) {
10187 		codec_dbg(codec, "Clear wrong fixup for ASUS ROG Strix G17\n");
10188 		codec->fixup_id = HDA_FIXUP_ID_NOT_SET;
10189 	}
10190 
10191 	snd_hda_pick_pin_fixup(codec, alc269_pin_fixup_tbl, alc269_fixups, true);
10192 	snd_hda_pick_pin_fixup(codec, alc269_fallback_pin_fixup_tbl, alc269_fixups, false);
10193 	snd_hda_pick_fixup(codec, NULL,	alc269_fixup_vendor_tbl,
10194 			   alc269_fixups);
10195 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
10196 
10197 	alc_auto_parse_customize_define(codec);
10198 
10199 	if (has_cdefine_beep(codec))
10200 		spec->gen.beep_nid = 0x01;
10201 
10202 	/* automatic parse from the BIOS config */
10203 	err = alc269_parse_auto_config(codec);
10204 	if (err < 0)
10205 		goto error;
10206 
10207 	if (!spec->gen.no_analog && spec->gen.beep_nid && spec->gen.mixer_nid) {
10208 		err = set_beep_amp(spec, spec->gen.mixer_nid, 0x04, HDA_INPUT);
10209 		if (err < 0)
10210 			goto error;
10211 	}
10212 
10213 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
10214 
10215 	return 0;
10216 
10217  error:
10218 	alc_free(codec);
10219 	return err;
10220 }
10221 
10222 /*
10223  * ALC861
10224  */
10225 
alc861_parse_auto_config(struct hda_codec *codec)10226 static int alc861_parse_auto_config(struct hda_codec *codec)
10227 {
10228 	static const hda_nid_t alc861_ignore[] = { 0x1d, 0 };
10229 	static const hda_nid_t alc861_ssids[] = { 0x0e, 0x0f, 0x0b, 0 };
10230 	return alc_parse_auto_config(codec, alc861_ignore, alc861_ssids);
10231 }
10232 
10233 /* Pin config fixes */
10234 enum {
10235 	ALC861_FIXUP_FSC_AMILO_PI1505,
10236 	ALC861_FIXUP_AMP_VREF_0F,
10237 	ALC861_FIXUP_NO_JACK_DETECT,
10238 	ALC861_FIXUP_ASUS_A6RP,
10239 	ALC660_FIXUP_ASUS_W7J,
10240 };
10241 
10242 /* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */
alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec, const struct hda_fixup *fix, int action)10243 static void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec,
10244 			const struct hda_fixup *fix, int action)
10245 {
10246 	struct alc_spec *spec = codec->spec;
10247 	unsigned int val;
10248 
10249 	if (action != HDA_FIXUP_ACT_INIT)
10250 		return;
10251 	val = snd_hda_codec_get_pin_target(codec, 0x0f);
10252 	if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)))
10253 		val |= AC_PINCTL_IN_EN;
10254 	val |= AC_PINCTL_VREF_50;
10255 	snd_hda_set_pin_ctl(codec, 0x0f, val);
10256 	spec->gen.keep_vref_in_automute = 1;
10257 }
10258 
10259 /* suppress the jack-detection */
alc_fixup_no_jack_detect(struct hda_codec *codec, const struct hda_fixup *fix, int action)10260 static void alc_fixup_no_jack_detect(struct hda_codec *codec,
10261 				     const struct hda_fixup *fix, int action)
10262 {
10263 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
10264 		codec->no_jack_detect = 1;
10265 }
10266 
10267 static const struct hda_fixup alc861_fixups[] = {
10268 	[ALC861_FIXUP_FSC_AMILO_PI1505] = {
10269 		.type = HDA_FIXUP_PINS,
10270 		.v.pins = (const struct hda_pintbl[]) {
10271 			{ 0x0b, 0x0221101f }, /* HP */
10272 			{ 0x0f, 0x90170310 }, /* speaker */
10273 			{ }
10274 		}
10275 	},
10276 	[ALC861_FIXUP_AMP_VREF_0F] = {
10277 		.type = HDA_FIXUP_FUNC,
10278 		.v.func = alc861_fixup_asus_amp_vref_0f,
10279 	},
10280 	[ALC861_FIXUP_NO_JACK_DETECT] = {
10281 		.type = HDA_FIXUP_FUNC,
10282 		.v.func = alc_fixup_no_jack_detect,
10283 	},
10284 	[ALC861_FIXUP_ASUS_A6RP] = {
10285 		.type = HDA_FIXUP_FUNC,
10286 		.v.func = alc861_fixup_asus_amp_vref_0f,
10287 		.chained = true,
10288 		.chain_id = ALC861_FIXUP_NO_JACK_DETECT,
10289 	},
10290 	[ALC660_FIXUP_ASUS_W7J] = {
10291 		.type = HDA_FIXUP_VERBS,
10292 		.v.verbs = (const struct hda_verb[]) {
10293 			/* ASUS W7J needs a magic pin setup on unused NID 0x10
10294 			 * for enabling outputs
10295 			 */
10296 			{0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
10297 			{ }
10298 		},
10299 	}
10300 };
10301 
10302 static const struct snd_pci_quirk alc861_fixup_tbl[] = {
10303 	SND_PCI_QUIRK(0x1043, 0x1253, "ASUS W7J", ALC660_FIXUP_ASUS_W7J),
10304 	SND_PCI_QUIRK(0x1043, 0x1263, "ASUS Z35HL", ALC660_FIXUP_ASUS_W7J),
10305 	SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP),
10306 	SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", ALC861_FIXUP_AMP_VREF_0F),
10307 	SND_PCI_QUIRK(0x1462, 0x7254, "HP DX2200", ALC861_FIXUP_NO_JACK_DETECT),
10308 	SND_PCI_QUIRK_VENDOR(0x1584, "Haier/Uniwill", ALC861_FIXUP_AMP_VREF_0F),
10309 	SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", ALC861_FIXUP_FSC_AMILO_PI1505),
10310 	{}
10311 };
10312 
10313 /*
10314  */
patch_alc861(struct hda_codec *codec)10315 static int patch_alc861(struct hda_codec *codec)
10316 {
10317 	struct alc_spec *spec;
10318 	int err;
10319 
10320 	err = alc_alloc_spec(codec, 0x15);
10321 	if (err < 0)
10322 		return err;
10323 
10324 	spec = codec->spec;
10325 	if (has_cdefine_beep(codec))
10326 		spec->gen.beep_nid = 0x23;
10327 
10328 #ifdef CONFIG_PM
10329 	spec->power_hook = alc_power_eapd;
10330 #endif
10331 
10332 	alc_pre_init(codec);
10333 
10334 	snd_hda_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);
10335 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
10336 
10337 	/* automatic parse from the BIOS config */
10338 	err = alc861_parse_auto_config(codec);
10339 	if (err < 0)
10340 		goto error;
10341 
10342 	if (!spec->gen.no_analog) {
10343 		err = set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
10344 		if (err < 0)
10345 			goto error;
10346 	}
10347 
10348 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
10349 
10350 	return 0;
10351 
10352  error:
10353 	alc_free(codec);
10354 	return err;
10355 }
10356 
10357 /*
10358  * ALC861-VD support
10359  *
10360  * Based on ALC882
10361  *
10362  * In addition, an independent DAC
10363  */
alc861vd_parse_auto_config(struct hda_codec *codec)10364 static int alc861vd_parse_auto_config(struct hda_codec *codec)
10365 {
10366 	static const hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
10367 	static const hda_nid_t alc861vd_ssids[] = { 0x15, 0x1b, 0x14, 0 };
10368 	return alc_parse_auto_config(codec, alc861vd_ignore, alc861vd_ssids);
10369 }
10370 
10371 enum {
10372 	ALC660VD_FIX_ASUS_GPIO1,
10373 	ALC861VD_FIX_DALLAS,
10374 };
10375 
10376 /* exclude VREF80 */
alc861vd_fixup_dallas(struct hda_codec *codec, const struct hda_fixup *fix, int action)10377 static void alc861vd_fixup_dallas(struct hda_codec *codec,
10378 				  const struct hda_fixup *fix, int action)
10379 {
10380 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
10381 		snd_hda_override_pin_caps(codec, 0x18, 0x00000734);
10382 		snd_hda_override_pin_caps(codec, 0x19, 0x0000073c);
10383 	}
10384 }
10385 
10386 /* reset GPIO1 */
alc660vd_fixup_asus_gpio1(struct hda_codec *codec, const struct hda_fixup *fix, int action)10387 static void alc660vd_fixup_asus_gpio1(struct hda_codec *codec,
10388 				      const struct hda_fixup *fix, int action)
10389 {
10390 	struct alc_spec *spec = codec->spec;
10391 
10392 	if (action == HDA_FIXUP_ACT_PRE_PROBE)
10393 		spec->gpio_mask |= 0x02;
10394 	alc_fixup_gpio(codec, action, 0x01);
10395 }
10396 
10397 static const struct hda_fixup alc861vd_fixups[] = {
10398 	[ALC660VD_FIX_ASUS_GPIO1] = {
10399 		.type = HDA_FIXUP_FUNC,
10400 		.v.func = alc660vd_fixup_asus_gpio1,
10401 	},
10402 	[ALC861VD_FIX_DALLAS] = {
10403 		.type = HDA_FIXUP_FUNC,
10404 		.v.func = alc861vd_fixup_dallas,
10405 	},
10406 };
10407 
10408 static const struct snd_pci_quirk alc861vd_fixup_tbl[] = {
10409 	SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_FIX_DALLAS),
10410 	SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
10411 	SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_FIX_DALLAS),
10412 	{}
10413 };
10414 
10415 /*
10416  */
patch_alc861vd(struct hda_codec *codec)10417 static int patch_alc861vd(struct hda_codec *codec)
10418 {
10419 	struct alc_spec *spec;
10420 	int err;
10421 
10422 	err = alc_alloc_spec(codec, 0x0b);
10423 	if (err < 0)
10424 		return err;
10425 
10426 	spec = codec->spec;
10427 	if (has_cdefine_beep(codec))
10428 		spec->gen.beep_nid = 0x23;
10429 
10430 	spec->shutup = alc_eapd_shutup;
10431 
10432 	alc_pre_init(codec);
10433 
10434 	snd_hda_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);
10435 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
10436 
10437 	/* automatic parse from the BIOS config */
10438 	err = alc861vd_parse_auto_config(codec);
10439 	if (err < 0)
10440 		goto error;
10441 
10442 	if (!spec->gen.no_analog) {
10443 		err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
10444 		if (err < 0)
10445 			goto error;
10446 	}
10447 
10448 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
10449 
10450 	return 0;
10451 
10452  error:
10453 	alc_free(codec);
10454 	return err;
10455 }
10456 
10457 /*
10458  * ALC662 support
10459  *
10460  * ALC662 is almost identical with ALC880 but has cleaner and more flexible
10461  * configuration.  Each pin widget can choose any input DACs and a mixer.
10462  * Each ADC is connected from a mixer of all inputs.  This makes possible
10463  * 6-channel independent captures.
10464  *
10465  * In addition, an independent DAC for the multi-playback (not used in this
10466  * driver yet).
10467  */
10468 
10469 /*
10470  * BIOS auto configuration
10471  */
10472 
alc662_parse_auto_config(struct hda_codec *codec)10473 static int alc662_parse_auto_config(struct hda_codec *codec)
10474 {
10475 	static const hda_nid_t alc662_ignore[] = { 0x1d, 0 };
10476 	static const hda_nid_t alc663_ssids[] = { 0x15, 0x1b, 0x14, 0x21 };
10477 	static const hda_nid_t alc662_ssids[] = { 0x15, 0x1b, 0x14, 0 };
10478 	const hda_nid_t *ssids;
10479 
10480 	if (codec->core.vendor_id == 0x10ec0272 || codec->core.vendor_id == 0x10ec0663 ||
10481 	    codec->core.vendor_id == 0x10ec0665 || codec->core.vendor_id == 0x10ec0670 ||
10482 	    codec->core.vendor_id == 0x10ec0671)
10483 		ssids = alc663_ssids;
10484 	else
10485 		ssids = alc662_ssids;
10486 	return alc_parse_auto_config(codec, alc662_ignore, ssids);
10487 }
10488 
alc272_fixup_mario(struct hda_codec *codec, const struct hda_fixup *fix, int action)10489 static void alc272_fixup_mario(struct hda_codec *codec,
10490 			       const struct hda_fixup *fix, int action)
10491 {
10492 	if (action != HDA_FIXUP_ACT_PRE_PROBE)
10493 		return;
10494 	if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
10495 				      (0x3b << AC_AMPCAP_OFFSET_SHIFT) |
10496 				      (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |
10497 				      (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |
10498 				      (0 << AC_AMPCAP_MUTE_SHIFT)))
10499 		codec_warn(codec, "failed to override amp caps for NID 0x2\n");
10500 }
10501 
10502 static const struct snd_pcm_chmap_elem asus_pcm_2_1_chmaps[] = {
10503 	{ .channels = 2,
10504 	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
10505 	{ .channels = 4,
10506 	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
10507 		   SNDRV_CHMAP_NA, SNDRV_CHMAP_LFE } }, /* LFE only on right */
10508 	{ }
10509 };
10510 
10511 /* override the 2.1 chmap */
alc_fixup_bass_chmap(struct hda_codec *codec, const struct hda_fixup *fix, int action)10512 static void alc_fixup_bass_chmap(struct hda_codec *codec,
10513 				    const struct hda_fixup *fix, int action)
10514 {
10515 	if (action == HDA_FIXUP_ACT_BUILD) {
10516 		struct alc_spec *spec = codec->spec;
10517 		spec->gen.pcm_rec[0]->stream[0].chmap = asus_pcm_2_1_chmaps;
10518 	}
10519 }
10520 
10521 /* avoid D3 for keeping GPIO up */
gpio_led_power_filter(struct hda_codec *codec, hda_nid_t nid, unsigned int power_state)10522 static unsigned int gpio_led_power_filter(struct hda_codec *codec,
10523 					  hda_nid_t nid,
10524 					  unsigned int power_state)
10525 {
10526 	struct alc_spec *spec = codec->spec;
10527 	if (nid == codec->core.afg && power_state == AC_PWRST_D3 && spec->gpio_data)
10528 		return AC_PWRST_D0;
10529 	return power_state;
10530 }
10531 
alc662_fixup_led_gpio1(struct hda_codec *codec, const struct hda_fixup *fix, int action)10532 static void alc662_fixup_led_gpio1(struct hda_codec *codec,
10533 				   const struct hda_fixup *fix, int action)
10534 {
10535 	struct alc_spec *spec = codec->spec;
10536 
10537 	alc_fixup_hp_gpio_led(codec, action, 0x01, 0);
10538 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
10539 		spec->mute_led_polarity = 1;
10540 		codec->power_filter = gpio_led_power_filter;
10541 	}
10542 }
10543 
alc662_usi_automute_hook(struct hda_codec *codec, struct hda_jack_callback *jack)10544 static void alc662_usi_automute_hook(struct hda_codec *codec,
10545 					 struct hda_jack_callback *jack)
10546 {
10547 	struct alc_spec *spec = codec->spec;
10548 	int vref;
10549 	msleep(200);
10550 	snd_hda_gen_hp_automute(codec, jack);
10551 
10552 	vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
10553 	msleep(100);
10554 	snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
10555 			    vref);
10556 }
10557 
alc662_fixup_usi_headset_mic(struct hda_codec *codec, const struct hda_fixup *fix, int action)10558 static void alc662_fixup_usi_headset_mic(struct hda_codec *codec,
10559 				     const struct hda_fixup *fix, int action)
10560 {
10561 	struct alc_spec *spec = codec->spec;
10562 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
10563 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
10564 		spec->gen.hp_automute_hook = alc662_usi_automute_hook;
10565 	}
10566 }
10567 
alc662_aspire_ethos_mute_speakers(struct hda_codec *codec, struct hda_jack_callback *cb)10568 static void alc662_aspire_ethos_mute_speakers(struct hda_codec *codec,
10569 					struct hda_jack_callback *cb)
10570 {
10571 	/* surround speakers at 0x1b already get muted automatically when
10572 	 * headphones are plugged in, but we have to mute/unmute the remaining
10573 	 * channels manually:
10574 	 * 0x15 - front left/front right
10575 	 * 0x18 - front center/ LFE
10576 	 */
10577 	if (snd_hda_jack_detect_state(codec, 0x1b) == HDA_JACK_PRESENT) {
10578 		snd_hda_set_pin_ctl_cache(codec, 0x15, 0);
10579 		snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
10580 	} else {
10581 		snd_hda_set_pin_ctl_cache(codec, 0x15, PIN_OUT);
10582 		snd_hda_set_pin_ctl_cache(codec, 0x18, PIN_OUT);
10583 	}
10584 }
10585 
alc662_fixup_aspire_ethos_hp(struct hda_codec *codec, const struct hda_fixup *fix, int action)10586 static void alc662_fixup_aspire_ethos_hp(struct hda_codec *codec,
10587 					const struct hda_fixup *fix, int action)
10588 {
10589     /* Pin 0x1b: shared headphones jack and surround speakers */
10590 	if (!is_jack_detectable(codec, 0x1b))
10591 		return;
10592 
10593 	switch (action) {
10594 	case HDA_FIXUP_ACT_PRE_PROBE:
10595 		snd_hda_jack_detect_enable_callback(codec, 0x1b,
10596 				alc662_aspire_ethos_mute_speakers);
10597 		/* subwoofer needs an extra GPIO setting to become audible */
10598 		alc_setup_gpio(codec, 0x02);
10599 		break;
10600 	case HDA_FIXUP_ACT_INIT:
10601 		/* Make sure to start in a correct state, i.e. if
10602 		 * headphones have been plugged in before powering up the system
10603 		 */
10604 		alc662_aspire_ethos_mute_speakers(codec, NULL);
10605 		break;
10606 	}
10607 }
10608 
alc671_fixup_hp_headset_mic2(struct hda_codec *codec, const struct hda_fixup *fix, int action)10609 static void alc671_fixup_hp_headset_mic2(struct hda_codec *codec,
10610 					     const struct hda_fixup *fix, int action)
10611 {
10612 	struct alc_spec *spec = codec->spec;
10613 
10614 	static const struct hda_pintbl pincfgs[] = {
10615 		{ 0x19, 0x02a11040 }, /* use as headset mic, with its own jack detect */
10616 		{ 0x1b, 0x0181304f },
10617 		{ }
10618 	};
10619 
10620 	switch (action) {
10621 	case HDA_FIXUP_ACT_PRE_PROBE:
10622 		spec->gen.mixer_nid = 0;
10623 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
10624 		snd_hda_apply_pincfgs(codec, pincfgs);
10625 		break;
10626 	case HDA_FIXUP_ACT_INIT:
10627 		alc_write_coef_idx(codec, 0x19, 0xa054);
10628 		break;
10629 	}
10630 }
10631 
alc897_hp_automute_hook(struct hda_codec *codec, struct hda_jack_callback *jack)10632 static void alc897_hp_automute_hook(struct hda_codec *codec,
10633 					 struct hda_jack_callback *jack)
10634 {
10635 	struct alc_spec *spec = codec->spec;
10636 	int vref;
10637 
10638 	snd_hda_gen_hp_automute(codec, jack);
10639 	vref = spec->gen.hp_jack_present ? (PIN_HP | AC_PINCTL_VREF_100) : PIN_HP;
10640 	snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
10641 			    vref);
10642 }
10643 
alc897_fixup_lenovo_headset_mic(struct hda_codec *codec, const struct hda_fixup *fix, int action)10644 static void alc897_fixup_lenovo_headset_mic(struct hda_codec *codec,
10645 				     const struct hda_fixup *fix, int action)
10646 {
10647 	struct alc_spec *spec = codec->spec;
10648 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
10649 		spec->gen.hp_automute_hook = alc897_hp_automute_hook;
10650 	}
10651 }
10652 
alc897_fixup_lenovo_headset_mode(struct hda_codec *codec, const struct hda_fixup *fix, int action)10653 static void alc897_fixup_lenovo_headset_mode(struct hda_codec *codec,
10654 				     const struct hda_fixup *fix, int action)
10655 {
10656 	struct alc_spec *spec = codec->spec;
10657 
10658 	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
10659 		spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
10660 		spec->gen.hp_automute_hook = alc897_hp_automute_hook;
10661 	}
10662 }
10663 
10664 static const struct coef_fw alc668_coefs[] = {
10665 	WRITE_COEF(0x01, 0xbebe), WRITE_COEF(0x02, 0xaaaa), WRITE_COEF(0x03,    0x0),
10666 	WRITE_COEF(0x04, 0x0180), WRITE_COEF(0x06,    0x0), WRITE_COEF(0x07, 0x0f80),
10667 	WRITE_COEF(0x08, 0x0031), WRITE_COEF(0x0a, 0x0060), WRITE_COEF(0x0b,    0x0),
10668 	WRITE_COEF(0x0c, 0x7cf7), WRITE_COEF(0x0d, 0x1080), WRITE_COEF(0x0e, 0x7f7f),
10669 	WRITE_COEF(0x0f, 0xcccc), WRITE_COEF(0x10, 0xddcc), WRITE_COEF(0x11, 0x0001),
10670 	WRITE_COEF(0x13,    0x0), WRITE_COEF(0x14, 0x2aa0), WRITE_COEF(0x17, 0xa940),
10671 	WRITE_COEF(0x19,    0x0), WRITE_COEF(0x1a,    0x0), WRITE_COEF(0x1b,    0x0),
10672 	WRITE_COEF(0x1c,    0x0), WRITE_COEF(0x1d,    0x0), WRITE_COEF(0x1e, 0x7418),
10673 	WRITE_COEF(0x1f, 0x0804), WRITE_COEF(0x20, 0x4200), WRITE_COEF(0x21, 0x0468),
10674 	WRITE_COEF(0x22, 0x8ccc), WRITE_COEF(0x23, 0x0250), WRITE_COEF(0x24, 0x7418),
10675 	WRITE_COEF(0x27,    0x0), WRITE_COEF(0x28, 0x8ccc), WRITE_COEF(0x2a, 0xff00),
10676 	WRITE_COEF(0x2b, 0x8000), WRITE_COEF(0xa7, 0xff00), WRITE_COEF(0xa8, 0x8000),
10677 	WRITE_COEF(0xaa, 0x2e17), WRITE_COEF(0xab, 0xa0c0), WRITE_COEF(0xac,    0x0),
10678 	WRITE_COEF(0xad,    0x0), WRITE_COEF(0xae, 0x2ac6), WRITE_COEF(0xaf, 0xa480),
10679 	WRITE_COEF(0xb0,    0x0), WRITE_COEF(0xb1,    0x0), WRITE_COEF(0xb2,    0x0),
10680 	WRITE_COEF(0xb3,    0x0), WRITE_COEF(0xb4,    0x0), WRITE_COEF(0xb5, 0x1040),
10681 	WRITE_COEF(0xb6, 0xd697), WRITE_COEF(0xb7, 0x902b), WRITE_COEF(0xb8, 0xd697),
10682 	WRITE_COEF(0xb9, 0x902b), WRITE_COEF(0xba, 0xb8ba), WRITE_COEF(0xbb, 0xaaab),
10683 	WRITE_COEF(0xbc, 0xaaaf), WRITE_COEF(0xbd, 0x6aaa), WRITE_COEF(0xbe, 0x1c02),
10684 	WRITE_COEF(0xc0, 0x00ff), WRITE_COEF(0xc1, 0x0fa6),
10685 	{}
10686 };
10687 
alc668_restore_default_value(struct hda_codec *codec)10688 static void alc668_restore_default_value(struct hda_codec *codec)
10689 {
10690 	alc_process_coef_fw(codec, alc668_coefs);
10691 }
10692 
10693 enum {
10694 	ALC662_FIXUP_ASPIRE,
10695 	ALC662_FIXUP_LED_GPIO1,
10696 	ALC662_FIXUP_IDEAPAD,
10697 	ALC272_FIXUP_MARIO,
10698 	ALC662_FIXUP_CZC_ET26,
10699 	ALC662_FIXUP_CZC_P10T,
10700 	ALC662_FIXUP_SKU_IGNORE,
10701 	ALC662_FIXUP_HP_RP5800,
10702 	ALC662_FIXUP_ASUS_MODE1,
10703 	ALC662_FIXUP_ASUS_MODE2,
10704 	ALC662_FIXUP_ASUS_MODE3,
10705 	ALC662_FIXUP_ASUS_MODE4,
10706 	ALC662_FIXUP_ASUS_MODE5,
10707 	ALC662_FIXUP_ASUS_MODE6,
10708 	ALC662_FIXUP_ASUS_MODE7,
10709 	ALC662_FIXUP_ASUS_MODE8,
10710 	ALC662_FIXUP_NO_JACK_DETECT,
10711 	ALC662_FIXUP_ZOTAC_Z68,
10712 	ALC662_FIXUP_INV_DMIC,
10713 	ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
10714 	ALC668_FIXUP_DELL_MIC_NO_PRESENCE,
10715 	ALC662_FIXUP_HEADSET_MODE,
10716 	ALC668_FIXUP_HEADSET_MODE,
10717 	ALC662_FIXUP_BASS_MODE4_CHMAP,
10718 	ALC662_FIXUP_BASS_16,
10719 	ALC662_FIXUP_BASS_1A,
10720 	ALC662_FIXUP_BASS_CHMAP,
10721 	ALC668_FIXUP_AUTO_MUTE,
10722 	ALC668_FIXUP_DELL_DISABLE_AAMIX,
10723 	ALC668_FIXUP_DELL_XPS13,
10724 	ALC662_FIXUP_ASUS_Nx50,
10725 	ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
10726 	ALC668_FIXUP_ASUS_Nx51,
10727 	ALC668_FIXUP_MIC_COEF,
10728 	ALC668_FIXUP_ASUS_G751,
10729 	ALC891_FIXUP_HEADSET_MODE,
10730 	ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
10731 	ALC662_FIXUP_ACER_VERITON,
10732 	ALC892_FIXUP_ASROCK_MOBO,
10733 	ALC662_FIXUP_USI_FUNC,
10734 	ALC662_FIXUP_USI_HEADSET_MODE,
10735 	ALC662_FIXUP_LENOVO_MULTI_CODECS,
10736 	ALC669_FIXUP_ACER_ASPIRE_ETHOS,
10737 	ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET,
10738 	ALC671_FIXUP_HP_HEADSET_MIC2,
10739 	ALC662_FIXUP_ACER_X2660G_HEADSET_MODE,
10740 	ALC662_FIXUP_ACER_NITRO_HEADSET_MODE,
10741 	ALC668_FIXUP_ASUS_NO_HEADSET_MIC,
10742 	ALC668_FIXUP_HEADSET_MIC,
10743 	ALC668_FIXUP_MIC_DET_COEF,
10744 	ALC897_FIXUP_LENOVO_HEADSET_MIC,
10745 	ALC897_FIXUP_HEADSET_MIC_PIN,
10746 	ALC897_FIXUP_HP_HSMIC_VERB,
10747 	ALC897_FIXUP_LENOVO_HEADSET_MODE,
10748 	ALC897_FIXUP_HEADSET_MIC_PIN2,
10749 	ALC897_FIXUP_UNIS_H3C_X500S,
10750 };
10751 
10752 static const struct hda_fixup alc662_fixups[] = {
10753 	[ALC662_FIXUP_ASPIRE] = {
10754 		.type = HDA_FIXUP_PINS,
10755 		.v.pins = (const struct hda_pintbl[]) {
10756 			{ 0x15, 0x99130112 }, /* subwoofer */
10757 			{ }
10758 		}
10759 	},
10760 	[ALC662_FIXUP_LED_GPIO1] = {
10761 		.type = HDA_FIXUP_FUNC,
10762 		.v.func = alc662_fixup_led_gpio1,
10763 	},
10764 	[ALC662_FIXUP_IDEAPAD] = {
10765 		.type = HDA_FIXUP_PINS,
10766 		.v.pins = (const struct hda_pintbl[]) {
10767 			{ 0x17, 0x99130112 }, /* subwoofer */
10768 			{ }
10769 		},
10770 		.chained = true,
10771 		.chain_id = ALC662_FIXUP_LED_GPIO1,
10772 	},
10773 	[ALC272_FIXUP_MARIO] = {
10774 		.type = HDA_FIXUP_FUNC,
10775 		.v.func = alc272_fixup_mario,
10776 	},
10777 	[ALC662_FIXUP_CZC_ET26] = {
10778 		.type = HDA_FIXUP_PINS,
10779 		.v.pins = (const struct hda_pintbl[]) {
10780 			{0x12, 0x403cc000},
10781 			{0x14, 0x90170110}, /* speaker */
10782 			{0x15, 0x411111f0},
10783 			{0x16, 0x411111f0},
10784 			{0x18, 0x01a19030}, /* mic */
10785 			{0x19, 0x90a7013f}, /* int-mic */
10786 			{0x1a, 0x01014020},
10787 			{0x1b, 0x0121401f},
10788 			{0x1c, 0x411111f0},
10789 			{0x1d, 0x411111f0},
10790 			{0x1e, 0x40478e35},
10791 			{}
10792 		},
10793 		.chained = true,
10794 		.chain_id = ALC662_FIXUP_SKU_IGNORE
10795 	},
10796 	[ALC662_FIXUP_CZC_P10T] = {
10797 		.type = HDA_FIXUP_VERBS,
10798 		.v.verbs = (const struct hda_verb[]) {
10799 			{0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
10800 			{}
10801 		}
10802 	},
10803 	[ALC662_FIXUP_SKU_IGNORE] = {
10804 		.type = HDA_FIXUP_FUNC,
10805 		.v.func = alc_fixup_sku_ignore,
10806 	},
10807 	[ALC662_FIXUP_HP_RP5800] = {
10808 		.type = HDA_FIXUP_PINS,
10809 		.v.pins = (const struct hda_pintbl[]) {
10810 			{ 0x14, 0x0221201f }, /* HP out */
10811 			{ }
10812 		},
10813 		.chained = true,
10814 		.chain_id = ALC662_FIXUP_SKU_IGNORE
10815 	},
10816 	[ALC662_FIXUP_ASUS_MODE1] = {
10817 		.type = HDA_FIXUP_PINS,
10818 		.v.pins = (const struct hda_pintbl[]) {
10819 			{ 0x14, 0x99130110 }, /* speaker */
10820 			{ 0x18, 0x01a19c20 }, /* mic */
10821 			{ 0x19, 0x99a3092f }, /* int-mic */
10822 			{ 0x21, 0x0121401f }, /* HP out */
10823 			{ }
10824 		},
10825 		.chained = true,
10826 		.chain_id = ALC662_FIXUP_SKU_IGNORE
10827 	},
10828 	[ALC662_FIXUP_ASUS_MODE2] = {
10829 		.type = HDA_FIXUP_PINS,
10830 		.v.pins = (const struct hda_pintbl[]) {
10831 			{ 0x14, 0x99130110 }, /* speaker */
10832 			{ 0x18, 0x01a19820 }, /* mic */
10833 			{ 0x19, 0x99a3092f }, /* int-mic */
10834 			{ 0x1b, 0x0121401f }, /* HP out */
10835 			{ }
10836 		},
10837 		.chained = true,
10838 		.chain_id = ALC662_FIXUP_SKU_IGNORE
10839 	},
10840 	[ALC662_FIXUP_ASUS_MODE3] = {
10841 		.type = HDA_FIXUP_PINS,
10842 		.v.pins = (const struct hda_pintbl[]) {
10843 			{ 0x14, 0x99130110 }, /* speaker */
10844 			{ 0x15, 0x0121441f }, /* HP */
10845 			{ 0x18, 0x01a19840 }, /* mic */
10846 			{ 0x19, 0x99a3094f }, /* int-mic */
10847 			{ 0x21, 0x01211420 }, /* HP2 */
10848 			{ }
10849 		},
10850 		.chained = true,
10851 		.chain_id = ALC662_FIXUP_SKU_IGNORE
10852 	},
10853 	[ALC662_FIXUP_ASUS_MODE4] = {
10854 		.type = HDA_FIXUP_PINS,
10855 		.v.pins = (const struct hda_pintbl[]) {
10856 			{ 0x14, 0x99130110 }, /* speaker */
10857 			{ 0x16, 0x99130111 }, /* speaker */
10858 			{ 0x18, 0x01a19840 }, /* mic */
10859 			{ 0x19, 0x99a3094f }, /* int-mic */
10860 			{ 0x21, 0x0121441f }, /* HP */
10861 			{ }
10862 		},
10863 		.chained = true,
10864 		.chain_id = ALC662_FIXUP_SKU_IGNORE
10865 	},
10866 	[ALC662_FIXUP_ASUS_MODE5] = {
10867 		.type = HDA_FIXUP_PINS,
10868 		.v.pins = (const struct hda_pintbl[]) {
10869 			{ 0x14, 0x99130110 }, /* speaker */
10870 			{ 0x15, 0x0121441f }, /* HP */
10871 			{ 0x16, 0x99130111 }, /* speaker */
10872 			{ 0x18, 0x01a19840 }, /* mic */
10873 			{ 0x19, 0x99a3094f }, /* int-mic */
10874 			{ }
10875 		},
10876 		.chained = true,
10877 		.chain_id = ALC662_FIXUP_SKU_IGNORE
10878 	},
10879 	[ALC662_FIXUP_ASUS_MODE6] = {
10880 		.type = HDA_FIXUP_PINS,
10881 		.v.pins = (const struct hda_pintbl[]) {
10882 			{ 0x14, 0x99130110 }, /* speaker */
10883 			{ 0x15, 0x01211420 }, /* HP2 */
10884 			{ 0x18, 0x01a19840 }, /* mic */
10885 			{ 0x19, 0x99a3094f }, /* int-mic */
10886 			{ 0x1b, 0x0121441f }, /* HP */
10887 			{ }
10888 		},
10889 		.chained = true,
10890 		.chain_id = ALC662_FIXUP_SKU_IGNORE
10891 	},
10892 	[ALC662_FIXUP_ASUS_MODE7] = {
10893 		.type = HDA_FIXUP_PINS,
10894 		.v.pins = (const struct hda_pintbl[]) {
10895 			{ 0x14, 0x99130110 }, /* speaker */
10896 			{ 0x17, 0x99130111 }, /* speaker */
10897 			{ 0x18, 0x01a19840 }, /* mic */
10898 			{ 0x19, 0x99a3094f }, /* int-mic */
10899 			{ 0x1b, 0x01214020 }, /* HP */
10900 			{ 0x21, 0x0121401f }, /* HP */
10901 			{ }
10902 		},
10903 		.chained = true,
10904 		.chain_id = ALC662_FIXUP_SKU_IGNORE
10905 	},
10906 	[ALC662_FIXUP_ASUS_MODE8] = {
10907 		.type = HDA_FIXUP_PINS,
10908 		.v.pins = (const struct hda_pintbl[]) {
10909 			{ 0x14, 0x99130110 }, /* speaker */
10910 			{ 0x12, 0x99a30970 }, /* int-mic */
10911 			{ 0x15, 0x01214020 }, /* HP */
10912 			{ 0x17, 0x99130111 }, /* speaker */
10913 			{ 0x18, 0x01a19840 }, /* mic */
10914 			{ 0x21, 0x0121401f }, /* HP */
10915 			{ }
10916 		},
10917 		.chained = true,
10918 		.chain_id = ALC662_FIXUP_SKU_IGNORE
10919 	},
10920 	[ALC662_FIXUP_NO_JACK_DETECT] = {
10921 		.type = HDA_FIXUP_FUNC,
10922 		.v.func = alc_fixup_no_jack_detect,
10923 	},
10924 	[ALC662_FIXUP_ZOTAC_Z68] = {
10925 		.type = HDA_FIXUP_PINS,
10926 		.v.pins = (const struct hda_pintbl[]) {
10927 			{ 0x1b, 0x02214020 }, /* Front HP */
10928 			{ }
10929 		}
10930 	},
10931 	[ALC662_FIXUP_INV_DMIC] = {
10932 		.type = HDA_FIXUP_FUNC,
10933 		.v.func = alc_fixup_inv_dmic,
10934 	},
10935 	[ALC668_FIXUP_DELL_XPS13] = {
10936 		.type = HDA_FIXUP_FUNC,
10937 		.v.func = alc_fixup_dell_xps13,
10938 		.chained = true,
10939 		.chain_id = ALC668_FIXUP_DELL_DISABLE_AAMIX
10940 	},
10941 	[ALC668_FIXUP_DELL_DISABLE_AAMIX] = {
10942 		.type = HDA_FIXUP_FUNC,
10943 		.v.func = alc_fixup_disable_aamix,
10944 		.chained = true,
10945 		.chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
10946 	},
10947 	[ALC668_FIXUP_AUTO_MUTE] = {
10948 		.type = HDA_FIXUP_FUNC,
10949 		.v.func = alc_fixup_auto_mute_via_amp,
10950 		.chained = true,
10951 		.chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
10952 	},
10953 	[ALC662_FIXUP_DELL_MIC_NO_PRESENCE] = {
10954 		.type = HDA_FIXUP_PINS,
10955 		.v.pins = (const struct hda_pintbl[]) {
10956 			{ 0x19, 0x03a1113c }, /* use as headset mic, without its own jack detect */
10957 			/* headphone mic by setting pin control of 0x1b (headphone out) to in + vref_50 */
10958 			{ }
10959 		},
10960 		.chained = true,
10961 		.chain_id = ALC662_FIXUP_HEADSET_MODE
10962 	},
10963 	[ALC662_FIXUP_HEADSET_MODE] = {
10964 		.type = HDA_FIXUP_FUNC,
10965 		.v.func = alc_fixup_headset_mode_alc662,
10966 	},
10967 	[ALC668_FIXUP_DELL_MIC_NO_PRESENCE] = {
10968 		.type = HDA_FIXUP_PINS,
10969 		.v.pins = (const struct hda_pintbl[]) {
10970 			{ 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
10971 			{ 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
10972 			{ }
10973 		},
10974 		.chained = true,
10975 		.chain_id = ALC668_FIXUP_HEADSET_MODE
10976 	},
10977 	[ALC668_FIXUP_HEADSET_MODE] = {
10978 		.type = HDA_FIXUP_FUNC,
10979 		.v.func = alc_fixup_headset_mode_alc668,
10980 	},
10981 	[ALC662_FIXUP_BASS_MODE4_CHMAP] = {
10982 		.type = HDA_FIXUP_FUNC,
10983 		.v.func = alc_fixup_bass_chmap,
10984 		.chained = true,
10985 		.chain_id = ALC662_FIXUP_ASUS_MODE4
10986 	},
10987 	[ALC662_FIXUP_BASS_16] = {
10988 		.type = HDA_FIXUP_PINS,
10989 		.v.pins = (const struct hda_pintbl[]) {
10990 			{0x16, 0x80106111}, /* bass speaker */
10991 			{}
10992 		},
10993 		.chained = true,
10994 		.chain_id = ALC662_FIXUP_BASS_CHMAP,
10995 	},
10996 	[ALC662_FIXUP_BASS_1A] = {
10997 		.type = HDA_FIXUP_PINS,
10998 		.v.pins = (const struct hda_pintbl[]) {
10999 			{0x1a, 0x80106111}, /* bass speaker */
11000 			{}
11001 		},
11002 		.chained = true,
11003 		.chain_id = ALC662_FIXUP_BASS_CHMAP,
11004 	},
11005 	[ALC662_FIXUP_BASS_CHMAP] = {
11006 		.type = HDA_FIXUP_FUNC,
11007 		.v.func = alc_fixup_bass_chmap,
11008 	},
11009 	[ALC662_FIXUP_ASUS_Nx50] = {
11010 		.type = HDA_FIXUP_FUNC,
11011 		.v.func = alc_fixup_auto_mute_via_amp,
11012 		.chained = true,
11013 		.chain_id = ALC662_FIXUP_BASS_1A
11014 	},
11015 	[ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE] = {
11016 		.type = HDA_FIXUP_FUNC,
11017 		.v.func = alc_fixup_headset_mode_alc668,
11018 		.chain_id = ALC662_FIXUP_BASS_CHMAP
11019 	},
11020 	[ALC668_FIXUP_ASUS_Nx51] = {
11021 		.type = HDA_FIXUP_PINS,
11022 		.v.pins = (const struct hda_pintbl[]) {
11023 			{ 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
11024 			{ 0x1a, 0x90170151 }, /* bass speaker */
11025 			{ 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
11026 			{}
11027 		},
11028 		.chained = true,
11029 		.chain_id = ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
11030 	},
11031 	[ALC668_FIXUP_MIC_COEF] = {
11032 		.type = HDA_FIXUP_VERBS,
11033 		.v.verbs = (const struct hda_verb[]) {
11034 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0xc3 },
11035 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x4000 },
11036 			{}
11037 		},
11038 	},
11039 	[ALC668_FIXUP_ASUS_G751] = {
11040 		.type = HDA_FIXUP_PINS,
11041 		.v.pins = (const struct hda_pintbl[]) {
11042 			{ 0x16, 0x0421101f }, /* HP */
11043 			{}
11044 		},
11045 		.chained = true,
11046 		.chain_id = ALC668_FIXUP_MIC_COEF
11047 	},
11048 	[ALC891_FIXUP_HEADSET_MODE] = {
11049 		.type = HDA_FIXUP_FUNC,
11050 		.v.func = alc_fixup_headset_mode,
11051 	},
11052 	[ALC891_FIXUP_DELL_MIC_NO_PRESENCE] = {
11053 		.type = HDA_FIXUP_PINS,
11054 		.v.pins = (const struct hda_pintbl[]) {
11055 			{ 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
11056 			{ 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
11057 			{ }
11058 		},
11059 		.chained = true,
11060 		.chain_id = ALC891_FIXUP_HEADSET_MODE
11061 	},
11062 	[ALC662_FIXUP_ACER_VERITON] = {
11063 		.type = HDA_FIXUP_PINS,
11064 		.v.pins = (const struct hda_pintbl[]) {
11065 			{ 0x15, 0x50170120 }, /* no internal speaker */
11066 			{ }
11067 		}
11068 	},
11069 	[ALC892_FIXUP_ASROCK_MOBO] = {
11070 		.type = HDA_FIXUP_PINS,
11071 		.v.pins = (const struct hda_pintbl[]) {
11072 			{ 0x15, 0x40f000f0 }, /* disabled */
11073 			{ 0x16, 0x40f000f0 }, /* disabled */
11074 			{ }
11075 		}
11076 	},
11077 	[ALC662_FIXUP_USI_FUNC] = {
11078 		.type = HDA_FIXUP_FUNC,
11079 		.v.func = alc662_fixup_usi_headset_mic,
11080 	},
11081 	[ALC662_FIXUP_USI_HEADSET_MODE] = {
11082 		.type = HDA_FIXUP_PINS,
11083 		.v.pins = (const struct hda_pintbl[]) {
11084 			{ 0x19, 0x02a1913c }, /* use as headset mic, without its own jack detect */
11085 			{ 0x18, 0x01a1903d },
11086 			{ }
11087 		},
11088 		.chained = true,
11089 		.chain_id = ALC662_FIXUP_USI_FUNC
11090 	},
11091 	[ALC662_FIXUP_LENOVO_MULTI_CODECS] = {
11092 		.type = HDA_FIXUP_FUNC,
11093 		.v.func = alc233_alc662_fixup_lenovo_dual_codecs,
11094 	},
11095 	[ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET] = {
11096 		.type = HDA_FIXUP_FUNC,
11097 		.v.func = alc662_fixup_aspire_ethos_hp,
11098 	},
11099 	[ALC669_FIXUP_ACER_ASPIRE_ETHOS] = {
11100 		.type = HDA_FIXUP_PINS,
11101 		.v.pins = (const struct hda_pintbl[]) {
11102 			{ 0x15, 0x92130110 }, /* front speakers */
11103 			{ 0x18, 0x99130111 }, /* center/subwoofer */
11104 			{ 0x1b, 0x11130012 }, /* surround plus jack for HP */
11105 			{ }
11106 		},
11107 		.chained = true,
11108 		.chain_id = ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET
11109 	},
11110 	[ALC671_FIXUP_HP_HEADSET_MIC2] = {
11111 		.type = HDA_FIXUP_FUNC,
11112 		.v.func = alc671_fixup_hp_headset_mic2,
11113 	},
11114 	[ALC662_FIXUP_ACER_X2660G_HEADSET_MODE] = {
11115 		.type = HDA_FIXUP_PINS,
11116 		.v.pins = (const struct hda_pintbl[]) {
11117 			{ 0x1a, 0x02a1113c }, /* use as headset mic, without its own jack detect */
11118 			{ }
11119 		},
11120 		.chained = true,
11121 		.chain_id = ALC662_FIXUP_USI_FUNC
11122 	},
11123 	[ALC662_FIXUP_ACER_NITRO_HEADSET_MODE] = {
11124 		.type = HDA_FIXUP_PINS,
11125 		.v.pins = (const struct hda_pintbl[]) {
11126 			{ 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */
11127 			{ 0x1b, 0x0221144f },
11128 			{ }
11129 		},
11130 		.chained = true,
11131 		.chain_id = ALC662_FIXUP_USI_FUNC
11132 	},
11133 	[ALC668_FIXUP_ASUS_NO_HEADSET_MIC] = {
11134 		.type = HDA_FIXUP_PINS,
11135 		.v.pins = (const struct hda_pintbl[]) {
11136 			{ 0x1b, 0x04a1112c },
11137 			{ }
11138 		},
11139 		.chained = true,
11140 		.chain_id = ALC668_FIXUP_HEADSET_MIC
11141 	},
11142 	[ALC668_FIXUP_HEADSET_MIC] = {
11143 		.type = HDA_FIXUP_FUNC,
11144 		.v.func = alc269_fixup_headset_mic,
11145 		.chained = true,
11146 		.chain_id = ALC668_FIXUP_MIC_DET_COEF
11147 	},
11148 	[ALC668_FIXUP_MIC_DET_COEF] = {
11149 		.type = HDA_FIXUP_VERBS,
11150 		.v.verbs = (const struct hda_verb[]) {
11151 			{ 0x20, AC_VERB_SET_COEF_INDEX, 0x15 },
11152 			{ 0x20, AC_VERB_SET_PROC_COEF, 0x0d60 },
11153 			{}
11154 		},
11155 	},
11156 	[ALC897_FIXUP_LENOVO_HEADSET_MIC] = {
11157 		.type = HDA_FIXUP_FUNC,
11158 		.v.func = alc897_fixup_lenovo_headset_mic,
11159 	},
11160 	[ALC897_FIXUP_HEADSET_MIC_PIN] = {
11161 		.type = HDA_FIXUP_PINS,
11162 		.v.pins = (const struct hda_pintbl[]) {
11163 			{ 0x1a, 0x03a11050 },
11164 			{ }
11165 		},
11166 		.chained = true,
11167 		.chain_id = ALC897_FIXUP_LENOVO_HEADSET_MIC
11168 	},
11169 	[ALC897_FIXUP_HP_HSMIC_VERB] = {
11170 		.type = HDA_FIXUP_PINS,
11171 		.v.pins = (const struct hda_pintbl[]) {
11172 			{ 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
11173 			{ }
11174 		},
11175 	},
11176 	[ALC897_FIXUP_LENOVO_HEADSET_MODE] = {
11177 		.type = HDA_FIXUP_FUNC,
11178 		.v.func = alc897_fixup_lenovo_headset_mode,
11179 	},
11180 	[ALC897_FIXUP_HEADSET_MIC_PIN2] = {
11181 		.type = HDA_FIXUP_PINS,
11182 		.v.pins = (const struct hda_pintbl[]) {
11183 			{ 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */
11184 			{ }
11185 		},
11186 		.chained = true,
11187 		.chain_id = ALC897_FIXUP_LENOVO_HEADSET_MODE
11188 	},
11189 	[ALC897_FIXUP_UNIS_H3C_X500S] = {
11190 		.type = HDA_FIXUP_VERBS,
11191 		.v.verbs = (const struct hda_verb[]) {
11192 			{ 0x14, AC_VERB_SET_EAPD_BTLENABLE, 0 },
11193 			{}
11194 		},
11195 	},
11196 };
11197 
11198 static const struct snd_pci_quirk alc662_fixup_tbl[] = {
11199 	SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2),
11200 	SND_PCI_QUIRK(0x1025, 0x022f, "Acer Aspire One", ALC662_FIXUP_INV_DMIC),
11201 	SND_PCI_QUIRK(0x1025, 0x0241, "Packard Bell DOTS", ALC662_FIXUP_INV_DMIC),
11202 	SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
11203 	SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),
11204 	SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC),
11205 	SND_PCI_QUIRK(0x1025, 0x034a, "Gateway LT27", ALC662_FIXUP_INV_DMIC),
11206 	SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
11207 	SND_PCI_QUIRK(0x1025, 0x0566, "Acer Aspire Ethos 8951G", ALC669_FIXUP_ACER_ASPIRE_ETHOS),
11208 	SND_PCI_QUIRK(0x1025, 0x123c, "Acer Nitro N50-600", ALC662_FIXUP_ACER_NITRO_HEADSET_MODE),
11209 	SND_PCI_QUIRK(0x1025, 0x124e, "Acer 2660G", ALC662_FIXUP_ACER_X2660G_HEADSET_MODE),
11210 	SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11211 	SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11212 	SND_PCI_QUIRK(0x1028, 0x05fe, "Dell XPS 15", ALC668_FIXUP_DELL_XPS13),
11213 	SND_PCI_QUIRK(0x1028, 0x060a, "Dell XPS 13", ALC668_FIXUP_DELL_XPS13),
11214 	SND_PCI_QUIRK(0x1028, 0x060d, "Dell M3800", ALC668_FIXUP_DELL_XPS13),
11215 	SND_PCI_QUIRK(0x1028, 0x0625, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11216 	SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11217 	SND_PCI_QUIRK(0x1028, 0x0696, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11218 	SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11219 	SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11220 	SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
11221 	SND_PCI_QUIRK(0x103c, 0x870c, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
11222 	SND_PCI_QUIRK(0x103c, 0x8719, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
11223 	SND_PCI_QUIRK(0x103c, 0x872b, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
11224 	SND_PCI_QUIRK(0x103c, 0x873e, "HP", ALC671_FIXUP_HP_HEADSET_MIC2),
11225 	SND_PCI_QUIRK(0x103c, 0x8768, "HP Slim Desktop S01", ALC671_FIXUP_HP_HEADSET_MIC2),
11226 	SND_PCI_QUIRK(0x103c, 0x877e, "HP 288 Pro G6", ALC671_FIXUP_HP_HEADSET_MIC2),
11227 	SND_PCI_QUIRK(0x103c, 0x885f, "HP 288 Pro G8", ALC671_FIXUP_HP_HEADSET_MIC2),
11228 	SND_PCI_QUIRK(0x1043, 0x1080, "Asus UX501VW", ALC668_FIXUP_HEADSET_MODE),
11229 	SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_ASUS_Nx50),
11230 	SND_PCI_QUIRK(0x1043, 0x129d, "Asus N750", ALC662_FIXUP_ASUS_Nx50),
11231 	SND_PCI_QUIRK(0x1043, 0x12ff, "ASUS G751", ALC668_FIXUP_ASUS_G751),
11232 	SND_PCI_QUIRK(0x1043, 0x13df, "Asus N550JX", ALC662_FIXUP_BASS_1A),
11233 	SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
11234 	SND_PCI_QUIRK(0x1043, 0x15a7, "ASUS UX51VZH", ALC662_FIXUP_BASS_16),
11235 	SND_PCI_QUIRK(0x1043, 0x177d, "ASUS N551", ALC668_FIXUP_ASUS_Nx51),
11236 	SND_PCI_QUIRK(0x1043, 0x17bd, "ASUS N751", ALC668_FIXUP_ASUS_Nx51),
11237 	SND_PCI_QUIRK(0x1043, 0x185d, "ASUS G551JW", ALC668_FIXUP_ASUS_NO_HEADSET_MIC),
11238 	SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71SL", ALC662_FIXUP_ASUS_MODE8),
11239 	SND_PCI_QUIRK(0x1043, 0x1b73, "ASUS N55SF", ALC662_FIXUP_BASS_16),
11240 	SND_PCI_QUIRK(0x1043, 0x1bf3, "ASUS N76VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
11241 	SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),
11242 	SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
11243 	SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
11244 	SND_PCI_QUIRK(0x14cd, 0x5003, "USI", ALC662_FIXUP_USI_HEADSET_MODE),
11245 	SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC662_FIXUP_LENOVO_MULTI_CODECS),
11246 	SND_PCI_QUIRK(0x17aa, 0x1057, "Lenovo P360", ALC897_FIXUP_HEADSET_MIC_PIN),
11247 	SND_PCI_QUIRK(0x17aa, 0x1064, "Lenovo P3 Tower", ALC897_FIXUP_HEADSET_MIC_PIN),
11248 	SND_PCI_QUIRK(0x17aa, 0x32ca, "Lenovo ThinkCentre M80", ALC897_FIXUP_HEADSET_MIC_PIN),
11249 	SND_PCI_QUIRK(0x17aa, 0x32cb, "Lenovo ThinkCentre M70", ALC897_FIXUP_HEADSET_MIC_PIN),
11250 	SND_PCI_QUIRK(0x17aa, 0x32cf, "Lenovo ThinkCentre M950", ALC897_FIXUP_HEADSET_MIC_PIN),
11251 	SND_PCI_QUIRK(0x17aa, 0x32f7, "Lenovo ThinkCentre M90", ALC897_FIXUP_HEADSET_MIC_PIN),
11252 	SND_PCI_QUIRK(0x17aa, 0x3321, "Lenovo ThinkCentre M70 Gen4", ALC897_FIXUP_HEADSET_MIC_PIN),
11253 	SND_PCI_QUIRK(0x17aa, 0x331b, "Lenovo ThinkCentre M90 Gen4", ALC897_FIXUP_HEADSET_MIC_PIN),
11254 	SND_PCI_QUIRK(0x17aa, 0x3364, "Lenovo ThinkCentre M90 Gen5", ALC897_FIXUP_HEADSET_MIC_PIN),
11255 	SND_PCI_QUIRK(0x17aa, 0x3742, "Lenovo TianYi510Pro-14IOB", ALC897_FIXUP_HEADSET_MIC_PIN2),
11256 	SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
11257 	SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
11258 	SND_PCI_QUIRK(0x1849, 0x5892, "ASRock B150M", ALC892_FIXUP_ASROCK_MOBO),
11259 	SND_PCI_QUIRK(0x19da, 0xa130, "Zotac Z68", ALC662_FIXUP_ZOTAC_Z68),
11260 	SND_PCI_QUIRK(0x1b0a, 0x01b8, "ACER Veriton", ALC662_FIXUP_ACER_VERITON),
11261 	SND_PCI_QUIRK(0x1b35, 0x1234, "CZC ET26", ALC662_FIXUP_CZC_ET26),
11262 	SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
11263 	SND_PCI_QUIRK(0x1c6c, 0x1239, "Compaq N14JP6-V2", ALC897_FIXUP_HP_HSMIC_VERB),
11264 
11265 #if 0
11266 	/* Below is a quirk table taken from the old code.
11267 	 * Basically the device should work as is without the fixup table.
11268 	 * If BIOS doesn't give a proper info, enable the corresponding
11269 	 * fixup entry.
11270 	 */
11271 	SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1),
11272 	SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3),
11273 	SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1),
11274 	SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC662_FIXUP_ASUS_MODE3),
11275 	SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
11276 	SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11277 	SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
11278 	SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC662_FIXUP_ASUS_MODE1),
11279 	SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC662_FIXUP_ASUS_MODE1),
11280 	SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11281 	SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC662_FIXUP_ASUS_MODE7),
11282 	SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC662_FIXUP_ASUS_MODE7),
11283 	SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC662_FIXUP_ASUS_MODE8),
11284 	SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC662_FIXUP_ASUS_MODE3),
11285 	SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC662_FIXUP_ASUS_MODE1),
11286 	SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11287 	SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_FIXUP_ASUS_MODE2),
11288 	SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC662_FIXUP_ASUS_MODE1),
11289 	SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11290 	SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
11291 	SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
11292 	SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11293 	SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC662_FIXUP_ASUS_MODE1),
11294 	SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC662_FIXUP_ASUS_MODE3),
11295 	SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_FIXUP_ASUS_MODE2),
11296 	SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11297 	SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC662_FIXUP_ASUS_MODE5),
11298 	SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
11299 	SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11300 	SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC662_FIXUP_ASUS_MODE1),
11301 	SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11302 	SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11303 	SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC662_FIXUP_ASUS_MODE3),
11304 	SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC662_FIXUP_ASUS_MODE3),
11305 	SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC662_FIXUP_ASUS_MODE1),
11306 	SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC662_FIXUP_ASUS_MODE1),
11307 	SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC662_FIXUP_ASUS_MODE1),
11308 	SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC662_FIXUP_ASUS_MODE1),
11309 	SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC662_FIXUP_ASUS_MODE1),
11310 	SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11311 	SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_FIXUP_ASUS_MODE2),
11312 	SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC662_FIXUP_ASUS_MODE1),
11313 	SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
11314 	SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC662_FIXUP_ASUS_MODE3),
11315 	SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC662_FIXUP_ASUS_MODE1),
11316 	SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC662_FIXUP_ASUS_MODE1),
11317 	SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC662_FIXUP_ASUS_MODE1),
11318 	SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_FIXUP_ASUS_MODE2),
11319 	SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
11320 	SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE4),
11321 #endif
11322 	{}
11323 };
11324 
11325 static const struct hda_model_fixup alc662_fixup_models[] = {
11326 	{.id = ALC662_FIXUP_ASPIRE, .name = "aspire"},
11327 	{.id = ALC662_FIXUP_IDEAPAD, .name = "ideapad"},
11328 	{.id = ALC272_FIXUP_MARIO, .name = "mario"},
11329 	{.id = ALC662_FIXUP_HP_RP5800, .name = "hp-rp5800"},
11330 	{.id = ALC662_FIXUP_ASUS_MODE1, .name = "asus-mode1"},
11331 	{.id = ALC662_FIXUP_ASUS_MODE2, .name = "asus-mode2"},
11332 	{.id = ALC662_FIXUP_ASUS_MODE3, .name = "asus-mode3"},
11333 	{.id = ALC662_FIXUP_ASUS_MODE4, .name = "asus-mode4"},
11334 	{.id = ALC662_FIXUP_ASUS_MODE5, .name = "asus-mode5"},
11335 	{.id = ALC662_FIXUP_ASUS_MODE6, .name = "asus-mode6"},
11336 	{.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},
11337 	{.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},
11338 	{.id = ALC662_FIXUP_ZOTAC_Z68, .name = "zotac-z68"},
11339 	{.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"},
11340 	{.id = ALC662_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc662-headset-multi"},
11341 	{.id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
11342 	{.id = ALC662_FIXUP_HEADSET_MODE, .name = "alc662-headset"},
11343 	{.id = ALC668_FIXUP_HEADSET_MODE, .name = "alc668-headset"},
11344 	{.id = ALC662_FIXUP_BASS_16, .name = "bass16"},
11345 	{.id = ALC662_FIXUP_BASS_1A, .name = "bass1a"},
11346 	{.id = ALC668_FIXUP_AUTO_MUTE, .name = "automute"},
11347 	{.id = ALC668_FIXUP_DELL_XPS13, .name = "dell-xps13"},
11348 	{.id = ALC662_FIXUP_ASUS_Nx50, .name = "asus-nx50"},
11349 	{.id = ALC668_FIXUP_ASUS_Nx51, .name = "asus-nx51"},
11350 	{.id = ALC668_FIXUP_ASUS_G751, .name = "asus-g751"},
11351 	{.id = ALC891_FIXUP_HEADSET_MODE, .name = "alc891-headset"},
11352 	{.id = ALC891_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc891-headset-multi"},
11353 	{.id = ALC662_FIXUP_ACER_VERITON, .name = "acer-veriton"},
11354 	{.id = ALC892_FIXUP_ASROCK_MOBO, .name = "asrock-mobo"},
11355 	{.id = ALC662_FIXUP_USI_HEADSET_MODE, .name = "usi-headset"},
11356 	{.id = ALC662_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
11357 	{.id = ALC669_FIXUP_ACER_ASPIRE_ETHOS, .name = "aspire-ethos"},
11358 	{.id = ALC897_FIXUP_UNIS_H3C_X500S, .name = "unis-h3c-x500s"},
11359 	{}
11360 };
11361 
11362 static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = {
11363 	SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
11364 		{0x17, 0x02211010},
11365 		{0x18, 0x01a19030},
11366 		{0x1a, 0x01813040},
11367 		{0x21, 0x01014020}),
11368 	SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
11369 		{0x16, 0x01813030},
11370 		{0x17, 0x02211010},
11371 		{0x18, 0x01a19040},
11372 		{0x21, 0x01014020}),
11373 	SND_HDA_PIN_QUIRK(0x10ec0662, 0x1028, "Dell", ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
11374 		{0x14, 0x01014010},
11375 		{0x18, 0x01a19020},
11376 		{0x1a, 0x0181302f},
11377 		{0x1b, 0x0221401f}),
11378 	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
11379 		{0x12, 0x99a30130},
11380 		{0x14, 0x90170110},
11381 		{0x15, 0x0321101f},
11382 		{0x16, 0x03011020}),
11383 	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
11384 		{0x12, 0x99a30140},
11385 		{0x14, 0x90170110},
11386 		{0x15, 0x0321101f},
11387 		{0x16, 0x03011020}),
11388 	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
11389 		{0x12, 0x99a30150},
11390 		{0x14, 0x90170110},
11391 		{0x15, 0x0321101f},
11392 		{0x16, 0x03011020}),
11393 	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
11394 		{0x14, 0x90170110},
11395 		{0x15, 0x0321101f},
11396 		{0x16, 0x03011020}),
11397 	SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell XPS 15", ALC668_FIXUP_AUTO_MUTE,
11398 		{0x12, 0x90a60130},
11399 		{0x14, 0x90170110},
11400 		{0x15, 0x0321101f}),
11401 	SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
11402 		{0x14, 0x01014010},
11403 		{0x17, 0x90170150},
11404 		{0x19, 0x02a11060},
11405 		{0x1b, 0x01813030},
11406 		{0x21, 0x02211020}),
11407 	SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
11408 		{0x14, 0x01014010},
11409 		{0x18, 0x01a19040},
11410 		{0x1b, 0x01813030},
11411 		{0x21, 0x02211020}),
11412 	SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
11413 		{0x14, 0x01014020},
11414 		{0x17, 0x90170110},
11415 		{0x18, 0x01a19050},
11416 		{0x1b, 0x01813040},
11417 		{0x21, 0x02211030}),
11418 	{}
11419 };
11420 
11421 /*
11422  */
patch_alc662(struct hda_codec *codec)11423 static int patch_alc662(struct hda_codec *codec)
11424 {
11425 	struct alc_spec *spec;
11426 	int err;
11427 
11428 	err = alc_alloc_spec(codec, 0x0b);
11429 	if (err < 0)
11430 		return err;
11431 
11432 	spec = codec->spec;
11433 
11434 	spec->shutup = alc_eapd_shutup;
11435 
11436 	/* handle multiple HPs as is */
11437 	spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
11438 
11439 	alc_fix_pll_init(codec, 0x20, 0x04, 15);
11440 
11441 	switch (codec->core.vendor_id) {
11442 	case 0x10ec0668:
11443 		spec->init_hook = alc668_restore_default_value;
11444 		break;
11445 	}
11446 
11447 	alc_pre_init(codec);
11448 
11449 	snd_hda_pick_fixup(codec, alc662_fixup_models,
11450 		       alc662_fixup_tbl, alc662_fixups);
11451 	snd_hda_pick_pin_fixup(codec, alc662_pin_fixup_tbl, alc662_fixups, true);
11452 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
11453 
11454 	alc_auto_parse_customize_define(codec);
11455 
11456 	if (has_cdefine_beep(codec))
11457 		spec->gen.beep_nid = 0x01;
11458 
11459 	if ((alc_get_coef0(codec) & (1 << 14)) &&
11460 	    codec->bus->pci && codec->bus->pci->subsystem_vendor == 0x1025 &&
11461 	    spec->cdefine.platform_type == 1) {
11462 		err = alc_codec_rename(codec, "ALC272X");
11463 		if (err < 0)
11464 			goto error;
11465 	}
11466 
11467 	/* automatic parse from the BIOS config */
11468 	err = alc662_parse_auto_config(codec);
11469 	if (err < 0)
11470 		goto error;
11471 
11472 	if (!spec->gen.no_analog && spec->gen.beep_nid) {
11473 		switch (codec->core.vendor_id) {
11474 		case 0x10ec0662:
11475 			err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
11476 			break;
11477 		case 0x10ec0272:
11478 		case 0x10ec0663:
11479 		case 0x10ec0665:
11480 		case 0x10ec0668:
11481 			err = set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
11482 			break;
11483 		case 0x10ec0273:
11484 			err = set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
11485 			break;
11486 		}
11487 		if (err < 0)
11488 			goto error;
11489 	}
11490 
11491 	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
11492 
11493 	return 0;
11494 
11495  error:
11496 	alc_free(codec);
11497 	return err;
11498 }
11499 
11500 /*
11501  * ALC680 support
11502  */
11503 
alc680_parse_auto_config(struct hda_codec *codec)11504 static int alc680_parse_auto_config(struct hda_codec *codec)
11505 {
11506 	return alc_parse_auto_config(codec, NULL, NULL);
11507 }
11508 
11509 /*
11510  */
patch_alc680(struct hda_codec *codec)11511 static int patch_alc680(struct hda_codec *codec)
11512 {
11513 	int err;
11514 
11515 	/* ALC680 has no aa-loopback mixer */
11516 	err = alc_alloc_spec(codec, 0);
11517 	if (err < 0)
11518 		return err;
11519 
11520 	/* automatic parse from the BIOS config */
11521 	err = alc680_parse_auto_config(codec);
11522 	if (err < 0) {
11523 		alc_free(codec);
11524 		return err;
11525 	}
11526 
11527 	return 0;
11528 }
11529 
11530 /*
11531  * patch entries
11532  */
11533 static const struct hda_device_id snd_hda_id_realtek[] = {
11534 	HDA_CODEC_ENTRY(0x10ec0215, "ALC215", patch_alc269),
11535 	HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269),
11536 	HDA_CODEC_ENTRY(0x10ec0222, "ALC222", patch_alc269),
11537 	HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269),
11538 	HDA_CODEC_ENTRY(0x10ec0230, "ALC236", patch_alc269),
11539 	HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269),
11540 	HDA_CODEC_ENTRY(0x10ec0233, "ALC233", patch_alc269),
11541 	HDA_CODEC_ENTRY(0x10ec0234, "ALC234", patch_alc269),
11542 	HDA_CODEC_ENTRY(0x10ec0235, "ALC233", patch_alc269),
11543 	HDA_CODEC_ENTRY(0x10ec0236, "ALC236", patch_alc269),
11544 	HDA_CODEC_ENTRY(0x10ec0245, "ALC245", patch_alc269),
11545 	HDA_CODEC_ENTRY(0x10ec0255, "ALC255", patch_alc269),
11546 	HDA_CODEC_ENTRY(0x10ec0256, "ALC256", patch_alc269),
11547 	HDA_CODEC_ENTRY(0x10ec0257, "ALC257", patch_alc269),
11548 	HDA_CODEC_ENTRY(0x10ec0260, "ALC260", patch_alc260),
11549 	HDA_CODEC_ENTRY(0x10ec0262, "ALC262", patch_alc262),
11550 	HDA_CODEC_ENTRY(0x10ec0267, "ALC267", patch_alc268),
11551 	HDA_CODEC_ENTRY(0x10ec0268, "ALC268", patch_alc268),
11552 	HDA_CODEC_ENTRY(0x10ec0269, "ALC269", patch_alc269),
11553 	HDA_CODEC_ENTRY(0x10ec0270, "ALC270", patch_alc269),
11554 	HDA_CODEC_ENTRY(0x10ec0272, "ALC272", patch_alc662),
11555 	HDA_CODEC_ENTRY(0x10ec0274, "ALC274", patch_alc269),
11556 	HDA_CODEC_ENTRY(0x10ec0275, "ALC275", patch_alc269),
11557 	HDA_CODEC_ENTRY(0x10ec0276, "ALC276", patch_alc269),
11558 	HDA_CODEC_ENTRY(0x10ec0280, "ALC280", patch_alc269),
11559 	HDA_CODEC_ENTRY(0x10ec0282, "ALC282", patch_alc269),
11560 	HDA_CODEC_ENTRY(0x10ec0283, "ALC283", patch_alc269),
11561 	HDA_CODEC_ENTRY(0x10ec0284, "ALC284", patch_alc269),
11562 	HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269),
11563 	HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269),
11564 	HDA_CODEC_ENTRY(0x10ec0287, "ALC287", patch_alc269),
11565 	HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269),
11566 	HDA_CODEC_ENTRY(0x10ec0289, "ALC289", patch_alc269),
11567 	HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269),
11568 	HDA_CODEC_ENTRY(0x10ec0292, "ALC292", patch_alc269),
11569 	HDA_CODEC_ENTRY(0x10ec0293, "ALC293", patch_alc269),
11570 	HDA_CODEC_ENTRY(0x10ec0294, "ALC294", patch_alc269),
11571 	HDA_CODEC_ENTRY(0x10ec0295, "ALC295", patch_alc269),
11572 	HDA_CODEC_ENTRY(0x10ec0298, "ALC298", patch_alc269),
11573 	HDA_CODEC_ENTRY(0x10ec0299, "ALC299", patch_alc269),
11574 	HDA_CODEC_ENTRY(0x10ec0300, "ALC300", patch_alc269),
11575 	HDA_CODEC_ENTRY(0x10ec0623, "ALC623", patch_alc269),
11576 	HDA_CODEC_REV_ENTRY(0x10ec0861, 0x100340, "ALC660", patch_alc861),
11577 	HDA_CODEC_ENTRY(0x10ec0660, "ALC660-VD", patch_alc861vd),
11578 	HDA_CODEC_ENTRY(0x10ec0861, "ALC861", patch_alc861),
11579 	HDA_CODEC_ENTRY(0x10ec0862, "ALC861-VD", patch_alc861vd),
11580 	HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100002, "ALC662 rev2", patch_alc882),
11581 	HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100101, "ALC662 rev1", patch_alc662),
11582 	HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100300, "ALC662 rev3", patch_alc662),
11583 	HDA_CODEC_ENTRY(0x10ec0663, "ALC663", patch_alc662),
11584 	HDA_CODEC_ENTRY(0x10ec0665, "ALC665", patch_alc662),
11585 	HDA_CODEC_ENTRY(0x10ec0667, "ALC667", patch_alc662),
11586 	HDA_CODEC_ENTRY(0x10ec0668, "ALC668", patch_alc662),
11587 	HDA_CODEC_ENTRY(0x10ec0670, "ALC670", patch_alc662),
11588 	HDA_CODEC_ENTRY(0x10ec0671, "ALC671", patch_alc662),
11589 	HDA_CODEC_ENTRY(0x10ec0680, "ALC680", patch_alc680),
11590 	HDA_CODEC_ENTRY(0x10ec0700, "ALC700", patch_alc269),
11591 	HDA_CODEC_ENTRY(0x10ec0701, "ALC701", patch_alc269),
11592 	HDA_CODEC_ENTRY(0x10ec0703, "ALC703", patch_alc269),
11593 	HDA_CODEC_ENTRY(0x10ec0711, "ALC711", patch_alc269),
11594 	HDA_CODEC_ENTRY(0x10ec0867, "ALC891", patch_alc662),
11595 	HDA_CODEC_ENTRY(0x10ec0880, "ALC880", patch_alc880),
11596 	HDA_CODEC_ENTRY(0x10ec0882, "ALC882", patch_alc882),
11597 	HDA_CODEC_ENTRY(0x10ec0883, "ALC883", patch_alc882),
11598 	HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100101, "ALC889A", patch_alc882),
11599 	HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100103, "ALC889A", patch_alc882),
11600 	HDA_CODEC_ENTRY(0x10ec0885, "ALC885", patch_alc882),
11601 	HDA_CODEC_ENTRY(0x10ec0887, "ALC887", patch_alc882),
11602 	HDA_CODEC_REV_ENTRY(0x10ec0888, 0x100101, "ALC1200", patch_alc882),
11603 	HDA_CODEC_ENTRY(0x10ec0888, "ALC888", patch_alc882),
11604 	HDA_CODEC_ENTRY(0x10ec0889, "ALC889", patch_alc882),
11605 	HDA_CODEC_ENTRY(0x10ec0892, "ALC892", patch_alc662),
11606 	HDA_CODEC_ENTRY(0x10ec0897, "ALC897", patch_alc662),
11607 	HDA_CODEC_ENTRY(0x10ec0899, "ALC898", patch_alc882),
11608 	HDA_CODEC_ENTRY(0x10ec0900, "ALC1150", patch_alc882),
11609 	HDA_CODEC_ENTRY(0x10ec0b00, "ALCS1200A", patch_alc882),
11610 	HDA_CODEC_ENTRY(0x10ec1168, "ALC1220", patch_alc882),
11611 	HDA_CODEC_ENTRY(0x10ec1220, "ALC1220", patch_alc882),
11612 	HDA_CODEC_ENTRY(0x19e58326, "HW8326", patch_alc269),
11613 	{} /* terminator */
11614 };
11615 MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_realtek);
11616 
11617 MODULE_LICENSE("GPL");
11618 MODULE_DESCRIPTION("Realtek HD-audio codec");
11619 
11620 static struct hda_codec_driver realtek_driver = {
11621 	.id = snd_hda_id_realtek,
11622 };
11623 
11624 module_hda_codec_driver(realtek_driver);
11625