1 // SPDX-License-Identifier: GPL-2.0-or-later
2 //
3 // Realtek ALC269 and compatible codecs
4 //
5
6 #include <linux/init.h>
7 #include <linux/module.h>
8 #include "realtek.h"
9
10 /* keep halting ALC5505 DSP, for power saving */
11 #define HALT_REALTEK_ALC5505
12
13 static const struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
14 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
15 };
16
17 static const struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
18 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
19 };
20
21 /* different alc269-variants */
22 enum {
23 ALC269_TYPE_ALC269VA,
24 ALC269_TYPE_ALC269VB,
25 ALC269_TYPE_ALC269VC,
26 ALC269_TYPE_ALC269VD,
27 ALC269_TYPE_ALC280,
28 ALC269_TYPE_ALC282,
29 ALC269_TYPE_ALC283,
30 ALC269_TYPE_ALC284,
31 ALC269_TYPE_ALC293,
32 ALC269_TYPE_ALC286,
33 ALC269_TYPE_ALC298,
34 ALC269_TYPE_ALC255,
35 ALC269_TYPE_ALC256,
36 ALC269_TYPE_ALC257,
37 ALC269_TYPE_ALC215,
38 ALC269_TYPE_ALC225,
39 ALC269_TYPE_ALC245,
40 ALC269_TYPE_ALC287,
41 ALC269_TYPE_ALC294,
42 ALC269_TYPE_ALC300,
43 ALC269_TYPE_ALC623,
44 ALC269_TYPE_ALC700,
45 };
46
47 /*
48 * BIOS auto configuration
49 */
alc269_parse_auto_config(struct hda_codec * codec)50 static int alc269_parse_auto_config(struct hda_codec *codec)
51 {
52 static const hda_nid_t alc269_ignore[] = { 0x1d, 0 };
53 static const hda_nid_t alc269_ssids[] = { 0, 0x1b, 0x14, 0x21 };
54 static const hda_nid_t alc269va_ssids[] = { 0x15, 0x1b, 0x14, 0 };
55 struct alc_spec *spec = codec->spec;
56 const hda_nid_t *ssids;
57
58 switch (spec->codec_variant) {
59 case ALC269_TYPE_ALC269VA:
60 case ALC269_TYPE_ALC269VC:
61 case ALC269_TYPE_ALC280:
62 case ALC269_TYPE_ALC284:
63 case ALC269_TYPE_ALC293:
64 ssids = alc269va_ssids;
65 break;
66 case ALC269_TYPE_ALC269VB:
67 case ALC269_TYPE_ALC269VD:
68 case ALC269_TYPE_ALC282:
69 case ALC269_TYPE_ALC283:
70 case ALC269_TYPE_ALC286:
71 case ALC269_TYPE_ALC298:
72 case ALC269_TYPE_ALC255:
73 case ALC269_TYPE_ALC256:
74 case ALC269_TYPE_ALC257:
75 case ALC269_TYPE_ALC215:
76 case ALC269_TYPE_ALC225:
77 case ALC269_TYPE_ALC245:
78 case ALC269_TYPE_ALC287:
79 case ALC269_TYPE_ALC294:
80 case ALC269_TYPE_ALC300:
81 case ALC269_TYPE_ALC623:
82 case ALC269_TYPE_ALC700:
83 ssids = alc269_ssids;
84 break;
85 default:
86 ssids = alc269_ssids;
87 break;
88 }
89
90 return alc_parse_auto_config(codec, alc269_ignore, ssids);
91 }
92
93 static const struct hda_jack_keymap alc_headset_btn_keymap[] = {
94 { SND_JACK_BTN_0, KEY_PLAYPAUSE },
95 { SND_JACK_BTN_1, KEY_VOICECOMMAND },
96 { SND_JACK_BTN_2, KEY_VOLUMEUP },
97 { SND_JACK_BTN_3, KEY_VOLUMEDOWN },
98 {}
99 };
100
alc_headset_btn_callback(struct hda_codec * codec,struct hda_jack_callback * jack)101 static void alc_headset_btn_callback(struct hda_codec *codec,
102 struct hda_jack_callback *jack)
103 {
104 int report = 0;
105
106 if (jack->unsol_res & (7 << 13))
107 report |= SND_JACK_BTN_0;
108
109 if (jack->unsol_res & (1 << 16 | 3 << 8))
110 report |= SND_JACK_BTN_1;
111
112 /* Volume up key */
113 if (jack->unsol_res & (7 << 23))
114 report |= SND_JACK_BTN_2;
115
116 /* Volume down key */
117 if (jack->unsol_res & (7 << 10))
118 report |= SND_JACK_BTN_3;
119
120 snd_hda_jack_set_button_state(codec, jack->nid, report);
121 }
122
alc_disable_headset_jack_key(struct hda_codec * codec)123 static void alc_disable_headset_jack_key(struct hda_codec *codec)
124 {
125 struct alc_spec *spec = codec->spec;
126
127 if (!spec->has_hs_key)
128 return;
129
130 switch (codec->core.vendor_id) {
131 case 0x10ec0215:
132 case 0x10ec0225:
133 case 0x10ec0285:
134 case 0x10ec0287:
135 case 0x10ec0295:
136 case 0x10ec0289:
137 case 0x10ec0299:
138 alc_write_coef_idx(codec, 0x48, 0x0);
139 alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
140 alc_update_coef_idx(codec, 0x44, 0x0045 << 8, 0x0);
141 break;
142 case 0x10ec0230:
143 case 0x10ec0236:
144 case 0x10ec0256:
145 case 0x10ec0257:
146 case 0x19e58326:
147 alc_write_coef_idx(codec, 0x48, 0x0);
148 alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
149 break;
150 }
151 }
152
alc_enable_headset_jack_key(struct hda_codec * codec)153 static void alc_enable_headset_jack_key(struct hda_codec *codec)
154 {
155 struct alc_spec *spec = codec->spec;
156
157 if (!spec->has_hs_key)
158 return;
159
160 switch (codec->core.vendor_id) {
161 case 0x10ec0215:
162 case 0x10ec0225:
163 case 0x10ec0285:
164 case 0x10ec0287:
165 case 0x10ec0295:
166 case 0x10ec0289:
167 case 0x10ec0299:
168 alc_write_coef_idx(codec, 0x48, 0xd011);
169 alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
170 alc_update_coef_idx(codec, 0x44, 0x007f << 8, 0x0045 << 8);
171 break;
172 case 0x10ec0230:
173 case 0x10ec0236:
174 case 0x10ec0256:
175 case 0x10ec0257:
176 case 0x19e58326:
177 alc_write_coef_idx(codec, 0x48, 0xd011);
178 alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
179 break;
180 }
181 }
182
alc_fixup_headset_jack(struct hda_codec * codec,const struct hda_fixup * fix,int action)183 static void alc_fixup_headset_jack(struct hda_codec *codec,
184 const struct hda_fixup *fix, int action)
185 {
186 struct alc_spec *spec = codec->spec;
187 hda_nid_t hp_pin;
188
189 switch (action) {
190 case HDA_FIXUP_ACT_PRE_PROBE:
191 spec->has_hs_key = 1;
192 snd_hda_jack_detect_enable_callback(codec, 0x55,
193 alc_headset_btn_callback);
194 break;
195 case HDA_FIXUP_ACT_BUILD:
196 hp_pin = alc_get_hp_pin(spec);
197 if (!hp_pin || snd_hda_jack_bind_keymap(codec, 0x55,
198 alc_headset_btn_keymap,
199 hp_pin))
200 snd_hda_jack_add_kctl(codec, 0x55, "Headset Jack",
201 false, SND_JACK_HEADSET,
202 alc_headset_btn_keymap);
203
204 alc_enable_headset_jack_key(codec);
205 break;
206 }
207 }
208
alc269vb_toggle_power_output(struct hda_codec * codec,int power_up)209 static void alc269vb_toggle_power_output(struct hda_codec *codec, int power_up)
210 {
211 alc_update_coef_idx(codec, 0x04, 1 << 11, power_up ? (1 << 11) : 0);
212 }
213
alc269_shutup(struct hda_codec * codec)214 static void alc269_shutup(struct hda_codec *codec)
215 {
216 struct alc_spec *spec = codec->spec;
217
218 if (spec->codec_variant == ALC269_TYPE_ALC269VB)
219 alc269vb_toggle_power_output(codec, 0);
220 if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
221 (alc_get_coef0(codec) & 0x00ff) == 0x018) {
222 msleep(150);
223 }
224 alc_shutup_pins(codec);
225 }
226
227 static const struct coef_fw alc282_coefs[] = {
228 WRITE_COEF(0x03, 0x0002), /* Power Down Control */
229 UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
230 WRITE_COEF(0x07, 0x0200), /* DMIC control */
231 UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
232 UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
233 WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
234 WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
235 WRITE_COEF(0x0e, 0x6e00), /* LDO1/2/3, DAC/ADC */
236 UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
237 UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
238 WRITE_COEF(0x6f, 0x0), /* Class D test 4 */
239 UPDATE_COEF(0x0c, 0xfe00, 0), /* IO power down directly */
240 WRITE_COEF(0x34, 0xa0c0), /* ANC */
241 UPDATE_COEF(0x16, 0x0008, 0), /* AGC MUX */
242 UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
243 UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
244 WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
245 WRITE_COEF(0x63, 0x2902), /* PLL */
246 WRITE_COEF(0x68, 0xa080), /* capless control 2 */
247 WRITE_COEF(0x69, 0x3400), /* capless control 3 */
248 WRITE_COEF(0x6a, 0x2f3e), /* capless control 4 */
249 WRITE_COEF(0x6b, 0x0), /* capless control 5 */
250 UPDATE_COEF(0x6d, 0x0fff, 0x0900), /* class D test 2 */
251 WRITE_COEF(0x6e, 0x110a), /* class D test 3 */
252 UPDATE_COEF(0x70, 0x00f8, 0x00d8), /* class D test 5 */
253 WRITE_COEF(0x71, 0x0014), /* class D test 6 */
254 WRITE_COEF(0x72, 0xc2ba), /* classD OCP */
255 UPDATE_COEF(0x77, 0x0f80, 0), /* classD pure DC test */
256 WRITE_COEF(0x6c, 0xfc06), /* Class D amp control */
257 {}
258 };
259
alc282_restore_default_value(struct hda_codec * codec)260 static void alc282_restore_default_value(struct hda_codec *codec)
261 {
262 alc_process_coef_fw(codec, alc282_coefs);
263 }
264
alc282_init(struct hda_codec * codec)265 static void alc282_init(struct hda_codec *codec)
266 {
267 struct alc_spec *spec = codec->spec;
268 hda_nid_t hp_pin = alc_get_hp_pin(spec);
269 bool hp_pin_sense;
270 int coef78;
271
272 alc282_restore_default_value(codec);
273
274 if (!hp_pin)
275 return;
276 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
277 coef78 = alc_read_coef_idx(codec, 0x78);
278
279 /* Index 0x78 Direct Drive HP AMP LPM Control 1 */
280 /* Headphone capless set to high power mode */
281 alc_write_coef_idx(codec, 0x78, 0x9004);
282
283 if (hp_pin_sense)
284 msleep(2);
285
286 snd_hda_codec_write(codec, hp_pin, 0,
287 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
288
289 if (hp_pin_sense)
290 msleep(85);
291
292 snd_hda_codec_write(codec, hp_pin, 0,
293 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
294
295 if (hp_pin_sense)
296 msleep(100);
297
298 /* Headphone capless set to normal mode */
299 alc_write_coef_idx(codec, 0x78, coef78);
300 }
301
alc282_shutup(struct hda_codec * codec)302 static void alc282_shutup(struct hda_codec *codec)
303 {
304 struct alc_spec *spec = codec->spec;
305 hda_nid_t hp_pin = alc_get_hp_pin(spec);
306 bool hp_pin_sense;
307 int coef78;
308
309 if (!hp_pin) {
310 alc269_shutup(codec);
311 return;
312 }
313
314 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
315 coef78 = alc_read_coef_idx(codec, 0x78);
316 alc_write_coef_idx(codec, 0x78, 0x9004);
317
318 if (hp_pin_sense)
319 msleep(2);
320
321 snd_hda_codec_write(codec, hp_pin, 0,
322 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
323
324 if (hp_pin_sense)
325 msleep(85);
326
327 if (!spec->no_shutup_pins)
328 snd_hda_codec_write(codec, hp_pin, 0,
329 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
330
331 if (hp_pin_sense)
332 msleep(100);
333
334 alc_auto_setup_eapd(codec, false);
335 alc_shutup_pins(codec);
336 alc_write_coef_idx(codec, 0x78, coef78);
337 }
338
339 static const struct coef_fw alc283_coefs[] = {
340 WRITE_COEF(0x03, 0x0002), /* Power Down Control */
341 UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
342 WRITE_COEF(0x07, 0x0200), /* DMIC control */
343 UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
344 UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
345 WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
346 WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
347 WRITE_COEF(0x0e, 0x6fc0), /* LDO1/2/3, DAC/ADC */
348 UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
349 UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
350 WRITE_COEF(0x3a, 0x0), /* Class D test 4 */
351 UPDATE_COEF(0x0c, 0xfe00, 0x0), /* IO power down directly */
352 WRITE_COEF(0x22, 0xa0c0), /* ANC */
353 UPDATE_COEFEX(0x53, 0x01, 0x000f, 0x0008), /* AGC MUX */
354 UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
355 UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
356 WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
357 WRITE_COEF(0x2e, 0x2902), /* PLL */
358 WRITE_COEF(0x33, 0xa080), /* capless control 2 */
359 WRITE_COEF(0x34, 0x3400), /* capless control 3 */
360 WRITE_COEF(0x35, 0x2f3e), /* capless control 4 */
361 WRITE_COEF(0x36, 0x0), /* capless control 5 */
362 UPDATE_COEF(0x38, 0x0fff, 0x0900), /* class D test 2 */
363 WRITE_COEF(0x39, 0x110a), /* class D test 3 */
364 UPDATE_COEF(0x3b, 0x00f8, 0x00d8), /* class D test 5 */
365 WRITE_COEF(0x3c, 0x0014), /* class D test 6 */
366 WRITE_COEF(0x3d, 0xc2ba), /* classD OCP */
367 UPDATE_COEF(0x42, 0x0f80, 0x0), /* classD pure DC test */
368 WRITE_COEF(0x49, 0x0), /* test mode */
369 UPDATE_COEF(0x40, 0xf800, 0x9800), /* Class D DC enable */
370 UPDATE_COEF(0x42, 0xf000, 0x2000), /* DC offset */
371 WRITE_COEF(0x37, 0xfc06), /* Class D amp control */
372 UPDATE_COEF(0x1b, 0x8000, 0), /* HP JD control */
373 {}
374 };
375
alc283_restore_default_value(struct hda_codec * codec)376 static void alc283_restore_default_value(struct hda_codec *codec)
377 {
378 alc_process_coef_fw(codec, alc283_coefs);
379 }
380
alc283_init(struct hda_codec * codec)381 static void alc283_init(struct hda_codec *codec)
382 {
383 struct alc_spec *spec = codec->spec;
384 hda_nid_t hp_pin = alc_get_hp_pin(spec);
385 bool hp_pin_sense;
386
387 alc283_restore_default_value(codec);
388
389 if (!hp_pin)
390 return;
391
392 msleep(30);
393 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
394
395 /* Index 0x43 Direct Drive HP AMP LPM Control 1 */
396 /* Headphone capless set to high power mode */
397 alc_write_coef_idx(codec, 0x43, 0x9004);
398
399 snd_hda_codec_write(codec, hp_pin, 0,
400 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
401
402 if (hp_pin_sense)
403 msleep(85);
404
405 snd_hda_codec_write(codec, hp_pin, 0,
406 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
407
408 if (hp_pin_sense)
409 msleep(85);
410 /* Index 0x46 Combo jack auto switch control 2 */
411 /* 3k pull low control for Headset jack. */
412 alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
413 /* Headphone capless set to normal mode */
414 alc_write_coef_idx(codec, 0x43, 0x9614);
415 }
416
alc283_shutup(struct hda_codec * codec)417 static void alc283_shutup(struct hda_codec *codec)
418 {
419 struct alc_spec *spec = codec->spec;
420 hda_nid_t hp_pin = alc_get_hp_pin(spec);
421 bool hp_pin_sense;
422
423 if (!hp_pin) {
424 alc269_shutup(codec);
425 return;
426 }
427
428 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
429
430 alc_write_coef_idx(codec, 0x43, 0x9004);
431
432 /*depop hp during suspend*/
433 alc_write_coef_idx(codec, 0x06, 0x2100);
434
435 snd_hda_codec_write(codec, hp_pin, 0,
436 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
437
438 if (hp_pin_sense)
439 msleep(100);
440
441 if (!spec->no_shutup_pins)
442 snd_hda_codec_write(codec, hp_pin, 0,
443 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
444
445 alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
446
447 if (hp_pin_sense)
448 msleep(100);
449 alc_auto_setup_eapd(codec, false);
450 alc_shutup_pins(codec);
451 alc_write_coef_idx(codec, 0x43, 0x9614);
452 }
453
alc256_init(struct hda_codec * codec)454 static void alc256_init(struct hda_codec *codec)
455 {
456 struct alc_spec *spec = codec->spec;
457 hda_nid_t hp_pin = alc_get_hp_pin(spec);
458 bool hp_pin_sense;
459
460 if (spec->ultra_low_power) {
461 alc_update_coef_idx(codec, 0x03, 1<<1, 1<<1);
462 alc_update_coef_idx(codec, 0x08, 3<<2, 3<<2);
463 alc_update_coef_idx(codec, 0x08, 7<<4, 0);
464 alc_update_coef_idx(codec, 0x3b, 1<<15, 0);
465 alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
466 msleep(30);
467 }
468
469 if (!hp_pin)
470 hp_pin = 0x21;
471
472 msleep(30);
473
474 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
475
476 if (hp_pin_sense) {
477 msleep(2);
478 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
479
480 snd_hda_codec_write(codec, hp_pin, 0,
481 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
482
483 msleep(75);
484
485 snd_hda_codec_write(codec, hp_pin, 0,
486 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
487
488 msleep(75);
489 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
490 }
491 alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
492 alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15); /* Clear bit */
493 alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15);
494 /*
495 * Expose headphone mic (or possibly Line In on some machines) instead
496 * of PC Beep on 1Ah, and disable 1Ah loopback for all outputs. See
497 * Documentation/sound/hd-audio/realtek-pc-beep.rst for details of
498 * this register.
499 */
500 alc_write_coef_idx(codec, 0x36, 0x5757);
501 }
502
alc256_shutup(struct hda_codec * codec)503 static void alc256_shutup(struct hda_codec *codec)
504 {
505 struct alc_spec *spec = codec->spec;
506 hda_nid_t hp_pin = alc_get_hp_pin(spec);
507 bool hp_pin_sense;
508
509 if (!hp_pin)
510 hp_pin = 0x21;
511
512 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
513
514 /* 3k pull low control for Headset jack. */
515 /* NOTE: call this before clearing the pin, otherwise codec stalls */
516 /* If disable 3k pulldown control for alc257, the Mic detection will not work correctly
517 * when booting with headset plugged. So skip setting it for the codec alc257
518 */
519 if (spec->en_3kpull_low)
520 alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
521
522 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
523
524 if (hp_pin_sense) {
525 msleep(2);
526
527 snd_hda_codec_write(codec, hp_pin, 0,
528 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
529
530 msleep(75);
531
532 if (!spec->no_shutup_pins)
533 snd_hda_codec_write(codec, hp_pin, 0,
534 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
535
536 msleep(75);
537 }
538
539 alc_auto_setup_eapd(codec, false);
540 alc_shutup_pins(codec);
541 if (spec->ultra_low_power) {
542 msleep(50);
543 alc_update_coef_idx(codec, 0x03, 1<<1, 0);
544 alc_update_coef_idx(codec, 0x08, 7<<4, 7<<4);
545 alc_update_coef_idx(codec, 0x08, 3<<2, 0);
546 alc_update_coef_idx(codec, 0x3b, 1<<15, 1<<15);
547 alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
548 msleep(30);
549 }
550 }
551
alc285_hp_init(struct hda_codec * codec)552 static void alc285_hp_init(struct hda_codec *codec)
553 {
554 struct alc_spec *spec = codec->spec;
555 hda_nid_t hp_pin = alc_get_hp_pin(spec);
556 int i, val;
557 int coef38, coef0d, coef36;
558
559 alc_write_coefex_idx(codec, 0x58, 0x00, 0x1888); /* write default value */
560 alc_update_coef_idx(codec, 0x4a, 1<<15, 1<<15); /* Reset HP JD */
561 coef38 = alc_read_coef_idx(codec, 0x38); /* Amp control */
562 coef0d = alc_read_coef_idx(codec, 0x0d); /* Digital Misc control */
563 coef36 = alc_read_coef_idx(codec, 0x36); /* Passthrough Control */
564 alc_update_coef_idx(codec, 0x38, 1<<4, 0x0);
565 alc_update_coef_idx(codec, 0x0d, 0x110, 0x0);
566
567 alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
568
569 if (hp_pin)
570 snd_hda_codec_write(codec, hp_pin, 0,
571 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
572
573 msleep(130);
574 alc_update_coef_idx(codec, 0x36, 1<<14, 1<<14);
575 alc_update_coef_idx(codec, 0x36, 1<<13, 0x0);
576
577 if (hp_pin)
578 snd_hda_codec_write(codec, hp_pin, 0,
579 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
580 msleep(10);
581 alc_write_coef_idx(codec, 0x67, 0x0); /* Set HP depop to manual mode */
582 alc_write_coefex_idx(codec, 0x58, 0x00, 0x7880);
583 alc_write_coefex_idx(codec, 0x58, 0x0f, 0xf049);
584 alc_update_coefex_idx(codec, 0x58, 0x03, 0x00f0, 0x00c0);
585
586 alc_write_coefex_idx(codec, 0x58, 0x00, 0xf888); /* HP depop procedure start */
587 val = alc_read_coefex_idx(codec, 0x58, 0x00);
588 for (i = 0; i < 20 && val & 0x8000; i++) {
589 msleep(50);
590 val = alc_read_coefex_idx(codec, 0x58, 0x00);
591 } /* Wait for depop procedure finish */
592
593 alc_write_coefex_idx(codec, 0x58, 0x00, val); /* write back the result */
594 alc_update_coef_idx(codec, 0x38, 1<<4, coef38);
595 alc_update_coef_idx(codec, 0x0d, 0x110, coef0d);
596 alc_update_coef_idx(codec, 0x36, 3<<13, coef36);
597
598 msleep(50);
599 alc_update_coef_idx(codec, 0x4a, 1<<15, 0);
600 }
601
alc225_init(struct hda_codec * codec)602 static void alc225_init(struct hda_codec *codec)
603 {
604 struct alc_spec *spec = codec->spec;
605 hda_nid_t hp_pin = alc_get_hp_pin(spec);
606 bool hp1_pin_sense, hp2_pin_sense;
607
608 if (spec->ultra_low_power) {
609 alc_update_coef_idx(codec, 0x08, 0x0f << 2, 3<<2);
610 alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
611 alc_update_coef_idx(codec, 0x33, 1<<11, 0);
612 msleep(30);
613 }
614
615 if (spec->codec_variant != ALC269_TYPE_ALC287 &&
616 spec->codec_variant != ALC269_TYPE_ALC245)
617 /* required only at boot or S3 and S4 resume time */
618 if (!spec->done_hp_init ||
619 is_s3_resume(codec) ||
620 is_s4_resume(codec)) {
621 alc285_hp_init(codec);
622 spec->done_hp_init = true;
623 }
624
625 if (!hp_pin)
626 hp_pin = 0x21;
627 msleep(30);
628
629 hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
630 hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
631
632 if (hp1_pin_sense || hp2_pin_sense) {
633 msleep(2);
634 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
635
636 if (hp1_pin_sense)
637 snd_hda_codec_write(codec, hp_pin, 0,
638 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
639 if (hp2_pin_sense)
640 snd_hda_codec_write(codec, 0x16, 0,
641 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
642 msleep(75);
643
644 if (hp1_pin_sense)
645 snd_hda_codec_write(codec, hp_pin, 0,
646 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
647 if (hp2_pin_sense)
648 snd_hda_codec_write(codec, 0x16, 0,
649 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
650
651 msleep(75);
652 alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
653 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
654 }
655 }
656
alc225_shutup(struct hda_codec * codec)657 static void alc225_shutup(struct hda_codec *codec)
658 {
659 struct alc_spec *spec = codec->spec;
660 hda_nid_t hp_pin = alc_get_hp_pin(spec);
661 bool hp1_pin_sense, hp2_pin_sense;
662
663 if (!hp_pin)
664 hp_pin = 0x21;
665
666 hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
667 hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
668
669 if (hp1_pin_sense || hp2_pin_sense) {
670 alc_disable_headset_jack_key(codec);
671 /* 3k pull low control for Headset jack. */
672 alc_update_coef_idx(codec, 0x4a, 0, 3 << 10);
673 msleep(2);
674
675 if (hp1_pin_sense)
676 snd_hda_codec_write(codec, hp_pin, 0,
677 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
678 if (hp2_pin_sense)
679 snd_hda_codec_write(codec, 0x16, 0,
680 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
681
682 msleep(75);
683
684 if (hp1_pin_sense)
685 snd_hda_codec_write(codec, hp_pin, 0,
686 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
687 if (hp2_pin_sense)
688 snd_hda_codec_write(codec, 0x16, 0,
689 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
690
691 msleep(75);
692 alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
693 alc_enable_headset_jack_key(codec);
694 }
695 alc_auto_setup_eapd(codec, false);
696 alc_shutup_pins(codec);
697 if (spec->ultra_low_power) {
698 msleep(50);
699 alc_update_coef_idx(codec, 0x08, 0x0f << 2, 0x0c << 2);
700 alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
701 alc_update_coef_idx(codec, 0x33, 1<<11, 1<<11);
702 alc_update_coef_idx(codec, 0x4a, 3<<4, 2<<4);
703 msleep(30);
704 }
705 }
706
alc222_init(struct hda_codec * codec)707 static void alc222_init(struct hda_codec *codec)
708 {
709 struct alc_spec *spec = codec->spec;
710 hda_nid_t hp_pin = alc_get_hp_pin(spec);
711 bool hp1_pin_sense, hp2_pin_sense;
712
713 if (!hp_pin)
714 return;
715
716 msleep(30);
717
718 hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
719 hp2_pin_sense = snd_hda_jack_detect(codec, 0x14);
720
721 if (hp1_pin_sense || hp2_pin_sense) {
722 msleep(2);
723
724 if (hp1_pin_sense)
725 snd_hda_codec_write(codec, hp_pin, 0,
726 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
727 if (hp2_pin_sense)
728 snd_hda_codec_write(codec, 0x14, 0,
729 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
730 msleep(75);
731
732 if (hp1_pin_sense)
733 snd_hda_codec_write(codec, hp_pin, 0,
734 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
735 if (hp2_pin_sense)
736 snd_hda_codec_write(codec, 0x14, 0,
737 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
738
739 msleep(75);
740 }
741 }
742
alc222_shutup(struct hda_codec * codec)743 static void alc222_shutup(struct hda_codec *codec)
744 {
745 struct alc_spec *spec = codec->spec;
746 hda_nid_t hp_pin = alc_get_hp_pin(spec);
747 bool hp1_pin_sense, hp2_pin_sense;
748
749 if (!hp_pin)
750 hp_pin = 0x21;
751
752 hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
753 hp2_pin_sense = snd_hda_jack_detect(codec, 0x14);
754
755 if (hp1_pin_sense || hp2_pin_sense) {
756 msleep(2);
757
758 if (hp1_pin_sense)
759 snd_hda_codec_write(codec, hp_pin, 0,
760 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
761 if (hp2_pin_sense)
762 snd_hda_codec_write(codec, 0x14, 0,
763 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
764
765 msleep(75);
766
767 if (hp1_pin_sense)
768 snd_hda_codec_write(codec, hp_pin, 0,
769 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
770 if (hp2_pin_sense)
771 snd_hda_codec_write(codec, 0x14, 0,
772 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
773
774 msleep(75);
775 }
776 alc_auto_setup_eapd(codec, false);
777 alc_shutup_pins(codec);
778 }
779
alc_default_init(struct hda_codec * codec)780 static void alc_default_init(struct hda_codec *codec)
781 {
782 struct alc_spec *spec = codec->spec;
783 hda_nid_t hp_pin = alc_get_hp_pin(spec);
784 bool hp_pin_sense;
785
786 if (!hp_pin)
787 return;
788
789 msleep(30);
790
791 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
792
793 if (hp_pin_sense) {
794 msleep(2);
795
796 snd_hda_codec_write(codec, hp_pin, 0,
797 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
798
799 msleep(75);
800
801 snd_hda_codec_write(codec, hp_pin, 0,
802 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
803 msleep(75);
804 }
805 }
806
alc_default_shutup(struct hda_codec * codec)807 static void alc_default_shutup(struct hda_codec *codec)
808 {
809 struct alc_spec *spec = codec->spec;
810 hda_nid_t hp_pin = alc_get_hp_pin(spec);
811 bool hp_pin_sense;
812
813 if (!hp_pin) {
814 alc269_shutup(codec);
815 return;
816 }
817
818 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
819
820 if (hp_pin_sense) {
821 msleep(2);
822
823 snd_hda_codec_write(codec, hp_pin, 0,
824 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
825
826 msleep(75);
827
828 if (!spec->no_shutup_pins)
829 snd_hda_codec_write(codec, hp_pin, 0,
830 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
831
832 msleep(75);
833 }
834 alc_auto_setup_eapd(codec, false);
835 alc_shutup_pins(codec);
836 }
837
alc294_hp_init(struct hda_codec * codec)838 static void alc294_hp_init(struct hda_codec *codec)
839 {
840 struct alc_spec *spec = codec->spec;
841 hda_nid_t hp_pin = alc_get_hp_pin(spec);
842 int i, val;
843
844 if (!hp_pin)
845 return;
846
847 snd_hda_codec_write(codec, hp_pin, 0,
848 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
849
850 msleep(100);
851
852 if (!spec->no_shutup_pins)
853 snd_hda_codec_write(codec, hp_pin, 0,
854 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
855
856 alc_update_coef_idx(codec, 0x6f, 0x000f, 0);/* Set HP depop to manual mode */
857 alc_update_coefex_idx(codec, 0x58, 0x00, 0x8000, 0x8000); /* HP depop procedure start */
858
859 /* Wait for depop procedure finish */
860 val = alc_read_coefex_idx(codec, 0x58, 0x01);
861 for (i = 0; i < 20 && val & 0x0080; i++) {
862 msleep(50);
863 val = alc_read_coefex_idx(codec, 0x58, 0x01);
864 }
865 /* Set HP depop to auto mode */
866 alc_update_coef_idx(codec, 0x6f, 0x000f, 0x000b);
867 msleep(50);
868 }
869
alc294_init(struct hda_codec * codec)870 static void alc294_init(struct hda_codec *codec)
871 {
872 struct alc_spec *spec = codec->spec;
873
874 /* required only at boot or S4 resume time */
875 if (!spec->done_hp_init || is_s4_resume(codec)) {
876 alc294_hp_init(codec);
877 spec->done_hp_init = true;
878 }
879 alc_default_init(codec);
880 }
881
alc5505_coef_set(struct hda_codec * codec,unsigned int index_reg,unsigned int val)882 static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg,
883 unsigned int val)
884 {
885 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
886 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val & 0xffff); /* LSB */
887 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val >> 16); /* MSB */
888 }
889
alc5505_coef_get(struct hda_codec * codec,unsigned int index_reg)890 static int alc5505_coef_get(struct hda_codec *codec, unsigned int index_reg)
891 {
892 unsigned int val;
893
894 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
895 val = snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
896 & 0xffff;
897 val |= snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
898 << 16;
899 return val;
900 }
901
alc5505_dsp_halt(struct hda_codec * codec)902 static void alc5505_dsp_halt(struct hda_codec *codec)
903 {
904 unsigned int val;
905
906 alc5505_coef_set(codec, 0x3000, 0x000c); /* DSP CPU stop */
907 alc5505_coef_set(codec, 0x880c, 0x0008); /* DDR enter self refresh */
908 alc5505_coef_set(codec, 0x61c0, 0x11110080); /* Clock control for PLL and CPU */
909 alc5505_coef_set(codec, 0x6230, 0xfc0d4011); /* Disable Input OP */
910 alc5505_coef_set(codec, 0x61b4, 0x040a2b03); /* Stop PLL2 */
911 alc5505_coef_set(codec, 0x61b0, 0x00005b17); /* Stop PLL1 */
912 alc5505_coef_set(codec, 0x61b8, 0x04133303); /* Stop PLL3 */
913 val = alc5505_coef_get(codec, 0x6220);
914 alc5505_coef_set(codec, 0x6220, (val | 0x3000)); /* switch Ringbuffer clock to DBUS clock */
915 }
916
alc5505_dsp_back_from_halt(struct hda_codec * codec)917 static void alc5505_dsp_back_from_halt(struct hda_codec *codec)
918 {
919 alc5505_coef_set(codec, 0x61b8, 0x04133302);
920 alc5505_coef_set(codec, 0x61b0, 0x00005b16);
921 alc5505_coef_set(codec, 0x61b4, 0x040a2b02);
922 alc5505_coef_set(codec, 0x6230, 0xf80d4011);
923 alc5505_coef_set(codec, 0x6220, 0x2002010f);
924 alc5505_coef_set(codec, 0x880c, 0x00000004);
925 }
926
alc5505_dsp_init(struct hda_codec * codec)927 static void alc5505_dsp_init(struct hda_codec *codec)
928 {
929 unsigned int val;
930
931 alc5505_dsp_halt(codec);
932 alc5505_dsp_back_from_halt(codec);
933 alc5505_coef_set(codec, 0x61b0, 0x5b14); /* PLL1 control */
934 alc5505_coef_set(codec, 0x61b0, 0x5b16);
935 alc5505_coef_set(codec, 0x61b4, 0x04132b00); /* PLL2 control */
936 alc5505_coef_set(codec, 0x61b4, 0x04132b02);
937 alc5505_coef_set(codec, 0x61b8, 0x041f3300); /* PLL3 control*/
938 alc5505_coef_set(codec, 0x61b8, 0x041f3302);
939 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_CODEC_RESET, 0); /* Function reset */
940 alc5505_coef_set(codec, 0x61b8, 0x041b3302);
941 alc5505_coef_set(codec, 0x61b8, 0x04173302);
942 alc5505_coef_set(codec, 0x61b8, 0x04163302);
943 alc5505_coef_set(codec, 0x8800, 0x348b328b); /* DRAM control */
944 alc5505_coef_set(codec, 0x8808, 0x00020022); /* DRAM control */
945 alc5505_coef_set(codec, 0x8818, 0x00000400); /* DRAM control */
946
947 val = alc5505_coef_get(codec, 0x6200) >> 16; /* Read revision ID */
948 if (val <= 3)
949 alc5505_coef_set(codec, 0x6220, 0x2002010f); /* I/O PAD Configuration */
950 else
951 alc5505_coef_set(codec, 0x6220, 0x6002018f);
952
953 alc5505_coef_set(codec, 0x61ac, 0x055525f0); /**/
954 alc5505_coef_set(codec, 0x61c0, 0x12230080); /* Clock control */
955 alc5505_coef_set(codec, 0x61b4, 0x040e2b02); /* PLL2 control */
956 alc5505_coef_set(codec, 0x61bc, 0x010234f8); /* OSC Control */
957 alc5505_coef_set(codec, 0x880c, 0x00000004); /* DRAM Function control */
958 alc5505_coef_set(codec, 0x880c, 0x00000003);
959 alc5505_coef_set(codec, 0x880c, 0x00000010);
960
961 #ifdef HALT_REALTEK_ALC5505
962 alc5505_dsp_halt(codec);
963 #endif
964 }
965
966 #ifdef HALT_REALTEK_ALC5505
967 #define alc5505_dsp_suspend(codec) do { } while (0) /* NOP */
968 #define alc5505_dsp_resume(codec) do { } while (0) /* NOP */
969 #else
970 #define alc5505_dsp_suspend(codec) alc5505_dsp_halt(codec)
971 #define alc5505_dsp_resume(codec) alc5505_dsp_back_from_halt(codec)
972 #endif
973
alc269_suspend(struct hda_codec * codec)974 static int alc269_suspend(struct hda_codec *codec)
975 {
976 struct alc_spec *spec = codec->spec;
977
978 if (spec->has_alc5505_dsp)
979 alc5505_dsp_suspend(codec);
980
981 return alc_suspend(codec);
982 }
983
alc269_resume(struct hda_codec * codec)984 static int alc269_resume(struct hda_codec *codec)
985 {
986 struct alc_spec *spec = codec->spec;
987
988 if (spec->codec_variant == ALC269_TYPE_ALC269VB)
989 alc269vb_toggle_power_output(codec, 0);
990 if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
991 (alc_get_coef0(codec) & 0x00ff) == 0x018) {
992 msleep(150);
993 }
994
995 snd_hda_codec_init(codec);
996
997 if (spec->codec_variant == ALC269_TYPE_ALC269VB)
998 alc269vb_toggle_power_output(codec, 1);
999 if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
1000 (alc_get_coef0(codec) & 0x00ff) == 0x017) {
1001 msleep(200);
1002 }
1003
1004 snd_hda_regmap_sync(codec);
1005 hda_call_check_power_status(codec, 0x01);
1006
1007 /* on some machine, the BIOS will clear the codec gpio data when enter
1008 * suspend, and won't restore the data after resume, so we restore it
1009 * in the driver.
1010 */
1011 if (spec->gpio_data)
1012 alc_write_gpio_data(codec);
1013
1014 if (spec->has_alc5505_dsp)
1015 alc5505_dsp_resume(codec);
1016
1017 return 0;
1018 }
1019
alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec * codec,const struct hda_fixup * fix,int action)1020 static void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec,
1021 const struct hda_fixup *fix, int action)
1022 {
1023 struct alc_spec *spec = codec->spec;
1024
1025 if (action == HDA_FIXUP_ACT_PRE_PROBE)
1026 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
1027 }
1028
alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec * codec,const struct hda_fixup * fix,int action)1029 static void alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec *codec,
1030 const struct hda_fixup *fix,
1031 int action)
1032 {
1033 unsigned int cfg_headphone = snd_hda_codec_get_pincfg(codec, 0x21);
1034 unsigned int cfg_headset_mic = snd_hda_codec_get_pincfg(codec, 0x19);
1035
1036 if (cfg_headphone && cfg_headset_mic == 0x411111f0)
1037 snd_hda_codec_set_pincfg(codec, 0x19,
1038 (cfg_headphone & ~AC_DEFCFG_DEVICE) |
1039 (AC_JACK_MIC_IN << AC_DEFCFG_DEVICE_SHIFT));
1040 }
1041
alc269_fixup_hweq(struct hda_codec * codec,const struct hda_fixup * fix,int action)1042 static void alc269_fixup_hweq(struct hda_codec *codec,
1043 const struct hda_fixup *fix, int action)
1044 {
1045 if (action == HDA_FIXUP_ACT_INIT)
1046 alc_update_coef_idx(codec, 0x1e, 0, 0x80);
1047 }
1048
alc271_fixup_dmic(struct hda_codec * codec,const struct hda_fixup * fix,int action)1049 static void alc271_fixup_dmic(struct hda_codec *codec,
1050 const struct hda_fixup *fix, int action)
1051 {
1052 static const struct hda_verb verbs[] = {
1053 {0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
1054 {0x20, AC_VERB_SET_PROC_COEF, 0x4000},
1055 {}
1056 };
1057 unsigned int cfg;
1058
1059 if (strcmp(codec->core.chip_name, "ALC271X") &&
1060 strcmp(codec->core.chip_name, "ALC269VB"))
1061 return;
1062 cfg = snd_hda_codec_get_pincfg(codec, 0x12);
1063 if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED)
1064 snd_hda_sequence_write(codec, verbs);
1065 }
1066
1067 /* Fix the speaker amp after resume, etc */
alc269vb_fixup_aspire_e1_coef(struct hda_codec * codec,const struct hda_fixup * fix,int action)1068 static void alc269vb_fixup_aspire_e1_coef(struct hda_codec *codec,
1069 const struct hda_fixup *fix,
1070 int action)
1071 {
1072 if (action == HDA_FIXUP_ACT_INIT)
1073 alc_update_coef_idx(codec, 0x0d, 0x6000, 0x6000);
1074 }
1075
alc269_fixup_pcm_44k(struct hda_codec * codec,const struct hda_fixup * fix,int action)1076 static void alc269_fixup_pcm_44k(struct hda_codec *codec,
1077 const struct hda_fixup *fix, int action)
1078 {
1079 struct alc_spec *spec = codec->spec;
1080
1081 if (action != HDA_FIXUP_ACT_PROBE)
1082 return;
1083
1084 /* Due to a hardware problem on Lenovo Ideadpad, we need to
1085 * fix the sample rate of analog I/O to 44.1kHz
1086 */
1087 spec->gen.stream_analog_playback = &alc269_44k_pcm_analog_playback;
1088 spec->gen.stream_analog_capture = &alc269_44k_pcm_analog_capture;
1089 }
1090
alc269_fixup_stereo_dmic(struct hda_codec * codec,const struct hda_fixup * fix,int action)1091 static void alc269_fixup_stereo_dmic(struct hda_codec *codec,
1092 const struct hda_fixup *fix, int action)
1093 {
1094 /* The digital-mic unit sends PDM (differential signal) instead of
1095 * the standard PCM, thus you can't record a valid mono stream as is.
1096 * Below is a workaround specific to ALC269 to control the dmic
1097 * signal source as mono.
1098 */
1099 if (action == HDA_FIXUP_ACT_INIT)
1100 alc_update_coef_idx(codec, 0x07, 0, 0x80);
1101 }
1102
alc269_quanta_automute(struct hda_codec * codec)1103 static void alc269_quanta_automute(struct hda_codec *codec)
1104 {
1105 snd_hda_gen_update_outputs(codec);
1106
1107 alc_write_coef_idx(codec, 0x0c, 0x680);
1108 alc_write_coef_idx(codec, 0x0c, 0x480);
1109 }
1110
alc269_fixup_quanta_mute(struct hda_codec * codec,const struct hda_fixup * fix,int action)1111 static void alc269_fixup_quanta_mute(struct hda_codec *codec,
1112 const struct hda_fixup *fix, int action)
1113 {
1114 struct alc_spec *spec = codec->spec;
1115 if (action != HDA_FIXUP_ACT_PROBE)
1116 return;
1117 spec->gen.automute_hook = alc269_quanta_automute;
1118 }
1119
alc269_x101_hp_automute_hook(struct hda_codec * codec,struct hda_jack_callback * jack)1120 static void alc269_x101_hp_automute_hook(struct hda_codec *codec,
1121 struct hda_jack_callback *jack)
1122 {
1123 struct alc_spec *spec = codec->spec;
1124 int vref;
1125 msleep(200);
1126 snd_hda_gen_hp_automute(codec, jack);
1127
1128 vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
1129 msleep(100);
1130 snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
1131 vref);
1132 msleep(500);
1133 snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
1134 vref);
1135 }
1136
1137 /*
1138 * Magic sequence to make Huawei Matebook X right speaker working (bko#197801)
1139 */
1140 struct hda_alc298_mbxinit {
1141 unsigned char value_0x23;
1142 unsigned char value_0x25;
1143 };
1144
alc298_huawei_mbx_stereo_seq(struct hda_codec * codec,const struct hda_alc298_mbxinit * initval,bool first)1145 static void alc298_huawei_mbx_stereo_seq(struct hda_codec *codec,
1146 const struct hda_alc298_mbxinit *initval,
1147 bool first)
1148 {
1149 snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x0);
1150 alc_write_coef_idx(codec, 0x26, 0xb000);
1151
1152 if (first)
1153 snd_hda_codec_write(codec, 0x21, 0, AC_VERB_GET_PIN_SENSE, 0x0);
1154
1155 snd_hda_codec_write(codec, 0x6, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
1156 alc_write_coef_idx(codec, 0x26, 0xf000);
1157 alc_write_coef_idx(codec, 0x23, initval->value_0x23);
1158
1159 if (initval->value_0x23 != 0x1e)
1160 alc_write_coef_idx(codec, 0x25, initval->value_0x25);
1161
1162 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
1163 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
1164 }
1165
alc298_fixup_huawei_mbx_stereo(struct hda_codec * codec,const struct hda_fixup * fix,int action)1166 static void alc298_fixup_huawei_mbx_stereo(struct hda_codec *codec,
1167 const struct hda_fixup *fix,
1168 int action)
1169 {
1170 /* Initialization magic */
1171 static const struct hda_alc298_mbxinit dac_init[] = {
1172 {0x0c, 0x00}, {0x0d, 0x00}, {0x0e, 0x00}, {0x0f, 0x00},
1173 {0x10, 0x00}, {0x1a, 0x40}, {0x1b, 0x82}, {0x1c, 0x00},
1174 {0x1d, 0x00}, {0x1e, 0x00}, {0x1f, 0x00},
1175 {0x20, 0xc2}, {0x21, 0xc8}, {0x22, 0x26}, {0x23, 0x24},
1176 {0x27, 0xff}, {0x28, 0xff}, {0x29, 0xff}, {0x2a, 0x8f},
1177 {0x2b, 0x02}, {0x2c, 0x48}, {0x2d, 0x34}, {0x2e, 0x00},
1178 {0x2f, 0x00},
1179 {0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00},
1180 {0x34, 0x00}, {0x35, 0x01}, {0x36, 0x93}, {0x37, 0x0c},
1181 {0x38, 0x00}, {0x39, 0x00}, {0x3a, 0xf8}, {0x38, 0x80},
1182 {}
1183 };
1184 const struct hda_alc298_mbxinit *seq;
1185
1186 if (action != HDA_FIXUP_ACT_INIT)
1187 return;
1188
1189 /* Start */
1190 snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x00);
1191 snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
1192 alc_write_coef_idx(codec, 0x26, 0xf000);
1193 alc_write_coef_idx(codec, 0x22, 0x31);
1194 alc_write_coef_idx(codec, 0x23, 0x0b);
1195 alc_write_coef_idx(codec, 0x25, 0x00);
1196 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
1197 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
1198
1199 for (seq = dac_init; seq->value_0x23; seq++)
1200 alc298_huawei_mbx_stereo_seq(codec, seq, seq == dac_init);
1201 }
1202
alc269_fixup_x101_headset_mic(struct hda_codec * codec,const struct hda_fixup * fix,int action)1203 static void alc269_fixup_x101_headset_mic(struct hda_codec *codec,
1204 const struct hda_fixup *fix, int action)
1205 {
1206 struct alc_spec *spec = codec->spec;
1207 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1208 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
1209 spec->gen.hp_automute_hook = alc269_x101_hp_automute_hook;
1210 }
1211 }
1212
alc_update_vref_led(struct hda_codec * codec,hda_nid_t pin,bool polarity,bool on)1213 static void alc_update_vref_led(struct hda_codec *codec, hda_nid_t pin,
1214 bool polarity, bool on)
1215 {
1216 unsigned int pinval;
1217
1218 if (!pin)
1219 return;
1220 if (polarity)
1221 on = !on;
1222 pinval = snd_hda_codec_get_pin_target(codec, pin);
1223 pinval &= ~AC_PINCTL_VREFEN;
1224 pinval |= on ? AC_PINCTL_VREF_80 : AC_PINCTL_VREF_HIZ;
1225 /* temporarily power up/down for setting VREF */
1226 CLASS(snd_hda_power_pm, pm)(codec);
1227 snd_hda_set_pin_ctl_cache(codec, pin, pinval);
1228 }
1229
1230 /* 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)1231 static int vref_mute_led_set(struct led_classdev *led_cdev,
1232 enum led_brightness brightness)
1233 {
1234 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
1235 struct alc_spec *spec = codec->spec;
1236
1237 alc_update_vref_led(codec, spec->mute_led_nid,
1238 spec->mute_led_polarity, brightness);
1239 return 0;
1240 }
1241
1242 /* Make sure the led works even in runtime suspend */
led_power_filter(struct hda_codec * codec,hda_nid_t nid,unsigned int power_state)1243 static unsigned int led_power_filter(struct hda_codec *codec,
1244 hda_nid_t nid,
1245 unsigned int power_state)
1246 {
1247 struct alc_spec *spec = codec->spec;
1248
1249 if (power_state != AC_PWRST_D3 || nid == 0 ||
1250 (nid != spec->mute_led_nid && nid != spec->cap_mute_led_nid))
1251 return power_state;
1252
1253 /* Set pin ctl again, it might have just been set to 0 */
1254 snd_hda_set_pin_ctl(codec, nid,
1255 snd_hda_codec_get_pin_target(codec, nid));
1256
1257 return snd_hda_gen_path_power_filter(codec, nid, power_state);
1258 }
1259
alc269_fixup_hp_mute_led(struct hda_codec * codec,const struct hda_fixup * fix,int action)1260 static void alc269_fixup_hp_mute_led(struct hda_codec *codec,
1261 const struct hda_fixup *fix, int action)
1262 {
1263 struct alc_spec *spec = codec->spec;
1264 const struct dmi_device *dev = NULL;
1265
1266 if (action != HDA_FIXUP_ACT_PRE_PROBE)
1267 return;
1268
1269 while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) {
1270 int pol, pin;
1271 if (sscanf(dev->name, "HP_Mute_LED_%d_%x", &pol, &pin) != 2)
1272 continue;
1273 if (pin < 0x0a || pin >= 0x10)
1274 break;
1275 spec->mute_led_polarity = pol;
1276 spec->mute_led_nid = pin - 0x0a + 0x18;
1277 snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
1278 codec->power_filter = led_power_filter;
1279 codec_dbg(codec,
1280 "Detected mute LED for %x:%d\n", spec->mute_led_nid,
1281 spec->mute_led_polarity);
1282 break;
1283 }
1284 }
1285
alc269_fixup_hp_mute_led_micx(struct hda_codec * codec,const struct hda_fixup * fix,int action,hda_nid_t pin)1286 static void alc269_fixup_hp_mute_led_micx(struct hda_codec *codec,
1287 const struct hda_fixup *fix,
1288 int action, hda_nid_t pin)
1289 {
1290 struct alc_spec *spec = codec->spec;
1291
1292 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1293 spec->mute_led_polarity = 0;
1294 spec->mute_led_nid = pin;
1295 snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
1296 codec->power_filter = led_power_filter;
1297 }
1298 }
1299
alc269_fixup_hp_mute_led_mic1(struct hda_codec * codec,const struct hda_fixup * fix,int action)1300 static void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec,
1301 const struct hda_fixup *fix, int action)
1302 {
1303 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x18);
1304 }
1305
alc269_fixup_hp_mute_led_mic2(struct hda_codec * codec,const struct hda_fixup * fix,int action)1306 static void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec,
1307 const struct hda_fixup *fix, int action)
1308 {
1309 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x19);
1310 }
1311
alc269_fixup_hp_mute_led_mic3(struct hda_codec * codec,const struct hda_fixup * fix,int action)1312 static void alc269_fixup_hp_mute_led_mic3(struct hda_codec *codec,
1313 const struct hda_fixup *fix, int action)
1314 {
1315 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1b);
1316 }
1317
alc236_fixup_hp_gpio_led(struct hda_codec * codec,const struct hda_fixup * fix,int action)1318 static void alc236_fixup_hp_gpio_led(struct hda_codec *codec,
1319 const struct hda_fixup *fix, int action)
1320 {
1321 alc_fixup_hp_gpio_led(codec, action, 0x02, 0x01);
1322 }
1323
alc269_fixup_hp_gpio_led(struct hda_codec * codec,const struct hda_fixup * fix,int action)1324 static void alc269_fixup_hp_gpio_led(struct hda_codec *codec,
1325 const struct hda_fixup *fix, int action)
1326 {
1327 alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
1328 }
1329
alc285_fixup_hp_gpio_led(struct hda_codec * codec,const struct hda_fixup * fix,int action)1330 static void alc285_fixup_hp_gpio_led(struct hda_codec *codec,
1331 const struct hda_fixup *fix, int action)
1332 {
1333 alc_fixup_hp_gpio_led(codec, action, 0x04, 0x01);
1334 }
1335
alc286_fixup_hp_gpio_led(struct hda_codec * codec,const struct hda_fixup * fix,int action)1336 static void alc286_fixup_hp_gpio_led(struct hda_codec *codec,
1337 const struct hda_fixup *fix, int action)
1338 {
1339 alc_fixup_hp_gpio_led(codec, action, 0x02, 0x20);
1340 }
1341
alc287_fixup_hp_gpio_led(struct hda_codec * codec,const struct hda_fixup * fix,int action)1342 static void alc287_fixup_hp_gpio_led(struct hda_codec *codec,
1343 const struct hda_fixup *fix, int action)
1344 {
1345 alc_fixup_hp_gpio_led(codec, action, 0x10, 0);
1346 }
1347
alc245_fixup_hp_gpio_led(struct hda_codec * codec,const struct hda_fixup * fix,int action)1348 static void alc245_fixup_hp_gpio_led(struct hda_codec *codec,
1349 const struct hda_fixup *fix, int action)
1350 {
1351 struct alc_spec *spec = codec->spec;
1352
1353 if (action == HDA_FIXUP_ACT_PRE_PROBE)
1354 spec->micmute_led_polarity = 1;
1355 alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
1356 }
1357
1358 /* 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)1359 static int vref_micmute_led_set(struct led_classdev *led_cdev,
1360 enum led_brightness brightness)
1361 {
1362 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
1363 struct alc_spec *spec = codec->spec;
1364
1365 alc_update_vref_led(codec, spec->cap_mute_led_nid,
1366 spec->micmute_led_polarity, brightness);
1367 return 0;
1368 }
1369
alc269_fixup_hp_gpio_mic1_led(struct hda_codec * codec,const struct hda_fixup * fix,int action)1370 static void alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec,
1371 const struct hda_fixup *fix, int action)
1372 {
1373 struct alc_spec *spec = codec->spec;
1374
1375 alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
1376 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1377 /* Like hp_gpio_mic1_led, but also needs GPIO4 low to
1378 * enable headphone amp
1379 */
1380 spec->gpio_mask |= 0x10;
1381 spec->gpio_dir |= 0x10;
1382 spec->cap_mute_led_nid = 0x18;
1383 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
1384 codec->power_filter = led_power_filter;
1385 }
1386 }
1387
alc280_fixup_hp_gpio4(struct hda_codec * codec,const struct hda_fixup * fix,int action)1388 static void alc280_fixup_hp_gpio4(struct hda_codec *codec,
1389 const struct hda_fixup *fix, int action)
1390 {
1391 struct alc_spec *spec = codec->spec;
1392
1393 alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
1394 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1395 spec->cap_mute_led_nid = 0x18;
1396 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
1397 codec->power_filter = led_power_filter;
1398 }
1399 }
1400
1401 /* HP Spectre x360 14 model needs a unique workaround for enabling the amp;
1402 * it needs to toggle the GPIO0 once on and off at each time (bko#210633)
1403 */
alc245_fixup_hp_x360_amp(struct hda_codec * codec,const struct hda_fixup * fix,int action)1404 static void alc245_fixup_hp_x360_amp(struct hda_codec *codec,
1405 const struct hda_fixup *fix, int action)
1406 {
1407 struct alc_spec *spec = codec->spec;
1408
1409 switch (action) {
1410 case HDA_FIXUP_ACT_PRE_PROBE:
1411 spec->gpio_mask |= 0x01;
1412 spec->gpio_dir |= 0x01;
1413 break;
1414 case HDA_FIXUP_ACT_INIT:
1415 /* need to toggle GPIO to enable the amp */
1416 alc_update_gpio_data(codec, 0x01, true);
1417 msleep(100);
1418 alc_update_gpio_data(codec, 0x01, false);
1419 break;
1420 }
1421 }
1422
1423 /* 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)1424 static void alc274_hp_envy_pcm_hook(struct hda_pcm_stream *hinfo,
1425 struct hda_codec *codec,
1426 struct snd_pcm_substream *substream,
1427 int action)
1428 {
1429 switch (action) {
1430 case HDA_GEN_PCM_ACT_PREPARE:
1431 alc_update_gpio_data(codec, 0x04, true);
1432 break;
1433 case HDA_GEN_PCM_ACT_CLEANUP:
1434 alc_update_gpio_data(codec, 0x04, false);
1435 break;
1436 }
1437 }
1438
alc274_fixup_hp_envy_gpio(struct hda_codec * codec,const struct hda_fixup * fix,int action)1439 static void alc274_fixup_hp_envy_gpio(struct hda_codec *codec,
1440 const struct hda_fixup *fix,
1441 int action)
1442 {
1443 struct alc_spec *spec = codec->spec;
1444
1445 if (action == HDA_FIXUP_ACT_PROBE) {
1446 spec->gpio_mask |= 0x04;
1447 spec->gpio_dir |= 0x04;
1448 spec->gen.pcm_playback_hook = alc274_hp_envy_pcm_hook;
1449 }
1450 }
1451
alc_update_coef_led(struct hda_codec * codec,struct alc_coef_led * led,bool polarity,bool on)1452 static void alc_update_coef_led(struct hda_codec *codec,
1453 struct alc_coef_led *led,
1454 bool polarity, bool on)
1455 {
1456 if (polarity)
1457 on = !on;
1458 /* temporarily power up/down for setting COEF bit */
1459 alc_update_coef_idx(codec, led->idx, led->mask,
1460 on ? led->on : led->off);
1461 }
1462
1463 /* 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)1464 static int coef_mute_led_set(struct led_classdev *led_cdev,
1465 enum led_brightness brightness)
1466 {
1467 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
1468 struct alc_spec *spec = codec->spec;
1469
1470 alc_update_coef_led(codec, &spec->mute_led_coef,
1471 spec->mute_led_polarity, brightness);
1472 return 0;
1473 }
1474
alc285_fixup_hp_mute_led_coefbit(struct hda_codec * codec,const struct hda_fixup * fix,int action)1475 static void alc285_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
1476 const struct hda_fixup *fix,
1477 int action)
1478 {
1479 struct alc_spec *spec = codec->spec;
1480
1481 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1482 spec->mute_led_polarity = 0;
1483 spec->mute_led_coef.idx = 0x0b;
1484 spec->mute_led_coef.mask = 1 << 3;
1485 spec->mute_led_coef.on = 1 << 3;
1486 spec->mute_led_coef.off = 0;
1487 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
1488 }
1489 }
1490
alc236_fixup_hp_mute_led_coefbit(struct hda_codec * codec,const struct hda_fixup * fix,int action)1491 static void alc236_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
1492 const struct hda_fixup *fix,
1493 int action)
1494 {
1495 struct alc_spec *spec = codec->spec;
1496
1497 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1498 spec->mute_led_polarity = 0;
1499 spec->mute_led_coef.idx = 0x34;
1500 spec->mute_led_coef.mask = 1 << 5;
1501 spec->mute_led_coef.on = 0;
1502 spec->mute_led_coef.off = 1 << 5;
1503 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
1504 }
1505 }
1506
alc236_fixup_hp_mute_led_coefbit2(struct hda_codec * codec,const struct hda_fixup * fix,int action)1507 static void alc236_fixup_hp_mute_led_coefbit2(struct hda_codec *codec,
1508 const struct hda_fixup *fix, int action)
1509 {
1510 struct alc_spec *spec = codec->spec;
1511
1512 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1513 spec->mute_led_polarity = 0;
1514 spec->mute_led_coef.idx = 0x07;
1515 spec->mute_led_coef.mask = 1;
1516 spec->mute_led_coef.on = 1;
1517 spec->mute_led_coef.off = 0;
1518 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
1519 }
1520 }
1521
alc245_fixup_hp_mute_led_coefbit(struct hda_codec * codec,const struct hda_fixup * fix,int action)1522 static void alc245_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
1523 const struct hda_fixup *fix,
1524 int action)
1525 {
1526 struct alc_spec *spec = codec->spec;
1527
1528 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1529 spec->mute_led_polarity = 0;
1530 spec->mute_led_coef.idx = 0x0b;
1531 spec->mute_led_coef.mask = 3 << 2;
1532 spec->mute_led_coef.on = 2 << 2;
1533 spec->mute_led_coef.off = 1 << 2;
1534 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
1535 }
1536 }
1537
alc245_fixup_hp_mute_led_v1_coefbit(struct hda_codec * codec,const struct hda_fixup * fix,int action)1538 static void alc245_fixup_hp_mute_led_v1_coefbit(struct hda_codec *codec,
1539 const struct hda_fixup *fix,
1540 int action)
1541 {
1542 struct alc_spec *spec = codec->spec;
1543
1544 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1545 spec->mute_led_polarity = 0;
1546 spec->mute_led_coef.idx = 0x0b;
1547 spec->mute_led_coef.mask = 3 << 2;
1548 spec->mute_led_coef.on = 1 << 3;
1549 spec->mute_led_coef.off = 0;
1550 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
1551 }
1552 }
1553
1554 /* 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)1555 static int coef_micmute_led_set(struct led_classdev *led_cdev,
1556 enum led_brightness brightness)
1557 {
1558 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
1559 struct alc_spec *spec = codec->spec;
1560
1561 alc_update_coef_led(codec, &spec->mic_led_coef,
1562 spec->micmute_led_polarity, brightness);
1563 return 0;
1564 }
1565
alc285_fixup_hp_coef_micmute_led(struct hda_codec * codec,const struct hda_fixup * fix,int action)1566 static void alc285_fixup_hp_coef_micmute_led(struct hda_codec *codec,
1567 const struct hda_fixup *fix, int action)
1568 {
1569 struct alc_spec *spec = codec->spec;
1570
1571 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1572 spec->mic_led_coef.idx = 0x19;
1573 spec->mic_led_coef.mask = 1 << 13;
1574 spec->mic_led_coef.on = 1 << 13;
1575 spec->mic_led_coef.off = 0;
1576 snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
1577 }
1578 }
1579
alc285_fixup_hp_gpio_micmute_led(struct hda_codec * codec,const struct hda_fixup * fix,int action)1580 static void alc285_fixup_hp_gpio_micmute_led(struct hda_codec *codec,
1581 const struct hda_fixup *fix, int action)
1582 {
1583 struct alc_spec *spec = codec->spec;
1584
1585 if (action == HDA_FIXUP_ACT_PRE_PROBE)
1586 spec->micmute_led_polarity = 1;
1587 alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
1588 }
1589
alc236_fixup_hp_coef_micmute_led(struct hda_codec * codec,const struct hda_fixup * fix,int action)1590 static void alc236_fixup_hp_coef_micmute_led(struct hda_codec *codec,
1591 const struct hda_fixup *fix, int action)
1592 {
1593 struct alc_spec *spec = codec->spec;
1594
1595 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1596 spec->mic_led_coef.idx = 0x35;
1597 spec->mic_led_coef.mask = 3 << 2;
1598 spec->mic_led_coef.on = 2 << 2;
1599 spec->mic_led_coef.off = 1 << 2;
1600 snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
1601 }
1602 }
1603
alc295_fixup_hp_mute_led_coefbit11(struct hda_codec * codec,const struct hda_fixup * fix,int action)1604 static void alc295_fixup_hp_mute_led_coefbit11(struct hda_codec *codec,
1605 const struct hda_fixup *fix, int action)
1606 {
1607 struct alc_spec *spec = codec->spec;
1608
1609 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1610 spec->mute_led_polarity = 0;
1611 spec->mute_led_coef.idx = 0xb;
1612 spec->mute_led_coef.mask = 3 << 3;
1613 spec->mute_led_coef.on = 1 << 3;
1614 spec->mute_led_coef.off = 1 << 4;
1615 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
1616 }
1617 }
1618
alc285_fixup_hp_mute_led(struct hda_codec * codec,const struct hda_fixup * fix,int action)1619 static void alc285_fixup_hp_mute_led(struct hda_codec *codec,
1620 const struct hda_fixup *fix, int action)
1621 {
1622 alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
1623 alc285_fixup_hp_coef_micmute_led(codec, fix, action);
1624 }
1625
alc285_fixup_hp_spectre_x360_mute_led(struct hda_codec * codec,const struct hda_fixup * fix,int action)1626 static void alc285_fixup_hp_spectre_x360_mute_led(struct hda_codec *codec,
1627 const struct hda_fixup *fix, int action)
1628 {
1629 alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
1630 alc285_fixup_hp_gpio_micmute_led(codec, fix, action);
1631 }
1632
alc236_fixup_hp_mute_led(struct hda_codec * codec,const struct hda_fixup * fix,int action)1633 static void alc236_fixup_hp_mute_led(struct hda_codec *codec,
1634 const struct hda_fixup *fix, int action)
1635 {
1636 alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
1637 alc236_fixup_hp_coef_micmute_led(codec, fix, action);
1638 }
1639
alc236_fixup_hp_micmute_led_vref(struct hda_codec * codec,const struct hda_fixup * fix,int action)1640 static void alc236_fixup_hp_micmute_led_vref(struct hda_codec *codec,
1641 const struct hda_fixup *fix, int action)
1642 {
1643 struct alc_spec *spec = codec->spec;
1644
1645 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1646 spec->cap_mute_led_nid = 0x1a;
1647 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
1648 codec->power_filter = led_power_filter;
1649 }
1650 }
1651
alc236_fixup_hp_mute_led_micmute_vref(struct hda_codec * codec,const struct hda_fixup * fix,int action)1652 static void alc236_fixup_hp_mute_led_micmute_vref(struct hda_codec *codec,
1653 const struct hda_fixup *fix, int action)
1654 {
1655 alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
1656 alc236_fixup_hp_micmute_led_vref(codec, fix, action);
1657 }
1658
alc298_samsung_write_coef_pack(struct hda_codec * codec,const unsigned short coefs[2])1659 static inline void alc298_samsung_write_coef_pack(struct hda_codec *codec,
1660 const unsigned short coefs[2])
1661 {
1662 alc_write_coef_idx(codec, 0x23, coefs[0]);
1663 alc_write_coef_idx(codec, 0x25, coefs[1]);
1664 alc_write_coef_idx(codec, 0x26, 0xb011);
1665 }
1666
1667 struct alc298_samsung_amp_desc {
1668 unsigned char nid;
1669 unsigned short init_seq[2][2];
1670 };
1671
alc298_fixup_samsung_amp(struct hda_codec * codec,const struct hda_fixup * fix,int action)1672 static void alc298_fixup_samsung_amp(struct hda_codec *codec,
1673 const struct hda_fixup *fix, int action)
1674 {
1675 int i, j;
1676 static const unsigned short init_seq[][2] = {
1677 { 0x19, 0x00 }, { 0x20, 0xc0 }, { 0x22, 0x44 }, { 0x23, 0x08 },
1678 { 0x24, 0x85 }, { 0x25, 0x41 }, { 0x35, 0x40 }, { 0x36, 0x01 },
1679 { 0x38, 0x81 }, { 0x3a, 0x03 }, { 0x3b, 0x81 }, { 0x40, 0x3e },
1680 { 0x41, 0x07 }, { 0x400, 0x1 }
1681 };
1682 static const struct alc298_samsung_amp_desc amps[] = {
1683 { 0x3a, { { 0x18, 0x1 }, { 0x26, 0x0 } } },
1684 { 0x39, { { 0x18, 0x2 }, { 0x26, 0x1 } } }
1685 };
1686
1687 if (action != HDA_FIXUP_ACT_INIT)
1688 return;
1689
1690 for (i = 0; i < ARRAY_SIZE(amps); i++) {
1691 alc_write_coef_idx(codec, 0x22, amps[i].nid);
1692
1693 for (j = 0; j < ARRAY_SIZE(amps[i].init_seq); j++)
1694 alc298_samsung_write_coef_pack(codec, amps[i].init_seq[j]);
1695
1696 for (j = 0; j < ARRAY_SIZE(init_seq); j++)
1697 alc298_samsung_write_coef_pack(codec, init_seq[j]);
1698 }
1699 }
1700
1701 struct alc298_samsung_v2_amp_desc {
1702 unsigned short nid;
1703 int init_seq_size;
1704 unsigned short init_seq[18][2];
1705 };
1706
1707 static const struct alc298_samsung_v2_amp_desc
1708 alc298_samsung_v2_amp_desc_tbl[] = {
1709 { 0x38, 18, {
1710 { 0x23e1, 0x0000 }, { 0x2012, 0x006f }, { 0x2014, 0x0000 },
1711 { 0x201b, 0x0001 }, { 0x201d, 0x0001 }, { 0x201f, 0x00fe },
1712 { 0x2021, 0x0000 }, { 0x2022, 0x0010 }, { 0x203d, 0x0005 },
1713 { 0x203f, 0x0003 }, { 0x2050, 0x002c }, { 0x2076, 0x000e },
1714 { 0x207c, 0x004a }, { 0x2081, 0x0003 }, { 0x2399, 0x0003 },
1715 { 0x23a4, 0x00b5 }, { 0x23a5, 0x0001 }, { 0x23ba, 0x0094 }
1716 }},
1717 { 0x39, 18, {
1718 { 0x23e1, 0x0000 }, { 0x2012, 0x006f }, { 0x2014, 0x0000 },
1719 { 0x201b, 0x0002 }, { 0x201d, 0x0002 }, { 0x201f, 0x00fd },
1720 { 0x2021, 0x0001 }, { 0x2022, 0x0010 }, { 0x203d, 0x0005 },
1721 { 0x203f, 0x0003 }, { 0x2050, 0x002c }, { 0x2076, 0x000e },
1722 { 0x207c, 0x004a }, { 0x2081, 0x0003 }, { 0x2399, 0x0003 },
1723 { 0x23a4, 0x00b5 }, { 0x23a5, 0x0001 }, { 0x23ba, 0x0094 }
1724 }},
1725 { 0x3c, 15, {
1726 { 0x23e1, 0x0000 }, { 0x2012, 0x006f }, { 0x2014, 0x0000 },
1727 { 0x201b, 0x0001 }, { 0x201d, 0x0001 }, { 0x201f, 0x00fe },
1728 { 0x2021, 0x0000 }, { 0x2022, 0x0010 }, { 0x203d, 0x0005 },
1729 { 0x203f, 0x0003 }, { 0x2050, 0x002c }, { 0x2076, 0x000e },
1730 { 0x207c, 0x004a }, { 0x2081, 0x0003 }, { 0x23ba, 0x008d }
1731 }},
1732 { 0x3d, 15, {
1733 { 0x23e1, 0x0000 }, { 0x2012, 0x006f }, { 0x2014, 0x0000 },
1734 { 0x201b, 0x0002 }, { 0x201d, 0x0002 }, { 0x201f, 0x00fd },
1735 { 0x2021, 0x0001 }, { 0x2022, 0x0010 }, { 0x203d, 0x0005 },
1736 { 0x203f, 0x0003 }, { 0x2050, 0x002c }, { 0x2076, 0x000e },
1737 { 0x207c, 0x004a }, { 0x2081, 0x0003 }, { 0x23ba, 0x008d }
1738 }}
1739 };
1740
alc298_samsung_v2_enable_amps(struct hda_codec * codec)1741 static void alc298_samsung_v2_enable_amps(struct hda_codec *codec)
1742 {
1743 struct alc_spec *spec = codec->spec;
1744 static const unsigned short enable_seq[][2] = {
1745 { 0x203a, 0x0081 }, { 0x23ff, 0x0001 },
1746 };
1747 int i, j;
1748
1749 for (i = 0; i < spec->num_speaker_amps; i++) {
1750 alc_write_coef_idx(codec, 0x22, alc298_samsung_v2_amp_desc_tbl[i].nid);
1751 for (j = 0; j < ARRAY_SIZE(enable_seq); j++)
1752 alc298_samsung_write_coef_pack(codec, enable_seq[j]);
1753 codec_dbg(codec, "alc298_samsung_v2: Enabled speaker amp 0x%02x\n",
1754 alc298_samsung_v2_amp_desc_tbl[i].nid);
1755 }
1756 }
1757
alc298_samsung_v2_disable_amps(struct hda_codec * codec)1758 static void alc298_samsung_v2_disable_amps(struct hda_codec *codec)
1759 {
1760 struct alc_spec *spec = codec->spec;
1761 static const unsigned short disable_seq[][2] = {
1762 { 0x23ff, 0x0000 }, { 0x203a, 0x0080 },
1763 };
1764 int i, j;
1765
1766 for (i = 0; i < spec->num_speaker_amps; i++) {
1767 alc_write_coef_idx(codec, 0x22, alc298_samsung_v2_amp_desc_tbl[i].nid);
1768 for (j = 0; j < ARRAY_SIZE(disable_seq); j++)
1769 alc298_samsung_write_coef_pack(codec, disable_seq[j]);
1770 codec_dbg(codec, "alc298_samsung_v2: Disabled speaker amp 0x%02x\n",
1771 alc298_samsung_v2_amp_desc_tbl[i].nid);
1772 }
1773 }
1774
alc298_samsung_v2_playback_hook(struct hda_pcm_stream * hinfo,struct hda_codec * codec,struct snd_pcm_substream * substream,int action)1775 static void alc298_samsung_v2_playback_hook(struct hda_pcm_stream *hinfo,
1776 struct hda_codec *codec,
1777 struct snd_pcm_substream *substream,
1778 int action)
1779 {
1780 /* Dynamically enable/disable speaker amps before and after playback */
1781 if (action == HDA_GEN_PCM_ACT_OPEN)
1782 alc298_samsung_v2_enable_amps(codec);
1783 if (action == HDA_GEN_PCM_ACT_CLOSE)
1784 alc298_samsung_v2_disable_amps(codec);
1785 }
1786
alc298_samsung_v2_init_amps(struct hda_codec * codec,int num_speaker_amps)1787 static void alc298_samsung_v2_init_amps(struct hda_codec *codec,
1788 int num_speaker_amps)
1789 {
1790 struct alc_spec *spec = codec->spec;
1791 int i, j;
1792
1793 /* Set spec's num_speaker_amps before doing anything else */
1794 spec->num_speaker_amps = num_speaker_amps;
1795
1796 /* Disable speaker amps before init to prevent any physical damage */
1797 alc298_samsung_v2_disable_amps(codec);
1798
1799 /* Initialize the speaker amps */
1800 for (i = 0; i < spec->num_speaker_amps; i++) {
1801 alc_write_coef_idx(codec, 0x22, alc298_samsung_v2_amp_desc_tbl[i].nid);
1802 for (j = 0; j < alc298_samsung_v2_amp_desc_tbl[i].init_seq_size; j++) {
1803 alc298_samsung_write_coef_pack(codec,
1804 alc298_samsung_v2_amp_desc_tbl[i].init_seq[j]);
1805 }
1806 alc_write_coef_idx(codec, 0x89, 0x0);
1807 codec_dbg(codec, "alc298_samsung_v2: Initialized speaker amp 0x%02x\n",
1808 alc298_samsung_v2_amp_desc_tbl[i].nid);
1809 }
1810
1811 /* register hook to enable speaker amps only when they are needed */
1812 spec->gen.pcm_playback_hook = alc298_samsung_v2_playback_hook;
1813 }
1814
alc298_fixup_samsung_amp_v2_2_amps(struct hda_codec * codec,const struct hda_fixup * fix,int action)1815 static void alc298_fixup_samsung_amp_v2_2_amps(struct hda_codec *codec,
1816 const struct hda_fixup *fix, int action)
1817 {
1818 if (action == HDA_FIXUP_ACT_PROBE)
1819 alc298_samsung_v2_init_amps(codec, 2);
1820 }
1821
alc298_fixup_samsung_amp_v2_4_amps(struct hda_codec * codec,const struct hda_fixup * fix,int action)1822 static void alc298_fixup_samsung_amp_v2_4_amps(struct hda_codec *codec,
1823 const struct hda_fixup *fix, int action)
1824 {
1825 if (action == HDA_FIXUP_ACT_PROBE)
1826 alc298_samsung_v2_init_amps(codec, 4);
1827 }
1828
gpio2_mic_hotkey_event(struct hda_codec * codec,struct hda_jack_callback * event)1829 static void gpio2_mic_hotkey_event(struct hda_codec *codec,
1830 struct hda_jack_callback *event)
1831 {
1832 struct alc_spec *spec = codec->spec;
1833
1834 /* GPIO2 just toggles on a keypress/keyrelease cycle. Therefore
1835 send both key on and key off event for every interrupt. */
1836 input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 1);
1837 input_sync(spec->kb_dev);
1838 input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 0);
1839 input_sync(spec->kb_dev);
1840 }
1841
alc_register_micmute_input_device(struct hda_codec * codec)1842 static int alc_register_micmute_input_device(struct hda_codec *codec)
1843 {
1844 struct alc_spec *spec = codec->spec;
1845 int i;
1846
1847 spec->kb_dev = input_allocate_device();
1848 if (!spec->kb_dev) {
1849 codec_err(codec, "Out of memory (input_allocate_device)\n");
1850 return -ENOMEM;
1851 }
1852
1853 spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX] = KEY_MICMUTE;
1854
1855 spec->kb_dev->name = "Microphone Mute Button";
1856 spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY);
1857 spec->kb_dev->keycodesize = sizeof(spec->alc_mute_keycode_map[0]);
1858 spec->kb_dev->keycodemax = ARRAY_SIZE(spec->alc_mute_keycode_map);
1859 spec->kb_dev->keycode = spec->alc_mute_keycode_map;
1860 for (i = 0; i < ARRAY_SIZE(spec->alc_mute_keycode_map); i++)
1861 set_bit(spec->alc_mute_keycode_map[i], spec->kb_dev->keybit);
1862
1863 if (input_register_device(spec->kb_dev)) {
1864 codec_err(codec, "input_register_device failed\n");
1865 input_free_device(spec->kb_dev);
1866 spec->kb_dev = NULL;
1867 return -ENOMEM;
1868 }
1869
1870 return 0;
1871 }
1872
1873 /* GPIO1 = set according to SKU external amp
1874 * GPIO2 = mic mute hotkey
1875 * GPIO3 = mute LED
1876 * GPIO4 = mic mute LED
1877 */
alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec * codec,const struct hda_fixup * fix,int action)1878 static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec,
1879 const struct hda_fixup *fix, int action)
1880 {
1881 struct alc_spec *spec = codec->spec;
1882
1883 alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
1884 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1885 spec->init_amp = ALC_INIT_DEFAULT;
1886 if (alc_register_micmute_input_device(codec) != 0)
1887 return;
1888
1889 spec->gpio_mask |= 0x06;
1890 spec->gpio_dir |= 0x02;
1891 spec->gpio_data |= 0x02;
1892 snd_hda_codec_write_cache(codec, codec->core.afg, 0,
1893 AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x04);
1894 snd_hda_jack_detect_enable_callback(codec, codec->core.afg,
1895 gpio2_mic_hotkey_event);
1896 return;
1897 }
1898
1899 if (!spec->kb_dev)
1900 return;
1901
1902 switch (action) {
1903 case HDA_FIXUP_ACT_FREE:
1904 input_unregister_device(spec->kb_dev);
1905 spec->kb_dev = NULL;
1906 }
1907 }
1908
1909 /* Line2 = mic mute hotkey
1910 * GPIO2 = mic mute LED
1911 */
alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec * codec,const struct hda_fixup * fix,int action)1912 static void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec,
1913 const struct hda_fixup *fix, int action)
1914 {
1915 struct alc_spec *spec = codec->spec;
1916
1917 alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
1918 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1919 spec->init_amp = ALC_INIT_DEFAULT;
1920 if (alc_register_micmute_input_device(codec) != 0)
1921 return;
1922
1923 snd_hda_jack_detect_enable_callback(codec, 0x1b,
1924 gpio2_mic_hotkey_event);
1925 return;
1926 }
1927
1928 if (!spec->kb_dev)
1929 return;
1930
1931 switch (action) {
1932 case HDA_FIXUP_ACT_FREE:
1933 input_unregister_device(spec->kb_dev);
1934 spec->kb_dev = NULL;
1935 }
1936 }
1937
alc269_fixup_hp_line1_mic1_led(struct hda_codec * codec,const struct hda_fixup * fix,int action)1938 static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec,
1939 const struct hda_fixup *fix, int action)
1940 {
1941 struct alc_spec *spec = codec->spec;
1942
1943 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1a);
1944 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1945 spec->cap_mute_led_nid = 0x18;
1946 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
1947 }
1948 }
1949
alc233_fixup_lenovo_low_en_micmute_led(struct hda_codec * codec,const struct hda_fixup * fix,int action)1950 static void alc233_fixup_lenovo_low_en_micmute_led(struct hda_codec *codec,
1951 const struct hda_fixup *fix, int action)
1952 {
1953 struct alc_spec *spec = codec->spec;
1954
1955 if (action == HDA_FIXUP_ACT_PRE_PROBE)
1956 spec->micmute_led_polarity = 1;
1957 alc233_fixup_lenovo_line2_mic_hotkey(codec, fix, action);
1958 }
1959
alc255_set_default_jack_type(struct hda_codec * codec)1960 static void alc255_set_default_jack_type(struct hda_codec *codec)
1961 {
1962 /* Set to iphone type */
1963 static const struct coef_fw alc255fw[] = {
1964 WRITE_COEF(0x1b, 0x880b),
1965 WRITE_COEF(0x45, 0xd089),
1966 WRITE_COEF(0x1b, 0x080b),
1967 WRITE_COEF(0x46, 0x0004),
1968 WRITE_COEF(0x1b, 0x0c0b),
1969 {}
1970 };
1971 static const struct coef_fw alc256fw[] = {
1972 WRITE_COEF(0x1b, 0x884b),
1973 WRITE_COEF(0x45, 0xd089),
1974 WRITE_COEF(0x1b, 0x084b),
1975 WRITE_COEF(0x46, 0x0004),
1976 WRITE_COEF(0x1b, 0x0c4b),
1977 {}
1978 };
1979 switch (codec->core.vendor_id) {
1980 case 0x10ec0255:
1981 alc_process_coef_fw(codec, alc255fw);
1982 break;
1983 case 0x10ec0230:
1984 case 0x10ec0236:
1985 case 0x10ec0256:
1986 case 0x19e58326:
1987 alc_process_coef_fw(codec, alc256fw);
1988 break;
1989 }
1990 msleep(30);
1991 }
1992
alc_fixup_headset_mode_alc255(struct hda_codec * codec,const struct hda_fixup * fix,int action)1993 static void alc_fixup_headset_mode_alc255(struct hda_codec *codec,
1994 const struct hda_fixup *fix, int action)
1995 {
1996 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1997 alc255_set_default_jack_type(codec);
1998 }
1999 alc_fixup_headset_mode(codec, fix, action);
2000 }
2001
alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec * codec,const struct hda_fixup * fix,int action)2002 static void alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec,
2003 const struct hda_fixup *fix, int action)
2004 {
2005 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2006 struct alc_spec *spec = codec->spec;
2007 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
2008 alc255_set_default_jack_type(codec);
2009 }
2010 else
2011 alc_fixup_headset_mode(codec, fix, action);
2012 }
2013
alc288_update_headset_jack_cb(struct hda_codec * codec,struct hda_jack_callback * jack)2014 static void alc288_update_headset_jack_cb(struct hda_codec *codec,
2015 struct hda_jack_callback *jack)
2016 {
2017 struct alc_spec *spec = codec->spec;
2018
2019 alc_update_headset_jack_cb(codec, jack);
2020 /* Headset Mic enable or disable, only for Dell Dino */
2021 alc_update_gpio_data(codec, 0x40, spec->gen.hp_jack_present);
2022 }
2023
alc_fixup_headset_mode_dell_alc288(struct hda_codec * codec,const struct hda_fixup * fix,int action)2024 static void alc_fixup_headset_mode_dell_alc288(struct hda_codec *codec,
2025 const struct hda_fixup *fix, int action)
2026 {
2027 alc_fixup_headset_mode(codec, fix, action);
2028 if (action == HDA_FIXUP_ACT_PROBE) {
2029 struct alc_spec *spec = codec->spec;
2030 /* toggled via hp_automute_hook */
2031 spec->gpio_mask |= 0x40;
2032 spec->gpio_dir |= 0x40;
2033 spec->gen.hp_automute_hook = alc288_update_headset_jack_cb;
2034 }
2035 }
2036
alc_fixup_no_shutup(struct hda_codec * codec,const struct hda_fixup * fix,int action)2037 static void alc_fixup_no_shutup(struct hda_codec *codec,
2038 const struct hda_fixup *fix, int action)
2039 {
2040 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2041 struct alc_spec *spec = codec->spec;
2042 spec->no_shutup_pins = 1;
2043 }
2044 }
2045
2046 /* 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)2047 static void alc_fixup_tpt440_dock(struct hda_codec *codec,
2048 const struct hda_fixup *fix, int action)
2049 {
2050 static const struct hda_pintbl pincfgs[] = {
2051 { 0x16, 0x21211010 }, /* dock headphone */
2052 { 0x19, 0x21a11010 }, /* dock mic */
2053 { }
2054 };
2055 struct alc_spec *spec = codec->spec;
2056
2057 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2058 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
2059 codec->power_save_node = 0; /* avoid click noises */
2060 snd_hda_apply_pincfgs(codec, pincfgs);
2061 }
2062 }
2063
alc_fixup_tpt470_dock(struct hda_codec * codec,const struct hda_fixup * fix,int action)2064 static void alc_fixup_tpt470_dock(struct hda_codec *codec,
2065 const struct hda_fixup *fix, int action)
2066 {
2067 static const struct hda_pintbl pincfgs[] = {
2068 { 0x17, 0x21211010 }, /* dock headphone */
2069 { 0x19, 0x21a11010 }, /* dock mic */
2070 { }
2071 };
2072 struct alc_spec *spec = codec->spec;
2073
2074 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2075 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
2076 snd_hda_apply_pincfgs(codec, pincfgs);
2077 } else if (action == HDA_FIXUP_ACT_INIT) {
2078 /* Enable DOCK device */
2079 snd_hda_codec_write(codec, 0x17, 0,
2080 AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
2081 /* Enable DOCK device */
2082 snd_hda_codec_write(codec, 0x19, 0,
2083 AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
2084 }
2085 }
2086
alc_fixup_tpt470_dacs(struct hda_codec * codec,const struct hda_fixup * fix,int action)2087 static void alc_fixup_tpt470_dacs(struct hda_codec *codec,
2088 const struct hda_fixup *fix, int action)
2089 {
2090 /* Assure the speaker pin to be coupled with DAC NID 0x03; otherwise
2091 * the speaker output becomes too low by some reason on Thinkpads with
2092 * ALC298 codec
2093 */
2094 static const hda_nid_t preferred_pairs[] = {
2095 0x14, 0x03, 0x17, 0x02, 0x21, 0x02,
2096 0
2097 };
2098 struct alc_spec *spec = codec->spec;
2099
2100 if (action == HDA_FIXUP_ACT_PRE_PROBE)
2101 spec->gen.preferred_dacs = preferred_pairs;
2102 }
2103
alc295_fixup_asus_dacs(struct hda_codec * codec,const struct hda_fixup * fix,int action)2104 static void alc295_fixup_asus_dacs(struct hda_codec *codec,
2105 const struct hda_fixup *fix, int action)
2106 {
2107 static const hda_nid_t preferred_pairs[] = {
2108 0x17, 0x02, 0x21, 0x03, 0
2109 };
2110 struct alc_spec *spec = codec->spec;
2111
2112 if (action == HDA_FIXUP_ACT_PRE_PROBE)
2113 spec->gen.preferred_dacs = preferred_pairs;
2114 }
2115
alc271_hp_gate_mic_jack(struct hda_codec * codec,const struct hda_fixup * fix,int action)2116 static void alc271_hp_gate_mic_jack(struct hda_codec *codec,
2117 const struct hda_fixup *fix,
2118 int action)
2119 {
2120 struct alc_spec *spec = codec->spec;
2121
2122 if (action == HDA_FIXUP_ACT_PROBE) {
2123 int mic_pin = alc_find_ext_mic_pin(codec);
2124 int hp_pin = alc_get_hp_pin(spec);
2125
2126 if (snd_BUG_ON(!mic_pin || !hp_pin))
2127 return;
2128 snd_hda_jack_set_gating_jack(codec, mic_pin, hp_pin);
2129 }
2130 }
2131
alc269_fixup_limit_int_mic_boost(struct hda_codec * codec,const struct hda_fixup * fix,int action)2132 static void alc269_fixup_limit_int_mic_boost(struct hda_codec *codec,
2133 const struct hda_fixup *fix,
2134 int action)
2135 {
2136 struct alc_spec *spec = codec->spec;
2137 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
2138 int i;
2139
2140 /* The mic boosts on level 2 and 3 are too noisy
2141 on the internal mic input.
2142 Therefore limit the boost to 0 or 1. */
2143
2144 if (action != HDA_FIXUP_ACT_PROBE)
2145 return;
2146
2147 for (i = 0; i < cfg->num_inputs; i++) {
2148 hda_nid_t nid = cfg->inputs[i].pin;
2149 unsigned int defcfg;
2150 if (cfg->inputs[i].type != AUTO_PIN_MIC)
2151 continue;
2152 defcfg = snd_hda_codec_get_pincfg(codec, nid);
2153 if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
2154 continue;
2155
2156 snd_hda_override_amp_caps(codec, nid, HDA_INPUT,
2157 (0x00 << AC_AMPCAP_OFFSET_SHIFT) |
2158 (0x01 << AC_AMPCAP_NUM_STEPS_SHIFT) |
2159 (0x2f << AC_AMPCAP_STEP_SIZE_SHIFT) |
2160 (0 << AC_AMPCAP_MUTE_SHIFT));
2161 }
2162 }
2163
alc283_hp_automute_hook(struct hda_codec * codec,struct hda_jack_callback * jack)2164 static void alc283_hp_automute_hook(struct hda_codec *codec,
2165 struct hda_jack_callback *jack)
2166 {
2167 struct alc_spec *spec = codec->spec;
2168 int vref;
2169
2170 msleep(200);
2171 snd_hda_gen_hp_automute(codec, jack);
2172
2173 vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
2174
2175 msleep(600);
2176 snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
2177 vref);
2178 }
2179
alc283_fixup_chromebook(struct hda_codec * codec,const struct hda_fixup * fix,int action)2180 static void alc283_fixup_chromebook(struct hda_codec *codec,
2181 const struct hda_fixup *fix, int action)
2182 {
2183 struct alc_spec *spec = codec->spec;
2184
2185 switch (action) {
2186 case HDA_FIXUP_ACT_PRE_PROBE:
2187 snd_hda_override_wcaps(codec, 0x03, 0);
2188 /* Disable AA-loopback as it causes white noise */
2189 spec->gen.mixer_nid = 0;
2190 break;
2191 case HDA_FIXUP_ACT_INIT:
2192 /* MIC2-VREF control */
2193 /* Set to manual mode */
2194 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
2195 /* Enable Line1 input control by verb */
2196 alc_update_coef_idx(codec, 0x1a, 0, 1 << 4);
2197 break;
2198 }
2199 }
2200
alc283_fixup_sense_combo_jack(struct hda_codec * codec,const struct hda_fixup * fix,int action)2201 static void alc283_fixup_sense_combo_jack(struct hda_codec *codec,
2202 const struct hda_fixup *fix, int action)
2203 {
2204 struct alc_spec *spec = codec->spec;
2205
2206 switch (action) {
2207 case HDA_FIXUP_ACT_PRE_PROBE:
2208 spec->gen.hp_automute_hook = alc283_hp_automute_hook;
2209 break;
2210 case HDA_FIXUP_ACT_INIT:
2211 /* MIC2-VREF control */
2212 /* Set to manual mode */
2213 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
2214 break;
2215 }
2216 }
2217
2218 /* mute tablet speaker pin (0x14) via dock plugging in addition */
asus_tx300_automute(struct hda_codec * codec)2219 static void asus_tx300_automute(struct hda_codec *codec)
2220 {
2221 struct alc_spec *spec = codec->spec;
2222 snd_hda_gen_update_outputs(codec);
2223 if (snd_hda_jack_detect(codec, 0x1b))
2224 spec->gen.mute_bits |= (1ULL << 0x14);
2225 }
2226
alc282_fixup_asus_tx300(struct hda_codec * codec,const struct hda_fixup * fix,int action)2227 static void alc282_fixup_asus_tx300(struct hda_codec *codec,
2228 const struct hda_fixup *fix, int action)
2229 {
2230 struct alc_spec *spec = codec->spec;
2231 static const struct hda_pintbl dock_pins[] = {
2232 { 0x1b, 0x21114000 }, /* dock speaker pin */
2233 {}
2234 };
2235
2236 switch (action) {
2237 case HDA_FIXUP_ACT_PRE_PROBE:
2238 spec->init_amp = ALC_INIT_DEFAULT;
2239 /* TX300 needs to set up GPIO2 for the speaker amp */
2240 alc_setup_gpio(codec, 0x04);
2241 snd_hda_apply_pincfgs(codec, dock_pins);
2242 spec->gen.auto_mute_via_amp = 1;
2243 spec->gen.automute_hook = asus_tx300_automute;
2244 snd_hda_jack_detect_enable_callback(codec, 0x1b,
2245 snd_hda_gen_hp_automute);
2246 break;
2247 case HDA_FIXUP_ACT_PROBE:
2248 spec->init_amp = ALC_INIT_DEFAULT;
2249 break;
2250 case HDA_FIXUP_ACT_BUILD:
2251 /* this is a bit tricky; give more sane names for the main
2252 * (tablet) speaker and the dock speaker, respectively
2253 */
2254 rename_ctl(codec, "Speaker Playback Switch",
2255 "Dock Speaker Playback Switch");
2256 rename_ctl(codec, "Bass Speaker Playback Switch",
2257 "Speaker Playback Switch");
2258 break;
2259 }
2260 }
2261
alc290_fixup_mono_speakers(struct hda_codec * codec,const struct hda_fixup * fix,int action)2262 static void alc290_fixup_mono_speakers(struct hda_codec *codec,
2263 const struct hda_fixup *fix, int action)
2264 {
2265 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2266 /* DAC node 0x03 is giving mono output. We therefore want to
2267 make sure 0x14 (front speaker) and 0x15 (headphones) use the
2268 stereo DAC, while leaving 0x17 (bass speaker) for node 0x03. */
2269 static const hda_nid_t conn1[] = { 0x0c };
2270 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2271 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
2272 }
2273 }
2274
alc298_fixup_speaker_volume(struct hda_codec * codec,const struct hda_fixup * fix,int action)2275 static void alc298_fixup_speaker_volume(struct hda_codec *codec,
2276 const struct hda_fixup *fix, int action)
2277 {
2278 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2279 /* The speaker is routed to the Node 0x06 by a mistake, as a result
2280 we can't adjust the speaker's volume since this node does not has
2281 Amp-out capability. we change the speaker's route to:
2282 Node 0x02 (Audio Output) -> Node 0x0c (Audio Mixer) -> Node 0x17 (
2283 Pin Complex), since Node 0x02 has Amp-out caps, we can adjust
2284 speaker's volume now. */
2285
2286 static const hda_nid_t conn1[] = { 0x0c };
2287 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn1), conn1);
2288 }
2289 }
2290
2291 /* 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)2292 static void alc295_fixup_disable_dac3(struct hda_codec *codec,
2293 const struct hda_fixup *fix, int action)
2294 {
2295 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2296 static const hda_nid_t conn[] = { 0x02, 0x03 };
2297 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
2298 }
2299 }
2300
2301 /* 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)2302 static void alc285_fixup_speaker2_to_dac1(struct hda_codec *codec,
2303 const struct hda_fixup *fix, int action)
2304 {
2305 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2306 static const hda_nid_t conn[] = { 0x02 };
2307 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
2308 }
2309 }
2310
2311 /* disable DAC3 (0x06) selection on NID 0x15 - share Speaker/Bass Speaker DAC 0x03 */
alc294_fixup_bass_speaker_15(struct hda_codec * codec,const struct hda_fixup * fix,int action)2312 static void alc294_fixup_bass_speaker_15(struct hda_codec *codec,
2313 const struct hda_fixup *fix, int action)
2314 {
2315 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2316 static const hda_nid_t conn[] = { 0x02, 0x03 };
2317 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn), conn);
2318 snd_hda_gen_add_micmute_led_cdev(codec, NULL);
2319 }
2320 }
2321
2322 /* Hook to update amp GPIO4 for automute */
alc280_hp_gpio4_automute_hook(struct hda_codec * codec,struct hda_jack_callback * jack)2323 static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec,
2324 struct hda_jack_callback *jack)
2325 {
2326 struct alc_spec *spec = codec->spec;
2327
2328 snd_hda_gen_hp_automute(codec, jack);
2329 /* mute_led_polarity is set to 0, so we pass inverted value here */
2330 alc_update_gpio_led(codec, 0x10, spec->mute_led_polarity,
2331 !spec->gen.hp_jack_present);
2332 }
2333
2334 /* Manage GPIOs for HP EliteBook Folio 9480m.
2335 *
2336 * GPIO4 is the headphone amplifier power control
2337 * GPIO3 is the audio output mute indicator LED
2338 */
2339
alc280_fixup_hp_9480m(struct hda_codec * codec,const struct hda_fixup * fix,int action)2340 static void alc280_fixup_hp_9480m(struct hda_codec *codec,
2341 const struct hda_fixup *fix,
2342 int action)
2343 {
2344 struct alc_spec *spec = codec->spec;
2345
2346 alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
2347 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2348 /* amp at GPIO4; toggled via alc280_hp_gpio4_automute_hook() */
2349 spec->gpio_mask |= 0x10;
2350 spec->gpio_dir |= 0x10;
2351 spec->gen.hp_automute_hook = alc280_hp_gpio4_automute_hook;
2352 }
2353 }
2354
alc275_fixup_gpio4_off(struct hda_codec * codec,const struct hda_fixup * fix,int action)2355 static void alc275_fixup_gpio4_off(struct hda_codec *codec,
2356 const struct hda_fixup *fix,
2357 int action)
2358 {
2359 struct alc_spec *spec = codec->spec;
2360
2361 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2362 spec->gpio_mask |= 0x04;
2363 spec->gpio_dir |= 0x04;
2364 /* set data bit low */
2365 }
2366 }
2367
2368 /* Quirk for Thinkpad X1 7th and 8th Gen
2369 * The following fixed routing needed
2370 * DAC1 (NID 0x02) -> Speaker (NID 0x14); some eq applied secretly
2371 * DAC2 (NID 0x03) -> Bass (NID 0x17) & Headphone (NID 0x21); sharing a DAC
2372 * DAC3 (NID 0x06) -> Unused, due to the lack of volume amp
2373 */
alc285_fixup_thinkpad_x1_gen7(struct hda_codec * codec,const struct hda_fixup * fix,int action)2374 static void alc285_fixup_thinkpad_x1_gen7(struct hda_codec *codec,
2375 const struct hda_fixup *fix, int action)
2376 {
2377 static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */
2378 static const hda_nid_t preferred_pairs[] = {
2379 0x14, 0x02, 0x17, 0x03, 0x21, 0x03, 0
2380 };
2381 struct alc_spec *spec = codec->spec;
2382
2383 switch (action) {
2384 case HDA_FIXUP_ACT_PRE_PROBE:
2385 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
2386 spec->gen.preferred_dacs = preferred_pairs;
2387 break;
2388 case HDA_FIXUP_ACT_BUILD:
2389 /* The generic parser creates somewhat unintuitive volume ctls
2390 * with the fixed routing above, and the shared DAC2 may be
2391 * confusing for PA.
2392 * Rename those to unique names so that PA doesn't touch them
2393 * and use only Master volume.
2394 */
2395 rename_ctl(codec, "Front Playback Volume", "DAC1 Playback Volume");
2396 rename_ctl(codec, "Bass Speaker Playback Volume", "DAC2 Playback Volume");
2397 break;
2398 }
2399 }
2400
alc225_fixup_s3_pop_noise(struct hda_codec * codec,const struct hda_fixup * fix,int action)2401 static void alc225_fixup_s3_pop_noise(struct hda_codec *codec,
2402 const struct hda_fixup *fix, int action)
2403 {
2404 if (action != HDA_FIXUP_ACT_PRE_PROBE)
2405 return;
2406
2407 codec->power_save_node = 1;
2408 }
2409
2410 /* 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)2411 static void alc274_fixup_bind_dacs(struct hda_codec *codec,
2412 const struct hda_fixup *fix, int action)
2413 {
2414 struct alc_spec *spec = codec->spec;
2415 static const hda_nid_t preferred_pairs[] = {
2416 0x21, 0x03, 0x1b, 0x03, 0x16, 0x02,
2417 0
2418 };
2419
2420 if (action != HDA_FIXUP_ACT_PRE_PROBE)
2421 return;
2422
2423 spec->gen.preferred_dacs = preferred_pairs;
2424 spec->gen.auto_mute_via_amp = 1;
2425 codec->power_save_node = 0;
2426 }
2427
2428 /* avoid DAC 0x06 for speaker switch 0x17; it has no volume control */
alc274_fixup_hp_aio_bind_dacs(struct hda_codec * codec,const struct hda_fixup * fix,int action)2429 static void alc274_fixup_hp_aio_bind_dacs(struct hda_codec *codec,
2430 const struct hda_fixup *fix, int action)
2431 {
2432 static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */
2433 /* The speaker is routed to the Node 0x06 by a mistake, thus the
2434 * speaker's volume can't be adjusted since the node doesn't have
2435 * Amp-out capability. Assure the speaker and lineout pin to be
2436 * coupled with DAC NID 0x02.
2437 */
2438 static const hda_nid_t preferred_pairs[] = {
2439 0x16, 0x02, 0x17, 0x02, 0x21, 0x03, 0
2440 };
2441 struct alc_spec *spec = codec->spec;
2442
2443 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
2444 spec->gen.preferred_dacs = preferred_pairs;
2445 }
2446
2447 /* 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)2448 static void alc289_fixup_asus_ga401(struct hda_codec *codec,
2449 const struct hda_fixup *fix, int action)
2450 {
2451 static const hda_nid_t preferred_pairs[] = {
2452 0x14, 0x02, 0x17, 0x02, 0x21, 0x03, 0
2453 };
2454 struct alc_spec *spec = codec->spec;
2455
2456 if (action == HDA_FIXUP_ACT_PRE_PROBE)
2457 spec->gen.preferred_dacs = preferred_pairs;
2458 }
2459
2460 /* 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)2461 static void alc285_fixup_invalidate_dacs(struct hda_codec *codec,
2462 const struct hda_fixup *fix, int action)
2463 {
2464 if (action != HDA_FIXUP_ACT_PRE_PROBE)
2465 return;
2466
2467 snd_hda_override_wcaps(codec, 0x03, 0);
2468 }
2469
alc_combo_jack_hp_jd_restart(struct hda_codec * codec)2470 static void alc_combo_jack_hp_jd_restart(struct hda_codec *codec)
2471 {
2472 switch (codec->core.vendor_id) {
2473 case 0x10ec0274:
2474 case 0x10ec0294:
2475 case 0x10ec0225:
2476 case 0x10ec0295:
2477 case 0x10ec0299:
2478 alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15); /* Reset HP JD */
2479 alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15);
2480 break;
2481 case 0x10ec0230:
2482 case 0x10ec0235:
2483 case 0x10ec0236:
2484 case 0x10ec0255:
2485 case 0x10ec0256:
2486 case 0x10ec0257:
2487 case 0x19e58326:
2488 alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15); /* Reset HP JD */
2489 alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15);
2490 break;
2491 }
2492 }
2493
alc295_fixup_chromebook(struct hda_codec * codec,const struct hda_fixup * fix,int action)2494 static void alc295_fixup_chromebook(struct hda_codec *codec,
2495 const struct hda_fixup *fix, int action)
2496 {
2497 struct alc_spec *spec = codec->spec;
2498
2499 switch (action) {
2500 case HDA_FIXUP_ACT_PRE_PROBE:
2501 spec->ultra_low_power = true;
2502 break;
2503 case HDA_FIXUP_ACT_INIT:
2504 alc_combo_jack_hp_jd_restart(codec);
2505 break;
2506 }
2507 }
2508
alc256_fixup_chromebook(struct hda_codec * codec,const struct hda_fixup * fix,int action)2509 static void alc256_fixup_chromebook(struct hda_codec *codec,
2510 const struct hda_fixup *fix, int action)
2511 {
2512 struct alc_spec *spec = codec->spec;
2513
2514 switch (action) {
2515 case HDA_FIXUP_ACT_PRE_PROBE:
2516 if (codec->core.subsystem_id == 0x10280d76)
2517 spec->gen.suppress_auto_mute = 0;
2518 else
2519 spec->gen.suppress_auto_mute = 1;
2520 spec->gen.suppress_auto_mic = 1;
2521 spec->en_3kpull_low = false;
2522 break;
2523 }
2524 }
2525
alc_fixup_disable_mic_vref(struct hda_codec * codec,const struct hda_fixup * fix,int action)2526 static void alc_fixup_disable_mic_vref(struct hda_codec *codec,
2527 const struct hda_fixup *fix, int action)
2528 {
2529 if (action == HDA_FIXUP_ACT_PRE_PROBE)
2530 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
2531 }
2532
2533
alc294_gx502_toggle_output(struct hda_codec * codec,struct hda_jack_callback * cb)2534 static void alc294_gx502_toggle_output(struct hda_codec *codec,
2535 struct hda_jack_callback *cb)
2536 {
2537 /* The Windows driver sets the codec up in a very different way where
2538 * it appears to leave 0x10 = 0x8a20 set. For Linux we need to toggle it
2539 */
2540 if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
2541 alc_write_coef_idx(codec, 0x10, 0x8a20);
2542 else
2543 alc_write_coef_idx(codec, 0x10, 0x0a20);
2544 }
2545
alc294_fixup_gx502_hp(struct hda_codec * codec,const struct hda_fixup * fix,int action)2546 static void alc294_fixup_gx502_hp(struct hda_codec *codec,
2547 const struct hda_fixup *fix, int action)
2548 {
2549 /* Pin 0x21: headphones/headset mic */
2550 if (!is_jack_detectable(codec, 0x21))
2551 return;
2552
2553 switch (action) {
2554 case HDA_FIXUP_ACT_PRE_PROBE:
2555 snd_hda_jack_detect_enable_callback(codec, 0x21,
2556 alc294_gx502_toggle_output);
2557 break;
2558 case HDA_FIXUP_ACT_INIT:
2559 /* Make sure to start in a correct state, i.e. if
2560 * headphones have been plugged in before powering up the system
2561 */
2562 alc294_gx502_toggle_output(codec, NULL);
2563 break;
2564 }
2565 }
2566
alc294_gu502_toggle_output(struct hda_codec * codec,struct hda_jack_callback * cb)2567 static void alc294_gu502_toggle_output(struct hda_codec *codec,
2568 struct hda_jack_callback *cb)
2569 {
2570 /* Windows sets 0x10 to 0x8420 for Node 0x20 which is
2571 * responsible from changes between speakers and headphones
2572 */
2573 if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
2574 alc_write_coef_idx(codec, 0x10, 0x8420);
2575 else
2576 alc_write_coef_idx(codec, 0x10, 0x0a20);
2577 }
2578
alc294_fixup_gu502_hp(struct hda_codec * codec,const struct hda_fixup * fix,int action)2579 static void alc294_fixup_gu502_hp(struct hda_codec *codec,
2580 const struct hda_fixup *fix, int action)
2581 {
2582 if (!is_jack_detectable(codec, 0x21))
2583 return;
2584
2585 switch (action) {
2586 case HDA_FIXUP_ACT_PRE_PROBE:
2587 snd_hda_jack_detect_enable_callback(codec, 0x21,
2588 alc294_gu502_toggle_output);
2589 break;
2590 case HDA_FIXUP_ACT_INIT:
2591 alc294_gu502_toggle_output(codec, NULL);
2592 break;
2593 }
2594 }
2595
alc285_fixup_hp_gpio_amp_init(struct hda_codec * codec,const struct hda_fixup * fix,int action)2596 static void alc285_fixup_hp_gpio_amp_init(struct hda_codec *codec,
2597 const struct hda_fixup *fix, int action)
2598 {
2599 if (action != HDA_FIXUP_ACT_INIT)
2600 return;
2601
2602 msleep(100);
2603 alc_write_coef_idx(codec, 0x65, 0x0);
2604 }
2605
alc274_fixup_hp_headset_mic(struct hda_codec * codec,const struct hda_fixup * fix,int action)2606 static void alc274_fixup_hp_headset_mic(struct hda_codec *codec,
2607 const struct hda_fixup *fix, int action)
2608 {
2609 switch (action) {
2610 case HDA_FIXUP_ACT_INIT:
2611 alc_combo_jack_hp_jd_restart(codec);
2612 break;
2613 }
2614 }
2615
alc_fixup_no_int_mic(struct hda_codec * codec,const struct hda_fixup * fix,int action)2616 static void alc_fixup_no_int_mic(struct hda_codec *codec,
2617 const struct hda_fixup *fix, int action)
2618 {
2619 struct alc_spec *spec = codec->spec;
2620
2621 switch (action) {
2622 case HDA_FIXUP_ACT_PRE_PROBE:
2623 /* Mic RING SLEEVE swap for combo jack */
2624 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
2625 spec->no_internal_mic_pin = true;
2626 break;
2627 case HDA_FIXUP_ACT_INIT:
2628 alc_combo_jack_hp_jd_restart(codec);
2629 break;
2630 }
2631 }
2632
2633 /* GPIO1 = amplifier on/off
2634 * GPIO3 = mic mute LED
2635 */
alc285_fixup_hp_spectre_x360_eb1(struct hda_codec * codec,const struct hda_fixup * fix,int action)2636 static void alc285_fixup_hp_spectre_x360_eb1(struct hda_codec *codec,
2637 const struct hda_fixup *fix, int action)
2638 {
2639 static const hda_nid_t conn[] = { 0x02 };
2640
2641 struct alc_spec *spec = codec->spec;
2642 static const struct hda_pintbl pincfgs[] = {
2643 { 0x14, 0x90170110 }, /* front/high speakers */
2644 { 0x17, 0x90170130 }, /* back/bass speakers */
2645 { }
2646 };
2647
2648 //enable micmute led
2649 alc_fixup_hp_gpio_led(codec, action, 0x00, 0x04);
2650
2651 switch (action) {
2652 case HDA_FIXUP_ACT_PRE_PROBE:
2653 spec->micmute_led_polarity = 1;
2654 /* needed for amp of back speakers */
2655 spec->gpio_mask |= 0x01;
2656 spec->gpio_dir |= 0x01;
2657 snd_hda_apply_pincfgs(codec, pincfgs);
2658 /* share DAC to have unified volume control */
2659 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
2660 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
2661 break;
2662 case HDA_FIXUP_ACT_INIT:
2663 /* need to toggle GPIO to enable the amp of back speakers */
2664 alc_update_gpio_data(codec, 0x01, true);
2665 msleep(100);
2666 alc_update_gpio_data(codec, 0x01, false);
2667 break;
2668 }
2669 }
2670
2671 /* GPIO1 = amplifier on/off */
alc285_fixup_hp_spectre_x360_df1(struct hda_codec * codec,const struct hda_fixup * fix,int action)2672 static void alc285_fixup_hp_spectre_x360_df1(struct hda_codec *codec,
2673 const struct hda_fixup *fix,
2674 int action)
2675 {
2676 struct alc_spec *spec = codec->spec;
2677 static const hda_nid_t conn[] = { 0x02 };
2678 static const struct hda_pintbl pincfgs[] = {
2679 { 0x14, 0x90170110 }, /* front/high speakers */
2680 { 0x17, 0x90170130 }, /* back/bass speakers */
2681 { }
2682 };
2683
2684 // enable mute led
2685 alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
2686
2687 switch (action) {
2688 case HDA_FIXUP_ACT_PRE_PROBE:
2689 /* needed for amp of back speakers */
2690 spec->gpio_mask |= 0x01;
2691 spec->gpio_dir |= 0x01;
2692 snd_hda_apply_pincfgs(codec, pincfgs);
2693 /* share DAC to have unified volume control */
2694 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
2695 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
2696 break;
2697 case HDA_FIXUP_ACT_INIT:
2698 /* need to toggle GPIO to enable the amp of back speakers */
2699 alc_update_gpio_data(codec, 0x01, true);
2700 msleep(100);
2701 alc_update_gpio_data(codec, 0x01, false);
2702 break;
2703 }
2704 }
2705
alc285_fixup_hp_spectre_x360(struct hda_codec * codec,const struct hda_fixup * fix,int action)2706 static void alc285_fixup_hp_spectre_x360(struct hda_codec *codec,
2707 const struct hda_fixup *fix, int action)
2708 {
2709 static const hda_nid_t conn[] = { 0x02 };
2710 static const struct hda_pintbl pincfgs[] = {
2711 { 0x14, 0x90170110 }, /* rear speaker */
2712 { }
2713 };
2714
2715 switch (action) {
2716 case HDA_FIXUP_ACT_PRE_PROBE:
2717 snd_hda_apply_pincfgs(codec, pincfgs);
2718 /* force front speaker to DAC1 */
2719 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
2720 break;
2721 }
2722 }
2723
alc285_fixup_hp_envy_x360(struct hda_codec * codec,const struct hda_fixup * fix,int action)2724 static void alc285_fixup_hp_envy_x360(struct hda_codec *codec,
2725 const struct hda_fixup *fix,
2726 int action)
2727 {
2728 static const struct coef_fw coefs[] = {
2729 WRITE_COEF(0x08, 0x6a0c), WRITE_COEF(0x0d, 0xa023),
2730 WRITE_COEF(0x10, 0x0320), WRITE_COEF(0x1a, 0x8c03),
2731 WRITE_COEF(0x25, 0x1800), WRITE_COEF(0x26, 0x003a),
2732 WRITE_COEF(0x28, 0x1dfe), WRITE_COEF(0x29, 0xb014),
2733 WRITE_COEF(0x2b, 0x1dfe), WRITE_COEF(0x37, 0xfe15),
2734 WRITE_COEF(0x38, 0x7909), WRITE_COEF(0x45, 0xd489),
2735 WRITE_COEF(0x46, 0x00f4), WRITE_COEF(0x4a, 0x21e0),
2736 WRITE_COEF(0x66, 0x03f0), WRITE_COEF(0x67, 0x1000),
2737 WRITE_COEF(0x6e, 0x1005), { }
2738 };
2739
2740 static const struct hda_pintbl pincfgs[] = {
2741 { 0x12, 0xb7a60130 }, /* Internal microphone*/
2742 { 0x14, 0x90170150 }, /* B&O soundbar speakers */
2743 { 0x17, 0x90170153 }, /* Side speakers */
2744 { 0x19, 0x03a11040 }, /* Headset microphone */
2745 { }
2746 };
2747
2748 switch (action) {
2749 case HDA_FIXUP_ACT_PRE_PROBE:
2750 snd_hda_apply_pincfgs(codec, pincfgs);
2751
2752 /* Fixes volume control problem for side speakers */
2753 alc295_fixup_disable_dac3(codec, fix, action);
2754
2755 /* Fixes no sound from headset speaker */
2756 snd_hda_codec_amp_stereo(codec, 0x21, HDA_OUTPUT, 0, -1, 0);
2757
2758 /* Auto-enable headset mic when plugged */
2759 snd_hda_jack_set_gating_jack(codec, 0x19, 0x21);
2760
2761 /* Headset mic volume enhancement */
2762 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREF50);
2763 break;
2764 case HDA_FIXUP_ACT_INIT:
2765 alc_process_coef_fw(codec, coefs);
2766 break;
2767 case HDA_FIXUP_ACT_BUILD:
2768 rename_ctl(codec, "Bass Speaker Playback Volume",
2769 "B&O-Tuned Playback Volume");
2770 rename_ctl(codec, "Front Playback Switch",
2771 "B&O Soundbar Playback Switch");
2772 rename_ctl(codec, "Bass Speaker Playback Switch",
2773 "Side Speaker Playback Switch");
2774 break;
2775 }
2776 }
2777
alc285_fixup_hp_beep(struct hda_codec * codec,const struct hda_fixup * fix,int action)2778 static void alc285_fixup_hp_beep(struct hda_codec *codec,
2779 const struct hda_fixup *fix, int action)
2780 {
2781 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2782 codec->beep_just_power_on = true;
2783 } else if (action == HDA_FIXUP_ACT_INIT) {
2784 #ifdef CONFIG_SND_HDA_INPUT_BEEP
2785 /*
2786 * Just enable loopback to internal speaker and headphone jack.
2787 * Disable amplification to get about the same beep volume as
2788 * was on pure BIOS setup before loading the driver.
2789 */
2790 alc_update_coef_idx(codec, 0x36, 0x7070, BIT(13));
2791
2792 snd_hda_enable_beep_device(codec, 1);
2793
2794 #if !IS_ENABLED(CONFIG_INPUT_PCSPKR)
2795 dev_warn_once(hda_codec_dev(codec),
2796 "enable CONFIG_INPUT_PCSPKR to get PC beeps\n");
2797 #endif
2798 #endif
2799 }
2800 }
2801
2802 /* for hda_fixup_thinkpad_acpi() */
2803 #include "../helpers/thinkpad.c"
2804
alc_fixup_thinkpad_acpi(struct hda_codec * codec,const struct hda_fixup * fix,int action)2805 static void alc_fixup_thinkpad_acpi(struct hda_codec *codec,
2806 const struct hda_fixup *fix, int action)
2807 {
2808 alc_fixup_no_shutup(codec, fix, action); /* reduce click noise */
2809 hda_fixup_thinkpad_acpi(codec, fix, action);
2810 }
2811
2812 /* for hda_fixup_ideapad_acpi() */
2813 #include "../helpers/ideapad_hotkey_led.c"
2814
alc_fixup_ideapad_acpi(struct hda_codec * codec,const struct hda_fixup * fix,int action)2815 static void alc_fixup_ideapad_acpi(struct hda_codec *codec,
2816 const struct hda_fixup *fix, int action)
2817 {
2818 hda_fixup_ideapad_acpi(codec, fix, action);
2819 }
2820
2821 /* 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)2822 static void alc287_fixup_legion_15imhg05_speakers(struct hda_codec *codec,
2823 const struct hda_fixup *fix,
2824 int action)
2825 {
2826 struct alc_spec *spec = codec->spec;
2827
2828 switch (action) {
2829 case HDA_FIXUP_ACT_PRE_PROBE:
2830 spec->gen.suppress_auto_mute = 1;
2831 break;
2832 }
2833 }
2834
comp_acpi_device_notify(acpi_handle handle,u32 event,void * data)2835 static void comp_acpi_device_notify(acpi_handle handle, u32 event, void *data)
2836 {
2837 struct hda_codec *cdc = data;
2838 struct alc_spec *spec = cdc->spec;
2839
2840 codec_info(cdc, "ACPI Notification %d\n", event);
2841
2842 hda_component_acpi_device_notify(&spec->comps, handle, event, data);
2843 }
2844
comp_bind(struct device * dev)2845 static int comp_bind(struct device *dev)
2846 {
2847 struct hda_codec *cdc = dev_to_hda_codec(dev);
2848 struct alc_spec *spec = cdc->spec;
2849 int ret;
2850
2851 ret = hda_component_manager_bind(cdc, &spec->comps);
2852 if (ret)
2853 return ret;
2854
2855 return hda_component_manager_bind_acpi_notifications(cdc,
2856 &spec->comps,
2857 comp_acpi_device_notify, cdc);
2858 }
2859
comp_unbind(struct device * dev)2860 static void comp_unbind(struct device *dev)
2861 {
2862 struct hda_codec *cdc = dev_to_hda_codec(dev);
2863 struct alc_spec *spec = cdc->spec;
2864
2865 hda_component_manager_unbind_acpi_notifications(cdc, &spec->comps, comp_acpi_device_notify);
2866 hda_component_manager_unbind(cdc, &spec->comps);
2867 }
2868
2869 static const struct component_master_ops comp_master_ops = {
2870 .bind = comp_bind,
2871 .unbind = comp_unbind,
2872 };
2873
comp_generic_playback_hook(struct hda_pcm_stream * hinfo,struct hda_codec * cdc,struct snd_pcm_substream * sub,int action)2874 static void comp_generic_playback_hook(struct hda_pcm_stream *hinfo, struct hda_codec *cdc,
2875 struct snd_pcm_substream *sub, int action)
2876 {
2877 struct alc_spec *spec = cdc->spec;
2878
2879 hda_component_manager_playback_hook(&spec->comps, action);
2880 }
2881
comp_generic_fixup(struct hda_codec * cdc,int action,const char * bus,const char * hid,const char * match_str,int count)2882 static void comp_generic_fixup(struct hda_codec *cdc, int action, const char *bus,
2883 const char *hid, const char *match_str, int count)
2884 {
2885 struct alc_spec *spec = cdc->spec;
2886 int ret;
2887
2888 switch (action) {
2889 case HDA_FIXUP_ACT_PRE_PROBE:
2890 ret = hda_component_manager_init(cdc, &spec->comps, count, bus, hid,
2891 match_str, &comp_master_ops);
2892 if (ret)
2893 return;
2894
2895 spec->gen.pcm_playback_hook = comp_generic_playback_hook;
2896 break;
2897 case HDA_FIXUP_ACT_FREE:
2898 hda_component_manager_free(&spec->comps, &comp_master_ops);
2899 break;
2900 }
2901 }
2902
find_cirrus_companion_amps(struct hda_codec * cdc)2903 static void find_cirrus_companion_amps(struct hda_codec *cdc)
2904 {
2905 struct device *dev = hda_codec_dev(cdc);
2906 struct acpi_device *adev;
2907 struct fwnode_handle *fwnode __free(fwnode_handle) = NULL;
2908 const char *bus = NULL;
2909 static const struct {
2910 const char *hid;
2911 const char *name;
2912 } acpi_ids[] = {{ "CSC3554", "cs35l54-hda" },
2913 { "CSC3556", "cs35l56-hda" },
2914 { "CSC3557", "cs35l57-hda" }};
2915 char *match;
2916 int i, count = 0, count_devindex = 0;
2917
2918 for (i = 0; i < ARRAY_SIZE(acpi_ids); ++i) {
2919 adev = acpi_dev_get_first_match_dev(acpi_ids[i].hid, NULL, -1);
2920 if (adev)
2921 break;
2922 }
2923 if (!adev) {
2924 codec_dbg(cdc, "Did not find ACPI entry for a Cirrus Amp\n");
2925 return;
2926 }
2927
2928 count = i2c_acpi_client_count(adev);
2929 if (count > 0) {
2930 bus = "i2c";
2931 } else {
2932 count = acpi_spi_count_resources(adev);
2933 if (count > 0)
2934 bus = "spi";
2935 }
2936
2937 fwnode = fwnode_handle_get(acpi_fwnode_handle(adev));
2938 acpi_dev_put(adev);
2939
2940 if (!bus) {
2941 codec_err(cdc, "Did not find any buses for %s\n", acpi_ids[i].hid);
2942 return;
2943 }
2944
2945 if (!fwnode) {
2946 codec_err(cdc, "Could not get fwnode for %s\n", acpi_ids[i].hid);
2947 return;
2948 }
2949
2950 /*
2951 * When available the cirrus,dev-index property is an accurate
2952 * count of the amps in a system and is used in preference to
2953 * the count of bus devices that can contain additional address
2954 * alias entries.
2955 */
2956 count_devindex = fwnode_property_count_u32(fwnode, "cirrus,dev-index");
2957 if (count_devindex > 0)
2958 count = count_devindex;
2959
2960 match = devm_kasprintf(dev, GFP_KERNEL, "-%%s:00-%s.%%d", acpi_ids[i].name);
2961 if (!match)
2962 return;
2963 codec_info(cdc, "Found %d %s on %s (%s)\n", count, acpi_ids[i].hid, bus, match);
2964 comp_generic_fixup(cdc, HDA_FIXUP_ACT_PRE_PROBE, bus, acpi_ids[i].hid, match, count);
2965 }
2966
cs35l41_fixup_i2c_two(struct hda_codec * cdc,const struct hda_fixup * fix,int action)2967 static void cs35l41_fixup_i2c_two(struct hda_codec *cdc, const struct hda_fixup *fix, int action)
2968 {
2969 comp_generic_fixup(cdc, action, "i2c", "CSC3551", "-%s:00-cs35l41-hda.%d", 2);
2970 }
2971
cs35l41_fixup_i2c_four(struct hda_codec * cdc,const struct hda_fixup * fix,int action)2972 static void cs35l41_fixup_i2c_four(struct hda_codec *cdc, const struct hda_fixup *fix, int action)
2973 {
2974 comp_generic_fixup(cdc, action, "i2c", "CSC3551", "-%s:00-cs35l41-hda.%d", 4);
2975 }
2976
cs35l41_fixup_spi_two(struct hda_codec * codec,const struct hda_fixup * fix,int action)2977 static void cs35l41_fixup_spi_two(struct hda_codec *codec, const struct hda_fixup *fix, int action)
2978 {
2979 comp_generic_fixup(codec, action, "spi", "CSC3551", "-%s:00-cs35l41-hda.%d", 2);
2980 }
2981
cs35l41_fixup_spi_one(struct hda_codec * codec,const struct hda_fixup * fix,int action)2982 static void cs35l41_fixup_spi_one(struct hda_codec *codec, const struct hda_fixup *fix, int action)
2983 {
2984 comp_generic_fixup(codec, action, "spi", "CSC3551", "-%s:00-cs35l41-hda.%d", 1);
2985 }
2986
cs35l41_fixup_spi_four(struct hda_codec * codec,const struct hda_fixup * fix,int action)2987 static void cs35l41_fixup_spi_four(struct hda_codec *codec, const struct hda_fixup *fix, int action)
2988 {
2989 comp_generic_fixup(codec, action, "spi", "CSC3551", "-%s:00-cs35l41-hda.%d", 4);
2990 }
2991
alc287_fixup_legion_16achg6_speakers(struct hda_codec * cdc,const struct hda_fixup * fix,int action)2992 static void alc287_fixup_legion_16achg6_speakers(struct hda_codec *cdc, const struct hda_fixup *fix,
2993 int action)
2994 {
2995 comp_generic_fixup(cdc, action, "i2c", "CLSA0100", "-%s:00-cs35l41-hda.%d", 2);
2996 }
2997
alc287_fixup_legion_16ithg6_speakers(struct hda_codec * cdc,const struct hda_fixup * fix,int action)2998 static void alc287_fixup_legion_16ithg6_speakers(struct hda_codec *cdc, const struct hda_fixup *fix,
2999 int action)
3000 {
3001 comp_generic_fixup(cdc, action, "i2c", "CLSA0101", "-%s:00-cs35l41-hda.%d", 2);
3002 }
3003
alc285_fixup_asus_ga403u(struct hda_codec * cdc,const struct hda_fixup * fix,int action)3004 static void alc285_fixup_asus_ga403u(struct hda_codec *cdc, const struct hda_fixup *fix, int action)
3005 {
3006 /*
3007 * The same SSID has been re-used in different hardware, they have
3008 * different codecs and the newer GA403U has a ALC285.
3009 */
3010 if (cdc->core.vendor_id != 0x10ec0285)
3011 alc_fixup_inv_dmic(cdc, fix, action);
3012 }
3013
tas2781_fixup_tias_i2c(struct hda_codec * cdc,const struct hda_fixup * fix,int action)3014 static void tas2781_fixup_tias_i2c(struct hda_codec *cdc,
3015 const struct hda_fixup *fix, int action)
3016 {
3017 comp_generic_fixup(cdc, action, "i2c", "TIAS2781", "-%s:00", 1);
3018 }
3019
tas2781_fixup_spi(struct hda_codec * cdc,const struct hda_fixup * fix,int action)3020 static void tas2781_fixup_spi(struct hda_codec *cdc, const struct hda_fixup *fix, int action)
3021 {
3022 comp_generic_fixup(cdc, action, "spi", "TXNW2781", "-%s:00-tas2781-hda.%d", 2);
3023 }
3024
tas2781_fixup_txnw_i2c(struct hda_codec * cdc,const struct hda_fixup * fix,int action)3025 static void tas2781_fixup_txnw_i2c(struct hda_codec *cdc,
3026 const struct hda_fixup *fix, int action)
3027 {
3028 comp_generic_fixup(cdc, action, "i2c", "TXNW2781", "-%s:00-tas2781-hda.%d", 1);
3029 }
3030
yoga7_14arb7_fixup_i2c(struct hda_codec * cdc,const struct hda_fixup * fix,int action)3031 static void yoga7_14arb7_fixup_i2c(struct hda_codec *cdc,
3032 const struct hda_fixup *fix, int action)
3033 {
3034 comp_generic_fixup(cdc, action, "i2c", "INT8866", "-%s:00", 1);
3035 }
3036
alc256_fixup_acer_sfg16_micmute_led(struct hda_codec * codec,const struct hda_fixup * fix,int action)3037 static void alc256_fixup_acer_sfg16_micmute_led(struct hda_codec *codec,
3038 const struct hda_fixup *fix, int action)
3039 {
3040 alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
3041 }
3042
3043
3044 /* for alc295_fixup_hp_top_speakers */
3045 #include "../helpers/hp_x360.c"
3046
3047 /* for alc285_fixup_ideapad_s740_coef() */
3048 #include "../helpers/ideapad_s740.c"
3049
3050 static const struct coef_fw alc256_fixup_set_coef_defaults_coefs[] = {
3051 WRITE_COEF(0x10, 0x0020), WRITE_COEF(0x24, 0x0000),
3052 WRITE_COEF(0x26, 0x0000), WRITE_COEF(0x29, 0x3000),
3053 WRITE_COEF(0x37, 0xfe05), WRITE_COEF(0x45, 0x5089),
3054 {}
3055 };
3056
alc256_fixup_set_coef_defaults(struct hda_codec * codec,const struct hda_fixup * fix,int action)3057 static void alc256_fixup_set_coef_defaults(struct hda_codec *codec,
3058 const struct hda_fixup *fix,
3059 int action)
3060 {
3061 /*
3062 * A certain other OS sets these coeffs to different values. On at least
3063 * one TongFang barebone these settings might survive even a cold
3064 * reboot. So to restore a clean slate the values are explicitly reset
3065 * to default here. Without this, the external microphone is always in a
3066 * plugged-in state, while the internal microphone is always in an
3067 * unplugged state, breaking the ability to use the internal microphone.
3068 */
3069 alc_process_coef_fw(codec, alc256_fixup_set_coef_defaults_coefs);
3070 }
3071
3072 static const struct coef_fw alc233_fixup_no_audio_jack_coefs[] = {
3073 WRITE_COEF(0x1a, 0x9003), WRITE_COEF(0x1b, 0x0e2b), WRITE_COEF(0x37, 0xfe06),
3074 WRITE_COEF(0x38, 0x4981), WRITE_COEF(0x45, 0xd489), WRITE_COEF(0x46, 0x0074),
3075 WRITE_COEF(0x49, 0x0149),
3076 {}
3077 };
3078
alc233_fixup_no_audio_jack(struct hda_codec * codec,const struct hda_fixup * fix,int action)3079 static void alc233_fixup_no_audio_jack(struct hda_codec *codec,
3080 const struct hda_fixup *fix,
3081 int action)
3082 {
3083 /*
3084 * The audio jack input and output is not detected on the ASRock NUC Box
3085 * 1100 series when cold booting without this fix. Warm rebooting from a
3086 * certain other OS makes the audio functional, as COEF settings are
3087 * preserved in this case. This fix sets these altered COEF values as
3088 * the default.
3089 */
3090 alc_process_coef_fw(codec, alc233_fixup_no_audio_jack_coefs);
3091 }
3092
alc256_fixup_mic_no_presence_and_resume(struct hda_codec * codec,const struct hda_fixup * fix,int action)3093 static void alc256_fixup_mic_no_presence_and_resume(struct hda_codec *codec,
3094 const struct hda_fixup *fix,
3095 int action)
3096 {
3097 /*
3098 * The Clevo NJ51CU comes either with the ALC293 or the ALC256 codec,
3099 * but uses the 0x8686 subproduct id in both cases. The ALC256 codec
3100 * needs an additional quirk for sound working after suspend and resume.
3101 */
3102 if (codec->core.vendor_id == 0x10ec0256) {
3103 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
3104 snd_hda_codec_set_pincfg(codec, 0x19, 0x04a11120);
3105 } else {
3106 snd_hda_codec_set_pincfg(codec, 0x1a, 0x04a1113c);
3107 }
3108 }
3109
alc256_decrease_headphone_amp_val(struct hda_codec * codec,const struct hda_fixup * fix,int action)3110 static void alc256_decrease_headphone_amp_val(struct hda_codec *codec,
3111 const struct hda_fixup *fix, int action)
3112 {
3113 u32 caps;
3114 u8 nsteps, offs;
3115
3116 if (action != HDA_FIXUP_ACT_PRE_PROBE)
3117 return;
3118
3119 caps = query_amp_caps(codec, 0x3, HDA_OUTPUT);
3120 nsteps = ((caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT) - 10;
3121 offs = ((caps & AC_AMPCAP_OFFSET) >> AC_AMPCAP_OFFSET_SHIFT) - 10;
3122 caps &= ~AC_AMPCAP_NUM_STEPS & ~AC_AMPCAP_OFFSET;
3123 caps |= (nsteps << AC_AMPCAP_NUM_STEPS_SHIFT) | (offs << AC_AMPCAP_OFFSET_SHIFT);
3124
3125 if (snd_hda_override_amp_caps(codec, 0x3, HDA_OUTPUT, caps))
3126 codec_warn(codec, "failed to override amp caps for NID 0x3\n");
3127 }
3128
alc_fixup_dell4_mic_no_presence_quiet(struct hda_codec * codec,const struct hda_fixup * fix,int action)3129 static void alc_fixup_dell4_mic_no_presence_quiet(struct hda_codec *codec,
3130 const struct hda_fixup *fix,
3131 int action)
3132 {
3133 struct alc_spec *spec = codec->spec;
3134 struct hda_input_mux *imux = &spec->gen.input_mux;
3135 int i;
3136
3137 alc269_fixup_limit_int_mic_boost(codec, fix, action);
3138
3139 switch (action) {
3140 case HDA_FIXUP_ACT_PRE_PROBE:
3141 /**
3142 * Set the vref of pin 0x19 (Headset Mic) and pin 0x1b (Headphone Mic)
3143 * to Hi-Z to avoid pop noises at startup and when plugging and
3144 * unplugging headphones.
3145 */
3146 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
3147 snd_hda_codec_set_pin_target(codec, 0x1b, PIN_VREFHIZ);
3148 break;
3149 case HDA_FIXUP_ACT_PROBE:
3150 /**
3151 * Make the internal mic (0x12) the default input source to
3152 * prevent pop noises on cold boot.
3153 */
3154 for (i = 0; i < imux->num_items; i++) {
3155 if (spec->gen.imux_pins[i] == 0x12) {
3156 spec->gen.cur_mux[0] = i;
3157 break;
3158 }
3159 }
3160 break;
3161 }
3162 }
3163
alc287_fixup_yoga9_14iap7_bass_spk_pin(struct hda_codec * codec,const struct hda_fixup * fix,int action)3164 static void alc287_fixup_yoga9_14iap7_bass_spk_pin(struct hda_codec *codec,
3165 const struct hda_fixup *fix, int action)
3166 {
3167 /*
3168 * The Pin Complex 0x17 for the bass speakers is wrongly reported as
3169 * unconnected.
3170 */
3171 static const struct hda_pintbl pincfgs[] = {
3172 { 0x17, 0x90170121 },
3173 { }
3174 };
3175 /*
3176 * Avoid DAC 0x06 and 0x08, as they have no volume controls.
3177 * DAC 0x02 and 0x03 would be fine.
3178 */
3179 static const hda_nid_t conn[] = { 0x02, 0x03 };
3180 /*
3181 * Prefer both speakerbar (0x14) and bass speakers (0x17) connected to DAC 0x02.
3182 * Headphones (0x21) are connected to DAC 0x03.
3183 */
3184 static const hda_nid_t preferred_pairs[] = {
3185 0x14, 0x02,
3186 0x17, 0x02,
3187 0x21, 0x03,
3188 0
3189 };
3190 struct alc_spec *spec = codec->spec;
3191
3192 /* Support Audio mute LED and Mic mute LED on keyboard */
3193 hda_fixup_ideapad_acpi(codec, fix, action);
3194
3195 switch (action) {
3196 case HDA_FIXUP_ACT_PRE_PROBE:
3197 snd_hda_apply_pincfgs(codec, pincfgs);
3198 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
3199 spec->gen.preferred_dacs = preferred_pairs;
3200 break;
3201 }
3202 }
3203
alc295_fixup_dell_inspiron_top_speakers(struct hda_codec * codec,const struct hda_fixup * fix,int action)3204 static void alc295_fixup_dell_inspiron_top_speakers(struct hda_codec *codec,
3205 const struct hda_fixup *fix, int action)
3206 {
3207 static const struct hda_pintbl pincfgs[] = {
3208 { 0x14, 0x90170151 },
3209 { 0x17, 0x90170150 },
3210 { }
3211 };
3212 static const hda_nid_t conn[] = { 0x02, 0x03 };
3213 static const hda_nid_t preferred_pairs[] = {
3214 0x14, 0x02,
3215 0x17, 0x03,
3216 0x21, 0x02,
3217 0
3218 };
3219 struct alc_spec *spec = codec->spec;
3220
3221 alc_fixup_no_shutup(codec, fix, action);
3222
3223 switch (action) {
3224 case HDA_FIXUP_ACT_PRE_PROBE:
3225 snd_hda_apply_pincfgs(codec, pincfgs);
3226 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
3227 spec->gen.preferred_dacs = preferred_pairs;
3228 break;
3229 }
3230 }
3231
3232 /* Forcibly assign NID 0x03 to HP while NID 0x02 to SPK */
alc287_fixup_bind_dacs(struct hda_codec * codec,const struct hda_fixup * fix,int action)3233 static void alc287_fixup_bind_dacs(struct hda_codec *codec,
3234 const struct hda_fixup *fix, int action)
3235 {
3236 struct alc_spec *spec = codec->spec;
3237 static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */
3238 static const hda_nid_t preferred_pairs[] = {
3239 0x17, 0x02, 0x21, 0x03, 0
3240 };
3241
3242 if (action != HDA_FIXUP_ACT_PRE_PROBE)
3243 return;
3244
3245 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
3246 spec->gen.preferred_dacs = preferred_pairs;
3247 spec->gen.auto_mute_via_amp = 1;
3248 if (spec->gen.autocfg.speaker_pins[0] != 0x14) {
3249 snd_hda_codec_write_cache(codec, 0x14, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
3250 0x0); /* Make sure 0x14 was disable */
3251 }
3252 }
3253
3254 /* Fix none verb table of Headset Mic pin */
alc2xx_fixup_headset_mic(struct hda_codec * codec,const struct hda_fixup * fix,int action)3255 static void alc2xx_fixup_headset_mic(struct hda_codec *codec,
3256 const struct hda_fixup *fix, int action)
3257 {
3258 struct alc_spec *spec = codec->spec;
3259 static const struct hda_pintbl pincfgs[] = {
3260 { 0x19, 0x03a1103c },
3261 { }
3262 };
3263
3264 switch (action) {
3265 case HDA_FIXUP_ACT_PRE_PROBE:
3266 snd_hda_apply_pincfgs(codec, pincfgs);
3267 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
3268 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
3269 break;
3270 }
3271 }
3272
alc245_fixup_hp_spectre_x360_eu0xxx(struct hda_codec * codec,const struct hda_fixup * fix,int action)3273 static void alc245_fixup_hp_spectre_x360_eu0xxx(struct hda_codec *codec,
3274 const struct hda_fixup *fix, int action)
3275 {
3276 /*
3277 * The Pin Complex 0x14 for the treble speakers is wrongly reported as
3278 * unconnected.
3279 * The Pin Complex 0x17 for the bass speakers has the lowest association
3280 * and sequence values so shift it up a bit to squeeze 0x14 in.
3281 */
3282 static const struct hda_pintbl pincfgs[] = {
3283 { 0x14, 0x90170110 }, // top/treble
3284 { 0x17, 0x90170111 }, // bottom/bass
3285 { }
3286 };
3287
3288 /*
3289 * Force DAC 0x02 for the bass speakers 0x17.
3290 */
3291 static const hda_nid_t conn[] = { 0x02 };
3292
3293 switch (action) {
3294 case HDA_FIXUP_ACT_PRE_PROBE:
3295 snd_hda_apply_pincfgs(codec, pincfgs);
3296 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
3297 break;
3298 }
3299
3300 cs35l41_fixup_i2c_two(codec, fix, action);
3301 alc245_fixup_hp_mute_led_coefbit(codec, fix, action);
3302 alc245_fixup_hp_gpio_led(codec, fix, action);
3303 }
3304
3305 /* some changes for Spectre x360 16, 2024 model */
alc245_fixup_hp_spectre_x360_16_aa0xxx(struct hda_codec * codec,const struct hda_fixup * fix,int action)3306 static void alc245_fixup_hp_spectre_x360_16_aa0xxx(struct hda_codec *codec,
3307 const struct hda_fixup *fix, int action)
3308 {
3309 /*
3310 * The Pin Complex 0x14 for the treble speakers is wrongly reported as
3311 * unconnected.
3312 * The Pin Complex 0x17 for the bass speakers has the lowest association
3313 * and sequence values so shift it up a bit to squeeze 0x14 in.
3314 */
3315 struct alc_spec *spec = codec->spec;
3316 static const struct hda_pintbl pincfgs[] = {
3317 { 0x14, 0x90170110 }, // top/treble
3318 { 0x17, 0x90170111 }, // bottom/bass
3319 { }
3320 };
3321
3322 /*
3323 * Force DAC 0x02 for the bass speakers 0x17.
3324 */
3325 static const hda_nid_t conn[] = { 0x02 };
3326
3327 switch (action) {
3328 case HDA_FIXUP_ACT_PRE_PROBE:
3329 /* needed for amp of back speakers */
3330 spec->gpio_mask |= 0x01;
3331 spec->gpio_dir |= 0x01;
3332 snd_hda_apply_pincfgs(codec, pincfgs);
3333 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
3334 break;
3335 case HDA_FIXUP_ACT_INIT:
3336 /* need to toggle GPIO to enable the amp of back speakers */
3337 alc_update_gpio_data(codec, 0x01, true);
3338 msleep(100);
3339 alc_update_gpio_data(codec, 0x01, false);
3340 break;
3341 }
3342
3343 cs35l41_fixup_i2c_two(codec, fix, action);
3344 alc245_fixup_hp_mute_led_coefbit(codec, fix, action);
3345 alc245_fixup_hp_gpio_led(codec, fix, action);
3346 }
3347
alc245_fixup_hp_zbook_firefly_g12a(struct hda_codec * codec,const struct hda_fixup * fix,int action)3348 static void alc245_fixup_hp_zbook_firefly_g12a(struct hda_codec *codec,
3349 const struct hda_fixup *fix, int action)
3350 {
3351 struct alc_spec *spec = codec->spec;
3352 static const hda_nid_t conn[] = { 0x02 };
3353
3354 switch (action) {
3355 case HDA_FIXUP_ACT_PRE_PROBE:
3356 spec->gen.auto_mute_via_amp = 1;
3357 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
3358 break;
3359 }
3360
3361 cs35l41_fixup_i2c_two(codec, fix, action);
3362 alc245_fixup_hp_mute_led_coefbit(codec, fix, action);
3363 alc285_fixup_hp_coef_micmute_led(codec, fix, action);
3364 }
3365
3366 /*
3367 * ALC287 PCM hooks
3368 */
alc287_alc1318_playback_pcm_hook(struct hda_pcm_stream * hinfo,struct hda_codec * codec,struct snd_pcm_substream * substream,int action)3369 static void alc287_alc1318_playback_pcm_hook(struct hda_pcm_stream *hinfo,
3370 struct hda_codec *codec,
3371 struct snd_pcm_substream *substream,
3372 int action)
3373 {
3374 switch (action) {
3375 case HDA_GEN_PCM_ACT_OPEN:
3376 alc_write_coefex_idx(codec, 0x5a, 0x00, 0x954f); /* write gpio3 to high */
3377 break;
3378 case HDA_GEN_PCM_ACT_CLOSE:
3379 alc_write_coefex_idx(codec, 0x5a, 0x00, 0x554f); /* write gpio3 as default value */
3380 break;
3381 }
3382 }
3383
alc287_s4_power_gpio3_default(struct hda_codec * codec)3384 static void alc287_s4_power_gpio3_default(struct hda_codec *codec)
3385 {
3386 if (is_s4_suspend(codec)) {
3387 alc_write_coefex_idx(codec, 0x5a, 0x00, 0x554f); /* write gpio3 as default value */
3388 }
3389 }
3390
alc287_fixup_lenovo_thinkpad_with_alc1318(struct hda_codec * codec,const struct hda_fixup * fix,int action)3391 static void alc287_fixup_lenovo_thinkpad_with_alc1318(struct hda_codec *codec,
3392 const struct hda_fixup *fix, int action)
3393 {
3394 struct alc_spec *spec = codec->spec;
3395 static const struct coef_fw coefs[] = {
3396 WRITE_COEF(0x24, 0x0013), WRITE_COEF(0x25, 0x0000), WRITE_COEF(0x26, 0xC300),
3397 WRITE_COEF(0x28, 0x0001), WRITE_COEF(0x29, 0xb023),
3398 WRITE_COEF(0x24, 0x0013), WRITE_COEF(0x25, 0x0000), WRITE_COEF(0x26, 0xC301),
3399 WRITE_COEF(0x28, 0x0001), WRITE_COEF(0x29, 0xb023),
3400 };
3401
3402 if (action != HDA_FIXUP_ACT_PRE_PROBE)
3403 return;
3404 alc_update_coef_idx(codec, 0x10, 1<<11, 1<<11);
3405 alc_process_coef_fw(codec, coefs);
3406 spec->power_hook = alc287_s4_power_gpio3_default;
3407 spec->gen.pcm_playback_hook = alc287_alc1318_playback_pcm_hook;
3408 }
3409
3410 /*
3411 * Clear COEF 0x0d (PCBEEP passthrough) bit 0x40 where BIOS sets it wrongly
3412 * at PM resume
3413 */
alc283_fixup_dell_hp_resume(struct hda_codec * codec,const struct hda_fixup * fix,int action)3414 static void alc283_fixup_dell_hp_resume(struct hda_codec *codec,
3415 const struct hda_fixup *fix, int action)
3416 {
3417 if (action == HDA_FIXUP_ACT_INIT)
3418 alc_write_coef_idx(codec, 0xd, 0x2800);
3419 }
3420
3421 enum {
3422 ALC269_FIXUP_GPIO2,
3423 ALC269_FIXUP_SONY_VAIO,
3424 ALC275_FIXUP_SONY_VAIO_GPIO2,
3425 ALC269_FIXUP_DELL_M101Z,
3426 ALC269_FIXUP_SKU_IGNORE,
3427 ALC269_FIXUP_ASUS_G73JW,
3428 ALC269_FIXUP_ASUS_N7601ZM_PINS,
3429 ALC269_FIXUP_ASUS_N7601ZM,
3430 ALC269_FIXUP_LENOVO_EAPD,
3431 ALC275_FIXUP_SONY_HWEQ,
3432 ALC275_FIXUP_SONY_DISABLE_AAMIX,
3433 ALC271_FIXUP_DMIC,
3434 ALC269_FIXUP_PCM_44K,
3435 ALC269_FIXUP_STEREO_DMIC,
3436 ALC269_FIXUP_HEADSET_MIC,
3437 ALC269_FIXUP_QUANTA_MUTE,
3438 ALC269_FIXUP_LIFEBOOK,
3439 ALC269_FIXUP_LIFEBOOK_EXTMIC,
3440 ALC269_FIXUP_LIFEBOOK_HP_PIN,
3441 ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT,
3442 ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC,
3443 ALC269_FIXUP_AMIC,
3444 ALC269_FIXUP_DMIC,
3445 ALC269VB_FIXUP_AMIC,
3446 ALC269VB_FIXUP_DMIC,
3447 ALC269_FIXUP_HP_MUTE_LED,
3448 ALC269_FIXUP_HP_MUTE_LED_MIC1,
3449 ALC269_FIXUP_HP_MUTE_LED_MIC2,
3450 ALC269_FIXUP_HP_MUTE_LED_MIC3,
3451 ALC269_FIXUP_HP_GPIO_LED,
3452 ALC269_FIXUP_HP_GPIO_MIC1_LED,
3453 ALC269_FIXUP_HP_LINE1_MIC1_LED,
3454 ALC269_FIXUP_INV_DMIC,
3455 ALC269_FIXUP_LENOVO_DOCK,
3456 ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST,
3457 ALC269_FIXUP_NO_SHUTUP,
3458 ALC286_FIXUP_SONY_MIC_NO_PRESENCE,
3459 ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
3460 ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
3461 ALC269_FIXUP_DELL1_LIMIT_INT_MIC_BOOST,
3462 ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
3463 ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
3464 ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
3465 ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET,
3466 ALC269_FIXUP_HEADSET_MODE,
3467 ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
3468 ALC269_FIXUP_ASPIRE_HEADSET_MIC,
3469 ALC269_FIXUP_ASUS_X101_FUNC,
3470 ALC269_FIXUP_ASUS_X101_VERB,
3471 ALC269_FIXUP_ASUS_X101,
3472 ALC271_FIXUP_AMIC_MIC2,
3473 ALC271_FIXUP_HP_GATE_MIC_JACK,
3474 ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572,
3475 ALC269_FIXUP_ACER_AC700,
3476 ALC269_FIXUP_LIMIT_INT_MIC_BOOST,
3477 ALC269VB_FIXUP_ASUS_ZENBOOK,
3478 ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A,
3479 ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE,
3480 ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED,
3481 ALC269VB_FIXUP_ORDISSIMO_EVE2,
3482 ALC283_FIXUP_CHROME_BOOK,
3483 ALC283_FIXUP_SENSE_COMBO_JACK,
3484 ALC282_FIXUP_ASUS_TX300,
3485 ALC283_FIXUP_INT_MIC,
3486 ALC290_FIXUP_MONO_SPEAKERS,
3487 ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
3488 ALC290_FIXUP_SUBWOOFER,
3489 ALC290_FIXUP_SUBWOOFER_HSJACK,
3490 ALC295_FIXUP_HP_MUTE_LED_COEFBIT11,
3491 ALC269_FIXUP_THINKPAD_ACPI,
3492 ALC269_FIXUP_LENOVO_XPAD_ACPI,
3493 ALC269_FIXUP_DMIC_THINKPAD_ACPI,
3494 ALC269VB_FIXUP_INFINIX_ZERO_BOOK_13,
3495 ALC269VC_FIXUP_INFINIX_Y4_MAX,
3496 ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO,
3497 ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
3498 ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
3499 ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
3500 ALC255_FIXUP_DELL1_LIMIT_INT_MIC_BOOST,
3501 ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
3502 ALC255_FIXUP_HEADSET_MODE,
3503 ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,
3504 ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
3505 ALC292_FIXUP_TPT440_DOCK,
3506 ALC292_FIXUP_TPT440,
3507 ALC283_FIXUP_HEADSET_MIC,
3508 ALC255_FIXUP_MIC_MUTE_LED,
3509 ALC282_FIXUP_ASPIRE_V5_PINS,
3510 ALC269VB_FIXUP_ASPIRE_E1_COEF,
3511 ALC280_FIXUP_HP_GPIO4,
3512 ALC286_FIXUP_HP_GPIO_LED,
3513 ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY,
3514 ALC280_FIXUP_HP_DOCK_PINS,
3515 ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED,
3516 ALC280_FIXUP_HP_9480M,
3517 ALC245_FIXUP_HP_X360_AMP,
3518 ALC285_FIXUP_HP_SPECTRE_X360_EB1,
3519 ALC285_FIXUP_HP_SPECTRE_X360_DF1,
3520 ALC285_FIXUP_HP_ENVY_X360,
3521 ALC288_FIXUP_DELL_HEADSET_MODE,
3522 ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
3523 ALC288_FIXUP_DELL_XPS_13,
3524 ALC288_FIXUP_DISABLE_AAMIX,
3525 ALC292_FIXUP_DELL_E7X_AAMIX,
3526 ALC292_FIXUP_DELL_E7X,
3527 ALC292_FIXUP_DISABLE_AAMIX,
3528 ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK,
3529 ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
3530 ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
3531 ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
3532 ALC275_FIXUP_DELL_XPS,
3533 ALC293_FIXUP_LENOVO_SPK_NOISE,
3534 ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
3535 ALC233_FIXUP_LENOVO_L2MH_LOW_ENLED,
3536 ALC255_FIXUP_DELL_SPK_NOISE,
3537 ALC225_FIXUP_DISABLE_MIC_VREF,
3538 ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
3539 ALC295_FIXUP_DISABLE_DAC3,
3540 ALC285_FIXUP_SPEAKER2_TO_DAC1,
3541 ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1,
3542 ALC285_FIXUP_ASUS_HEADSET_MIC,
3543 ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS,
3544 ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1,
3545 ALC285_FIXUP_ASUS_I2C_HEADSET_MIC,
3546 ALC280_FIXUP_HP_HEADSET_MIC,
3547 ALC221_FIXUP_HP_FRONT_MIC,
3548 ALC292_FIXUP_TPT460,
3549 ALC298_FIXUP_SPK_VOLUME,
3550 ALC298_FIXUP_LENOVO_SPK_VOLUME,
3551 ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER,
3552 ALC269_FIXUP_ATIV_BOOK_8,
3553 ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE,
3554 ALC221_FIXUP_HP_MIC_NO_PRESENCE,
3555 ALC256_FIXUP_ASUS_HEADSET_MODE,
3556 ALC256_FIXUP_ASUS_MIC,
3557 ALC256_FIXUP_ASUS_AIO_GPIO2,
3558 ALC233_FIXUP_ASUS_MIC_NO_PRESENCE,
3559 ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE,
3560 ALC233_FIXUP_LENOVO_MULTI_CODECS,
3561 ALC233_FIXUP_ACER_HEADSET_MIC,
3562 ALC294_FIXUP_LENOVO_MIC_LOCATION,
3563 ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE,
3564 ALC225_FIXUP_S3_POP_NOISE,
3565 ALC700_FIXUP_INTEL_REFERENCE,
3566 ALC274_FIXUP_DELL_BIND_DACS,
3567 ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
3568 ALC298_FIXUP_TPT470_DOCK_FIX,
3569 ALC298_FIXUP_TPT470_DOCK,
3570 ALC255_FIXUP_DUMMY_LINEOUT_VERB,
3571 ALC255_FIXUP_DELL_HEADSET_MIC,
3572 ALC256_FIXUP_HUAWEI_MACH_WX9_PINS,
3573 ALC298_FIXUP_HUAWEI_MBX_STEREO,
3574 ALC295_FIXUP_HP_X360,
3575 ALC221_FIXUP_HP_HEADSET_MIC,
3576 ALC285_FIXUP_LENOVO_HEADPHONE_NOISE,
3577 ALC295_FIXUP_HP_AUTO_MUTE,
3578 ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
3579 ALC294_FIXUP_ASUS_MIC,
3580 ALC294_FIXUP_ASUS_HEADSET_MIC,
3581 ALC294_FIXUP_ASUS_I2C_HEADSET_MIC,
3582 ALC294_FIXUP_ASUS_SPK,
3583 ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
3584 ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
3585 ALC255_FIXUP_ACER_HEADSET_MIC,
3586 ALC295_FIXUP_CHROME_BOOK,
3587 ALC225_FIXUP_HEADSET_JACK,
3588 ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE,
3589 ALC225_FIXUP_WYSE_AUTO_MUTE,
3590 ALC225_FIXUP_WYSE_DISABLE_MIC_VREF,
3591 ALC286_FIXUP_ACER_AIO_HEADSET_MIC,
3592 ALC256_FIXUP_ASUS_HEADSET_MIC,
3593 ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
3594 ALC255_FIXUP_PREDATOR_SUBWOOFER,
3595 ALC299_FIXUP_PREDATOR_SPK,
3596 ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE,
3597 ALC289_FIXUP_DELL_SPK1,
3598 ALC289_FIXUP_DELL_SPK2,
3599 ALC289_FIXUP_DUAL_SPK,
3600 ALC289_FIXUP_RTK_AMP_DUAL_SPK,
3601 ALC294_FIXUP_SPK2_TO_DAC1,
3602 ALC294_FIXUP_ASUS_DUAL_SPK,
3603 ALC285_FIXUP_THINKPAD_X1_GEN7,
3604 ALC285_FIXUP_THINKPAD_HEADSET_JACK,
3605 ALC294_FIXUP_ASUS_ALLY,
3606 ALC294_FIXUP_ASUS_ALLY_PINS,
3607 ALC294_FIXUP_ASUS_ALLY_VERBS,
3608 ALC294_FIXUP_ASUS_ALLY_SPEAKER,
3609 ALC294_FIXUP_ASUS_HPE,
3610 ALC294_FIXUP_ASUS_COEF_1B,
3611 ALC294_FIXUP_ASUS_GX502_HP,
3612 ALC294_FIXUP_ASUS_GX502_PINS,
3613 ALC294_FIXUP_ASUS_GX502_VERBS,
3614 ALC294_FIXUP_ASUS_GU502_HP,
3615 ALC294_FIXUP_ASUS_GU502_PINS,
3616 ALC294_FIXUP_ASUS_GU502_VERBS,
3617 ALC294_FIXUP_ASUS_G513_PINS,
3618 ALC285_FIXUP_ASUS_G533Z_PINS,
3619 ALC285_FIXUP_HP_GPIO_LED,
3620 ALC285_FIXUP_HP_MUTE_LED,
3621 ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED,
3622 ALC285_FIXUP_HP_BEEP_MICMUTE_LED,
3623 ALC236_FIXUP_HP_MUTE_LED_COEFBIT2,
3624 ALC236_FIXUP_HP_GPIO_LED,
3625 ALC236_FIXUP_HP_MUTE_LED,
3626 ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,
3627 ALC236_FIXUP_LENOVO_INV_DMIC,
3628 ALC298_FIXUP_SAMSUNG_AMP,
3629 ALC298_FIXUP_SAMSUNG_AMP_V2_2_AMPS,
3630 ALC298_FIXUP_SAMSUNG_AMP_V2_4_AMPS,
3631 ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
3632 ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
3633 ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
3634 ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS,
3635 ALC269VC_FIXUP_ACER_HEADSET_MIC,
3636 ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE,
3637 ALC289_FIXUP_ASUS_GA401,
3638 ALC289_FIXUP_ASUS_GA502,
3639 ALC256_FIXUP_ACER_MIC_NO_PRESENCE,
3640 ALC285_FIXUP_HP_GPIO_AMP_INIT,
3641 ALC269_FIXUP_CZC_B20,
3642 ALC269_FIXUP_CZC_TMI,
3643 ALC269_FIXUP_CZC_L101,
3644 ALC269_FIXUP_LEMOTE_A1802,
3645 ALC269_FIXUP_LEMOTE_A190X,
3646 ALC256_FIXUP_INTEL_NUC8_RUGGED,
3647 ALC233_FIXUP_INTEL_NUC8_DMIC,
3648 ALC233_FIXUP_INTEL_NUC8_BOOST,
3649 ALC256_FIXUP_INTEL_NUC10,
3650 ALC255_FIXUP_XIAOMI_HEADSET_MIC,
3651 ALC274_FIXUP_HP_MIC,
3652 ALC274_FIXUP_HP_HEADSET_MIC,
3653 ALC274_FIXUP_HP_ENVY_GPIO,
3654 ALC274_FIXUP_ASUS_ZEN_AIO_27,
3655 ALC256_FIXUP_ASUS_HPE,
3656 ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
3657 ALC287_FIXUP_HP_GPIO_LED,
3658 ALC256_FIXUP_HP_HEADSET_MIC,
3659 ALC245_FIXUP_HP_GPIO_LED,
3660 ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
3661 ALC282_FIXUP_ACER_DISABLE_LINEOUT,
3662 ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST,
3663 ALC256_FIXUP_ACER_HEADSET_MIC,
3664 ALC285_FIXUP_IDEAPAD_S740_COEF,
3665 ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST,
3666 ALC295_FIXUP_ASUS_DACS,
3667 ALC295_FIXUP_HP_OMEN,
3668 ALC285_FIXUP_HP_SPECTRE_X360,
3669 ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP,
3670 ALC623_FIXUP_LENOVO_THINKSTATION_P340,
3671 ALC255_FIXUP_ACER_HEADPHONE_AND_MIC,
3672 ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST,
3673 ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS,
3674 ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,
3675 ALC287_FIXUP_YOGA7_14ITL_SPEAKERS,
3676 ALC298_FIXUP_LENOVO_C940_DUET7,
3677 ALC287_FIXUP_13S_GEN2_SPEAKERS,
3678 ALC256_FIXUP_SET_COEF_DEFAULTS,
3679 ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
3680 ALC233_FIXUP_NO_AUDIO_JACK,
3681 ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME,
3682 ALC285_FIXUP_LEGION_Y9000X_SPEAKERS,
3683 ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,
3684 ALC287_FIXUP_LEGION_16ACHG6,
3685 ALC287_FIXUP_CS35L41_I2C_2,
3686 ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED,
3687 ALC287_FIXUP_CS35L41_I2C_4,
3688 ALC245_FIXUP_CS35L41_SPI_1,
3689 ALC245_FIXUP_CS35L41_SPI_2,
3690 ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED,
3691 ALC245_FIXUP_CS35L41_SPI_4,
3692 ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED,
3693 ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED,
3694 ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE,
3695 ALC287_FIXUP_LEGION_16ITHG6,
3696 ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK,
3697 ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN,
3698 ALC287_FIXUP_YOGA9_14IMH9_BASS_SPK_PIN,
3699 ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS,
3700 ALC236_FIXUP_DELL_DUAL_CODECS,
3701 ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI,
3702 ALC287_FIXUP_TAS2781_I2C,
3703 ALC295_FIXUP_DELL_TAS2781_I2C,
3704 ALC245_FIXUP_TAS2781_SPI_2,
3705 ALC287_FIXUP_TXNW2781_I2C,
3706 ALC287_FIXUP_YOGA7_14ARB7_I2C,
3707 ALC245_FIXUP_HP_MUTE_LED_COEFBIT,
3708 ALC245_FIXUP_HP_MUTE_LED_V1_COEFBIT,
3709 ALC245_FIXUP_HP_X360_MUTE_LEDS,
3710 ALC287_FIXUP_THINKPAD_I2S_SPK,
3711 ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD,
3712 ALC2XX_FIXUP_HEADSET_MIC,
3713 ALC289_FIXUP_DELL_CS35L41_SPI_2,
3714 ALC294_FIXUP_CS35L41_I2C_2,
3715 ALC256_FIXUP_ACER_SFG16_MICMUTE_LED,
3716 ALC256_FIXUP_HEADPHONE_AMP_VOL,
3717 ALC245_FIXUP_HP_SPECTRE_X360_EU0XXX,
3718 ALC245_FIXUP_HP_SPECTRE_X360_16_AA0XXX,
3719 ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A,
3720 ALC285_FIXUP_ASUS_GA403U,
3721 ALC285_FIXUP_ASUS_GA403U_HEADSET_MIC,
3722 ALC285_FIXUP_ASUS_GA403U_I2C_SPEAKER2_TO_DAC1,
3723 ALC285_FIXUP_ASUS_GU605_SPI_2_HEADSET_MIC,
3724 ALC285_FIXUP_ASUS_GU605_SPI_SPEAKER2_TO_DAC1,
3725 ALC287_FIXUP_LENOVO_THKPAD_WH_ALC1318,
3726 ALC256_FIXUP_CHROME_BOOK,
3727 ALC245_FIXUP_CLEVO_NOISY_MIC,
3728 ALC269_FIXUP_VAIO_VJFH52_MIC_NO_PRESENCE,
3729 ALC233_FIXUP_MEDION_MTL_SPK,
3730 ALC294_FIXUP_BASS_SPEAKER_15,
3731 ALC283_FIXUP_DELL_HP_RESUME,
3732 ALC294_FIXUP_ASUS_CS35L41_SPI_2,
3733 ALC274_FIXUP_HP_AIO_BIND_DACS,
3734 ALC287_FIXUP_PREDATOR_SPK_CS35L41_I2C_2,
3735 ALC285_FIXUP_ASUS_GA605K_HEADSET_MIC,
3736 ALC285_FIXUP_ASUS_GA605K_I2C_SPEAKER2_TO_DAC1,
3737 ALC269_FIXUP_POSITIVO_P15X_HEADSET_MIC,
3738 };
3739
3740 /* A special fixup for Lenovo C940 and Yoga Duet 7;
3741 * both have the very same PCI SSID, and we need to apply different fixups
3742 * depending on the codec ID
3743 */
alc298_fixup_lenovo_c940_duet7(struct hda_codec * codec,const struct hda_fixup * fix,int action)3744 static void alc298_fixup_lenovo_c940_duet7(struct hda_codec *codec,
3745 const struct hda_fixup *fix,
3746 int action)
3747 {
3748 int id;
3749
3750 if (codec->core.vendor_id == 0x10ec0298)
3751 id = ALC298_FIXUP_LENOVO_SPK_VOLUME; /* C940 */
3752 else
3753 id = ALC287_FIXUP_YOGA7_14ITL_SPEAKERS; /* Duet 7 */
3754 __snd_hda_apply_fixup(codec, id, action, 0);
3755 }
3756
3757 static const struct hda_fixup alc269_fixups[] = {
3758 [ALC269_FIXUP_GPIO2] = {
3759 .type = HDA_FIXUP_FUNC,
3760 .v.func = alc_fixup_gpio2,
3761 },
3762 [ALC269_FIXUP_SONY_VAIO] = {
3763 .type = HDA_FIXUP_PINCTLS,
3764 .v.pins = (const struct hda_pintbl[]) {
3765 {0x19, PIN_VREFGRD},
3766 {}
3767 }
3768 },
3769 [ALC275_FIXUP_SONY_VAIO_GPIO2] = {
3770 .type = HDA_FIXUP_FUNC,
3771 .v.func = alc275_fixup_gpio4_off,
3772 .chained = true,
3773 .chain_id = ALC269_FIXUP_SONY_VAIO
3774 },
3775 [ALC269_FIXUP_DELL_M101Z] = {
3776 .type = HDA_FIXUP_VERBS,
3777 .v.verbs = (const struct hda_verb[]) {
3778 /* Enables internal speaker */
3779 {0x20, AC_VERB_SET_COEF_INDEX, 13},
3780 {0x20, AC_VERB_SET_PROC_COEF, 0x4040},
3781 {}
3782 }
3783 },
3784 [ALC269_FIXUP_SKU_IGNORE] = {
3785 .type = HDA_FIXUP_FUNC,
3786 .v.func = alc_fixup_sku_ignore,
3787 },
3788 [ALC269_FIXUP_ASUS_G73JW] = {
3789 .type = HDA_FIXUP_PINS,
3790 .v.pins = (const struct hda_pintbl[]) {
3791 { 0x17, 0x99130111 }, /* subwoofer */
3792 { }
3793 }
3794 },
3795 [ALC269_FIXUP_ASUS_N7601ZM_PINS] = {
3796 .type = HDA_FIXUP_PINS,
3797 .v.pins = (const struct hda_pintbl[]) {
3798 { 0x19, 0x03A11050 },
3799 { 0x1a, 0x03A11C30 },
3800 { 0x21, 0x03211420 },
3801 { }
3802 }
3803 },
3804 [ALC269_FIXUP_ASUS_N7601ZM] = {
3805 .type = HDA_FIXUP_VERBS,
3806 .v.verbs = (const struct hda_verb[]) {
3807 {0x20, AC_VERB_SET_COEF_INDEX, 0x62},
3808 {0x20, AC_VERB_SET_PROC_COEF, 0xa007},
3809 {0x20, AC_VERB_SET_COEF_INDEX, 0x10},
3810 {0x20, AC_VERB_SET_PROC_COEF, 0x8420},
3811 {0x20, AC_VERB_SET_COEF_INDEX, 0x0f},
3812 {0x20, AC_VERB_SET_PROC_COEF, 0x7774},
3813 { }
3814 },
3815 .chained = true,
3816 .chain_id = ALC269_FIXUP_ASUS_N7601ZM_PINS,
3817 },
3818 [ALC269_FIXUP_LENOVO_EAPD] = {
3819 .type = HDA_FIXUP_VERBS,
3820 .v.verbs = (const struct hda_verb[]) {
3821 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
3822 {}
3823 }
3824 },
3825 [ALC275_FIXUP_SONY_HWEQ] = {
3826 .type = HDA_FIXUP_FUNC,
3827 .v.func = alc269_fixup_hweq,
3828 .chained = true,
3829 .chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
3830 },
3831 [ALC275_FIXUP_SONY_DISABLE_AAMIX] = {
3832 .type = HDA_FIXUP_FUNC,
3833 .v.func = alc_fixup_disable_aamix,
3834 .chained = true,
3835 .chain_id = ALC269_FIXUP_SONY_VAIO
3836 },
3837 [ALC271_FIXUP_DMIC] = {
3838 .type = HDA_FIXUP_FUNC,
3839 .v.func = alc271_fixup_dmic,
3840 },
3841 [ALC269_FIXUP_PCM_44K] = {
3842 .type = HDA_FIXUP_FUNC,
3843 .v.func = alc269_fixup_pcm_44k,
3844 .chained = true,
3845 .chain_id = ALC269_FIXUP_QUANTA_MUTE
3846 },
3847 [ALC269_FIXUP_STEREO_DMIC] = {
3848 .type = HDA_FIXUP_FUNC,
3849 .v.func = alc269_fixup_stereo_dmic,
3850 },
3851 [ALC269_FIXUP_HEADSET_MIC] = {
3852 .type = HDA_FIXUP_FUNC,
3853 .v.func = alc_fixup_headset_mic,
3854 },
3855 [ALC269_FIXUP_QUANTA_MUTE] = {
3856 .type = HDA_FIXUP_FUNC,
3857 .v.func = alc269_fixup_quanta_mute,
3858 },
3859 [ALC269_FIXUP_LIFEBOOK] = {
3860 .type = HDA_FIXUP_PINS,
3861 .v.pins = (const struct hda_pintbl[]) {
3862 { 0x1a, 0x2101103f }, /* dock line-out */
3863 { 0x1b, 0x23a11040 }, /* dock mic-in */
3864 { }
3865 },
3866 .chained = true,
3867 .chain_id = ALC269_FIXUP_QUANTA_MUTE
3868 },
3869 [ALC269_FIXUP_LIFEBOOK_EXTMIC] = {
3870 .type = HDA_FIXUP_PINS,
3871 .v.pins = (const struct hda_pintbl[]) {
3872 { 0x19, 0x01a1903c }, /* headset mic, with jack detect */
3873 { }
3874 },
3875 },
3876 [ALC269_FIXUP_LIFEBOOK_HP_PIN] = {
3877 .type = HDA_FIXUP_PINS,
3878 .v.pins = (const struct hda_pintbl[]) {
3879 { 0x21, 0x0221102f }, /* HP out */
3880 { }
3881 },
3882 },
3883 [ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT] = {
3884 .type = HDA_FIXUP_FUNC,
3885 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
3886 },
3887 [ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC] = {
3888 .type = HDA_FIXUP_FUNC,
3889 .v.func = alc269_fixup_pincfg_U7x7_headset_mic,
3890 },
3891 [ALC269VB_FIXUP_INFINIX_ZERO_BOOK_13] = {
3892 .type = HDA_FIXUP_PINS,
3893 .v.pins = (const struct hda_pintbl[]) {
3894 { 0x14, 0x90170151 }, /* use as internal speaker (LFE) */
3895 { 0x1b, 0x90170152 }, /* use as internal speaker (back) */
3896 { }
3897 },
3898 .chained = true,
3899 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
3900 },
3901 [ALC269VC_FIXUP_INFINIX_Y4_MAX] = {
3902 .type = HDA_FIXUP_PINS,
3903 .v.pins = (const struct hda_pintbl[]) {
3904 { 0x1b, 0x90170150 }, /* use as internal speaker */
3905 { }
3906 },
3907 .chained = true,
3908 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
3909 },
3910 [ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO] = {
3911 .type = HDA_FIXUP_PINS,
3912 .v.pins = (const struct hda_pintbl[]) {
3913 { 0x18, 0x03a19020 }, /* headset mic */
3914 { 0x1b, 0x90170150 }, /* speaker */
3915 { }
3916 },
3917 },
3918 [ALC269_FIXUP_AMIC] = {
3919 .type = HDA_FIXUP_PINS,
3920 .v.pins = (const struct hda_pintbl[]) {
3921 { 0x14, 0x99130110 }, /* speaker */
3922 { 0x15, 0x0121401f }, /* HP out */
3923 { 0x18, 0x01a19c20 }, /* mic */
3924 { 0x19, 0x99a3092f }, /* int-mic */
3925 { }
3926 },
3927 },
3928 [ALC269_FIXUP_DMIC] = {
3929 .type = HDA_FIXUP_PINS,
3930 .v.pins = (const struct hda_pintbl[]) {
3931 { 0x12, 0x99a3092f }, /* int-mic */
3932 { 0x14, 0x99130110 }, /* speaker */
3933 { 0x15, 0x0121401f }, /* HP out */
3934 { 0x18, 0x01a19c20 }, /* mic */
3935 { }
3936 },
3937 },
3938 [ALC269VB_FIXUP_AMIC] = {
3939 .type = HDA_FIXUP_PINS,
3940 .v.pins = (const struct hda_pintbl[]) {
3941 { 0x14, 0x99130110 }, /* speaker */
3942 { 0x18, 0x01a19c20 }, /* mic */
3943 { 0x19, 0x99a3092f }, /* int-mic */
3944 { 0x21, 0x0121401f }, /* HP out */
3945 { }
3946 },
3947 },
3948 [ALC269VB_FIXUP_DMIC] = {
3949 .type = HDA_FIXUP_PINS,
3950 .v.pins = (const struct hda_pintbl[]) {
3951 { 0x12, 0x99a3092f }, /* int-mic */
3952 { 0x14, 0x99130110 }, /* speaker */
3953 { 0x18, 0x01a19c20 }, /* mic */
3954 { 0x21, 0x0121401f }, /* HP out */
3955 { }
3956 },
3957 },
3958 [ALC269_FIXUP_HP_MUTE_LED] = {
3959 .type = HDA_FIXUP_FUNC,
3960 .v.func = alc269_fixup_hp_mute_led,
3961 },
3962 [ALC269_FIXUP_HP_MUTE_LED_MIC1] = {
3963 .type = HDA_FIXUP_FUNC,
3964 .v.func = alc269_fixup_hp_mute_led_mic1,
3965 },
3966 [ALC269_FIXUP_HP_MUTE_LED_MIC2] = {
3967 .type = HDA_FIXUP_FUNC,
3968 .v.func = alc269_fixup_hp_mute_led_mic2,
3969 },
3970 [ALC269_FIXUP_HP_MUTE_LED_MIC3] = {
3971 .type = HDA_FIXUP_FUNC,
3972 .v.func = alc269_fixup_hp_mute_led_mic3,
3973 .chained = true,
3974 .chain_id = ALC295_FIXUP_HP_AUTO_MUTE
3975 },
3976 [ALC269_FIXUP_HP_GPIO_LED] = {
3977 .type = HDA_FIXUP_FUNC,
3978 .v.func = alc269_fixup_hp_gpio_led,
3979 },
3980 [ALC269_FIXUP_HP_GPIO_MIC1_LED] = {
3981 .type = HDA_FIXUP_FUNC,
3982 .v.func = alc269_fixup_hp_gpio_mic1_led,
3983 },
3984 [ALC269_FIXUP_HP_LINE1_MIC1_LED] = {
3985 .type = HDA_FIXUP_FUNC,
3986 .v.func = alc269_fixup_hp_line1_mic1_led,
3987 },
3988 [ALC269_FIXUP_INV_DMIC] = {
3989 .type = HDA_FIXUP_FUNC,
3990 .v.func = alc_fixup_inv_dmic,
3991 },
3992 [ALC269_FIXUP_NO_SHUTUP] = {
3993 .type = HDA_FIXUP_FUNC,
3994 .v.func = alc_fixup_no_shutup,
3995 },
3996 [ALC269_FIXUP_LENOVO_DOCK] = {
3997 .type = HDA_FIXUP_PINS,
3998 .v.pins = (const struct hda_pintbl[]) {
3999 { 0x19, 0x23a11040 }, /* dock mic */
4000 { 0x1b, 0x2121103f }, /* dock headphone */
4001 { }
4002 },
4003 .chained = true,
4004 .chain_id = ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT
4005 },
4006 [ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST] = {
4007 .type = HDA_FIXUP_FUNC,
4008 .v.func = alc269_fixup_limit_int_mic_boost,
4009 .chained = true,
4010 .chain_id = ALC269_FIXUP_LENOVO_DOCK,
4011 },
4012 [ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT] = {
4013 .type = HDA_FIXUP_FUNC,
4014 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
4015 .chained = true,
4016 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
4017 },
4018 [ALC269_FIXUP_DELL1_MIC_NO_PRESENCE] = {
4019 .type = HDA_FIXUP_PINS,
4020 .v.pins = (const struct hda_pintbl[]) {
4021 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
4022 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
4023 { }
4024 },
4025 .chained = true,
4026 .chain_id = ALC269_FIXUP_HEADSET_MODE
4027 },
4028 [ALC269_FIXUP_DELL1_LIMIT_INT_MIC_BOOST] = {
4029 .type = HDA_FIXUP_FUNC,
4030 .v.func = alc269_fixup_limit_int_mic_boost,
4031 .chained = true,
4032 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
4033 },
4034 [ALC269_FIXUP_DELL2_MIC_NO_PRESENCE] = {
4035 .type = HDA_FIXUP_PINS,
4036 .v.pins = (const struct hda_pintbl[]) {
4037 { 0x16, 0x21014020 }, /* dock line out */
4038 { 0x19, 0x21a19030 }, /* dock mic */
4039 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
4040 { }
4041 },
4042 .chained = true,
4043 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
4044 },
4045 [ALC269_FIXUP_DELL3_MIC_NO_PRESENCE] = {
4046 .type = HDA_FIXUP_PINS,
4047 .v.pins = (const struct hda_pintbl[]) {
4048 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
4049 { }
4050 },
4051 .chained = true,
4052 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
4053 },
4054 [ALC269_FIXUP_DELL4_MIC_NO_PRESENCE] = {
4055 .type = HDA_FIXUP_PINS,
4056 .v.pins = (const struct hda_pintbl[]) {
4057 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
4058 { 0x1b, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
4059 { }
4060 },
4061 .chained = true,
4062 .chain_id = ALC269_FIXUP_HEADSET_MODE
4063 },
4064 [ALC269_FIXUP_HEADSET_MODE] = {
4065 .type = HDA_FIXUP_FUNC,
4066 .v.func = alc_fixup_headset_mode,
4067 .chained = true,
4068 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
4069 },
4070 [ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
4071 .type = HDA_FIXUP_FUNC,
4072 .v.func = alc_fixup_headset_mode_no_hp_mic,
4073 },
4074 [ALC269_FIXUP_ASPIRE_HEADSET_MIC] = {
4075 .type = HDA_FIXUP_PINS,
4076 .v.pins = (const struct hda_pintbl[]) {
4077 { 0x19, 0x01a1913c }, /* headset mic w/o jack detect */
4078 { }
4079 },
4080 .chained = true,
4081 .chain_id = ALC269_FIXUP_HEADSET_MODE,
4082 },
4083 [ALC286_FIXUP_SONY_MIC_NO_PRESENCE] = {
4084 .type = HDA_FIXUP_PINS,
4085 .v.pins = (const struct hda_pintbl[]) {
4086 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
4087 { }
4088 },
4089 .chained = true,
4090 .chain_id = ALC269_FIXUP_HEADSET_MIC
4091 },
4092 [ALC256_FIXUP_HUAWEI_MACH_WX9_PINS] = {
4093 .type = HDA_FIXUP_PINS,
4094 .v.pins = (const struct hda_pintbl[]) {
4095 {0x12, 0x90a60130},
4096 {0x13, 0x40000000},
4097 {0x14, 0x90170110},
4098 {0x18, 0x411111f0},
4099 {0x19, 0x04a11040},
4100 {0x1a, 0x411111f0},
4101 {0x1b, 0x90170112},
4102 {0x1d, 0x40759a05},
4103 {0x1e, 0x411111f0},
4104 {0x21, 0x04211020},
4105 { }
4106 },
4107 .chained = true,
4108 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
4109 },
4110 [ALC298_FIXUP_HUAWEI_MBX_STEREO] = {
4111 .type = HDA_FIXUP_FUNC,
4112 .v.func = alc298_fixup_huawei_mbx_stereo,
4113 .chained = true,
4114 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
4115 },
4116 [ALC269_FIXUP_ASUS_X101_FUNC] = {
4117 .type = HDA_FIXUP_FUNC,
4118 .v.func = alc269_fixup_x101_headset_mic,
4119 },
4120 [ALC269_FIXUP_ASUS_X101_VERB] = {
4121 .type = HDA_FIXUP_VERBS,
4122 .v.verbs = (const struct hda_verb[]) {
4123 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
4124 {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
4125 {0x20, AC_VERB_SET_PROC_COEF, 0x0310},
4126 { }
4127 },
4128 .chained = true,
4129 .chain_id = ALC269_FIXUP_ASUS_X101_FUNC
4130 },
4131 [ALC269_FIXUP_ASUS_X101] = {
4132 .type = HDA_FIXUP_PINS,
4133 .v.pins = (const struct hda_pintbl[]) {
4134 { 0x18, 0x04a1182c }, /* Headset mic */
4135 { }
4136 },
4137 .chained = true,
4138 .chain_id = ALC269_FIXUP_ASUS_X101_VERB
4139 },
4140 [ALC271_FIXUP_AMIC_MIC2] = {
4141 .type = HDA_FIXUP_PINS,
4142 .v.pins = (const struct hda_pintbl[]) {
4143 { 0x14, 0x99130110 }, /* speaker */
4144 { 0x19, 0x01a19c20 }, /* mic */
4145 { 0x1b, 0x99a7012f }, /* int-mic */
4146 { 0x21, 0x0121401f }, /* HP out */
4147 { }
4148 },
4149 },
4150 [ALC271_FIXUP_HP_GATE_MIC_JACK] = {
4151 .type = HDA_FIXUP_FUNC,
4152 .v.func = alc271_hp_gate_mic_jack,
4153 .chained = true,
4154 .chain_id = ALC271_FIXUP_AMIC_MIC2,
4155 },
4156 [ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572] = {
4157 .type = HDA_FIXUP_FUNC,
4158 .v.func = alc269_fixup_limit_int_mic_boost,
4159 .chained = true,
4160 .chain_id = ALC271_FIXUP_HP_GATE_MIC_JACK,
4161 },
4162 [ALC269_FIXUP_ACER_AC700] = {
4163 .type = HDA_FIXUP_PINS,
4164 .v.pins = (const struct hda_pintbl[]) {
4165 { 0x12, 0x99a3092f }, /* int-mic */
4166 { 0x14, 0x99130110 }, /* speaker */
4167 { 0x18, 0x03a11c20 }, /* mic */
4168 { 0x1e, 0x0346101e }, /* SPDIF1 */
4169 { 0x21, 0x0321101f }, /* HP out */
4170 { }
4171 },
4172 .chained = true,
4173 .chain_id = ALC271_FIXUP_DMIC,
4174 },
4175 [ALC269_FIXUP_LIMIT_INT_MIC_BOOST] = {
4176 .type = HDA_FIXUP_FUNC,
4177 .v.func = alc269_fixup_limit_int_mic_boost,
4178 .chained = true,
4179 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
4180 },
4181 [ALC269VB_FIXUP_ASUS_ZENBOOK] = {
4182 .type = HDA_FIXUP_FUNC,
4183 .v.func = alc269_fixup_limit_int_mic_boost,
4184 .chained = true,
4185 .chain_id = ALC269VB_FIXUP_DMIC,
4186 },
4187 [ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A] = {
4188 .type = HDA_FIXUP_VERBS,
4189 .v.verbs = (const struct hda_verb[]) {
4190 /* class-D output amp +5dB */
4191 { 0x20, AC_VERB_SET_COEF_INDEX, 0x12 },
4192 { 0x20, AC_VERB_SET_PROC_COEF, 0x2800 },
4193 {}
4194 },
4195 .chained = true,
4196 .chain_id = ALC269VB_FIXUP_ASUS_ZENBOOK,
4197 },
4198 [ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE] = {
4199 .type = HDA_FIXUP_PINS,
4200 .v.pins = (const struct hda_pintbl[]) {
4201 { 0x18, 0x01a110f0 }, /* use as headset mic */
4202 { }
4203 },
4204 .chained = true,
4205 .chain_id = ALC269_FIXUP_HEADSET_MIC
4206 },
4207 [ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED] = {
4208 .type = HDA_FIXUP_FUNC,
4209 .v.func = alc269_fixup_limit_int_mic_boost,
4210 .chained = true,
4211 .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC1,
4212 },
4213 [ALC269VB_FIXUP_ORDISSIMO_EVE2] = {
4214 .type = HDA_FIXUP_PINS,
4215 .v.pins = (const struct hda_pintbl[]) {
4216 { 0x12, 0x99a3092f }, /* int-mic */
4217 { 0x18, 0x03a11d20 }, /* mic */
4218 { 0x19, 0x411111f0 }, /* Unused bogus pin */
4219 { }
4220 },
4221 },
4222 [ALC283_FIXUP_CHROME_BOOK] = {
4223 .type = HDA_FIXUP_FUNC,
4224 .v.func = alc283_fixup_chromebook,
4225 },
4226 [ALC283_FIXUP_SENSE_COMBO_JACK] = {
4227 .type = HDA_FIXUP_FUNC,
4228 .v.func = alc283_fixup_sense_combo_jack,
4229 .chained = true,
4230 .chain_id = ALC283_FIXUP_CHROME_BOOK,
4231 },
4232 [ALC282_FIXUP_ASUS_TX300] = {
4233 .type = HDA_FIXUP_FUNC,
4234 .v.func = alc282_fixup_asus_tx300,
4235 },
4236 [ALC283_FIXUP_INT_MIC] = {
4237 .type = HDA_FIXUP_VERBS,
4238 .v.verbs = (const struct hda_verb[]) {
4239 {0x20, AC_VERB_SET_COEF_INDEX, 0x1a},
4240 {0x20, AC_VERB_SET_PROC_COEF, 0x0011},
4241 { }
4242 },
4243 .chained = true,
4244 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
4245 },
4246 [ALC290_FIXUP_SUBWOOFER_HSJACK] = {
4247 .type = HDA_FIXUP_PINS,
4248 .v.pins = (const struct hda_pintbl[]) {
4249 { 0x17, 0x90170112 }, /* subwoofer */
4250 { }
4251 },
4252 .chained = true,
4253 .chain_id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
4254 },
4255 [ALC290_FIXUP_SUBWOOFER] = {
4256 .type = HDA_FIXUP_PINS,
4257 .v.pins = (const struct hda_pintbl[]) {
4258 { 0x17, 0x90170112 }, /* subwoofer */
4259 { }
4260 },
4261 .chained = true,
4262 .chain_id = ALC290_FIXUP_MONO_SPEAKERS,
4263 },
4264 [ALC290_FIXUP_MONO_SPEAKERS] = {
4265 .type = HDA_FIXUP_FUNC,
4266 .v.func = alc290_fixup_mono_speakers,
4267 },
4268 [ALC290_FIXUP_MONO_SPEAKERS_HSJACK] = {
4269 .type = HDA_FIXUP_FUNC,
4270 .v.func = alc290_fixup_mono_speakers,
4271 .chained = true,
4272 .chain_id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
4273 },
4274 [ALC269_FIXUP_THINKPAD_ACPI] = {
4275 .type = HDA_FIXUP_FUNC,
4276 .v.func = alc_fixup_thinkpad_acpi,
4277 .chained = true,
4278 .chain_id = ALC269_FIXUP_SKU_IGNORE,
4279 },
4280 [ALC269_FIXUP_LENOVO_XPAD_ACPI] = {
4281 .type = HDA_FIXUP_FUNC,
4282 .v.func = alc_fixup_ideapad_acpi,
4283 .chained = true,
4284 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
4285 },
4286 [ALC269_FIXUP_DMIC_THINKPAD_ACPI] = {
4287 .type = HDA_FIXUP_FUNC,
4288 .v.func = alc_fixup_inv_dmic,
4289 .chained = true,
4290 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
4291 },
4292 [ALC255_FIXUP_ACER_MIC_NO_PRESENCE] = {
4293 .type = HDA_FIXUP_PINS,
4294 .v.pins = (const struct hda_pintbl[]) {
4295 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
4296 { }
4297 },
4298 .chained = true,
4299 .chain_id = ALC255_FIXUP_HEADSET_MODE
4300 },
4301 [ALC255_FIXUP_ASUS_MIC_NO_PRESENCE] = {
4302 .type = HDA_FIXUP_PINS,
4303 .v.pins = (const struct hda_pintbl[]) {
4304 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
4305 { }
4306 },
4307 .chained = true,
4308 .chain_id = ALC255_FIXUP_HEADSET_MODE
4309 },
4310 [ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = {
4311 .type = HDA_FIXUP_PINS,
4312 .v.pins = (const struct hda_pintbl[]) {
4313 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
4314 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
4315 { }
4316 },
4317 .chained = true,
4318 .chain_id = ALC255_FIXUP_HEADSET_MODE
4319 },
4320 [ALC255_FIXUP_DELL1_LIMIT_INT_MIC_BOOST] = {
4321 .type = HDA_FIXUP_FUNC,
4322 .v.func = alc269_fixup_limit_int_mic_boost,
4323 .chained = true,
4324 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
4325 },
4326 [ALC255_FIXUP_DELL2_MIC_NO_PRESENCE] = {
4327 .type = HDA_FIXUP_PINS,
4328 .v.pins = (const struct hda_pintbl[]) {
4329 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
4330 { }
4331 },
4332 .chained = true,
4333 .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
4334 },
4335 [ALC255_FIXUP_HEADSET_MODE] = {
4336 .type = HDA_FIXUP_FUNC,
4337 .v.func = alc_fixup_headset_mode_alc255,
4338 .chained = true,
4339 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
4340 },
4341 [ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
4342 .type = HDA_FIXUP_FUNC,
4343 .v.func = alc_fixup_headset_mode_alc255_no_hp_mic,
4344 },
4345 [ALC293_FIXUP_DELL1_MIC_NO_PRESENCE] = {
4346 .type = HDA_FIXUP_PINS,
4347 .v.pins = (const struct hda_pintbl[]) {
4348 { 0x18, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
4349 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
4350 { }
4351 },
4352 .chained = true,
4353 .chain_id = ALC269_FIXUP_HEADSET_MODE
4354 },
4355 [ALC292_FIXUP_TPT440_DOCK] = {
4356 .type = HDA_FIXUP_FUNC,
4357 .v.func = alc_fixup_tpt440_dock,
4358 .chained = true,
4359 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
4360 },
4361 [ALC292_FIXUP_TPT440] = {
4362 .type = HDA_FIXUP_FUNC,
4363 .v.func = alc_fixup_disable_aamix,
4364 .chained = true,
4365 .chain_id = ALC292_FIXUP_TPT440_DOCK,
4366 },
4367 [ALC283_FIXUP_HEADSET_MIC] = {
4368 .type = HDA_FIXUP_PINS,
4369 .v.pins = (const struct hda_pintbl[]) {
4370 { 0x19, 0x04a110f0 },
4371 { },
4372 },
4373 },
4374 [ALC255_FIXUP_MIC_MUTE_LED] = {
4375 .type = HDA_FIXUP_FUNC,
4376 .v.func = alc_fixup_micmute_led,
4377 },
4378 [ALC282_FIXUP_ASPIRE_V5_PINS] = {
4379 .type = HDA_FIXUP_PINS,
4380 .v.pins = (const struct hda_pintbl[]) {
4381 { 0x12, 0x90a60130 },
4382 { 0x14, 0x90170110 },
4383 { 0x17, 0x40000008 },
4384 { 0x18, 0x411111f0 },
4385 { 0x19, 0x01a1913c },
4386 { 0x1a, 0x411111f0 },
4387 { 0x1b, 0x411111f0 },
4388 { 0x1d, 0x40f89b2d },
4389 { 0x1e, 0x411111f0 },
4390 { 0x21, 0x0321101f },
4391 { },
4392 },
4393 },
4394 [ALC269VB_FIXUP_ASPIRE_E1_COEF] = {
4395 .type = HDA_FIXUP_FUNC,
4396 .v.func = alc269vb_fixup_aspire_e1_coef,
4397 },
4398 [ALC280_FIXUP_HP_GPIO4] = {
4399 .type = HDA_FIXUP_FUNC,
4400 .v.func = alc280_fixup_hp_gpio4,
4401 },
4402 [ALC286_FIXUP_HP_GPIO_LED] = {
4403 .type = HDA_FIXUP_FUNC,
4404 .v.func = alc286_fixup_hp_gpio_led,
4405 },
4406 [ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY] = {
4407 .type = HDA_FIXUP_FUNC,
4408 .v.func = alc280_fixup_hp_gpio2_mic_hotkey,
4409 },
4410 [ALC280_FIXUP_HP_DOCK_PINS] = {
4411 .type = HDA_FIXUP_PINS,
4412 .v.pins = (const struct hda_pintbl[]) {
4413 { 0x1b, 0x21011020 }, /* line-out */
4414 { 0x1a, 0x01a1903c }, /* headset mic */
4415 { 0x18, 0x2181103f }, /* line-in */
4416 { },
4417 },
4418 .chained = true,
4419 .chain_id = ALC280_FIXUP_HP_GPIO4
4420 },
4421 [ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED] = {
4422 .type = HDA_FIXUP_PINS,
4423 .v.pins = (const struct hda_pintbl[]) {
4424 { 0x1b, 0x21011020 }, /* line-out */
4425 { 0x18, 0x2181103f }, /* line-in */
4426 { },
4427 },
4428 .chained = true,
4429 .chain_id = ALC269_FIXUP_HP_GPIO_MIC1_LED
4430 },
4431 [ALC280_FIXUP_HP_9480M] = {
4432 .type = HDA_FIXUP_FUNC,
4433 .v.func = alc280_fixup_hp_9480m,
4434 },
4435 [ALC245_FIXUP_HP_X360_AMP] = {
4436 .type = HDA_FIXUP_FUNC,
4437 .v.func = alc245_fixup_hp_x360_amp,
4438 .chained = true,
4439 .chain_id = ALC245_FIXUP_HP_GPIO_LED
4440 },
4441 [ALC288_FIXUP_DELL_HEADSET_MODE] = {
4442 .type = HDA_FIXUP_FUNC,
4443 .v.func = alc_fixup_headset_mode_dell_alc288,
4444 .chained = true,
4445 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
4446 },
4447 [ALC288_FIXUP_DELL1_MIC_NO_PRESENCE] = {
4448 .type = HDA_FIXUP_PINS,
4449 .v.pins = (const struct hda_pintbl[]) {
4450 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
4451 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
4452 { }
4453 },
4454 .chained = true,
4455 .chain_id = ALC288_FIXUP_DELL_HEADSET_MODE
4456 },
4457 [ALC288_FIXUP_DISABLE_AAMIX] = {
4458 .type = HDA_FIXUP_FUNC,
4459 .v.func = alc_fixup_disable_aamix,
4460 .chained = true,
4461 .chain_id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE
4462 },
4463 [ALC288_FIXUP_DELL_XPS_13] = {
4464 .type = HDA_FIXUP_FUNC,
4465 .v.func = alc_fixup_dell_xps13,
4466 .chained = true,
4467 .chain_id = ALC288_FIXUP_DISABLE_AAMIX
4468 },
4469 [ALC292_FIXUP_DISABLE_AAMIX] = {
4470 .type = HDA_FIXUP_FUNC,
4471 .v.func = alc_fixup_disable_aamix,
4472 .chained = true,
4473 .chain_id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE
4474 },
4475 [ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK] = {
4476 .type = HDA_FIXUP_FUNC,
4477 .v.func = alc_fixup_disable_aamix,
4478 .chained = true,
4479 .chain_id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE
4480 },
4481 [ALC292_FIXUP_DELL_E7X_AAMIX] = {
4482 .type = HDA_FIXUP_FUNC,
4483 .v.func = alc_fixup_dell_xps13,
4484 .chained = true,
4485 .chain_id = ALC292_FIXUP_DISABLE_AAMIX
4486 },
4487 [ALC292_FIXUP_DELL_E7X] = {
4488 .type = HDA_FIXUP_FUNC,
4489 .v.func = alc_fixup_micmute_led,
4490 /* micmute fixup must be applied at last */
4491 .chained_before = true,
4492 .chain_id = ALC292_FIXUP_DELL_E7X_AAMIX,
4493 },
4494 [ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE] = {
4495 .type = HDA_FIXUP_PINS,
4496 .v.pins = (const struct hda_pintbl[]) {
4497 { 0x18, 0x01a1913c }, /* headset mic w/o jack detect */
4498 { }
4499 },
4500 .chained_before = true,
4501 .chain_id = ALC269_FIXUP_HEADSET_MODE,
4502 },
4503 [ALC298_FIXUP_DELL1_MIC_NO_PRESENCE] = {
4504 .type = HDA_FIXUP_PINS,
4505 .v.pins = (const struct hda_pintbl[]) {
4506 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
4507 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
4508 { }
4509 },
4510 .chained = true,
4511 .chain_id = ALC269_FIXUP_HEADSET_MODE
4512 },
4513 [ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE] = {
4514 .type = HDA_FIXUP_PINS,
4515 .v.pins = (const struct hda_pintbl[]) {
4516 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
4517 { }
4518 },
4519 .chained = true,
4520 .chain_id = ALC269_FIXUP_HEADSET_MODE
4521 },
4522 [ALC275_FIXUP_DELL_XPS] = {
4523 .type = HDA_FIXUP_VERBS,
4524 .v.verbs = (const struct hda_verb[]) {
4525 /* Enables internal speaker */
4526 {0x20, AC_VERB_SET_COEF_INDEX, 0x1f},
4527 {0x20, AC_VERB_SET_PROC_COEF, 0x00c0},
4528 {0x20, AC_VERB_SET_COEF_INDEX, 0x30},
4529 {0x20, AC_VERB_SET_PROC_COEF, 0x00b1},
4530 {}
4531 }
4532 },
4533 [ALC293_FIXUP_LENOVO_SPK_NOISE] = {
4534 .type = HDA_FIXUP_FUNC,
4535 .v.func = alc_fixup_disable_aamix,
4536 .chained = true,
4537 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
4538 },
4539 [ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY] = {
4540 .type = HDA_FIXUP_FUNC,
4541 .v.func = alc233_fixup_lenovo_line2_mic_hotkey,
4542 },
4543 [ALC233_FIXUP_LENOVO_L2MH_LOW_ENLED] = {
4544 .type = HDA_FIXUP_FUNC,
4545 .v.func = alc233_fixup_lenovo_low_en_micmute_led,
4546 },
4547 [ALC233_FIXUP_INTEL_NUC8_DMIC] = {
4548 .type = HDA_FIXUP_FUNC,
4549 .v.func = alc_fixup_inv_dmic,
4550 .chained = true,
4551 .chain_id = ALC233_FIXUP_INTEL_NUC8_BOOST,
4552 },
4553 [ALC233_FIXUP_INTEL_NUC8_BOOST] = {
4554 .type = HDA_FIXUP_FUNC,
4555 .v.func = alc269_fixup_limit_int_mic_boost
4556 },
4557 [ALC255_FIXUP_DELL_SPK_NOISE] = {
4558 .type = HDA_FIXUP_FUNC,
4559 .v.func = alc_fixup_disable_aamix,
4560 .chained = true,
4561 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
4562 },
4563 [ALC225_FIXUP_DISABLE_MIC_VREF] = {
4564 .type = HDA_FIXUP_FUNC,
4565 .v.func = alc_fixup_disable_mic_vref,
4566 .chained = true,
4567 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
4568 },
4569 [ALC225_FIXUP_DELL1_MIC_NO_PRESENCE] = {
4570 .type = HDA_FIXUP_VERBS,
4571 .v.verbs = (const struct hda_verb[]) {
4572 /* Disable pass-through path for FRONT 14h */
4573 { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
4574 { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
4575 {}
4576 },
4577 .chained = true,
4578 .chain_id = ALC225_FIXUP_DISABLE_MIC_VREF
4579 },
4580 [ALC280_FIXUP_HP_HEADSET_MIC] = {
4581 .type = HDA_FIXUP_FUNC,
4582 .v.func = alc_fixup_disable_aamix,
4583 .chained = true,
4584 .chain_id = ALC269_FIXUP_HEADSET_MIC,
4585 },
4586 [ALC221_FIXUP_HP_FRONT_MIC] = {
4587 .type = HDA_FIXUP_PINS,
4588 .v.pins = (const struct hda_pintbl[]) {
4589 { 0x19, 0x02a19020 }, /* Front Mic */
4590 { }
4591 },
4592 },
4593 [ALC292_FIXUP_TPT460] = {
4594 .type = HDA_FIXUP_FUNC,
4595 .v.func = alc_fixup_tpt440_dock,
4596 .chained = true,
4597 .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE,
4598 },
4599 [ALC298_FIXUP_SPK_VOLUME] = {
4600 .type = HDA_FIXUP_FUNC,
4601 .v.func = alc298_fixup_speaker_volume,
4602 .chained = true,
4603 .chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
4604 },
4605 [ALC298_FIXUP_LENOVO_SPK_VOLUME] = {
4606 .type = HDA_FIXUP_FUNC,
4607 .v.func = alc298_fixup_speaker_volume,
4608 },
4609 [ALC295_FIXUP_DISABLE_DAC3] = {
4610 .type = HDA_FIXUP_FUNC,
4611 .v.func = alc295_fixup_disable_dac3,
4612 },
4613 [ALC285_FIXUP_SPEAKER2_TO_DAC1] = {
4614 .type = HDA_FIXUP_FUNC,
4615 .v.func = alc285_fixup_speaker2_to_dac1,
4616 .chained = true,
4617 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
4618 },
4619 [ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1] = {
4620 .type = HDA_FIXUP_FUNC,
4621 .v.func = alc285_fixup_speaker2_to_dac1,
4622 .chained = true,
4623 .chain_id = ALC245_FIXUP_CS35L41_SPI_2
4624 },
4625 [ALC285_FIXUP_ASUS_HEADSET_MIC] = {
4626 .type = HDA_FIXUP_PINS,
4627 .v.pins = (const struct hda_pintbl[]) {
4628 { 0x19, 0x03a11050 },
4629 { 0x1b, 0x03a11c30 },
4630 { }
4631 },
4632 .chained = true,
4633 .chain_id = ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1
4634 },
4635 [ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS] = {
4636 .type = HDA_FIXUP_PINS,
4637 .v.pins = (const struct hda_pintbl[]) {
4638 { 0x14, 0x90170120 },
4639 { }
4640 },
4641 .chained = true,
4642 .chain_id = ALC285_FIXUP_ASUS_HEADSET_MIC
4643 },
4644 [ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1] = {
4645 .type = HDA_FIXUP_FUNC,
4646 .v.func = alc285_fixup_speaker2_to_dac1,
4647 .chained = true,
4648 .chain_id = ALC287_FIXUP_CS35L41_I2C_2
4649 },
4650 [ALC285_FIXUP_ASUS_I2C_HEADSET_MIC] = {
4651 .type = HDA_FIXUP_PINS,
4652 .v.pins = (const struct hda_pintbl[]) {
4653 { 0x19, 0x03a11050 },
4654 { 0x1b, 0x03a11c30 },
4655 { }
4656 },
4657 .chained = true,
4658 .chain_id = ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1
4659 },
4660 [ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {
4661 .type = HDA_FIXUP_PINS,
4662 .v.pins = (const struct hda_pintbl[]) {
4663 { 0x1b, 0x90170151 },
4664 { }
4665 },
4666 .chained = true,
4667 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
4668 },
4669 [ALC269_FIXUP_ATIV_BOOK_8] = {
4670 .type = HDA_FIXUP_FUNC,
4671 .v.func = alc_fixup_auto_mute_via_amp,
4672 .chained = true,
4673 .chain_id = ALC269_FIXUP_NO_SHUTUP
4674 },
4675 [ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE] = {
4676 .type = HDA_FIXUP_PINS,
4677 .v.pins = (const struct hda_pintbl[]) {
4678 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
4679 { 0x1a, 0x01813030 }, /* use as headphone mic, without its own jack detect */
4680 { }
4681 },
4682 .chained = true,
4683 .chain_id = ALC269_FIXUP_HEADSET_MODE
4684 },
4685 [ALC221_FIXUP_HP_MIC_NO_PRESENCE] = {
4686 .type = HDA_FIXUP_PINS,
4687 .v.pins = (const struct hda_pintbl[]) {
4688 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
4689 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
4690 { }
4691 },
4692 .chained = true,
4693 .chain_id = ALC269_FIXUP_HEADSET_MODE
4694 },
4695 [ALC256_FIXUP_ASUS_HEADSET_MODE] = {
4696 .type = HDA_FIXUP_FUNC,
4697 .v.func = alc_fixup_headset_mode,
4698 },
4699 [ALC256_FIXUP_ASUS_MIC] = {
4700 .type = HDA_FIXUP_PINS,
4701 .v.pins = (const struct hda_pintbl[]) {
4702 { 0x13, 0x90a60160 }, /* use as internal mic */
4703 { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
4704 { }
4705 },
4706 .chained = true,
4707 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
4708 },
4709 [ALC256_FIXUP_ASUS_AIO_GPIO2] = {
4710 .type = HDA_FIXUP_FUNC,
4711 /* Set up GPIO2 for the speaker amp */
4712 .v.func = alc_fixup_gpio4,
4713 },
4714 [ALC233_FIXUP_ASUS_MIC_NO_PRESENCE] = {
4715 .type = HDA_FIXUP_PINS,
4716 .v.pins = (const struct hda_pintbl[]) {
4717 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
4718 { }
4719 },
4720 .chained = true,
4721 .chain_id = ALC269_FIXUP_HEADSET_MIC
4722 },
4723 [ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE] = {
4724 .type = HDA_FIXUP_VERBS,
4725 .v.verbs = (const struct hda_verb[]) {
4726 /* Enables internal speaker */
4727 {0x20, AC_VERB_SET_COEF_INDEX, 0x40},
4728 {0x20, AC_VERB_SET_PROC_COEF, 0x8800},
4729 {}
4730 },
4731 .chained = true,
4732 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
4733 },
4734 [ALC233_FIXUP_LENOVO_MULTI_CODECS] = {
4735 .type = HDA_FIXUP_FUNC,
4736 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
4737 .chained = true,
4738 .chain_id = ALC269_FIXUP_GPIO2
4739 },
4740 [ALC233_FIXUP_ACER_HEADSET_MIC] = {
4741 .type = HDA_FIXUP_VERBS,
4742 .v.verbs = (const struct hda_verb[]) {
4743 { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
4744 { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
4745 { }
4746 },
4747 .chained = true,
4748 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
4749 },
4750 [ALC294_FIXUP_LENOVO_MIC_LOCATION] = {
4751 .type = HDA_FIXUP_PINS,
4752 .v.pins = (const struct hda_pintbl[]) {
4753 /* Change the mic location from front to right, otherwise there are
4754 two front mics with the same name, pulseaudio can't handle them.
4755 This is just a temporary workaround, after applying this fixup,
4756 there will be one "Front Mic" and one "Mic" in this machine.
4757 */
4758 { 0x1a, 0x04a19040 },
4759 { }
4760 },
4761 },
4762 [ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE] = {
4763 .type = HDA_FIXUP_PINS,
4764 .v.pins = (const struct hda_pintbl[]) {
4765 { 0x16, 0x0101102f }, /* Rear Headset HP */
4766 { 0x19, 0x02a1913c }, /* use as Front headset mic, without its own jack detect */
4767 { 0x1a, 0x01a19030 }, /* Rear Headset MIC */
4768 { 0x1b, 0x02011020 },
4769 { }
4770 },
4771 .chained = true,
4772 .chain_id = ALC225_FIXUP_S3_POP_NOISE
4773 },
4774 [ALC225_FIXUP_S3_POP_NOISE] = {
4775 .type = HDA_FIXUP_FUNC,
4776 .v.func = alc225_fixup_s3_pop_noise,
4777 .chained = true,
4778 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
4779 },
4780 [ALC700_FIXUP_INTEL_REFERENCE] = {
4781 .type = HDA_FIXUP_VERBS,
4782 .v.verbs = (const struct hda_verb[]) {
4783 /* Enables internal speaker */
4784 {0x20, AC_VERB_SET_COEF_INDEX, 0x45},
4785 {0x20, AC_VERB_SET_PROC_COEF, 0x5289},
4786 {0x20, AC_VERB_SET_COEF_INDEX, 0x4A},
4787 {0x20, AC_VERB_SET_PROC_COEF, 0x001b},
4788 {0x58, AC_VERB_SET_COEF_INDEX, 0x00},
4789 {0x58, AC_VERB_SET_PROC_COEF, 0x3888},
4790 {0x20, AC_VERB_SET_COEF_INDEX, 0x6f},
4791 {0x20, AC_VERB_SET_PROC_COEF, 0x2c0b},
4792 {}
4793 }
4794 },
4795 [ALC274_FIXUP_DELL_BIND_DACS] = {
4796 .type = HDA_FIXUP_FUNC,
4797 .v.func = alc274_fixup_bind_dacs,
4798 .chained = true,
4799 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
4800 },
4801 [ALC274_FIXUP_DELL_AIO_LINEOUT_VERB] = {
4802 .type = HDA_FIXUP_PINS,
4803 .v.pins = (const struct hda_pintbl[]) {
4804 { 0x1b, 0x0401102f },
4805 { }
4806 },
4807 .chained = true,
4808 .chain_id = ALC274_FIXUP_DELL_BIND_DACS
4809 },
4810 [ALC298_FIXUP_TPT470_DOCK_FIX] = {
4811 .type = HDA_FIXUP_FUNC,
4812 .v.func = alc_fixup_tpt470_dock,
4813 .chained = true,
4814 .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE
4815 },
4816 [ALC298_FIXUP_TPT470_DOCK] = {
4817 .type = HDA_FIXUP_FUNC,
4818 .v.func = alc_fixup_tpt470_dacs,
4819 .chained = true,
4820 .chain_id = ALC298_FIXUP_TPT470_DOCK_FIX
4821 },
4822 [ALC255_FIXUP_DUMMY_LINEOUT_VERB] = {
4823 .type = HDA_FIXUP_PINS,
4824 .v.pins = (const struct hda_pintbl[]) {
4825 { 0x14, 0x0201101f },
4826 { }
4827 },
4828 .chained = true,
4829 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
4830 },
4831 [ALC255_FIXUP_DELL_HEADSET_MIC] = {
4832 .type = HDA_FIXUP_PINS,
4833 .v.pins = (const struct hda_pintbl[]) {
4834 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
4835 { }
4836 },
4837 .chained = true,
4838 .chain_id = ALC269_FIXUP_HEADSET_MIC
4839 },
4840 [ALC295_FIXUP_HP_X360] = {
4841 .type = HDA_FIXUP_FUNC,
4842 .v.func = alc295_fixup_hp_top_speakers,
4843 .chained = true,
4844 .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC3
4845 },
4846 [ALC221_FIXUP_HP_HEADSET_MIC] = {
4847 .type = HDA_FIXUP_PINS,
4848 .v.pins = (const struct hda_pintbl[]) {
4849 { 0x19, 0x0181313f},
4850 { }
4851 },
4852 .chained = true,
4853 .chain_id = ALC269_FIXUP_HEADSET_MIC
4854 },
4855 [ALC285_FIXUP_LENOVO_HEADPHONE_NOISE] = {
4856 .type = HDA_FIXUP_FUNC,
4857 .v.func = alc285_fixup_invalidate_dacs,
4858 .chained = true,
4859 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
4860 },
4861 [ALC295_FIXUP_HP_AUTO_MUTE] = {
4862 .type = HDA_FIXUP_FUNC,
4863 .v.func = alc_fixup_auto_mute_via_amp,
4864 },
4865 [ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE] = {
4866 .type = HDA_FIXUP_PINS,
4867 .v.pins = (const struct hda_pintbl[]) {
4868 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
4869 { }
4870 },
4871 .chained = true,
4872 .chain_id = ALC269_FIXUP_HEADSET_MIC
4873 },
4874 [ALC294_FIXUP_ASUS_MIC] = {
4875 .type = HDA_FIXUP_PINS,
4876 .v.pins = (const struct hda_pintbl[]) {
4877 { 0x13, 0x90a60160 }, /* use as internal mic */
4878 { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
4879 { }
4880 },
4881 .chained = true,
4882 .chain_id = ALC269_FIXUP_HEADSET_MIC
4883 },
4884 [ALC294_FIXUP_ASUS_HEADSET_MIC] = {
4885 .type = HDA_FIXUP_PINS,
4886 .v.pins = (const struct hda_pintbl[]) {
4887 { 0x19, 0x01a1103c }, /* use as headset mic */
4888 { }
4889 },
4890 .chained = true,
4891 .chain_id = ALC269_FIXUP_HEADSET_MIC
4892 },
4893 [ALC294_FIXUP_ASUS_I2C_HEADSET_MIC] = {
4894 .type = HDA_FIXUP_PINS,
4895 .v.pins = (const struct hda_pintbl[]) {
4896 { 0x19, 0x03a19020 }, /* use as headset mic */
4897 { }
4898 },
4899 .chained = true,
4900 .chain_id = ALC287_FIXUP_CS35L41_I2C_2
4901 },
4902 [ALC294_FIXUP_ASUS_SPK] = {
4903 .type = HDA_FIXUP_VERBS,
4904 .v.verbs = (const struct hda_verb[]) {
4905 /* Set EAPD high */
4906 { 0x20, AC_VERB_SET_COEF_INDEX, 0x40 },
4907 { 0x20, AC_VERB_SET_PROC_COEF, 0x8800 },
4908 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
4909 { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
4910 { }
4911 },
4912 .chained = true,
4913 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
4914 },
4915 [ALC295_FIXUP_CHROME_BOOK] = {
4916 .type = HDA_FIXUP_FUNC,
4917 .v.func = alc295_fixup_chromebook,
4918 .chained = true,
4919 .chain_id = ALC225_FIXUP_HEADSET_JACK
4920 },
4921 [ALC225_FIXUP_HEADSET_JACK] = {
4922 .type = HDA_FIXUP_FUNC,
4923 .v.func = alc_fixup_headset_jack,
4924 },
4925 [ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
4926 .type = HDA_FIXUP_PINS,
4927 .v.pins = (const struct hda_pintbl[]) {
4928 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
4929 { }
4930 },
4931 .chained = true,
4932 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
4933 },
4934 [ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE] = {
4935 .type = HDA_FIXUP_VERBS,
4936 .v.verbs = (const struct hda_verb[]) {
4937 /* Disable PCBEEP-IN passthrough */
4938 { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
4939 { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
4940 { }
4941 },
4942 .chained = true,
4943 .chain_id = ALC285_FIXUP_LENOVO_HEADPHONE_NOISE
4944 },
4945 [ALC255_FIXUP_ACER_HEADSET_MIC] = {
4946 .type = HDA_FIXUP_PINS,
4947 .v.pins = (const struct hda_pintbl[]) {
4948 { 0x19, 0x03a11130 },
4949 { 0x1a, 0x90a60140 }, /* use as internal mic */
4950 { }
4951 },
4952 .chained = true,
4953 .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
4954 },
4955 [ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE] = {
4956 .type = HDA_FIXUP_PINS,
4957 .v.pins = (const struct hda_pintbl[]) {
4958 { 0x16, 0x01011020 }, /* Rear Line out */
4959 { 0x19, 0x01a1913c }, /* use as Front headset mic, without its own jack detect */
4960 { }
4961 },
4962 .chained = true,
4963 .chain_id = ALC225_FIXUP_WYSE_AUTO_MUTE
4964 },
4965 [ALC225_FIXUP_WYSE_AUTO_MUTE] = {
4966 .type = HDA_FIXUP_FUNC,
4967 .v.func = alc_fixup_auto_mute_via_amp,
4968 .chained = true,
4969 .chain_id = ALC225_FIXUP_WYSE_DISABLE_MIC_VREF
4970 },
4971 [ALC225_FIXUP_WYSE_DISABLE_MIC_VREF] = {
4972 .type = HDA_FIXUP_FUNC,
4973 .v.func = alc_fixup_disable_mic_vref,
4974 .chained = true,
4975 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
4976 },
4977 [ALC286_FIXUP_ACER_AIO_HEADSET_MIC] = {
4978 .type = HDA_FIXUP_VERBS,
4979 .v.verbs = (const struct hda_verb[]) {
4980 { 0x20, AC_VERB_SET_COEF_INDEX, 0x4f },
4981 { 0x20, AC_VERB_SET_PROC_COEF, 0x5029 },
4982 { }
4983 },
4984 .chained = true,
4985 .chain_id = ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE
4986 },
4987 [ALC256_FIXUP_ASUS_HEADSET_MIC] = {
4988 .type = HDA_FIXUP_PINS,
4989 .v.pins = (const struct hda_pintbl[]) {
4990 { 0x19, 0x03a11020 }, /* headset mic with jack detect */
4991 { }
4992 },
4993 .chained = true,
4994 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
4995 },
4996 [ALC256_FIXUP_ASUS_MIC_NO_PRESENCE] = {
4997 .type = HDA_FIXUP_PINS,
4998 .v.pins = (const struct hda_pintbl[]) {
4999 { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
5000 { }
5001 },
5002 .chained = true,
5003 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
5004 },
5005 [ALC255_FIXUP_PREDATOR_SUBWOOFER] = {
5006 .type = HDA_FIXUP_PINS,
5007 .v.pins = (const struct hda_pintbl[]) {
5008 { 0x17, 0x90170151 }, /* use as internal speaker (LFE) */
5009 { 0x1b, 0x90170152 } /* use as internal speaker (back) */
5010 }
5011 },
5012 [ALC299_FIXUP_PREDATOR_SPK] = {
5013 .type = HDA_FIXUP_PINS,
5014 .v.pins = (const struct hda_pintbl[]) {
5015 { 0x21, 0x90170150 }, /* use as headset mic, without its own jack detect */
5016 { }
5017 }
5018 },
5019 [ALC287_FIXUP_PREDATOR_SPK_CS35L41_I2C_2] = {
5020 .type = HDA_FIXUP_FUNC,
5021 .v.func = cs35l41_fixup_i2c_two,
5022 .chained = true,
5023 .chain_id = ALC255_FIXUP_PREDATOR_SUBWOOFER
5024 },
5025 [ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE] = {
5026 .type = HDA_FIXUP_PINS,
5027 .v.pins = (const struct hda_pintbl[]) {
5028 { 0x19, 0x04a11040 },
5029 { 0x21, 0x04211020 },
5030 { }
5031 },
5032 .chained = true,
5033 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
5034 },
5035 [ALC289_FIXUP_DELL_SPK1] = {
5036 .type = HDA_FIXUP_PINS,
5037 .v.pins = (const struct hda_pintbl[]) {
5038 { 0x14, 0x90170140 },
5039 { }
5040 },
5041 .chained = true,
5042 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE
5043 },
5044 [ALC289_FIXUP_DELL_SPK2] = {
5045 .type = HDA_FIXUP_PINS,
5046 .v.pins = (const struct hda_pintbl[]) {
5047 { 0x17, 0x90170130 }, /* bass spk */
5048 { }
5049 },
5050 .chained = true,
5051 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE
5052 },
5053 [ALC289_FIXUP_DUAL_SPK] = {
5054 .type = HDA_FIXUP_FUNC,
5055 .v.func = alc285_fixup_speaker2_to_dac1,
5056 .chained = true,
5057 .chain_id = ALC289_FIXUP_DELL_SPK2
5058 },
5059 [ALC289_FIXUP_RTK_AMP_DUAL_SPK] = {
5060 .type = HDA_FIXUP_FUNC,
5061 .v.func = alc285_fixup_speaker2_to_dac1,
5062 .chained = true,
5063 .chain_id = ALC289_FIXUP_DELL_SPK1
5064 },
5065 [ALC294_FIXUP_SPK2_TO_DAC1] = {
5066 .type = HDA_FIXUP_FUNC,
5067 .v.func = alc285_fixup_speaker2_to_dac1,
5068 .chained = true,
5069 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
5070 },
5071 [ALC294_FIXUP_ASUS_DUAL_SPK] = {
5072 .type = HDA_FIXUP_FUNC,
5073 /* The GPIO must be pulled to initialize the AMP */
5074 .v.func = alc_fixup_gpio4,
5075 .chained = true,
5076 .chain_id = ALC294_FIXUP_SPK2_TO_DAC1
5077 },
5078 [ALC294_FIXUP_ASUS_ALLY] = {
5079 .type = HDA_FIXUP_FUNC,
5080 .v.func = cs35l41_fixup_i2c_two,
5081 .chained = true,
5082 .chain_id = ALC294_FIXUP_ASUS_ALLY_PINS
5083 },
5084 [ALC294_FIXUP_ASUS_ALLY_PINS] = {
5085 .type = HDA_FIXUP_PINS,
5086 .v.pins = (const struct hda_pintbl[]) {
5087 { 0x19, 0x03a11050 },
5088 { 0x1a, 0x03a11c30 },
5089 { 0x21, 0x03211420 },
5090 { }
5091 },
5092 .chained = true,
5093 .chain_id = ALC294_FIXUP_ASUS_ALLY_VERBS
5094 },
5095 [ALC294_FIXUP_ASUS_ALLY_VERBS] = {
5096 .type = HDA_FIXUP_VERBS,
5097 .v.verbs = (const struct hda_verb[]) {
5098 { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
5099 { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
5100 { 0x20, AC_VERB_SET_COEF_INDEX, 0x46 },
5101 { 0x20, AC_VERB_SET_PROC_COEF, 0x0004 },
5102 { 0x20, AC_VERB_SET_COEF_INDEX, 0x47 },
5103 { 0x20, AC_VERB_SET_PROC_COEF, 0xa47a },
5104 { 0x20, AC_VERB_SET_COEF_INDEX, 0x49 },
5105 { 0x20, AC_VERB_SET_PROC_COEF, 0x0049},
5106 { 0x20, AC_VERB_SET_COEF_INDEX, 0x4a },
5107 { 0x20, AC_VERB_SET_PROC_COEF, 0x201b },
5108 { 0x20, AC_VERB_SET_COEF_INDEX, 0x6b },
5109 { 0x20, AC_VERB_SET_PROC_COEF, 0x4278},
5110 { }
5111 },
5112 .chained = true,
5113 .chain_id = ALC294_FIXUP_ASUS_ALLY_SPEAKER
5114 },
5115 [ALC294_FIXUP_ASUS_ALLY_SPEAKER] = {
5116 .type = HDA_FIXUP_FUNC,
5117 .v.func = alc285_fixup_speaker2_to_dac1,
5118 },
5119 [ALC285_FIXUP_THINKPAD_X1_GEN7] = {
5120 .type = HDA_FIXUP_FUNC,
5121 .v.func = alc285_fixup_thinkpad_x1_gen7,
5122 .chained = true,
5123 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
5124 },
5125 [ALC285_FIXUP_THINKPAD_HEADSET_JACK] = {
5126 .type = HDA_FIXUP_FUNC,
5127 .v.func = alc_fixup_headset_jack,
5128 .chained = true,
5129 .chain_id = ALC285_FIXUP_THINKPAD_X1_GEN7
5130 },
5131 [ALC294_FIXUP_ASUS_HPE] = {
5132 .type = HDA_FIXUP_VERBS,
5133 .v.verbs = (const struct hda_verb[]) {
5134 /* Set EAPD high */
5135 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
5136 { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
5137 { }
5138 },
5139 .chained = true,
5140 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
5141 },
5142 [ALC294_FIXUP_ASUS_GX502_PINS] = {
5143 .type = HDA_FIXUP_PINS,
5144 .v.pins = (const struct hda_pintbl[]) {
5145 { 0x19, 0x03a11050 }, /* front HP mic */
5146 { 0x1a, 0x01a11830 }, /* rear external mic */
5147 { 0x21, 0x03211020 }, /* front HP out */
5148 { }
5149 },
5150 .chained = true,
5151 .chain_id = ALC294_FIXUP_ASUS_GX502_VERBS
5152 },
5153 [ALC294_FIXUP_ASUS_GX502_VERBS] = {
5154 .type = HDA_FIXUP_VERBS,
5155 .v.verbs = (const struct hda_verb[]) {
5156 /* set 0x15 to HP-OUT ctrl */
5157 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
5158 /* unmute the 0x15 amp */
5159 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
5160 { }
5161 },
5162 .chained = true,
5163 .chain_id = ALC294_FIXUP_ASUS_GX502_HP
5164 },
5165 [ALC294_FIXUP_ASUS_GX502_HP] = {
5166 .type = HDA_FIXUP_FUNC,
5167 .v.func = alc294_fixup_gx502_hp,
5168 },
5169 [ALC295_FIXUP_DELL_TAS2781_I2C] = {
5170 .type = HDA_FIXUP_FUNC,
5171 .v.func = tas2781_fixup_tias_i2c,
5172 .chained = true,
5173 .chain_id = ALC289_FIXUP_DUAL_SPK
5174 },
5175 [ALC294_FIXUP_ASUS_GU502_PINS] = {
5176 .type = HDA_FIXUP_PINS,
5177 .v.pins = (const struct hda_pintbl[]) {
5178 { 0x19, 0x01a11050 }, /* rear HP mic */
5179 { 0x1a, 0x01a11830 }, /* rear external mic */
5180 { 0x21, 0x012110f0 }, /* rear HP out */
5181 { }
5182 },
5183 .chained = true,
5184 .chain_id = ALC294_FIXUP_ASUS_GU502_VERBS
5185 },
5186 [ALC294_FIXUP_ASUS_GU502_VERBS] = {
5187 .type = HDA_FIXUP_VERBS,
5188 .v.verbs = (const struct hda_verb[]) {
5189 /* set 0x15 to HP-OUT ctrl */
5190 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
5191 /* unmute the 0x15 amp */
5192 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
5193 /* set 0x1b to HP-OUT */
5194 { 0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
5195 { }
5196 },
5197 .chained = true,
5198 .chain_id = ALC294_FIXUP_ASUS_GU502_HP
5199 },
5200 [ALC294_FIXUP_ASUS_GU502_HP] = {
5201 .type = HDA_FIXUP_FUNC,
5202 .v.func = alc294_fixup_gu502_hp,
5203 },
5204 [ALC294_FIXUP_ASUS_G513_PINS] = {
5205 .type = HDA_FIXUP_PINS,
5206 .v.pins = (const struct hda_pintbl[]) {
5207 { 0x19, 0x03a11050 }, /* front HP mic */
5208 { 0x1a, 0x03a11c30 }, /* rear external mic */
5209 { 0x21, 0x03211420 }, /* front HP out */
5210 { }
5211 },
5212 },
5213 [ALC285_FIXUP_ASUS_G533Z_PINS] = {
5214 .type = HDA_FIXUP_PINS,
5215 .v.pins = (const struct hda_pintbl[]) {
5216 { 0x14, 0x90170152 }, /* Speaker Surround Playback Switch */
5217 { 0x19, 0x03a19020 }, /* Mic Boost Volume */
5218 { 0x1a, 0x03a11c30 }, /* Mic Boost Volume */
5219 { 0x1e, 0x90170151 }, /* Rear jack, IN OUT EAPD Detect */
5220 { 0x21, 0x03211420 },
5221 { }
5222 },
5223 },
5224 [ALC294_FIXUP_ASUS_COEF_1B] = {
5225 .type = HDA_FIXUP_VERBS,
5226 .v.verbs = (const struct hda_verb[]) {
5227 /* Set bit 10 to correct noisy output after reboot from
5228 * Windows 10 (due to pop noise reduction?)
5229 */
5230 { 0x20, AC_VERB_SET_COEF_INDEX, 0x1b },
5231 { 0x20, AC_VERB_SET_PROC_COEF, 0x4e4b },
5232 { }
5233 },
5234 .chained = true,
5235 .chain_id = ALC289_FIXUP_ASUS_GA401,
5236 },
5237 [ALC285_FIXUP_HP_GPIO_LED] = {
5238 .type = HDA_FIXUP_FUNC,
5239 .v.func = alc285_fixup_hp_gpio_led,
5240 },
5241 [ALC285_FIXUP_HP_MUTE_LED] = {
5242 .type = HDA_FIXUP_FUNC,
5243 .v.func = alc285_fixup_hp_mute_led,
5244 },
5245 [ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED] = {
5246 .type = HDA_FIXUP_FUNC,
5247 .v.func = alc285_fixup_hp_spectre_x360_mute_led,
5248 },
5249 [ALC285_FIXUP_HP_BEEP_MICMUTE_LED] = {
5250 .type = HDA_FIXUP_FUNC,
5251 .v.func = alc285_fixup_hp_beep,
5252 .chained = true,
5253 .chain_id = ALC285_FIXUP_HP_MUTE_LED,
5254 },
5255 [ALC236_FIXUP_HP_MUTE_LED_COEFBIT2] = {
5256 .type = HDA_FIXUP_FUNC,
5257 .v.func = alc236_fixup_hp_mute_led_coefbit2,
5258 },
5259 [ALC236_FIXUP_HP_GPIO_LED] = {
5260 .type = HDA_FIXUP_FUNC,
5261 .v.func = alc236_fixup_hp_gpio_led,
5262 },
5263 [ALC236_FIXUP_HP_MUTE_LED] = {
5264 .type = HDA_FIXUP_FUNC,
5265 .v.func = alc236_fixup_hp_mute_led,
5266 },
5267 [ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF] = {
5268 .type = HDA_FIXUP_FUNC,
5269 .v.func = alc236_fixup_hp_mute_led_micmute_vref,
5270 },
5271 [ALC236_FIXUP_LENOVO_INV_DMIC] = {
5272 .type = HDA_FIXUP_FUNC,
5273 .v.func = alc_fixup_inv_dmic,
5274 .chained = true,
5275 .chain_id = ALC283_FIXUP_INT_MIC,
5276 },
5277 [ALC295_FIXUP_HP_MUTE_LED_COEFBIT11] = {
5278 .type = HDA_FIXUP_FUNC,
5279 .v.func = alc295_fixup_hp_mute_led_coefbit11,
5280 },
5281 [ALC298_FIXUP_SAMSUNG_AMP] = {
5282 .type = HDA_FIXUP_FUNC,
5283 .v.func = alc298_fixup_samsung_amp,
5284 .chained = true,
5285 .chain_id = ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET
5286 },
5287 [ALC298_FIXUP_SAMSUNG_AMP_V2_2_AMPS] = {
5288 .type = HDA_FIXUP_FUNC,
5289 .v.func = alc298_fixup_samsung_amp_v2_2_amps
5290 },
5291 [ALC298_FIXUP_SAMSUNG_AMP_V2_4_AMPS] = {
5292 .type = HDA_FIXUP_FUNC,
5293 .v.func = alc298_fixup_samsung_amp_v2_4_amps
5294 },
5295 [ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
5296 .type = HDA_FIXUP_VERBS,
5297 .v.verbs = (const struct hda_verb[]) {
5298 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc5 },
5299 { }
5300 },
5301 },
5302 [ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
5303 .type = HDA_FIXUP_VERBS,
5304 .v.verbs = (const struct hda_verb[]) {
5305 { 0x20, AC_VERB_SET_COEF_INDEX, 0x08},
5306 { 0x20, AC_VERB_SET_PROC_COEF, 0x2fcf},
5307 { }
5308 },
5309 },
5310 [ALC295_FIXUP_ASUS_MIC_NO_PRESENCE] = {
5311 .type = HDA_FIXUP_PINS,
5312 .v.pins = (const struct hda_pintbl[]) {
5313 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5314 { }
5315 },
5316 .chained = true,
5317 .chain_id = ALC269_FIXUP_HEADSET_MODE
5318 },
5319 [ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS] = {
5320 .type = HDA_FIXUP_PINS,
5321 .v.pins = (const struct hda_pintbl[]) {
5322 { 0x14, 0x90100120 }, /* use as internal speaker */
5323 { 0x18, 0x02a111f0 }, /* use as headset mic, without its own jack detect */
5324 { 0x1a, 0x01011020 }, /* use as line out */
5325 { },
5326 },
5327 .chained = true,
5328 .chain_id = ALC269_FIXUP_HEADSET_MIC
5329 },
5330 [ALC269VC_FIXUP_ACER_HEADSET_MIC] = {
5331 .type = HDA_FIXUP_PINS,
5332 .v.pins = (const struct hda_pintbl[]) {
5333 { 0x18, 0x02a11030 }, /* use as headset mic */
5334 { }
5335 },
5336 .chained = true,
5337 .chain_id = ALC269_FIXUP_HEADSET_MIC
5338 },
5339 [ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE] = {
5340 .type = HDA_FIXUP_PINS,
5341 .v.pins = (const struct hda_pintbl[]) {
5342 { 0x18, 0x01a11130 }, /* use as headset mic, without its own jack detect */
5343 { }
5344 },
5345 .chained = true,
5346 .chain_id = ALC269_FIXUP_HEADSET_MIC
5347 },
5348 [ALC289_FIXUP_ASUS_GA401] = {
5349 .type = HDA_FIXUP_FUNC,
5350 .v.func = alc289_fixup_asus_ga401,
5351 .chained = true,
5352 .chain_id = ALC289_FIXUP_ASUS_GA502,
5353 },
5354 [ALC289_FIXUP_ASUS_GA502] = {
5355 .type = HDA_FIXUP_PINS,
5356 .v.pins = (const struct hda_pintbl[]) {
5357 { 0x19, 0x03a11020 }, /* headset mic with jack detect */
5358 { }
5359 },
5360 },
5361 [ALC256_FIXUP_ACER_MIC_NO_PRESENCE] = {
5362 .type = HDA_FIXUP_PINS,
5363 .v.pins = (const struct hda_pintbl[]) {
5364 { 0x19, 0x02a11120 }, /* use as headset mic, without its own jack detect */
5365 { }
5366 },
5367 .chained = true,
5368 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
5369 },
5370 [ALC285_FIXUP_HP_GPIO_AMP_INIT] = {
5371 .type = HDA_FIXUP_FUNC,
5372 .v.func = alc285_fixup_hp_gpio_amp_init,
5373 .chained = true,
5374 .chain_id = ALC285_FIXUP_HP_GPIO_LED
5375 },
5376 [ALC269_FIXUP_CZC_B20] = {
5377 .type = HDA_FIXUP_PINS,
5378 .v.pins = (const struct hda_pintbl[]) {
5379 { 0x12, 0x411111f0 },
5380 { 0x14, 0x90170110 }, /* speaker */
5381 { 0x15, 0x032f1020 }, /* HP out */
5382 { 0x17, 0x411111f0 },
5383 { 0x18, 0x03ab1040 }, /* mic */
5384 { 0x19, 0xb7a7013f },
5385 { 0x1a, 0x0181305f },
5386 { 0x1b, 0x411111f0 },
5387 { 0x1d, 0x411111f0 },
5388 { 0x1e, 0x411111f0 },
5389 { }
5390 },
5391 .chain_id = ALC269_FIXUP_DMIC,
5392 },
5393 [ALC269_FIXUP_CZC_TMI] = {
5394 .type = HDA_FIXUP_PINS,
5395 .v.pins = (const struct hda_pintbl[]) {
5396 { 0x12, 0x4000c000 },
5397 { 0x14, 0x90170110 }, /* speaker */
5398 { 0x15, 0x0421401f }, /* HP out */
5399 { 0x17, 0x411111f0 },
5400 { 0x18, 0x04a19020 }, /* mic */
5401 { 0x19, 0x411111f0 },
5402 { 0x1a, 0x411111f0 },
5403 { 0x1b, 0x411111f0 },
5404 { 0x1d, 0x40448505 },
5405 { 0x1e, 0x411111f0 },
5406 { 0x20, 0x8000ffff },
5407 { }
5408 },
5409 .chain_id = ALC269_FIXUP_DMIC,
5410 },
5411 [ALC269_FIXUP_CZC_L101] = {
5412 .type = HDA_FIXUP_PINS,
5413 .v.pins = (const struct hda_pintbl[]) {
5414 { 0x12, 0x40000000 },
5415 { 0x14, 0x01014010 }, /* speaker */
5416 { 0x15, 0x411111f0 }, /* HP out */
5417 { 0x16, 0x411111f0 },
5418 { 0x18, 0x01a19020 }, /* mic */
5419 { 0x19, 0x02a19021 },
5420 { 0x1a, 0x0181302f },
5421 { 0x1b, 0x0221401f },
5422 { 0x1c, 0x411111f0 },
5423 { 0x1d, 0x4044c601 },
5424 { 0x1e, 0x411111f0 },
5425 { }
5426 },
5427 .chain_id = ALC269_FIXUP_DMIC,
5428 },
5429 [ALC269_FIXUP_LEMOTE_A1802] = {
5430 .type = HDA_FIXUP_PINS,
5431 .v.pins = (const struct hda_pintbl[]) {
5432 { 0x12, 0x40000000 },
5433 { 0x14, 0x90170110 }, /* speaker */
5434 { 0x17, 0x411111f0 },
5435 { 0x18, 0x03a19040 }, /* mic1 */
5436 { 0x19, 0x90a70130 }, /* mic2 */
5437 { 0x1a, 0x411111f0 },
5438 { 0x1b, 0x411111f0 },
5439 { 0x1d, 0x40489d2d },
5440 { 0x1e, 0x411111f0 },
5441 { 0x20, 0x0003ffff },
5442 { 0x21, 0x03214020 },
5443 { }
5444 },
5445 .chain_id = ALC269_FIXUP_DMIC,
5446 },
5447 [ALC269_FIXUP_LEMOTE_A190X] = {
5448 .type = HDA_FIXUP_PINS,
5449 .v.pins = (const struct hda_pintbl[]) {
5450 { 0x14, 0x99130110 }, /* speaker */
5451 { 0x15, 0x0121401f }, /* HP out */
5452 { 0x18, 0x01a19c20 }, /* rear mic */
5453 { 0x19, 0x99a3092f }, /* front mic */
5454 { 0x1b, 0x0201401f }, /* front lineout */
5455 { }
5456 },
5457 .chain_id = ALC269_FIXUP_DMIC,
5458 },
5459 [ALC256_FIXUP_INTEL_NUC8_RUGGED] = {
5460 .type = HDA_FIXUP_PINS,
5461 .v.pins = (const struct hda_pintbl[]) {
5462 { 0x1b, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5463 { }
5464 },
5465 .chained = true,
5466 .chain_id = ALC269_FIXUP_HEADSET_MODE
5467 },
5468 [ALC256_FIXUP_INTEL_NUC10] = {
5469 .type = HDA_FIXUP_PINS,
5470 .v.pins = (const struct hda_pintbl[]) {
5471 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5472 { }
5473 },
5474 .chained = true,
5475 .chain_id = ALC269_FIXUP_HEADSET_MODE
5476 },
5477 [ALC255_FIXUP_XIAOMI_HEADSET_MIC] = {
5478 .type = HDA_FIXUP_VERBS,
5479 .v.verbs = (const struct hda_verb[]) {
5480 { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
5481 { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
5482 { }
5483 },
5484 .chained = true,
5485 .chain_id = ALC289_FIXUP_ASUS_GA502
5486 },
5487 [ALC274_FIXUP_HP_MIC] = {
5488 .type = HDA_FIXUP_VERBS,
5489 .v.verbs = (const struct hda_verb[]) {
5490 { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
5491 { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
5492 { }
5493 },
5494 },
5495 [ALC274_FIXUP_HP_HEADSET_MIC] = {
5496 .type = HDA_FIXUP_FUNC,
5497 .v.func = alc274_fixup_hp_headset_mic,
5498 .chained = true,
5499 .chain_id = ALC274_FIXUP_HP_MIC
5500 },
5501 [ALC274_FIXUP_HP_ENVY_GPIO] = {
5502 .type = HDA_FIXUP_FUNC,
5503 .v.func = alc274_fixup_hp_envy_gpio,
5504 },
5505 [ALC274_FIXUP_ASUS_ZEN_AIO_27] = {
5506 .type = HDA_FIXUP_VERBS,
5507 .v.verbs = (const struct hda_verb[]) {
5508 { 0x20, AC_VERB_SET_COEF_INDEX, 0x10 },
5509 { 0x20, AC_VERB_SET_PROC_COEF, 0xc420 },
5510 { 0x20, AC_VERB_SET_COEF_INDEX, 0x40 },
5511 { 0x20, AC_VERB_SET_PROC_COEF, 0x8800 },
5512 { 0x20, AC_VERB_SET_COEF_INDEX, 0x49 },
5513 { 0x20, AC_VERB_SET_PROC_COEF, 0x0249 },
5514 { 0x20, AC_VERB_SET_COEF_INDEX, 0x4a },
5515 { 0x20, AC_VERB_SET_PROC_COEF, 0x202b },
5516 { 0x20, AC_VERB_SET_COEF_INDEX, 0x62 },
5517 { 0x20, AC_VERB_SET_PROC_COEF, 0xa007 },
5518 { 0x20, AC_VERB_SET_COEF_INDEX, 0x6b },
5519 { 0x20, AC_VERB_SET_PROC_COEF, 0x5060 },
5520 {}
5521 },
5522 .chained = true,
5523 .chain_id = ALC2XX_FIXUP_HEADSET_MIC,
5524 },
5525 [ALC256_FIXUP_ASUS_HPE] = {
5526 .type = HDA_FIXUP_VERBS,
5527 .v.verbs = (const struct hda_verb[]) {
5528 /* Set EAPD high */
5529 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
5530 { 0x20, AC_VERB_SET_PROC_COEF, 0x7778 },
5531 { }
5532 },
5533 .chained = true,
5534 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
5535 },
5536 [ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK] = {
5537 .type = HDA_FIXUP_FUNC,
5538 .v.func = alc_fixup_headset_jack,
5539 .chained = true,
5540 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
5541 },
5542 [ALC287_FIXUP_HP_GPIO_LED] = {
5543 .type = HDA_FIXUP_FUNC,
5544 .v.func = alc287_fixup_hp_gpio_led,
5545 },
5546 [ALC256_FIXUP_HP_HEADSET_MIC] = {
5547 .type = HDA_FIXUP_FUNC,
5548 .v.func = alc274_fixup_hp_headset_mic,
5549 },
5550 [ALC236_FIXUP_DELL_AIO_HEADSET_MIC] = {
5551 .type = HDA_FIXUP_FUNC,
5552 .v.func = alc_fixup_no_int_mic,
5553 .chained = true,
5554 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
5555 },
5556 [ALC282_FIXUP_ACER_DISABLE_LINEOUT] = {
5557 .type = HDA_FIXUP_PINS,
5558 .v.pins = (const struct hda_pintbl[]) {
5559 { 0x1b, 0x411111f0 },
5560 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5561 { },
5562 },
5563 .chained = true,
5564 .chain_id = ALC269_FIXUP_HEADSET_MODE
5565 },
5566 [ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST] = {
5567 .type = HDA_FIXUP_FUNC,
5568 .v.func = alc269_fixup_limit_int_mic_boost,
5569 .chained = true,
5570 .chain_id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
5571 },
5572 [ALC256_FIXUP_ACER_HEADSET_MIC] = {
5573 .type = HDA_FIXUP_PINS,
5574 .v.pins = (const struct hda_pintbl[]) {
5575 { 0x19, 0x02a1113c }, /* use as headset mic, without its own jack detect */
5576 { 0x1a, 0x90a1092f }, /* use as internal mic */
5577 { }
5578 },
5579 .chained = true,
5580 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
5581 },
5582 [ALC285_FIXUP_IDEAPAD_S740_COEF] = {
5583 .type = HDA_FIXUP_FUNC,
5584 .v.func = alc285_fixup_ideapad_s740_coef,
5585 .chained = true,
5586 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
5587 },
5588 [ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST] = {
5589 .type = HDA_FIXUP_FUNC,
5590 .v.func = alc269_fixup_limit_int_mic_boost,
5591 .chained = true,
5592 .chain_id = ALC285_FIXUP_HP_MUTE_LED,
5593 },
5594 [ALC295_FIXUP_ASUS_DACS] = {
5595 .type = HDA_FIXUP_FUNC,
5596 .v.func = alc295_fixup_asus_dacs,
5597 },
5598 [ALC295_FIXUP_HP_OMEN] = {
5599 .type = HDA_FIXUP_PINS,
5600 .v.pins = (const struct hda_pintbl[]) {
5601 { 0x12, 0xb7a60130 },
5602 { 0x13, 0x40000000 },
5603 { 0x14, 0x411111f0 },
5604 { 0x16, 0x411111f0 },
5605 { 0x17, 0x90170110 },
5606 { 0x18, 0x411111f0 },
5607 { 0x19, 0x02a11030 },
5608 { 0x1a, 0x411111f0 },
5609 { 0x1b, 0x04a19030 },
5610 { 0x1d, 0x40600001 },
5611 { 0x1e, 0x411111f0 },
5612 { 0x21, 0x03211020 },
5613 {}
5614 },
5615 .chained = true,
5616 .chain_id = ALC269_FIXUP_HP_LINE1_MIC1_LED,
5617 },
5618 [ALC285_FIXUP_HP_SPECTRE_X360] = {
5619 .type = HDA_FIXUP_FUNC,
5620 .v.func = alc285_fixup_hp_spectre_x360,
5621 },
5622 [ALC285_FIXUP_HP_SPECTRE_X360_EB1] = {
5623 .type = HDA_FIXUP_FUNC,
5624 .v.func = alc285_fixup_hp_spectre_x360_eb1
5625 },
5626 [ALC285_FIXUP_HP_SPECTRE_X360_DF1] = {
5627 .type = HDA_FIXUP_FUNC,
5628 .v.func = alc285_fixup_hp_spectre_x360_df1
5629 },
5630 [ALC285_FIXUP_HP_ENVY_X360] = {
5631 .type = HDA_FIXUP_FUNC,
5632 .v.func = alc285_fixup_hp_envy_x360,
5633 .chained = true,
5634 .chain_id = ALC285_FIXUP_HP_GPIO_AMP_INIT,
5635 },
5636 [ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP] = {
5637 .type = HDA_FIXUP_FUNC,
5638 .v.func = alc285_fixup_ideapad_s740_coef,
5639 .chained = true,
5640 .chain_id = ALC285_FIXUP_THINKPAD_HEADSET_JACK,
5641 },
5642 [ALC623_FIXUP_LENOVO_THINKSTATION_P340] = {
5643 .type = HDA_FIXUP_FUNC,
5644 .v.func = alc_fixup_no_shutup,
5645 .chained = true,
5646 .chain_id = ALC283_FIXUP_HEADSET_MIC,
5647 },
5648 [ALC255_FIXUP_ACER_HEADPHONE_AND_MIC] = {
5649 .type = HDA_FIXUP_PINS,
5650 .v.pins = (const struct hda_pintbl[]) {
5651 { 0x21, 0x03211030 }, /* Change the Headphone location to Left */
5652 { }
5653 },
5654 .chained = true,
5655 .chain_id = ALC255_FIXUP_XIAOMI_HEADSET_MIC
5656 },
5657 [ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST] = {
5658 .type = HDA_FIXUP_FUNC,
5659 .v.func = alc269_fixup_limit_int_mic_boost,
5660 .chained = true,
5661 .chain_id = ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,
5662 },
5663 [ALC285_FIXUP_LEGION_Y9000X_SPEAKERS] = {
5664 .type = HDA_FIXUP_FUNC,
5665 .v.func = alc285_fixup_ideapad_s740_coef,
5666 .chained = true,
5667 .chain_id = ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,
5668 },
5669 [ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE] = {
5670 .type = HDA_FIXUP_FUNC,
5671 .v.func = alc287_fixup_legion_15imhg05_speakers,
5672 .chained = true,
5673 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
5674 },
5675 [ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS] = {
5676 .type = HDA_FIXUP_VERBS,
5677 //.v.verbs = legion_15imhg05_coefs,
5678 .v.verbs = (const struct hda_verb[]) {
5679 // set left speaker Legion 7i.
5680 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
5681 { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
5682
5683 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
5684 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
5685 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
5686 { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
5687 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
5688
5689 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
5690 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
5691 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
5692 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
5693 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
5694
5695 // set right speaker Legion 7i.
5696 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
5697 { 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
5698
5699 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
5700 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
5701 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
5702 { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
5703 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
5704
5705 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
5706 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
5707 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
5708 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
5709 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
5710 {}
5711 },
5712 .chained = true,
5713 .chain_id = ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,
5714 },
5715 [ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE] = {
5716 .type = HDA_FIXUP_FUNC,
5717 .v.func = alc287_fixup_legion_15imhg05_speakers,
5718 .chained = true,
5719 .chain_id = ALC269_FIXUP_HEADSET_MODE,
5720 },
5721 [ALC287_FIXUP_YOGA7_14ITL_SPEAKERS] = {
5722 .type = HDA_FIXUP_VERBS,
5723 .v.verbs = (const struct hda_verb[]) {
5724 // set left speaker Yoga 7i.
5725 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
5726 { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
5727
5728 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
5729 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
5730 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
5731 { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
5732 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
5733
5734 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
5735 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
5736 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
5737 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
5738 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
5739
5740 // set right speaker Yoga 7i.
5741 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
5742 { 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
5743
5744 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
5745 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
5746 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
5747 { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
5748 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
5749
5750 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
5751 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
5752 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
5753 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
5754 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
5755 {}
5756 },
5757 .chained = true,
5758 .chain_id = ALC269_FIXUP_HEADSET_MODE,
5759 },
5760 [ALC298_FIXUP_LENOVO_C940_DUET7] = {
5761 .type = HDA_FIXUP_FUNC,
5762 .v.func = alc298_fixup_lenovo_c940_duet7,
5763 },
5764 [ALC287_FIXUP_13S_GEN2_SPEAKERS] = {
5765 .type = HDA_FIXUP_VERBS,
5766 .v.verbs = (const struct hda_verb[]) {
5767 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
5768 { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
5769 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
5770 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
5771 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
5772 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
5773 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
5774 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
5775 { 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
5776 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
5777 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
5778 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
5779 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
5780 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
5781 {}
5782 },
5783 .chained = true,
5784 .chain_id = ALC269_FIXUP_HEADSET_MODE,
5785 },
5786 [ALC256_FIXUP_SET_COEF_DEFAULTS] = {
5787 .type = HDA_FIXUP_FUNC,
5788 .v.func = alc256_fixup_set_coef_defaults,
5789 },
5790 [ALC245_FIXUP_HP_GPIO_LED] = {
5791 .type = HDA_FIXUP_FUNC,
5792 .v.func = alc245_fixup_hp_gpio_led,
5793 },
5794 [ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
5795 .type = HDA_FIXUP_PINS,
5796 .v.pins = (const struct hda_pintbl[]) {
5797 { 0x19, 0x03a11120 }, /* use as headset mic, without its own jack detect */
5798 { }
5799 },
5800 .chained = true,
5801 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
5802 },
5803 [ALC233_FIXUP_NO_AUDIO_JACK] = {
5804 .type = HDA_FIXUP_FUNC,
5805 .v.func = alc233_fixup_no_audio_jack,
5806 },
5807 [ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME] = {
5808 .type = HDA_FIXUP_FUNC,
5809 .v.func = alc256_fixup_mic_no_presence_and_resume,
5810 .chained = true,
5811 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
5812 },
5813 [ALC287_FIXUP_LEGION_16ACHG6] = {
5814 .type = HDA_FIXUP_FUNC,
5815 .v.func = alc287_fixup_legion_16achg6_speakers,
5816 },
5817 [ALC287_FIXUP_CS35L41_I2C_2] = {
5818 .type = HDA_FIXUP_FUNC,
5819 .v.func = cs35l41_fixup_i2c_two,
5820 },
5821 [ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED] = {
5822 .type = HDA_FIXUP_FUNC,
5823 .v.func = cs35l41_fixup_i2c_two,
5824 .chained = true,
5825 .chain_id = ALC285_FIXUP_HP_MUTE_LED,
5826 },
5827 [ALC287_FIXUP_CS35L41_I2C_4] = {
5828 .type = HDA_FIXUP_FUNC,
5829 .v.func = cs35l41_fixup_i2c_four,
5830 },
5831 [ALC245_FIXUP_CS35L41_SPI_2] = {
5832 .type = HDA_FIXUP_FUNC,
5833 .v.func = cs35l41_fixup_spi_two,
5834 },
5835 [ALC245_FIXUP_CS35L41_SPI_1] = {
5836 .type = HDA_FIXUP_FUNC,
5837 .v.func = cs35l41_fixup_spi_one,
5838 },
5839 [ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED] = {
5840 .type = HDA_FIXUP_FUNC,
5841 .v.func = cs35l41_fixup_spi_two,
5842 .chained = true,
5843 .chain_id = ALC285_FIXUP_HP_GPIO_LED,
5844 },
5845 [ALC245_FIXUP_CS35L41_SPI_4] = {
5846 .type = HDA_FIXUP_FUNC,
5847 .v.func = cs35l41_fixup_spi_four,
5848 },
5849 [ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED] = {
5850 .type = HDA_FIXUP_FUNC,
5851 .v.func = cs35l41_fixup_spi_four,
5852 .chained = true,
5853 .chain_id = ALC285_FIXUP_HP_GPIO_LED,
5854 },
5855 [ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED] = {
5856 .type = HDA_FIXUP_VERBS,
5857 .v.verbs = (const struct hda_verb[]) {
5858 { 0x20, AC_VERB_SET_COEF_INDEX, 0x19 },
5859 { 0x20, AC_VERB_SET_PROC_COEF, 0x8e11 },
5860 { }
5861 },
5862 .chained = true,
5863 .chain_id = ALC285_FIXUP_HP_MUTE_LED,
5864 },
5865 [ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET] = {
5866 .type = HDA_FIXUP_FUNC,
5867 .v.func = alc_fixup_dell4_mic_no_presence_quiet,
5868 .chained = true,
5869 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
5870 },
5871 [ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE] = {
5872 .type = HDA_FIXUP_PINS,
5873 .v.pins = (const struct hda_pintbl[]) {
5874 { 0x19, 0x02a1112c }, /* use as headset mic, without its own jack detect */
5875 { }
5876 },
5877 .chained = true,
5878 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
5879 },
5880 [ALC287_FIXUP_LEGION_16ITHG6] = {
5881 .type = HDA_FIXUP_FUNC,
5882 .v.func = alc287_fixup_legion_16ithg6_speakers,
5883 },
5884 [ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK] = {
5885 .type = HDA_FIXUP_VERBS,
5886 .v.verbs = (const struct hda_verb[]) {
5887 // enable left speaker
5888 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
5889 { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
5890
5891 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
5892 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
5893 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
5894 { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
5895 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
5896
5897 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
5898 { 0x20, AC_VERB_SET_PROC_COEF, 0xf },
5899 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
5900 { 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
5901 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
5902
5903 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
5904 { 0x20, AC_VERB_SET_PROC_COEF, 0x10 },
5905 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
5906 { 0x20, AC_VERB_SET_PROC_COEF, 0x40 },
5907 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
5908
5909 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
5910 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
5911 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
5912 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
5913 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
5914
5915 // enable right speaker
5916 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
5917 { 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
5918
5919 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
5920 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
5921 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
5922 { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
5923 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
5924
5925 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
5926 { 0x20, AC_VERB_SET_PROC_COEF, 0xf },
5927 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
5928 { 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
5929 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
5930
5931 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
5932 { 0x20, AC_VERB_SET_PROC_COEF, 0x10 },
5933 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
5934 { 0x20, AC_VERB_SET_PROC_COEF, 0x44 },
5935 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
5936
5937 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
5938 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
5939 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
5940 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
5941 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
5942
5943 { },
5944 },
5945 },
5946 [ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN] = {
5947 .type = HDA_FIXUP_FUNC,
5948 .v.func = alc287_fixup_yoga9_14iap7_bass_spk_pin,
5949 .chained = true,
5950 .chain_id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK,
5951 },
5952 [ALC287_FIXUP_YOGA9_14IMH9_BASS_SPK_PIN] = {
5953 .type = HDA_FIXUP_FUNC,
5954 .v.func = alc287_fixup_yoga9_14iap7_bass_spk_pin,
5955 .chained = true,
5956 .chain_id = ALC287_FIXUP_CS35L41_I2C_2,
5957 },
5958 [ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS] = {
5959 .type = HDA_FIXUP_FUNC,
5960 .v.func = alc295_fixup_dell_inspiron_top_speakers,
5961 .chained = true,
5962 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
5963 },
5964 [ALC236_FIXUP_DELL_DUAL_CODECS] = {
5965 .type = HDA_FIXUP_PINS,
5966 .v.func = alc1220_fixup_gb_dual_codecs,
5967 .chained = true,
5968 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
5969 },
5970 [ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI] = {
5971 .type = HDA_FIXUP_FUNC,
5972 .v.func = cs35l41_fixup_i2c_two,
5973 .chained = true,
5974 .chain_id = ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
5975 },
5976 [ALC287_FIXUP_TAS2781_I2C] = {
5977 .type = HDA_FIXUP_FUNC,
5978 .v.func = tas2781_fixup_tias_i2c,
5979 .chained = true,
5980 .chain_id = ALC285_FIXUP_THINKPAD_HEADSET_JACK,
5981 },
5982 [ALC245_FIXUP_TAS2781_SPI_2] = {
5983 .type = HDA_FIXUP_FUNC,
5984 .v.func = tas2781_fixup_spi,
5985 .chained = true,
5986 .chain_id = ALC285_FIXUP_HP_GPIO_LED,
5987 },
5988 [ALC287_FIXUP_TXNW2781_I2C] = {
5989 .type = HDA_FIXUP_FUNC,
5990 .v.func = tas2781_fixup_txnw_i2c,
5991 .chained = true,
5992 .chain_id = ALC285_FIXUP_THINKPAD_HEADSET_JACK,
5993 },
5994 [ALC287_FIXUP_YOGA7_14ARB7_I2C] = {
5995 .type = HDA_FIXUP_FUNC,
5996 .v.func = yoga7_14arb7_fixup_i2c,
5997 .chained = true,
5998 .chain_id = ALC285_FIXUP_THINKPAD_HEADSET_JACK,
5999 },
6000 [ALC245_FIXUP_HP_MUTE_LED_COEFBIT] = {
6001 .type = HDA_FIXUP_FUNC,
6002 .v.func = alc245_fixup_hp_mute_led_coefbit,
6003 },
6004 [ALC245_FIXUP_HP_MUTE_LED_V1_COEFBIT] = {
6005 .type = HDA_FIXUP_FUNC,
6006 .v.func = alc245_fixup_hp_mute_led_v1_coefbit,
6007 },
6008 [ALC245_FIXUP_HP_X360_MUTE_LEDS] = {
6009 .type = HDA_FIXUP_FUNC,
6010 .v.func = alc245_fixup_hp_mute_led_coefbit,
6011 .chained = true,
6012 .chain_id = ALC245_FIXUP_HP_GPIO_LED
6013 },
6014 [ALC287_FIXUP_THINKPAD_I2S_SPK] = {
6015 .type = HDA_FIXUP_FUNC,
6016 .v.func = alc287_fixup_bind_dacs,
6017 .chained = true,
6018 .chain_id = ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
6019 },
6020 [ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD] = {
6021 .type = HDA_FIXUP_FUNC,
6022 .v.func = alc287_fixup_bind_dacs,
6023 .chained = true,
6024 .chain_id = ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI,
6025 },
6026 [ALC2XX_FIXUP_HEADSET_MIC] = {
6027 .type = HDA_FIXUP_FUNC,
6028 .v.func = alc2xx_fixup_headset_mic,
6029 },
6030 [ALC289_FIXUP_DELL_CS35L41_SPI_2] = {
6031 .type = HDA_FIXUP_FUNC,
6032 .v.func = cs35l41_fixup_spi_two,
6033 .chained = true,
6034 .chain_id = ALC289_FIXUP_DUAL_SPK
6035 },
6036 [ALC294_FIXUP_CS35L41_I2C_2] = {
6037 .type = HDA_FIXUP_FUNC,
6038 .v.func = cs35l41_fixup_i2c_two,
6039 },
6040 [ALC256_FIXUP_ACER_SFG16_MICMUTE_LED] = {
6041 .type = HDA_FIXUP_FUNC,
6042 .v.func = alc256_fixup_acer_sfg16_micmute_led,
6043 },
6044 [ALC256_FIXUP_HEADPHONE_AMP_VOL] = {
6045 .type = HDA_FIXUP_FUNC,
6046 .v.func = alc256_decrease_headphone_amp_val,
6047 },
6048 [ALC245_FIXUP_HP_SPECTRE_X360_EU0XXX] = {
6049 .type = HDA_FIXUP_FUNC,
6050 .v.func = alc245_fixup_hp_spectre_x360_eu0xxx,
6051 },
6052 [ALC245_FIXUP_HP_SPECTRE_X360_16_AA0XXX] = {
6053 .type = HDA_FIXUP_FUNC,
6054 .v.func = alc245_fixup_hp_spectre_x360_16_aa0xxx,
6055 },
6056 [ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A] = {
6057 .type = HDA_FIXUP_FUNC,
6058 .v.func = alc245_fixup_hp_zbook_firefly_g12a,
6059 },
6060 [ALC285_FIXUP_ASUS_GA403U] = {
6061 .type = HDA_FIXUP_FUNC,
6062 .v.func = alc285_fixup_asus_ga403u,
6063 },
6064 [ALC285_FIXUP_ASUS_GA403U_HEADSET_MIC] = {
6065 .type = HDA_FIXUP_PINS,
6066 .v.pins = (const struct hda_pintbl[]) {
6067 { 0x19, 0x03a11050 },
6068 { 0x1b, 0x03a11c30 },
6069 { }
6070 },
6071 .chained = true,
6072 .chain_id = ALC285_FIXUP_ASUS_GA403U_I2C_SPEAKER2_TO_DAC1
6073 },
6074 [ALC285_FIXUP_ASUS_GU605_SPI_SPEAKER2_TO_DAC1] = {
6075 .type = HDA_FIXUP_FUNC,
6076 .v.func = alc285_fixup_speaker2_to_dac1,
6077 .chained = true,
6078 .chain_id = ALC285_FIXUP_ASUS_GU605_SPI_2_HEADSET_MIC,
6079 },
6080 [ALC285_FIXUP_ASUS_GU605_SPI_2_HEADSET_MIC] = {
6081 .type = HDA_FIXUP_PINS,
6082 .v.pins = (const struct hda_pintbl[]) {
6083 { 0x19, 0x03a11050 },
6084 { 0x1b, 0x03a11c30 },
6085 { }
6086 },
6087 },
6088 [ALC285_FIXUP_ASUS_GA403U_I2C_SPEAKER2_TO_DAC1] = {
6089 .type = HDA_FIXUP_FUNC,
6090 .v.func = alc285_fixup_speaker2_to_dac1,
6091 .chained = true,
6092 .chain_id = ALC285_FIXUP_ASUS_GA403U,
6093 },
6094 [ALC287_FIXUP_LENOVO_THKPAD_WH_ALC1318] = {
6095 .type = HDA_FIXUP_FUNC,
6096 .v.func = alc287_fixup_lenovo_thinkpad_with_alc1318,
6097 .chained = true,
6098 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
6099 },
6100 [ALC256_FIXUP_CHROME_BOOK] = {
6101 .type = HDA_FIXUP_FUNC,
6102 .v.func = alc256_fixup_chromebook,
6103 .chained = true,
6104 .chain_id = ALC225_FIXUP_HEADSET_JACK
6105 },
6106 [ALC245_FIXUP_CLEVO_NOISY_MIC] = {
6107 .type = HDA_FIXUP_FUNC,
6108 .v.func = alc269_fixup_limit_int_mic_boost,
6109 .chained = true,
6110 .chain_id = ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
6111 },
6112 [ALC269_FIXUP_VAIO_VJFH52_MIC_NO_PRESENCE] = {
6113 .type = HDA_FIXUP_PINS,
6114 .v.pins = (const struct hda_pintbl[]) {
6115 { 0x19, 0x03a1113c }, /* use as headset mic, without its own jack detect */
6116 { 0x1b, 0x20a11040 }, /* dock mic */
6117 { }
6118 },
6119 .chained = true,
6120 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
6121 },
6122 [ALC233_FIXUP_MEDION_MTL_SPK] = {
6123 .type = HDA_FIXUP_PINS,
6124 .v.pins = (const struct hda_pintbl[]) {
6125 { 0x1b, 0x90170110 },
6126 { }
6127 },
6128 },
6129 [ALC294_FIXUP_BASS_SPEAKER_15] = {
6130 .type = HDA_FIXUP_FUNC,
6131 .v.func = alc294_fixup_bass_speaker_15,
6132 },
6133 [ALC283_FIXUP_DELL_HP_RESUME] = {
6134 .type = HDA_FIXUP_FUNC,
6135 .v.func = alc283_fixup_dell_hp_resume,
6136 },
6137 [ALC294_FIXUP_ASUS_CS35L41_SPI_2] = {
6138 .type = HDA_FIXUP_FUNC,
6139 .v.func = cs35l41_fixup_spi_two,
6140 .chained = true,
6141 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC,
6142 },
6143 [ALC274_FIXUP_HP_AIO_BIND_DACS] = {
6144 .type = HDA_FIXUP_FUNC,
6145 .v.func = alc274_fixup_hp_aio_bind_dacs,
6146 },
6147 [ALC285_FIXUP_ASUS_GA605K_HEADSET_MIC] = {
6148 .type = HDA_FIXUP_PINS,
6149 .v.pins = (const struct hda_pintbl[]) {
6150 { 0x19, 0x03a11050 },
6151 { 0x1b, 0x03a11c30 },
6152 { }
6153 },
6154 .chained = true,
6155 .chain_id = ALC285_FIXUP_ASUS_GA605K_I2C_SPEAKER2_TO_DAC1
6156 },
6157 [ALC285_FIXUP_ASUS_GA605K_I2C_SPEAKER2_TO_DAC1] = {
6158 .type = HDA_FIXUP_FUNC,
6159 .v.func = alc285_fixup_speaker2_to_dac1,
6160 },
6161 [ALC269_FIXUP_POSITIVO_P15X_HEADSET_MIC] = {
6162 .type = HDA_FIXUP_FUNC,
6163 .v.func = alc269_fixup_limit_int_mic_boost,
6164 .chained = true,
6165 .chain_id = ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE,
6166 },
6167 };
6168
6169 static const struct hda_quirk alc269_fixup_tbl[] = {
6170 SND_PCI_QUIRK(0x1025, 0x0283, "Acer TravelMate 8371", ALC269_FIXUP_INV_DMIC),
6171 SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC),
6172 SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC),
6173 SND_PCI_QUIRK(0x1025, 0x047c, "Acer AC700", ALC269_FIXUP_ACER_AC700),
6174 SND_PCI_QUIRK(0x1025, 0x072d, "Acer Aspire V5-571G", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
6175 SND_PCI_QUIRK(0x1025, 0x0740, "Acer AO725", ALC271_FIXUP_HP_GATE_MIC_JACK),
6176 SND_PCI_QUIRK(0x1025, 0x0742, "Acer AO756", ALC271_FIXUP_HP_GATE_MIC_JACK),
6177 SND_PCI_QUIRK(0x1025, 0x0762, "Acer Aspire E1-472", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
6178 SND_PCI_QUIRK(0x1025, 0x0775, "Acer Aspire E1-572", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
6179 SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS),
6180 SND_PCI_QUIRK(0x1025, 0x080d, "Acer Aspire V5-122P", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
6181 SND_PCI_QUIRK(0x1025, 0x0840, "Acer Aspire E1", ALC269VB_FIXUP_ASPIRE_E1_COEF),
6182 SND_PCI_QUIRK(0x1025, 0x100c, "Acer Aspire E5-574G", ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST),
6183 SND_PCI_QUIRK(0x1025, 0x101c, "Acer Veriton N2510G", ALC269_FIXUP_LIFEBOOK),
6184 SND_PCI_QUIRK(0x1025, 0x102b, "Acer Aspire C24-860", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE),
6185 SND_PCI_QUIRK(0x1025, 0x1065, "Acer Aspire C20-820", ALC269VC_FIXUP_ACER_HEADSET_MIC),
6186 SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK),
6187 SND_PCI_QUIRK(0x1025, 0x1094, "Acer Aspire E5-575T", ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST),
6188 SND_PCI_QUIRK(0x1025, 0x1099, "Acer Aspire E5-523G", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
6189 SND_PCI_QUIRK(0x1025, 0x110e, "Acer Aspire ES1-432", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
6190 SND_PCI_QUIRK(0x1025, 0x1166, "Acer Veriton N4640G", ALC269_FIXUP_LIFEBOOK),
6191 SND_PCI_QUIRK(0x1025, 0x1167, "Acer Veriton N6640G", ALC269_FIXUP_LIFEBOOK),
6192 SND_PCI_QUIRK(0x1025, 0x1177, "Acer Predator G9-593", ALC255_FIXUP_PREDATOR_SUBWOOFER),
6193 SND_PCI_QUIRK(0x1025, 0x1178, "Acer Predator G9-593", ALC255_FIXUP_PREDATOR_SUBWOOFER),
6194 SND_PCI_QUIRK(0x1025, 0x1246, "Acer Predator Helios 500", ALC299_FIXUP_PREDATOR_SPK),
6195 SND_PCI_QUIRK(0x1025, 0x1247, "Acer vCopperbox", ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS),
6196 SND_PCI_QUIRK(0x1025, 0x1248, "Acer Veriton N4660G", ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE),
6197 SND_PCI_QUIRK(0x1025, 0x1269, "Acer SWIFT SF314-54", ALC256_FIXUP_ACER_HEADSET_MIC),
6198 SND_PCI_QUIRK(0x1025, 0x126a, "Acer Swift SF114-32", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
6199 SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
6200 SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
6201 SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
6202 SND_PCI_QUIRK(0x1025, 0x129c, "Acer SWIFT SF314-55", ALC256_FIXUP_ACER_HEADSET_MIC),
6203 SND_PCI_QUIRK(0x1025, 0x129d, "Acer SWIFT SF313-51", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
6204 SND_PCI_QUIRK(0x1025, 0x1300, "Acer SWIFT SF314-56", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
6205 SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
6206 SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", ALC233_FIXUP_ACER_HEADSET_MIC),
6207 SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC),
6208 SND_PCI_QUIRK(0x1025, 0x1360, "Acer Aspire A115", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
6209 SND_PCI_QUIRK(0x1025, 0x141f, "Acer Spin SP513-54N", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
6210 SND_PCI_QUIRK(0x1025, 0x142b, "Acer Swift SF314-42", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
6211 SND_PCI_QUIRK(0x1025, 0x1430, "Acer TravelMate B311R-31", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
6212 SND_PCI_QUIRK(0x1025, 0x1466, "Acer Aspire A515-56", ALC255_FIXUP_ACER_HEADPHONE_AND_MIC),
6213 SND_PCI_QUIRK(0x1025, 0x1534, "Acer Predator PH315-54", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
6214 SND_PCI_QUIRK(0x1025, 0x159c, "Acer Nitro 5 AN515-58", ALC2XX_FIXUP_HEADSET_MIC),
6215 SND_PCI_QUIRK(0x1025, 0x169a, "Acer Swift SFG16", ALC256_FIXUP_ACER_SFG16_MICMUTE_LED),
6216 SND_PCI_QUIRK(0x1025, 0x1826, "Acer Helios ZPC", ALC287_FIXUP_PREDATOR_SPK_CS35L41_I2C_2),
6217 SND_PCI_QUIRK(0x1025, 0x182c, "Acer Helios ZPD", ALC287_FIXUP_PREDATOR_SPK_CS35L41_I2C_2),
6218 SND_PCI_QUIRK(0x1025, 0x1844, "Acer Helios ZPS", ALC287_FIXUP_PREDATOR_SPK_CS35L41_I2C_2),
6219 SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
6220 SND_PCI_QUIRK(0x1028, 0x053c, "Dell Latitude E5430", ALC292_FIXUP_DELL_E7X),
6221 SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS),
6222 SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X),
6223 SND_PCI_QUIRK(0x1028, 0x05be, "Dell Latitude E6540", ALC292_FIXUP_DELL_E7X),
6224 SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X),
6225 SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X),
6226 SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER),
6227 SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
6228 SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
6229 SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
6230 SND_PCI_QUIRK(0x1028, 0x0604, "Dell Venue 11 Pro 7130", ALC283_FIXUP_DELL_HP_RESUME),
6231 SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
6232 SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
6233 SND_PCI_QUIRK(0x1028, 0x062c, "Dell Latitude E5550", ALC292_FIXUP_DELL_E7X),
6234 SND_PCI_QUIRK(0x1028, 0x062e, "Dell Latitude E7450", ALC292_FIXUP_DELL_E7X),
6235 SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),
6236 SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
6237 SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
6238 SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13),
6239 SND_PCI_QUIRK(0x1028, 0x0669, "Dell Optiplex 9020m", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
6240 SND_PCI_QUIRK(0x1028, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK),
6241 SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
6242 SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
6243 SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
6244 SND_PCI_QUIRK(0x1028, 0x06db, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
6245 SND_PCI_QUIRK(0x1028, 0x06dd, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
6246 SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
6247 SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
6248 SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
6249 SND_PCI_QUIRK(0x1028, 0x0706, "Dell Inspiron 7559", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
6250 SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE),
6251 SND_PCI_QUIRK(0x1028, 0x0738, "Dell Precision 5820", ALC269_FIXUP_NO_SHUTUP),
6252 SND_PCI_QUIRK(0x1028, 0x075c, "Dell XPS 27 7760", ALC298_FIXUP_SPK_VOLUME),
6253 SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME),
6254 SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
6255 SND_PCI_QUIRK(0x1028, 0x07b0, "Dell Precision 7520", ALC295_FIXUP_DISABLE_DAC3),
6256 SND_PCI_QUIRK(0x1028, 0x080c, "Dell WYSE", ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE),
6257 SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
6258 SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
6259 SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
6260 SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
6261 SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB),
6262 SND_PCI_QUIRK(0x1028, 0x0879, "Dell Latitude 5420 Rugged", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
6263 SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE),
6264 SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE),
6265 SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
6266 SND_PCI_QUIRK(0x1028, 0x097d, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
6267 SND_PCI_QUIRK(0x1028, 0x097e, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
6268 SND_PCI_QUIRK(0x1028, 0x098d, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
6269 SND_PCI_QUIRK(0x1028, 0x09bf, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
6270 SND_PCI_QUIRK(0x1028, 0x0a2e, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
6271 SND_PCI_QUIRK(0x1028, 0x0a30, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
6272 SND_PCI_QUIRK(0x1028, 0x0a38, "Dell Latitude 7520", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET),
6273 SND_PCI_QUIRK(0x1028, 0x0a58, "Dell", ALC255_FIXUP_DELL_HEADSET_MIC),
6274 SND_PCI_QUIRK(0x1028, 0x0a61, "Dell XPS 15 9510", ALC289_FIXUP_DUAL_SPK),
6275 SND_PCI_QUIRK(0x1028, 0x0a62, "Dell Precision 5560", ALC289_FIXUP_DUAL_SPK),
6276 SND_PCI_QUIRK(0x1028, 0x0a9d, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
6277 SND_PCI_QUIRK(0x1028, 0x0a9e, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
6278 SND_PCI_QUIRK(0x1028, 0x0b19, "Dell XPS 15 9520", ALC289_FIXUP_DUAL_SPK),
6279 SND_PCI_QUIRK(0x1028, 0x0b1a, "Dell Precision 5570", ALC289_FIXUP_DUAL_SPK),
6280 SND_PCI_QUIRK(0x1028, 0x0b27, "Dell", ALC245_FIXUP_CS35L41_SPI_2),
6281 SND_PCI_QUIRK(0x1028, 0x0b28, "Dell", ALC245_FIXUP_CS35L41_SPI_2),
6282 SND_PCI_QUIRK(0x1028, 0x0b37, "Dell Inspiron 16 Plus 7620 2-in-1", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS),
6283 SND_PCI_QUIRK(0x1028, 0x0b71, "Dell Inspiron 16 Plus 7620", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS),
6284 SND_PCI_QUIRK(0x1028, 0x0beb, "Dell XPS 15 9530 (2023)", ALC289_FIXUP_DELL_CS35L41_SPI_2),
6285 SND_PCI_QUIRK(0x1028, 0x0c03, "Dell Precision 5340", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
6286 SND_PCI_QUIRK(0x1028, 0x0c0b, "Dell Oasis 14 RPL-P", ALC289_FIXUP_RTK_AMP_DUAL_SPK),
6287 SND_PCI_QUIRK(0x1028, 0x0c0d, "Dell Oasis", ALC289_FIXUP_RTK_AMP_DUAL_SPK),
6288 SND_PCI_QUIRK(0x1028, 0x0c0e, "Dell Oasis 16", ALC289_FIXUP_RTK_AMP_DUAL_SPK),
6289 SND_PCI_QUIRK(0x1028, 0x0c19, "Dell Precision 3340", ALC236_FIXUP_DELL_DUAL_CODECS),
6290 SND_PCI_QUIRK(0x1028, 0x0c1a, "Dell Precision 3340", ALC236_FIXUP_DELL_DUAL_CODECS),
6291 SND_PCI_QUIRK(0x1028, 0x0c1b, "Dell Precision 3440", ALC236_FIXUP_DELL_DUAL_CODECS),
6292 SND_PCI_QUIRK(0x1028, 0x0c1c, "Dell Precision 3540", ALC236_FIXUP_DELL_DUAL_CODECS),
6293 SND_PCI_QUIRK(0x1028, 0x0c1d, "Dell Precision 3440", ALC236_FIXUP_DELL_DUAL_CODECS),
6294 SND_PCI_QUIRK(0x1028, 0x0c1e, "Dell Precision 3540", ALC236_FIXUP_DELL_DUAL_CODECS),
6295 SND_PCI_QUIRK(0x1028, 0x0c28, "Dell Inspiron 16 Plus 7630", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS),
6296 SND_PCI_QUIRK(0x1028, 0x0c4d, "Dell", ALC287_FIXUP_CS35L41_I2C_4),
6297 SND_PCI_QUIRK(0x1028, 0x0c94, "Dell Polaris 3 metal", ALC295_FIXUP_DELL_TAS2781_I2C),
6298 SND_PCI_QUIRK(0x1028, 0x0c96, "Dell Polaris 2in1", ALC295_FIXUP_DELL_TAS2781_I2C),
6299 SND_PCI_QUIRK(0x1028, 0x0cbd, "Dell Oasis 13 CS MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
6300 SND_PCI_QUIRK(0x1028, 0x0cbe, "Dell Oasis 13 2-IN-1 MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
6301 SND_PCI_QUIRK(0x1028, 0x0cbf, "Dell Oasis 13 Low Weight MTU-L", ALC289_FIXUP_DELL_CS35L41_SPI_2),
6302 SND_PCI_QUIRK(0x1028, 0x0cc0, "Dell Oasis 13", ALC289_FIXUP_RTK_AMP_DUAL_SPK),
6303 SND_PCI_QUIRK(0x1028, 0x0cc1, "Dell Oasis 14 MTL-H/U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
6304 SND_PCI_QUIRK(0x1028, 0x0cc2, "Dell Oasis 14 2-in-1 MTL-H/U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
6305 SND_PCI_QUIRK(0x1028, 0x0cc3, "Dell Oasis 14 Low Weight MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
6306 SND_PCI_QUIRK(0x1028, 0x0cc4, "Dell Oasis 16 MTL-H/U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
6307 SND_PCI_QUIRK(0x1028, 0x0cc5, "Dell Oasis 14", ALC289_FIXUP_RTK_AMP_DUAL_SPK),
6308 SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
6309 SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
6310 SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
6311 SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),
6312 SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED),
6313 SND_PCI_QUIRK(0x103c, 0x21f9, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6314 SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6315 SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6316 SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6317 SND_PCI_QUIRK(0x103c, 0x221c, "HP EliteBook 755 G2", ALC280_FIXUP_HP_HEADSET_MIC),
6318 SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6319 SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6320 SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
6321 SND_PCI_QUIRK(0x103c, 0x2237, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
6322 SND_PCI_QUIRK(0x103c, 0x2238, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
6323 SND_PCI_QUIRK(0x103c, 0x2239, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
6324 SND_PCI_QUIRK(0x103c, 0x224b, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
6325 SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6326 SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6327 SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6328 SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6329 SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6330 SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6331 SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED),
6332 SND_PCI_QUIRK(0x103c, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY),
6333 SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6334 SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6335 SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6336 SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6337 SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6338 SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6339 SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6340 SND_PCI_QUIRK(0x103c, 0x226e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6341 SND_PCI_QUIRK(0x103c, 0x2271, "HP", ALC286_FIXUP_HP_GPIO_LED),
6342 SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6343 SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC280_FIXUP_HP_DOCK_PINS),
6344 SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6345 SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC280_FIXUP_HP_DOCK_PINS),
6346 SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6347 SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6348 SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6349 SND_PCI_QUIRK(0x103c, 0x228b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6350 SND_PCI_QUIRK(0x103c, 0x228e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6351 SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6352 SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6353 SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6354 SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6355 SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6356 SND_PCI_QUIRK(0x103c, 0x22c5, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6357 SND_PCI_QUIRK(0x103c, 0x22c7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6358 SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6359 SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6360 SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC280_FIXUP_HP_9480M),
6361 SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6362 SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
6363 SND_PCI_QUIRK(0x103c, 0x2334, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6364 SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6365 SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6366 SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
6367 SND_PCI_QUIRK(0x103c, 0x2b5e, "HP 288 Pro G2 MT", ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE),
6368 SND_PCI_QUIRK(0x103c, 0x802e, "HP Z240 SFF", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
6369 SND_PCI_QUIRK(0x103c, 0x802f, "HP Z240", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
6370 SND_PCI_QUIRK(0x103c, 0x8077, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
6371 SND_PCI_QUIRK(0x103c, 0x8158, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
6372 SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC295_FIXUP_HP_X360),
6373 SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC),
6374 SND_PCI_QUIRK(0x103c, 0x827e, "HP x360", ALC295_FIXUP_HP_X360),
6375 SND_PCI_QUIRK(0x103c, 0x827f, "HP x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
6376 SND_PCI_QUIRK(0x103c, 0x82bf, "HP G3 mini", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
6377 SND_PCI_QUIRK(0x103c, 0x82c0, "HP G3 mini premium", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
6378 SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
6379 SND_PCI_QUIRK(0x103c, 0x841c, "HP Pavilion 15-CK0xx", ALC269_FIXUP_HP_MUTE_LED_MIC3),
6380 SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
6381 SND_PCI_QUIRK(0x103c, 0x84a6, "HP 250 G7 Notebook PC", ALC269_FIXUP_HP_LINE1_MIC1_LED),
6382 SND_PCI_QUIRK(0x103c, 0x84ae, "HP 15-db0403ng", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
6383 SND_PCI_QUIRK(0x103c, 0x84da, "HP OMEN dc0019-ur", ALC295_FIXUP_HP_OMEN),
6384 SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
6385 SND_PCI_QUIRK(0x103c, 0x8519, "HP Spectre x360 15-df0xxx", ALC285_FIXUP_HP_SPECTRE_X360),
6386 SND_PCI_QUIRK(0x103c, 0x8537, "HP ProBook 440 G6", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
6387 SND_PCI_QUIRK(0x103c, 0x8548, "HP EliteBook x360 830 G6", ALC285_FIXUP_HP_GPIO_LED),
6388 SND_PCI_QUIRK(0x103c, 0x854a, "HP EliteBook 830 G6", ALC285_FIXUP_HP_GPIO_LED),
6389 SND_PCI_QUIRK(0x103c, 0x85c6, "HP Pavilion x360 Convertible 14-dy1xxx", ALC295_FIXUP_HP_MUTE_LED_COEFBIT11),
6390 SND_PCI_QUIRK(0x103c, 0x85de, "HP Envy x360 13-ar0xxx", ALC285_FIXUP_HP_ENVY_X360),
6391 SND_PCI_QUIRK(0x103c, 0x860f, "HP ZBook 15 G6", ALC285_FIXUP_HP_GPIO_AMP_INIT),
6392 SND_PCI_QUIRK(0x103c, 0x861f, "HP Elite Dragonfly G1", ALC285_FIXUP_HP_GPIO_AMP_INIT),
6393 SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED),
6394 SND_PCI_QUIRK(0x103c, 0x86c1, "HP Laptop 15-da3001TU", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
6395 SND_PCI_QUIRK(0x103c, 0x86c7, "HP Envy AiO 32", ALC274_FIXUP_HP_ENVY_GPIO),
6396 SND_PCI_QUIRK(0x103c, 0x86e7, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
6397 SND_PCI_QUIRK(0x103c, 0x863e, "HP Spectre x360 15-df1xxx", ALC285_FIXUP_HP_SPECTRE_X360_DF1),
6398 SND_PCI_QUIRK(0x103c, 0x86e8, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
6399 SND_PCI_QUIRK(0x103c, 0x86f9, "HP Spectre x360 13-aw0xxx", ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED),
6400 SND_PCI_QUIRK(0x103c, 0x8716, "HP Elite Dragonfly G2 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
6401 SND_PCI_QUIRK(0x103c, 0x8720, "HP EliteBook x360 1040 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
6402 SND_PCI_QUIRK(0x103c, 0x8724, "HP EliteBook 850 G7", ALC285_FIXUP_HP_GPIO_LED),
6403 SND_PCI_QUIRK(0x103c, 0x8728, "HP EliteBook 840 G7", ALC285_FIXUP_HP_GPIO_LED),
6404 SND_PCI_QUIRK(0x103c, 0x8729, "HP", ALC285_FIXUP_HP_GPIO_LED),
6405 SND_PCI_QUIRK(0x103c, 0x8730, "HP ProBook 445 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
6406 SND_PCI_QUIRK(0x103c, 0x8735, "HP ProBook 435 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
6407 SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_AMP_INIT),
6408 SND_PCI_QUIRK(0x103c, 0x8760, "HP EliteBook 8{4,5}5 G7", ALC285_FIXUP_HP_BEEP_MICMUTE_LED),
6409 SND_PCI_QUIRK(0x103c, 0x876e, "HP ENVY x360 Convertible 13-ay0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS),
6410 SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED),
6411 SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED),
6412 SND_PCI_QUIRK(0x103c, 0x8780, "HP ZBook Fury 17 G7 Mobile Workstation",
6413 ALC285_FIXUP_HP_GPIO_AMP_INIT),
6414 SND_PCI_QUIRK(0x103c, 0x8783, "HP ZBook Fury 15 G7 Mobile Workstation",
6415 ALC285_FIXUP_HP_GPIO_AMP_INIT),
6416 SND_PCI_QUIRK(0x103c, 0x8786, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
6417 SND_PCI_QUIRK(0x103c, 0x8787, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
6418 SND_PCI_QUIRK(0x103c, 0x8788, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
6419 SND_PCI_QUIRK(0x103c, 0x87b7, "HP Laptop 14-fq0xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
6420 SND_PCI_QUIRK(0x103c, 0x87c8, "HP", ALC287_FIXUP_HP_GPIO_LED),
6421 SND_PCI_QUIRK(0x103c, 0x87cc, "HP Pavilion 15-eg0xxx", ALC287_FIXUP_HP_GPIO_LED),
6422 SND_PCI_QUIRK(0x103c, 0x87d3, "HP Laptop 15-gw0xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
6423 SND_PCI_QUIRK(0x103c, 0x87df, "HP ProBook 430 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
6424 SND_PCI_QUIRK(0x103c, 0x87e5, "HP ProBook 440 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
6425 SND_PCI_QUIRK(0x103c, 0x87e7, "HP ProBook 450 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
6426 SND_PCI_QUIRK(0x103c, 0x87f1, "HP ProBook 630 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
6427 SND_PCI_QUIRK(0x103c, 0x87f2, "HP ProBook 640 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
6428 SND_PCI_QUIRK(0x103c, 0x87f4, "HP", ALC287_FIXUP_HP_GPIO_LED),
6429 SND_PCI_QUIRK(0x103c, 0x87f5, "HP", ALC287_FIXUP_HP_GPIO_LED),
6430 SND_PCI_QUIRK(0x103c, 0x87f6, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
6431 SND_PCI_QUIRK(0x103c, 0x87f7, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
6432 SND_PCI_QUIRK(0x103c, 0x87fd, "HP Laptop 14-dq2xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
6433 SND_PCI_QUIRK(0x103c, 0x87fe, "HP Laptop 15s-fq2xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
6434 SND_PCI_QUIRK(0x103c, 0x8805, "HP ProBook 650 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
6435 SND_PCI_QUIRK(0x103c, 0x880d, "HP EliteBook 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
6436 SND_PCI_QUIRK(0x103c, 0x8811, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
6437 SND_PCI_QUIRK(0x103c, 0x8812, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
6438 SND_PCI_QUIRK(0x103c, 0x881d, "HP 250 G8 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
6439 SND_PCI_QUIRK(0x103c, 0x881e, "HP Laptop 15s-du3xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
6440 SND_PCI_QUIRK(0x103c, 0x8846, "HP EliteBook 850 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
6441 SND_PCI_QUIRK(0x103c, 0x8847, "HP EliteBook x360 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
6442 SND_PCI_QUIRK(0x103c, 0x884b, "HP EliteBook 840 Aero G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
6443 SND_PCI_QUIRK(0x103c, 0x884c, "HP EliteBook 840 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
6444 SND_PCI_QUIRK(0x103c, 0x8862, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST),
6445 SND_PCI_QUIRK(0x103c, 0x8863, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST),
6446 SND_PCI_QUIRK(0x103c, 0x886d, "HP ZBook Fury 17.3 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
6447 SND_PCI_QUIRK(0x103c, 0x8870, "HP ZBook Fury 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
6448 SND_PCI_QUIRK(0x103c, 0x8873, "HP ZBook Studio 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
6449 SND_PCI_QUIRK(0x103c, 0x887a, "HP Laptop 15s-eq2xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
6450 SND_PCI_QUIRK(0x103c, 0x887c, "HP Laptop 14s-fq1xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
6451 SND_PCI_QUIRK(0x103c, 0x888a, "HP ENVY x360 Convertible 15-eu0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS),
6452 SND_PCI_QUIRK(0x103c, 0x888d, "HP ZBook Power 15.6 inch G8 Mobile Workstation PC", ALC236_FIXUP_HP_GPIO_LED),
6453 SND_PCI_QUIRK(0x103c, 0x8895, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED),
6454 SND_PCI_QUIRK(0x103c, 0x8896, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_MUTE_LED),
6455 SND_PCI_QUIRK(0x103c, 0x8898, "HP EliteBook 845 G8 Notebook PC", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),
6456 SND_PCI_QUIRK(0x103c, 0x88d0, "HP Pavilion 15-eh1xxx (mainboard 88D0)", ALC287_FIXUP_HP_GPIO_LED),
6457 SND_PCI_QUIRK(0x103c, 0x88dd, "HP Pavilion 15z-ec200", ALC285_FIXUP_HP_MUTE_LED),
6458 SND_PCI_QUIRK(0x103c, 0x8902, "HP OMEN 16", ALC285_FIXUP_HP_MUTE_LED),
6459 SND_PCI_QUIRK(0x103c, 0x890e, "HP 255 G8 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
6460 SND_PCI_QUIRK(0x103c, 0x8919, "HP Pavilion Aero Laptop 13-be0xxx", ALC287_FIXUP_HP_GPIO_LED),
6461 SND_PCI_QUIRK(0x103c, 0x896d, "HP ZBook Firefly 16 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
6462 SND_PCI_QUIRK(0x103c, 0x896e, "HP EliteBook x360 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
6463 SND_PCI_QUIRK(0x103c, 0x8971, "HP EliteBook 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
6464 SND_PCI_QUIRK(0x103c, 0x8972, "HP EliteBook 840 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
6465 SND_PCI_QUIRK(0x103c, 0x8973, "HP EliteBook 860 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
6466 SND_PCI_QUIRK(0x103c, 0x8974, "HP EliteBook 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
6467 SND_PCI_QUIRK(0x103c, 0x8975, "HP EliteBook x360 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
6468 SND_PCI_QUIRK(0x103c, 0x897d, "HP mt440 Mobile Thin Client U74", ALC236_FIXUP_HP_GPIO_LED),
6469 SND_PCI_QUIRK(0x103c, 0x8981, "HP Elite Dragonfly G3", ALC245_FIXUP_CS35L41_SPI_4),
6470 SND_PCI_QUIRK(0x103c, 0x898a, "HP Pavilion 15-eg100", ALC287_FIXUP_HP_GPIO_LED),
6471 SND_PCI_QUIRK(0x103c, 0x898e, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2),
6472 SND_PCI_QUIRK(0x103c, 0x898f, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2),
6473 SND_PCI_QUIRK(0x103c, 0x8991, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
6474 SND_PCI_QUIRK(0x103c, 0x8992, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2),
6475 SND_PCI_QUIRK(0x103c, 0x8994, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
6476 SND_PCI_QUIRK(0x103c, 0x8995, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2),
6477 SND_PCI_QUIRK(0x103c, 0x89a0, "HP Laptop 15-dw4xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
6478 SND_PCI_QUIRK(0x103c, 0x89a4, "HP ProBook 440 G9", ALC236_FIXUP_HP_GPIO_LED),
6479 SND_PCI_QUIRK(0x103c, 0x89a6, "HP ProBook 450 G9", ALC236_FIXUP_HP_GPIO_LED),
6480 SND_PCI_QUIRK(0x103c, 0x89aa, "HP EliteBook 630 G9", ALC236_FIXUP_HP_GPIO_LED),
6481 SND_PCI_QUIRK(0x103c, 0x89ac, "HP EliteBook 640 G9", ALC236_FIXUP_HP_GPIO_LED),
6482 SND_PCI_QUIRK(0x103c, 0x89ae, "HP EliteBook 650 G9", ALC236_FIXUP_HP_GPIO_LED),
6483 SND_PCI_QUIRK(0x103c, 0x89c0, "HP ZBook Power 15.6 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
6484 SND_PCI_QUIRK(0x103c, 0x89c3, "Zbook Studio G9", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
6485 SND_PCI_QUIRK(0x103c, 0x89c6, "Zbook Fury 17 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
6486 SND_PCI_QUIRK(0x103c, 0x89ca, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
6487 SND_PCI_QUIRK(0x103c, 0x89d3, "HP EliteBook 645 G9 (MB 89D2)", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
6488 SND_PCI_QUIRK(0x103c, 0x89da, "HP Spectre x360 14t-ea100", ALC245_FIXUP_HP_SPECTRE_X360_EU0XXX),
6489 SND_PCI_QUIRK(0x103c, 0x89e7, "HP Elite x2 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
6490 SND_PCI_QUIRK(0x103c, 0x8a0f, "HP Pavilion 14-ec1xxx", ALC287_FIXUP_HP_GPIO_LED),
6491 SND_PCI_QUIRK(0x103c, 0x8a20, "HP Laptop 15s-fq5xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
6492 SND_PCI_QUIRK(0x103c, 0x8a25, "HP Victus 16-d1xxx (MB 8A25)", ALC245_FIXUP_HP_MUTE_LED_COEFBIT),
6493 SND_PCI_QUIRK(0x103c, 0x8a26, "HP Victus 16-d1xxx (MB 8A26)", ALC245_FIXUP_HP_MUTE_LED_COEFBIT),
6494 SND_PCI_QUIRK(0x103c, 0x8a28, "HP Envy 13", ALC287_FIXUP_CS35L41_I2C_2),
6495 SND_PCI_QUIRK(0x103c, 0x8a29, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
6496 SND_PCI_QUIRK(0x103c, 0x8a2a, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
6497 SND_PCI_QUIRK(0x103c, 0x8a2b, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
6498 SND_PCI_QUIRK(0x103c, 0x8a2c, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),
6499 SND_PCI_QUIRK(0x103c, 0x8a2d, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),
6500 SND_PCI_QUIRK(0x103c, 0x8a2e, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),
6501 SND_PCI_QUIRK(0x103c, 0x8a30, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
6502 SND_PCI_QUIRK(0x103c, 0x8a31, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
6503 SND_PCI_QUIRK(0x103c, 0x8a4f, "HP Victus 15-fa0xxx (MB 8A4F)", ALC245_FIXUP_HP_MUTE_LED_COEFBIT),
6504 SND_PCI_QUIRK(0x103c, 0x8a6e, "HP EDNA 360", ALC287_FIXUP_CS35L41_I2C_4),
6505 SND_PCI_QUIRK(0x103c, 0x8a74, "HP ProBook 440 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
6506 SND_PCI_QUIRK(0x103c, 0x8a78, "HP Dev One", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),
6507 SND_PCI_QUIRK(0x103c, 0x8aa0, "HP ProBook 440 G9 (MB 8A9E)", ALC236_FIXUP_HP_GPIO_LED),
6508 SND_PCI_QUIRK(0x103c, 0x8aa3, "HP ProBook 450 G9 (MB 8AA1)", ALC236_FIXUP_HP_GPIO_LED),
6509 SND_PCI_QUIRK(0x103c, 0x8aa8, "HP EliteBook 640 G9 (MB 8AA6)", ALC236_FIXUP_HP_GPIO_LED),
6510 SND_PCI_QUIRK(0x103c, 0x8aab, "HP EliteBook 650 G9 (MB 8AA9)", ALC236_FIXUP_HP_GPIO_LED),
6511 SND_PCI_QUIRK(0x103c, 0x8ab9, "HP EliteBook 840 G8 (MB 8AB8)", ALC285_FIXUP_HP_GPIO_LED),
6512 SND_PCI_QUIRK(0x103c, 0x8abb, "HP ZBook Firefly 14 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
6513 SND_PCI_QUIRK(0x103c, 0x8ad1, "HP EliteBook 840 14 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
6514 SND_PCI_QUIRK(0x103c, 0x8ad2, "HP EliteBook 860 16 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
6515 SND_PCI_QUIRK(0x103c, 0x8ad8, "HP 800 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
6516 SND_PCI_QUIRK(0x103c, 0x8b0f, "HP Elite mt645 G7 Mobile Thin Client U81", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
6517 SND_PCI_QUIRK(0x103c, 0x8b2f, "HP 255 15.6 inch G10 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
6518 SND_PCI_QUIRK(0x103c, 0x8b3a, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
6519 SND_PCI_QUIRK(0x103c, 0x8b3f, "HP mt440 Mobile Thin Client U91", ALC236_FIXUP_HP_GPIO_LED),
6520 SND_PCI_QUIRK(0x103c, 0x8b42, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
6521 SND_PCI_QUIRK(0x103c, 0x8b43, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
6522 SND_PCI_QUIRK(0x103c, 0x8b44, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
6523 SND_PCI_QUIRK(0x103c, 0x8b45, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
6524 SND_PCI_QUIRK(0x103c, 0x8b46, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
6525 SND_PCI_QUIRK(0x103c, 0x8b47, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
6526 SND_PCI_QUIRK(0x103c, 0x8b59, "HP Elite mt645 G7 Mobile Thin Client U89", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
6527 SND_PCI_QUIRK(0x103c, 0x8b5d, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
6528 SND_PCI_QUIRK(0x103c, 0x8b5e, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
6529 SND_PCI_QUIRK(0x103c, 0x8b5f, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
6530 SND_PCI_QUIRK(0x103c, 0x8b63, "HP Elite Dragonfly 13.5 inch G4", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
6531 SND_PCI_QUIRK(0x103c, 0x8b65, "HP ProBook 455 15.6 inch G10 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
6532 SND_PCI_QUIRK(0x103c, 0x8b66, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
6533 SND_PCI_QUIRK(0x103c, 0x8b70, "HP EliteBook 835 G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
6534 SND_PCI_QUIRK(0x103c, 0x8b72, "HP EliteBook 845 G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
6535 SND_PCI_QUIRK(0x103c, 0x8b74, "HP EliteBook 845W G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
6536 SND_PCI_QUIRK(0x103c, 0x8b77, "HP ElieBook 865 G10", ALC287_FIXUP_CS35L41_I2C_2),
6537 SND_PCI_QUIRK(0x103c, 0x8b7a, "HP", ALC236_FIXUP_HP_GPIO_LED),
6538 SND_PCI_QUIRK(0x103c, 0x8b7d, "HP", ALC236_FIXUP_HP_GPIO_LED),
6539 SND_PCI_QUIRK(0x103c, 0x8b87, "HP", ALC236_FIXUP_HP_GPIO_LED),
6540 SND_PCI_QUIRK(0x103c, 0x8b8a, "HP", ALC236_FIXUP_HP_GPIO_LED),
6541 SND_PCI_QUIRK(0x103c, 0x8b8b, "HP", ALC236_FIXUP_HP_GPIO_LED),
6542 SND_PCI_QUIRK(0x103c, 0x8b8d, "HP", ALC236_FIXUP_HP_GPIO_LED),
6543 SND_PCI_QUIRK(0x103c, 0x8b8f, "HP", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
6544 SND_PCI_QUIRK(0x103c, 0x8b92, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
6545 SND_PCI_QUIRK(0x103c, 0x8b96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
6546 SND_PCI_QUIRK(0x103c, 0x8b97, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
6547 SND_PCI_QUIRK(0x103c, 0x8bb3, "HP Slim OMEN", ALC287_FIXUP_CS35L41_I2C_2),
6548 SND_PCI_QUIRK(0x103c, 0x8bb4, "HP Slim OMEN", ALC287_FIXUP_CS35L41_I2C_2),
6549 SND_PCI_QUIRK(0x103c, 0x8bbe, "HP Victus 16-r0xxx (MB 8BBE)", ALC245_FIXUP_HP_MUTE_LED_COEFBIT),
6550 SND_PCI_QUIRK(0x103c, 0x8bc8, "HP Victus 15-fa1xxx", ALC245_FIXUP_HP_MUTE_LED_COEFBIT),
6551 SND_PCI_QUIRK(0x103c, 0x8bcd, "HP Omen 16-xd0xxx", ALC245_FIXUP_HP_MUTE_LED_V1_COEFBIT),
6552 SND_PCI_QUIRK(0x103c, 0x8bd4, "HP Victus 16-s0xxx (MB 8BD4)", ALC245_FIXUP_HP_MUTE_LED_COEFBIT),
6553 SND_PCI_QUIRK(0x103c, 0x8bdd, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
6554 SND_PCI_QUIRK(0x103c, 0x8bde, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
6555 SND_PCI_QUIRK(0x103c, 0x8bdf, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
6556 SND_PCI_QUIRK(0x103c, 0x8be0, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
6557 SND_PCI_QUIRK(0x103c, 0x8be1, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
6558 SND_PCI_QUIRK(0x103c, 0x8be2, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
6559 SND_PCI_QUIRK(0x103c, 0x8be3, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
6560 SND_PCI_QUIRK(0x103c, 0x8be5, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),
6561 SND_PCI_QUIRK(0x103c, 0x8be6, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),
6562 SND_PCI_QUIRK(0x103c, 0x8be7, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
6563 SND_PCI_QUIRK(0x103c, 0x8be8, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
6564 SND_PCI_QUIRK(0x103c, 0x8be9, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
6565 SND_PCI_QUIRK(0x103c, 0x8bf0, "HP", ALC236_FIXUP_HP_GPIO_LED),
6566 SND_PCI_QUIRK(0x103c, 0x8c15, "HP Spectre x360 2-in-1 Laptop 14-eu0xxx", ALC245_FIXUP_HP_SPECTRE_X360_EU0XXX),
6567 SND_PCI_QUIRK(0x103c, 0x8c16, "HP Spectre x360 2-in-1 Laptop 16-aa0xxx", ALC245_FIXUP_HP_SPECTRE_X360_16_AA0XXX),
6568 SND_PCI_QUIRK(0x103c, 0x8c17, "HP Spectre 16", ALC287_FIXUP_CS35L41_I2C_2),
6569 SND_PCI_QUIRK(0x103c, 0x8c21, "HP Pavilion Plus Laptop 14-ey0XXX", ALC245_FIXUP_HP_X360_MUTE_LEDS),
6570 SND_PCI_QUIRK(0x103c, 0x8c30, "HP Victus 15-fb1xxx", ALC245_FIXUP_HP_MUTE_LED_COEFBIT),
6571 SND_PCI_QUIRK(0x103c, 0x8c46, "HP EliteBook 830 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
6572 SND_PCI_QUIRK(0x103c, 0x8c47, "HP EliteBook 840 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
6573 SND_PCI_QUIRK(0x103c, 0x8c48, "HP EliteBook 860 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
6574 SND_PCI_QUIRK(0x103c, 0x8c49, "HP Elite x360 830 2-in-1 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
6575 SND_PCI_QUIRK(0x103c, 0x8c4d, "HP Omen", ALC287_FIXUP_CS35L41_I2C_2),
6576 SND_PCI_QUIRK(0x103c, 0x8c4e, "HP Omen", ALC287_FIXUP_CS35L41_I2C_2),
6577 SND_PCI_QUIRK(0x103c, 0x8c4f, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
6578 SND_PCI_QUIRK(0x103c, 0x8c50, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
6579 SND_PCI_QUIRK(0x103c, 0x8c51, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
6580 SND_PCI_QUIRK(0x103c, 0x8c52, "HP EliteBook 1040 G11", ALC285_FIXUP_HP_GPIO_LED),
6581 SND_PCI_QUIRK(0x103c, 0x8c53, "HP Elite x360 1040 2-in-1 G11", ALC285_FIXUP_HP_GPIO_LED),
6582 SND_PCI_QUIRK(0x103c, 0x8c66, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),
6583 SND_PCI_QUIRK(0x103c, 0x8c67, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
6584 SND_PCI_QUIRK(0x103c, 0x8c68, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
6585 SND_PCI_QUIRK(0x103c, 0x8c6a, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),
6586 SND_PCI_QUIRK(0x103c, 0x8c70, "HP EliteBook 835 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
6587 SND_PCI_QUIRK(0x103c, 0x8c71, "HP EliteBook 845 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
6588 SND_PCI_QUIRK(0x103c, 0x8c72, "HP EliteBook 865 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
6589 SND_PCI_QUIRK(0x103c, 0x8c7b, "HP ProBook 445 G11", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
6590 SND_PCI_QUIRK(0x103c, 0x8c7c, "HP ProBook 445 G11", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
6591 SND_PCI_QUIRK(0x103c, 0x8c7d, "HP ProBook 465 G11", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
6592 SND_PCI_QUIRK(0x103c, 0x8c7e, "HP ProBook 465 G11", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
6593 SND_PCI_QUIRK(0x103c, 0x8c7f, "HP EliteBook 645 G11", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
6594 SND_PCI_QUIRK(0x103c, 0x8c80, "HP EliteBook 645 G11", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
6595 SND_PCI_QUIRK(0x103c, 0x8c81, "HP EliteBook 665 G11", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
6596 SND_PCI_QUIRK(0x103c, 0x8c89, "HP ProBook 460 G11", ALC236_FIXUP_HP_GPIO_LED),
6597 SND_PCI_QUIRK(0x103c, 0x8c8a, "HP EliteBook 630", ALC236_FIXUP_HP_GPIO_LED),
6598 SND_PCI_QUIRK(0x103c, 0x8c8c, "HP EliteBook 660", ALC236_FIXUP_HP_GPIO_LED),
6599 SND_PCI_QUIRK(0x103c, 0x8c8d, "HP ProBook 440 G11", ALC236_FIXUP_HP_GPIO_LED),
6600 SND_PCI_QUIRK(0x103c, 0x8c8e, "HP ProBook 460 G11", ALC236_FIXUP_HP_GPIO_LED),
6601 SND_PCI_QUIRK(0x103c, 0x8c90, "HP EliteBook 640", ALC236_FIXUP_HP_GPIO_LED),
6602 SND_PCI_QUIRK(0x103c, 0x8c91, "HP EliteBook 660", ALC236_FIXUP_HP_GPIO_LED),
6603 SND_PCI_QUIRK(0x103c, 0x8c96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
6604 SND_PCI_QUIRK(0x103c, 0x8c97, "HP ZBook", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
6605 SND_PCI_QUIRK(0x103c, 0x8c99, "HP Victus 16-r1xxx (MB 8C99)", ALC245_FIXUP_HP_MUTE_LED_COEFBIT),
6606 SND_PCI_QUIRK(0x103c, 0x8c9c, "HP Victus 16-s1xxx (MB 8C9C)", ALC245_FIXUP_HP_MUTE_LED_COEFBIT),
6607 SND_PCI_QUIRK(0x103c, 0x8ca1, "HP ZBook Power", ALC236_FIXUP_HP_GPIO_LED),
6608 SND_PCI_QUIRK(0x103c, 0x8ca2, "HP ZBook Power", ALC236_FIXUP_HP_GPIO_LED),
6609 SND_PCI_QUIRK(0x103c, 0x8ca4, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
6610 SND_PCI_QUIRK(0x103c, 0x8ca7, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
6611 SND_PCI_QUIRK(0x103c, 0x8caf, "HP Elite mt645 G8 Mobile Thin Client", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
6612 SND_PCI_QUIRK(0x103c, 0x8cbd, "HP Pavilion Aero Laptop 13-bg0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS),
6613 SND_PCI_QUIRK(0x103c, 0x8cdd, "HP Spectre", ALC245_FIXUP_HP_SPECTRE_X360_EU0XXX),
6614 SND_PCI_QUIRK(0x103c, 0x8cde, "HP OmniBook Ultra Flip Laptop 14t", ALC245_FIXUP_HP_SPECTRE_X360_EU0XXX),
6615 SND_PCI_QUIRK(0x103c, 0x8cdf, "HP SnowWhite", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
6616 SND_PCI_QUIRK(0x103c, 0x8ce0, "HP SnowWhite", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
6617 SND_PCI_QUIRK(0x103c, 0x8cf5, "HP ZBook Studio 16", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
6618 SND_PCI_QUIRK(0x103c, 0x8d01, "HP ZBook Power 14 G12", ALC285_FIXUP_HP_GPIO_LED),
6619 SND_PCI_QUIRK(0x103c, 0x8d07, "HP Victus 15-fb2xxx (MB 8D07)", ALC245_FIXUP_HP_MUTE_LED_COEFBIT),
6620 SND_PCI_QUIRK(0x103c, 0x8d18, "HP EliteStudio 8 AIO", ALC274_FIXUP_HP_AIO_BIND_DACS),
6621 SND_PCI_QUIRK(0x103c, 0x8d84, "HP EliteBook X G1i", ALC285_FIXUP_HP_GPIO_LED),
6622 SND_PCI_QUIRK(0x103c, 0x8d85, "HP EliteBook 14 G12", ALC285_FIXUP_HP_GPIO_LED),
6623 SND_PCI_QUIRK(0x103c, 0x8d86, "HP Elite X360 14 G12", ALC285_FIXUP_HP_GPIO_LED),
6624 SND_PCI_QUIRK(0x103c, 0x8d8c, "HP EliteBook 13 G12", ALC285_FIXUP_HP_GPIO_LED),
6625 SND_PCI_QUIRK(0x103c, 0x8d8d, "HP Elite X360 13 G12", ALC285_FIXUP_HP_GPIO_LED),
6626 SND_PCI_QUIRK(0x103c, 0x8d8e, "HP EliteBook 14 G12", ALC285_FIXUP_HP_GPIO_LED),
6627 SND_PCI_QUIRK(0x103c, 0x8d8f, "HP EliteBook 14 G12", ALC285_FIXUP_HP_GPIO_LED),
6628 SND_PCI_QUIRK(0x103c, 0x8d90, "HP EliteBook 16 G12", ALC285_FIXUP_HP_GPIO_LED),
6629 SND_PCI_QUIRK(0x103c, 0x8d91, "HP ZBook Firefly 14 G12", ALC285_FIXUP_HP_GPIO_LED),
6630 SND_PCI_QUIRK(0x103c, 0x8d92, "HP ZBook Firefly 16 G12", ALC285_FIXUP_HP_GPIO_LED),
6631 SND_PCI_QUIRK(0x103c, 0x8d9b, "HP 17 Turbine OmniBook 7 UMA", ALC287_FIXUP_CS35L41_I2C_2),
6632 SND_PCI_QUIRK(0x103c, 0x8d9c, "HP 17 Turbine OmniBook 7 DIS", ALC287_FIXUP_CS35L41_I2C_2),
6633 SND_PCI_QUIRK(0x103c, 0x8d9d, "HP 17 Turbine OmniBook X UMA", ALC287_FIXUP_CS35L41_I2C_2),
6634 SND_PCI_QUIRK(0x103c, 0x8d9e, "HP 17 Turbine OmniBook X DIS", ALC287_FIXUP_CS35L41_I2C_2),
6635 SND_PCI_QUIRK(0x103c, 0x8d9f, "HP 14 Cadet (x360)", ALC287_FIXUP_CS35L41_I2C_2),
6636 SND_PCI_QUIRK(0x103c, 0x8da0, "HP 16 Clipper OmniBook 7(X360)", ALC287_FIXUP_CS35L41_I2C_2),
6637 SND_PCI_QUIRK(0x103c, 0x8da1, "HP 16 Clipper OmniBook X", ALC287_FIXUP_CS35L41_I2C_2),
6638 SND_PCI_QUIRK(0x103c, 0x8da7, "HP 14 Enstrom OmniBook X", ALC287_FIXUP_CS35L41_I2C_2),
6639 SND_PCI_QUIRK(0x103c, 0x8da8, "HP 16 Piston OmniBook X", ALC287_FIXUP_CS35L41_I2C_2),
6640 SND_PCI_QUIRK(0x103c, 0x8dd4, "HP EliteStudio 8 AIO", ALC274_FIXUP_HP_AIO_BIND_DACS),
6641 SND_PCI_QUIRK(0x103c, 0x8de8, "HP Gemtree", ALC245_FIXUP_TAS2781_SPI_2),
6642 SND_PCI_QUIRK(0x103c, 0x8de9, "HP Gemtree", ALC245_FIXUP_TAS2781_SPI_2),
6643 SND_PCI_QUIRK(0x103c, 0x8dec, "HP EliteBook 640 G12", ALC236_FIXUP_HP_GPIO_LED),
6644 SND_PCI_QUIRK(0x103c, 0x8ded, "HP EliteBook 640 G12", ALC236_FIXUP_HP_GPIO_LED),
6645 SND_PCI_QUIRK(0x103c, 0x8dee, "HP EliteBook 660 G12", ALC236_FIXUP_HP_GPIO_LED),
6646 SND_PCI_QUIRK(0x103c, 0x8def, "HP EliteBook 660 G12", ALC236_FIXUP_HP_GPIO_LED),
6647 SND_PCI_QUIRK(0x103c, 0x8df0, "HP EliteBook 630 G12", ALC236_FIXUP_HP_GPIO_LED),
6648 SND_PCI_QUIRK(0x103c, 0x8df1, "HP EliteBook 630 G12", ALC236_FIXUP_HP_GPIO_LED),
6649 SND_PCI_QUIRK(0x103c, 0x8dfb, "HP EliteBook 6 G1a 14", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
6650 SND_PCI_QUIRK(0x103c, 0x8dfc, "HP EliteBook 645 G12", ALC236_FIXUP_HP_GPIO_LED),
6651 SND_PCI_QUIRK(0x103c, 0x8dfd, "HP EliteBook 6 G1a 16", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
6652 SND_PCI_QUIRK(0x103c, 0x8dfe, "HP EliteBook 665 G12", ALC236_FIXUP_HP_GPIO_LED),
6653 SND_PCI_QUIRK(0x103c, 0x8e11, "HP Trekker", ALC287_FIXUP_CS35L41_I2C_2),
6654 SND_PCI_QUIRK(0x103c, 0x8e12, "HP Trekker", ALC287_FIXUP_CS35L41_I2C_2),
6655 SND_PCI_QUIRK(0x103c, 0x8e13, "HP Trekker", ALC287_FIXUP_CS35L41_I2C_2),
6656 SND_PCI_QUIRK(0x103c, 0x8e14, "HP ZBook Firefly 14 G12", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A),
6657 SND_PCI_QUIRK(0x103c, 0x8e15, "HP ZBook Firefly 14 G12", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A),
6658 SND_PCI_QUIRK(0x103c, 0x8e16, "HP ZBook Firefly 14 G12", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A),
6659 SND_PCI_QUIRK(0x103c, 0x8e17, "HP ZBook Firefly 14 G12", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A),
6660 SND_PCI_QUIRK(0x103c, 0x8e18, "HP ZBook Firefly 14 G12A", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A),
6661 SND_PCI_QUIRK(0x103c, 0x8e19, "HP ZBook Firefly 14 G12A", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A),
6662 SND_PCI_QUIRK(0x103c, 0x8e1a, "HP ZBook Firefly 14 G12A", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A),
6663 SND_PCI_QUIRK(0x103c, 0x8e1b, "HP EliteBook G12", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A),
6664 SND_PCI_QUIRK(0x103c, 0x8e1c, "HP EliteBook G12", ALC245_FIXUP_HP_ZBOOK_FIREFLY_G12A),
6665 SND_PCI_QUIRK(0x103c, 0x8e1d, "HP ZBook X Gli 16 G12", ALC236_FIXUP_HP_GPIO_LED),
6666 SND_PCI_QUIRK(0x103c, 0x8e2c, "HP EliteBook 16 G12", ALC285_FIXUP_HP_GPIO_LED),
6667 SND_PCI_QUIRK(0x103c, 0x8e36, "HP 14 Enstrom OmniBook X", ALC287_FIXUP_CS35L41_I2C_2),
6668 SND_PCI_QUIRK(0x103c, 0x8e37, "HP 16 Piston OmniBook X", ALC287_FIXUP_CS35L41_I2C_2),
6669 SND_PCI_QUIRK(0x103c, 0x8e3a, "HP Agusta", ALC287_FIXUP_CS35L41_I2C_2),
6670 SND_PCI_QUIRK(0x103c, 0x8e3b, "HP Agusta", ALC287_FIXUP_CS35L41_I2C_2),
6671 SND_PCI_QUIRK(0x103c, 0x8e60, "HP Trekker ", ALC287_FIXUP_CS35L41_I2C_2),
6672 SND_PCI_QUIRK(0x103c, 0x8e61, "HP Trekker ", ALC287_FIXUP_CS35L41_I2C_2),
6673 SND_PCI_QUIRK(0x103c, 0x8e62, "HP Trekker ", ALC287_FIXUP_CS35L41_I2C_2),
6674 SND_PCI_QUIRK(0x1043, 0x1032, "ASUS VivoBook X513EA", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
6675 SND_PCI_QUIRK(0x1043, 0x1034, "ASUS GU605C", ALC285_FIXUP_ASUS_GU605_SPI_SPEAKER2_TO_DAC1),
6676 SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
6677 SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
6678 SND_PCI_QUIRK(0x1043, 0x1054, "ASUS G614FH/FM/FP", ALC287_FIXUP_CS35L41_I2C_2),
6679 SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
6680 SND_PCI_QUIRK(0x1043, 0x106f, "ASUS VivoBook X515UA", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
6681 SND_PCI_QUIRK(0x1043, 0x1074, "ASUS G614PH/PM/PP", ALC287_FIXUP_CS35L41_I2C_2),
6682 SND_PCI_QUIRK(0x1043, 0x10a1, "ASUS UX391UA", ALC294_FIXUP_ASUS_SPK),
6683 SND_PCI_QUIRK(0x1043, 0x10a4, "ASUS TP3407SA", ALC287_FIXUP_TAS2781_I2C),
6684 SND_PCI_QUIRK(0x1043, 0x10c0, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
6685 SND_PCI_QUIRK(0x1043, 0x10d0, "ASUS X540LA/X540LJ", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
6686 SND_PCI_QUIRK(0x1043, 0x10d3, "ASUS K6500ZC", ALC294_FIXUP_ASUS_SPK),
6687 SND_PCI_QUIRK(0x1043, 0x1154, "ASUS TP3607SH", ALC287_FIXUP_TAS2781_I2C),
6688 SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
6689 SND_PCI_QUIRK(0x1043, 0x1194, "ASUS UM3406KA", ALC287_FIXUP_CS35L41_I2C_2),
6690 SND_PCI_QUIRK(0x1043, 0x11c0, "ASUS X556UR", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
6691 SND_PCI_QUIRK(0x1043, 0x1204, "ASUS Strix G615JHR_JMR_JPR", ALC287_FIXUP_TAS2781_I2C),
6692 SND_PCI_QUIRK(0x1043, 0x1214, "ASUS Strix G615LH_LM_LP", ALC287_FIXUP_TAS2781_I2C),
6693 SND_PCI_QUIRK(0x1043, 0x125e, "ASUS Q524UQK", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
6694 SND_PCI_QUIRK(0x1043, 0x1271, "ASUS X430UN", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
6695 SND_PCI_QUIRK(0x1043, 0x1290, "ASUS X441SA", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
6696 SND_PCI_QUIRK(0x1043, 0x1294, "ASUS B3405CVA", ALC245_FIXUP_CS35L41_SPI_2),
6697 SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
6698 SND_PCI_QUIRK(0x1043, 0x12a3, "Asus N7691ZM", ALC269_FIXUP_ASUS_N7601ZM),
6699 SND_PCI_QUIRK(0x1043, 0x12af, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2),
6700 SND_PCI_QUIRK(0x1043, 0x12b4, "ASUS B3405CCA / P3405CCA", ALC294_FIXUP_ASUS_CS35L41_SPI_2),
6701 SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
6702 SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
6703 SND_PCI_QUIRK(0x1043, 0x1313, "Asus K42JZ", ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE),
6704 SND_PCI_QUIRK(0x1043, 0x1314, "ASUS GA605K", ALC285_FIXUP_ASUS_GA605K_HEADSET_MIC),
6705 SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
6706 SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
6707 SND_PCI_QUIRK(0x1043, 0x1433, "ASUS GX650PY/PZ/PV/PU/PYV/PZV/PIV/PVV", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
6708 SND_PCI_QUIRK(0x1043, 0x1454, "ASUS PM3406CKA", ALC287_FIXUP_CS35L41_I2C_2),
6709 SND_PCI_QUIRK(0x1043, 0x1460, "Asus VivoBook 15", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
6710 SND_PCI_QUIRK(0x1043, 0x1463, "Asus GA402X/GA402N", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
6711 SND_PCI_QUIRK(0x1043, 0x1473, "ASUS GU604VI/VC/VE/VG/VJ/VQ/VU/VV/VY/VZ", ALC285_FIXUP_ASUS_HEADSET_MIC),
6712 SND_PCI_QUIRK(0x1043, 0x1483, "ASUS GU603VQ/VU/VV/VJ/VI", ALC285_FIXUP_ASUS_HEADSET_MIC),
6713 SND_PCI_QUIRK(0x1043, 0x1493, "ASUS GV601VV/VU/VJ/VQ/VI", ALC285_FIXUP_ASUS_HEADSET_MIC),
6714 SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G614JY/JZ/JG", ALC245_FIXUP_CS35L41_SPI_2),
6715 SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS G513PI/PU/PV", ALC287_FIXUP_CS35L41_I2C_2),
6716 SND_PCI_QUIRK(0x1043, 0x14f2, "ASUS VivoBook X515JA", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
6717 SND_PCI_QUIRK(0x1043, 0x1503, "ASUS G733PY/PZ/PZV/PYV", ALC287_FIXUP_CS35L41_I2C_2),
6718 SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
6719 SND_PCI_QUIRK(0x1043, 0x1533, "ASUS GV302XA/XJ/XQ/XU/XV/XI", ALC287_FIXUP_CS35L41_I2C_2),
6720 SND_PCI_QUIRK(0x1043, 0x1573, "ASUS GZ301VV/VQ/VU/VJ/VA/VC/VE/VVC/VQC/VUC/VJC/VEC/VCC", ALC285_FIXUP_ASUS_HEADSET_MIC),
6721 SND_PCI_QUIRK(0x1043, 0x1662, "ASUS GV301QH", ALC294_FIXUP_ASUS_DUAL_SPK),
6722 SND_PCI_QUIRK(0x1043, 0x1663, "ASUS GU603ZI/ZJ/ZQ/ZU/ZV", ALC285_FIXUP_ASUS_HEADSET_MIC),
6723 SND_PCI_QUIRK(0x1043, 0x1683, "ASUS UM3402YAR", ALC287_FIXUP_CS35L41_I2C_2),
6724 SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS UX3402VA", ALC245_FIXUP_CS35L41_SPI_2),
6725 SND_PCI_QUIRK(0x1043, 0x16b2, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),
6726 SND_PCI_QUIRK(0x1043, 0x16d3, "ASUS UX5304VA", ALC245_FIXUP_CS35L41_SPI_2),
6727 SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
6728 SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS UX7602VI/BZ", ALC245_FIXUP_CS35L41_SPI_2),
6729 SND_PCI_QUIRK(0x1043, 0x1740, "ASUS UX430UA", ALC295_FIXUP_ASUS_DACS),
6730 SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_DUAL_SPK),
6731 SND_PCI_QUIRK(0x1043, 0x17f3, "ROG Ally NR2301L/X", ALC294_FIXUP_ASUS_ALLY),
6732 SND_PCI_QUIRK(0x1043, 0x1863, "ASUS UX6404VI/VV", ALC245_FIXUP_CS35L41_SPI_2),
6733 SND_PCI_QUIRK(0x1043, 0x1881, "ASUS Zephyrus S/M", ALC294_FIXUP_ASUS_GX502_PINS),
6734 SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC),
6735 SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS UM3504DA", ALC294_FIXUP_CS35L41_I2C_2),
6736 SND_PCI_QUIRK(0x1043, 0x18f1, "Asus FX505DT", ALC256_FIXUP_ASUS_HEADSET_MIC),
6737 SND_PCI_QUIRK(0x1043, 0x194e, "ASUS UX563FD", ALC294_FIXUP_ASUS_HPE),
6738 SND_PCI_QUIRK(0x1043, 0x1970, "ASUS UX550VE", ALC289_FIXUP_ASUS_GA401),
6739 SND_PCI_QUIRK(0x1043, 0x1982, "ASUS B1400CEPE", ALC256_FIXUP_ASUS_HPE),
6740 SND_PCI_QUIRK(0x1043, 0x19ce, "ASUS B9450FA", ALC294_FIXUP_ASUS_HPE),
6741 SND_PCI_QUIRK(0x1043, 0x19e1, "ASUS UX581LV", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE),
6742 SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
6743 SND_PCI_QUIRK(0x1043, 0x1a63, "ASUS UX3405MA", ALC245_FIXUP_CS35L41_SPI_2),
6744 SND_PCI_QUIRK(0x1043, 0x1a83, "ASUS UM5302LA", ALC294_FIXUP_CS35L41_I2C_2),
6745 SND_PCI_QUIRK(0x1043, 0x1a8e, "ASUS G712LWS", ALC294_FIXUP_LENOVO_MIC_LOCATION),
6746 SND_PCI_QUIRK(0x1043, 0x1a8f, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2),
6747 SND_PCI_QUIRK(0x1043, 0x1b11, "ASUS UX431DA", ALC294_FIXUP_ASUS_COEF_1B),
6748 SND_PCI_QUIRK(0x1043, 0x1b13, "ASUS U41SV/GA403U", ALC285_FIXUP_ASUS_GA403U_HEADSET_MIC),
6749 SND_PCI_QUIRK(0x1043, 0x1b93, "ASUS G614JVR/JIR", ALC245_FIXUP_CS35L41_SPI_2),
6750 SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
6751 SND_PCI_QUIRK(0x1043, 0x1c03, "ASUS UM3406HA", ALC294_FIXUP_ASUS_I2C_HEADSET_MIC),
6752 SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
6753 SND_PCI_QUIRK(0x1043, 0x1c33, "ASUS UX5304MA", ALC245_FIXUP_CS35L41_SPI_2),
6754 SND_PCI_QUIRK(0x1043, 0x1c43, "ASUS UX8406MA", ALC245_FIXUP_CS35L41_SPI_2),
6755 SND_PCI_QUIRK(0x1043, 0x1c62, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),
6756 SND_PCI_QUIRK(0x1043, 0x1c63, "ASUS GU605M", ALC285_FIXUP_ASUS_GU605_SPI_SPEAKER2_TO_DAC1),
6757 SND_PCI_QUIRK(0x1043, 0x1c80, "ASUS VivoBook TP401", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
6758 SND_PCI_QUIRK(0x1043, 0x1c92, "ASUS ROG Strix G15", ALC285_FIXUP_ASUS_G533Z_PINS),
6759 SND_PCI_QUIRK(0x1043, 0x1c9f, "ASUS G614JU/JV/JI", ALC285_FIXUP_ASUS_HEADSET_MIC),
6760 SND_PCI_QUIRK(0x1043, 0x1caf, "ASUS G634JY/JZ/JI/JG", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
6761 SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
6762 SND_PCI_QUIRK(0x1043, 0x1ccf, "ASUS G814JU/JV/JI", ALC245_FIXUP_CS35L41_SPI_2),
6763 SND_PCI_QUIRK(0x1043, 0x1cdf, "ASUS G814JY/JZ/JG", ALC245_FIXUP_CS35L41_SPI_2),
6764 SND_PCI_QUIRK(0x1043, 0x1cef, "ASUS G834JY/JZ/JI/JG", ALC285_FIXUP_ASUS_HEADSET_MIC),
6765 SND_PCI_QUIRK(0x1043, 0x1d1f, "ASUS G713PI/PU/PV/PVN", ALC287_FIXUP_CS35L41_I2C_2),
6766 SND_PCI_QUIRK(0x1043, 0x1d42, "ASUS Zephyrus G14 2022", ALC289_FIXUP_ASUS_GA401),
6767 SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE),
6768 SND_PCI_QUIRK(0x1043, 0x1da2, "ASUS UP6502ZA/ZD", ALC245_FIXUP_CS35L41_SPI_2),
6769 SND_PCI_QUIRK(0x1043, 0x1df3, "ASUS UM5606WA", ALC294_FIXUP_BASS_SPEAKER_15),
6770 SND_PCI_QUIRK(0x1043, 0x1264, "ASUS UM5606KA", ALC294_FIXUP_BASS_SPEAKER_15),
6771 SND_PCI_QUIRK(0x1043, 0x1e02, "ASUS UX3402ZA", ALC245_FIXUP_CS35L41_SPI_2),
6772 SND_PCI_QUIRK(0x1043, 0x1e10, "ASUS VivoBook X507UAR", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
6773 SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502),
6774 SND_PCI_QUIRK(0x1043, 0x1e12, "ASUS UM3402", ALC287_FIXUP_CS35L41_I2C_2),
6775 SND_PCI_QUIRK(0x1043, 0x1e1f, "ASUS Vivobook 15 X1504VAP", ALC2XX_FIXUP_HEADSET_MIC),
6776 SND_PCI_QUIRK(0x1043, 0x1e51, "ASUS Zephyrus M15", ALC294_FIXUP_ASUS_GU502_PINS),
6777 SND_PCI_QUIRK(0x1043, 0x1e5e, "ASUS ROG Strix G513", ALC294_FIXUP_ASUS_G513_PINS),
6778 SND_PCI_QUIRK(0x1043, 0x1e63, "ASUS H7606W", ALC285_FIXUP_ASUS_GU605_SPI_SPEAKER2_TO_DAC1),
6779 SND_PCI_QUIRK(0x1043, 0x1e83, "ASUS GA605W", ALC285_FIXUP_ASUS_GU605_SPI_SPEAKER2_TO_DAC1),
6780 SND_PCI_QUIRK(0x1043, 0x1e8e, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA401),
6781 SND_PCI_QUIRK(0x1043, 0x1e93, "ASUS ExpertBook B9403CVAR", ALC294_FIXUP_ASUS_HPE),
6782 SND_PCI_QUIRK(0x1043, 0x1eb3, "ASUS Ally RCLA72", ALC287_FIXUP_TAS2781_I2C),
6783 SND_PCI_QUIRK(0x1043, 0x1ed3, "ASUS HN7306W", ALC287_FIXUP_CS35L41_I2C_2),
6784 SND_PCI_QUIRK(0x1043, 0x1ee2, "ASUS UM6702RA/RC", ALC287_FIXUP_CS35L41_I2C_2),
6785 SND_PCI_QUIRK(0x1043, 0x1c52, "ASUS Zephyrus G15 2022", ALC289_FIXUP_ASUS_GA401),
6786 SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401),
6787 SND_PCI_QUIRK(0x1043, 0x1f12, "ASUS UM5302", ALC287_FIXUP_CS35L41_I2C_2),
6788 SND_PCI_QUIRK(0x1043, 0x1f1f, "ASUS H7604JI/JV/J3D", ALC245_FIXUP_CS35L41_SPI_2),
6789 SND_PCI_QUIRK(0x1043, 0x1f62, "ASUS UX7602ZM", ALC245_FIXUP_CS35L41_SPI_2),
6790 SND_PCI_QUIRK(0x1043, 0x1f63, "ASUS P5405CSA", ALC245_FIXUP_CS35L41_SPI_2),
6791 SND_PCI_QUIRK(0x1043, 0x1f92, "ASUS ROG Flow X16", ALC289_FIXUP_ASUS_GA401),
6792 SND_PCI_QUIRK(0x1043, 0x1fb3, "ASUS ROG Flow Z13 GZ302EA", ALC287_FIXUP_CS35L41_I2C_2),
6793 SND_PCI_QUIRK(0x1043, 0x3011, "ASUS B5605CVA", ALC245_FIXUP_CS35L41_SPI_2),
6794 SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
6795 SND_PCI_QUIRK(0x1043, 0x3061, "ASUS B3405CCA", ALC294_FIXUP_ASUS_CS35L41_SPI_2),
6796 SND_PCI_QUIRK(0x1043, 0x3071, "ASUS B5405CCA", ALC294_FIXUP_ASUS_CS35L41_SPI_2),
6797 SND_PCI_QUIRK(0x1043, 0x30c1, "ASUS B3605CCA / P3605CCA", ALC294_FIXUP_ASUS_CS35L41_SPI_2),
6798 SND_PCI_QUIRK(0x1043, 0x30d1, "ASUS B5405CCA", ALC294_FIXUP_ASUS_CS35L41_SPI_2),
6799 SND_PCI_QUIRK(0x1043, 0x30e1, "ASUS B5605CCA", ALC294_FIXUP_ASUS_CS35L41_SPI_2),
6800 SND_PCI_QUIRK(0x1043, 0x31d0, "ASUS Zen AIO 27 Z272SD_A272SD", ALC274_FIXUP_ASUS_ZEN_AIO_27),
6801 SND_PCI_QUIRK(0x1043, 0x31e1, "ASUS B5605CCA", ALC294_FIXUP_ASUS_CS35L41_SPI_2),
6802 SND_PCI_QUIRK(0x1043, 0x31f1, "ASUS B3605CCA", ALC294_FIXUP_ASUS_CS35L41_SPI_2),
6803 SND_PCI_QUIRK(0x1043, 0x3391, "ASUS PM3606CKA", ALC287_FIXUP_CS35L41_I2C_2),
6804 SND_PCI_QUIRK(0x1043, 0x3a20, "ASUS G614JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
6805 SND_PCI_QUIRK(0x1043, 0x3a30, "ASUS G814JVR/JIR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
6806 SND_PCI_QUIRK(0x1043, 0x3a40, "ASUS G814JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
6807 SND_PCI_QUIRK(0x1043, 0x3a50, "ASUS G834JYR/JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
6808 SND_PCI_QUIRK(0x1043, 0x3a60, "ASUS G634JYR/JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
6809 SND_PCI_QUIRK(0x1043, 0x3d78, "ASUS GA603KH", ALC287_FIXUP_CS35L41_I2C_2),
6810 SND_PCI_QUIRK(0x1043, 0x3d88, "ASUS GA603KM", ALC287_FIXUP_CS35L41_I2C_2),
6811 SND_PCI_QUIRK(0x1043, 0x3e00, "ASUS G814FH/FM/FP", ALC287_FIXUP_CS35L41_I2C_2),
6812 SND_PCI_QUIRK(0x1043, 0x3e20, "ASUS G814PH/PM/PP", ALC287_FIXUP_CS35L41_I2C_2),
6813 SND_PCI_QUIRK(0x1043, 0x3e30, "ASUS TP3607SA", ALC287_FIXUP_TAS2781_I2C),
6814 SND_PCI_QUIRK(0x1043, 0x3ee0, "ASUS Strix G815_JHR_JMR_JPR", ALC287_FIXUP_TAS2781_I2C),
6815 SND_PCI_QUIRK(0x1043, 0x3ef0, "ASUS Strix G635LR_LW_LX", ALC287_FIXUP_TAS2781_I2C),
6816 SND_PCI_QUIRK(0x1043, 0x3f00, "ASUS Strix G815LH_LM_LP", ALC287_FIXUP_TAS2781_I2C),
6817 SND_PCI_QUIRK(0x1043, 0x3f10, "ASUS Strix G835LR_LW_LX", ALC287_FIXUP_TAS2781_I2C),
6818 SND_PCI_QUIRK(0x1043, 0x3f20, "ASUS Strix G615LR_LW", ALC287_FIXUP_TAS2781_I2C),
6819 SND_PCI_QUIRK(0x1043, 0x3f30, "ASUS Strix G815LR_LW", ALC287_FIXUP_TAS2781_I2C),
6820 SND_PCI_QUIRK(0x1043, 0x3fd0, "ASUS B3605CVA", ALC245_FIXUP_CS35L41_SPI_2),
6821 SND_PCI_QUIRK(0x1043, 0x3ff0, "ASUS B5405CVA", ALC245_FIXUP_CS35L41_SPI_2),
6822 SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
6823 SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
6824 SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
6825 SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
6826 SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
6827 SND_PCI_QUIRK(0x1043, 0x88f4, "ASUS NUC14LNS", ALC245_FIXUP_CS35L41_SPI_1),
6828 SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
6829 SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
6830 SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
6831 SND_PCI_QUIRK(0x104d, 0x9099, "Sony VAIO S13", ALC275_FIXUP_SONY_DISABLE_AAMIX),
6832 SND_PCI_QUIRK(0x104d, 0x90b5, "Sony VAIO Pro 11", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
6833 SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
6834 SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),
6835 SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT),
6836 SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN),
6837 SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC),
6838 SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN),
6839 SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),
6840 SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE),
6841 SND_PCI_QUIRK(0x10ec, 0x118c, "Medion EE4254 MD62100", ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE),
6842 SND_PCI_QUIRK(0x10ec, 0x119e, "Positivo SU C1400", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
6843 SND_PCI_QUIRK(0x10ec, 0x11bc, "VAIO VJFE-IL", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
6844 SND_PCI_QUIRK(0x10ec, 0x1230, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
6845 SND_PCI_QUIRK(0x10ec, 0x124c, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
6846 SND_PCI_QUIRK(0x10ec, 0x1252, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
6847 SND_PCI_QUIRK(0x10ec, 0x1254, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
6848 SND_PCI_QUIRK(0x10ec, 0x12cc, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
6849 SND_PCI_QUIRK(0x10ec, 0x12f6, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
6850 SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-SZ6", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
6851 SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
6852 SND_PCI_QUIRK(0x144d, 0xc169, "Samsung Notebook 9 Pen (NP930SBE-K01US)", ALC298_FIXUP_SAMSUNG_AMP),
6853 SND_PCI_QUIRK(0x144d, 0xc176, "Samsung Notebook 9 Pro (NP930MBE-K04US)", ALC298_FIXUP_SAMSUNG_AMP),
6854 SND_PCI_QUIRK(0x144d, 0xc189, "Samsung Galaxy Flex Book (NT950QCG-X716)", ALC298_FIXUP_SAMSUNG_AMP),
6855 SND_PCI_QUIRK(0x144d, 0xc18a, "Samsung Galaxy Book Ion (NP930XCJ-K01US)", ALC298_FIXUP_SAMSUNG_AMP),
6856 SND_PCI_QUIRK(0x144d, 0xc1a3, "Samsung Galaxy Book Pro (NP935XDB-KC1SE)", ALC298_FIXUP_SAMSUNG_AMP),
6857 SND_PCI_QUIRK(0x144d, 0xc1a4, "Samsung Galaxy Book Pro 360 (NT935QBD)", ALC298_FIXUP_SAMSUNG_AMP),
6858 SND_PCI_QUIRK(0x144d, 0xc1a6, "Samsung Galaxy Book Pro 360 (NP930QBD)", ALC298_FIXUP_SAMSUNG_AMP),
6859 SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
6860 SND_PCI_QUIRK(0x144d, 0xc812, "Samsung Notebook Pen S (NT950SBE-X58)", ALC298_FIXUP_SAMSUNG_AMP),
6861 SND_PCI_QUIRK(0x144d, 0xc830, "Samsung Galaxy Book Ion (NT950XCJ-X716A)", ALC298_FIXUP_SAMSUNG_AMP),
6862 SND_PCI_QUIRK(0x144d, 0xc832, "Samsung Galaxy Book Flex Alpha (NP730QCJ)", ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
6863 SND_PCI_QUIRK(0x144d, 0xca03, "Samsung Galaxy Book2 Pro 360 (NP930QED)", ALC298_FIXUP_SAMSUNG_AMP),
6864 SND_PCI_QUIRK(0x144d, 0xca06, "Samsung Galaxy Book3 360 (NP730QFG)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
6865 SND_PCI_QUIRK(0x144d, 0xc868, "Samsung Galaxy Book2 Pro (NP930XED)", ALC298_FIXUP_SAMSUNG_AMP),
6866 SND_PCI_QUIRK(0x144d, 0xc870, "Samsung Galaxy Book2 Pro (NP950XED)", ALC298_FIXUP_SAMSUNG_AMP_V2_2_AMPS),
6867 SND_PCI_QUIRK(0x144d, 0xc872, "Samsung Galaxy Book2 Pro (NP950XEE)", ALC298_FIXUP_SAMSUNG_AMP_V2_2_AMPS),
6868 SND_PCI_QUIRK(0x144d, 0xc886, "Samsung Galaxy Book3 Pro (NP964XFG)", ALC298_FIXUP_SAMSUNG_AMP_V2_4_AMPS),
6869 SND_PCI_QUIRK(0x144d, 0xc1ca, "Samsung Galaxy Book3 Pro 360 (NP960QFG)", ALC298_FIXUP_SAMSUNG_AMP_V2_4_AMPS),
6870 SND_PCI_QUIRK(0x144d, 0xc1cc, "Samsung Galaxy Book3 Ultra (NT960XFH)", ALC298_FIXUP_SAMSUNG_AMP_V2_4_AMPS),
6871 SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
6872 SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),
6873 SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC),
6874 SND_PCI_QUIRK(0x152d, 0x1082, "Quanta NL3", ALC269_FIXUP_LIFEBOOK),
6875 SND_PCI_QUIRK(0x152d, 0x1262, "Huawei NBLB-WAX9N", ALC2XX_FIXUP_HEADSET_MIC),
6876 SND_PCI_QUIRK(0x1558, 0x0353, "Clevo V35[05]SN[CDE]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6877 SND_PCI_QUIRK(0x1558, 0x1323, "Clevo N130ZU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6878 SND_PCI_QUIRK(0x1558, 0x1325, "Clevo N15[01][CW]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6879 SND_PCI_QUIRK(0x1558, 0x1401, "Clevo L140[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6880 SND_PCI_QUIRK(0x1558, 0x1403, "Clevo N140CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6881 SND_PCI_QUIRK(0x1558, 0x1404, "Clevo N150CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6882 SND_PCI_QUIRK(0x1558, 0x14a1, "Clevo L141MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6883 SND_PCI_QUIRK(0x1558, 0x2624, "Clevo L240TU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6884 SND_PCI_QUIRK(0x1558, 0x28c1, "Clevo V370VND", ALC2XX_FIXUP_HEADSET_MIC),
6885 SND_PCI_QUIRK(0x1558, 0x35a1, "Clevo V3[56]0EN[CDE]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6886 SND_PCI_QUIRK(0x1558, 0x35b1, "Clevo V3[57]0WN[MNP]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6887 SND_PCI_QUIRK(0x1558, 0x4018, "Clevo NV40M[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6888 SND_PCI_QUIRK(0x1558, 0x4019, "Clevo NV40MZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6889 SND_PCI_QUIRK(0x1558, 0x4020, "Clevo NV40MB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6890 SND_PCI_QUIRK(0x1558, 0x4041, "Clevo NV4[15]PZ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6891 SND_PCI_QUIRK(0x1558, 0x40a1, "Clevo NL40GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6892 SND_PCI_QUIRK(0x1558, 0x40c1, "Clevo NL40[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6893 SND_PCI_QUIRK(0x1558, 0x40d1, "Clevo NL41DU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6894 SND_PCI_QUIRK(0x1558, 0x5015, "Clevo NH5[58]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6895 SND_PCI_QUIRK(0x1558, 0x5017, "Clevo NH7[79]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6896 SND_PCI_QUIRK(0x1558, 0x50a3, "Clevo NJ51GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6897 SND_PCI_QUIRK(0x1558, 0x50b3, "Clevo NK50S[BEZ]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6898 SND_PCI_QUIRK(0x1558, 0x50b6, "Clevo NK50S5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6899 SND_PCI_QUIRK(0x1558, 0x50b8, "Clevo NK50SZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6900 SND_PCI_QUIRK(0x1558, 0x50d5, "Clevo NP50D5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6901 SND_PCI_QUIRK(0x1558, 0x50e1, "Clevo NH5[58]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6902 SND_PCI_QUIRK(0x1558, 0x50e2, "Clevo NH7[79]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6903 SND_PCI_QUIRK(0x1558, 0x50f0, "Clevo NH50A[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6904 SND_PCI_QUIRK(0x1558, 0x50f2, "Clevo NH50E[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6905 SND_PCI_QUIRK(0x1558, 0x50f3, "Clevo NH58DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6906 SND_PCI_QUIRK(0x1558, 0x50f5, "Clevo NH55EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6907 SND_PCI_QUIRK(0x1558, 0x50f6, "Clevo NH55DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6908 SND_PCI_QUIRK(0x1558, 0x5101, "Clevo S510WU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6909 SND_PCI_QUIRK(0x1558, 0x5157, "Clevo W517GU1", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6910 SND_PCI_QUIRK(0x1558, 0x51a1, "Clevo NS50MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6911 SND_PCI_QUIRK(0x1558, 0x51b1, "Clevo NS50AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6912 SND_PCI_QUIRK(0x1558, 0x51b3, "Clevo NS70AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6913 SND_PCI_QUIRK(0x1558, 0x5630, "Clevo NP50RNJS", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6914 SND_PCI_QUIRK(0x1558, 0x5700, "Clevo X560WN[RST]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6915 SND_PCI_QUIRK(0x1558, 0x70a1, "Clevo NB70T[HJK]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6916 SND_PCI_QUIRK(0x1558, 0x70b3, "Clevo NK70SB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6917 SND_PCI_QUIRK(0x1558, 0x70f2, "Clevo NH79EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6918 SND_PCI_QUIRK(0x1558, 0x70f3, "Clevo NH77DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6919 SND_PCI_QUIRK(0x1558, 0x70f4, "Clevo NH77EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6920 SND_PCI_QUIRK(0x1558, 0x70f6, "Clevo NH77DPQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6921 SND_PCI_QUIRK(0x1558, 0x7716, "Clevo NS50PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6922 SND_PCI_QUIRK(0x1558, 0x7717, "Clevo NS70PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6923 SND_PCI_QUIRK(0x1558, 0x7718, "Clevo L140PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6924 SND_PCI_QUIRK(0x1558, 0x7724, "Clevo L140AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6925 SND_PCI_QUIRK(0x1558, 0x8228, "Clevo NR40BU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6926 SND_PCI_QUIRK(0x1558, 0x8520, "Clevo NH50D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6927 SND_PCI_QUIRK(0x1558, 0x8521, "Clevo NH77D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6928 SND_PCI_QUIRK(0x1558, 0x8535, "Clevo NH50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6929 SND_PCI_QUIRK(0x1558, 0x8536, "Clevo NH79D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6930 SND_PCI_QUIRK(0x1558, 0x8550, "Clevo NH[57][0-9][ER][ACDH]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6931 SND_PCI_QUIRK(0x1558, 0x8551, "Clevo NH[57][0-9][ER][ACDH]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6932 SND_PCI_QUIRK(0x1558, 0x8560, "Clevo NH[57][0-9][ER][ACDH]Q", ALC269_FIXUP_HEADSET_MIC),
6933 SND_PCI_QUIRK(0x1558, 0x8561, "Clevo NH[57][0-9][ER][ACDH]Q", ALC269_FIXUP_HEADSET_MIC),
6934 SND_PCI_QUIRK(0x1558, 0x8562, "Clevo NH[57][0-9]RZ[Q]", ALC269_FIXUP_DMIC),
6935 SND_PCI_QUIRK(0x1558, 0x8668, "Clevo NP50B[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6936 SND_PCI_QUIRK(0x1558, 0x866d, "Clevo NP5[05]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6937 SND_PCI_QUIRK(0x1558, 0x867c, "Clevo NP7[01]PNP", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6938 SND_PCI_QUIRK(0x1558, 0x867d, "Clevo NP7[01]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6939 SND_PCI_QUIRK(0x1558, 0x8680, "Clevo NJ50LU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6940 SND_PCI_QUIRK(0x1558, 0x8686, "Clevo NH50[CZ]U", ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME),
6941 SND_PCI_QUIRK(0x1558, 0x8a20, "Clevo NH55DCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6942 SND_PCI_QUIRK(0x1558, 0x8a51, "Clevo NH70RCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6943 SND_PCI_QUIRK(0x1558, 0x8d50, "Clevo NH55RCQ-M", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6944 SND_PCI_QUIRK(0x1558, 0x951d, "Clevo N950T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6945 SND_PCI_QUIRK(0x1558, 0x9600, "Clevo N960K[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6946 SND_PCI_QUIRK(0x1558, 0x961d, "Clevo N960S[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6947 SND_PCI_QUIRK(0x1558, 0x971d, "Clevo N970T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6948 SND_PCI_QUIRK(0x1558, 0xa500, "Clevo NL5[03]RU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6949 SND_PCI_QUIRK(0x1558, 0xa554, "VAIO VJFH52", ALC269_FIXUP_VAIO_VJFH52_MIC_NO_PRESENCE),
6950 SND_PCI_QUIRK(0x1558, 0xa600, "Clevo NL50NU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6951 SND_PCI_QUIRK(0x1558, 0xa650, "Clevo NP[567]0SN[CD]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6952 SND_PCI_QUIRK(0x1558, 0xa671, "Clevo NP70SN[CDE]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6953 SND_PCI_QUIRK(0x1558, 0xa741, "Clevo V54x_6x_TNE", ALC245_FIXUP_CLEVO_NOISY_MIC),
6954 SND_PCI_QUIRK(0x1558, 0xa743, "Clevo V54x_6x_TU", ALC245_FIXUP_CLEVO_NOISY_MIC),
6955 SND_PCI_QUIRK(0x1558, 0xa763, "Clevo V54x_6x_TU", ALC245_FIXUP_CLEVO_NOISY_MIC),
6956 SND_PCI_QUIRK(0x1558, 0xb018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6957 SND_PCI_QUIRK(0x1558, 0xb019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6958 SND_PCI_QUIRK(0x1558, 0xb022, "Clevo NH77D[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6959 SND_PCI_QUIRK(0x1558, 0xc018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6960 SND_PCI_QUIRK(0x1558, 0xc019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6961 SND_PCI_QUIRK(0x1558, 0xc022, "Clevo NH77[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
6962 SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
6963 SND_PCI_QUIRK(0x17aa, 0x1048, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),
6964 SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
6965 SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
6966 SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
6967 SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
6968 SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
6969 SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),
6970 SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST),
6971 SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK),
6972 SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),
6973 SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK),
6974 SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK),
6975 SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440),
6976 SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK),
6977 SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK),
6978 SND_PCI_QUIRK(0x17aa, 0x2211, "Thinkpad W541", ALC292_FIXUP_TPT440_DOCK),
6979 SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK),
6980 SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK),
6981 SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
6982 SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK),
6983 SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK),
6984 SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK),
6985 SND_PCI_QUIRK(0x17aa, 0x222d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
6986 SND_PCI_QUIRK(0x17aa, 0x222e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
6987 SND_PCI_QUIRK(0x17aa, 0x2231, "Thinkpad T560", ALC292_FIXUP_TPT460),
6988 SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460),
6989 SND_PCI_QUIRK(0x17aa, 0x2234, "Thinkpad ICE-1", ALC287_FIXUP_TAS2781_I2C),
6990 SND_PCI_QUIRK(0x17aa, 0x2245, "Thinkpad T470", ALC298_FIXUP_TPT470_DOCK),
6991 SND_PCI_QUIRK(0x17aa, 0x2246, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
6992 SND_PCI_QUIRK(0x17aa, 0x2247, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
6993 SND_PCI_QUIRK(0x17aa, 0x2249, "Thinkpad", ALC292_FIXUP_TPT460),
6994 SND_PCI_QUIRK(0x17aa, 0x224b, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
6995 SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
6996 SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
6997 SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
6998 SND_PCI_QUIRK(0x17aa, 0x2292, "Thinkpad X1 Carbon 7th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
6999 SND_PCI_QUIRK(0x17aa, 0x22be, "Thinkpad X1 Carbon 8th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
7000 SND_PCI_QUIRK(0x17aa, 0x22c1, "Thinkpad P1 Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
7001 SND_PCI_QUIRK(0x17aa, 0x22c2, "Thinkpad X1 Extreme Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
7002 SND_PCI_QUIRK(0x17aa, 0x22f1, "Thinkpad", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
7003 SND_PCI_QUIRK(0x17aa, 0x22f2, "Thinkpad", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
7004 SND_PCI_QUIRK(0x17aa, 0x22f3, "Thinkpad", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
7005 SND_PCI_QUIRK(0x17aa, 0x2316, "Thinkpad P1 Gen 6", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
7006 SND_PCI_QUIRK(0x17aa, 0x2317, "Thinkpad P1 Gen 6", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
7007 SND_PCI_QUIRK(0x17aa, 0x2318, "Thinkpad Z13 Gen2", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
7008 SND_PCI_QUIRK(0x17aa, 0x2319, "Thinkpad Z16 Gen2", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
7009 SND_PCI_QUIRK(0x17aa, 0x231a, "Thinkpad Z16 Gen2", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
7010 SND_PCI_QUIRK(0x17aa, 0x231e, "Thinkpad", ALC287_FIXUP_LENOVO_THKPAD_WH_ALC1318),
7011 SND_PCI_QUIRK(0x17aa, 0x231f, "Thinkpad", ALC287_FIXUP_LENOVO_THKPAD_WH_ALC1318),
7012 SND_PCI_QUIRK(0x17aa, 0x2326, "Hera2", ALC287_FIXUP_TAS2781_I2C),
7013 SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
7014 SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
7015 SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
7016 SND_PCI_QUIRK(0x17aa, 0x3111, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
7017 SND_PCI_QUIRK(0x17aa, 0x312a, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
7018 SND_PCI_QUIRK(0x17aa, 0x312f, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
7019 SND_PCI_QUIRK(0x17aa, 0x313c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
7020 SND_PCI_QUIRK(0x17aa, 0x3151, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
7021 SND_PCI_QUIRK(0x17aa, 0x3176, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
7022 SND_PCI_QUIRK(0x17aa, 0x3178, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
7023 SND_PCI_QUIRK(0x17aa, 0x31af, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),
7024 SND_PCI_QUIRK(0x17aa, 0x334b, "Lenovo ThinkCentre M70 Gen5", ALC283_FIXUP_HEADSET_MIC),
7025 SND_PCI_QUIRK(0x17aa, 0x3384, "ThinkCentre M90a PRO", ALC233_FIXUP_LENOVO_L2MH_LOW_ENLED),
7026 SND_PCI_QUIRK(0x17aa, 0x3386, "ThinkCentre M90a Gen6", ALC233_FIXUP_LENOVO_L2MH_LOW_ENLED),
7027 SND_PCI_QUIRK(0x17aa, 0x3387, "ThinkCentre M70a Gen6", ALC233_FIXUP_LENOVO_L2MH_LOW_ENLED),
7028 SND_PCI_QUIRK(0x17aa, 0x3801, "Lenovo Yoga9 14IAP7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
7029 HDA_CODEC_QUIRK(0x17aa, 0x3802, "DuetITL 2021", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
7030 SND_PCI_QUIRK(0x17aa, 0x3802, "Lenovo Yoga Pro 9 14IRP8", ALC287_FIXUP_TAS2781_I2C),
7031 SND_PCI_QUIRK(0x17aa, 0x3813, "Legion 7i 15IMHG05", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
7032 SND_PCI_QUIRK(0x17aa, 0x3818, "Lenovo C940 / Yoga Duet 7", ALC298_FIXUP_LENOVO_C940_DUET7),
7033 SND_PCI_QUIRK(0x17aa, 0x3819, "Lenovo 13s Gen2 ITL", ALC287_FIXUP_13S_GEN2_SPEAKERS),
7034 HDA_CODEC_QUIRK(0x17aa, 0x3820, "IdeaPad 330-17IKB 81DM", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
7035 SND_PCI_QUIRK(0x17aa, 0x3820, "Yoga Duet 7 13ITL6", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
7036 SND_PCI_QUIRK(0x17aa, 0x3824, "Legion Y9000X 2020", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),
7037 SND_PCI_QUIRK(0x17aa, 0x3827, "Ideapad S740", ALC285_FIXUP_IDEAPAD_S740_COEF),
7038 SND_PCI_QUIRK(0x17aa, 0x3834, "Lenovo IdeaPad Slim 9i 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
7039 SND_PCI_QUIRK(0x17aa, 0x383d, "Legion Y9000X 2019", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),
7040 SND_PCI_QUIRK(0x17aa, 0x3843, "Yoga 9i", ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP),
7041 SND_PCI_QUIRK(0x17aa, 0x3847, "Legion 7 16ACHG6", ALC287_FIXUP_LEGION_16ACHG6),
7042 SND_PCI_QUIRK(0x17aa, 0x384a, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
7043 SND_PCI_QUIRK(0x17aa, 0x3852, "Lenovo Yoga 7 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
7044 SND_PCI_QUIRK(0x17aa, 0x3853, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
7045 SND_PCI_QUIRK(0x17aa, 0x3855, "Legion 7 16ITHG6", ALC287_FIXUP_LEGION_16ITHG6),
7046 SND_PCI_QUIRK(0x17aa, 0x3865, "Lenovo 13X", ALC287_FIXUP_CS35L41_I2C_2),
7047 SND_PCI_QUIRK(0x17aa, 0x3866, "Lenovo 13X", ALC287_FIXUP_CS35L41_I2C_2),
7048 SND_PCI_QUIRK(0x17aa, 0x3869, "Lenovo Yoga7 14IAL7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
7049 HDA_CODEC_QUIRK(0x17aa, 0x386e, "Legion Y9000X 2022 IAH7", ALC287_FIXUP_CS35L41_I2C_2),
7050 SND_PCI_QUIRK(0x17aa, 0x386e, "Yoga Pro 7 14ARP8", ALC285_FIXUP_SPEAKER2_TO_DAC1),
7051 HDA_CODEC_QUIRK(0x17aa, 0x38a8, "Legion Pro 7 16ARX8H", ALC287_FIXUP_TAS2781_I2C), /* this must match before PCI SSID 17aa:386f below */
7052 SND_PCI_QUIRK(0x17aa, 0x386f, "Legion Pro 7i 16IAX7", ALC287_FIXUP_CS35L41_I2C_2),
7053 SND_PCI_QUIRK(0x17aa, 0x3870, "Lenovo Yoga 7 14ARB7", ALC287_FIXUP_YOGA7_14ARB7_I2C),
7054 SND_PCI_QUIRK(0x17aa, 0x3877, "Lenovo Legion 7 Slim 16ARHA7", ALC287_FIXUP_CS35L41_I2C_2),
7055 SND_PCI_QUIRK(0x17aa, 0x3878, "Lenovo Legion 7 Slim 16ARHA7", ALC287_FIXUP_CS35L41_I2C_2),
7056 SND_PCI_QUIRK(0x17aa, 0x387d, "Yoga S780-16 pro Quad AAC", ALC287_FIXUP_TAS2781_I2C),
7057 SND_PCI_QUIRK(0x17aa, 0x387e, "Yoga S780-16 pro Quad YC", ALC287_FIXUP_TAS2781_I2C),
7058 SND_PCI_QUIRK(0x17aa, 0x387f, "Yoga S780-16 pro dual LX", ALC287_FIXUP_TAS2781_I2C),
7059 SND_PCI_QUIRK(0x17aa, 0x3880, "Yoga S780-16 pro dual YC", ALC287_FIXUP_TAS2781_I2C),
7060 SND_PCI_QUIRK(0x17aa, 0x3881, "YB9 dual power mode2 YC", ALC287_FIXUP_TAS2781_I2C),
7061 SND_PCI_QUIRK(0x17aa, 0x3882, "Lenovo Yoga Pro 7 14APH8", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
7062 SND_PCI_QUIRK(0x17aa, 0x3884, "Y780 YG DUAL", ALC287_FIXUP_TAS2781_I2C),
7063 SND_PCI_QUIRK(0x17aa, 0x3886, "Y780 VECO DUAL", ALC287_FIXUP_TAS2781_I2C),
7064 SND_PCI_QUIRK(0x17aa, 0x3891, "Lenovo Yoga Pro 7 14AHP9", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
7065 SND_PCI_QUIRK(0x17aa, 0x38a5, "Y580P AMD dual", ALC287_FIXUP_TAS2781_I2C),
7066 SND_PCI_QUIRK(0x17aa, 0x38a7, "Y780P AMD YG dual", ALC287_FIXUP_TAS2781_I2C),
7067 SND_PCI_QUIRK(0x17aa, 0x38a8, "Y780P AMD VECO dual", ALC287_FIXUP_TAS2781_I2C),
7068 SND_PCI_QUIRK(0x17aa, 0x38a9, "Thinkbook 16P", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
7069 SND_PCI_QUIRK(0x17aa, 0x38ab, "Thinkbook 16P", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
7070 SND_PCI_QUIRK(0x17aa, 0x38b4, "Legion Slim 7 16IRH8", ALC287_FIXUP_CS35L41_I2C_2),
7071 SND_PCI_QUIRK(0x17aa, 0x38b5, "Legion Slim 7 16IRH8", ALC287_FIXUP_CS35L41_I2C_2),
7072 SND_PCI_QUIRK(0x17aa, 0x38b6, "Legion Slim 7 16APH8", ALC287_FIXUP_CS35L41_I2C_2),
7073 SND_PCI_QUIRK(0x17aa, 0x38b7, "Legion Slim 7 16APH8", ALC287_FIXUP_CS35L41_I2C_2),
7074 SND_PCI_QUIRK(0x17aa, 0x38b8, "Yoga S780-14.5 proX AMD YC Dual", ALC287_FIXUP_TAS2781_I2C),
7075 SND_PCI_QUIRK(0x17aa, 0x38b9, "Yoga S780-14.5 proX AMD LX Dual", ALC287_FIXUP_TAS2781_I2C),
7076 SND_PCI_QUIRK(0x17aa, 0x38ba, "Yoga S780-14.5 Air AMD quad YC", ALC287_FIXUP_TAS2781_I2C),
7077 SND_PCI_QUIRK(0x17aa, 0x38bb, "Yoga S780-14.5 Air AMD quad AAC", ALC287_FIXUP_TAS2781_I2C),
7078 SND_PCI_QUIRK(0x17aa, 0x38be, "Yoga S980-14.5 proX YC Dual", ALC287_FIXUP_TAS2781_I2C),
7079 SND_PCI_QUIRK(0x17aa, 0x38bf, "Yoga S980-14.5 proX LX Dual", ALC287_FIXUP_TAS2781_I2C),
7080 SND_PCI_QUIRK(0x17aa, 0x38c3, "Y980 DUAL", ALC287_FIXUP_TAS2781_I2C),
7081 SND_PCI_QUIRK(0x17aa, 0x38c7, "Thinkbook 13x Gen 4", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
7082 SND_PCI_QUIRK(0x17aa, 0x38c8, "Thinkbook 13x Gen 4", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
7083 SND_PCI_QUIRK(0x17aa, 0x38cb, "Y790 YG DUAL", ALC287_FIXUP_TAS2781_I2C),
7084 SND_PCI_QUIRK(0x17aa, 0x38cd, "Y790 VECO DUAL", ALC287_FIXUP_TAS2781_I2C),
7085 SND_PCI_QUIRK(0x17aa, 0x38d2, "Lenovo Yoga 9 14IMH9", ALC287_FIXUP_YOGA9_14IMH9_BASS_SPK_PIN),
7086 SND_PCI_QUIRK(0x17aa, 0x38d3, "Yoga S990-16 Pro IMH YC Dual", ALC287_FIXUP_TAS2781_I2C),
7087 SND_PCI_QUIRK(0x17aa, 0x38d4, "Yoga S990-16 Pro IMH VECO Dual", ALC287_FIXUP_TAS2781_I2C),
7088 SND_PCI_QUIRK(0x17aa, 0x38d5, "Yoga S990-16 Pro IMH YC Quad", ALC287_FIXUP_TAS2781_I2C),
7089 SND_PCI_QUIRK(0x17aa, 0x38d6, "Yoga S990-16 Pro IMH VECO Quad", ALC287_FIXUP_TAS2781_I2C),
7090 SND_PCI_QUIRK(0x17aa, 0x38d7, "Lenovo Yoga 9 14IMH9", ALC287_FIXUP_YOGA9_14IMH9_BASS_SPK_PIN),
7091 SND_PCI_QUIRK(0x17aa, 0x38df, "Yoga Y990 Intel YC Dual", ALC287_FIXUP_TAS2781_I2C),
7092 SND_PCI_QUIRK(0x17aa, 0x38e0, "Yoga Y990 Intel VECO Dual", ALC287_FIXUP_TAS2781_I2C),
7093 SND_PCI_QUIRK(0x17aa, 0x38f8, "Yoga Book 9i", ALC287_FIXUP_TAS2781_I2C),
7094 SND_PCI_QUIRK(0x17aa, 0x38df, "Y990 YG DUAL", ALC287_FIXUP_TAS2781_I2C),
7095 SND_PCI_QUIRK(0x17aa, 0x38f9, "Thinkbook 16P Gen5", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
7096 SND_PCI_QUIRK(0x17aa, 0x38fa, "Thinkbook 16P Gen5", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
7097 SND_PCI_QUIRK(0x17aa, 0x38fd, "ThinkBook plus Gen5 Hybrid", ALC287_FIXUP_TAS2781_I2C),
7098 SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
7099 SND_PCI_QUIRK(0x17aa, 0x390d, "Lenovo Yoga Pro 7 14ASP10", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
7100 SND_PCI_QUIRK(0x17aa, 0x3913, "Lenovo 145", ALC236_FIXUP_LENOVO_INV_DMIC),
7101 SND_PCI_QUIRK(0x17aa, 0x391f, "Yoga S990-16 pro Quad YC Quad", ALC287_FIXUP_TXNW2781_I2C),
7102 SND_PCI_QUIRK(0x17aa, 0x3920, "Yoga S990-16 pro Quad VECO Quad", ALC287_FIXUP_TXNW2781_I2C),
7103 SND_PCI_QUIRK(0x17aa, 0x3929, "Thinkbook 13x Gen 5", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
7104 SND_PCI_QUIRK(0x17aa, 0x392b, "Thinkbook 13x Gen 5", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
7105 SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
7106 SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
7107 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
7108 SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
7109 SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC),
7110 SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK),
7111 SND_PCI_QUIRK(0x17aa, 0x5026, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
7112 SND_PCI_QUIRK(0x17aa, 0x5034, "Thinkpad T450", ALC292_FIXUP_TPT440_DOCK),
7113 SND_PCI_QUIRK(0x17aa, 0x5036, "Thinkpad T450s", ALC292_FIXUP_TPT440_DOCK),
7114 SND_PCI_QUIRK(0x17aa, 0x503c, "Thinkpad L450", ALC292_FIXUP_TPT440_DOCK),
7115 SND_PCI_QUIRK(0x17aa, 0x504a, "ThinkPad X260", ALC292_FIXUP_TPT440_DOCK),
7116 SND_PCI_QUIRK(0x17aa, 0x504b, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
7117 SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460),
7118 SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460),
7119 SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460),
7120 SND_PCI_QUIRK(0x17aa, 0x505d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7121 SND_PCI_QUIRK(0x17aa, 0x505f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7122 SND_PCI_QUIRK(0x17aa, 0x5062, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7123 SND_PCI_QUIRK(0x17aa, 0x508b, "Thinkpad X12 Gen 1", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
7124 SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
7125 SND_PCI_QUIRK(0x17aa, 0x511e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7126 SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7127 SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
7128 SND_PCI_QUIRK(0x17aa, 0x9e56, "Lenovo ZhaoYang CF4620Z", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
7129 SND_PCI_QUIRK(0x1849, 0x0269, "Positivo Master C6400", ALC269VB_FIXUP_ASUS_ZENBOOK),
7130 SND_PCI_QUIRK(0x1849, 0x1233, "ASRock NUC Box 1100", ALC233_FIXUP_NO_AUDIO_JACK),
7131 SND_PCI_QUIRK(0x1849, 0xa233, "Positivo Master C6300", ALC269_FIXUP_HEADSET_MIC),
7132 SND_PCI_QUIRK(0x1854, 0x0440, "LG CQ6", ALC256_FIXUP_HEADPHONE_AMP_VOL),
7133 SND_PCI_QUIRK(0x1854, 0x0441, "LG CQ6 AIO", ALC256_FIXUP_HEADPHONE_AMP_VOL),
7134 SND_PCI_QUIRK(0x1854, 0x0488, "LG gram 16 (16Z90R)", ALC298_FIXUP_SAMSUNG_AMP_V2_4_AMPS),
7135 SND_PCI_QUIRK(0x1854, 0x0489, "LG gram 16 (16Z90R-A)", ALC298_FIXUP_SAMSUNG_AMP_V2_4_AMPS),
7136 SND_PCI_QUIRK(0x1854, 0x048a, "LG gram 17 (17ZD90R)", ALC298_FIXUP_SAMSUNG_AMP_V2_4_AMPS),
7137 SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS),
7138 SND_PCI_QUIRK(0x19e5, 0x320f, "Huawei WRT-WX9 ", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
7139 SND_PCI_QUIRK(0x19e5, 0x3212, "Huawei KLV-WX9 ", ALC256_FIXUP_ACER_HEADSET_MIC),
7140 SND_PCI_QUIRK(0x1b35, 0x1235, "CZC B20", ALC269_FIXUP_CZC_B20),
7141 SND_PCI_QUIRK(0x1b35, 0x1236, "CZC TMI", ALC269_FIXUP_CZC_TMI),
7142 SND_PCI_QUIRK(0x1b35, 0x1237, "CZC L101", ALC269_FIXUP_CZC_L101),
7143 SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */
7144 SND_PCI_QUIRK(0x1c06, 0x2013, "Lemote A1802", ALC269_FIXUP_LEMOTE_A1802),
7145 SND_PCI_QUIRK(0x1c06, 0x2015, "Lemote A190X", ALC269_FIXUP_LEMOTE_A190X),
7146 SND_PCI_QUIRK(0x1c6c, 0x122a, "Positivo N14AP7", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
7147 SND_PCI_QUIRK(0x1c6c, 0x1251, "Positivo N14KP6-TG", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE),
7148 SND_PCI_QUIRK(0x1d05, 0x1132, "TongFang PHxTxX1", ALC256_FIXUP_SET_COEF_DEFAULTS),
7149 SND_PCI_QUIRK(0x1d05, 0x1096, "TongFang GMxMRxx", ALC269_FIXUP_NO_SHUTUP),
7150 SND_PCI_QUIRK(0x1d05, 0x1100, "TongFang GKxNRxx", ALC269_FIXUP_NO_SHUTUP),
7151 SND_PCI_QUIRK(0x1d05, 0x1111, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
7152 SND_PCI_QUIRK(0x1d05, 0x1119, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
7153 SND_PCI_QUIRK(0x1d05, 0x1129, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
7154 SND_PCI_QUIRK(0x1d05, 0x1147, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP),
7155 SND_PCI_QUIRK(0x1d05, 0x115c, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP),
7156 SND_PCI_QUIRK(0x1d05, 0x121b, "TongFang GMxAGxx", ALC269_FIXUP_NO_SHUTUP),
7157 SND_PCI_QUIRK(0x1d05, 0x1387, "TongFang GMxIXxx", ALC2XX_FIXUP_HEADSET_MIC),
7158 SND_PCI_QUIRK(0x1d05, 0x1409, "TongFang GMxIXxx", ALC2XX_FIXUP_HEADSET_MIC),
7159 SND_PCI_QUIRK(0x1d05, 0x300f, "TongFang X6AR5xxY", ALC2XX_FIXUP_HEADSET_MIC),
7160 SND_PCI_QUIRK(0x1d05, 0x3019, "TongFang X6FR5xxY", ALC2XX_FIXUP_HEADSET_MIC),
7161 SND_PCI_QUIRK(0x1d17, 0x3288, "Haier Boyue G42", ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS),
7162 SND_PCI_QUIRK(0x1d72, 0x1602, "RedmiBook", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
7163 SND_PCI_QUIRK(0x1d72, 0x1701, "XiaomiNotebook Pro", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE),
7164 SND_PCI_QUIRK(0x1d72, 0x1901, "RedmiBook 14", ALC256_FIXUP_ASUS_HEADSET_MIC),
7165 SND_PCI_QUIRK(0x1d72, 0x1945, "Redmi G", ALC256_FIXUP_ASUS_HEADSET_MIC),
7166 SND_PCI_QUIRK(0x1d72, 0x1947, "RedmiBook Air", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
7167 SND_PCI_QUIRK(0x1ee7, 0x2078, "HONOR BRB-X M1010", ALC2XX_FIXUP_HEADSET_MIC),
7168 SND_PCI_QUIRK(0x1f66, 0x0105, "Ayaneo Portable Game Player", ALC287_FIXUP_CS35L41_I2C_2),
7169 SND_PCI_QUIRK(0x2014, 0x800a, "Positivo ARN50", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
7170 SND_PCI_QUIRK(0x2782, 0x0214, "VAIO VJFE-CL", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
7171 SND_PCI_QUIRK(0x2782, 0x0228, "Infinix ZERO BOOK 13", ALC269VB_FIXUP_INFINIX_ZERO_BOOK_13),
7172 SND_PCI_QUIRK(0x2782, 0x0232, "CHUWI CoreBook XPro", ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO),
7173 SND_PCI_QUIRK(0x2782, 0x1407, "Positivo P15X", ALC269_FIXUP_POSITIVO_P15X_HEADSET_MIC),
7174 SND_PCI_QUIRK(0x2782, 0x1409, "Positivo K116J", ALC269_FIXUP_POSITIVO_P15X_HEADSET_MIC),
7175 SND_PCI_QUIRK(0x2782, 0x1701, "Infinix Y4 Max", ALC269VC_FIXUP_INFINIX_Y4_MAX),
7176 SND_PCI_QUIRK(0x2782, 0x1705, "MEDION E15433", ALC269VC_FIXUP_INFINIX_Y4_MAX),
7177 SND_PCI_QUIRK(0x2782, 0x1707, "Vaio VJFE-ADL", ALC298_FIXUP_SPK_VOLUME),
7178 SND_PCI_QUIRK(0x2782, 0x4900, "MEDION E15443", ALC233_FIXUP_MEDION_MTL_SPK),
7179 SND_PCI_QUIRK(0x8086, 0x2074, "Intel NUC 8", ALC233_FIXUP_INTEL_NUC8_DMIC),
7180 SND_PCI_QUIRK(0x8086, 0x2080, "Intel NUC 8 Rugged", ALC256_FIXUP_INTEL_NUC8_RUGGED),
7181 SND_PCI_QUIRK(0x8086, 0x2081, "Intel NUC 10", ALC256_FIXUP_INTEL_NUC10),
7182 SND_PCI_QUIRK(0x8086, 0x3038, "Intel NUC 13", ALC295_FIXUP_CHROME_BOOK),
7183 SND_PCI_QUIRK(0xf111, 0x0001, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
7184 SND_PCI_QUIRK(0xf111, 0x0006, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
7185 SND_PCI_QUIRK(0xf111, 0x0009, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
7186 SND_PCI_QUIRK(0xf111, 0x000b, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
7187 SND_PCI_QUIRK(0xf111, 0x000c, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
7188
7189 #if 0
7190 /* Below is a quirk table taken from the old code.
7191 * Basically the device should work as is without the fixup table.
7192 * If BIOS doesn't give a proper info, enable the corresponding
7193 * fixup entry.
7194 */
7195 SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
7196 ALC269_FIXUP_AMIC),
7197 SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC),
7198 SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC),
7199 SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC),
7200 SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC),
7201 SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269_FIXUP_AMIC),
7202 SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269_FIXUP_AMIC),
7203 SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269_FIXUP_AMIC),
7204 SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_FIXUP_AMIC),
7205 SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269_FIXUP_AMIC),
7206 SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_FIXUP_AMIC),
7207 SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_FIXUP_AMIC),
7208 SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_FIXUP_AMIC),
7209 SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_FIXUP_AMIC),
7210 SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_FIXUP_AMIC),
7211 SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_FIXUP_AMIC),
7212 SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_FIXUP_AMIC),
7213 SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_FIXUP_AMIC),
7214 SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_FIXUP_AMIC),
7215 SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_FIXUP_AMIC),
7216 SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_FIXUP_AMIC),
7217 SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_FIXUP_AMIC),
7218 SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_FIXUP_AMIC),
7219 SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_FIXUP_AMIC),
7220 SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_FIXUP_AMIC),
7221 SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_FIXUP_AMIC),
7222 SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_FIXUP_AMIC),
7223 SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_FIXUP_AMIC),
7224 SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_FIXUP_AMIC),
7225 SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_FIXUP_AMIC),
7226 SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_FIXUP_AMIC),
7227 SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_FIXUP_AMIC),
7228 SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_FIXUP_AMIC),
7229 SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_FIXUP_AMIC),
7230 SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_FIXUP_AMIC),
7231 SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_FIXUP_DMIC),
7232 SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_FIXUP_AMIC),
7233 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_AMIC),
7234 SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_FIXUP_DMIC),
7235 SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_FIXUP_DMIC),
7236 #endif
7237 {}
7238 };
7239
7240 static const struct hda_quirk alc269_fixup_vendor_tbl[] = {
7241 SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
7242 SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED),
7243 SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
7244 SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo XPAD", ALC269_FIXUP_LENOVO_XPAD_ACPI),
7245 SND_PCI_QUIRK_VENDOR(0x19e5, "Huawei Matebook", ALC255_FIXUP_MIC_MUTE_LED),
7246 {}
7247 };
7248
7249 static const struct hda_model_fixup alc269_fixup_models[] = {
7250 {.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"},
7251 {.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"},
7252 {.id = ALC269_FIXUP_STEREO_DMIC, .name = "alc269-dmic"},
7253 {.id = ALC271_FIXUP_DMIC, .name = "alc271-dmic"},
7254 {.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"},
7255 {.id = ALC269_FIXUP_HEADSET_MIC, .name = "headset-mic"},
7256 {.id = ALC269_FIXUP_HEADSET_MODE, .name = "headset-mode"},
7257 {.id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, .name = "headset-mode-no-hp-mic"},
7258 {.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
7259 {.id = ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST, .name = "lenovo-dock-limit-boost"},
7260 {.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
7261 {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic1-led"},
7262 {.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
7263 {.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
7264 {.id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, .name = "dell-headset3"},
7265 {.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, .name = "dell-headset4"},
7266 {.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET, .name = "dell-headset4-quiet"},
7267 {.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},
7268 {.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"},
7269 {.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
7270 {.id = ALC292_FIXUP_TPT440, .name = "tpt440"},
7271 {.id = ALC292_FIXUP_TPT460, .name = "tpt460"},
7272 {.id = ALC298_FIXUP_TPT470_DOCK_FIX, .name = "tpt470-dock-fix"},
7273 {.id = ALC298_FIXUP_TPT470_DOCK, .name = "tpt470-dock"},
7274 {.id = ALC233_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
7275 {.id = ALC700_FIXUP_INTEL_REFERENCE, .name = "alc700-ref"},
7276 {.id = ALC269_FIXUP_SONY_VAIO, .name = "vaio"},
7277 {.id = ALC269_FIXUP_DELL_M101Z, .name = "dell-m101z"},
7278 {.id = ALC269_FIXUP_ASUS_G73JW, .name = "asus-g73jw"},
7279 {.id = ALC269_FIXUP_LENOVO_EAPD, .name = "lenovo-eapd"},
7280 {.id = ALC275_FIXUP_SONY_HWEQ, .name = "sony-hweq"},
7281 {.id = ALC269_FIXUP_PCM_44K, .name = "pcm44k"},
7282 {.id = ALC269_FIXUP_LIFEBOOK, .name = "lifebook"},
7283 {.id = ALC269_FIXUP_LIFEBOOK_EXTMIC, .name = "lifebook-extmic"},
7284 {.id = ALC269_FIXUP_LIFEBOOK_HP_PIN, .name = "lifebook-hp-pin"},
7285 {.id = ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC, .name = "lifebook-u7x7"},
7286 {.id = ALC269VB_FIXUP_AMIC, .name = "alc269vb-amic"},
7287 {.id = ALC269VB_FIXUP_DMIC, .name = "alc269vb-dmic"},
7288 {.id = ALC269_FIXUP_HP_MUTE_LED_MIC1, .name = "hp-mute-led-mic1"},
7289 {.id = ALC269_FIXUP_HP_MUTE_LED_MIC2, .name = "hp-mute-led-mic2"},
7290 {.id = ALC269_FIXUP_HP_MUTE_LED_MIC3, .name = "hp-mute-led-mic3"},
7291 {.id = ALC269_FIXUP_HP_GPIO_MIC1_LED, .name = "hp-gpio-mic1"},
7292 {.id = ALC269_FIXUP_HP_LINE1_MIC1_LED, .name = "hp-line1-mic1"},
7293 {.id = ALC269_FIXUP_NO_SHUTUP, .name = "noshutup"},
7294 {.id = ALC286_FIXUP_SONY_MIC_NO_PRESENCE, .name = "sony-nomic"},
7295 {.id = ALC269_FIXUP_ASPIRE_HEADSET_MIC, .name = "aspire-headset-mic"},
7296 {.id = ALC269_FIXUP_ASUS_X101, .name = "asus-x101"},
7297 {.id = ALC271_FIXUP_HP_GATE_MIC_JACK, .name = "acer-ao7xx"},
7298 {.id = ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572, .name = "acer-aspire-e1"},
7299 {.id = ALC269_FIXUP_ACER_AC700, .name = "acer-ac700"},
7300 {.id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST, .name = "limit-mic-boost"},
7301 {.id = ALC269VB_FIXUP_ASUS_ZENBOOK, .name = "asus-zenbook"},
7302 {.id = ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A, .name = "asus-zenbook-ux31a"},
7303 {.id = ALC269VB_FIXUP_ORDISSIMO_EVE2, .name = "ordissimo"},
7304 {.id = ALC282_FIXUP_ASUS_TX300, .name = "asus-tx300"},
7305 {.id = ALC283_FIXUP_INT_MIC, .name = "alc283-int-mic"},
7306 {.id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK, .name = "mono-speakers"},
7307 {.id = ALC290_FIXUP_SUBWOOFER_HSJACK, .name = "alc290-subwoofer"},
7308 {.id = ALC269_FIXUP_THINKPAD_ACPI, .name = "thinkpad"},
7309 {.id = ALC269_FIXUP_LENOVO_XPAD_ACPI, .name = "lenovo-xpad-led"},
7310 {.id = ALC269_FIXUP_DMIC_THINKPAD_ACPI, .name = "dmic-thinkpad"},
7311 {.id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE, .name = "alc255-acer"},
7312 {.id = ALC255_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc255-asus"},
7313 {.id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc255-dell1"},
7314 {.id = ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "alc255-dell2"},
7315 {.id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc293-dell1"},
7316 {.id = ALC283_FIXUP_HEADSET_MIC, .name = "alc283-headset"},
7317 {.id = ALC255_FIXUP_MIC_MUTE_LED, .name = "alc255-dell-mute"},
7318 {.id = ALC282_FIXUP_ASPIRE_V5_PINS, .name = "aspire-v5"},
7319 {.id = ALC269VB_FIXUP_ASPIRE_E1_COEF, .name = "aspire-e1-coef"},
7320 {.id = ALC280_FIXUP_HP_GPIO4, .name = "hp-gpio4"},
7321 {.id = ALC286_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
7322 {.id = ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY, .name = "hp-gpio2-hotkey"},
7323 {.id = ALC280_FIXUP_HP_DOCK_PINS, .name = "hp-dock-pins"},
7324 {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic"},
7325 {.id = ALC280_FIXUP_HP_9480M, .name = "hp-9480m"},
7326 {.id = ALC288_FIXUP_DELL_HEADSET_MODE, .name = "alc288-dell-headset"},
7327 {.id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc288-dell1"},
7328 {.id = ALC288_FIXUP_DELL_XPS_13, .name = "alc288-dell-xps13"},
7329 {.id = ALC292_FIXUP_DELL_E7X, .name = "dell-e7x"},
7330 {.id = ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK, .name = "alc293-dell"},
7331 {.id = ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc298-dell1"},
7332 {.id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, .name = "alc298-dell-aio"},
7333 {.id = ALC275_FIXUP_DELL_XPS, .name = "alc275-dell-xps"},
7334 {.id = ALC293_FIXUP_LENOVO_SPK_NOISE, .name = "lenovo-spk-noise"},
7335 {.id = ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, .name = "lenovo-hotkey"},
7336 {.id = ALC255_FIXUP_DELL_SPK_NOISE, .name = "dell-spk-noise"},
7337 {.id = ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc225-dell1"},
7338 {.id = ALC295_FIXUP_DISABLE_DAC3, .name = "alc295-disable-dac3"},
7339 {.id = ALC285_FIXUP_SPEAKER2_TO_DAC1, .name = "alc285-speaker2-to-dac1"},
7340 {.id = ALC280_FIXUP_HP_HEADSET_MIC, .name = "alc280-hp-headset"},
7341 {.id = ALC221_FIXUP_HP_FRONT_MIC, .name = "alc221-hp-mic"},
7342 {.id = ALC298_FIXUP_SPK_VOLUME, .name = "alc298-spk-volume"},
7343 {.id = ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER, .name = "dell-inspiron-7559"},
7344 {.id = ALC269_FIXUP_ATIV_BOOK_8, .name = "ativ-book"},
7345 {.id = ALC221_FIXUP_HP_MIC_NO_PRESENCE, .name = "alc221-hp-mic"},
7346 {.id = ALC256_FIXUP_ASUS_HEADSET_MODE, .name = "alc256-asus-headset"},
7347 {.id = ALC256_FIXUP_ASUS_MIC, .name = "alc256-asus-mic"},
7348 {.id = ALC256_FIXUP_ASUS_AIO_GPIO2, .name = "alc256-asus-aio"},
7349 {.id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc233-asus"},
7350 {.id = ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE, .name = "alc233-eapd"},
7351 {.id = ALC294_FIXUP_LENOVO_MIC_LOCATION, .name = "alc294-lenovo-mic"},
7352 {.id = ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE, .name = "alc225-wyse"},
7353 {.id = ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, .name = "alc274-dell-aio"},
7354 {.id = ALC255_FIXUP_DUMMY_LINEOUT_VERB, .name = "alc255-dummy-lineout"},
7355 {.id = ALC255_FIXUP_DELL_HEADSET_MIC, .name = "alc255-dell-headset"},
7356 {.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"},
7357 {.id = ALC225_FIXUP_HEADSET_JACK, .name = "alc-headset-jack"},
7358 {.id = ALC295_FIXUP_CHROME_BOOK, .name = "alc-chrome-book"},
7359 {.id = ALC256_FIXUP_CHROME_BOOK, .name = "alc-2024y-chromebook"},
7360 {.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"},
7361 {.id = ALC298_FIXUP_HUAWEI_MBX_STEREO, .name = "huawei-mbx-stereo"},
7362 {.id = ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, .name = "alc256-medion-headset"},
7363 {.id = ALC298_FIXUP_SAMSUNG_AMP, .name = "alc298-samsung-amp"},
7364 {.id = ALC298_FIXUP_SAMSUNG_AMP_V2_2_AMPS, .name = "alc298-samsung-amp-v2-2-amps"},
7365 {.id = ALC298_FIXUP_SAMSUNG_AMP_V2_4_AMPS, .name = "alc298-samsung-amp-v2-4-amps"},
7366 {.id = ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET, .name = "alc256-samsung-headphone"},
7367 {.id = ALC255_FIXUP_XIAOMI_HEADSET_MIC, .name = "alc255-xiaomi-headset"},
7368 {.id = ALC274_FIXUP_HP_MIC, .name = "alc274-hp-mic-detect"},
7369 {.id = ALC245_FIXUP_HP_X360_AMP, .name = "alc245-hp-x360-amp"},
7370 {.id = ALC295_FIXUP_HP_OMEN, .name = "alc295-hp-omen"},
7371 {.id = ALC285_FIXUP_HP_SPECTRE_X360, .name = "alc285-hp-spectre-x360"},
7372 {.id = ALC285_FIXUP_HP_SPECTRE_X360_EB1, .name = "alc285-hp-spectre-x360-eb1"},
7373 {.id = ALC285_FIXUP_HP_SPECTRE_X360_DF1, .name = "alc285-hp-spectre-x360-df1"},
7374 {.id = ALC285_FIXUP_HP_ENVY_X360, .name = "alc285-hp-envy-x360"},
7375 {.id = ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP, .name = "alc287-ideapad-bass-spk-amp"},
7376 {.id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN, .name = "alc287-yoga9-bass-spk-pin"},
7377 {.id = ALC623_FIXUP_LENOVO_THINKSTATION_P340, .name = "alc623-lenovo-thinkstation-p340"},
7378 {.id = ALC255_FIXUP_ACER_HEADPHONE_AND_MIC, .name = "alc255-acer-headphone-and-mic"},
7379 {.id = ALC285_FIXUP_HP_GPIO_AMP_INIT, .name = "alc285-hp-amp-init"},
7380 {.id = ALC236_FIXUP_LENOVO_INV_DMIC, .name = "alc236-fixup-lenovo-inv-mic"},
7381 {.id = ALC2XX_FIXUP_HEADSET_MIC, .name = "alc2xx-fixup-headset-mic"},
7382 {}
7383 };
7384 #define ALC225_STANDARD_PINS \
7385 {0x21, 0x04211020}
7386
7387 #define ALC256_STANDARD_PINS \
7388 {0x12, 0x90a60140}, \
7389 {0x14, 0x90170110}, \
7390 {0x21, 0x02211020}
7391
7392 #define ALC282_STANDARD_PINS \
7393 {0x14, 0x90170110}
7394
7395 #define ALC290_STANDARD_PINS \
7396 {0x12, 0x99a30130}
7397
7398 #define ALC292_STANDARD_PINS \
7399 {0x14, 0x90170110}, \
7400 {0x15, 0x0221401f}
7401
7402 #define ALC295_STANDARD_PINS \
7403 {0x12, 0xb7a60130}, \
7404 {0x14, 0x90170110}, \
7405 {0x21, 0x04211020}
7406
7407 #define ALC298_STANDARD_PINS \
7408 {0x12, 0x90a60130}, \
7409 {0x21, 0x03211020}
7410
7411 static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
7412 SND_HDA_PIN_QUIRK(0x10ec0221, 0x103c, "HP Workstation", ALC221_FIXUP_HP_HEADSET_MIC,
7413 {0x14, 0x01014020},
7414 {0x17, 0x90170110},
7415 {0x18, 0x02a11030},
7416 {0x19, 0x0181303F},
7417 {0x21, 0x0221102f}),
7418 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1025, "Acer", ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
7419 {0x12, 0x90a601c0},
7420 {0x14, 0x90171120},
7421 {0x21, 0x02211030}),
7422 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
7423 {0x14, 0x90170110},
7424 {0x1b, 0x90a70130},
7425 {0x21, 0x03211020}),
7426 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
7427 {0x1a, 0x90a70130},
7428 {0x1b, 0x90170110},
7429 {0x21, 0x03211020}),
7430 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
7431 ALC225_STANDARD_PINS,
7432 {0x12, 0xb7a60130},
7433 {0x14, 0x901701a0}),
7434 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
7435 ALC225_STANDARD_PINS,
7436 {0x12, 0xb7a60130},
7437 {0x14, 0x901701b0}),
7438 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
7439 ALC225_STANDARD_PINS,
7440 {0x12, 0xb7a60150},
7441 {0x14, 0x901701a0}),
7442 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
7443 ALC225_STANDARD_PINS,
7444 {0x12, 0xb7a60150},
7445 {0x14, 0x901701b0}),
7446 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
7447 ALC225_STANDARD_PINS,
7448 {0x12, 0xb7a60130},
7449 {0x1b, 0x90170110}),
7450 SND_HDA_PIN_QUIRK(0x10ec0233, 0x8086, "Intel NUC Skull Canyon", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
7451 {0x1b, 0x01111010},
7452 {0x1e, 0x01451130},
7453 {0x21, 0x02211020}),
7454 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
7455 {0x12, 0x90a60140},
7456 {0x14, 0x90170110},
7457 {0x19, 0x02a11030},
7458 {0x21, 0x02211020}),
7459 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
7460 {0x14, 0x90170110},
7461 {0x19, 0x02a11030},
7462 {0x1a, 0x02a11040},
7463 {0x1b, 0x01014020},
7464 {0x21, 0x0221101f}),
7465 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
7466 {0x14, 0x90170110},
7467 {0x19, 0x02a11030},
7468 {0x1a, 0x02a11040},
7469 {0x1b, 0x01011020},
7470 {0x21, 0x0221101f}),
7471 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
7472 {0x14, 0x90170110},
7473 {0x19, 0x02a11020},
7474 {0x1a, 0x02a11030},
7475 {0x21, 0x0221101f}),
7476 SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
7477 {0x21, 0x02211010}),
7478 SND_HDA_PIN_QUIRK(0x10ec0236, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
7479 {0x14, 0x90170110},
7480 {0x19, 0x02a11020},
7481 {0x21, 0x02211030}),
7482 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
7483 {0x14, 0x90170110},
7484 {0x21, 0x02211020}),
7485 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7486 {0x14, 0x90170130},
7487 {0x21, 0x02211040}),
7488 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7489 {0x12, 0x90a60140},
7490 {0x14, 0x90170110},
7491 {0x21, 0x02211020}),
7492 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7493 {0x12, 0x90a60160},
7494 {0x14, 0x90170120},
7495 {0x21, 0x02211030}),
7496 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7497 {0x14, 0x90170110},
7498 {0x1b, 0x02011020},
7499 {0x21, 0x0221101f}),
7500 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7501 {0x14, 0x90170110},
7502 {0x1b, 0x01011020},
7503 {0x21, 0x0221101f}),
7504 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7505 {0x14, 0x90170130},
7506 {0x1b, 0x01014020},
7507 {0x21, 0x0221103f}),
7508 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7509 {0x14, 0x90170130},
7510 {0x1b, 0x01011020},
7511 {0x21, 0x0221103f}),
7512 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7513 {0x14, 0x90170130},
7514 {0x1b, 0x02011020},
7515 {0x21, 0x0221103f}),
7516 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7517 {0x14, 0x90170150},
7518 {0x1b, 0x02011020},
7519 {0x21, 0x0221105f}),
7520 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7521 {0x14, 0x90170110},
7522 {0x1b, 0x01014020},
7523 {0x21, 0x0221101f}),
7524 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7525 {0x12, 0x90a60160},
7526 {0x14, 0x90170120},
7527 {0x17, 0x90170140},
7528 {0x21, 0x0321102f}),
7529 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7530 {0x12, 0x90a60160},
7531 {0x14, 0x90170130},
7532 {0x21, 0x02211040}),
7533 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7534 {0x12, 0x90a60160},
7535 {0x14, 0x90170140},
7536 {0x21, 0x02211050}),
7537 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7538 {0x12, 0x90a60170},
7539 {0x14, 0x90170120},
7540 {0x21, 0x02211030}),
7541 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7542 {0x12, 0x90a60170},
7543 {0x14, 0x90170130},
7544 {0x21, 0x02211040}),
7545 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7546 {0x12, 0x90a60170},
7547 {0x14, 0x90171130},
7548 {0x21, 0x02211040}),
7549 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7550 {0x12, 0x90a60170},
7551 {0x14, 0x90170140},
7552 {0x21, 0x02211050}),
7553 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5548", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7554 {0x12, 0x90a60180},
7555 {0x14, 0x90170130},
7556 {0x21, 0x02211040}),
7557 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5565", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7558 {0x12, 0x90a60180},
7559 {0x14, 0x90170120},
7560 {0x21, 0x02211030}),
7561 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7562 {0x1b, 0x01011020},
7563 {0x21, 0x02211010}),
7564 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
7565 {0x14, 0x90170110},
7566 {0x1b, 0x90a70130},
7567 {0x21, 0x04211020}),
7568 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
7569 {0x14, 0x90170110},
7570 {0x1b, 0x90a70130},
7571 {0x21, 0x03211020}),
7572 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
7573 {0x12, 0x90a60130},
7574 {0x14, 0x90170110},
7575 {0x21, 0x03211020}),
7576 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
7577 {0x12, 0x90a60130},
7578 {0x14, 0x90170110},
7579 {0x21, 0x04211020}),
7580 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
7581 {0x1a, 0x90a70130},
7582 {0x1b, 0x90170110},
7583 {0x21, 0x03211020}),
7584 SND_HDA_PIN_QUIRK(0x10ec0256, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
7585 {0x14, 0x90170110},
7586 {0x19, 0x02a11020},
7587 {0x21, 0x0221101f}),
7588 SND_HDA_PIN_QUIRK(0x10ec0274, 0x103c, "HP", ALC274_FIXUP_HP_HEADSET_MIC,
7589 {0x17, 0x90170110},
7590 {0x19, 0x03a11030},
7591 {0x21, 0x03211020}),
7592 SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
7593 {0x12, 0x90a60130},
7594 {0x14, 0x90170110},
7595 {0x15, 0x0421101f},
7596 {0x1a, 0x04a11020}),
7597 SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED,
7598 {0x12, 0x90a60140},
7599 {0x14, 0x90170110},
7600 {0x15, 0x0421101f},
7601 {0x18, 0x02811030},
7602 {0x1a, 0x04a1103f},
7603 {0x1b, 0x02011020}),
7604 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP 15 Touchsmart", ALC269_FIXUP_HP_MUTE_LED_MIC1,
7605 ALC282_STANDARD_PINS,
7606 {0x12, 0x99a30130},
7607 {0x19, 0x03a11020},
7608 {0x21, 0x0321101f}),
7609 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
7610 ALC282_STANDARD_PINS,
7611 {0x12, 0x99a30130},
7612 {0x19, 0x03a11020},
7613 {0x21, 0x03211040}),
7614 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
7615 ALC282_STANDARD_PINS,
7616 {0x12, 0x99a30130},
7617 {0x19, 0x03a11030},
7618 {0x21, 0x03211020}),
7619 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
7620 ALC282_STANDARD_PINS,
7621 {0x12, 0x99a30130},
7622 {0x19, 0x04a11020},
7623 {0x21, 0x0421101f}),
7624 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED,
7625 ALC282_STANDARD_PINS,
7626 {0x12, 0x90a60140},
7627 {0x19, 0x04a11030},
7628 {0x21, 0x04211020}),
7629 SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
7630 ALC282_STANDARD_PINS,
7631 {0x12, 0x90a609c0},
7632 {0x18, 0x03a11830},
7633 {0x19, 0x04a19831},
7634 {0x1a, 0x0481303f},
7635 {0x1b, 0x04211020},
7636 {0x21, 0x0321101f}),
7637 SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
7638 ALC282_STANDARD_PINS,
7639 {0x12, 0x90a60940},
7640 {0x18, 0x03a11830},
7641 {0x19, 0x04a19831},
7642 {0x1a, 0x0481303f},
7643 {0x1b, 0x04211020},
7644 {0x21, 0x0321101f}),
7645 SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
7646 ALC282_STANDARD_PINS,
7647 {0x12, 0x90a60130},
7648 {0x21, 0x0321101f}),
7649 SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
7650 {0x12, 0x90a60160},
7651 {0x14, 0x90170120},
7652 {0x21, 0x02211030}),
7653 SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
7654 ALC282_STANDARD_PINS,
7655 {0x12, 0x90a60130},
7656 {0x19, 0x03a11020},
7657 {0x21, 0x0321101f}),
7658 SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
7659 {0x12, 0x90a60130},
7660 {0x14, 0x90170110},
7661 {0x19, 0x04a11040},
7662 {0x21, 0x04211020}),
7663 SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
7664 {0x14, 0x90170110},
7665 {0x19, 0x04a11040},
7666 {0x1d, 0x40600001},
7667 {0x21, 0x04211020}),
7668 SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
7669 {0x14, 0x90170110},
7670 {0x19, 0x04a11040},
7671 {0x21, 0x04211020}),
7672 SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_HEADSET_JACK,
7673 {0x14, 0x90170110},
7674 {0x17, 0x90170111},
7675 {0x19, 0x03a11030},
7676 {0x21, 0x03211020}),
7677 SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC287_FIXUP_THINKPAD_I2S_SPK,
7678 {0x17, 0x90170110},
7679 {0x19, 0x03a11030},
7680 {0x21, 0x03211020}),
7681 SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC287_FIXUP_THINKPAD_I2S_SPK,
7682 {0x17, 0x90170110}, /* 0x231f with RTK I2S AMP */
7683 {0x19, 0x04a11040},
7684 {0x21, 0x04211020}),
7685 SND_HDA_PIN_QUIRK(0x10ec0286, 0x1025, "Acer", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
7686 {0x12, 0x90a60130},
7687 {0x17, 0x90170110},
7688 {0x21, 0x02211020}),
7689 SND_HDA_PIN_QUIRK(0x10ec0288, 0x1028, "Dell", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
7690 {0x12, 0x90a60120},
7691 {0x14, 0x90170110},
7692 {0x21, 0x0321101f}),
7693 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
7694 ALC290_STANDARD_PINS,
7695 {0x15, 0x04211040},
7696 {0x18, 0x90170112},
7697 {0x1a, 0x04a11020}),
7698 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
7699 ALC290_STANDARD_PINS,
7700 {0x15, 0x04211040},
7701 {0x18, 0x90170110},
7702 {0x1a, 0x04a11020}),
7703 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
7704 ALC290_STANDARD_PINS,
7705 {0x15, 0x0421101f},
7706 {0x1a, 0x04a11020}),
7707 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
7708 ALC290_STANDARD_PINS,
7709 {0x15, 0x04211020},
7710 {0x1a, 0x04a11040}),
7711 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
7712 ALC290_STANDARD_PINS,
7713 {0x14, 0x90170110},
7714 {0x15, 0x04211020},
7715 {0x1a, 0x04a11040}),
7716 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
7717 ALC290_STANDARD_PINS,
7718 {0x14, 0x90170110},
7719 {0x15, 0x04211020},
7720 {0x1a, 0x04a11020}),
7721 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
7722 ALC290_STANDARD_PINS,
7723 {0x14, 0x90170110},
7724 {0x15, 0x0421101f},
7725 {0x1a, 0x04a11020}),
7726 SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
7727 ALC292_STANDARD_PINS,
7728 {0x12, 0x90a60140},
7729 {0x16, 0x01014020},
7730 {0x19, 0x01a19030}),
7731 SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
7732 ALC292_STANDARD_PINS,
7733 {0x12, 0x90a60140},
7734 {0x16, 0x01014020},
7735 {0x18, 0x02a19031},
7736 {0x19, 0x01a1903e}),
7737 SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
7738 ALC292_STANDARD_PINS,
7739 {0x12, 0x90a60140}),
7740 SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
7741 ALC292_STANDARD_PINS,
7742 {0x13, 0x90a60140},
7743 {0x16, 0x21014020},
7744 {0x19, 0x21a19030}),
7745 SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
7746 ALC292_STANDARD_PINS,
7747 {0x13, 0x90a60140}),
7748 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_HPE,
7749 {0x17, 0x90170110},
7750 {0x21, 0x04211020}),
7751 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_MIC,
7752 {0x14, 0x90170110},
7753 {0x1b, 0x90a70130},
7754 {0x21, 0x04211020}),
7755 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
7756 {0x12, 0x90a60130},
7757 {0x17, 0x90170110},
7758 {0x21, 0x03211020}),
7759 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
7760 {0x12, 0x90a60130},
7761 {0x17, 0x90170110},
7762 {0x21, 0x04211020}),
7763 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
7764 {0x12, 0x90a60130},
7765 {0x17, 0x90170110},
7766 {0x21, 0x03211020}),
7767 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
7768 {0x12, 0x90a60120},
7769 {0x17, 0x90170110},
7770 {0x21, 0x04211030}),
7771 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
7772 {0x12, 0x90a60130},
7773 {0x17, 0x90170110},
7774 {0x21, 0x03211020}),
7775 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
7776 {0x12, 0x90a60130},
7777 {0x17, 0x90170110},
7778 {0x21, 0x03211020}),
7779 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
7780 ALC298_STANDARD_PINS,
7781 {0x17, 0x90170110}),
7782 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
7783 ALC298_STANDARD_PINS,
7784 {0x17, 0x90170140}),
7785 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
7786 ALC298_STANDARD_PINS,
7787 {0x17, 0x90170150}),
7788 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_SPK_VOLUME,
7789 {0x12, 0xb7a60140},
7790 {0x13, 0xb7a60150},
7791 {0x17, 0x90170110},
7792 {0x1a, 0x03011020},
7793 {0x21, 0x03211030}),
7794 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
7795 {0x12, 0xb7a60140},
7796 {0x17, 0x90170110},
7797 {0x1a, 0x03a11030},
7798 {0x21, 0x03211020}),
7799 SND_HDA_PIN_QUIRK(0x10ec0299, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
7800 ALC225_STANDARD_PINS,
7801 {0x12, 0xb7a60130},
7802 {0x17, 0x90170110}),
7803 SND_HDA_PIN_QUIRK(0x10ec0623, 0x17aa, "Lenovo", ALC283_FIXUP_HEADSET_MIC,
7804 {0x14, 0x01014010},
7805 {0x17, 0x90170120},
7806 {0x18, 0x02a11030},
7807 {0x19, 0x02a1103f},
7808 {0x21, 0x0221101f}),
7809 {}
7810 };
7811
7812 /* This is the fallback pin_fixup_tbl for alc269 family, to make the tbl match
7813 * more machines, don't need to match all valid pins, just need to match
7814 * all the pins defined in the tbl. Just because of this reason, it is possible
7815 * that a single machine matches multiple tbls, so there is one limitation:
7816 * at most one tbl is allowed to define for the same vendor and same codec
7817 */
7818 static const struct snd_hda_pin_quirk alc269_fallback_pin_fixup_tbl[] = {
7819 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1025, "Acer", ALC2XX_FIXUP_HEADSET_MIC,
7820 {0x19, 0x40000000}),
7821 SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
7822 {0x19, 0x40000000},
7823 {0x1b, 0x40000000}),
7824 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET,
7825 {0x19, 0x40000000},
7826 {0x1b, 0x40000000}),
7827 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7828 {0x19, 0x40000000},
7829 {0x1a, 0x40000000}),
7830 SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_LIMIT_INT_MIC_BOOST,
7831 {0x19, 0x40000000},
7832 {0x1a, 0x40000000}),
7833 SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC269_FIXUP_DELL1_LIMIT_INT_MIC_BOOST,
7834 {0x19, 0x40000000},
7835 {0x1a, 0x40000000}),
7836 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC2XX_FIXUP_HEADSET_MIC,
7837 {0x19, 0x40000000}),
7838 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1558, "Clevo", ALC2XX_FIXUP_HEADSET_MIC,
7839 {0x19, 0x40000000}),
7840 {}
7841 };
7842
alc269_fill_coef(struct hda_codec * codec)7843 static void alc269_fill_coef(struct hda_codec *codec)
7844 {
7845 struct alc_spec *spec = codec->spec;
7846 int val;
7847
7848 if (spec->codec_variant != ALC269_TYPE_ALC269VB)
7849 return;
7850
7851 if ((alc_get_coef0(codec) & 0x00ff) < 0x015) {
7852 alc_write_coef_idx(codec, 0xf, 0x960b);
7853 alc_write_coef_idx(codec, 0xe, 0x8817);
7854 }
7855
7856 if ((alc_get_coef0(codec) & 0x00ff) == 0x016) {
7857 alc_write_coef_idx(codec, 0xf, 0x960b);
7858 alc_write_coef_idx(codec, 0xe, 0x8814);
7859 }
7860
7861 if ((alc_get_coef0(codec) & 0x00ff) == 0x017) {
7862 /* Power up output pin */
7863 alc_update_coef_idx(codec, 0x04, 0, 1<<11);
7864 }
7865
7866 if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {
7867 val = alc_read_coef_idx(codec, 0xd);
7868 if (val != -1 && (val & 0x0c00) >> 10 != 0x1) {
7869 /* Capless ramp up clock control */
7870 alc_write_coef_idx(codec, 0xd, val | (1<<10));
7871 }
7872 val = alc_read_coef_idx(codec, 0x17);
7873 if (val != -1 && (val & 0x01c0) >> 6 != 0x4) {
7874 /* Class D power on reset */
7875 alc_write_coef_idx(codec, 0x17, val | (1<<7));
7876 }
7877 }
7878
7879 /* HP */
7880 alc_update_coef_idx(codec, 0x4, 0, 1<<11);
7881 }
7882
alc269_remove(struct hda_codec * codec)7883 static void alc269_remove(struct hda_codec *codec)
7884 {
7885 struct alc_spec *spec = codec->spec;
7886
7887 if (spec)
7888 hda_component_manager_free(&spec->comps, &comp_master_ops);
7889
7890 snd_hda_gen_remove(codec);
7891 }
7892
7893 /*
7894 */
alc269_probe(struct hda_codec * codec,const struct hda_device_id * id)7895 static int alc269_probe(struct hda_codec *codec, const struct hda_device_id *id)
7896 {
7897 struct alc_spec *spec;
7898 int err;
7899
7900 err = alc_alloc_spec(codec, 0x0b);
7901 if (err < 0)
7902 return err;
7903
7904 spec = codec->spec;
7905 spec->gen.shared_mic_vref_pin = 0x18;
7906 codec->power_save_node = 0;
7907 spec->en_3kpull_low = true;
7908
7909 spec->shutup = alc_default_shutup;
7910 spec->init_hook = alc_default_init;
7911
7912 switch (codec->core.vendor_id) {
7913 case 0x10ec0269:
7914 spec->codec_variant = ALC269_TYPE_ALC269VA;
7915 switch (alc_get_coef0(codec) & 0x00f0) {
7916 case 0x0010:
7917 if (codec->bus->pci &&
7918 codec->bus->pci->subsystem_vendor == 0x1025 &&
7919 spec->cdefine.platform_type == 1)
7920 err = alc_codec_rename(codec, "ALC271X");
7921 spec->codec_variant = ALC269_TYPE_ALC269VB;
7922 break;
7923 case 0x0020:
7924 if (codec->bus->pci &&
7925 codec->bus->pci->subsystem_vendor == 0x17aa &&
7926 codec->bus->pci->subsystem_device == 0x21f3)
7927 err = alc_codec_rename(codec, "ALC3202");
7928 spec->codec_variant = ALC269_TYPE_ALC269VC;
7929 break;
7930 case 0x0030:
7931 spec->codec_variant = ALC269_TYPE_ALC269VD;
7932 break;
7933 default:
7934 alc_fix_pll_init(codec, 0x20, 0x04, 15);
7935 }
7936 if (err < 0)
7937 goto error;
7938 spec->shutup = alc269_shutup;
7939 spec->init_hook = alc269_fill_coef;
7940 alc269_fill_coef(codec);
7941 break;
7942
7943 case 0x10ec0280:
7944 case 0x10ec0290:
7945 spec->codec_variant = ALC269_TYPE_ALC280;
7946 break;
7947 case 0x10ec0282:
7948 spec->codec_variant = ALC269_TYPE_ALC282;
7949 spec->shutup = alc282_shutup;
7950 spec->init_hook = alc282_init;
7951 break;
7952 case 0x10ec0233:
7953 case 0x10ec0283:
7954 spec->codec_variant = ALC269_TYPE_ALC283;
7955 spec->shutup = alc283_shutup;
7956 spec->init_hook = alc283_init;
7957 break;
7958 case 0x10ec0284:
7959 case 0x10ec0292:
7960 spec->codec_variant = ALC269_TYPE_ALC284;
7961 break;
7962 case 0x10ec0293:
7963 spec->codec_variant = ALC269_TYPE_ALC293;
7964 break;
7965 case 0x10ec0286:
7966 case 0x10ec0288:
7967 spec->codec_variant = ALC269_TYPE_ALC286;
7968 break;
7969 case 0x10ec0298:
7970 spec->codec_variant = ALC269_TYPE_ALC298;
7971 break;
7972 case 0x10ec0235:
7973 case 0x10ec0255:
7974 spec->codec_variant = ALC269_TYPE_ALC255;
7975 spec->shutup = alc256_shutup;
7976 spec->init_hook = alc256_init;
7977 break;
7978 case 0x10ec0230:
7979 case 0x10ec0236:
7980 case 0x10ec0256:
7981 case 0x19e58326:
7982 spec->codec_variant = ALC269_TYPE_ALC256;
7983 spec->shutup = alc256_shutup;
7984 spec->init_hook = alc256_init;
7985 spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */
7986 if (codec->core.vendor_id == 0x10ec0236 &&
7987 codec->bus->pci->vendor != PCI_VENDOR_ID_AMD)
7988 spec->en_3kpull_low = false;
7989 break;
7990 case 0x10ec0257:
7991 spec->codec_variant = ALC269_TYPE_ALC257;
7992 spec->shutup = alc256_shutup;
7993 spec->init_hook = alc256_init;
7994 spec->gen.mixer_nid = 0;
7995 spec->en_3kpull_low = false;
7996 break;
7997 case 0x10ec0215:
7998 case 0x10ec0245:
7999 case 0x10ec0285:
8000 case 0x10ec0289:
8001 if (alc_get_coef0(codec) & 0x0010)
8002 spec->codec_variant = ALC269_TYPE_ALC245;
8003 else
8004 spec->codec_variant = ALC269_TYPE_ALC215;
8005 spec->shutup = alc225_shutup;
8006 spec->init_hook = alc225_init;
8007 spec->gen.mixer_nid = 0;
8008 break;
8009 case 0x10ec0225:
8010 case 0x10ec0295:
8011 case 0x10ec0299:
8012 spec->codec_variant = ALC269_TYPE_ALC225;
8013 spec->shutup = alc225_shutup;
8014 spec->init_hook = alc225_init;
8015 spec->gen.mixer_nid = 0; /* no loopback on ALC225, ALC295 and ALC299 */
8016 break;
8017 case 0x10ec0287:
8018 spec->codec_variant = ALC269_TYPE_ALC287;
8019 spec->shutup = alc225_shutup;
8020 spec->init_hook = alc225_init;
8021 spec->gen.mixer_nid = 0; /* no loopback on ALC287 */
8022 break;
8023 case 0x10ec0234:
8024 case 0x10ec0274:
8025 case 0x10ec0294:
8026 spec->codec_variant = ALC269_TYPE_ALC294;
8027 spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */
8028 alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */
8029 spec->init_hook = alc294_init;
8030 break;
8031 case 0x10ec0300:
8032 spec->codec_variant = ALC269_TYPE_ALC300;
8033 spec->gen.mixer_nid = 0; /* no loopback on ALC300 */
8034 break;
8035 case 0x10ec0222:
8036 case 0x10ec0623:
8037 spec->codec_variant = ALC269_TYPE_ALC623;
8038 spec->shutup = alc222_shutup;
8039 spec->init_hook = alc222_init;
8040 break;
8041 case 0x10ec0700:
8042 case 0x10ec0701:
8043 case 0x10ec0703:
8044 case 0x10ec0711:
8045 spec->codec_variant = ALC269_TYPE_ALC700;
8046 spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */
8047 alc_update_coef_idx(codec, 0x4a, 1 << 15, 0); /* Combo jack auto trigger control */
8048 spec->init_hook = alc294_init;
8049 break;
8050
8051 }
8052
8053 if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) {
8054 spec->has_alc5505_dsp = 1;
8055 spec->init_hook = alc5505_dsp_init;
8056 }
8057
8058 alc_pre_init(codec);
8059
8060 snd_hda_pick_fixup(codec, alc269_fixup_models,
8061 alc269_fixup_tbl, alc269_fixups);
8062 /* FIXME: both TX300 and ROG Strix G17 have the same SSID, and
8063 * the quirk breaks the latter (bko#214101).
8064 * Clear the wrong entry.
8065 */
8066 if (codec->fixup_id == ALC282_FIXUP_ASUS_TX300 &&
8067 codec->core.vendor_id == 0x10ec0294) {
8068 codec_dbg(codec, "Clear wrong fixup for ASUS ROG Strix G17\n");
8069 codec->fixup_id = HDA_FIXUP_ID_NOT_SET;
8070 }
8071
8072 snd_hda_pick_pin_fixup(codec, alc269_pin_fixup_tbl, alc269_fixups, true);
8073 snd_hda_pick_pin_fixup(codec, alc269_fallback_pin_fixup_tbl, alc269_fixups, false);
8074 snd_hda_pick_fixup(codec, NULL, alc269_fixup_vendor_tbl,
8075 alc269_fixups);
8076
8077 /*
8078 * Check whether ACPI describes companion amplifiers that require
8079 * component binding
8080 */
8081 find_cirrus_companion_amps(codec);
8082
8083 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
8084
8085 alc_auto_parse_customize_define(codec);
8086
8087 if (has_cdefine_beep(codec))
8088 spec->gen.beep_nid = 0x01;
8089
8090 /* automatic parse from the BIOS config */
8091 err = alc269_parse_auto_config(codec);
8092 if (err < 0)
8093 goto error;
8094
8095 if (!spec->gen.no_analog && spec->gen.beep_nid && spec->gen.mixer_nid) {
8096 err = set_beep_amp(spec, spec->gen.mixer_nid, 0x04, HDA_INPUT);
8097 if (err < 0)
8098 goto error;
8099 }
8100
8101 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
8102
8103 return 0;
8104
8105 error:
8106 alc269_remove(codec);
8107 return err;
8108 }
8109
8110 static const struct hda_codec_ops alc269_codec_ops = {
8111 .probe = alc269_probe,
8112 .remove = alc269_remove,
8113 .build_controls = alc_build_controls,
8114 .build_pcms = snd_hda_gen_build_pcms,
8115 .init = alc_init,
8116 .unsol_event = snd_hda_jack_unsol_event,
8117 .suspend = alc269_suspend,
8118 .resume = alc269_resume,
8119 .check_power_status = snd_hda_gen_check_power_status,
8120 .stream_pm = snd_hda_gen_stream_pm,
8121 };
8122
8123 /*
8124 * driver entries
8125 */
8126 static const struct hda_device_id snd_hda_id_alc269[] = {
8127 HDA_CODEC_ID(0x10ec0215, "ALC215"),
8128 HDA_CODEC_ID(0x10ec0221, "ALC221"),
8129 HDA_CODEC_ID(0x10ec0222, "ALC222"),
8130 HDA_CODEC_ID(0x10ec0225, "ALC225"),
8131 HDA_CODEC_ID(0x10ec0230, "ALC236"),
8132 HDA_CODEC_ID(0x10ec0231, "ALC231"),
8133 HDA_CODEC_ID(0x10ec0233, "ALC233"),
8134 HDA_CODEC_ID(0x10ec0234, "ALC234"),
8135 HDA_CODEC_ID(0x10ec0235, "ALC233"),
8136 HDA_CODEC_ID(0x10ec0236, "ALC236"),
8137 HDA_CODEC_ID(0x10ec0245, "ALC245"),
8138 HDA_CODEC_ID(0x10ec0255, "ALC255"),
8139 HDA_CODEC_ID(0x10ec0256, "ALC256"),
8140 HDA_CODEC_ID(0x10ec0257, "ALC257"),
8141 HDA_CODEC_ID(0x10ec0269, "ALC269"),
8142 HDA_CODEC_ID(0x10ec0270, "ALC270"),
8143 HDA_CODEC_ID(0x10ec0274, "ALC274"),
8144 HDA_CODEC_ID(0x10ec0275, "ALC275"),
8145 HDA_CODEC_ID(0x10ec0276, "ALC276"),
8146 HDA_CODEC_ID(0x10ec0280, "ALC280"),
8147 HDA_CODEC_ID(0x10ec0282, "ALC282"),
8148 HDA_CODEC_ID(0x10ec0283, "ALC283"),
8149 HDA_CODEC_ID(0x10ec0284, "ALC284"),
8150 HDA_CODEC_ID(0x10ec0285, "ALC285"),
8151 HDA_CODEC_ID(0x10ec0286, "ALC286"),
8152 HDA_CODEC_ID(0x10ec0287, "ALC287"),
8153 HDA_CODEC_ID(0x10ec0288, "ALC288"),
8154 HDA_CODEC_ID(0x10ec0289, "ALC289"),
8155 HDA_CODEC_ID(0x10ec0290, "ALC290"),
8156 HDA_CODEC_ID(0x10ec0292, "ALC292"),
8157 HDA_CODEC_ID(0x10ec0293, "ALC293"),
8158 HDA_CODEC_ID(0x10ec0294, "ALC294"),
8159 HDA_CODEC_ID(0x10ec0295, "ALC295"),
8160 HDA_CODEC_ID(0x10ec0298, "ALC298"),
8161 HDA_CODEC_ID(0x10ec0299, "ALC299"),
8162 HDA_CODEC_ID(0x10ec0300, "ALC300"),
8163 HDA_CODEC_ID(0x10ec0623, "ALC623"),
8164 HDA_CODEC_ID(0x10ec0700, "ALC700"),
8165 HDA_CODEC_ID(0x10ec0701, "ALC701"),
8166 HDA_CODEC_ID(0x10ec0703, "ALC703"),
8167 HDA_CODEC_ID(0x10ec0711, "ALC711"),
8168 HDA_CODEC_ID(0x19e58326, "HW8326"),
8169 {} /* terminator */
8170 };
8171 MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_alc269);
8172
8173 MODULE_LICENSE("GPL");
8174 MODULE_DESCRIPTION("Realtek ALC269 and compatible HD-audio codecs");
8175 MODULE_IMPORT_NS("SND_HDA_CODEC_REALTEK");
8176 MODULE_IMPORT_NS("SND_HDA_SCODEC_COMPONENT");
8177
8178 static struct hda_codec_driver alc269_driver = {
8179 .id = snd_hda_id_alc269,
8180 .ops = &alc269_codec_ops,
8181 };
8182
8183 module_hda_codec_driver(alc269_driver);
8184