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