1
2
3
4
5
6
7
8
9
10
11
12
13#include <linux/init.h>
14#include <linux/delay.h>
15#include <linux/slab.h>
16#include <linux/pci.h>
17#include <linux/dmi.h>
18#include <linux/module.h>
19#include <linux/input.h>
20#include <linux/leds.h>
21#include <sound/core.h>
22#include <sound/jack.h>
23#include <sound/hda_codec.h>
24#include "hda_local.h"
25#include "hda_auto_parser.h"
26#include "hda_jack.h"
27#include "hda_generic.h"
28#include "hda_component.h"
29
30
31#define HALT_REALTEK_ALC5505
32
33
34enum {
35 ALC_INIT_UNDEFINED,
36 ALC_INIT_NONE,
37 ALC_INIT_DEFAULT,
38};
39
40enum {
41 ALC_HEADSET_MODE_UNKNOWN,
42 ALC_HEADSET_MODE_UNPLUGGED,
43 ALC_HEADSET_MODE_HEADSET,
44 ALC_HEADSET_MODE_MIC,
45 ALC_HEADSET_MODE_HEADPHONE,
46};
47
48enum {
49 ALC_HEADSET_TYPE_UNKNOWN,
50 ALC_HEADSET_TYPE_CTIA,
51 ALC_HEADSET_TYPE_OMTP,
52};
53
54enum {
55 ALC_KEY_MICMUTE_INDEX,
56};
57
58struct alc_customize_define {
59 unsigned int sku_cfg;
60 unsigned char port_connectivity;
61 unsigned char check_sum;
62 unsigned char customization;
63 unsigned char external_amp;
64 unsigned int enable_pcbeep:1;
65 unsigned int platform_type:1;
66 unsigned int swap:1;
67 unsigned int override:1;
68 unsigned int fixup:1;
69};
70
71struct alc_coef_led {
72 unsigned int idx;
73 unsigned int mask;
74 unsigned int on;
75 unsigned int off;
76};
77
78struct alc_spec {
79 struct hda_gen_spec gen;
80
81
82 struct alc_customize_define cdefine;
83 unsigned int parse_flags;
84
85
86 unsigned int gpio_mask;
87 unsigned int gpio_dir;
88 unsigned int gpio_data;
89 bool gpio_write_delay;
90
91
92 int mute_led_polarity;
93 int micmute_led_polarity;
94 hda_nid_t mute_led_nid;
95 hda_nid_t cap_mute_led_nid;
96
97 unsigned int gpio_mute_led_mask;
98 unsigned int gpio_mic_led_mask;
99 struct alc_coef_led mute_led_coef;
100 struct alc_coef_led mic_led_coef;
101 struct mutex coef_mutex;
102
103 hda_nid_t headset_mic_pin;
104 hda_nid_t headphone_mic_pin;
105 int current_headset_mode;
106 int current_headset_type;
107
108
109 void (*init_hook)(struct hda_codec *codec);
110#ifdef CONFIG_PM
111 void (*power_hook)(struct hda_codec *codec);
112#endif
113 void (*shutup)(struct hda_codec *codec);
114
115 int init_amp;
116 int codec_variant;
117 unsigned int has_alc5505_dsp:1;
118 unsigned int no_depop_delay:1;
119 unsigned int done_hp_init:1;
120 unsigned int no_shutup_pins:1;
121 unsigned int ultra_low_power:1;
122 unsigned int has_hs_key:1;
123 unsigned int no_internal_mic_pin:1;
124
125
126 hda_nid_t pll_nid;
127 unsigned int pll_coef_idx, pll_coef_bit;
128 unsigned int coef0;
129 struct input_dev *kb_dev;
130 u8 alc_mute_keycode_map[1];
131
132
133 struct component_match *match;
134 struct hda_component comps[HDA_MAX_COMPONENTS];
135};
136
137
138
139
140
141static void coef_mutex_lock(struct hda_codec *codec)
142{
143 struct alc_spec *spec = codec->spec;
144
145 snd_hda_power_up_pm(codec);
146 mutex_lock(&spec->coef_mutex);
147}
148
149static void coef_mutex_unlock(struct hda_codec *codec)
150{
151 struct alc_spec *spec = codec->spec;
152
153 mutex_unlock(&spec->coef_mutex);
154 snd_hda_power_down_pm(codec);
155}
156
157static int __alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
158 unsigned int coef_idx)
159{
160 unsigned int val;
161
162 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
163 val = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PROC_COEF, 0);
164 return val;
165}
166
167static int alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
168 unsigned int coef_idx)
169{
170 unsigned int val;
171
172 coef_mutex_lock(codec);
173 val = __alc_read_coefex_idx(codec, nid, coef_idx);
174 coef_mutex_unlock(codec);
175 return val;
176}
177
178#define alc_read_coef_idx(codec, coef_idx) \
179 alc_read_coefex_idx(codec, 0x20, coef_idx)
180
181static void __alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
182 unsigned int coef_idx, unsigned int coef_val)
183{
184 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
185 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PROC_COEF, coef_val);
186}
187
188static void alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
189 unsigned int coef_idx, unsigned int coef_val)
190{
191 coef_mutex_lock(codec);
192 __alc_write_coefex_idx(codec, nid, coef_idx, coef_val);
193 coef_mutex_unlock(codec);
194}
195
196#define alc_write_coef_idx(codec, coef_idx, coef_val) \
197 alc_write_coefex_idx(codec, 0x20, coef_idx, coef_val)
198
199static void __alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
200 unsigned int coef_idx, unsigned int mask,
201 unsigned int bits_set)
202{
203 unsigned int val = __alc_read_coefex_idx(codec, nid, coef_idx);
204
205 if (val != -1)
206 __alc_write_coefex_idx(codec, nid, coef_idx,
207 (val & ~mask) | bits_set);
208}
209
210static void alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
211 unsigned int coef_idx, unsigned int mask,
212 unsigned int bits_set)
213{
214 coef_mutex_lock(codec);
215 __alc_update_coefex_idx(codec, nid, coef_idx, mask, bits_set);
216 coef_mutex_unlock(codec);
217}
218
219#define alc_update_coef_idx(codec, coef_idx, mask, bits_set) \
220 alc_update_coefex_idx(codec, 0x20, coef_idx, mask, bits_set)
221
222
223static unsigned int alc_get_coef0(struct hda_codec *codec)
224{
225 struct alc_spec *spec = codec->spec;
226
227 if (!spec->coef0)
228 spec->coef0 = alc_read_coef_idx(codec, 0);
229 return spec->coef0;
230}
231
232
233struct coef_fw {
234 unsigned char nid;
235 unsigned char idx;
236 unsigned short mask;
237 unsigned short val;
238};
239
240#define UPDATE_COEFEX(_nid, _idx, _mask, _val) \
241 { .nid = (_nid), .idx = (_idx), .mask = (_mask), .val = (_val) }
242#define WRITE_COEFEX(_nid, _idx, _val) UPDATE_COEFEX(_nid, _idx, -1, _val)
243#define WRITE_COEF(_idx, _val) WRITE_COEFEX(0x20, _idx, _val)
244#define UPDATE_COEF(_idx, _mask, _val) UPDATE_COEFEX(0x20, _idx, _mask, _val)
245
246static void alc_process_coef_fw(struct hda_codec *codec,
247 const struct coef_fw *fw)
248{
249 coef_mutex_lock(codec);
250 for (; fw->nid; fw++) {
251 if (fw->mask == (unsigned short)-1)
252 __alc_write_coefex_idx(codec, fw->nid, fw->idx, fw->val);
253 else
254 __alc_update_coefex_idx(codec, fw->nid, fw->idx,
255 fw->mask, fw->val);
256 }
257 coef_mutex_unlock(codec);
258}
259
260
261
262
263
264
265static void alc_setup_gpio(struct hda_codec *codec, unsigned int mask)
266{
267 struct alc_spec *spec = codec->spec;
268
269 spec->gpio_mask |= mask;
270 spec->gpio_dir |= mask;
271 spec->gpio_data |= mask;
272}
273
274static void alc_write_gpio_data(struct hda_codec *codec)
275{
276 struct alc_spec *spec = codec->spec;
277
278 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
279 spec->gpio_data);
280}
281
282static void alc_update_gpio_data(struct hda_codec *codec, unsigned int mask,
283 bool on)
284{
285 struct alc_spec *spec = codec->spec;
286 unsigned int oldval = spec->gpio_data;
287
288 if (on)
289 spec->gpio_data |= mask;
290 else
291 spec->gpio_data &= ~mask;
292 if (oldval != spec->gpio_data)
293 alc_write_gpio_data(codec);
294}
295
296static void alc_write_gpio(struct hda_codec *codec)
297{
298 struct alc_spec *spec = codec->spec;
299
300 if (!spec->gpio_mask)
301 return;
302
303 snd_hda_codec_write(codec, codec->core.afg, 0,
304 AC_VERB_SET_GPIO_MASK, spec->gpio_mask);
305 snd_hda_codec_write(codec, codec->core.afg, 0,
306 AC_VERB_SET_GPIO_DIRECTION, spec->gpio_dir);
307 if (spec->gpio_write_delay)
308 msleep(1);
309 alc_write_gpio_data(codec);
310}
311
312static void alc_fixup_gpio(struct hda_codec *codec, int action,
313 unsigned int mask)
314{
315 if (action == HDA_FIXUP_ACT_PRE_PROBE)
316 alc_setup_gpio(codec, mask);
317}
318
319static void alc_fixup_gpio1(struct hda_codec *codec,
320 const struct hda_fixup *fix, int action)
321{
322 alc_fixup_gpio(codec, action, 0x01);
323}
324
325static void alc_fixup_gpio2(struct hda_codec *codec,
326 const struct hda_fixup *fix, int action)
327{
328 alc_fixup_gpio(codec, action, 0x02);
329}
330
331static void alc_fixup_gpio3(struct hda_codec *codec,
332 const struct hda_fixup *fix, int action)
333{
334 alc_fixup_gpio(codec, action, 0x03);
335}
336
337static void alc_fixup_gpio4(struct hda_codec *codec,
338 const struct hda_fixup *fix, int action)
339{
340 alc_fixup_gpio(codec, action, 0x04);
341}
342
343static void alc_fixup_micmute_led(struct hda_codec *codec,
344 const struct hda_fixup *fix, int action)
345{
346 if (action == HDA_FIXUP_ACT_PRE_PROBE)
347 snd_hda_gen_add_micmute_led_cdev(codec, NULL);
348}
349
350
351
352
353
354
355static void alc_fix_pll(struct hda_codec *codec)
356{
357 struct alc_spec *spec = codec->spec;
358
359 if (spec->pll_nid)
360 alc_update_coefex_idx(codec, spec->pll_nid, spec->pll_coef_idx,
361 1 << spec->pll_coef_bit, 0);
362}
363
364static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
365 unsigned int coef_idx, unsigned int coef_bit)
366{
367 struct alc_spec *spec = codec->spec;
368 spec->pll_nid = nid;
369 spec->pll_coef_idx = coef_idx;
370 spec->pll_coef_bit = coef_bit;
371 alc_fix_pll(codec);
372}
373
374
375static void alc_update_knob_master(struct hda_codec *codec,
376 struct hda_jack_callback *jack)
377{
378 unsigned int val;
379 struct snd_kcontrol *kctl;
380 struct snd_ctl_elem_value *uctl;
381
382 kctl = snd_hda_find_mixer_ctl(codec, "Master Playback Volume");
383 if (!kctl)
384 return;
385 uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
386 if (!uctl)
387 return;
388 val = snd_hda_codec_read(codec, jack->nid, 0,
389 AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
390 val &= HDA_AMP_VOLMASK;
391 uctl->value.integer.value[0] = val;
392 uctl->value.integer.value[1] = val;
393 kctl->put(kctl, uctl);
394 kfree(uctl);
395}
396
397static void alc880_unsol_event(struct hda_codec *codec, unsigned int res)
398{
399
400
401 snd_hda_jack_unsol_event(codec, res >> 2);
402}
403
404
405static void alc_fill_eapd_coef(struct hda_codec *codec)
406{
407 int coef;
408
409 coef = alc_get_coef0(codec);
410
411 switch (codec->core.vendor_id) {
412 case 0x10ec0262:
413 alc_update_coef_idx(codec, 0x7, 0, 1<<5);
414 break;
415 case 0x10ec0267:
416 case 0x10ec0268:
417 alc_update_coef_idx(codec, 0x7, 0, 1<<13);
418 break;
419 case 0x10ec0269:
420 if ((coef & 0x00f0) == 0x0010)
421 alc_update_coef_idx(codec, 0xd, 0, 1<<14);
422 if ((coef & 0x00f0) == 0x0020)
423 alc_update_coef_idx(codec, 0x4, 1<<15, 0);
424 if ((coef & 0x00f0) == 0x0030)
425 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
426 break;
427 case 0x10ec0280:
428 case 0x10ec0284:
429 case 0x10ec0290:
430 case 0x10ec0292:
431 alc_update_coef_idx(codec, 0x4, 1<<15, 0);
432 break;
433 case 0x10ec0225:
434 case 0x10ec0295:
435 case 0x10ec0299:
436 alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
437 fallthrough;
438 case 0x10ec0215:
439 case 0x10ec0230:
440 case 0x10ec0233:
441 case 0x10ec0235:
442 case 0x10ec0236:
443 case 0x10ec0245:
444 case 0x10ec0255:
445 case 0x10ec0256:
446 case 0x10ec0257:
447 case 0x10ec0282:
448 case 0x10ec0283:
449 case 0x10ec0286:
450 case 0x10ec0288:
451 case 0x10ec0285:
452 case 0x10ec0298:
453 case 0x10ec0289:
454 case 0x10ec0300:
455 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
456 break;
457 case 0x10ec0275:
458 alc_update_coef_idx(codec, 0xe, 0, 1<<0);
459 break;
460 case 0x10ec0287:
461 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
462 alc_write_coef_idx(codec, 0x8, 0x4ab7);
463 break;
464 case 0x10ec0293:
465 alc_update_coef_idx(codec, 0xa, 1<<13, 0);
466 break;
467 case 0x10ec0234:
468 case 0x10ec0274:
469 case 0x10ec0294:
470 case 0x10ec0700:
471 case 0x10ec0701:
472 case 0x10ec0703:
473 case 0x10ec0711:
474 alc_update_coef_idx(codec, 0x10, 1<<15, 0);
475 break;
476 case 0x10ec0662:
477 if ((coef & 0x00f0) == 0x0030)
478 alc_update_coef_idx(codec, 0x4, 1<<10, 0);
479 break;
480 case 0x10ec0272:
481 case 0x10ec0273:
482 case 0x10ec0663:
483 case 0x10ec0665:
484 case 0x10ec0670:
485 case 0x10ec0671:
486 case 0x10ec0672:
487 alc_update_coef_idx(codec, 0xd, 0, 1<<14);
488 break;
489 case 0x10ec0222:
490 case 0x10ec0623:
491 alc_update_coef_idx(codec, 0x19, 1<<13, 0);
492 break;
493 case 0x10ec0668:
494 alc_update_coef_idx(codec, 0x7, 3<<13, 0);
495 break;
496 case 0x10ec0867:
497 alc_update_coef_idx(codec, 0x4, 1<<10, 0);
498 break;
499 case 0x10ec0888:
500 if ((coef & 0x00f0) == 0x0020 || (coef & 0x00f0) == 0x0030)
501 alc_update_coef_idx(codec, 0x7, 1<<5, 0);
502 break;
503 case 0x10ec0892:
504 case 0x10ec0897:
505 alc_update_coef_idx(codec, 0x7, 1<<5, 0);
506 break;
507 case 0x10ec0899:
508 case 0x10ec0900:
509 case 0x10ec0b00:
510 case 0x10ec1168:
511 case 0x10ec1220:
512 alc_update_coef_idx(codec, 0x7, 1<<1, 0);
513 break;
514 }
515}
516
517
518static void alc888_coef_init(struct hda_codec *codec)
519{
520 switch (alc_get_coef0(codec) & 0x00f0) {
521
522 case 0x00:
523
524 case 0x10:
525 alc_update_coef_idx(codec, 7, 0, 0x2030);
526 break;
527 }
528}
529
530
531static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
532{
533 if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
534 return;
535 if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
536 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
537 on ? 2 : 0);
538}
539
540
541static void alc_auto_setup_eapd(struct hda_codec *codec, bool on)
542{
543
544 static const hda_nid_t pins[] = {
545 0x0f, 0x10, 0x14, 0x15, 0x17, 0
546 };
547 const hda_nid_t *p;
548 for (p = pins; *p; p++)
549 set_eapd(codec, *p, on);
550}
551
552static int find_ext_mic_pin(struct hda_codec *codec);
553
554static void alc_headset_mic_no_shutup(struct hda_codec *codec)
555{
556 const struct hda_pincfg *pin;
557 int mic_pin = find_ext_mic_pin(codec);
558 int i;
559
560
561
562
563 if (codec->bus->shutdown)
564 return;
565
566 snd_array_for_each(&codec->init_pins, i, pin) {
567
568 if (pin->nid != mic_pin)
569 snd_hda_codec_read(codec, pin->nid, 0,
570 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
571 }
572
573 codec->pins_shutup = 1;
574}
575
576static void alc_shutup_pins(struct hda_codec *codec)
577{
578 struct alc_spec *spec = codec->spec;
579
580 switch (codec->core.vendor_id) {
581 case 0x10ec0236:
582 case 0x10ec0256:
583 case 0x10ec0283:
584 case 0x10ec0286:
585 case 0x10ec0288:
586 case 0x10ec0298:
587 alc_headset_mic_no_shutup(codec);
588 break;
589 default:
590 if (!spec->no_shutup_pins)
591 snd_hda_shutup_pins(codec);
592 break;
593 }
594}
595
596
597
598
599static void alc_eapd_shutup(struct hda_codec *codec)
600{
601 struct alc_spec *spec = codec->spec;
602
603 alc_auto_setup_eapd(codec, false);
604 if (!spec->no_depop_delay)
605 msleep(200);
606 alc_shutup_pins(codec);
607}
608
609
610static void alc_auto_init_amp(struct hda_codec *codec, int type)
611{
612 alc_auto_setup_eapd(codec, true);
613 alc_write_gpio(codec);
614 switch (type) {
615 case ALC_INIT_DEFAULT:
616 switch (codec->core.vendor_id) {
617 case 0x10ec0260:
618 alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x2010);
619 break;
620 case 0x10ec0880:
621 case 0x10ec0882:
622 case 0x10ec0883:
623 case 0x10ec0885:
624 alc_update_coef_idx(codec, 7, 0, 0x2030);
625 break;
626 case 0x10ec0888:
627 alc888_coef_init(codec);
628 break;
629 }
630 break;
631 }
632}
633
634
635static hda_nid_t alc_get_hp_pin(struct alc_spec *spec)
636{
637 if (spec->gen.autocfg.hp_pins[0])
638 return spec->gen.autocfg.hp_pins[0];
639 if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
640 return spec->gen.autocfg.line_out_pins[0];
641 return 0;
642}
643
644
645
646
647
648
649
650
651#define ALC_FIXUP_SKU_IGNORE (2)
652
653static void alc_fixup_sku_ignore(struct hda_codec *codec,
654 const struct hda_fixup *fix, int action)
655{
656 struct alc_spec *spec = codec->spec;
657 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
658 spec->cdefine.fixup = 1;
659 spec->cdefine.sku_cfg = ALC_FIXUP_SKU_IGNORE;
660 }
661}
662
663static void alc_fixup_no_depop_delay(struct hda_codec *codec,
664 const struct hda_fixup *fix, int action)
665{
666 struct alc_spec *spec = codec->spec;
667
668 if (action == HDA_FIXUP_ACT_PROBE) {
669 spec->no_depop_delay = 1;
670 codec->depop_delay = 0;
671 }
672}
673
674static int alc_auto_parse_customize_define(struct hda_codec *codec)
675{
676 unsigned int ass, tmp, i;
677 unsigned nid = 0;
678 struct alc_spec *spec = codec->spec;
679
680 spec->cdefine.enable_pcbeep = 1;
681
682 if (spec->cdefine.fixup) {
683 ass = spec->cdefine.sku_cfg;
684 if (ass == ALC_FIXUP_SKU_IGNORE)
685 return -1;
686 goto do_sku;
687 }
688
689 if (!codec->bus->pci)
690 return -1;
691 ass = codec->core.subsystem_id & 0xffff;
692 if (ass != codec->bus->pci->subsystem_device && (ass & 1))
693 goto do_sku;
694
695 nid = 0x1d;
696 if (codec->core.vendor_id == 0x10ec0260)
697 nid = 0x17;
698 ass = snd_hda_codec_get_pincfg(codec, nid);
699
700 if (!(ass & 1)) {
701 codec_info(codec, "%s: SKU not ready 0x%08x\n",
702 codec->core.chip_name, ass);
703 return -1;
704 }
705
706
707 tmp = 0;
708 for (i = 1; i < 16; i++) {
709 if ((ass >> i) & 1)
710 tmp++;
711 }
712 if (((ass >> 16) & 0xf) != tmp)
713 return -1;
714
715 spec->cdefine.port_connectivity = ass >> 30;
716 spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
717 spec->cdefine.check_sum = (ass >> 16) & 0xf;
718 spec->cdefine.customization = ass >> 8;
719do_sku:
720 spec->cdefine.sku_cfg = ass;
721 spec->cdefine.external_amp = (ass & 0x38) >> 3;
722 spec->cdefine.platform_type = (ass & 0x4) >> 2;
723 spec->cdefine.swap = (ass & 0x2) >> 1;
724 spec->cdefine.override = ass & 0x1;
725
726 codec_dbg(codec, "SKU: Nid=0x%x sku_cfg=0x%08x\n",
727 nid, spec->cdefine.sku_cfg);
728 codec_dbg(codec, "SKU: port_connectivity=0x%x\n",
729 spec->cdefine.port_connectivity);
730 codec_dbg(codec, "SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
731 codec_dbg(codec, "SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
732 codec_dbg(codec, "SKU: customization=0x%08x\n", spec->cdefine.customization);
733 codec_dbg(codec, "SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
734 codec_dbg(codec, "SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
735 codec_dbg(codec, "SKU: swap=0x%x\n", spec->cdefine.swap);
736 codec_dbg(codec, "SKU: override=0x%x\n", spec->cdefine.override);
737
738 return 0;
739}
740
741
742static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
743{
744 int i;
745 for (i = 0; i < nums; i++)
746 if (list[i] == nid)
747 return i;
748 return -1;
749}
750
751static bool found_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
752{
753 return find_idx_in_nid_list(nid, list, nums) >= 0;
754}
755
756
757
758
759
760
761
762
763
764
765static int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports)
766{
767 unsigned int ass, tmp, i;
768 unsigned nid;
769 struct alc_spec *spec = codec->spec;
770
771 if (spec->cdefine.fixup) {
772 ass = spec->cdefine.sku_cfg;
773 if (ass == ALC_FIXUP_SKU_IGNORE)
774 return 0;
775 goto do_sku;
776 }
777
778 ass = codec->core.subsystem_id & 0xffff;
779 if (codec->bus->pci &&
780 ass != codec->bus->pci->subsystem_device && (ass & 1))
781 goto do_sku;
782
783
784
785
786
787
788
789
790
791
792 nid = 0x1d;
793 if (codec->core.vendor_id == 0x10ec0260)
794 nid = 0x17;
795 ass = snd_hda_codec_get_pincfg(codec, nid);
796 codec_dbg(codec,
797 "realtek: No valid SSID, checking pincfg 0x%08x for NID 0x%x\n",
798 ass, nid);
799 if (!(ass & 1))
800 return 0;
801 if ((ass >> 30) != 1)
802 return 0;
803
804
805 tmp = 0;
806 for (i = 1; i < 16; i++) {
807 if ((ass >> i) & 1)
808 tmp++;
809 }
810 if (((ass >> 16) & 0xf) != tmp)
811 return 0;
812do_sku:
813 codec_dbg(codec, "realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
814 ass & 0xffff, codec->core.vendor_id);
815
816
817
818
819
820
821
822 tmp = (ass & 0x38) >> 3;
823 if (spec->init_amp == ALC_INIT_UNDEFINED) {
824 switch (tmp) {
825 case 1:
826 alc_setup_gpio(codec, 0x01);
827 break;
828 case 3:
829 alc_setup_gpio(codec, 0x02);
830 break;
831 case 7:
832 alc_setup_gpio(codec, 0x03);
833 break;
834 case 5:
835 default:
836 spec->init_amp = ALC_INIT_DEFAULT;
837 break;
838 }
839 }
840
841
842
843
844 if (!(ass & 0x8000))
845 return 1;
846
847
848
849
850
851
852
853 if (!alc_get_hp_pin(spec)) {
854 hda_nid_t nid;
855 tmp = (ass >> 11) & 0x3;
856 nid = ports[tmp];
857 if (found_in_nid_list(nid, spec->gen.autocfg.line_out_pins,
858 spec->gen.autocfg.line_outs))
859 return 1;
860 spec->gen.autocfg.hp_pins[0] = nid;
861 }
862 return 1;
863}
864
865
866
867static void alc_ssid_check(struct hda_codec *codec, const hda_nid_t *ports)
868{
869 if (!alc_subsystem_id(codec, ports)) {
870 struct alc_spec *spec = codec->spec;
871 if (spec->init_amp == ALC_INIT_UNDEFINED) {
872 codec_dbg(codec,
873 "realtek: Enable default setup for auto mode as fallback\n");
874 spec->init_amp = ALC_INIT_DEFAULT;
875 }
876 }
877}
878
879
880
881
882static void alc_fixup_inv_dmic(struct hda_codec *codec,
883 const struct hda_fixup *fix, int action)
884{
885 struct alc_spec *spec = codec->spec;
886
887 spec->gen.inv_dmic_split = 1;
888}
889
890
891static int alc_build_controls(struct hda_codec *codec)
892{
893 int err;
894
895 err = snd_hda_gen_build_controls(codec);
896 if (err < 0)
897 return err;
898
899 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_BUILD);
900 return 0;
901}
902
903
904
905
906
907
908static void alc_pre_init(struct hda_codec *codec)
909{
910 alc_fill_eapd_coef(codec);
911}
912
913#define is_s3_resume(codec) \
914 ((codec)->core.dev.power.power_state.event == PM_EVENT_RESUME)
915#define is_s4_resume(codec) \
916 ((codec)->core.dev.power.power_state.event == PM_EVENT_RESTORE)
917
918static int alc_init(struct hda_codec *codec)
919{
920 struct alc_spec *spec = codec->spec;
921
922
923 if (is_s4_resume(codec))
924 alc_pre_init(codec);
925
926 if (spec->init_hook)
927 spec->init_hook(codec);
928
929 spec->gen.skip_verbs = 1;
930 snd_hda_gen_init(codec);
931 alc_fix_pll(codec);
932 alc_auto_init_amp(codec, spec->init_amp);
933 snd_hda_apply_verbs(codec);
934
935 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT);
936
937 return 0;
938}
939
940#define alc_free snd_hda_gen_free
941
942#ifdef CONFIG_PM
943static inline void alc_shutup(struct hda_codec *codec)
944{
945 struct alc_spec *spec = codec->spec;
946
947 if (!snd_hda_get_bool_hint(codec, "shutup"))
948 return;
949
950 if (spec && spec->shutup)
951 spec->shutup(codec);
952 else
953 alc_shutup_pins(codec);
954}
955
956static void alc_power_eapd(struct hda_codec *codec)
957{
958 alc_auto_setup_eapd(codec, false);
959}
960
961static int alc_suspend(struct hda_codec *codec)
962{
963 struct alc_spec *spec = codec->spec;
964 alc_shutup(codec);
965 if (spec && spec->power_hook)
966 spec->power_hook(codec);
967 return 0;
968}
969
970static int alc_resume(struct hda_codec *codec)
971{
972 struct alc_spec *spec = codec->spec;
973
974 if (!spec->no_depop_delay)
975 msleep(150);
976 codec->patch_ops.init(codec);
977 snd_hda_regmap_sync(codec);
978 hda_call_check_power_status(codec, 0x01);
979 return 0;
980}
981#endif
982
983
984
985static const struct hda_codec_ops alc_patch_ops = {
986 .build_controls = alc_build_controls,
987 .build_pcms = snd_hda_gen_build_pcms,
988 .init = alc_init,
989 .free = alc_free,
990 .unsol_event = snd_hda_jack_unsol_event,
991#ifdef CONFIG_PM
992 .resume = alc_resume,
993 .suspend = alc_suspend,
994 .check_power_status = snd_hda_gen_check_power_status,
995#endif
996};
997
998
999#define alc_codec_rename(codec, name) snd_hda_codec_set_name(codec, name)
1000
1001
1002
1003
1004struct alc_codec_rename_table {
1005 unsigned int vendor_id;
1006 unsigned short coef_mask;
1007 unsigned short coef_bits;
1008 const char *name;
1009};
1010
1011struct alc_codec_rename_pci_table {
1012 unsigned int codec_vendor_id;
1013 unsigned short pci_subvendor;
1014 unsigned short pci_subdevice;
1015 const char *name;
1016};
1017
1018static const struct alc_codec_rename_table rename_tbl[] = {
1019 { 0x10ec0221, 0xf00f, 0x1003, "ALC231" },
1020 { 0x10ec0269, 0xfff0, 0x3010, "ALC277" },
1021 { 0x10ec0269, 0xf0f0, 0x2010, "ALC259" },
1022 { 0x10ec0269, 0xf0f0, 0x3010, "ALC258" },
1023 { 0x10ec0269, 0x00f0, 0x0010, "ALC269VB" },
1024 { 0x10ec0269, 0xffff, 0xa023, "ALC259" },
1025 { 0x10ec0269, 0xffff, 0x6023, "ALC281X" },
1026 { 0x10ec0269, 0x00f0, 0x0020, "ALC269VC" },
1027 { 0x10ec0269, 0x00f0, 0x0030, "ALC269VD" },
1028 { 0x10ec0662, 0xffff, 0x4020, "ALC656" },
1029 { 0x10ec0887, 0x00f0, 0x0030, "ALC887-VD" },
1030 { 0x10ec0888, 0x00f0, 0x0030, "ALC888-VD" },
1031 { 0x10ec0888, 0xf0f0, 0x3020, "ALC886" },
1032 { 0x10ec0899, 0x2000, 0x2000, "ALC899" },
1033 { 0x10ec0892, 0xffff, 0x8020, "ALC661" },
1034 { 0x10ec0892, 0xffff, 0x8011, "ALC661" },
1035 { 0x10ec0892, 0xffff, 0x4011, "ALC656" },
1036 { }
1037};
1038
1039static const struct alc_codec_rename_pci_table rename_pci_tbl[] = {
1040 { 0x10ec0280, 0x1028, 0, "ALC3220" },
1041 { 0x10ec0282, 0x1028, 0, "ALC3221" },
1042 { 0x10ec0283, 0x1028, 0, "ALC3223" },
1043 { 0x10ec0288, 0x1028, 0, "ALC3263" },
1044 { 0x10ec0292, 0x1028, 0, "ALC3226" },
1045 { 0x10ec0293, 0x1028, 0, "ALC3235" },
1046 { 0x10ec0255, 0x1028, 0, "ALC3234" },
1047 { 0x10ec0668, 0x1028, 0, "ALC3661" },
1048 { 0x10ec0275, 0x1028, 0, "ALC3260" },
1049 { 0x10ec0899, 0x1028, 0, "ALC3861" },
1050 { 0x10ec0298, 0x1028, 0, "ALC3266" },
1051 { 0x10ec0236, 0x1028, 0, "ALC3204" },
1052 { 0x10ec0256, 0x1028, 0, "ALC3246" },
1053 { 0x10ec0225, 0x1028, 0, "ALC3253" },
1054 { 0x10ec0295, 0x1028, 0, "ALC3254" },
1055 { 0x10ec0299, 0x1028, 0, "ALC3271" },
1056 { 0x10ec0670, 0x1025, 0, "ALC669X" },
1057 { 0x10ec0676, 0x1025, 0, "ALC679X" },
1058 { 0x10ec0282, 0x1043, 0, "ALC3229" },
1059 { 0x10ec0233, 0x1043, 0, "ALC3236" },
1060 { 0x10ec0280, 0x103c, 0, "ALC3228" },
1061 { 0x10ec0282, 0x103c, 0, "ALC3227" },
1062 { 0x10ec0286, 0x103c, 0, "ALC3242" },
1063 { 0x10ec0290, 0x103c, 0, "ALC3241" },
1064 { 0x10ec0668, 0x103c, 0, "ALC3662" },
1065 { 0x10ec0283, 0x17aa, 0, "ALC3239" },
1066 { 0x10ec0292, 0x17aa, 0, "ALC3232" },
1067 { }
1068};
1069
1070static int alc_codec_rename_from_preset(struct hda_codec *codec)
1071{
1072 const struct alc_codec_rename_table *p;
1073 const struct alc_codec_rename_pci_table *q;
1074
1075 for (p = rename_tbl; p->vendor_id; p++) {
1076 if (p->vendor_id != codec->core.vendor_id)
1077 continue;
1078 if ((alc_get_coef0(codec) & p->coef_mask) == p->coef_bits)
1079 return alc_codec_rename(codec, p->name);
1080 }
1081
1082 if (!codec->bus->pci)
1083 return 0;
1084 for (q = rename_pci_tbl; q->codec_vendor_id; q++) {
1085 if (q->codec_vendor_id != codec->core.vendor_id)
1086 continue;
1087 if (q->pci_subvendor != codec->bus->pci->subsystem_vendor)
1088 continue;
1089 if (!q->pci_subdevice ||
1090 q->pci_subdevice == codec->bus->pci->subsystem_device)
1091 return alc_codec_rename(codec, q->name);
1092 }
1093
1094 return 0;
1095}
1096
1097
1098
1099
1100
1101#ifdef CONFIG_SND_HDA_INPUT_BEEP
1102
1103
1104static const struct snd_kcontrol_new alc_beep_mixer[] = {
1105 HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
1106 HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
1107};
1108
1109
1110static int set_beep_amp(struct alc_spec *spec, hda_nid_t nid,
1111 int idx, int dir)
1112{
1113 struct snd_kcontrol_new *knew;
1114 unsigned int beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir);
1115 int i;
1116
1117 for (i = 0; i < ARRAY_SIZE(alc_beep_mixer); i++) {
1118 knew = snd_hda_gen_add_kctl(&spec->gen, NULL,
1119 &alc_beep_mixer[i]);
1120 if (!knew)
1121 return -ENOMEM;
1122 knew->private_value = beep_amp;
1123 }
1124 return 0;
1125}
1126
1127static const struct snd_pci_quirk beep_allow_list[] = {
1128 SND_PCI_QUIRK(0x1043, 0x103c, "ASUS", 1),
1129 SND_PCI_QUIRK(0x1043, 0x115d, "ASUS", 1),
1130 SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),
1131 SND_PCI_QUIRK(0x1043, 0x8376, "EeePC", 1),
1132 SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1),
1133 SND_PCI_QUIRK(0x1043, 0x831a, "EeePC", 1),
1134 SND_PCI_QUIRK(0x1043, 0x834a, "EeePC", 1),
1135 SND_PCI_QUIRK(0x1458, 0xa002, "GA-MA790X", 1),
1136 SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),
1137
1138 SND_PCI_QUIRK(0x17aa, 0x309e, "Lenovo ThinkCentre M73", 0),
1139 SND_PCI_QUIRK(0x17aa, 0x30a3, "Lenovo ThinkCentre M93", 0),
1140 {}
1141};
1142
1143static inline int has_cdefine_beep(struct hda_codec *codec)
1144{
1145 struct alc_spec *spec = codec->spec;
1146 const struct snd_pci_quirk *q;
1147 q = snd_pci_quirk_lookup(codec->bus->pci, beep_allow_list);
1148 if (q)
1149 return q->value;
1150 return spec->cdefine.enable_pcbeep;
1151}
1152#else
1153#define set_beep_amp(spec, nid, idx, dir) 0
1154#define has_cdefine_beep(codec) 0
1155#endif
1156
1157
1158
1159
1160
1161static int alc_parse_auto_config(struct hda_codec *codec,
1162 const hda_nid_t *ignore_nids,
1163 const hda_nid_t *ssid_nids)
1164{
1165 struct alc_spec *spec = codec->spec;
1166 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
1167 int err;
1168
1169 err = snd_hda_parse_pin_defcfg(codec, cfg, ignore_nids,
1170 spec->parse_flags);
1171 if (err < 0)
1172 return err;
1173
1174 if (ssid_nids)
1175 alc_ssid_check(codec, ssid_nids);
1176
1177 err = snd_hda_gen_parse_auto_config(codec, cfg);
1178 if (err < 0)
1179 return err;
1180
1181 return 1;
1182}
1183
1184
1185static int alc_alloc_spec(struct hda_codec *codec, hda_nid_t mixer_nid)
1186{
1187 struct alc_spec *spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1188 int err;
1189
1190 if (!spec)
1191 return -ENOMEM;
1192 codec->spec = spec;
1193 snd_hda_gen_spec_init(&spec->gen);
1194 spec->gen.mixer_nid = mixer_nid;
1195 spec->gen.own_eapd_ctl = 1;
1196 codec->single_adc_amp = 1;
1197
1198 codec->spdif_status_reset = 1;
1199 codec->forced_resume = 1;
1200 codec->patch_ops = alc_patch_ops;
1201 mutex_init(&spec->coef_mutex);
1202
1203 err = alc_codec_rename_from_preset(codec);
1204 if (err < 0) {
1205 kfree(spec);
1206 return err;
1207 }
1208 return 0;
1209}
1210
1211static int alc880_parse_auto_config(struct hda_codec *codec)
1212{
1213 static const hda_nid_t alc880_ignore[] = { 0x1d, 0 };
1214 static const hda_nid_t alc880_ssids[] = { 0x15, 0x1b, 0x14, 0 };
1215 return alc_parse_auto_config(codec, alc880_ignore, alc880_ssids);
1216}
1217
1218
1219
1220
1221enum {
1222 ALC880_FIXUP_GPIO1,
1223 ALC880_FIXUP_GPIO2,
1224 ALC880_FIXUP_MEDION_RIM,
1225 ALC880_FIXUP_LG,
1226 ALC880_FIXUP_LG_LW25,
1227 ALC880_FIXUP_W810,
1228 ALC880_FIXUP_EAPD_COEF,
1229 ALC880_FIXUP_TCL_S700,
1230 ALC880_FIXUP_VOL_KNOB,
1231 ALC880_FIXUP_FUJITSU,
1232 ALC880_FIXUP_F1734,
1233 ALC880_FIXUP_UNIWILL,
1234 ALC880_FIXUP_UNIWILL_DIG,
1235 ALC880_FIXUP_Z71V,
1236 ALC880_FIXUP_ASUS_W5A,
1237 ALC880_FIXUP_3ST_BASE,
1238 ALC880_FIXUP_3ST,
1239 ALC880_FIXUP_3ST_DIG,
1240 ALC880_FIXUP_5ST_BASE,
1241 ALC880_FIXUP_5ST,
1242 ALC880_FIXUP_5ST_DIG,
1243 ALC880_FIXUP_6ST_BASE,
1244 ALC880_FIXUP_6ST,
1245 ALC880_FIXUP_6ST_DIG,
1246 ALC880_FIXUP_6ST_AUTOMUTE,
1247};
1248
1249
1250static void alc880_fixup_vol_knob(struct hda_codec *codec,
1251 const struct hda_fixup *fix, int action)
1252{
1253 if (action == HDA_FIXUP_ACT_PROBE)
1254 snd_hda_jack_detect_enable_callback(codec, 0x21,
1255 alc_update_knob_master);
1256}
1257
1258static const struct hda_fixup alc880_fixups[] = {
1259 [ALC880_FIXUP_GPIO1] = {
1260 .type = HDA_FIXUP_FUNC,
1261 .v.func = alc_fixup_gpio1,
1262 },
1263 [ALC880_FIXUP_GPIO2] = {
1264 .type = HDA_FIXUP_FUNC,
1265 .v.func = alc_fixup_gpio2,
1266 },
1267 [ALC880_FIXUP_MEDION_RIM] = {
1268 .type = HDA_FIXUP_VERBS,
1269 .v.verbs = (const struct hda_verb[]) {
1270 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1271 { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
1272 { }
1273 },
1274 .chained = true,
1275 .chain_id = ALC880_FIXUP_GPIO2,
1276 },
1277 [ALC880_FIXUP_LG] = {
1278 .type = HDA_FIXUP_PINS,
1279 .v.pins = (const struct hda_pintbl[]) {
1280
1281 { 0x16, 0x411111f0 },
1282 { 0x18, 0x411111f0 },
1283 { 0x1a, 0x411111f0 },
1284 { }
1285 }
1286 },
1287 [ALC880_FIXUP_LG_LW25] = {
1288 .type = HDA_FIXUP_PINS,
1289 .v.pins = (const struct hda_pintbl[]) {
1290 { 0x1a, 0x0181344f },
1291 { 0x1b, 0x0321403f },
1292 { }
1293 }
1294 },
1295 [ALC880_FIXUP_W810] = {
1296 .type = HDA_FIXUP_PINS,
1297 .v.pins = (const struct hda_pintbl[]) {
1298
1299 { 0x17, 0x411111f0 },
1300 { }
1301 },
1302 .chained = true,
1303 .chain_id = ALC880_FIXUP_GPIO2,
1304 },
1305 [ALC880_FIXUP_EAPD_COEF] = {
1306 .type = HDA_FIXUP_VERBS,
1307 .v.verbs = (const struct hda_verb[]) {
1308
1309 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1310 { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
1311 {}
1312 },
1313 },
1314 [ALC880_FIXUP_TCL_S700] = {
1315 .type = HDA_FIXUP_VERBS,
1316 .v.verbs = (const struct hda_verb[]) {
1317
1318 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1319 { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
1320 {}
1321 },
1322 .chained = true,
1323 .chain_id = ALC880_FIXUP_GPIO2,
1324 },
1325 [ALC880_FIXUP_VOL_KNOB] = {
1326 .type = HDA_FIXUP_FUNC,
1327 .v.func = alc880_fixup_vol_knob,
1328 },
1329 [ALC880_FIXUP_FUJITSU] = {
1330
1331 .type = HDA_FIXUP_PINS,
1332 .v.pins = (const struct hda_pintbl[]) {
1333 { 0x14, 0x0121401f },
1334 { 0x15, 0x99030120 },
1335 { 0x16, 0x99030130 },
1336 { 0x17, 0x411111f0 },
1337 { 0x18, 0x411111f0 },
1338 { 0x19, 0x01a19950 },
1339 { 0x1a, 0x411111f0 },
1340 { 0x1b, 0x411111f0 },
1341 { 0x1c, 0x411111f0 },
1342 { 0x1d, 0x411111f0 },
1343 { 0x1e, 0x01454140 },
1344 { }
1345 },
1346 .chained = true,
1347 .chain_id = ALC880_FIXUP_VOL_KNOB,
1348 },
1349 [ALC880_FIXUP_F1734] = {
1350
1351 .type = HDA_FIXUP_PINS,
1352 .v.pins = (const struct hda_pintbl[]) {
1353 { 0x14, 0x0121401f },
1354 { 0x15, 0x99030120 },
1355 { 0x16, 0x411111f0 },
1356 { 0x17, 0x411111f0 },
1357 { 0x18, 0x411111f0 },
1358 { 0x19, 0x01a19950 },
1359 { 0x1a, 0x411111f0 },
1360 { 0x1b, 0x411111f0 },
1361 { 0x1c, 0x411111f0 },
1362 { 0x1d, 0x411111f0 },
1363 { 0x1e, 0x411111f0 },
1364 { }
1365 },
1366 .chained = true,
1367 .chain_id = ALC880_FIXUP_VOL_KNOB,
1368 },
1369 [ALC880_FIXUP_UNIWILL] = {
1370
1371 .type = HDA_FIXUP_PINS,
1372 .v.pins = (const struct hda_pintbl[]) {
1373 { 0x14, 0x0121411f },
1374 { 0x15, 0x99030120 },
1375 { 0x16, 0x99030130 },
1376 { }
1377 },
1378 },
1379 [ALC880_FIXUP_UNIWILL_DIG] = {
1380 .type = HDA_FIXUP_PINS,
1381 .v.pins = (const struct hda_pintbl[]) {
1382
1383 { 0x17, 0x411111f0 },
1384 { 0x19, 0x411111f0 },
1385 { 0x1b, 0x411111f0 },
1386 { 0x1f, 0x411111f0 },
1387 { }
1388 }
1389 },
1390 [ALC880_FIXUP_Z71V] = {
1391 .type = HDA_FIXUP_PINS,
1392 .v.pins = (const struct hda_pintbl[]) {
1393
1394 { 0x14, 0x99030120 },
1395 { 0x15, 0x0121411f },
1396 { 0x16, 0x411111f0 },
1397 { 0x17, 0x411111f0 },
1398 { 0x18, 0x01a19950 },
1399 { 0x19, 0x411111f0 },
1400 { 0x1a, 0x01813031 },
1401 { 0x1b, 0x411111f0 },
1402 { 0x1c, 0x411111f0 },
1403 { 0x1d, 0x411111f0 },
1404 { 0x1e, 0x0144111e },
1405 { }
1406 }
1407 },
1408 [ALC880_FIXUP_ASUS_W5A] = {
1409 .type = HDA_FIXUP_PINS,
1410 .v.pins = (const struct hda_pintbl[]) {
1411
1412 { 0x14, 0x0121411f },
1413 { 0x15, 0x411111f0 },
1414 { 0x16, 0x411111f0 },
1415 { 0x17, 0x411111f0 },
1416 { 0x18, 0x90a60160 },
1417 { 0x19, 0x411111f0 },
1418 { 0x1a, 0x411111f0 },
1419 { 0x1b, 0x411111f0 },
1420 { 0x1c, 0x411111f0 },
1421 { 0x1d, 0x411111f0 },
1422 { 0x1e, 0xb743111e },
1423 { }
1424 },
1425 .chained = true,
1426 .chain_id = ALC880_FIXUP_GPIO1,
1427 },
1428 [ALC880_FIXUP_3ST_BASE] = {
1429 .type = HDA_FIXUP_PINS,
1430 .v.pins = (const struct hda_pintbl[]) {
1431 { 0x14, 0x01014010 },
1432 { 0x15, 0x411111f0 },
1433 { 0x16, 0x411111f0 },
1434 { 0x17, 0x411111f0 },
1435 { 0x18, 0x01a19c30 },
1436 { 0x19, 0x0121411f },
1437 { 0x1a, 0x01813031 },
1438 { 0x1b, 0x02a19c40 },
1439 { 0x1c, 0x411111f0 },
1440 { 0x1d, 0x411111f0 },
1441
1442 { 0x1f, 0x411111f0 },
1443 { }
1444 }
1445 },
1446 [ALC880_FIXUP_3ST] = {
1447 .type = HDA_FIXUP_PINS,
1448 .v.pins = (const struct hda_pintbl[]) {
1449 { 0x1e, 0x411111f0 },
1450 { }
1451 },
1452 .chained = true,
1453 .chain_id = ALC880_FIXUP_3ST_BASE,
1454 },
1455 [ALC880_FIXUP_3ST_DIG] = {
1456 .type = HDA_FIXUP_PINS,
1457 .v.pins = (const struct hda_pintbl[]) {
1458 { 0x1e, 0x0144111e },
1459 { }
1460 },
1461 .chained = true,
1462 .chain_id = ALC880_FIXUP_3ST_BASE,
1463 },
1464 [ALC880_FIXUP_5ST_BASE] = {
1465 .type = HDA_FIXUP_PINS,
1466 .v.pins = (const struct hda_pintbl[]) {
1467 { 0x14, 0x01014010 },
1468 { 0x15, 0x411111f0 },
1469 { 0x16, 0x01011411 },
1470 { 0x17, 0x01016412 },
1471 { 0x18, 0x01a19c30 },
1472 { 0x19, 0x0121411f },
1473 { 0x1a, 0x01813031 },
1474 { 0x1b, 0x02a19c40 },
1475 { 0x1c, 0x411111f0 },
1476 { 0x1d, 0x411111f0 },
1477
1478 { 0x1f, 0x411111f0 },
1479 { }
1480 }
1481 },
1482 [ALC880_FIXUP_5ST] = {
1483 .type = HDA_FIXUP_PINS,
1484 .v.pins = (const struct hda_pintbl[]) {
1485 { 0x1e, 0x411111f0 },
1486 { }
1487 },
1488 .chained = true,
1489 .chain_id = ALC880_FIXUP_5ST_BASE,
1490 },
1491 [ALC880_FIXUP_5ST_DIG] = {
1492 .type = HDA_FIXUP_PINS,
1493 .v.pins = (const struct hda_pintbl[]) {
1494 { 0x1e, 0x0144111e },
1495 { }
1496 },
1497 .chained = true,
1498 .chain_id = ALC880_FIXUP_5ST_BASE,
1499 },
1500 [ALC880_FIXUP_6ST_BASE] = {
1501 .type = HDA_FIXUP_PINS,
1502 .v.pins = (const struct hda_pintbl[]) {
1503 { 0x14, 0x01014010 },
1504 { 0x15, 0x01016412 },
1505 { 0x16, 0x01011411 },
1506 { 0x17, 0x01012414 },
1507 { 0x18, 0x01a19c30 },
1508 { 0x19, 0x02a19c40 },
1509 { 0x1a, 0x01813031 },
1510 { 0x1b, 0x0121411f },
1511 { 0x1c, 0x411111f0 },
1512 { 0x1d, 0x411111f0 },
1513
1514 { 0x1f, 0x411111f0 },
1515 { }
1516 }
1517 },
1518 [ALC880_FIXUP_6ST] = {
1519 .type = HDA_FIXUP_PINS,
1520 .v.pins = (const struct hda_pintbl[]) {
1521 { 0x1e, 0x411111f0 },
1522 { }
1523 },
1524 .chained = true,
1525 .chain_id = ALC880_FIXUP_6ST_BASE,
1526 },
1527 [ALC880_FIXUP_6ST_DIG] = {
1528 .type = HDA_FIXUP_PINS,
1529 .v.pins = (const struct hda_pintbl[]) {
1530 { 0x1e, 0x0144111e },
1531 { }
1532 },
1533 .chained = true,
1534 .chain_id = ALC880_FIXUP_6ST_BASE,
1535 },
1536 [ALC880_FIXUP_6ST_AUTOMUTE] = {
1537 .type = HDA_FIXUP_PINS,
1538 .v.pins = (const struct hda_pintbl[]) {
1539 { 0x1b, 0x0121401f },
1540 { }
1541 },
1542 .chained_before = true,
1543 .chain_id = ALC880_FIXUP_6ST_BASE,
1544 },
1545};
1546
1547static const struct snd_pci_quirk alc880_fixup_tbl[] = {
1548 SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_FIXUP_W810),
1549 SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS W5A", ALC880_FIXUP_ASUS_W5A),
1550 SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_FIXUP_Z71V),
1551 SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_FIXUP_GPIO1),
1552 SND_PCI_QUIRK(0x147b, 0x1045, "ABit AA8XE", ALC880_FIXUP_6ST_AUTOMUTE),
1553 SND_PCI_QUIRK(0x1558, 0x5401, "Clevo GPIO2", ALC880_FIXUP_GPIO2),
1554 SND_PCI_QUIRK_VENDOR(0x1558, "Clevo", ALC880_FIXUP_EAPD_COEF),
1555 SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_FIXUP_UNIWILL_DIG),
1556 SND_PCI_QUIRK(0x1584, 0x9054, "Uniwill", ALC880_FIXUP_F1734),
1557 SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_FIXUP_UNIWILL),
1558 SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_FIXUP_VOL_KNOB),
1559 SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_FIXUP_W810),
1560 SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_FIXUP_MEDION_RIM),
1561 SND_PCI_QUIRK(0x1631, 0xe011, "PB 13201056", ALC880_FIXUP_6ST_AUTOMUTE),
1562 SND_PCI_QUIRK(0x1734, 0x107c, "FSC Amilo M1437", ALC880_FIXUP_FUJITSU),
1563 SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FIXUP_FUJITSU),
1564 SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_FIXUP_F1734),
1565 SND_PCI_QUIRK(0x1734, 0x10b0, "FSC Amilo Pi1556", ALC880_FIXUP_FUJITSU),
1566 SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_FIXUP_LG),
1567 SND_PCI_QUIRK(0x1854, 0x005f, "LG P1 Express", ALC880_FIXUP_LG),
1568 SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_FIXUP_LG),
1569 SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_FIXUP_LG_LW25),
1570 SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_FIXUP_TCL_S700),
1571
1572
1573
1574
1575
1576
1577
1578 SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_FIXUP_5ST_DIG),
1579 SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_FIXUP_6ST),
1580 SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_FIXUP_3ST_DIG),
1581 SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_FIXUP_6ST_DIG),
1582 SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_FIXUP_6ST_DIG),
1583 SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_FIXUP_6ST_DIG),
1584 SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_FIXUP_3ST_DIG),
1585 SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_FIXUP_3ST),
1586 SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_FIXUP_6ST_DIG),
1587 SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_FIXUP_3ST),
1588 SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_FIXUP_3ST),
1589 SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_FIXUP_5ST),
1590 SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_FIXUP_5ST),
1591 SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_FIXUP_5ST),
1592 SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_FIXUP_6ST_DIG),
1593 SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_FIXUP_6ST_DIG),
1594 SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_FIXUP_6ST_DIG),
1595 SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_FIXUP_6ST_DIG),
1596 SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_FIXUP_5ST_DIG),
1597 SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_FIXUP_5ST_DIG),
1598 SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_FIXUP_5ST_DIG),
1599 SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_FIXUP_6ST_DIG),
1600 SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_FIXUP_6ST_DIG),
1601 SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1602 SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1603 SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1604 SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1605 SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1606 SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1607 SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1608 SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1609 SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1610 SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1611
1612 SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_FIXUP_3ST),
1613 SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_FIXUP_5ST_DIG),
1614 SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_FIXUP_6ST_DIG),
1615 {}
1616};
1617
1618static const struct hda_model_fixup alc880_fixup_models[] = {
1619 {.id = ALC880_FIXUP_3ST, .name = "3stack"},
1620 {.id = ALC880_FIXUP_3ST_DIG, .name = "3stack-digout"},
1621 {.id = ALC880_FIXUP_5ST, .name = "5stack"},
1622 {.id = ALC880_FIXUP_5ST_DIG, .name = "5stack-digout"},
1623 {.id = ALC880_FIXUP_6ST, .name = "6stack"},
1624 {.id = ALC880_FIXUP_6ST_DIG, .name = "6stack-digout"},
1625 {.id = ALC880_FIXUP_6ST_AUTOMUTE, .name = "6stack-automute"},
1626 {}
1627};
1628
1629
1630
1631
1632
1633static int patch_alc880(struct hda_codec *codec)
1634{
1635 struct alc_spec *spec;
1636 int err;
1637
1638 err = alc_alloc_spec(codec, 0x0b);
1639 if (err < 0)
1640 return err;
1641
1642 spec = codec->spec;
1643 spec->gen.need_dac_fix = 1;
1644 spec->gen.beep_nid = 0x01;
1645
1646 codec->patch_ops.unsol_event = alc880_unsol_event;
1647
1648 alc_pre_init(codec);
1649
1650 snd_hda_pick_fixup(codec, alc880_fixup_models, alc880_fixup_tbl,
1651 alc880_fixups);
1652 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1653
1654
1655 err = alc880_parse_auto_config(codec);
1656 if (err < 0)
1657 goto error;
1658
1659 if (!spec->gen.no_analog) {
1660 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
1661 if (err < 0)
1662 goto error;
1663 }
1664
1665 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
1666
1667 return 0;
1668
1669 error:
1670 alc_free(codec);
1671 return err;
1672}
1673
1674
1675
1676
1677
1678static int alc260_parse_auto_config(struct hda_codec *codec)
1679{
1680 static const hda_nid_t alc260_ignore[] = { 0x17, 0 };
1681 static const hda_nid_t alc260_ssids[] = { 0x10, 0x15, 0x0f, 0 };
1682 return alc_parse_auto_config(codec, alc260_ignore, alc260_ssids);
1683}
1684
1685
1686
1687
1688enum {
1689 ALC260_FIXUP_HP_DC5750,
1690 ALC260_FIXUP_HP_PIN_0F,
1691 ALC260_FIXUP_COEF,
1692 ALC260_FIXUP_GPIO1,
1693 ALC260_FIXUP_GPIO1_TOGGLE,
1694 ALC260_FIXUP_REPLACER,
1695 ALC260_FIXUP_HP_B1900,
1696 ALC260_FIXUP_KN1,
1697 ALC260_FIXUP_FSC_S7020,
1698 ALC260_FIXUP_FSC_S7020_JWSE,
1699 ALC260_FIXUP_VAIO_PINS,
1700};
1701
1702static void alc260_gpio1_automute(struct hda_codec *codec)
1703{
1704 struct alc_spec *spec = codec->spec;
1705
1706 alc_update_gpio_data(codec, 0x01, spec->gen.hp_jack_present);
1707}
1708
1709static void alc260_fixup_gpio1_toggle(struct hda_codec *codec,
1710 const struct hda_fixup *fix, int action)
1711{
1712 struct alc_spec *spec = codec->spec;
1713 if (action == HDA_FIXUP_ACT_PROBE) {
1714
1715
1716
1717 spec->gen.automute_hook = alc260_gpio1_automute;
1718 spec->gen.detect_hp = 1;
1719 spec->gen.automute_speaker = 1;
1720 spec->gen.autocfg.hp_pins[0] = 0x0f;
1721 snd_hda_jack_detect_enable_callback(codec, 0x0f,
1722 snd_hda_gen_hp_automute);
1723 alc_setup_gpio(codec, 0x01);
1724 }
1725}
1726
1727static void alc260_fixup_kn1(struct hda_codec *codec,
1728 const struct hda_fixup *fix, int action)
1729{
1730 struct alc_spec *spec = codec->spec;
1731 static const struct hda_pintbl pincfgs[] = {
1732 { 0x0f, 0x02214000 },
1733 { 0x12, 0x90a60160 },
1734 { 0x13, 0x02a19000 },
1735 { 0x18, 0x01446000 },
1736
1737 { 0x10, 0x411111f0 },
1738 { 0x11, 0x411111f0 },
1739 { 0x14, 0x411111f0 },
1740 { 0x15, 0x411111f0 },
1741 { 0x16, 0x411111f0 },
1742 { 0x17, 0x411111f0 },
1743 { 0x19, 0x411111f0 },
1744 { }
1745 };
1746
1747 switch (action) {
1748 case HDA_FIXUP_ACT_PRE_PROBE:
1749 snd_hda_apply_pincfgs(codec, pincfgs);
1750 spec->init_amp = ALC_INIT_NONE;
1751 break;
1752 }
1753}
1754
1755static void alc260_fixup_fsc_s7020(struct hda_codec *codec,
1756 const struct hda_fixup *fix, int action)
1757{
1758 struct alc_spec *spec = codec->spec;
1759 if (action == HDA_FIXUP_ACT_PRE_PROBE)
1760 spec->init_amp = ALC_INIT_NONE;
1761}
1762
1763static void alc260_fixup_fsc_s7020_jwse(struct hda_codec *codec,
1764 const struct hda_fixup *fix, int action)
1765{
1766 struct alc_spec *spec = codec->spec;
1767 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1768 spec->gen.add_jack_modes = 1;
1769 spec->gen.hp_mic = 1;
1770 }
1771}
1772
1773static const struct hda_fixup alc260_fixups[] = {
1774 [ALC260_FIXUP_HP_DC5750] = {
1775 .type = HDA_FIXUP_PINS,
1776 .v.pins = (const struct hda_pintbl[]) {
1777 { 0x11, 0x90130110 },
1778 { }
1779 }
1780 },
1781 [ALC260_FIXUP_HP_PIN_0F] = {
1782 .type = HDA_FIXUP_PINS,
1783 .v.pins = (const struct hda_pintbl[]) {
1784 { 0x0f, 0x01214000 },
1785 { }
1786 }
1787 },
1788 [ALC260_FIXUP_COEF] = {
1789 .type = HDA_FIXUP_VERBS,
1790 .v.verbs = (const struct hda_verb[]) {
1791 { 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1792 { 0x1a, AC_VERB_SET_PROC_COEF, 0x3040 },
1793 { }
1794 },
1795 },
1796 [ALC260_FIXUP_GPIO1] = {
1797 .type = HDA_FIXUP_FUNC,
1798 .v.func = alc_fixup_gpio1,
1799 },
1800 [ALC260_FIXUP_GPIO1_TOGGLE] = {
1801 .type = HDA_FIXUP_FUNC,
1802 .v.func = alc260_fixup_gpio1_toggle,
1803 .chained = true,
1804 .chain_id = ALC260_FIXUP_HP_PIN_0F,
1805 },
1806 [ALC260_FIXUP_REPLACER] = {
1807 .type = HDA_FIXUP_VERBS,
1808 .v.verbs = (const struct hda_verb[]) {
1809 { 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1810 { 0x1a, AC_VERB_SET_PROC_COEF, 0x3050 },
1811 { }
1812 },
1813 .chained = true,
1814 .chain_id = ALC260_FIXUP_GPIO1_TOGGLE,
1815 },
1816 [ALC260_FIXUP_HP_B1900] = {
1817 .type = HDA_FIXUP_FUNC,
1818 .v.func = alc260_fixup_gpio1_toggle,
1819 .chained = true,
1820 .chain_id = ALC260_FIXUP_COEF,
1821 },
1822 [ALC260_FIXUP_KN1] = {
1823 .type = HDA_FIXUP_FUNC,
1824 .v.func = alc260_fixup_kn1,
1825 },
1826 [ALC260_FIXUP_FSC_S7020] = {
1827 .type = HDA_FIXUP_FUNC,
1828 .v.func = alc260_fixup_fsc_s7020,
1829 },
1830 [ALC260_FIXUP_FSC_S7020_JWSE] = {
1831 .type = HDA_FIXUP_FUNC,
1832 .v.func = alc260_fixup_fsc_s7020_jwse,
1833 .chained = true,
1834 .chain_id = ALC260_FIXUP_FSC_S7020,
1835 },
1836 [ALC260_FIXUP_VAIO_PINS] = {
1837 .type = HDA_FIXUP_PINS,
1838 .v.pins = (const struct hda_pintbl[]) {
1839
1840 { 0x0f, 0x01211020 },
1841 { 0x10, 0x0001003f },
1842 { 0x11, 0x411111f0 },
1843 { 0x12, 0x01a15930 },
1844 { 0x13, 0x411111f0 },
1845 { 0x14, 0x411111f0 },
1846 { 0x15, 0x411111f0 },
1847 { 0x16, 0x411111f0 },
1848 { 0x17, 0x411111f0 },
1849 { 0x18, 0x411111f0 },
1850 { 0x19, 0x411111f0 },
1851 { }
1852 }
1853 },
1854};
1855
1856static const struct snd_pci_quirk alc260_fixup_tbl[] = {
1857 SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_FIXUP_GPIO1),
1858 SND_PCI_QUIRK(0x1025, 0x007f, "Acer Aspire 9500", ALC260_FIXUP_COEF),
1859 SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_FIXUP_GPIO1),
1860 SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", ALC260_FIXUP_HP_DC5750),
1861 SND_PCI_QUIRK(0x103c, 0x30ba, "HP Presario B1900", ALC260_FIXUP_HP_B1900),
1862 SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_FIXUP_VAIO_PINS),
1863 SND_PCI_QUIRK(0x104d, 0x81e2, "Sony VAIO TX", ALC260_FIXUP_HP_PIN_0F),
1864 SND_PCI_QUIRK(0x10cf, 0x1326, "FSC LifeBook S7020", ALC260_FIXUP_FSC_S7020),
1865 SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FIXUP_GPIO1),
1866 SND_PCI_QUIRK(0x152d, 0x0729, "Quanta KN1", ALC260_FIXUP_KN1),
1867 SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_FIXUP_REPLACER),
1868 SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_FIXUP_COEF),
1869 {}
1870};
1871
1872static const struct hda_model_fixup alc260_fixup_models[] = {
1873 {.id = ALC260_FIXUP_GPIO1, .name = "gpio1"},
1874 {.id = ALC260_FIXUP_COEF, .name = "coef"},
1875 {.id = ALC260_FIXUP_FSC_S7020, .name = "fujitsu"},
1876 {.id = ALC260_FIXUP_FSC_S7020_JWSE, .name = "fujitsu-jwse"},
1877 {}
1878};
1879
1880
1881
1882static int patch_alc260(struct hda_codec *codec)
1883{
1884 struct alc_spec *spec;
1885 int err;
1886
1887 err = alc_alloc_spec(codec, 0x07);
1888 if (err < 0)
1889 return err;
1890
1891 spec = codec->spec;
1892
1893
1894
1895
1896 spec->gen.prefer_hp_amp = 1;
1897 spec->gen.beep_nid = 0x01;
1898
1899 spec->shutup = alc_eapd_shutup;
1900
1901 alc_pre_init(codec);
1902
1903 snd_hda_pick_fixup(codec, alc260_fixup_models, alc260_fixup_tbl,
1904 alc260_fixups);
1905 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1906
1907
1908 err = alc260_parse_auto_config(codec);
1909 if (err < 0)
1910 goto error;
1911
1912 if (!spec->gen.no_analog) {
1913 err = set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
1914 if (err < 0)
1915 goto error;
1916 }
1917
1918 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
1919
1920 return 0;
1921
1922 error:
1923 alc_free(codec);
1924 return err;
1925}
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943enum {
1944 ALC882_FIXUP_ABIT_AW9D_MAX,
1945 ALC882_FIXUP_LENOVO_Y530,
1946 ALC882_FIXUP_PB_M5210,
1947 ALC882_FIXUP_ACER_ASPIRE_7736,
1948 ALC882_FIXUP_ASUS_W90V,
1949 ALC889_FIXUP_CD,
1950 ALC889_FIXUP_FRONT_HP_NO_PRESENCE,
1951 ALC889_FIXUP_VAIO_TT,
1952 ALC888_FIXUP_EEE1601,
1953 ALC886_FIXUP_EAPD,
1954 ALC882_FIXUP_EAPD,
1955 ALC883_FIXUP_EAPD,
1956 ALC883_FIXUP_ACER_EAPD,
1957 ALC882_FIXUP_GPIO1,
1958 ALC882_FIXUP_GPIO2,
1959 ALC882_FIXUP_GPIO3,
1960 ALC889_FIXUP_COEF,
1961 ALC882_FIXUP_ASUS_W2JC,
1962 ALC882_FIXUP_ACER_ASPIRE_4930G,
1963 ALC882_FIXUP_ACER_ASPIRE_8930G,
1964 ALC882_FIXUP_ASPIRE_8930G_VERBS,
1965 ALC885_FIXUP_MACPRO_GPIO,
1966 ALC889_FIXUP_DAC_ROUTE,
1967 ALC889_FIXUP_MBP_VREF,
1968 ALC889_FIXUP_IMAC91_VREF,
1969 ALC889_FIXUP_MBA11_VREF,
1970 ALC889_FIXUP_MBA21_VREF,
1971 ALC889_FIXUP_MP11_VREF,
1972 ALC889_FIXUP_MP41_VREF,
1973 ALC882_FIXUP_INV_DMIC,
1974 ALC882_FIXUP_NO_PRIMARY_HP,
1975 ALC887_FIXUP_ASUS_BASS,
1976 ALC887_FIXUP_BASS_CHMAP,
1977 ALC1220_FIXUP_GB_DUAL_CODECS,
1978 ALC1220_FIXUP_GB_X570,
1979 ALC1220_FIXUP_CLEVO_P950,
1980 ALC1220_FIXUP_CLEVO_PB51ED,
1981 ALC1220_FIXUP_CLEVO_PB51ED_PINS,
1982 ALC887_FIXUP_ASUS_AUDIO,
1983 ALC887_FIXUP_ASUS_HMIC,
1984};
1985
1986static void alc889_fixup_coef(struct hda_codec *codec,
1987 const struct hda_fixup *fix, int action)
1988{
1989 if (action != HDA_FIXUP_ACT_INIT)
1990 return;
1991 alc_update_coef_idx(codec, 7, 0, 0x2030);
1992}
1993
1994
1995static void alc885_fixup_macpro_gpio(struct hda_codec *codec,
1996 const struct hda_fixup *fix, int action)
1997{
1998 struct alc_spec *spec = codec->spec;
1999
2000 spec->gpio_write_delay = true;
2001 alc_fixup_gpio3(codec, fix, action);
2002}
2003
2004
2005
2006
2007
2008static void alc889_fixup_dac_route(struct hda_codec *codec,
2009 const struct hda_fixup *fix, int action)
2010{
2011 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2012
2013 static const hda_nid_t conn1[] = { 0x0c, 0x0d };
2014 static const hda_nid_t conn2[] = { 0x0e, 0x0f };
2015 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2016 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
2017 snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn2), conn2);
2018 snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn2), conn2);
2019 } else if (action == HDA_FIXUP_ACT_PROBE) {
2020
2021 static const hda_nid_t conn[] = { 0x0c, 0x0d, 0x0e, 0x0f, 0x26 };
2022 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
2023 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn), conn);
2024 snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn), conn);
2025 snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn), conn);
2026 }
2027}
2028
2029
2030static void alc889_fixup_mbp_vref(struct hda_codec *codec,
2031 const struct hda_fixup *fix, int action)
2032{
2033 static const hda_nid_t nids[] = { 0x14, 0x15, 0x19 };
2034 struct alc_spec *spec = codec->spec;
2035 int i;
2036
2037 if (action != HDA_FIXUP_ACT_INIT)
2038 return;
2039 for (i = 0; i < ARRAY_SIZE(nids); i++) {
2040 unsigned int val = snd_hda_codec_get_pincfg(codec, nids[i]);
2041 if (get_defcfg_device(val) != AC_JACK_HP_OUT)
2042 continue;
2043 val = snd_hda_codec_get_pin_target(codec, nids[i]);
2044 val |= AC_PINCTL_VREF_80;
2045 snd_hda_set_pin_ctl(codec, nids[i], val);
2046 spec->gen.keep_vref_in_automute = 1;
2047 break;
2048 }
2049}
2050
2051static void alc889_fixup_mac_pins(struct hda_codec *codec,
2052 const hda_nid_t *nids, int num_nids)
2053{
2054 struct alc_spec *spec = codec->spec;
2055 int i;
2056
2057 for (i = 0; i < num_nids; i++) {
2058 unsigned int val;
2059 val = snd_hda_codec_get_pin_target(codec, nids[i]);
2060 val |= AC_PINCTL_VREF_50;
2061 snd_hda_set_pin_ctl(codec, nids[i], val);
2062 }
2063 spec->gen.keep_vref_in_automute = 1;
2064}
2065
2066
2067static void alc889_fixup_imac91_vref(struct hda_codec *codec,
2068 const struct hda_fixup *fix, int action)
2069{
2070 static const hda_nid_t nids[] = { 0x18, 0x1a };
2071
2072 if (action == HDA_FIXUP_ACT_INIT)
2073 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2074}
2075
2076
2077static void alc889_fixup_mba11_vref(struct hda_codec *codec,
2078 const struct hda_fixup *fix, int action)
2079{
2080 static const hda_nid_t nids[] = { 0x18 };
2081
2082 if (action == HDA_FIXUP_ACT_INIT)
2083 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2084}
2085
2086
2087static void alc889_fixup_mba21_vref(struct hda_codec *codec,
2088 const struct hda_fixup *fix, int action)
2089{
2090 static const hda_nid_t nids[] = { 0x18, 0x19 };
2091
2092 if (action == HDA_FIXUP_ACT_INIT)
2093 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2094}
2095
2096
2097
2098
2099
2100static void alc882_fixup_no_primary_hp(struct hda_codec *codec,
2101 const struct hda_fixup *fix, int action)
2102{
2103 struct alc_spec *spec = codec->spec;
2104 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2105 spec->gen.no_primary_hp = 1;
2106 spec->gen.no_multi_io = 1;
2107 }
2108}
2109
2110static void alc_fixup_bass_chmap(struct hda_codec *codec,
2111 const struct hda_fixup *fix, int action);
2112
2113
2114
2115
2116static void alc_fixup_dual_codecs(struct hda_codec *codec,
2117 const struct hda_fixup *fix, int action)
2118{
2119 struct alc_spec *spec = codec->spec;
2120
2121 if (action != HDA_FIXUP_ACT_PRE_PROBE)
2122 return;
2123
2124 spec->gen.suppress_vmaster = 1;
2125
2126 spec->gen.suppress_auto_mute = 1;
2127 spec->gen.suppress_auto_mic = 1;
2128
2129 spec->gen.mixer_nid = 0;
2130
2131 codec->force_pin_prefix = 1;
2132}
2133
2134static void rename_ctl(struct hda_codec *codec, const char *oldname,
2135 const char *newname)
2136{
2137 struct snd_kcontrol *kctl;
2138
2139 kctl = snd_hda_find_mixer_ctl(codec, oldname);
2140 if (kctl)
2141 strcpy(kctl->id.name, newname);
2142}
2143
2144static void alc1220_fixup_gb_dual_codecs(struct hda_codec *codec,
2145 const struct hda_fixup *fix,
2146 int action)
2147{
2148 alc_fixup_dual_codecs(codec, fix, action);
2149 switch (action) {
2150 case HDA_FIXUP_ACT_PRE_PROBE:
2151
2152 strcpy(codec->card->longname, "HDAudio-Gigabyte-ALC1220DualCodecs");
2153 break;
2154 case HDA_FIXUP_ACT_BUILD:
2155
2156 rename_ctl(codec, "Capture Volume",
2157 codec->addr == 0 ?
2158 "Rear-Panel Capture Volume" :
2159 "Front-Panel Capture Volume");
2160 rename_ctl(codec, "Capture Switch",
2161 codec->addr == 0 ?
2162 "Rear-Panel Capture Switch" :
2163 "Front-Panel Capture Switch");
2164 break;
2165 }
2166}
2167
2168static void alc1220_fixup_gb_x570(struct hda_codec *codec,
2169 const struct hda_fixup *fix,
2170 int action)
2171{
2172 static const hda_nid_t conn1[] = { 0x0c };
2173 static const struct coef_fw gb_x570_coefs[] = {
2174 WRITE_COEF(0x07, 0x03c0),
2175 WRITE_COEF(0x1a, 0x01c1),
2176 WRITE_COEF(0x1b, 0x0202),
2177 WRITE_COEF(0x43, 0x3005),
2178 {}
2179 };
2180
2181 switch (action) {
2182 case HDA_FIXUP_ACT_PRE_PROBE:
2183 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2184 snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
2185 break;
2186 case HDA_FIXUP_ACT_INIT:
2187 alc_process_coef_fw(codec, gb_x570_coefs);
2188 break;
2189 }
2190}
2191
2192static void alc1220_fixup_clevo_p950(struct hda_codec *codec,
2193 const struct hda_fixup *fix,
2194 int action)
2195{
2196 static const hda_nid_t conn1[] = { 0x0c };
2197
2198 if (action != HDA_FIXUP_ACT_PRE_PROBE)
2199 return;
2200
2201 alc_update_coef_idx(codec, 0x7, 0, 0x3c3);
2202
2203
2204
2205 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2206 snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
2207}
2208
2209static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
2210 const struct hda_fixup *fix, int action);
2211
2212static void alc1220_fixup_clevo_pb51ed(struct hda_codec *codec,
2213 const struct hda_fixup *fix,
2214 int action)
2215{
2216 alc1220_fixup_clevo_p950(codec, fix, action);
2217 alc_fixup_headset_mode_no_hp_mic(codec, fix, action);
2218}
2219
2220static void alc887_asus_hp_automute_hook(struct hda_codec *codec,
2221 struct hda_jack_callback *jack)
2222{
2223 struct alc_spec *spec = codec->spec;
2224 unsigned int vref;
2225
2226 snd_hda_gen_hp_automute(codec, jack);
2227
2228 if (spec->gen.hp_jack_present)
2229 vref = AC_PINCTL_VREF_80;
2230 else
2231 vref = AC_PINCTL_VREF_HIZ;
2232 snd_hda_set_pin_ctl(codec, 0x19, PIN_HP | vref);
2233}
2234
2235static void alc887_fixup_asus_jack(struct hda_codec *codec,
2236 const struct hda_fixup *fix, int action)
2237{
2238 struct alc_spec *spec = codec->spec;
2239 if (action != HDA_FIXUP_ACT_PROBE)
2240 return;
2241 snd_hda_set_pin_ctl_cache(codec, 0x1b, PIN_HP);
2242 spec->gen.hp_automute_hook = alc887_asus_hp_automute_hook;
2243}
2244
2245static const struct hda_fixup alc882_fixups[] = {
2246 [ALC882_FIXUP_ABIT_AW9D_MAX] = {
2247 .type = HDA_FIXUP_PINS,
2248 .v.pins = (const struct hda_pintbl[]) {
2249 { 0x15, 0x01080104 },
2250 { 0x16, 0x01011012 },
2251 { 0x17, 0x01016011 },
2252 { }
2253 }
2254 },
2255 [ALC882_FIXUP_LENOVO_Y530] = {
2256 .type = HDA_FIXUP_PINS,
2257 .v.pins = (const struct hda_pintbl[]) {
2258 { 0x15, 0x99130112 },
2259 { 0x16, 0x99130111 },
2260 { }
2261 }
2262 },
2263 [ALC882_FIXUP_PB_M5210] = {
2264 .type = HDA_FIXUP_PINCTLS,
2265 .v.pins = (const struct hda_pintbl[]) {
2266 { 0x19, PIN_VREF50 },
2267 {}
2268 }
2269 },
2270 [ALC882_FIXUP_ACER_ASPIRE_7736] = {
2271 .type = HDA_FIXUP_FUNC,
2272 .v.func = alc_fixup_sku_ignore,
2273 },
2274 [ALC882_FIXUP_ASUS_W90V] = {
2275 .type = HDA_FIXUP_PINS,
2276 .v.pins = (const struct hda_pintbl[]) {
2277 { 0x16, 0x99130110 },
2278 { }
2279 }
2280 },
2281 [ALC889_FIXUP_CD] = {
2282 .type = HDA_FIXUP_PINS,
2283 .v.pins = (const struct hda_pintbl[]) {
2284 { 0x1c, 0x993301f0 },
2285 { }
2286 }
2287 },
2288 [ALC889_FIXUP_FRONT_HP_NO_PRESENCE] = {
2289 .type = HDA_FIXUP_PINS,
2290 .v.pins = (const struct hda_pintbl[]) {
2291 { 0x1b, 0x02214120 },
2292 { }
2293 },
2294 .chained = true,
2295 .chain_id = ALC889_FIXUP_CD,
2296 },
2297 [ALC889_FIXUP_VAIO_TT] = {
2298 .type = HDA_FIXUP_PINS,
2299 .v.pins = (const struct hda_pintbl[]) {
2300 { 0x17, 0x90170111 },
2301 { }
2302 }
2303 },
2304 [ALC888_FIXUP_EEE1601] = {
2305 .type = HDA_FIXUP_VERBS,
2306 .v.verbs = (const struct hda_verb[]) {
2307 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2308 { 0x20, AC_VERB_SET_PROC_COEF, 0x0838 },
2309 { }
2310 }
2311 },
2312 [ALC886_FIXUP_EAPD] = {
2313 .type = HDA_FIXUP_VERBS,
2314 .v.verbs = (const struct hda_verb[]) {
2315
2316 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2317 { 0x20, AC_VERB_SET_PROC_COEF, 0x0068 },
2318 { }
2319 }
2320 },
2321 [ALC882_FIXUP_EAPD] = {
2322 .type = HDA_FIXUP_VERBS,
2323 .v.verbs = (const struct hda_verb[]) {
2324
2325 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2326 { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
2327 { }
2328 }
2329 },
2330 [ALC883_FIXUP_EAPD] = {
2331 .type = HDA_FIXUP_VERBS,
2332 .v.verbs = (const struct hda_verb[]) {
2333
2334 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2335 { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2336 { }
2337 }
2338 },
2339 [ALC883_FIXUP_ACER_EAPD] = {
2340 .type = HDA_FIXUP_VERBS,
2341 .v.verbs = (const struct hda_verb[]) {
2342
2343 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2344 { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2345 { }
2346 }
2347 },
2348 [ALC882_FIXUP_GPIO1] = {
2349 .type = HDA_FIXUP_FUNC,
2350 .v.func = alc_fixup_gpio1,
2351 },
2352 [ALC882_FIXUP_GPIO2] = {
2353 .type = HDA_FIXUP_FUNC,
2354 .v.func = alc_fixup_gpio2,
2355 },
2356 [ALC882_FIXUP_GPIO3] = {
2357 .type = HDA_FIXUP_FUNC,
2358 .v.func = alc_fixup_gpio3,
2359 },
2360 [ALC882_FIXUP_ASUS_W2JC] = {
2361 .type = HDA_FIXUP_FUNC,
2362 .v.func = alc_fixup_gpio1,
2363 .chained = true,
2364 .chain_id = ALC882_FIXUP_EAPD,
2365 },
2366 [ALC889_FIXUP_COEF] = {
2367 .type = HDA_FIXUP_FUNC,
2368 .v.func = alc889_fixup_coef,
2369 },
2370 [ALC882_FIXUP_ACER_ASPIRE_4930G] = {
2371 .type = HDA_FIXUP_PINS,
2372 .v.pins = (const struct hda_pintbl[]) {
2373 { 0x16, 0x99130111 },
2374 { 0x17, 0x99130112 },
2375 { }
2376 },
2377 .chained = true,
2378 .chain_id = ALC882_FIXUP_GPIO1,
2379 },
2380 [ALC882_FIXUP_ACER_ASPIRE_8930G] = {
2381 .type = HDA_FIXUP_PINS,
2382 .v.pins = (const struct hda_pintbl[]) {
2383 { 0x16, 0x99130111 },
2384 { 0x1b, 0x99130112 },
2385 { }
2386 },
2387 .chained = true,
2388 .chain_id = ALC882_FIXUP_ASPIRE_8930G_VERBS,
2389 },
2390 [ALC882_FIXUP_ASPIRE_8930G_VERBS] = {
2391
2392 .type = HDA_FIXUP_VERBS,
2393 .v.verbs = (const struct hda_verb[]) {
2394
2395
2396
2397
2398 { 0x20, AC_VERB_SET_COEF_INDEX, 0x03 },
2399 { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2400
2401
2402
2403 { 0x20, AC_VERB_SET_COEF_INDEX, 0x08 },
2404 { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2417 { 0x20, AC_VERB_SET_PROC_COEF, 0x0003 },
2418 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2419 { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2420 { }
2421 },
2422 .chained = true,
2423 .chain_id = ALC882_FIXUP_GPIO1,
2424 },
2425 [ALC885_FIXUP_MACPRO_GPIO] = {
2426 .type = HDA_FIXUP_FUNC,
2427 .v.func = alc885_fixup_macpro_gpio,
2428 },
2429 [ALC889_FIXUP_DAC_ROUTE] = {
2430 .type = HDA_FIXUP_FUNC,
2431 .v.func = alc889_fixup_dac_route,
2432 },
2433 [ALC889_FIXUP_MBP_VREF] = {
2434 .type = HDA_FIXUP_FUNC,
2435 .v.func = alc889_fixup_mbp_vref,
2436 .chained = true,
2437 .chain_id = ALC882_FIXUP_GPIO1,
2438 },
2439 [ALC889_FIXUP_IMAC91_VREF] = {
2440 .type = HDA_FIXUP_FUNC,
2441 .v.func = alc889_fixup_imac91_vref,
2442 .chained = true,
2443 .chain_id = ALC882_FIXUP_GPIO1,
2444 },
2445 [ALC889_FIXUP_MBA11_VREF] = {
2446 .type = HDA_FIXUP_FUNC,
2447 .v.func = alc889_fixup_mba11_vref,
2448 .chained = true,
2449 .chain_id = ALC889_FIXUP_MBP_VREF,
2450 },
2451 [ALC889_FIXUP_MBA21_VREF] = {
2452 .type = HDA_FIXUP_FUNC,
2453 .v.func = alc889_fixup_mba21_vref,
2454 .chained = true,
2455 .chain_id = ALC889_FIXUP_MBP_VREF,
2456 },
2457 [ALC889_FIXUP_MP11_VREF] = {
2458 .type = HDA_FIXUP_FUNC,
2459 .v.func = alc889_fixup_mba11_vref,
2460 .chained = true,
2461 .chain_id = ALC885_FIXUP_MACPRO_GPIO,
2462 },
2463 [ALC889_FIXUP_MP41_VREF] = {
2464 .type = HDA_FIXUP_FUNC,
2465 .v.func = alc889_fixup_mbp_vref,
2466 .chained = true,
2467 .chain_id = ALC885_FIXUP_MACPRO_GPIO,
2468 },
2469 [ALC882_FIXUP_INV_DMIC] = {
2470 .type = HDA_FIXUP_FUNC,
2471 .v.func = alc_fixup_inv_dmic,
2472 },
2473 [ALC882_FIXUP_NO_PRIMARY_HP] = {
2474 .type = HDA_FIXUP_FUNC,
2475 .v.func = alc882_fixup_no_primary_hp,
2476 },
2477 [ALC887_FIXUP_ASUS_BASS] = {
2478 .type = HDA_FIXUP_PINS,
2479 .v.pins = (const struct hda_pintbl[]) {
2480 {0x16, 0x99130130},
2481 {}
2482 },
2483 .chained = true,
2484 .chain_id = ALC887_FIXUP_BASS_CHMAP,
2485 },
2486 [ALC887_FIXUP_BASS_CHMAP] = {
2487 .type = HDA_FIXUP_FUNC,
2488 .v.func = alc_fixup_bass_chmap,
2489 },
2490 [ALC1220_FIXUP_GB_DUAL_CODECS] = {
2491 .type = HDA_FIXUP_FUNC,
2492 .v.func = alc1220_fixup_gb_dual_codecs,
2493 },
2494 [ALC1220_FIXUP_GB_X570] = {
2495 .type = HDA_FIXUP_FUNC,
2496 .v.func = alc1220_fixup_gb_x570,
2497 },
2498 [ALC1220_FIXUP_CLEVO_P950] = {
2499 .type = HDA_FIXUP_FUNC,
2500 .v.func = alc1220_fixup_clevo_p950,
2501 },
2502 [ALC1220_FIXUP_CLEVO_PB51ED] = {
2503 .type = HDA_FIXUP_FUNC,
2504 .v.func = alc1220_fixup_clevo_pb51ed,
2505 },
2506 [ALC1220_FIXUP_CLEVO_PB51ED_PINS] = {
2507 .type = HDA_FIXUP_PINS,
2508 .v.pins = (const struct hda_pintbl[]) {
2509 { 0x19, 0x01a1913c },
2510 {}
2511 },
2512 .chained = true,
2513 .chain_id = ALC1220_FIXUP_CLEVO_PB51ED,
2514 },
2515 [ALC887_FIXUP_ASUS_AUDIO] = {
2516 .type = HDA_FIXUP_PINS,
2517 .v.pins = (const struct hda_pintbl[]) {
2518 { 0x15, 0x02a14150 },
2519 { 0x19, 0x22219420 },
2520 {}
2521 },
2522 },
2523 [ALC887_FIXUP_ASUS_HMIC] = {
2524 .type = HDA_FIXUP_FUNC,
2525 .v.func = alc887_fixup_asus_jack,
2526 .chained = true,
2527 .chain_id = ALC887_FIXUP_ASUS_AUDIO,
2528 },
2529};
2530
2531static const struct snd_pci_quirk alc882_fixup_tbl[] = {
2532 SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD),
2533 SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2534 SND_PCI_QUIRK(0x1025, 0x0107, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2535 SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD),
2536 SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2537 SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD),
2538 SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_FIXUP_ACER_EAPD),
2539 SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
2540 ALC882_FIXUP_ACER_ASPIRE_4930G),
2541 SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
2542 ALC882_FIXUP_ACER_ASPIRE_4930G),
2543 SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
2544 ALC882_FIXUP_ACER_ASPIRE_8930G),
2545 SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
2546 ALC882_FIXUP_ACER_ASPIRE_8930G),
2547 SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
2548 ALC882_FIXUP_ACER_ASPIRE_4930G),
2549 SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
2550 SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
2551 ALC882_FIXUP_ACER_ASPIRE_4930G),
2552 SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
2553 ALC882_FIXUP_ACER_ASPIRE_4930G),
2554 SND_PCI_QUIRK(0x1025, 0x021e, "Acer Aspire 5739G",
2555 ALC882_FIXUP_ACER_ASPIRE_4930G),
2556 SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),
2557 SND_PCI_QUIRK(0x1025, 0x026b, "Acer Aspire 8940G", ALC882_FIXUP_ACER_ASPIRE_8930G),
2558 SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736),
2559 SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD),
2560 SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),
2561 SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_FIXUP_ASUS_W2JC),
2562 SND_PCI_QUIRK(0x1043, 0x2390, "Asus D700SA", ALC887_FIXUP_ASUS_HMIC),
2563 SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601),
2564 SND_PCI_QUIRK(0x1043, 0x84bc, "ASUS ET2700", ALC887_FIXUP_ASUS_BASS),
2565 SND_PCI_QUIRK(0x1043, 0x8691, "ASUS ROG Ranger VIII", ALC882_FIXUP_GPIO3),
2566 SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP),
2567 SND_PCI_QUIRK(0x104d, 0x9044, "Sony VAIO AiO", ALC882_FIXUP_NO_PRIMARY_HP),
2568 SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT),
2569 SND_PCI_QUIRK(0x104d, 0x905a, "Sony Vaio Z", ALC882_FIXUP_NO_PRIMARY_HP),
2570 SND_PCI_QUIRK(0x104d, 0x9060, "Sony Vaio VPCL14M1R", ALC882_FIXUP_NO_PRIMARY_HP),
2571
2572
2573 SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF),
2574 SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC889_FIXUP_MBP_VREF),
2575 SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
2576 SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC889_FIXUP_MP11_VREF),
2577 SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_FIXUP_MACPRO_GPIO),
2578 SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_FIXUP_MACPRO_GPIO),
2579 SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC889_FIXUP_MBP_VREF),
2580 SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889_FIXUP_MBP_VREF),
2581 SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD),
2582 SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC889_FIXUP_MBA11_VREF),
2583 SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBA21_VREF),
2584 SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889_FIXUP_MBP_VREF),
2585 SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
2586 SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO),
2587 SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF),
2588 SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF),
2589 SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF),
2590 SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 4,1/5,1", ALC889_FIXUP_MP41_VREF),
2591 SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF),
2592 SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),
2593 SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),
2594 SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_MBA11_VREF),
2595
2596 SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),
2597 SND_PCI_QUIRK(0x13fe, 0x1009, "Advantech MIT-W101", ALC886_FIXUP_EAPD),
2598 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE),
2599 SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
2600 SND_PCI_QUIRK(0x1458, 0xa0cd, "Gigabyte X570 Aorus Master", ALC1220_FIXUP_GB_X570),
2601 SND_PCI_QUIRK(0x1458, 0xa0ce, "Gigabyte X570 Aorus Xtreme", ALC1220_FIXUP_GB_X570),
2602 SND_PCI_QUIRK(0x1458, 0xa0d5, "Gigabyte X570S Aorus Master", ALC1220_FIXUP_GB_X570),
2603 SND_PCI_QUIRK(0x1462, 0x11f7, "MSI-GE63", ALC1220_FIXUP_CLEVO_P950),
2604 SND_PCI_QUIRK(0x1462, 0x1228, "MSI-GP63", ALC1220_FIXUP_CLEVO_P950),
2605 SND_PCI_QUIRK(0x1462, 0x1229, "MSI-GP73", ALC1220_FIXUP_CLEVO_P950),
2606 SND_PCI_QUIRK(0x1462, 0x1275, "MSI-GL63", ALC1220_FIXUP_CLEVO_P950),
2607 SND_PCI_QUIRK(0x1462, 0x1276, "MSI-GL73", ALC1220_FIXUP_CLEVO_P950),
2608 SND_PCI_QUIRK(0x1462, 0x1293, "MSI-GP65", ALC1220_FIXUP_CLEVO_P950),
2609 SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),
2610 SND_PCI_QUIRK(0x1462, 0xcc34, "MSI Godlike X570", ALC1220_FIXUP_GB_DUAL_CODECS),
2611 SND_PCI_QUIRK(0x1462, 0xda57, "MSI Z270-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
2612 SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
2613 SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
2614 SND_PCI_QUIRK(0x1558, 0x50d3, "Clevo PC50[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2615 SND_PCI_QUIRK(0x1558, 0x65d1, "Clevo PB51[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2616 SND_PCI_QUIRK(0x1558, 0x65d2, "Clevo PB51R[CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2617 SND_PCI_QUIRK(0x1558, 0x65e1, "Clevo PB51[ED][DF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2618 SND_PCI_QUIRK(0x1558, 0x65e5, "Clevo PC50D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2619 SND_PCI_QUIRK(0x1558, 0x65f1, "Clevo PC50HS", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2620 SND_PCI_QUIRK(0x1558, 0x65f5, "Clevo PD50PN[NRT]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2621 SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2622 SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2623 SND_PCI_QUIRK(0x1558, 0x67e5, "Clevo PC70D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2624 SND_PCI_QUIRK(0x1558, 0x67f1, "Clevo PC70H[PRS]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2625 SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2626 SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170SM", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2627 SND_PCI_QUIRK(0x1558, 0x7715, "Clevo X170KM-G", ALC1220_FIXUP_CLEVO_PB51ED),
2628 SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),
2629 SND_PCI_QUIRK(0x1558, 0x9506, "Clevo P955HQ", ALC1220_FIXUP_CLEVO_P950),
2630 SND_PCI_QUIRK(0x1558, 0x950a, "Clevo P955H[PR]", ALC1220_FIXUP_CLEVO_P950),
2631 SND_PCI_QUIRK(0x1558, 0x95e1, "Clevo P95xER", ALC1220_FIXUP_CLEVO_P950),
2632 SND_PCI_QUIRK(0x1558, 0x95e2, "Clevo P950ER", ALC1220_FIXUP_CLEVO_P950),
2633 SND_PCI_QUIRK(0x1558, 0x95e3, "Clevo P955[ER]T", ALC1220_FIXUP_CLEVO_P950),
2634 SND_PCI_QUIRK(0x1558, 0x95e4, "Clevo P955ER", ALC1220_FIXUP_CLEVO_P950),
2635 SND_PCI_QUIRK(0x1558, 0x95e5, "Clevo P955EE6", ALC1220_FIXUP_CLEVO_P950),
2636 SND_PCI_QUIRK(0x1558, 0x95e6, "Clevo P950R[CDF]", ALC1220_FIXUP_CLEVO_P950),
2637 SND_PCI_QUIRK(0x1558, 0x96e1, "Clevo P960[ER][CDFN]-K", ALC1220_FIXUP_CLEVO_P950),
2638 SND_PCI_QUIRK(0x1558, 0x97e1, "Clevo P970[ER][CDFN]", ALC1220_FIXUP_CLEVO_P950),
2639 SND_PCI_QUIRK(0x1558, 0x97e2, "Clevo P970RC-M", ALC1220_FIXUP_CLEVO_P950),
2640 SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
2641 SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),
2642 SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),
2643 SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_FIXUP_COEF),
2644 {}
2645};
2646
2647static const struct hda_model_fixup alc882_fixup_models[] = {
2648 {.id = ALC882_FIXUP_ABIT_AW9D_MAX, .name = "abit-aw9d"},
2649 {.id = ALC882_FIXUP_LENOVO_Y530, .name = "lenovo-y530"},
2650 {.id = ALC882_FIXUP_ACER_ASPIRE_7736, .name = "acer-aspire-7736"},
2651 {.id = ALC882_FIXUP_ASUS_W90V, .name = "asus-w90v"},
2652 {.id = ALC889_FIXUP_CD, .name = "cd"},
2653 {.id = ALC889_FIXUP_FRONT_HP_NO_PRESENCE, .name = "no-front-hp"},
2654 {.id = ALC889_FIXUP_VAIO_TT, .name = "vaio-tt"},
2655 {.id = ALC888_FIXUP_EEE1601, .name = "eee1601"},
2656 {.id = ALC882_FIXUP_EAPD, .name = "alc882-eapd"},
2657 {.id = ALC883_FIXUP_EAPD, .name = "alc883-eapd"},
2658 {.id = ALC882_FIXUP_GPIO1, .name = "gpio1"},
2659 {.id = ALC882_FIXUP_GPIO2, .name = "gpio2"},
2660 {.id = ALC882_FIXUP_GPIO3, .name = "gpio3"},
2661 {.id = ALC889_FIXUP_COEF, .name = "alc889-coef"},
2662 {.id = ALC882_FIXUP_ASUS_W2JC, .name = "asus-w2jc"},
2663 {.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name = "acer-aspire-4930g"},
2664 {.id = ALC882_FIXUP_ACER_ASPIRE_8930G, .name = "acer-aspire-8930g"},
2665 {.id = ALC883_FIXUP_ACER_EAPD, .name = "acer-aspire"},
2666 {.id = ALC885_FIXUP_MACPRO_GPIO, .name = "macpro-gpio"},
2667 {.id = ALC889_FIXUP_DAC_ROUTE, .name = "dac-route"},
2668 {.id = ALC889_FIXUP_MBP_VREF, .name = "mbp-vref"},
2669 {.id = ALC889_FIXUP_IMAC91_VREF, .name = "imac91-vref"},
2670 {.id = ALC889_FIXUP_MBA11_VREF, .name = "mba11-vref"},
2671 {.id = ALC889_FIXUP_MBA21_VREF, .name = "mba21-vref"},
2672 {.id = ALC889_FIXUP_MP11_VREF, .name = "mp11-vref"},
2673 {.id = ALC889_FIXUP_MP41_VREF, .name = "mp41-vref"},
2674 {.id = ALC882_FIXUP_INV_DMIC, .name = "inv-dmic"},
2675 {.id = ALC882_FIXUP_NO_PRIMARY_HP, .name = "no-primary-hp"},
2676 {.id = ALC887_FIXUP_ASUS_BASS, .name = "asus-bass"},
2677 {.id = ALC1220_FIXUP_GB_DUAL_CODECS, .name = "dual-codecs"},
2678 {.id = ALC1220_FIXUP_GB_X570, .name = "gb-x570"},
2679 {.id = ALC1220_FIXUP_CLEVO_P950, .name = "clevo-p950"},
2680 {}
2681};
2682
2683static const struct snd_hda_pin_quirk alc882_pin_fixup_tbl[] = {
2684 SND_HDA_PIN_QUIRK(0x10ec1220, 0x1043, "ASUS", ALC1220_FIXUP_CLEVO_P950,
2685 {0x14, 0x01014010},
2686 {0x15, 0x01011012},
2687 {0x16, 0x01016011},
2688 {0x18, 0x01a19040},
2689 {0x19, 0x02a19050},
2690 {0x1a, 0x0181304f},
2691 {0x1b, 0x0221401f},
2692 {0x1e, 0x01456130}),
2693 SND_HDA_PIN_QUIRK(0x10ec1220, 0x1462, "MS-7C35", ALC1220_FIXUP_CLEVO_P950,
2694 {0x14, 0x01015010},
2695 {0x15, 0x01011012},
2696 {0x16, 0x01011011},
2697 {0x18, 0x01a11040},
2698 {0x19, 0x02a19050},
2699 {0x1a, 0x0181104f},
2700 {0x1b, 0x0221401f},
2701 {0x1e, 0x01451130}),
2702 {}
2703};
2704
2705
2706
2707
2708
2709static int alc882_parse_auto_config(struct hda_codec *codec)
2710{
2711 static const hda_nid_t alc882_ignore[] = { 0x1d, 0 };
2712 static const hda_nid_t alc882_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2713 return alc_parse_auto_config(codec, alc882_ignore, alc882_ssids);
2714}
2715
2716
2717
2718static int patch_alc882(struct hda_codec *codec)
2719{
2720 struct alc_spec *spec;
2721 int err;
2722
2723 err = alc_alloc_spec(codec, 0x0b);
2724 if (err < 0)
2725 return err;
2726
2727 spec = codec->spec;
2728
2729 switch (codec->core.vendor_id) {
2730 case 0x10ec0882:
2731 case 0x10ec0885:
2732 case 0x10ec0900:
2733 case 0x10ec0b00:
2734 case 0x10ec1220:
2735 break;
2736 default:
2737
2738 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2739 break;
2740 }
2741
2742 alc_pre_init(codec);
2743
2744 snd_hda_pick_fixup(codec, alc882_fixup_models, alc882_fixup_tbl,
2745 alc882_fixups);
2746 snd_hda_pick_pin_fixup(codec, alc882_pin_fixup_tbl, alc882_fixups, true);
2747 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2748
2749 alc_auto_parse_customize_define(codec);
2750
2751 if (has_cdefine_beep(codec))
2752 spec->gen.beep_nid = 0x01;
2753
2754
2755 err = alc882_parse_auto_config(codec);
2756 if (err < 0)
2757 goto error;
2758
2759 if (!spec->gen.no_analog && spec->gen.beep_nid) {
2760 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2761 if (err < 0)
2762 goto error;
2763 }
2764
2765 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2766
2767 return 0;
2768
2769 error:
2770 alc_free(codec);
2771 return err;
2772}
2773
2774
2775
2776
2777
2778static int alc262_parse_auto_config(struct hda_codec *codec)
2779{
2780 static const hda_nid_t alc262_ignore[] = { 0x1d, 0 };
2781 static const hda_nid_t alc262_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2782 return alc_parse_auto_config(codec, alc262_ignore, alc262_ssids);
2783}
2784
2785
2786
2787
2788enum {
2789 ALC262_FIXUP_FSC_H270,
2790 ALC262_FIXUP_FSC_S7110,
2791 ALC262_FIXUP_HP_Z200,
2792 ALC262_FIXUP_TYAN,
2793 ALC262_FIXUP_LENOVO_3000,
2794 ALC262_FIXUP_BENQ,
2795 ALC262_FIXUP_BENQ_T31,
2796 ALC262_FIXUP_INV_DMIC,
2797 ALC262_FIXUP_INTEL_BAYLEYBAY,
2798};
2799
2800static const struct hda_fixup alc262_fixups[] = {
2801 [ALC262_FIXUP_FSC_H270] = {
2802 .type = HDA_FIXUP_PINS,
2803 .v.pins = (const struct hda_pintbl[]) {
2804 { 0x14, 0x99130110 },
2805 { 0x15, 0x0221142f },
2806 { 0x1b, 0x0121141f },
2807 { }
2808 }
2809 },
2810 [ALC262_FIXUP_FSC_S7110] = {
2811 .type = HDA_FIXUP_PINS,
2812 .v.pins = (const struct hda_pintbl[]) {
2813 { 0x15, 0x90170110 },
2814 { }
2815 },
2816 .chained = true,
2817 .chain_id = ALC262_FIXUP_BENQ,
2818 },
2819 [ALC262_FIXUP_HP_Z200] = {
2820 .type = HDA_FIXUP_PINS,
2821 .v.pins = (const struct hda_pintbl[]) {
2822 { 0x16, 0x99130120 },
2823 { }
2824 }
2825 },
2826 [ALC262_FIXUP_TYAN] = {
2827 .type = HDA_FIXUP_PINS,
2828 .v.pins = (const struct hda_pintbl[]) {
2829 { 0x14, 0x1993e1f0 },
2830 { }
2831 }
2832 },
2833 [ALC262_FIXUP_LENOVO_3000] = {
2834 .type = HDA_FIXUP_PINCTLS,
2835 .v.pins = (const struct hda_pintbl[]) {
2836 { 0x19, PIN_VREF50 },
2837 {}
2838 },
2839 .chained = true,
2840 .chain_id = ALC262_FIXUP_BENQ,
2841 },
2842 [ALC262_FIXUP_BENQ] = {
2843 .type = HDA_FIXUP_VERBS,
2844 .v.verbs = (const struct hda_verb[]) {
2845 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2846 { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2847 {}
2848 }
2849 },
2850 [ALC262_FIXUP_BENQ_T31] = {
2851 .type = HDA_FIXUP_VERBS,
2852 .v.verbs = (const struct hda_verb[]) {
2853 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2854 { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2855 {}
2856 }
2857 },
2858 [ALC262_FIXUP_INV_DMIC] = {
2859 .type = HDA_FIXUP_FUNC,
2860 .v.func = alc_fixup_inv_dmic,
2861 },
2862 [ALC262_FIXUP_INTEL_BAYLEYBAY] = {
2863 .type = HDA_FIXUP_FUNC,
2864 .v.func = alc_fixup_no_depop_delay,
2865 },
2866};
2867
2868static const struct snd_pci_quirk alc262_fixup_tbl[] = {
2869 SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", ALC262_FIXUP_HP_Z200),
2870 SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu Lifebook S7110", ALC262_FIXUP_FSC_S7110),
2871 SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ),
2872 SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN),
2873 SND_PCI_QUIRK(0x1734, 0x1141, "FSC ESPRIMO U9210", ALC262_FIXUP_FSC_H270),
2874 SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270),
2875 SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000),
2876 SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ),
2877 SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_FIXUP_BENQ_T31),
2878 SND_PCI_QUIRK(0x8086, 0x7270, "BayleyBay", ALC262_FIXUP_INTEL_BAYLEYBAY),
2879 {}
2880};
2881
2882static const struct hda_model_fixup alc262_fixup_models[] = {
2883 {.id = ALC262_FIXUP_INV_DMIC, .name = "inv-dmic"},
2884 {.id = ALC262_FIXUP_FSC_H270, .name = "fsc-h270"},
2885 {.id = ALC262_FIXUP_FSC_S7110, .name = "fsc-s7110"},
2886 {.id = ALC262_FIXUP_HP_Z200, .name = "hp-z200"},
2887 {.id = ALC262_FIXUP_TYAN, .name = "tyan"},
2888 {.id = ALC262_FIXUP_LENOVO_3000, .name = "lenovo-3000"},
2889 {.id = ALC262_FIXUP_BENQ, .name = "benq"},
2890 {.id = ALC262_FIXUP_BENQ_T31, .name = "benq-t31"},
2891 {.id = ALC262_FIXUP_INTEL_BAYLEYBAY, .name = "bayleybay"},
2892 {}
2893};
2894
2895
2896
2897static int patch_alc262(struct hda_codec *codec)
2898{
2899 struct alc_spec *spec;
2900 int err;
2901
2902 err = alc_alloc_spec(codec, 0x0b);
2903 if (err < 0)
2904 return err;
2905
2906 spec = codec->spec;
2907 spec->gen.shared_mic_vref_pin = 0x18;
2908
2909 spec->shutup = alc_eapd_shutup;
2910
2911#if 0
2912
2913
2914
2915 alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x80);
2916#endif
2917 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2918
2919 alc_pre_init(codec);
2920
2921 snd_hda_pick_fixup(codec, alc262_fixup_models, alc262_fixup_tbl,
2922 alc262_fixups);
2923 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2924
2925 alc_auto_parse_customize_define(codec);
2926
2927 if (has_cdefine_beep(codec))
2928 spec->gen.beep_nid = 0x01;
2929
2930
2931 err = alc262_parse_auto_config(codec);
2932 if (err < 0)
2933 goto error;
2934
2935 if (!spec->gen.no_analog && spec->gen.beep_nid) {
2936 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2937 if (err < 0)
2938 goto error;
2939 }
2940
2941 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2942
2943 return 0;
2944
2945 error:
2946 alc_free(codec);
2947 return err;
2948}
2949
2950
2951
2952
2953
2954static int alc268_beep_switch_put(struct snd_kcontrol *kcontrol,
2955 struct snd_ctl_elem_value *ucontrol)
2956{
2957 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2958 unsigned long pval;
2959 int err;
2960
2961 mutex_lock(&codec->control_mutex);
2962 pval = kcontrol->private_value;
2963 kcontrol->private_value = (pval & ~0xff) | 0x0f;
2964 err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2965 if (err >= 0) {
2966 kcontrol->private_value = (pval & ~0xff) | 0x10;
2967 err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2968 }
2969 kcontrol->private_value = pval;
2970 mutex_unlock(&codec->control_mutex);
2971 return err;
2972}
2973
2974static const struct snd_kcontrol_new alc268_beep_mixer[] = {
2975 HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
2976 {
2977 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2978 .name = "Beep Playback Switch",
2979 .subdevice = HDA_SUBDEV_AMP_FLAG,
2980 .info = snd_hda_mixer_amp_switch_info,
2981 .get = snd_hda_mixer_amp_switch_get,
2982 .put = alc268_beep_switch_put,
2983 .private_value = HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT)
2984 },
2985};
2986
2987
2988static const struct hda_verb alc268_beep_init_verbs[] = {
2989 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2990 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2991 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2992 { }
2993};
2994
2995enum {
2996 ALC268_FIXUP_INV_DMIC,
2997 ALC268_FIXUP_HP_EAPD,
2998 ALC268_FIXUP_SPDIF,
2999};
3000
3001static const struct hda_fixup alc268_fixups[] = {
3002 [ALC268_FIXUP_INV_DMIC] = {
3003 .type = HDA_FIXUP_FUNC,
3004 .v.func = alc_fixup_inv_dmic,
3005 },
3006 [ALC268_FIXUP_HP_EAPD] = {
3007 .type = HDA_FIXUP_VERBS,
3008 .v.verbs = (const struct hda_verb[]) {
3009 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 0},
3010 {}
3011 }
3012 },
3013 [ALC268_FIXUP_SPDIF] = {
3014 .type = HDA_FIXUP_PINS,
3015 .v.pins = (const struct hda_pintbl[]) {
3016 { 0x1e, 0x014b1180 },
3017 {}
3018 }
3019 },
3020};
3021
3022static const struct hda_model_fixup alc268_fixup_models[] = {
3023 {.id = ALC268_FIXUP_INV_DMIC, .name = "inv-dmic"},
3024 {.id = ALC268_FIXUP_HP_EAPD, .name = "hp-eapd"},
3025 {.id = ALC268_FIXUP_SPDIF, .name = "spdif"},
3026 {}
3027};
3028
3029static const struct snd_pci_quirk alc268_fixup_tbl[] = {
3030 SND_PCI_QUIRK(0x1025, 0x0139, "Acer TravelMate 6293", ALC268_FIXUP_SPDIF),
3031 SND_PCI_QUIRK(0x1025, 0x015b, "Acer AOA 150 (ZG5)", ALC268_FIXUP_INV_DMIC),
3032
3033
3034
3035 SND_PCI_QUIRK(0x1179, 0xff06, "Toshiba P200", ALC268_FIXUP_HP_EAPD),
3036 {}
3037};
3038
3039
3040
3041
3042static int alc268_parse_auto_config(struct hda_codec *codec)
3043{
3044 static const hda_nid_t alc268_ssids[] = { 0x15, 0x1b, 0x14, 0 };
3045 return alc_parse_auto_config(codec, NULL, alc268_ssids);
3046}
3047
3048
3049
3050static int patch_alc268(struct hda_codec *codec)
3051{
3052 struct alc_spec *spec;
3053 int i, err;
3054
3055
3056 err = alc_alloc_spec(codec, 0);
3057 if (err < 0)
3058 return err;
3059
3060 spec = codec->spec;
3061 if (has_cdefine_beep(codec))
3062 spec->gen.beep_nid = 0x01;
3063
3064 spec->shutup = alc_eapd_shutup;
3065
3066 alc_pre_init(codec);
3067
3068 snd_hda_pick_fixup(codec, alc268_fixup_models, alc268_fixup_tbl, alc268_fixups);
3069 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
3070
3071
3072 err = alc268_parse_auto_config(codec);
3073 if (err < 0)
3074 goto error;
3075
3076 if (err > 0 && !spec->gen.no_analog &&
3077 spec->gen.autocfg.speaker_pins[0] != 0x1d) {
3078 for (i = 0; i < ARRAY_SIZE(alc268_beep_mixer); i++) {
3079 if (!snd_hda_gen_add_kctl(&spec->gen, NULL,
3080 &alc268_beep_mixer[i])) {
3081 err = -ENOMEM;
3082 goto error;
3083 }
3084 }
3085 snd_hda_add_verbs(codec, alc268_beep_init_verbs);
3086 if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
3087
3088 snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
3089 (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
3090 (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
3091 (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
3092 (0 << AC_AMPCAP_MUTE_SHIFT));
3093 }
3094
3095 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
3096
3097 return 0;
3098
3099 error:
3100 alc_free(codec);
3101 return err;
3102}
3103
3104
3105
3106
3107
3108static const struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
3109 .rates = SNDRV_PCM_RATE_44100,
3110};
3111
3112static const struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
3113 .rates = SNDRV_PCM_RATE_44100,
3114};
3115
3116
3117enum {
3118 ALC269_TYPE_ALC269VA,
3119 ALC269_TYPE_ALC269VB,
3120 ALC269_TYPE_ALC269VC,
3121 ALC269_TYPE_ALC269VD,
3122 ALC269_TYPE_ALC280,
3123 ALC269_TYPE_ALC282,
3124 ALC269_TYPE_ALC283,
3125 ALC269_TYPE_ALC284,
3126 ALC269_TYPE_ALC293,
3127 ALC269_TYPE_ALC286,
3128 ALC269_TYPE_ALC298,
3129 ALC269_TYPE_ALC255,
3130 ALC269_TYPE_ALC256,
3131 ALC269_TYPE_ALC257,
3132 ALC269_TYPE_ALC215,
3133 ALC269_TYPE_ALC225,
3134 ALC269_TYPE_ALC287,
3135 ALC269_TYPE_ALC294,
3136 ALC269_TYPE_ALC300,
3137 ALC269_TYPE_ALC623,
3138 ALC269_TYPE_ALC700,
3139};
3140
3141
3142
3143
3144static int alc269_parse_auto_config(struct hda_codec *codec)
3145{
3146 static const hda_nid_t alc269_ignore[] = { 0x1d, 0 };
3147 static const hda_nid_t alc269_ssids[] = { 0, 0x1b, 0x14, 0x21 };
3148 static const hda_nid_t alc269va_ssids[] = { 0x15, 0x1b, 0x14, 0 };
3149 struct alc_spec *spec = codec->spec;
3150 const hda_nid_t *ssids;
3151
3152 switch (spec->codec_variant) {
3153 case ALC269_TYPE_ALC269VA:
3154 case ALC269_TYPE_ALC269VC:
3155 case ALC269_TYPE_ALC280:
3156 case ALC269_TYPE_ALC284:
3157 case ALC269_TYPE_ALC293:
3158 ssids = alc269va_ssids;
3159 break;
3160 case ALC269_TYPE_ALC269VB:
3161 case ALC269_TYPE_ALC269VD:
3162 case ALC269_TYPE_ALC282:
3163 case ALC269_TYPE_ALC283:
3164 case ALC269_TYPE_ALC286:
3165 case ALC269_TYPE_ALC298:
3166 case ALC269_TYPE_ALC255:
3167 case ALC269_TYPE_ALC256:
3168 case ALC269_TYPE_ALC257:
3169 case ALC269_TYPE_ALC215:
3170 case ALC269_TYPE_ALC225:
3171 case ALC269_TYPE_ALC287:
3172 case ALC269_TYPE_ALC294:
3173 case ALC269_TYPE_ALC300:
3174 case ALC269_TYPE_ALC623:
3175 case ALC269_TYPE_ALC700:
3176 ssids = alc269_ssids;
3177 break;
3178 default:
3179 ssids = alc269_ssids;
3180 break;
3181 }
3182
3183 return alc_parse_auto_config(codec, alc269_ignore, ssids);
3184}
3185
3186static const struct hda_jack_keymap alc_headset_btn_keymap[] = {
3187 { SND_JACK_BTN_0, KEY_PLAYPAUSE },
3188 { SND_JACK_BTN_1, KEY_VOICECOMMAND },
3189 { SND_JACK_BTN_2, KEY_VOLUMEUP },
3190 { SND_JACK_BTN_3, KEY_VOLUMEDOWN },
3191 {}
3192};
3193
3194static void alc_headset_btn_callback(struct hda_codec *codec,
3195 struct hda_jack_callback *jack)
3196{
3197 int report = 0;
3198
3199 if (jack->unsol_res & (7 << 13))
3200 report |= SND_JACK_BTN_0;
3201
3202 if (jack->unsol_res & (1 << 16 | 3 << 8))
3203 report |= SND_JACK_BTN_1;
3204
3205
3206 if (jack->unsol_res & (7 << 23))
3207 report |= SND_JACK_BTN_2;
3208
3209
3210 if (jack->unsol_res & (7 << 10))
3211 report |= SND_JACK_BTN_3;
3212
3213 snd_hda_jack_set_button_state(codec, jack->nid, report);
3214}
3215
3216static void alc_disable_headset_jack_key(struct hda_codec *codec)
3217{
3218 struct alc_spec *spec = codec->spec;
3219
3220 if (!spec->has_hs_key)
3221 return;
3222
3223 switch (codec->core.vendor_id) {
3224 case 0x10ec0215:
3225 case 0x10ec0225:
3226 case 0x10ec0285:
3227 case 0x10ec0287:
3228 case 0x10ec0295:
3229 case 0x10ec0289:
3230 case 0x10ec0299:
3231 alc_write_coef_idx(codec, 0x48, 0x0);
3232 alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3233 alc_update_coef_idx(codec, 0x44, 0x0045 << 8, 0x0);
3234 break;
3235 case 0x10ec0230:
3236 case 0x10ec0236:
3237 case 0x10ec0256:
3238 alc_write_coef_idx(codec, 0x48, 0x0);
3239 alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3240 break;
3241 }
3242}
3243
3244static void alc_enable_headset_jack_key(struct hda_codec *codec)
3245{
3246 struct alc_spec *spec = codec->spec;
3247
3248 if (!spec->has_hs_key)
3249 return;
3250
3251 switch (codec->core.vendor_id) {
3252 case 0x10ec0215:
3253 case 0x10ec0225:
3254 case 0x10ec0285:
3255 case 0x10ec0287:
3256 case 0x10ec0295:
3257 case 0x10ec0289:
3258 case 0x10ec0299:
3259 alc_write_coef_idx(codec, 0x48, 0xd011);
3260 alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3261 alc_update_coef_idx(codec, 0x44, 0x007f << 8, 0x0045 << 8);
3262 break;
3263 case 0x10ec0230:
3264 case 0x10ec0236:
3265 case 0x10ec0256:
3266 alc_write_coef_idx(codec, 0x48, 0xd011);
3267 alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3268 break;
3269 }
3270}
3271
3272static void alc_fixup_headset_jack(struct hda_codec *codec,
3273 const struct hda_fixup *fix, int action)
3274{
3275 struct alc_spec *spec = codec->spec;
3276 hda_nid_t hp_pin;
3277
3278 switch (action) {
3279 case HDA_FIXUP_ACT_PRE_PROBE:
3280 spec->has_hs_key = 1;
3281 snd_hda_jack_detect_enable_callback(codec, 0x55,
3282 alc_headset_btn_callback);
3283 break;
3284 case HDA_FIXUP_ACT_BUILD:
3285 hp_pin = alc_get_hp_pin(spec);
3286 if (!hp_pin || snd_hda_jack_bind_keymap(codec, 0x55,
3287 alc_headset_btn_keymap,
3288 hp_pin))
3289 snd_hda_jack_add_kctl(codec, 0x55, "Headset Jack",
3290 false, SND_JACK_HEADSET,
3291 alc_headset_btn_keymap);
3292
3293 alc_enable_headset_jack_key(codec);
3294 break;
3295 }
3296}
3297
3298static void alc269vb_toggle_power_output(struct hda_codec *codec, int power_up)
3299{
3300 alc_update_coef_idx(codec, 0x04, 1 << 11, power_up ? (1 << 11) : 0);
3301}
3302
3303static void alc269_shutup(struct hda_codec *codec)
3304{
3305 struct alc_spec *spec = codec->spec;
3306
3307 if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3308 alc269vb_toggle_power_output(codec, 0);
3309 if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
3310 (alc_get_coef0(codec) & 0x00ff) == 0x018) {
3311 msleep(150);
3312 }
3313 alc_shutup_pins(codec);
3314}
3315
3316static const struct coef_fw alc282_coefs[] = {
3317 WRITE_COEF(0x03, 0x0002),
3318 UPDATE_COEF(0x05, 0xff3f, 0x0700),
3319 WRITE_COEF(0x07, 0x0200),
3320 UPDATE_COEF(0x06, 0x00f0, 0),
3321 UPDATE_COEF(0x08, 0xfffc, 0x0c2c),
3322 WRITE_COEF(0x0a, 0xcccc),
3323 WRITE_COEF(0x0b, 0xcccc),
3324 WRITE_COEF(0x0e, 0x6e00),
3325 UPDATE_COEF(0x0f, 0xf800, 0x1000),
3326 UPDATE_COEF(0x10, 0xfc00, 0x0c00),
3327 WRITE_COEF(0x6f, 0x0),
3328 UPDATE_COEF(0x0c, 0xfe00, 0),
3329 WRITE_COEF(0x34, 0xa0c0),
3330 UPDATE_COEF(0x16, 0x0008, 0),
3331 UPDATE_COEF(0x1d, 0x00e0, 0),
3332 UPDATE_COEF(0x1f, 0x00e0, 0),
3333 WRITE_COEF(0x21, 0x8804),
3334 WRITE_COEF(0x63, 0x2902),
3335 WRITE_COEF(0x68, 0xa080),
3336 WRITE_COEF(0x69, 0x3400),
3337 WRITE_COEF(0x6a, 0x2f3e),
3338 WRITE_COEF(0x6b, 0x0),
3339 UPDATE_COEF(0x6d, 0x0fff, 0x0900),
3340 WRITE_COEF(0x6e, 0x110a),
3341 UPDATE_COEF(0x70, 0x00f8, 0x00d8),
3342 WRITE_COEF(0x71, 0x0014),
3343 WRITE_COEF(0x72, 0xc2ba),
3344 UPDATE_COEF(0x77, 0x0f80, 0),
3345 WRITE_COEF(0x6c, 0xfc06),
3346 {}
3347};
3348
3349static void alc282_restore_default_value(struct hda_codec *codec)
3350{
3351 alc_process_coef_fw(codec, alc282_coefs);
3352}
3353
3354static void alc282_init(struct hda_codec *codec)
3355{
3356 struct alc_spec *spec = codec->spec;
3357 hda_nid_t hp_pin = alc_get_hp_pin(spec);
3358 bool hp_pin_sense;
3359 int coef78;
3360
3361 alc282_restore_default_value(codec);
3362
3363 if (!hp_pin)
3364 return;
3365 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3366 coef78 = alc_read_coef_idx(codec, 0x78);
3367
3368
3369
3370 alc_write_coef_idx(codec, 0x78, 0x9004);
3371
3372 if (hp_pin_sense)
3373 msleep(2);
3374
3375 snd_hda_codec_write(codec, hp_pin, 0,
3376 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3377
3378 if (hp_pin_sense)
3379 msleep(85);
3380
3381 snd_hda_codec_write(codec, hp_pin, 0,
3382 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3383
3384 if (hp_pin_sense)
3385 msleep(100);
3386
3387
3388 alc_write_coef_idx(codec, 0x78, coef78);
3389}
3390
3391static void alc282_shutup(struct hda_codec *codec)
3392{
3393 struct alc_spec *spec = codec->spec;
3394 hda_nid_t hp_pin = alc_get_hp_pin(spec);
3395 bool hp_pin_sense;
3396 int coef78;
3397
3398 if (!hp_pin) {
3399 alc269_shutup(codec);
3400 return;
3401 }
3402
3403 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3404 coef78 = alc_read_coef_idx(codec, 0x78);
3405 alc_write_coef_idx(codec, 0x78, 0x9004);
3406
3407 if (hp_pin_sense)
3408 msleep(2);
3409
3410 snd_hda_codec_write(codec, hp_pin, 0,
3411 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3412
3413 if (hp_pin_sense)
3414 msleep(85);
3415
3416 if (!spec->no_shutup_pins)
3417 snd_hda_codec_write(codec, hp_pin, 0,
3418 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3419
3420 if (hp_pin_sense)
3421 msleep(100);
3422
3423 alc_auto_setup_eapd(codec, false);
3424 alc_shutup_pins(codec);
3425 alc_write_coef_idx(codec, 0x78, coef78);
3426}
3427
3428static const struct coef_fw alc283_coefs[] = {
3429 WRITE_COEF(0x03, 0x0002),
3430 UPDATE_COEF(0x05, 0xff3f, 0x0700),
3431 WRITE_COEF(0x07, 0x0200),
3432 UPDATE_COEF(0x06, 0x00f0, 0),
3433 UPDATE_COEF(0x08, 0xfffc, 0x0c2c),
3434 WRITE_COEF(0x0a, 0xcccc),
3435 WRITE_COEF(0x0b, 0xcccc),
3436 WRITE_COEF(0x0e, 0x6fc0),
3437 UPDATE_COEF(0x0f, 0xf800, 0x1000),
3438 UPDATE_COEF(0x10, 0xfc00, 0x0c00),
3439 WRITE_COEF(0x3a, 0x0),
3440 UPDATE_COEF(0x0c, 0xfe00, 0x0),
3441 WRITE_COEF(0x22, 0xa0c0),
3442 UPDATE_COEFEX(0x53, 0x01, 0x000f, 0x0008),
3443 UPDATE_COEF(0x1d, 0x00e0, 0),
3444 UPDATE_COEF(0x1f, 0x00e0, 0),
3445 WRITE_COEF(0x21, 0x8804),
3446 WRITE_COEF(0x2e, 0x2902),
3447 WRITE_COEF(0x33, 0xa080),
3448 WRITE_COEF(0x34, 0x3400),
3449 WRITE_COEF(0x35, 0x2f3e),
3450 WRITE_COEF(0x36, 0x0),
3451 UPDATE_COEF(0x38, 0x0fff, 0x0900),
3452 WRITE_COEF(0x39, 0x110a),
3453 UPDATE_COEF(0x3b, 0x00f8, 0x00d8),
3454 WRITE_COEF(0x3c, 0x0014),
3455 WRITE_COEF(0x3d, 0xc2ba),
3456 UPDATE_COEF(0x42, 0x0f80, 0x0),
3457 WRITE_COEF(0x49, 0x0),
3458 UPDATE_COEF(0x40, 0xf800, 0x9800),
3459 UPDATE_COEF(0x42, 0xf000, 0x2000),
3460 WRITE_COEF(0x37, 0xfc06),
3461 UPDATE_COEF(0x1b, 0x8000, 0),
3462 {}
3463};
3464
3465static void alc283_restore_default_value(struct hda_codec *codec)
3466{
3467 alc_process_coef_fw(codec, alc283_coefs);
3468}
3469
3470static void alc283_init(struct hda_codec *codec)
3471{
3472 struct alc_spec *spec = codec->spec;
3473 hda_nid_t hp_pin = alc_get_hp_pin(spec);
3474 bool hp_pin_sense;
3475
3476 alc283_restore_default_value(codec);
3477
3478 if (!hp_pin)
3479 return;
3480
3481 msleep(30);
3482 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3483
3484
3485
3486 alc_write_coef_idx(codec, 0x43, 0x9004);
3487
3488 snd_hda_codec_write(codec, hp_pin, 0,
3489 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3490
3491 if (hp_pin_sense)
3492 msleep(85);
3493
3494 snd_hda_codec_write(codec, hp_pin, 0,
3495 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3496
3497 if (hp_pin_sense)
3498 msleep(85);
3499
3500
3501 alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
3502
3503 alc_write_coef_idx(codec, 0x43, 0x9614);
3504}
3505
3506static void alc283_shutup(struct hda_codec *codec)
3507{
3508 struct alc_spec *spec = codec->spec;
3509 hda_nid_t hp_pin = alc_get_hp_pin(spec);
3510 bool hp_pin_sense;
3511
3512 if (!hp_pin) {
3513 alc269_shutup(codec);
3514 return;
3515 }
3516
3517 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3518
3519 alc_write_coef_idx(codec, 0x43, 0x9004);
3520
3521
3522 alc_write_coef_idx(codec, 0x06, 0x2100);
3523
3524 snd_hda_codec_write(codec, hp_pin, 0,
3525 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3526
3527 if (hp_pin_sense)
3528 msleep(100);
3529
3530 if (!spec->no_shutup_pins)
3531 snd_hda_codec_write(codec, hp_pin, 0,
3532 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3533
3534 alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
3535
3536 if (hp_pin_sense)
3537 msleep(100);
3538 alc_auto_setup_eapd(codec, false);
3539 alc_shutup_pins(codec);
3540 alc_write_coef_idx(codec, 0x43, 0x9614);
3541}
3542
3543static void alc256_init(struct hda_codec *codec)
3544{
3545 struct alc_spec *spec = codec->spec;
3546 hda_nid_t hp_pin = alc_get_hp_pin(spec);
3547 bool hp_pin_sense;
3548
3549 if (!hp_pin)
3550 hp_pin = 0x21;
3551
3552 msleep(30);
3553
3554 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3555
3556 if (hp_pin_sense)
3557 msleep(2);
3558
3559 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1);
3560 if (spec->ultra_low_power) {
3561 alc_update_coef_idx(codec, 0x03, 1<<1, 1<<1);
3562 alc_update_coef_idx(codec, 0x08, 3<<2, 3<<2);
3563 alc_update_coef_idx(codec, 0x08, 7<<4, 0);
3564 alc_update_coef_idx(codec, 0x3b, 1<<15, 0);
3565 alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3566 msleep(30);
3567 }
3568
3569 snd_hda_codec_write(codec, hp_pin, 0,
3570 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3571
3572 if (hp_pin_sense || spec->ultra_low_power)
3573 msleep(85);
3574
3575 snd_hda_codec_write(codec, hp_pin, 0,
3576 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3577
3578 if (hp_pin_sense || spec->ultra_low_power)
3579 msleep(100);
3580
3581 alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
3582 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4);
3583 alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15);
3584 alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15);
3585
3586
3587
3588
3589
3590
3591 alc_write_coef_idx(codec, 0x36, 0x5757);
3592}
3593
3594static void alc256_shutup(struct hda_codec *codec)
3595{
3596 struct alc_spec *spec = codec->spec;
3597 hda_nid_t hp_pin = alc_get_hp_pin(spec);
3598 bool hp_pin_sense;
3599
3600 if (!hp_pin)
3601 hp_pin = 0x21;
3602
3603 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3604
3605 if (hp_pin_sense)
3606 msleep(2);
3607
3608 snd_hda_codec_write(codec, hp_pin, 0,
3609 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3610
3611 if (hp_pin_sense || spec->ultra_low_power)
3612 msleep(85);
3613
3614
3615
3616
3617
3618
3619 if (codec->core.vendor_id != 0x10ec0236 &&
3620 codec->core.vendor_id != 0x10ec0257)
3621 alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
3622
3623 if (!spec->no_shutup_pins)
3624 snd_hda_codec_write(codec, hp_pin, 0,
3625 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3626
3627 if (hp_pin_sense || spec->ultra_low_power)
3628 msleep(100);
3629
3630 alc_auto_setup_eapd(codec, false);
3631 alc_shutup_pins(codec);
3632 if (spec->ultra_low_power) {
3633 msleep(50);
3634 alc_update_coef_idx(codec, 0x03, 1<<1, 0);
3635 alc_update_coef_idx(codec, 0x08, 7<<4, 7<<4);
3636 alc_update_coef_idx(codec, 0x08, 3<<2, 0);
3637 alc_update_coef_idx(codec, 0x3b, 1<<15, 1<<15);
3638 alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3639 msleep(30);
3640 }
3641}
3642
3643static void alc285_hp_init(struct hda_codec *codec)
3644{
3645 struct alc_spec *spec = codec->spec;
3646 hda_nid_t hp_pin = alc_get_hp_pin(spec);
3647 int i, val;
3648 int coef38, coef0d, coef36;
3649
3650 alc_update_coef_idx(codec, 0x4a, 1<<15, 1<<15);
3651 coef38 = alc_read_coef_idx(codec, 0x38);
3652 coef0d = alc_read_coef_idx(codec, 0x0d);
3653 coef36 = alc_read_coef_idx(codec, 0x36);
3654 alc_update_coef_idx(codec, 0x38, 1<<4, 0x0);
3655 alc_update_coef_idx(codec, 0x0d, 0x110, 0x0);
3656
3657 alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
3658
3659 if (hp_pin)
3660 snd_hda_codec_write(codec, hp_pin, 0,
3661 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3662
3663 msleep(130);
3664 alc_update_coef_idx(codec, 0x36, 1<<14, 1<<14);
3665 alc_update_coef_idx(codec, 0x36, 1<<13, 0x0);
3666
3667 if (hp_pin)
3668 snd_hda_codec_write(codec, hp_pin, 0,
3669 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3670 msleep(10);
3671 alc_write_coef_idx(codec, 0x67, 0x0);
3672 alc_write_coefex_idx(codec, 0x58, 0x00, 0x7880);
3673 alc_write_coefex_idx(codec, 0x58, 0x0f, 0xf049);
3674 alc_update_coefex_idx(codec, 0x58, 0x03, 0x00f0, 0x00c0);
3675
3676 alc_write_coefex_idx(codec, 0x58, 0x00, 0xf888);
3677 val = alc_read_coefex_idx(codec, 0x58, 0x00);
3678 for (i = 0; i < 20 && val & 0x8000; i++) {
3679 msleep(50);
3680 val = alc_read_coefex_idx(codec, 0x58, 0x00);
3681 }
3682
3683 alc_write_coefex_idx(codec, 0x58, 0x00, val);
3684 alc_update_coef_idx(codec, 0x38, 1<<4, coef38);
3685 alc_update_coef_idx(codec, 0x0d, 0x110, coef0d);
3686 alc_update_coef_idx(codec, 0x36, 3<<13, coef36);
3687
3688 msleep(50);
3689 alc_update_coef_idx(codec, 0x4a, 1<<15, 0);
3690}
3691
3692static void alc225_init(struct hda_codec *codec)
3693{
3694 struct alc_spec *spec = codec->spec;
3695 hda_nid_t hp_pin = alc_get_hp_pin(spec);
3696 bool hp1_pin_sense, hp2_pin_sense;
3697
3698 if (spec->codec_variant != ALC269_TYPE_ALC287)
3699
3700 if (!spec->done_hp_init ||
3701 is_s3_resume(codec) ||
3702 is_s4_resume(codec)) {
3703 alc285_hp_init(codec);
3704 spec->done_hp_init = true;
3705 }
3706
3707 if (!hp_pin)
3708 hp_pin = 0x21;
3709 msleep(30);
3710
3711 hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3712 hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3713
3714 if (hp1_pin_sense || hp2_pin_sense)
3715 msleep(2);
3716
3717 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1);
3718 if (spec->ultra_low_power) {
3719 alc_update_coef_idx(codec, 0x08, 0x0f << 2, 3<<2);
3720 alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3721 alc_update_coef_idx(codec, 0x33, 1<<11, 0);
3722 msleep(30);
3723 }
3724
3725 if (hp1_pin_sense || spec->ultra_low_power)
3726 snd_hda_codec_write(codec, hp_pin, 0,
3727 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3728 if (hp2_pin_sense)
3729 snd_hda_codec_write(codec, 0x16, 0,
3730 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3731
3732 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3733 msleep(85);
3734
3735 if (hp1_pin_sense || spec->ultra_low_power)
3736 snd_hda_codec_write(codec, hp_pin, 0,
3737 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3738 if (hp2_pin_sense)
3739 snd_hda_codec_write(codec, 0x16, 0,
3740 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3741
3742 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3743 msleep(100);
3744
3745 alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3746 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4);
3747}
3748
3749static void alc225_shutup(struct hda_codec *codec)
3750{
3751 struct alc_spec *spec = codec->spec;
3752 hda_nid_t hp_pin = alc_get_hp_pin(spec);
3753 bool hp1_pin_sense, hp2_pin_sense;
3754
3755 if (!hp_pin)
3756 hp_pin = 0x21;
3757
3758 alc_disable_headset_jack_key(codec);
3759
3760 alc_update_coef_idx(codec, 0x4a, 0, 3 << 10);
3761
3762 hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3763 hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3764
3765 if (hp1_pin_sense || hp2_pin_sense)
3766 msleep(2);
3767
3768 if (hp1_pin_sense || spec->ultra_low_power)
3769 snd_hda_codec_write(codec, hp_pin, 0,
3770 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3771 if (hp2_pin_sense)
3772 snd_hda_codec_write(codec, 0x16, 0,
3773 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3774
3775 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3776 msleep(85);
3777
3778 if (hp1_pin_sense || spec->ultra_low_power)
3779 snd_hda_codec_write(codec, hp_pin, 0,
3780 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3781 if (hp2_pin_sense)
3782 snd_hda_codec_write(codec, 0x16, 0,
3783 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3784
3785 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3786 msleep(100);
3787
3788 alc_auto_setup_eapd(codec, false);
3789 alc_shutup_pins(codec);
3790 if (spec->ultra_low_power) {
3791 msleep(50);
3792 alc_update_coef_idx(codec, 0x08, 0x0f << 2, 0x0c << 2);
3793 alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3794 alc_update_coef_idx(codec, 0x33, 1<<11, 1<<11);
3795 alc_update_coef_idx(codec, 0x4a, 3<<4, 2<<4);
3796 msleep(30);
3797 }
3798
3799 alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3800 alc_enable_headset_jack_key(codec);
3801}
3802
3803static void alc_default_init(struct hda_codec *codec)
3804{
3805 struct alc_spec *spec = codec->spec;
3806 hda_nid_t hp_pin = alc_get_hp_pin(spec);
3807 bool hp_pin_sense;
3808
3809 if (!hp_pin)
3810 return;
3811
3812 msleep(30);
3813
3814 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3815
3816 if (hp_pin_sense)
3817 msleep(2);
3818
3819 snd_hda_codec_write(codec, hp_pin, 0,
3820 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3821
3822 if (hp_pin_sense)
3823 msleep(85);
3824
3825 snd_hda_codec_write(codec, hp_pin, 0,
3826 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3827
3828 if (hp_pin_sense)
3829 msleep(100);
3830}
3831
3832static void alc_default_shutup(struct hda_codec *codec)
3833{
3834 struct alc_spec *spec = codec->spec;
3835 hda_nid_t hp_pin = alc_get_hp_pin(spec);
3836 bool hp_pin_sense;
3837
3838 if (!hp_pin) {
3839 alc269_shutup(codec);
3840 return;
3841 }
3842
3843 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3844
3845 if (hp_pin_sense)
3846 msleep(2);
3847
3848 snd_hda_codec_write(codec, hp_pin, 0,
3849 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3850
3851 if (hp_pin_sense)
3852 msleep(85);
3853
3854 if (!spec->no_shutup_pins)
3855 snd_hda_codec_write(codec, hp_pin, 0,
3856 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3857
3858 if (hp_pin_sense)
3859 msleep(100);
3860
3861 alc_auto_setup_eapd(codec, false);
3862 alc_shutup_pins(codec);
3863}
3864
3865static void alc294_hp_init(struct hda_codec *codec)
3866{
3867 struct alc_spec *spec = codec->spec;
3868 hda_nid_t hp_pin = alc_get_hp_pin(spec);
3869 int i, val;
3870
3871 if (!hp_pin)
3872 return;
3873
3874 snd_hda_codec_write(codec, hp_pin, 0,
3875 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3876
3877 msleep(100);
3878
3879 if (!spec->no_shutup_pins)
3880 snd_hda_codec_write(codec, hp_pin, 0,
3881 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3882
3883 alc_update_coef_idx(codec, 0x6f, 0x000f, 0);
3884 alc_update_coefex_idx(codec, 0x58, 0x00, 0x8000, 0x8000);
3885
3886
3887 val = alc_read_coefex_idx(codec, 0x58, 0x01);
3888 for (i = 0; i < 20 && val & 0x0080; i++) {
3889 msleep(50);
3890 val = alc_read_coefex_idx(codec, 0x58, 0x01);
3891 }
3892
3893 alc_update_coef_idx(codec, 0x6f, 0x000f, 0x000b);
3894 msleep(50);
3895}
3896
3897static void alc294_init(struct hda_codec *codec)
3898{
3899 struct alc_spec *spec = codec->spec;
3900
3901
3902 if (!spec->done_hp_init ||
3903 codec->core.dev.power.power_state.event == PM_EVENT_RESTORE) {
3904 alc294_hp_init(codec);
3905 spec->done_hp_init = true;
3906 }
3907 alc_default_init(codec);
3908}
3909
3910static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg,
3911 unsigned int val)
3912{
3913 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3914 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val & 0xffff);
3915 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val >> 16);
3916}
3917
3918static int alc5505_coef_get(struct hda_codec *codec, unsigned int index_reg)
3919{
3920 unsigned int val;
3921
3922 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3923 val = snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3924 & 0xffff;
3925 val |= snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3926 << 16;
3927 return val;
3928}
3929
3930static void alc5505_dsp_halt(struct hda_codec *codec)
3931{
3932 unsigned int val;
3933
3934 alc5505_coef_set(codec, 0x3000, 0x000c);
3935 alc5505_coef_set(codec, 0x880c, 0x0008);
3936 alc5505_coef_set(codec, 0x61c0, 0x11110080);
3937 alc5505_coef_set(codec, 0x6230, 0xfc0d4011);
3938 alc5505_coef_set(codec, 0x61b4, 0x040a2b03);
3939 alc5505_coef_set(codec, 0x61b0, 0x00005b17);
3940 alc5505_coef_set(codec, 0x61b8, 0x04133303);
3941 val = alc5505_coef_get(codec, 0x6220);
3942 alc5505_coef_set(codec, 0x6220, (val | 0x3000));
3943}
3944
3945static void alc5505_dsp_back_from_halt(struct hda_codec *codec)
3946{
3947 alc5505_coef_set(codec, 0x61b8, 0x04133302);
3948 alc5505_coef_set(codec, 0x61b0, 0x00005b16);
3949 alc5505_coef_set(codec, 0x61b4, 0x040a2b02);
3950 alc5505_coef_set(codec, 0x6230, 0xf80d4011);
3951 alc5505_coef_set(codec, 0x6220, 0x2002010f);
3952 alc5505_coef_set(codec, 0x880c, 0x00000004);
3953}
3954
3955static void alc5505_dsp_init(struct hda_codec *codec)
3956{
3957 unsigned int val;
3958
3959 alc5505_dsp_halt(codec);
3960 alc5505_dsp_back_from_halt(codec);
3961 alc5505_coef_set(codec, 0x61b0, 0x5b14);
3962 alc5505_coef_set(codec, 0x61b0, 0x5b16);
3963 alc5505_coef_set(codec, 0x61b4, 0x04132b00);
3964 alc5505_coef_set(codec, 0x61b4, 0x04132b02);
3965 alc5505_coef_set(codec, 0x61b8, 0x041f3300);
3966 alc5505_coef_set(codec, 0x61b8, 0x041f3302);
3967 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_CODEC_RESET, 0);
3968 alc5505_coef_set(codec, 0x61b8, 0x041b3302);
3969 alc5505_coef_set(codec, 0x61b8, 0x04173302);
3970 alc5505_coef_set(codec, 0x61b8, 0x04163302);
3971 alc5505_coef_set(codec, 0x8800, 0x348b328b);
3972 alc5505_coef_set(codec, 0x8808, 0x00020022);
3973 alc5505_coef_set(codec, 0x8818, 0x00000400);
3974
3975 val = alc5505_coef_get(codec, 0x6200) >> 16;
3976 if (val <= 3)
3977 alc5505_coef_set(codec, 0x6220, 0x2002010f);
3978 else
3979 alc5505_coef_set(codec, 0x6220, 0x6002018f);
3980
3981 alc5505_coef_set(codec, 0x61ac, 0x055525f0);
3982 alc5505_coef_set(codec, 0x61c0, 0x12230080);
3983 alc5505_coef_set(codec, 0x61b4, 0x040e2b02);
3984 alc5505_coef_set(codec, 0x61bc, 0x010234f8);
3985 alc5505_coef_set(codec, 0x880c, 0x00000004);
3986 alc5505_coef_set(codec, 0x880c, 0x00000003);
3987 alc5505_coef_set(codec, 0x880c, 0x00000010);
3988
3989#ifdef HALT_REALTEK_ALC5505
3990 alc5505_dsp_halt(codec);
3991#endif
3992}
3993
3994#ifdef HALT_REALTEK_ALC5505
3995#define alc5505_dsp_suspend(codec) do { } while (0)
3996#define alc5505_dsp_resume(codec) do { } while (0)
3997#else
3998#define alc5505_dsp_suspend(codec) alc5505_dsp_halt(codec)
3999#define alc5505_dsp_resume(codec) alc5505_dsp_back_from_halt(codec)
4000#endif
4001
4002#ifdef CONFIG_PM
4003static int alc269_suspend(struct hda_codec *codec)
4004{
4005 struct alc_spec *spec = codec->spec;
4006
4007 if (spec->has_alc5505_dsp)
4008 alc5505_dsp_suspend(codec);
4009 return alc_suspend(codec);
4010}
4011
4012static int alc269_resume(struct hda_codec *codec)
4013{
4014 struct alc_spec *spec = codec->spec;
4015
4016 if (spec->codec_variant == ALC269_TYPE_ALC269VB)
4017 alc269vb_toggle_power_output(codec, 0);
4018 if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
4019 (alc_get_coef0(codec) & 0x00ff) == 0x018) {
4020 msleep(150);
4021 }
4022
4023 codec->patch_ops.init(codec);
4024
4025 if (spec->codec_variant == ALC269_TYPE_ALC269VB)
4026 alc269vb_toggle_power_output(codec, 1);
4027 if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
4028 (alc_get_coef0(codec) & 0x00ff) == 0x017) {
4029 msleep(200);
4030 }
4031
4032 snd_hda_regmap_sync(codec);
4033 hda_call_check_power_status(codec, 0x01);
4034
4035
4036
4037
4038
4039 if (spec->gpio_data)
4040 alc_write_gpio_data(codec);
4041
4042 if (spec->has_alc5505_dsp)
4043 alc5505_dsp_resume(codec);
4044
4045 return 0;
4046}
4047#endif
4048
4049static void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec,
4050 const struct hda_fixup *fix, int action)
4051{
4052 struct alc_spec *spec = codec->spec;
4053
4054 if (action == HDA_FIXUP_ACT_PRE_PROBE)
4055 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
4056}
4057
4058static void alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec *codec,
4059 const struct hda_fixup *fix,
4060 int action)
4061{
4062 unsigned int cfg_headphone = snd_hda_codec_get_pincfg(codec, 0x21);
4063 unsigned int cfg_headset_mic = snd_hda_codec_get_pincfg(codec, 0x19);
4064
4065 if (cfg_headphone && cfg_headset_mic == 0x411111f0)
4066 snd_hda_codec_set_pincfg(codec, 0x19,
4067 (cfg_headphone & ~AC_DEFCFG_DEVICE) |
4068 (AC_JACK_MIC_IN << AC_DEFCFG_DEVICE_SHIFT));
4069}
4070
4071static void alc269_fixup_hweq(struct hda_codec *codec,
4072 const struct hda_fixup *fix, int action)
4073{
4074 if (action == HDA_FIXUP_ACT_INIT)
4075 alc_update_coef_idx(codec, 0x1e, 0, 0x80);
4076}
4077
4078static void alc269_fixup_headset_mic(struct hda_codec *codec,
4079 const struct hda_fixup *fix, int action)
4080{
4081 struct alc_spec *spec = codec->spec;
4082
4083 if (action == HDA_FIXUP_ACT_PRE_PROBE)
4084 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
4085}
4086
4087static void alc271_fixup_dmic(struct hda_codec *codec,
4088 const struct hda_fixup *fix, int action)
4089{
4090 static const struct hda_verb verbs[] = {
4091 {0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
4092 {0x20, AC_VERB_SET_PROC_COEF, 0x4000},
4093 {}
4094 };
4095 unsigned int cfg;
4096
4097 if (strcmp(codec->core.chip_name, "ALC271X") &&
4098 strcmp(codec->core.chip_name, "ALC269VB"))
4099 return;
4100 cfg = snd_hda_codec_get_pincfg(codec, 0x12);
4101 if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED)
4102 snd_hda_sequence_write(codec, verbs);
4103}
4104
4105
4106static void alc269vb_fixup_aspire_e1_coef(struct hda_codec *codec,
4107 const struct hda_fixup *fix,
4108 int action)
4109{
4110 if (action == HDA_FIXUP_ACT_INIT)
4111 alc_update_coef_idx(codec, 0x0d, 0x6000, 0x6000);
4112}
4113
4114static void alc269_fixup_pcm_44k(struct hda_codec *codec,
4115 const struct hda_fixup *fix, int action)
4116{
4117 struct alc_spec *spec = codec->spec;
4118
4119 if (action != HDA_FIXUP_ACT_PROBE)
4120 return;
4121
4122
4123
4124
4125 spec->gen.stream_analog_playback = &alc269_44k_pcm_analog_playback;
4126 spec->gen.stream_analog_capture = &alc269_44k_pcm_analog_capture;
4127}
4128
4129static void alc269_fixup_stereo_dmic(struct hda_codec *codec,
4130 const struct hda_fixup *fix, int action)
4131{
4132
4133
4134
4135
4136
4137 if (action == HDA_FIXUP_ACT_INIT)
4138 alc_update_coef_idx(codec, 0x07, 0, 0x80);
4139}
4140
4141static void alc269_quanta_automute(struct hda_codec *codec)
4142{
4143 snd_hda_gen_update_outputs(codec);
4144
4145 alc_write_coef_idx(codec, 0x0c, 0x680);
4146 alc_write_coef_idx(codec, 0x0c, 0x480);
4147}
4148
4149static void alc269_fixup_quanta_mute(struct hda_codec *codec,
4150 const struct hda_fixup *fix, int action)
4151{
4152 struct alc_spec *spec = codec->spec;
4153 if (action != HDA_FIXUP_ACT_PROBE)
4154 return;
4155 spec->gen.automute_hook = alc269_quanta_automute;
4156}
4157
4158static void alc269_x101_hp_automute_hook(struct hda_codec *codec,
4159 struct hda_jack_callback *jack)
4160{
4161 struct alc_spec *spec = codec->spec;
4162 int vref;
4163 msleep(200);
4164 snd_hda_gen_hp_automute(codec, jack);
4165
4166 vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
4167 msleep(100);
4168 snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4169 vref);
4170 msleep(500);
4171 snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4172 vref);
4173}
4174
4175
4176
4177
4178struct hda_alc298_mbxinit {
4179 unsigned char value_0x23;
4180 unsigned char value_0x25;
4181};
4182
4183static void alc298_huawei_mbx_stereo_seq(struct hda_codec *codec,
4184 const struct hda_alc298_mbxinit *initval,
4185 bool first)
4186{
4187 snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x0);
4188 alc_write_coef_idx(codec, 0x26, 0xb000);
4189
4190 if (first)
4191 snd_hda_codec_write(codec, 0x21, 0, AC_VERB_GET_PIN_SENSE, 0x0);
4192
4193 snd_hda_codec_write(codec, 0x6, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
4194 alc_write_coef_idx(codec, 0x26, 0xf000);
4195 alc_write_coef_idx(codec, 0x23, initval->value_0x23);
4196
4197 if (initval->value_0x23 != 0x1e)
4198 alc_write_coef_idx(codec, 0x25, initval->value_0x25);
4199
4200 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
4201 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
4202}
4203
4204static void alc298_fixup_huawei_mbx_stereo(struct hda_codec *codec,
4205 const struct hda_fixup *fix,
4206 int action)
4207{
4208
4209 static const struct hda_alc298_mbxinit dac_init[] = {
4210 {0x0c, 0x00}, {0x0d, 0x00}, {0x0e, 0x00}, {0x0f, 0x00},
4211 {0x10, 0x00}, {0x1a, 0x40}, {0x1b, 0x82}, {0x1c, 0x00},
4212 {0x1d, 0x00}, {0x1e, 0x00}, {0x1f, 0x00},
4213 {0x20, 0xc2}, {0x21, 0xc8}, {0x22, 0x26}, {0x23, 0x24},
4214 {0x27, 0xff}, {0x28, 0xff}, {0x29, 0xff}, {0x2a, 0x8f},
4215 {0x2b, 0x02}, {0x2c, 0x48}, {0x2d, 0x34}, {0x2e, 0x00},
4216 {0x2f, 0x00},
4217 {0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00},
4218 {0x34, 0x00}, {0x35, 0x01}, {0x36, 0x93}, {0x37, 0x0c},
4219 {0x38, 0x00}, {0x39, 0x00}, {0x3a, 0xf8}, {0x38, 0x80},
4220 {}
4221 };
4222 const struct hda_alc298_mbxinit *seq;
4223
4224 if (action != HDA_FIXUP_ACT_INIT)
4225 return;
4226
4227
4228 snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x00);
4229 snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
4230 alc_write_coef_idx(codec, 0x26, 0xf000);
4231 alc_write_coef_idx(codec, 0x22, 0x31);
4232 alc_write_coef_idx(codec, 0x23, 0x0b);
4233 alc_write_coef_idx(codec, 0x25, 0x00);
4234 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
4235 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
4236
4237 for (seq = dac_init; seq->value_0x23; seq++)
4238 alc298_huawei_mbx_stereo_seq(codec, seq, seq == dac_init);
4239}
4240
4241static void alc269_fixup_x101_headset_mic(struct hda_codec *codec,
4242 const struct hda_fixup *fix, int action)
4243{
4244 struct alc_spec *spec = codec->spec;
4245 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4246 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
4247 spec->gen.hp_automute_hook = alc269_x101_hp_automute_hook;
4248 }
4249}
4250
4251static void alc_update_vref_led(struct hda_codec *codec, hda_nid_t pin,
4252 bool polarity, bool on)
4253{
4254 unsigned int pinval;
4255
4256 if (!pin)
4257 return;
4258 if (polarity)
4259 on = !on;
4260 pinval = snd_hda_codec_get_pin_target(codec, pin);
4261 pinval &= ~AC_PINCTL_VREFEN;
4262 pinval |= on ? AC_PINCTL_VREF_80 : AC_PINCTL_VREF_HIZ;
4263
4264 snd_hda_power_up_pm(codec);
4265 snd_hda_set_pin_ctl_cache(codec, pin, pinval);
4266 snd_hda_power_down_pm(codec);
4267}
4268
4269
4270static int vref_mute_led_set(struct led_classdev *led_cdev,
4271 enum led_brightness brightness)
4272{
4273 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4274 struct alc_spec *spec = codec->spec;
4275
4276 alc_update_vref_led(codec, spec->mute_led_nid,
4277 spec->mute_led_polarity, brightness);
4278 return 0;
4279}
4280
4281
4282static unsigned int led_power_filter(struct hda_codec *codec,
4283 hda_nid_t nid,
4284 unsigned int power_state)
4285{
4286 struct alc_spec *spec = codec->spec;
4287
4288 if (power_state != AC_PWRST_D3 || nid == 0 ||
4289 (nid != spec->mute_led_nid && nid != spec->cap_mute_led_nid))
4290 return power_state;
4291
4292
4293 snd_hda_set_pin_ctl(codec, nid,
4294 snd_hda_codec_get_pin_target(codec, nid));
4295
4296 return snd_hda_gen_path_power_filter(codec, nid, power_state);
4297}
4298
4299static void alc269_fixup_hp_mute_led(struct hda_codec *codec,
4300 const struct hda_fixup *fix, int action)
4301{
4302 struct alc_spec *spec = codec->spec;
4303 const struct dmi_device *dev = NULL;
4304
4305 if (action != HDA_FIXUP_ACT_PRE_PROBE)
4306 return;
4307
4308 while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) {
4309 int pol, pin;
4310 if (sscanf(dev->name, "HP_Mute_LED_%d_%x", &pol, &pin) != 2)
4311 continue;
4312 if (pin < 0x0a || pin >= 0x10)
4313 break;
4314 spec->mute_led_polarity = pol;
4315 spec->mute_led_nid = pin - 0x0a + 0x18;
4316 snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
4317 codec->power_filter = led_power_filter;
4318 codec_dbg(codec,
4319 "Detected mute LED for %x:%d\n", spec->mute_led_nid,
4320 spec->mute_led_polarity);
4321 break;
4322 }
4323}
4324
4325static void alc269_fixup_hp_mute_led_micx(struct hda_codec *codec,
4326 const struct hda_fixup *fix,
4327 int action, hda_nid_t pin)
4328{
4329 struct alc_spec *spec = codec->spec;
4330
4331 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4332 spec->mute_led_polarity = 0;
4333 spec->mute_led_nid = pin;
4334 snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
4335 codec->power_filter = led_power_filter;
4336 }
4337}
4338
4339static void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec,
4340 const struct hda_fixup *fix, int action)
4341{
4342 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x18);
4343}
4344
4345static void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec,
4346 const struct hda_fixup *fix, int action)
4347{
4348 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x19);
4349}
4350
4351static void alc269_fixup_hp_mute_led_mic3(struct hda_codec *codec,
4352 const struct hda_fixup *fix, int action)
4353{
4354 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1b);
4355}
4356
4357
4358static void alc_update_gpio_led(struct hda_codec *codec, unsigned int mask,
4359 int polarity, bool enabled)
4360{
4361 if (polarity)
4362 enabled = !enabled;
4363 alc_update_gpio_data(codec, mask, !enabled);
4364}
4365
4366
4367static int gpio_mute_led_set(struct led_classdev *led_cdev,
4368 enum led_brightness brightness)
4369{
4370 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4371 struct alc_spec *spec = codec->spec;
4372
4373 alc_update_gpio_led(codec, spec->gpio_mute_led_mask,
4374 spec->mute_led_polarity, !brightness);
4375 return 0;
4376}
4377
4378
4379static int micmute_led_set(struct led_classdev *led_cdev,
4380 enum led_brightness brightness)
4381{
4382 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4383 struct alc_spec *spec = codec->spec;
4384
4385 alc_update_gpio_led(codec, spec->gpio_mic_led_mask,
4386 spec->micmute_led_polarity, !brightness);
4387 return 0;
4388}
4389
4390
4391static void alc_fixup_hp_gpio_led(struct hda_codec *codec,
4392 int action,
4393 unsigned int mute_mask,
4394 unsigned int micmute_mask)
4395{
4396 struct alc_spec *spec = codec->spec;
4397
4398 alc_fixup_gpio(codec, action, mute_mask | micmute_mask);
4399
4400 if (action != HDA_FIXUP_ACT_PRE_PROBE)
4401 return;
4402 if (mute_mask) {
4403 spec->gpio_mute_led_mask = mute_mask;
4404 snd_hda_gen_add_mute_led_cdev(codec, gpio_mute_led_set);
4405 }
4406 if (micmute_mask) {
4407 spec->gpio_mic_led_mask = micmute_mask;
4408 snd_hda_gen_add_micmute_led_cdev(codec, micmute_led_set);
4409 }
4410}
4411
4412static void alc236_fixup_hp_gpio_led(struct hda_codec *codec,
4413 const struct hda_fixup *fix, int action)
4414{
4415 alc_fixup_hp_gpio_led(codec, action, 0x02, 0x01);
4416}
4417
4418static void alc269_fixup_hp_gpio_led(struct hda_codec *codec,
4419 const struct hda_fixup *fix, int action)
4420{
4421 alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
4422}
4423
4424static void alc285_fixup_hp_gpio_led(struct hda_codec *codec,
4425 const struct hda_fixup *fix, int action)
4426{
4427 alc_fixup_hp_gpio_led(codec, action, 0x04, 0x01);
4428}
4429
4430static void alc286_fixup_hp_gpio_led(struct hda_codec *codec,
4431 const struct hda_fixup *fix, int action)
4432{
4433 alc_fixup_hp_gpio_led(codec, action, 0x02, 0x20);
4434}
4435
4436static void alc287_fixup_hp_gpio_led(struct hda_codec *codec,
4437 const struct hda_fixup *fix, int action)
4438{
4439 alc_fixup_hp_gpio_led(codec, action, 0x10, 0);
4440}
4441
4442static void alc245_fixup_hp_gpio_led(struct hda_codec *codec,
4443 const struct hda_fixup *fix, int action)
4444{
4445 struct alc_spec *spec = codec->spec;
4446
4447 if (action == HDA_FIXUP_ACT_PRE_PROBE)
4448 spec->micmute_led_polarity = 1;
4449 alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
4450}
4451
4452
4453static int vref_micmute_led_set(struct led_classdev *led_cdev,
4454 enum led_brightness brightness)
4455{
4456 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4457 struct alc_spec *spec = codec->spec;
4458
4459 alc_update_vref_led(codec, spec->cap_mute_led_nid,
4460 spec->micmute_led_polarity, brightness);
4461 return 0;
4462}
4463
4464static void alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec,
4465 const struct hda_fixup *fix, int action)
4466{
4467 struct alc_spec *spec = codec->spec;
4468
4469 alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
4470 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4471
4472
4473
4474 spec->gpio_mask |= 0x10;
4475 spec->gpio_dir |= 0x10;
4476 spec->cap_mute_led_nid = 0x18;
4477 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4478 codec->power_filter = led_power_filter;
4479 }
4480}
4481
4482static void alc280_fixup_hp_gpio4(struct hda_codec *codec,
4483 const struct hda_fixup *fix, int action)
4484{
4485 struct alc_spec *spec = codec->spec;
4486
4487 alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
4488 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4489 spec->cap_mute_led_nid = 0x18;
4490 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4491 codec->power_filter = led_power_filter;
4492 }
4493}
4494
4495
4496
4497
4498static void alc245_fixup_hp_x360_amp(struct hda_codec *codec,
4499 const struct hda_fixup *fix, int action)
4500{
4501 struct alc_spec *spec = codec->spec;
4502
4503 switch (action) {
4504 case HDA_FIXUP_ACT_PRE_PROBE:
4505 spec->gpio_mask |= 0x01;
4506 spec->gpio_dir |= 0x01;
4507 break;
4508 case HDA_FIXUP_ACT_INIT:
4509
4510 alc_update_gpio_data(codec, 0x01, true);
4511 msleep(100);
4512 alc_update_gpio_data(codec, 0x01, false);
4513 break;
4514 }
4515}
4516
4517
4518static void alc274_hp_envy_pcm_hook(struct hda_pcm_stream *hinfo,
4519 struct hda_codec *codec,
4520 struct snd_pcm_substream *substream,
4521 int action)
4522{
4523 switch (action) {
4524 case HDA_GEN_PCM_ACT_PREPARE:
4525 alc_update_gpio_data(codec, 0x04, true);
4526 break;
4527 case HDA_GEN_PCM_ACT_CLEANUP:
4528 alc_update_gpio_data(codec, 0x04, false);
4529 break;
4530 }
4531}
4532
4533static void alc274_fixup_hp_envy_gpio(struct hda_codec *codec,
4534 const struct hda_fixup *fix,
4535 int action)
4536{
4537 struct alc_spec *spec = codec->spec;
4538
4539 if (action == HDA_FIXUP_ACT_PROBE) {
4540 spec->gpio_mask |= 0x04;
4541 spec->gpio_dir |= 0x04;
4542 spec->gen.pcm_playback_hook = alc274_hp_envy_pcm_hook;
4543 }
4544}
4545
4546static void alc_update_coef_led(struct hda_codec *codec,
4547 struct alc_coef_led *led,
4548 bool polarity, bool on)
4549{
4550 if (polarity)
4551 on = !on;
4552
4553 alc_update_coef_idx(codec, led->idx, led->mask,
4554 on ? led->on : led->off);
4555}
4556
4557
4558static int coef_mute_led_set(struct led_classdev *led_cdev,
4559 enum led_brightness brightness)
4560{
4561 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4562 struct alc_spec *spec = codec->spec;
4563
4564 alc_update_coef_led(codec, &spec->mute_led_coef,
4565 spec->mute_led_polarity, brightness);
4566 return 0;
4567}
4568
4569static void alc285_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4570 const struct hda_fixup *fix,
4571 int action)
4572{
4573 struct alc_spec *spec = codec->spec;
4574
4575 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4576 spec->mute_led_polarity = 0;
4577 spec->mute_led_coef.idx = 0x0b;
4578 spec->mute_led_coef.mask = 1 << 3;
4579 spec->mute_led_coef.on = 1 << 3;
4580 spec->mute_led_coef.off = 0;
4581 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4582 }
4583}
4584
4585static void alc236_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4586 const struct hda_fixup *fix,
4587 int action)
4588{
4589 struct alc_spec *spec = codec->spec;
4590
4591 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4592 spec->mute_led_polarity = 0;
4593 spec->mute_led_coef.idx = 0x34;
4594 spec->mute_led_coef.mask = 1 << 5;
4595 spec->mute_led_coef.on = 0;
4596 spec->mute_led_coef.off = 1 << 5;
4597 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4598 }
4599}
4600
4601
4602static int coef_micmute_led_set(struct led_classdev *led_cdev,
4603 enum led_brightness brightness)
4604{
4605 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4606 struct alc_spec *spec = codec->spec;
4607
4608 alc_update_coef_led(codec, &spec->mic_led_coef,
4609 spec->micmute_led_polarity, brightness);
4610 return 0;
4611}
4612
4613static void alc285_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4614 const struct hda_fixup *fix, int action)
4615{
4616 struct alc_spec *spec = codec->spec;
4617
4618 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4619 spec->mic_led_coef.idx = 0x19;
4620 spec->mic_led_coef.mask = 1 << 13;
4621 spec->mic_led_coef.on = 1 << 13;
4622 spec->mic_led_coef.off = 0;
4623 snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
4624 }
4625}
4626
4627static void alc236_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4628 const struct hda_fixup *fix, int action)
4629{
4630 struct alc_spec *spec = codec->spec;
4631
4632 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4633 spec->mic_led_coef.idx = 0x35;
4634 spec->mic_led_coef.mask = 3 << 2;
4635 spec->mic_led_coef.on = 2 << 2;
4636 spec->mic_led_coef.off = 1 << 2;
4637 snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
4638 }
4639}
4640
4641static void alc285_fixup_hp_mute_led(struct hda_codec *codec,
4642 const struct hda_fixup *fix, int action)
4643{
4644 alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
4645 alc285_fixup_hp_coef_micmute_led(codec, fix, action);
4646}
4647
4648static void alc236_fixup_hp_mute_led(struct hda_codec *codec,
4649 const struct hda_fixup *fix, int action)
4650{
4651 alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
4652 alc236_fixup_hp_coef_micmute_led(codec, fix, action);
4653}
4654
4655static void alc236_fixup_hp_micmute_led_vref(struct hda_codec *codec,
4656 const struct hda_fixup *fix, int action)
4657{
4658 struct alc_spec *spec = codec->spec;
4659
4660 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4661 spec->cap_mute_led_nid = 0x1a;
4662 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4663 codec->power_filter = led_power_filter;
4664 }
4665}
4666
4667static void alc236_fixup_hp_mute_led_micmute_vref(struct hda_codec *codec,
4668 const struct hda_fixup *fix, int action)
4669{
4670 alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
4671 alc236_fixup_hp_micmute_led_vref(codec, fix, action);
4672}
4673
4674#if IS_REACHABLE(CONFIG_INPUT)
4675static void gpio2_mic_hotkey_event(struct hda_codec *codec,
4676 struct hda_jack_callback *event)
4677{
4678 struct alc_spec *spec = codec->spec;
4679
4680
4681
4682 input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 1);
4683 input_sync(spec->kb_dev);
4684 input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 0);
4685 input_sync(spec->kb_dev);
4686}
4687
4688static int alc_register_micmute_input_device(struct hda_codec *codec)
4689{
4690 struct alc_spec *spec = codec->spec;
4691 int i;
4692
4693 spec->kb_dev = input_allocate_device();
4694 if (!spec->kb_dev) {
4695 codec_err(codec, "Out of memory (input_allocate_device)\n");
4696 return -ENOMEM;
4697 }
4698
4699 spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX] = KEY_MICMUTE;
4700
4701 spec->kb_dev->name = "Microphone Mute Button";
4702 spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY);
4703 spec->kb_dev->keycodesize = sizeof(spec->alc_mute_keycode_map[0]);
4704 spec->kb_dev->keycodemax = ARRAY_SIZE(spec->alc_mute_keycode_map);
4705 spec->kb_dev->keycode = spec->alc_mute_keycode_map;
4706 for (i = 0; i < ARRAY_SIZE(spec->alc_mute_keycode_map); i++)
4707 set_bit(spec->alc_mute_keycode_map[i], spec->kb_dev->keybit);
4708
4709 if (input_register_device(spec->kb_dev)) {
4710 codec_err(codec, "input_register_device failed\n");
4711 input_free_device(spec->kb_dev);
4712 spec->kb_dev = NULL;
4713 return -ENOMEM;
4714 }
4715
4716 return 0;
4717}
4718
4719
4720
4721
4722
4723
4724static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec,
4725 const struct hda_fixup *fix, int action)
4726{
4727 struct alc_spec *spec = codec->spec;
4728
4729 alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
4730 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4731 spec->init_amp = ALC_INIT_DEFAULT;
4732 if (alc_register_micmute_input_device(codec) != 0)
4733 return;
4734
4735 spec->gpio_mask |= 0x06;
4736 spec->gpio_dir |= 0x02;
4737 spec->gpio_data |= 0x02;
4738 snd_hda_codec_write_cache(codec, codec->core.afg, 0,
4739 AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x04);
4740 snd_hda_jack_detect_enable_callback(codec, codec->core.afg,
4741 gpio2_mic_hotkey_event);
4742 return;
4743 }
4744
4745 if (!spec->kb_dev)
4746 return;
4747
4748 switch (action) {
4749 case HDA_FIXUP_ACT_FREE:
4750 input_unregister_device(spec->kb_dev);
4751 spec->kb_dev = NULL;
4752 }
4753}
4754
4755
4756
4757
4758static void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec,
4759 const struct hda_fixup *fix, int action)
4760{
4761 struct alc_spec *spec = codec->spec;
4762
4763 alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
4764 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4765 spec->init_amp = ALC_INIT_DEFAULT;
4766 if (alc_register_micmute_input_device(codec) != 0)
4767 return;
4768
4769 snd_hda_jack_detect_enable_callback(codec, 0x1b,
4770 gpio2_mic_hotkey_event);
4771 return;
4772 }
4773
4774 if (!spec->kb_dev)
4775 return;
4776
4777 switch (action) {
4778 case HDA_FIXUP_ACT_FREE:
4779 input_unregister_device(spec->kb_dev);
4780 spec->kb_dev = NULL;
4781 }
4782}
4783#else
4784#define alc280_fixup_hp_gpio2_mic_hotkey NULL
4785#define alc233_fixup_lenovo_line2_mic_hotkey NULL
4786#endif
4787
4788static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec,
4789 const struct hda_fixup *fix, int action)
4790{
4791 struct alc_spec *spec = codec->spec;
4792
4793 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1a);
4794 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4795 spec->cap_mute_led_nid = 0x18;
4796 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4797 }
4798}
4799
4800static const struct coef_fw alc225_pre_hsmode[] = {
4801 UPDATE_COEF(0x4a, 1<<8, 0),
4802 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0),
4803 UPDATE_COEF(0x63, 3<<14, 3<<14),
4804 UPDATE_COEF(0x4a, 3<<4, 2<<4),
4805 UPDATE_COEF(0x4a, 3<<10, 3<<10),
4806 UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10),
4807 UPDATE_COEF(0x4a, 3<<10, 0),
4808 {}
4809};
4810
4811static void alc_headset_mode_unplugged(struct hda_codec *codec)
4812{
4813 struct alc_spec *spec = codec->spec;
4814 static const struct coef_fw coef0255[] = {
4815 WRITE_COEF(0x1b, 0x0c0b),
4816 WRITE_COEF(0x45, 0xd089),
4817 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0),
4818 WRITE_COEF(0x06, 0x6104),
4819 WRITE_COEFEX(0x57, 0x03, 0x8aa6),
4820 {}
4821 };
4822 static const struct coef_fw coef0256[] = {
4823 WRITE_COEF(0x1b, 0x0c4b),
4824 WRITE_COEF(0x45, 0xd089),
4825 WRITE_COEF(0x06, 0x6104),
4826 WRITE_COEFEX(0x57, 0x03, 0x09a3),
4827 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0),
4828 {}
4829 };
4830 static const struct coef_fw coef0233[] = {
4831 WRITE_COEF(0x1b, 0x0c0b),
4832 WRITE_COEF(0x45, 0xc429),
4833 UPDATE_COEF(0x35, 0x4000, 0),
4834 WRITE_COEF(0x06, 0x2104),
4835 WRITE_COEF(0x1a, 0x0001),
4836 WRITE_COEF(0x26, 0x0004),
4837 WRITE_COEF(0x32, 0x42a3),
4838 {}
4839 };
4840 static const struct coef_fw coef0288[] = {
4841 UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
4842 UPDATE_COEF(0x50, 0x2000, 0x2000),
4843 UPDATE_COEF(0x56, 0x0006, 0x0006),
4844 UPDATE_COEF(0x66, 0x0008, 0),
4845 UPDATE_COEF(0x67, 0x2000, 0),
4846 {}
4847 };
4848 static const struct coef_fw coef0298[] = {
4849 UPDATE_COEF(0x19, 0x1300, 0x0300),
4850 {}
4851 };
4852 static const struct coef_fw coef0292[] = {
4853 WRITE_COEF(0x76, 0x000e),
4854 WRITE_COEF(0x6c, 0x2400),
4855 WRITE_COEF(0x18, 0x7308),
4856 WRITE_COEF(0x6b, 0xc429),
4857 {}
4858 };
4859 static const struct coef_fw coef0293[] = {
4860 UPDATE_COEF(0x10, 7<<8, 6<<8),
4861 UPDATE_COEFEX(0x57, 0x05, 1<<15|1<<13, 0x0),
4862 UPDATE_COEFEX(0x57, 0x03, 1<<10, 1<<10),
4863 UPDATE_COEF(0x1a, 1<<3, 1<<3),
4864 WRITE_COEF(0x45, 0xc429),
4865 UPDATE_COEF(0x4a, 0x000f, 0x000e),
4866 {}
4867 };
4868 static const struct coef_fw coef0668[] = {
4869 WRITE_COEF(0x15, 0x0d40),
4870 WRITE_COEF(0xb7, 0x802b),
4871 {}
4872 };
4873 static const struct coef_fw coef0225[] = {
4874 UPDATE_COEF(0x63, 3<<14, 0),
4875 {}
4876 };
4877 static const struct coef_fw coef0274[] = {
4878 UPDATE_COEF(0x4a, 0x0100, 0),
4879 UPDATE_COEFEX(0x57, 0x05, 0x4000, 0),
4880 UPDATE_COEF(0x6b, 0xf000, 0x5000),
4881 UPDATE_COEF(0x4a, 0x0010, 0),
4882 UPDATE_COEF(0x4a, 0x0c00, 0x0c00),
4883 WRITE_COEF(0x45, 0x5289),
4884 UPDATE_COEF(0x4a, 0x0c00, 0),
4885 {}
4886 };
4887
4888 if (spec->no_internal_mic_pin) {
4889 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
4890 return;
4891 }
4892
4893 switch (codec->core.vendor_id) {
4894 case 0x10ec0255:
4895 alc_process_coef_fw(codec, coef0255);
4896 break;
4897 case 0x10ec0230:
4898 case 0x10ec0236:
4899 case 0x10ec0256:
4900 alc_process_coef_fw(codec, coef0256);
4901 break;
4902 case 0x10ec0234:
4903 case 0x10ec0274:
4904 case 0x10ec0294:
4905 alc_process_coef_fw(codec, coef0274);
4906 break;
4907 case 0x10ec0233:
4908 case 0x10ec0283:
4909 alc_process_coef_fw(codec, coef0233);
4910 break;
4911 case 0x10ec0286:
4912 case 0x10ec0288:
4913 alc_process_coef_fw(codec, coef0288);
4914 break;
4915 case 0x10ec0298:
4916 alc_process_coef_fw(codec, coef0298);
4917 alc_process_coef_fw(codec, coef0288);
4918 break;
4919 case 0x10ec0292:
4920 alc_process_coef_fw(codec, coef0292);
4921 break;
4922 case 0x10ec0293:
4923 alc_process_coef_fw(codec, coef0293);
4924 break;
4925 case 0x10ec0668:
4926 alc_process_coef_fw(codec, coef0668);
4927 break;
4928 case 0x10ec0215:
4929 case 0x10ec0225:
4930 case 0x10ec0285:
4931 case 0x10ec0295:
4932 case 0x10ec0289:
4933 case 0x10ec0299:
4934 alc_process_coef_fw(codec, alc225_pre_hsmode);
4935 alc_process_coef_fw(codec, coef0225);
4936 break;
4937 case 0x10ec0867:
4938 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
4939 break;
4940 }
4941 codec_dbg(codec, "Headset jack set to unplugged mode.\n");
4942}
4943
4944
4945static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
4946 hda_nid_t mic_pin)
4947{
4948 static const struct coef_fw coef0255[] = {
4949 WRITE_COEFEX(0x57, 0x03, 0x8aa6),
4950 WRITE_COEF(0x06, 0x6100),
4951 {}
4952 };
4953 static const struct coef_fw coef0256[] = {
4954 UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14),
4955 WRITE_COEFEX(0x57, 0x03, 0x09a3),
4956 WRITE_COEF(0x06, 0x6100),
4957 {}
4958 };
4959 static const struct coef_fw coef0233[] = {
4960 UPDATE_COEF(0x35, 0, 1<<14),
4961 WRITE_COEF(0x06, 0x2100),
4962 WRITE_COEF(0x1a, 0x0021),
4963 WRITE_COEF(0x26, 0x008c),
4964 {}
4965 };
4966 static const struct coef_fw coef0288[] = {
4967 UPDATE_COEF(0x4f, 0x00c0, 0),
4968 UPDATE_COEF(0x50, 0x2000, 0),
4969 UPDATE_COEF(0x56, 0x0006, 0),
4970 UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
4971 UPDATE_COEF(0x66, 0x0008, 0x0008),
4972 UPDATE_COEF(0x67, 0x2000, 0x2000),
4973 {}
4974 };
4975 static const struct coef_fw coef0292[] = {
4976 WRITE_COEF(0x19, 0xa208),
4977 WRITE_COEF(0x2e, 0xacf0),
4978 {}
4979 };
4980 static const struct coef_fw coef0293[] = {
4981 UPDATE_COEFEX(0x57, 0x05, 0, 1<<15|1<<13),
4982 UPDATE_COEFEX(0x57, 0x03, 1<<10, 0),
4983 UPDATE_COEF(0x1a, 1<<3, 0),
4984 {}
4985 };
4986 static const struct coef_fw coef0688[] = {
4987 WRITE_COEF(0xb7, 0x802b),
4988 WRITE_COEF(0xb5, 0x1040),
4989 UPDATE_COEF(0xc3, 0, 1<<12),
4990 {}
4991 };
4992 static const struct coef_fw coef0225[] = {
4993 UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14),
4994 UPDATE_COEF(0x4a, 3<<4, 2<<4),
4995 UPDATE_COEF(0x63, 3<<14, 0),
4996 {}
4997 };
4998 static const struct coef_fw coef0274[] = {
4999 UPDATE_COEFEX(0x57, 0x05, 0x4000, 0x4000),
5000 UPDATE_COEF(0x4a, 0x0010, 0),
5001 UPDATE_COEF(0x6b, 0xf000, 0),
5002 {}
5003 };
5004
5005 switch (codec->core.vendor_id) {
5006 case 0x10ec0255:
5007 alc_write_coef_idx(codec, 0x45, 0xc489);
5008 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5009 alc_process_coef_fw(codec, coef0255);
5010 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5011 break;
5012 case 0x10ec0230:
5013 case 0x10ec0236:
5014 case 0x10ec0256:
5015 alc_write_coef_idx(codec, 0x45, 0xc489);
5016 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5017 alc_process_coef_fw(codec, coef0256);
5018 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5019 break;
5020 case 0x10ec0234:
5021 case 0x10ec0274:
5022 case 0x10ec0294:
5023 alc_write_coef_idx(codec, 0x45, 0x4689);
5024 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5025 alc_process_coef_fw(codec, coef0274);
5026 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5027 break;
5028 case 0x10ec0233:
5029 case 0x10ec0283:
5030 alc_write_coef_idx(codec, 0x45, 0xc429);
5031 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5032 alc_process_coef_fw(codec, coef0233);
5033 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5034 break;
5035 case 0x10ec0286:
5036 case 0x10ec0288:
5037 case 0x10ec0298:
5038 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5039 alc_process_coef_fw(codec, coef0288);
5040 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5041 break;
5042 case 0x10ec0292:
5043 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5044 alc_process_coef_fw(codec, coef0292);
5045 break;
5046 case 0x10ec0293:
5047
5048 alc_write_coef_idx(codec, 0x45, 0xc429);
5049 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5050 alc_process_coef_fw(codec, coef0293);
5051 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5052 break;
5053 case 0x10ec0867:
5054 alc_update_coefex_idx(codec, 0x57, 0x5, 0, 1<<14);
5055 fallthrough;
5056 case 0x10ec0221:
5057 case 0x10ec0662:
5058 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5059 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5060 break;
5061 case 0x10ec0668:
5062 alc_write_coef_idx(codec, 0x11, 0x0001);
5063 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5064 alc_process_coef_fw(codec, coef0688);
5065 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5066 break;
5067 case 0x10ec0215:
5068 case 0x10ec0225:
5069 case 0x10ec0285:
5070 case 0x10ec0295:
5071 case 0x10ec0289:
5072 case 0x10ec0299:
5073 alc_process_coef_fw(codec, alc225_pre_hsmode);
5074 alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x31<<10);
5075 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5076 alc_process_coef_fw(codec, coef0225);
5077 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5078 break;
5079 }
5080 codec_dbg(codec, "Headset jack set to mic-in mode.\n");
5081}
5082
5083static void alc_headset_mode_default(struct hda_codec *codec)
5084{
5085 static const struct coef_fw coef0225[] = {
5086 UPDATE_COEF(0x45, 0x3f<<10, 0x30<<10),
5087 UPDATE_COEF(0x45, 0x3f<<10, 0x31<<10),
5088 UPDATE_COEF(0x49, 3<<8, 0<<8),
5089 UPDATE_COEF(0x4a, 3<<4, 3<<4),
5090 UPDATE_COEF(0x63, 3<<14, 0),
5091 UPDATE_COEF(0x67, 0xf000, 0x3000),
5092 {}
5093 };
5094 static const struct coef_fw coef0255[] = {
5095 WRITE_COEF(0x45, 0xc089),
5096 WRITE_COEF(0x45, 0xc489),
5097 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5098 WRITE_COEF(0x49, 0x0049),
5099 {}
5100 };
5101 static const struct coef_fw coef0256[] = {
5102 WRITE_COEF(0x45, 0xc489),
5103 WRITE_COEFEX(0x57, 0x03, 0x0da3),
5104 WRITE_COEF(0x49, 0x0049),
5105 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0),
5106 WRITE_COEF(0x06, 0x6100),
5107 {}
5108 };
5109 static const struct coef_fw coef0233[] = {
5110 WRITE_COEF(0x06, 0x2100),
5111 WRITE_COEF(0x32, 0x4ea3),
5112 {}
5113 };
5114 static const struct coef_fw coef0288[] = {
5115 UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
5116 UPDATE_COEF(0x50, 0x2000, 0x2000),
5117 UPDATE_COEF(0x56, 0x0006, 0x0006),
5118 UPDATE_COEF(0x66, 0x0008, 0),
5119 UPDATE_COEF(0x67, 0x2000, 0),
5120 {}
5121 };
5122 static const struct coef_fw coef0292[] = {
5123 WRITE_COEF(0x76, 0x000e),
5124 WRITE_COEF(0x6c, 0x2400),
5125 WRITE_COEF(0x6b, 0xc429),
5126 WRITE_COEF(0x18, 0x7308),
5127 {}
5128 };
5129 static const struct coef_fw coef0293[] = {
5130 UPDATE_COEF(0x4a, 0x000f, 0x000e),
5131 WRITE_COEF(0x45, 0xC429),
5132 UPDATE_COEF(0x1a, 1<<3, 0),
5133 {}
5134 };
5135 static const struct coef_fw coef0688[] = {
5136 WRITE_COEF(0x11, 0x0041),
5137 WRITE_COEF(0x15, 0x0d40),
5138 WRITE_COEF(0xb7, 0x802b),
5139 {}
5140 };
5141 static const struct coef_fw coef0274[] = {
5142 WRITE_COEF(0x45, 0x4289),
5143 UPDATE_COEF(0x4a, 0x0010, 0x0010),
5144 UPDATE_COEF(0x6b, 0x0f00, 0),
5145 UPDATE_COEF(0x49, 0x0300, 0x0300),
5146 {}
5147 };
5148
5149 switch (codec->core.vendor_id) {
5150 case 0x10ec0215:
5151 case 0x10ec0225:
5152 case 0x10ec0285:
5153 case 0x10ec0295:
5154 case 0x10ec0289:
5155 case 0x10ec0299:
5156 alc_process_coef_fw(codec, alc225_pre_hsmode);
5157 alc_process_coef_fw(codec, coef0225);
5158 break;
5159 case 0x10ec0255:
5160 alc_process_coef_fw(codec, coef0255);
5161 break;
5162 case 0x10ec0230:
5163 case 0x10ec0236:
5164 case 0x10ec0256:
5165 alc_write_coef_idx(codec, 0x1b, 0x0e4b);
5166 alc_write_coef_idx(codec, 0x45, 0xc089);
5167 msleep(50);
5168 alc_process_coef_fw(codec, coef0256);
5169 break;
5170 case 0x10ec0234:
5171 case 0x10ec0274:
5172 case 0x10ec0294:
5173 alc_process_coef_fw(codec, coef0274);
5174 break;
5175 case 0x10ec0233:
5176 case 0x10ec0283:
5177 alc_process_coef_fw(codec, coef0233);
5178 break;
5179 case 0x10ec0286:
5180 case 0x10ec0288:
5181 case 0x10ec0298:
5182 alc_process_coef_fw(codec, coef0288);
5183 break;
5184 case 0x10ec0292:
5185 alc_process_coef_fw(codec, coef0292);
5186 break;
5187 case 0x10ec0293:
5188 alc_process_coef_fw(codec, coef0293);
5189 break;
5190 case 0x10ec0668:
5191 alc_process_coef_fw(codec, coef0688);
5192 break;
5193 case 0x10ec0867:
5194 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5195 break;
5196 }
5197 codec_dbg(codec, "Headset jack set to headphone (default) mode.\n");
5198}
5199
5200
5201static void alc_headset_mode_ctia(struct hda_codec *codec)
5202{
5203 int val;
5204
5205 static const struct coef_fw coef0255[] = {
5206 WRITE_COEF(0x45, 0xd489),
5207 WRITE_COEF(0x1b, 0x0c2b),
5208 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5209 {}
5210 };
5211 static const struct coef_fw coef0256[] = {
5212 WRITE_COEF(0x45, 0xd489),
5213 WRITE_COEF(0x1b, 0x0e6b),
5214 {}
5215 };
5216 static const struct coef_fw coef0233[] = {
5217 WRITE_COEF(0x45, 0xd429),
5218 WRITE_COEF(0x1b, 0x0c2b),
5219 WRITE_COEF(0x32, 0x4ea3),
5220 {}
5221 };
5222 static const struct coef_fw coef0288[] = {
5223 UPDATE_COEF(0x50, 0x2000, 0x2000),
5224 UPDATE_COEF(0x56, 0x0006, 0x0006),
5225 UPDATE_COEF(0x66, 0x0008, 0),
5226 UPDATE_COEF(0x67, 0x2000, 0),
5227 {}
5228 };
5229 static const struct coef_fw coef0292[] = {
5230 WRITE_COEF(0x6b, 0xd429),
5231 WRITE_COEF(0x76, 0x0008),
5232 WRITE_COEF(0x18, 0x7388),
5233 {}
5234 };
5235 static const struct coef_fw coef0293[] = {
5236 WRITE_COEF(0x45, 0xd429),
5237 UPDATE_COEF(0x10, 7<<8, 7<<8),
5238 {}
5239 };
5240 static const struct coef_fw coef0688[] = {
5241 WRITE_COEF(0x11, 0x0001),
5242 WRITE_COEF(0x15, 0x0d60),
5243 WRITE_COEF(0xc3, 0x0000),
5244 {}
5245 };
5246 static const struct coef_fw coef0225_1[] = {
5247 UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
5248 UPDATE_COEF(0x63, 3<<14, 2<<14),
5249 {}
5250 };
5251 static const struct coef_fw coef0225_2[] = {
5252 UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
5253 UPDATE_COEF(0x63, 3<<14, 1<<14),
5254 {}
5255 };
5256
5257 switch (codec->core.vendor_id) {
5258 case 0x10ec0255:
5259 alc_process_coef_fw(codec, coef0255);
5260 break;
5261 case 0x10ec0230:
5262 case 0x10ec0236:
5263 case 0x10ec0256:
5264 alc_process_coef_fw(codec, coef0256);
5265 break;
5266 case 0x10ec0234:
5267 case 0x10ec0274:
5268 case 0x10ec0294:
5269 alc_write_coef_idx(codec, 0x45, 0xd689);
5270 break;
5271 case 0x10ec0233:
5272 case 0x10ec0283:
5273 alc_process_coef_fw(codec, coef0233);
5274 break;
5275 case 0x10ec0298:
5276 val = alc_read_coef_idx(codec, 0x50);
5277 if (val & (1 << 12)) {
5278 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
5279 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5280 msleep(300);
5281 } else {
5282 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
5283 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5284 msleep(300);
5285 }
5286 break;
5287 case 0x10ec0286:
5288 case 0x10ec0288:
5289 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5290 msleep(300);
5291 alc_process_coef_fw(codec, coef0288);
5292 break;
5293 case 0x10ec0292:
5294 alc_process_coef_fw(codec, coef0292);
5295 break;
5296 case 0x10ec0293:
5297 alc_process_coef_fw(codec, coef0293);
5298 break;
5299 case 0x10ec0668:
5300 alc_process_coef_fw(codec, coef0688);
5301 break;
5302 case 0x10ec0215:
5303 case 0x10ec0225:
5304 case 0x10ec0285:
5305 case 0x10ec0295:
5306 case 0x10ec0289:
5307 case 0x10ec0299:
5308 val = alc_read_coef_idx(codec, 0x45);
5309 if (val & (1 << 9))
5310 alc_process_coef_fw(codec, coef0225_2);
5311 else
5312 alc_process_coef_fw(codec, coef0225_1);
5313 break;
5314 case 0x10ec0867:
5315 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5316 break;
5317 }
5318 codec_dbg(codec, "Headset jack set to iPhone-style headset mode.\n");
5319}
5320
5321
5322static void alc_headset_mode_omtp(struct hda_codec *codec)
5323{
5324 static const struct coef_fw coef0255[] = {
5325 WRITE_COEF(0x45, 0xe489),
5326 WRITE_COEF(0x1b, 0x0c2b),
5327 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5328 {}
5329 };
5330 static const struct coef_fw coef0256[] = {
5331 WRITE_COEF(0x45, 0xe489),
5332 WRITE_COEF(0x1b, 0x0e6b),
5333 {}
5334 };
5335 static const struct coef_fw coef0233[] = {
5336 WRITE_COEF(0x45, 0xe429),
5337 WRITE_COEF(0x1b, 0x0c2b),
5338 WRITE_COEF(0x32, 0x4ea3),
5339 {}
5340 };
5341 static const struct coef_fw coef0288[] = {
5342 UPDATE_COEF(0x50, 0x2000, 0x2000),
5343 UPDATE_COEF(0x56, 0x0006, 0x0006),
5344 UPDATE_COEF(0x66, 0x0008, 0),
5345 UPDATE_COEF(0x67, 0x2000, 0),
5346 {}
5347 };
5348 static const struct coef_fw coef0292[] = {
5349 WRITE_COEF(0x6b, 0xe429),
5350 WRITE_COEF(0x76, 0x0008),
5351 WRITE_COEF(0x18, 0x7388),
5352 {}
5353 };
5354 static const struct coef_fw coef0293[] = {
5355 WRITE_COEF(0x45, 0xe429),
5356 UPDATE_COEF(0x10, 7<<8, 7<<8),
5357 {}
5358 };
5359 static const struct coef_fw coef0688[] = {
5360 WRITE_COEF(0x11, 0x0001),
5361 WRITE_COEF(0x15, 0x0d50),
5362 WRITE_COEF(0xc3, 0x0000),
5363 {}
5364 };
5365 static const struct coef_fw coef0225[] = {
5366 UPDATE_COEF(0x45, 0x3f<<10, 0x39<<10),
5367 UPDATE_COEF(0x63, 3<<14, 2<<14),
5368 {}
5369 };
5370
5371 switch (codec->core.vendor_id) {
5372 case 0x10ec0255:
5373 alc_process_coef_fw(codec, coef0255);
5374 break;
5375 case 0x10ec0230:
5376 case 0x10ec0236:
5377 case 0x10ec0256:
5378 alc_process_coef_fw(codec, coef0256);
5379 break;
5380 case 0x10ec0234:
5381 case 0x10ec0274:
5382 case 0x10ec0294:
5383 alc_write_coef_idx(codec, 0x45, 0xe689);
5384 break;
5385 case 0x10ec0233:
5386 case 0x10ec0283:
5387 alc_process_coef_fw(codec, coef0233);
5388 break;
5389 case 0x10ec0298:
5390 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
5391 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5392 msleep(300);
5393 break;
5394 case 0x10ec0286:
5395 case 0x10ec0288:
5396 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5397 msleep(300);
5398 alc_process_coef_fw(codec, coef0288);
5399 break;
5400 case 0x10ec0292:
5401 alc_process_coef_fw(codec, coef0292);
5402 break;
5403 case 0x10ec0293:
5404 alc_process_coef_fw(codec, coef0293);
5405 break;
5406 case 0x10ec0668:
5407 alc_process_coef_fw(codec, coef0688);
5408 break;
5409 case 0x10ec0215:
5410 case 0x10ec0225:
5411 case 0x10ec0285:
5412 case 0x10ec0295:
5413 case 0x10ec0289:
5414 case 0x10ec0299:
5415 alc_process_coef_fw(codec, coef0225);
5416 break;
5417 }
5418 codec_dbg(codec, "Headset jack set to Nokia-style headset mode.\n");
5419}
5420
5421static void alc_determine_headset_type(struct hda_codec *codec)
5422{
5423 int val;
5424 bool is_ctia = false;
5425 struct alc_spec *spec = codec->spec;
5426 static const struct coef_fw coef0255[] = {
5427 WRITE_COEF(0x45, 0xd089),
5428 WRITE_COEF(0x49, 0x0149),
5429
5430 {}
5431 };
5432 static const struct coef_fw coef0288[] = {
5433 UPDATE_COEF(0x4f, 0xfcc0, 0xd400),
5434 {}
5435 };
5436 static const struct coef_fw coef0298[] = {
5437 UPDATE_COEF(0x50, 0x2000, 0x2000),
5438 UPDATE_COEF(0x56, 0x0006, 0x0006),
5439 UPDATE_COEF(0x66, 0x0008, 0),
5440 UPDATE_COEF(0x67, 0x2000, 0),
5441 UPDATE_COEF(0x19, 0x1300, 0x1300),
5442 {}
5443 };
5444 static const struct coef_fw coef0293[] = {
5445 UPDATE_COEF(0x4a, 0x000f, 0x0008),
5446 WRITE_COEF(0x45, 0xD429),
5447 {}
5448 };
5449 static const struct coef_fw coef0688[] = {
5450 WRITE_COEF(0x11, 0x0001),
5451 WRITE_COEF(0xb7, 0x802b),
5452 WRITE_COEF(0x15, 0x0d60),
5453 WRITE_COEF(0xc3, 0x0c00),
5454 {}
5455 };
5456 static const struct coef_fw coef0274[] = {
5457 UPDATE_COEF(0x4a, 0x0010, 0),
5458 UPDATE_COEF(0x4a, 0x8000, 0),
5459 WRITE_COEF(0x45, 0xd289),
5460 UPDATE_COEF(0x49, 0x0300, 0x0300),
5461 {}
5462 };
5463
5464 if (spec->no_internal_mic_pin) {
5465 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
5466 return;
5467 }
5468
5469 switch (codec->core.vendor_id) {
5470 case 0x10ec0255:
5471 alc_process_coef_fw(codec, coef0255);
5472 msleep(300);
5473 val = alc_read_coef_idx(codec, 0x46);
5474 is_ctia = (val & 0x0070) == 0x0070;
5475 break;
5476 case 0x10ec0230:
5477 case 0x10ec0236:
5478 case 0x10ec0256:
5479 alc_write_coef_idx(codec, 0x1b, 0x0e4b);
5480 alc_write_coef_idx(codec, 0x06, 0x6104);
5481 alc_write_coefex_idx(codec, 0x57, 0x3, 0x09a3);
5482
5483 snd_hda_codec_write(codec, 0x21, 0,
5484 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5485 msleep(80);
5486 snd_hda_codec_write(codec, 0x21, 0,
5487 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5488
5489 alc_process_coef_fw(codec, coef0255);
5490 msleep(300);
5491 val = alc_read_coef_idx(codec, 0x46);
5492 is_ctia = (val & 0x0070) == 0x0070;
5493
5494 alc_write_coefex_idx(codec, 0x57, 0x3, 0x0da3);
5495 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5496
5497 snd_hda_codec_write(codec, 0x21, 0,
5498 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5499 msleep(80);
5500 snd_hda_codec_write(codec, 0x21, 0,
5501 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5502 break;
5503 case 0x10ec0234:
5504 case 0x10ec0274:
5505 case 0x10ec0294:
5506 alc_process_coef_fw(codec, coef0274);
5507 msleep(850);
5508 val = alc_read_coef_idx(codec, 0x46);
5509 is_ctia = (val & 0x00f0) == 0x00f0;
5510 break;
5511 case 0x10ec0233:
5512 case 0x10ec0283:
5513 alc_write_coef_idx(codec, 0x45, 0xd029);
5514 msleep(300);
5515 val = alc_read_coef_idx(codec, 0x46);
5516 is_ctia = (val & 0x0070) == 0x0070;
5517 break;
5518 case 0x10ec0298:
5519 snd_hda_codec_write(codec, 0x21, 0,
5520 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5521 msleep(100);
5522 snd_hda_codec_write(codec, 0x21, 0,
5523 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5524 msleep(200);
5525
5526 val = alc_read_coef_idx(codec, 0x50);
5527 if (val & (1 << 12)) {
5528 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
5529 alc_process_coef_fw(codec, coef0288);
5530 msleep(350);
5531 val = alc_read_coef_idx(codec, 0x50);
5532 is_ctia = (val & 0x0070) == 0x0070;
5533 } else {
5534 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
5535 alc_process_coef_fw(codec, coef0288);
5536 msleep(350);
5537 val = alc_read_coef_idx(codec, 0x50);
5538 is_ctia = (val & 0x0070) == 0x0070;
5539 }
5540 alc_process_coef_fw(codec, coef0298);
5541 snd_hda_codec_write(codec, 0x21, 0,
5542 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP);
5543 msleep(75);
5544 snd_hda_codec_write(codec, 0x21, 0,
5545 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5546 break;
5547 case 0x10ec0286:
5548 case 0x10ec0288:
5549 alc_process_coef_fw(codec, coef0288);
5550 msleep(350);
5551 val = alc_read_coef_idx(codec, 0x50);
5552 is_ctia = (val & 0x0070) == 0x0070;
5553 break;
5554 case 0x10ec0292:
5555 alc_write_coef_idx(codec, 0x6b, 0xd429);
5556 msleep(300);
5557 val = alc_read_coef_idx(codec, 0x6c);
5558 is_ctia = (val & 0x001c) == 0x001c;
5559 break;
5560 case 0x10ec0293:
5561 alc_process_coef_fw(codec, coef0293);
5562 msleep(300);
5563 val = alc_read_coef_idx(codec, 0x46);
5564 is_ctia = (val & 0x0070) == 0x0070;
5565 break;
5566 case 0x10ec0668:
5567 alc_process_coef_fw(codec, coef0688);
5568 msleep(300);
5569 val = alc_read_coef_idx(codec, 0xbe);
5570 is_ctia = (val & 0x1c02) == 0x1c02;
5571 break;
5572 case 0x10ec0215:
5573 case 0x10ec0225:
5574 case 0x10ec0285:
5575 case 0x10ec0295:
5576 case 0x10ec0289:
5577 case 0x10ec0299:
5578 snd_hda_codec_write(codec, 0x21, 0,
5579 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5580 msleep(80);
5581 snd_hda_codec_write(codec, 0x21, 0,
5582 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5583
5584 alc_process_coef_fw(codec, alc225_pre_hsmode);
5585 alc_update_coef_idx(codec, 0x67, 0xf000, 0x1000);
5586 val = alc_read_coef_idx(codec, 0x45);
5587 if (val & (1 << 9)) {
5588 alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5589 alc_update_coef_idx(codec, 0x49, 3<<8, 2<<8);
5590 msleep(800);
5591 val = alc_read_coef_idx(codec, 0x46);
5592 is_ctia = (val & 0x00f0) == 0x00f0;
5593 } else {
5594 alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5595 alc_update_coef_idx(codec, 0x49, 3<<8, 1<<8);
5596 msleep(800);
5597 val = alc_read_coef_idx(codec, 0x46);
5598 is_ctia = (val & 0x00f0) == 0x00f0;
5599 }
5600 alc_update_coef_idx(codec, 0x4a, 7<<6, 7<<6);
5601 alc_update_coef_idx(codec, 0x4a, 3<<4, 3<<4);
5602 alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
5603
5604 snd_hda_codec_write(codec, 0x21, 0,
5605 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5606 msleep(80);
5607 snd_hda_codec_write(codec, 0x21, 0,
5608 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5609 break;
5610 case 0x10ec0867:
5611 is_ctia = true;
5612 break;
5613 }
5614
5615 codec_dbg(codec, "Headset jack detected iPhone-style headset: %s\n",
5616 is_ctia ? "yes" : "no");
5617 spec->current_headset_type = is_ctia ? ALC_HEADSET_TYPE_CTIA : ALC_HEADSET_TYPE_OMTP;
5618}
5619
5620static void alc_update_headset_mode(struct hda_codec *codec)
5621{
5622 struct alc_spec *spec = codec->spec;
5623
5624 hda_nid_t mux_pin = spec->gen.imux_pins[spec->gen.cur_mux[0]];
5625 hda_nid_t hp_pin = alc_get_hp_pin(spec);
5626
5627 int new_headset_mode;
5628
5629 if (!snd_hda_jack_detect(codec, hp_pin))
5630 new_headset_mode = ALC_HEADSET_MODE_UNPLUGGED;
5631 else if (mux_pin == spec->headset_mic_pin)
5632 new_headset_mode = ALC_HEADSET_MODE_HEADSET;
5633 else if (mux_pin == spec->headphone_mic_pin)
5634 new_headset_mode = ALC_HEADSET_MODE_MIC;
5635 else
5636 new_headset_mode = ALC_HEADSET_MODE_HEADPHONE;
5637
5638 if (new_headset_mode == spec->current_headset_mode) {
5639 snd_hda_gen_update_outputs(codec);
5640 return;
5641 }
5642
5643 switch (new_headset_mode) {
5644 case ALC_HEADSET_MODE_UNPLUGGED:
5645 alc_headset_mode_unplugged(codec);
5646 spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5647 spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
5648 spec->gen.hp_jack_present = false;
5649 break;
5650 case ALC_HEADSET_MODE_HEADSET:
5651 if (spec->current_headset_type == ALC_HEADSET_TYPE_UNKNOWN)
5652 alc_determine_headset_type(codec);
5653 if (spec->current_headset_type == ALC_HEADSET_TYPE_CTIA)
5654 alc_headset_mode_ctia(codec);
5655 else if (spec->current_headset_type == ALC_HEADSET_TYPE_OMTP)
5656 alc_headset_mode_omtp(codec);
5657 spec->gen.hp_jack_present = true;
5658 break;
5659 case ALC_HEADSET_MODE_MIC:
5660 alc_headset_mode_mic_in(codec, hp_pin, spec->headphone_mic_pin);
5661 spec->gen.hp_jack_present = false;
5662 break;
5663 case ALC_HEADSET_MODE_HEADPHONE:
5664 alc_headset_mode_default(codec);
5665 spec->gen.hp_jack_present = true;
5666 break;
5667 }
5668 if (new_headset_mode != ALC_HEADSET_MODE_MIC) {
5669 snd_hda_set_pin_ctl_cache(codec, hp_pin,
5670 AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
5671 if (spec->headphone_mic_pin && spec->headphone_mic_pin != hp_pin)
5672 snd_hda_set_pin_ctl_cache(codec, spec->headphone_mic_pin,
5673 PIN_VREFHIZ);
5674 }
5675 spec->current_headset_mode = new_headset_mode;
5676
5677 snd_hda_gen_update_outputs(codec);
5678}
5679
5680static void alc_update_headset_mode_hook(struct hda_codec *codec,
5681 struct snd_kcontrol *kcontrol,
5682 struct snd_ctl_elem_value *ucontrol)
5683{
5684 alc_update_headset_mode(codec);
5685}
5686
5687static void alc_update_headset_jack_cb(struct hda_codec *codec,
5688 struct hda_jack_callback *jack)
5689{
5690 snd_hda_gen_hp_automute(codec, jack);
5691 alc_update_headset_mode(codec);
5692}
5693
5694static void alc_probe_headset_mode(struct hda_codec *codec)
5695{
5696 int i;
5697 struct alc_spec *spec = codec->spec;
5698 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5699
5700
5701 for (i = 0; i < cfg->num_inputs; i++) {
5702 if (cfg->inputs[i].is_headset_mic && !spec->headset_mic_pin)
5703 spec->headset_mic_pin = cfg->inputs[i].pin;
5704 if (cfg->inputs[i].is_headphone_mic && !spec->headphone_mic_pin)
5705 spec->headphone_mic_pin = cfg->inputs[i].pin;
5706 }
5707
5708 WARN_ON(spec->gen.cap_sync_hook);
5709 spec->gen.cap_sync_hook = alc_update_headset_mode_hook;
5710 spec->gen.automute_hook = alc_update_headset_mode;
5711 spec->gen.hp_automute_hook = alc_update_headset_jack_cb;
5712}
5713
5714static void alc_fixup_headset_mode(struct hda_codec *codec,
5715 const struct hda_fixup *fix, int action)
5716{
5717 struct alc_spec *spec = codec->spec;
5718
5719 switch (action) {
5720 case HDA_FIXUP_ACT_PRE_PROBE:
5721 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC | HDA_PINCFG_HEADPHONE_MIC;
5722 break;
5723 case HDA_FIXUP_ACT_PROBE:
5724 alc_probe_headset_mode(codec);
5725 break;
5726 case HDA_FIXUP_ACT_INIT:
5727 if (is_s3_resume(codec) || is_s4_resume(codec)) {
5728 spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5729 spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
5730 }
5731 alc_update_headset_mode(codec);
5732 break;
5733 }
5734}
5735
5736static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
5737 const struct hda_fixup *fix, int action)
5738{
5739 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5740 struct alc_spec *spec = codec->spec;
5741 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5742 }
5743 else
5744 alc_fixup_headset_mode(codec, fix, action);
5745}
5746
5747static void alc255_set_default_jack_type(struct hda_codec *codec)
5748{
5749
5750 static const struct coef_fw alc255fw[] = {
5751 WRITE_COEF(0x1b, 0x880b),
5752 WRITE_COEF(0x45, 0xd089),
5753 WRITE_COEF(0x1b, 0x080b),
5754 WRITE_COEF(0x46, 0x0004),
5755 WRITE_COEF(0x1b, 0x0c0b),
5756 {}
5757 };
5758 static const struct coef_fw alc256fw[] = {
5759 WRITE_COEF(0x1b, 0x884b),
5760 WRITE_COEF(0x45, 0xd089),
5761 WRITE_COEF(0x1b, 0x084b),
5762 WRITE_COEF(0x46, 0x0004),
5763 WRITE_COEF(0x1b, 0x0c4b),
5764 {}
5765 };
5766 switch (codec->core.vendor_id) {
5767 case 0x10ec0255:
5768 alc_process_coef_fw(codec, alc255fw);
5769 break;
5770 case 0x10ec0230:
5771 case 0x10ec0236:
5772 case 0x10ec0256:
5773 alc_process_coef_fw(codec, alc256fw);
5774 break;
5775 }
5776 msleep(30);
5777}
5778
5779static void alc_fixup_headset_mode_alc255(struct hda_codec *codec,
5780 const struct hda_fixup *fix, int action)
5781{
5782 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5783 alc255_set_default_jack_type(codec);
5784 }
5785 alc_fixup_headset_mode(codec, fix, action);
5786}
5787
5788static void alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec,
5789 const struct hda_fixup *fix, int action)
5790{
5791 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5792 struct alc_spec *spec = codec->spec;
5793 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5794 alc255_set_default_jack_type(codec);
5795 }
5796 else
5797 alc_fixup_headset_mode(codec, fix, action);
5798}
5799
5800static void alc288_update_headset_jack_cb(struct hda_codec *codec,
5801 struct hda_jack_callback *jack)
5802{
5803 struct alc_spec *spec = codec->spec;
5804
5805 alc_update_headset_jack_cb(codec, jack);
5806
5807 alc_update_gpio_data(codec, 0x40, spec->gen.hp_jack_present);
5808}
5809
5810static void alc_fixup_headset_mode_dell_alc288(struct hda_codec *codec,
5811 const struct hda_fixup *fix, int action)
5812{
5813 alc_fixup_headset_mode(codec, fix, action);
5814 if (action == HDA_FIXUP_ACT_PROBE) {
5815 struct alc_spec *spec = codec->spec;
5816
5817 spec->gpio_mask |= 0x40;
5818 spec->gpio_dir |= 0x40;
5819 spec->gen.hp_automute_hook = alc288_update_headset_jack_cb;
5820 }
5821}
5822
5823static void alc_fixup_auto_mute_via_amp(struct hda_codec *codec,
5824 const struct hda_fixup *fix, int action)
5825{
5826 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5827 struct alc_spec *spec = codec->spec;
5828 spec->gen.auto_mute_via_amp = 1;
5829 }
5830}
5831
5832static void alc_fixup_no_shutup(struct hda_codec *codec,
5833 const struct hda_fixup *fix, int action)
5834{
5835 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5836 struct alc_spec *spec = codec->spec;
5837 spec->no_shutup_pins = 1;
5838 }
5839}
5840
5841static void alc_fixup_disable_aamix(struct hda_codec *codec,
5842 const struct hda_fixup *fix, int action)
5843{
5844 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5845 struct alc_spec *spec = codec->spec;
5846
5847 spec->gen.mixer_nid = 0;
5848 }
5849}
5850
5851
5852static void alc_fixup_tpt440_dock(struct hda_codec *codec,
5853 const struct hda_fixup *fix, int action)
5854{
5855 static const struct hda_pintbl pincfgs[] = {
5856 { 0x16, 0x21211010 },
5857 { 0x19, 0x21a11010 },
5858 { }
5859 };
5860 struct alc_spec *spec = codec->spec;
5861
5862 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5863 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
5864 codec->power_save_node = 0;
5865 snd_hda_apply_pincfgs(codec, pincfgs);
5866 }
5867}
5868
5869static void alc_fixup_tpt470_dock(struct hda_codec *codec,
5870 const struct hda_fixup *fix, int action)
5871{
5872 static const struct hda_pintbl pincfgs[] = {
5873 { 0x17, 0x21211010 },
5874 { 0x19, 0x21a11010 },
5875 { }
5876 };
5877 struct alc_spec *spec = codec->spec;
5878
5879 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5880 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
5881 snd_hda_apply_pincfgs(codec, pincfgs);
5882 } else if (action == HDA_FIXUP_ACT_INIT) {
5883
5884 snd_hda_codec_write(codec, 0x17, 0,
5885 AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
5886
5887 snd_hda_codec_write(codec, 0x19, 0,
5888 AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
5889 }
5890}
5891
5892static void alc_fixup_tpt470_dacs(struct hda_codec *codec,
5893 const struct hda_fixup *fix, int action)
5894{
5895
5896
5897
5898
5899 static const hda_nid_t preferred_pairs[] = {
5900 0x14, 0x03, 0x17, 0x02, 0x21, 0x02,
5901 0
5902 };
5903 struct alc_spec *spec = codec->spec;
5904
5905 if (action == HDA_FIXUP_ACT_PRE_PROBE)
5906 spec->gen.preferred_dacs = preferred_pairs;
5907}
5908
5909static void alc295_fixup_asus_dacs(struct hda_codec *codec,
5910 const struct hda_fixup *fix, int action)
5911{
5912 static const hda_nid_t preferred_pairs[] = {
5913 0x17, 0x02, 0x21, 0x03, 0
5914 };
5915 struct alc_spec *spec = codec->spec;
5916
5917 if (action == HDA_FIXUP_ACT_PRE_PROBE)
5918 spec->gen.preferred_dacs = preferred_pairs;
5919}
5920
5921static void alc_shutup_dell_xps13(struct hda_codec *codec)
5922{
5923 struct alc_spec *spec = codec->spec;
5924 int hp_pin = alc_get_hp_pin(spec);
5925
5926
5927 snd_hda_codec_write(codec, hp_pin, 0,
5928 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5929 msleep(20);
5930}
5931
5932static void alc_fixup_dell_xps13(struct hda_codec *codec,
5933 const struct hda_fixup *fix, int action)
5934{
5935 struct alc_spec *spec = codec->spec;
5936 struct hda_input_mux *imux = &spec->gen.input_mux;
5937 int i;
5938
5939 switch (action) {
5940 case HDA_FIXUP_ACT_PRE_PROBE:
5941
5942
5943
5944 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
5945 spec->shutup = alc_shutup_dell_xps13;
5946 break;
5947 case HDA_FIXUP_ACT_PROBE:
5948
5949 for (i = 0; i < imux->num_items; i++) {
5950 if (spec->gen.imux_pins[i] == 0x12) {
5951 spec->gen.cur_mux[0] = i;
5952 break;
5953 }
5954 }
5955 break;
5956 }
5957}
5958
5959static void alc_fixup_headset_mode_alc662(struct hda_codec *codec,
5960 const struct hda_fixup *fix, int action)
5961{
5962 struct alc_spec *spec = codec->spec;
5963
5964 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5965 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5966 spec->gen.hp_mic = 1;
5967
5968
5969
5970 snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000);
5971 snd_hda_override_wcaps(codec, 0x1b, get_wcaps(codec, 0x1b) & ~AC_WCAP_IN_AMP);
5972 } else
5973 alc_fixup_headset_mode(codec, fix, action);
5974}
5975
5976static void alc_fixup_headset_mode_alc668(struct hda_codec *codec,
5977 const struct hda_fixup *fix, int action)
5978{
5979 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5980 alc_write_coef_idx(codec, 0xc4, 0x8000);
5981 alc_update_coef_idx(codec, 0xc2, ~0xfe, 0);
5982 snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
5983 }
5984 alc_fixup_headset_mode(codec, fix, action);
5985}
5986
5987
5988static int find_ext_mic_pin(struct hda_codec *codec)
5989{
5990 struct alc_spec *spec = codec->spec;
5991 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5992 hda_nid_t nid;
5993 unsigned int defcfg;
5994 int i;
5995
5996 for (i = 0; i < cfg->num_inputs; i++) {
5997 if (cfg->inputs[i].type != AUTO_PIN_MIC)
5998 continue;
5999 nid = cfg->inputs[i].pin;
6000 defcfg = snd_hda_codec_get_pincfg(codec, nid);
6001 if (snd_hda_get_input_pin_attr(defcfg) == INPUT_PIN_ATTR_INT)
6002 continue;
6003 return nid;
6004 }
6005
6006 return 0;
6007}
6008
6009static void alc271_hp_gate_mic_jack(struct hda_codec *codec,
6010 const struct hda_fixup *fix,
6011 int action)
6012{
6013 struct alc_spec *spec = codec->spec;
6014
6015 if (action == HDA_FIXUP_ACT_PROBE) {
6016 int mic_pin = find_ext_mic_pin(codec);
6017 int hp_pin = alc_get_hp_pin(spec);
6018
6019 if (snd_BUG_ON(!mic_pin || !hp_pin))
6020 return;
6021 snd_hda_jack_set_gating_jack(codec, mic_pin, hp_pin);
6022 }
6023}
6024
6025static void alc269_fixup_limit_int_mic_boost(struct hda_codec *codec,
6026 const struct hda_fixup *fix,
6027 int action)
6028{
6029 struct alc_spec *spec = codec->spec;
6030 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
6031 int i;
6032
6033
6034
6035
6036
6037 if (action != HDA_FIXUP_ACT_PROBE)
6038 return;
6039
6040 for (i = 0; i < cfg->num_inputs; i++) {
6041 hda_nid_t nid = cfg->inputs[i].pin;
6042 unsigned int defcfg;
6043 if (cfg->inputs[i].type != AUTO_PIN_MIC)
6044 continue;
6045 defcfg = snd_hda_codec_get_pincfg(codec, nid);
6046 if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
6047 continue;
6048
6049 snd_hda_override_amp_caps(codec, nid, HDA_INPUT,
6050 (0x00 << AC_AMPCAP_OFFSET_SHIFT) |
6051 (0x01 << AC_AMPCAP_NUM_STEPS_SHIFT) |
6052 (0x2f << AC_AMPCAP_STEP_SIZE_SHIFT) |
6053 (0 << AC_AMPCAP_MUTE_SHIFT));
6054 }
6055}
6056
6057static void alc283_hp_automute_hook(struct hda_codec *codec,
6058 struct hda_jack_callback *jack)
6059{
6060 struct alc_spec *spec = codec->spec;
6061 int vref;
6062
6063 msleep(200);
6064 snd_hda_gen_hp_automute(codec, jack);
6065
6066 vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
6067
6068 msleep(600);
6069 snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
6070 vref);
6071}
6072
6073static void alc283_fixup_chromebook(struct hda_codec *codec,
6074 const struct hda_fixup *fix, int action)
6075{
6076 struct alc_spec *spec = codec->spec;
6077
6078 switch (action) {
6079 case HDA_FIXUP_ACT_PRE_PROBE:
6080 snd_hda_override_wcaps(codec, 0x03, 0);
6081
6082 spec->gen.mixer_nid = 0;
6083 break;
6084 case HDA_FIXUP_ACT_INIT:
6085
6086
6087 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
6088
6089 alc_update_coef_idx(codec, 0x1a, 0, 1 << 4);
6090 break;
6091 }
6092}
6093
6094static void alc283_fixup_sense_combo_jack(struct hda_codec *codec,
6095 const struct hda_fixup *fix, int action)
6096{
6097 struct alc_spec *spec = codec->spec;
6098
6099 switch (action) {
6100 case HDA_FIXUP_ACT_PRE_PROBE:
6101 spec->gen.hp_automute_hook = alc283_hp_automute_hook;
6102 break;
6103 case HDA_FIXUP_ACT_INIT:
6104
6105
6106 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
6107 break;
6108 }
6109}
6110
6111
6112static void asus_tx300_automute(struct hda_codec *codec)
6113{
6114 struct alc_spec *spec = codec->spec;
6115 snd_hda_gen_update_outputs(codec);
6116 if (snd_hda_jack_detect(codec, 0x1b))
6117 spec->gen.mute_bits |= (1ULL << 0x14);
6118}
6119
6120static void alc282_fixup_asus_tx300(struct hda_codec *codec,
6121 const struct hda_fixup *fix, int action)
6122{
6123 struct alc_spec *spec = codec->spec;
6124 static const struct hda_pintbl dock_pins[] = {
6125 { 0x1b, 0x21114000 },
6126 {}
6127 };
6128
6129 switch (action) {
6130 case HDA_FIXUP_ACT_PRE_PROBE:
6131 spec->init_amp = ALC_INIT_DEFAULT;
6132
6133 alc_setup_gpio(codec, 0x04);
6134 snd_hda_apply_pincfgs(codec, dock_pins);
6135 spec->gen.auto_mute_via_amp = 1;
6136 spec->gen.automute_hook = asus_tx300_automute;
6137 snd_hda_jack_detect_enable_callback(codec, 0x1b,
6138 snd_hda_gen_hp_automute);
6139 break;
6140 case HDA_FIXUP_ACT_PROBE:
6141 spec->init_amp = ALC_INIT_DEFAULT;
6142 break;
6143 case HDA_FIXUP_ACT_BUILD:
6144
6145
6146
6147 rename_ctl(codec, "Speaker Playback Switch",
6148 "Dock Speaker Playback Switch");
6149 rename_ctl(codec, "Bass Speaker Playback Switch",
6150 "Speaker Playback Switch");
6151 break;
6152 }
6153}
6154
6155static void alc290_fixup_mono_speakers(struct hda_codec *codec,
6156 const struct hda_fixup *fix, int action)
6157{
6158 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6159
6160
6161
6162 static const hda_nid_t conn1[] = { 0x0c };
6163 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
6164 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
6165 }
6166}
6167
6168static void alc298_fixup_speaker_volume(struct hda_codec *codec,
6169 const struct hda_fixup *fix, int action)
6170{
6171 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6172
6173
6174
6175
6176
6177
6178
6179 static const hda_nid_t conn1[] = { 0x0c };
6180 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn1), conn1);
6181 }
6182}
6183
6184
6185static void alc295_fixup_disable_dac3(struct hda_codec *codec,
6186 const struct hda_fixup *fix, int action)
6187{
6188 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6189 static const hda_nid_t conn[] = { 0x02, 0x03 };
6190 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6191 }
6192}
6193
6194
6195static void alc285_fixup_speaker2_to_dac1(struct hda_codec *codec,
6196 const struct hda_fixup *fix, int action)
6197{
6198 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6199 static const hda_nid_t conn[] = { 0x02 };
6200 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6201 }
6202}
6203
6204
6205static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec,
6206 struct hda_jack_callback *jack)
6207{
6208 struct alc_spec *spec = codec->spec;
6209
6210 snd_hda_gen_hp_automute(codec, jack);
6211
6212 alc_update_gpio_led(codec, 0x10, spec->mute_led_polarity,
6213 !spec->gen.hp_jack_present);
6214}
6215
6216
6217
6218
6219
6220
6221
6222static void alc280_fixup_hp_9480m(struct hda_codec *codec,
6223 const struct hda_fixup *fix,
6224 int action)
6225{
6226 struct alc_spec *spec = codec->spec;
6227
6228 alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
6229 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6230
6231 spec->gpio_mask |= 0x10;
6232 spec->gpio_dir |= 0x10;
6233 spec->gen.hp_automute_hook = alc280_hp_gpio4_automute_hook;
6234 }
6235}
6236
6237static void alc275_fixup_gpio4_off(struct hda_codec *codec,
6238 const struct hda_fixup *fix,
6239 int action)
6240{
6241 struct alc_spec *spec = codec->spec;
6242
6243 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6244 spec->gpio_mask |= 0x04;
6245 spec->gpio_dir |= 0x04;
6246
6247 }
6248}
6249
6250
6251
6252
6253
6254
6255
6256static void alc285_fixup_thinkpad_x1_gen7(struct hda_codec *codec,
6257 const struct hda_fixup *fix, int action)
6258{
6259 static const hda_nid_t conn[] = { 0x02, 0x03 };
6260 static const hda_nid_t preferred_pairs[] = {
6261 0x14, 0x02, 0x17, 0x03, 0x21, 0x03, 0
6262 };
6263 struct alc_spec *spec = codec->spec;
6264
6265 switch (action) {
6266 case HDA_FIXUP_ACT_PRE_PROBE:
6267 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6268 spec->gen.preferred_dacs = preferred_pairs;
6269 break;
6270 case HDA_FIXUP_ACT_BUILD:
6271
6272
6273
6274
6275
6276
6277 rename_ctl(codec, "Front Playback Volume", "DAC1 Playback Volume");
6278 rename_ctl(codec, "Bass Speaker Playback Volume", "DAC2 Playback Volume");
6279 break;
6280 }
6281}
6282
6283static void alc233_alc662_fixup_lenovo_dual_codecs(struct hda_codec *codec,
6284 const struct hda_fixup *fix,
6285 int action)
6286{
6287 alc_fixup_dual_codecs(codec, fix, action);
6288 switch (action) {
6289 case HDA_FIXUP_ACT_PRE_PROBE:
6290
6291 strcpy(codec->card->longname, "HDAudio-Lenovo-DualCodecs");
6292 break;
6293 case HDA_FIXUP_ACT_BUILD:
6294
6295 rename_ctl(codec, "Capture Volume",
6296 codec->addr == 0 ?
6297 "Rear-Panel Capture Volume" :
6298 "Front-Panel Capture Volume");
6299 rename_ctl(codec, "Capture Switch",
6300 codec->addr == 0 ?
6301 "Rear-Panel Capture Switch" :
6302 "Front-Panel Capture Switch");
6303 break;
6304 }
6305}
6306
6307static void alc225_fixup_s3_pop_noise(struct hda_codec *codec,
6308 const struct hda_fixup *fix, int action)
6309{
6310 if (action != HDA_FIXUP_ACT_PRE_PROBE)
6311 return;
6312
6313 codec->power_save_node = 1;
6314}
6315
6316
6317static void alc274_fixup_bind_dacs(struct hda_codec *codec,
6318 const struct hda_fixup *fix, int action)
6319{
6320 struct alc_spec *spec = codec->spec;
6321 static const hda_nid_t preferred_pairs[] = {
6322 0x21, 0x03, 0x1b, 0x03, 0x16, 0x02,
6323 0
6324 };
6325
6326 if (action != HDA_FIXUP_ACT_PRE_PROBE)
6327 return;
6328
6329 spec->gen.preferred_dacs = preferred_pairs;
6330 spec->gen.auto_mute_via_amp = 1;
6331 codec->power_save_node = 0;
6332}
6333
6334
6335static void alc289_fixup_asus_ga401(struct hda_codec *codec,
6336 const struct hda_fixup *fix, int action)
6337{
6338 static const hda_nid_t preferred_pairs[] = {
6339 0x14, 0x02, 0x17, 0x02, 0x21, 0x03, 0
6340 };
6341 struct alc_spec *spec = codec->spec;
6342
6343 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6344 spec->gen.preferred_dacs = preferred_pairs;
6345 spec->gen.obey_preferred_dacs = 1;
6346 }
6347}
6348
6349
6350static void alc285_fixup_invalidate_dacs(struct hda_codec *codec,
6351 const struct hda_fixup *fix, int action)
6352{
6353 if (action != HDA_FIXUP_ACT_PRE_PROBE)
6354 return;
6355
6356 snd_hda_override_wcaps(codec, 0x03, 0);
6357}
6358
6359static void alc_combo_jack_hp_jd_restart(struct hda_codec *codec)
6360{
6361 switch (codec->core.vendor_id) {
6362 case 0x10ec0274:
6363 case 0x10ec0294:
6364 case 0x10ec0225:
6365 case 0x10ec0295:
6366 case 0x10ec0299:
6367 alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15);
6368 alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15);
6369 break;
6370 case 0x10ec0230:
6371 case 0x10ec0235:
6372 case 0x10ec0236:
6373 case 0x10ec0255:
6374 case 0x10ec0256:
6375 alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15);
6376 alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15);
6377 break;
6378 }
6379}
6380
6381static void alc295_fixup_chromebook(struct hda_codec *codec,
6382 const struct hda_fixup *fix, int action)
6383{
6384 struct alc_spec *spec = codec->spec;
6385
6386 switch (action) {
6387 case HDA_FIXUP_ACT_PRE_PROBE:
6388 spec->ultra_low_power = true;
6389 break;
6390 case HDA_FIXUP_ACT_INIT:
6391 alc_combo_jack_hp_jd_restart(codec);
6392 break;
6393 }
6394}
6395
6396static void alc_fixup_disable_mic_vref(struct hda_codec *codec,
6397 const struct hda_fixup *fix, int action)
6398{
6399 if (action == HDA_FIXUP_ACT_PRE_PROBE)
6400 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
6401}
6402
6403
6404static void alc294_gx502_toggle_output(struct hda_codec *codec,
6405 struct hda_jack_callback *cb)
6406{
6407
6408
6409
6410 if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
6411 alc_write_coef_idx(codec, 0x10, 0x8a20);
6412 else
6413 alc_write_coef_idx(codec, 0x10, 0x0a20);
6414}
6415
6416static void alc294_fixup_gx502_hp(struct hda_codec *codec,
6417 const struct hda_fixup *fix, int action)
6418{
6419
6420 if (!is_jack_detectable(codec, 0x21))
6421 return;
6422
6423 switch (action) {
6424 case HDA_FIXUP_ACT_PRE_PROBE:
6425 snd_hda_jack_detect_enable_callback(codec, 0x21,
6426 alc294_gx502_toggle_output);
6427 break;
6428 case HDA_FIXUP_ACT_INIT:
6429
6430
6431
6432 alc294_gx502_toggle_output(codec, NULL);
6433 break;
6434 }
6435}
6436
6437static void alc294_gu502_toggle_output(struct hda_codec *codec,
6438 struct hda_jack_callback *cb)
6439{
6440
6441
6442
6443 if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
6444 alc_write_coef_idx(codec, 0x10, 0x8420);
6445 else
6446 alc_write_coef_idx(codec, 0x10, 0x0a20);
6447}
6448
6449static void alc294_fixup_gu502_hp(struct hda_codec *codec,
6450 const struct hda_fixup *fix, int action)
6451{
6452 if (!is_jack_detectable(codec, 0x21))
6453 return;
6454
6455 switch (action) {
6456 case HDA_FIXUP_ACT_PRE_PROBE:
6457 snd_hda_jack_detect_enable_callback(codec, 0x21,
6458 alc294_gu502_toggle_output);
6459 break;
6460 case HDA_FIXUP_ACT_INIT:
6461 alc294_gu502_toggle_output(codec, NULL);
6462 break;
6463 }
6464}
6465
6466static void alc285_fixup_hp_gpio_amp_init(struct hda_codec *codec,
6467 const struct hda_fixup *fix, int action)
6468{
6469 if (action != HDA_FIXUP_ACT_INIT)
6470 return;
6471
6472 msleep(100);
6473 alc_write_coef_idx(codec, 0x65, 0x0);
6474}
6475
6476static void alc274_fixup_hp_headset_mic(struct hda_codec *codec,
6477 const struct hda_fixup *fix, int action)
6478{
6479 switch (action) {
6480 case HDA_FIXUP_ACT_INIT:
6481 alc_combo_jack_hp_jd_restart(codec);
6482 break;
6483 }
6484}
6485
6486static void alc_fixup_no_int_mic(struct hda_codec *codec,
6487 const struct hda_fixup *fix, int action)
6488{
6489 struct alc_spec *spec = codec->spec;
6490
6491 switch (action) {
6492 case HDA_FIXUP_ACT_PRE_PROBE:
6493
6494 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
6495 spec->no_internal_mic_pin = true;
6496 break;
6497 case HDA_FIXUP_ACT_INIT:
6498 alc_combo_jack_hp_jd_restart(codec);
6499 break;
6500 }
6501}
6502
6503
6504
6505
6506static void alc285_fixup_hp_spectre_x360_eb1(struct hda_codec *codec,
6507 const struct hda_fixup *fix, int action)
6508{
6509 static const hda_nid_t conn[] = { 0x02 };
6510
6511 struct alc_spec *spec = codec->spec;
6512 static const struct hda_pintbl pincfgs[] = {
6513 { 0x14, 0x90170110 },
6514 { 0x17, 0x90170130 },
6515 { }
6516 };
6517
6518
6519 alc_fixup_hp_gpio_led(codec, action, 0x00, 0x04);
6520
6521 switch (action) {
6522 case HDA_FIXUP_ACT_PRE_PROBE:
6523 spec->micmute_led_polarity = 1;
6524
6525 spec->gpio_mask |= 0x01;
6526 spec->gpio_dir |= 0x01;
6527 snd_hda_apply_pincfgs(codec, pincfgs);
6528
6529 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
6530 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6531 break;
6532 case HDA_FIXUP_ACT_INIT:
6533
6534 alc_update_gpio_data(codec, 0x01, true);
6535 msleep(100);
6536 alc_update_gpio_data(codec, 0x01, false);
6537 break;
6538 }
6539}
6540
6541static void alc285_fixup_hp_spectre_x360(struct hda_codec *codec,
6542 const struct hda_fixup *fix, int action)
6543{
6544 static const hda_nid_t conn[] = { 0x02 };
6545 static const struct hda_pintbl pincfgs[] = {
6546 { 0x14, 0x90170110 },
6547 { }
6548 };
6549
6550 switch (action) {
6551 case HDA_FIXUP_ACT_PRE_PROBE:
6552 snd_hda_apply_pincfgs(codec, pincfgs);
6553
6554 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6555 break;
6556 }
6557}
6558
6559
6560#include "thinkpad_helper.c"
6561
6562static void alc_fixup_thinkpad_acpi(struct hda_codec *codec,
6563 const struct hda_fixup *fix, int action)
6564{
6565 alc_fixup_no_shutup(codec, fix, action);
6566 hda_fixup_thinkpad_acpi(codec, fix, action);
6567}
6568
6569
6570static void alc287_fixup_legion_15imhg05_speakers(struct hda_codec *codec,
6571 const struct hda_fixup *fix,
6572 int action)
6573{
6574 struct alc_spec *spec = codec->spec;
6575
6576 switch (action) {
6577 case HDA_FIXUP_ACT_PRE_PROBE:
6578 spec->gen.suppress_auto_mute = 1;
6579 break;
6580 }
6581}
6582
6583static int find_comp_by_dev_name(struct alc_spec *spec, const char *name)
6584{
6585 int i;
6586
6587 for (i = 0; i < HDA_MAX_COMPONENTS; i++) {
6588 if (strcmp(spec->comps[i].name, name) == 0)
6589 return i;
6590 }
6591
6592 return -ENODEV;
6593}
6594
6595static int comp_bind(struct device *dev)
6596{
6597 struct hda_codec *cdc = dev_to_hda_codec(dev);
6598 struct alc_spec *spec = cdc->spec;
6599
6600 return component_bind_all(dev, spec->comps);
6601}
6602
6603static void comp_unbind(struct device *dev)
6604{
6605 struct hda_codec *cdc = dev_to_hda_codec(dev);
6606 struct alc_spec *spec = cdc->spec;
6607
6608 component_unbind_all(dev, spec->comps);
6609}
6610
6611static const struct component_master_ops comp_master_ops = {
6612 .bind = comp_bind,
6613 .unbind = comp_unbind,
6614};
6615
6616static void comp_generic_playback_hook(struct hda_pcm_stream *hinfo, struct hda_codec *cdc,
6617 struct snd_pcm_substream *sub, int action)
6618{
6619 struct alc_spec *spec = cdc->spec;
6620 int i;
6621
6622 for (i = 0; i < HDA_MAX_COMPONENTS; i++) {
6623 if (spec->comps[i].dev)
6624 spec->comps[i].playback_hook(spec->comps[i].dev, action);
6625 }
6626}
6627
6628static void cs35l41_generic_fixup(struct hda_codec *cdc, int action, const char *bus,
6629 const char *hid, int count)
6630{
6631 struct device *dev = hda_codec_dev(cdc);
6632 struct alc_spec *spec = cdc->spec;
6633 char *name;
6634 int ret, i;
6635
6636 switch (action) {
6637 case HDA_FIXUP_ACT_PRE_PROBE:
6638 for (i = 0; i < count; i++) {
6639 name = devm_kasprintf(dev, GFP_KERNEL,
6640 "%s-%s:00-cs35l41-hda.%d", bus, hid, i);
6641 if (!name)
6642 return;
6643 component_match_add(dev, &spec->match, component_compare_dev_name, name);
6644 }
6645 ret = component_master_add_with_match(dev, &comp_master_ops, spec->match);
6646 if (ret)
6647 codec_err(cdc, "Fail to register component aggregator %d\n", ret);
6648 else
6649 spec->gen.pcm_playback_hook = comp_generic_playback_hook;
6650 break;
6651 }
6652}
6653
6654static void cs35l41_fixup_i2c_two(struct hda_codec *cdc, const struct hda_fixup *fix, int action)
6655{
6656 cs35l41_generic_fixup(cdc, action, "i2c", "CSC3551", 2);
6657}
6658
6659static void cs35l41_fixup_spi_two(struct hda_codec *codec, const struct hda_fixup *fix, int action)
6660{
6661 cs35l41_generic_fixup(codec, action, "spi0", "CSC3551", 2);
6662}
6663
6664static void cs35l41_fixup_spi_four(struct hda_codec *codec, const struct hda_fixup *fix, int action)
6665{
6666 cs35l41_generic_fixup(codec, action, "spi0", "CSC3551", 4);
6667}
6668
6669static void alc287_legion_16achg6_playback_hook(struct hda_pcm_stream *hinfo, struct hda_codec *cdc,
6670 struct snd_pcm_substream *sub, int action)
6671{
6672 struct alc_spec *spec = cdc->spec;
6673 unsigned int rx_slot;
6674 int i;
6675
6676 switch (action) {
6677 case HDA_GEN_PCM_ACT_PREPARE:
6678 rx_slot = 0;
6679 i = find_comp_by_dev_name(spec, "i2c-CLSA0100:00-cs35l41-hda.0");
6680 if (i >= 0)
6681 spec->comps[i].set_channel_map(spec->comps[i].dev, 0, NULL, 1, &rx_slot);
6682
6683 rx_slot = 1;
6684 i = find_comp_by_dev_name(spec, "i2c-CLSA0100:00-cs35l41-hda.1");
6685 if (i >= 0)
6686 spec->comps[i].set_channel_map(spec->comps[i].dev, 0, NULL, 1, &rx_slot);
6687 break;
6688 }
6689
6690 comp_generic_playback_hook(hinfo, cdc, sub, action);
6691}
6692
6693static void alc287_fixup_legion_16achg6_speakers(struct hda_codec *cdc, const struct hda_fixup *fix,
6694 int action)
6695{
6696 struct device *dev = hda_codec_dev(cdc);
6697 struct alc_spec *spec = cdc->spec;
6698 int ret;
6699
6700 switch (action) {
6701 case HDA_FIXUP_ACT_PRE_PROBE:
6702 component_match_add(dev, &spec->match, component_compare_dev_name,
6703 "i2c-CLSA0100:00-cs35l41-hda.0");
6704 component_match_add(dev, &spec->match, component_compare_dev_name,
6705 "i2c-CLSA0100:00-cs35l41-hda.1");
6706 ret = component_master_add_with_match(dev, &comp_master_ops, spec->match);
6707 if (ret)
6708 codec_err(cdc, "Fail to register component aggregator %d\n", ret);
6709 else
6710 spec->gen.pcm_playback_hook = alc287_legion_16achg6_playback_hook;
6711 break;
6712 }
6713}
6714
6715
6716#include "hp_x360_helper.c"
6717
6718
6719#include "ideapad_s740_helper.c"
6720
6721static const struct coef_fw alc256_fixup_set_coef_defaults_coefs[] = {
6722 WRITE_COEF(0x10, 0x0020), WRITE_COEF(0x24, 0x0000),
6723 WRITE_COEF(0x26, 0x0000), WRITE_COEF(0x29, 0x3000),
6724 WRITE_COEF(0x37, 0xfe05), WRITE_COEF(0x45, 0x5089),
6725 {}
6726};
6727
6728static void alc256_fixup_set_coef_defaults(struct hda_codec *codec,
6729 const struct hda_fixup *fix,
6730 int action)
6731{
6732
6733
6734
6735
6736
6737
6738
6739
6740 alc_process_coef_fw(codec, alc256_fixup_set_coef_defaults_coefs);
6741}
6742
6743static const struct coef_fw alc233_fixup_no_audio_jack_coefs[] = {
6744 WRITE_COEF(0x1a, 0x9003), WRITE_COEF(0x1b, 0x0e2b), WRITE_COEF(0x37, 0xfe06),
6745 WRITE_COEF(0x38, 0x4981), WRITE_COEF(0x45, 0xd489), WRITE_COEF(0x46, 0x0074),
6746 WRITE_COEF(0x49, 0x0149),
6747 {}
6748};
6749
6750static void alc233_fixup_no_audio_jack(struct hda_codec *codec,
6751 const struct hda_fixup *fix,
6752 int action)
6753{
6754
6755
6756
6757
6758
6759
6760
6761 alc_process_coef_fw(codec, alc233_fixup_no_audio_jack_coefs);
6762}
6763
6764static void alc256_fixup_mic_no_presence_and_resume(struct hda_codec *codec,
6765 const struct hda_fixup *fix,
6766 int action)
6767{
6768
6769
6770
6771
6772
6773 if (codec->core.vendor_id == 0x10ec0256) {
6774 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
6775 snd_hda_codec_set_pincfg(codec, 0x19, 0x04a11120);
6776 } else {
6777 snd_hda_codec_set_pincfg(codec, 0x1a, 0x04a1113c);
6778 }
6779}
6780
6781static void alc_fixup_dell4_mic_no_presence_quiet(struct hda_codec *codec,
6782 const struct hda_fixup *fix,
6783 int action)
6784{
6785 struct alc_spec *spec = codec->spec;
6786 struct hda_input_mux *imux = &spec->gen.input_mux;
6787 int i;
6788
6789 alc269_fixup_limit_int_mic_boost(codec, fix, action);
6790
6791 switch (action) {
6792 case HDA_FIXUP_ACT_PRE_PROBE:
6793
6794
6795
6796
6797
6798 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
6799 snd_hda_codec_set_pin_target(codec, 0x1b, PIN_VREFHIZ);
6800 break;
6801 case HDA_FIXUP_ACT_PROBE:
6802
6803
6804
6805
6806 for (i = 0; i < imux->num_items; i++) {
6807 if (spec->gen.imux_pins[i] == 0x12) {
6808 spec->gen.cur_mux[0] = i;
6809 break;
6810 }
6811 }
6812 break;
6813 }
6814}
6815
6816enum {
6817 ALC269_FIXUP_GPIO2,
6818 ALC269_FIXUP_SONY_VAIO,
6819 ALC275_FIXUP_SONY_VAIO_GPIO2,
6820 ALC269_FIXUP_DELL_M101Z,
6821 ALC269_FIXUP_SKU_IGNORE,
6822 ALC269_FIXUP_ASUS_G73JW,
6823 ALC269_FIXUP_LENOVO_EAPD,
6824 ALC275_FIXUP_SONY_HWEQ,
6825 ALC275_FIXUP_SONY_DISABLE_AAMIX,
6826 ALC271_FIXUP_DMIC,
6827 ALC269_FIXUP_PCM_44K,
6828 ALC269_FIXUP_STEREO_DMIC,
6829 ALC269_FIXUP_HEADSET_MIC,
6830 ALC269_FIXUP_QUANTA_MUTE,
6831 ALC269_FIXUP_LIFEBOOK,
6832 ALC269_FIXUP_LIFEBOOK_EXTMIC,
6833 ALC269_FIXUP_LIFEBOOK_HP_PIN,
6834 ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT,
6835 ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC,
6836 ALC269_FIXUP_AMIC,
6837 ALC269_FIXUP_DMIC,
6838 ALC269VB_FIXUP_AMIC,
6839 ALC269VB_FIXUP_DMIC,
6840 ALC269_FIXUP_HP_MUTE_LED,
6841 ALC269_FIXUP_HP_MUTE_LED_MIC1,
6842 ALC269_FIXUP_HP_MUTE_LED_MIC2,
6843 ALC269_FIXUP_HP_MUTE_LED_MIC3,
6844 ALC269_FIXUP_HP_GPIO_LED,
6845 ALC269_FIXUP_HP_GPIO_MIC1_LED,
6846 ALC269_FIXUP_HP_LINE1_MIC1_LED,
6847 ALC269_FIXUP_INV_DMIC,
6848 ALC269_FIXUP_LENOVO_DOCK,
6849 ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST,
6850 ALC269_FIXUP_NO_SHUTUP,
6851 ALC286_FIXUP_SONY_MIC_NO_PRESENCE,
6852 ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
6853 ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
6854 ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
6855 ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
6856 ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
6857 ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET,
6858 ALC269_FIXUP_HEADSET_MODE,
6859 ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
6860 ALC269_FIXUP_ASPIRE_HEADSET_MIC,
6861 ALC269_FIXUP_ASUS_X101_FUNC,
6862 ALC269_FIXUP_ASUS_X101_VERB,
6863 ALC269_FIXUP_ASUS_X101,
6864 ALC271_FIXUP_AMIC_MIC2,
6865 ALC271_FIXUP_HP_GATE_MIC_JACK,
6866 ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572,
6867 ALC269_FIXUP_ACER_AC700,
6868 ALC269_FIXUP_LIMIT_INT_MIC_BOOST,
6869 ALC269VB_FIXUP_ASUS_ZENBOOK,
6870 ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A,
6871 ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED,
6872 ALC269VB_FIXUP_ORDISSIMO_EVE2,
6873 ALC283_FIXUP_CHROME_BOOK,
6874 ALC283_FIXUP_SENSE_COMBO_JACK,
6875 ALC282_FIXUP_ASUS_TX300,
6876 ALC283_FIXUP_INT_MIC,
6877 ALC290_FIXUP_MONO_SPEAKERS,
6878 ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
6879 ALC290_FIXUP_SUBWOOFER,
6880 ALC290_FIXUP_SUBWOOFER_HSJACK,
6881 ALC269_FIXUP_THINKPAD_ACPI,
6882 ALC269_FIXUP_DMIC_THINKPAD_ACPI,
6883 ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
6884 ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
6885 ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6886 ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
6887 ALC255_FIXUP_HEADSET_MODE,
6888 ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,
6889 ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
6890 ALC292_FIXUP_TPT440_DOCK,
6891 ALC292_FIXUP_TPT440,
6892 ALC283_FIXUP_HEADSET_MIC,
6893 ALC255_FIXUP_MIC_MUTE_LED,
6894 ALC282_FIXUP_ASPIRE_V5_PINS,
6895 ALC269VB_FIXUP_ASPIRE_E1_COEF,
6896 ALC280_FIXUP_HP_GPIO4,
6897 ALC286_FIXUP_HP_GPIO_LED,
6898 ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY,
6899 ALC280_FIXUP_HP_DOCK_PINS,
6900 ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED,
6901 ALC280_FIXUP_HP_9480M,
6902 ALC245_FIXUP_HP_X360_AMP,
6903 ALC285_FIXUP_HP_SPECTRE_X360_EB1,
6904 ALC288_FIXUP_DELL_HEADSET_MODE,
6905 ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
6906 ALC288_FIXUP_DELL_XPS_13,
6907 ALC288_FIXUP_DISABLE_AAMIX,
6908 ALC292_FIXUP_DELL_E7X_AAMIX,
6909 ALC292_FIXUP_DELL_E7X,
6910 ALC292_FIXUP_DISABLE_AAMIX,
6911 ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK,
6912 ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
6913 ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
6914 ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
6915 ALC275_FIXUP_DELL_XPS,
6916 ALC293_FIXUP_LENOVO_SPK_NOISE,
6917 ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
6918 ALC255_FIXUP_DELL_SPK_NOISE,
6919 ALC225_FIXUP_DISABLE_MIC_VREF,
6920 ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
6921 ALC295_FIXUP_DISABLE_DAC3,
6922 ALC285_FIXUP_SPEAKER2_TO_DAC1,
6923 ALC280_FIXUP_HP_HEADSET_MIC,
6924 ALC221_FIXUP_HP_FRONT_MIC,
6925 ALC292_FIXUP_TPT460,
6926 ALC298_FIXUP_SPK_VOLUME,
6927 ALC298_FIXUP_LENOVO_SPK_VOLUME,
6928 ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER,
6929 ALC269_FIXUP_ATIV_BOOK_8,
6930 ALC221_FIXUP_HP_MIC_NO_PRESENCE,
6931 ALC256_FIXUP_ASUS_HEADSET_MODE,
6932 ALC256_FIXUP_ASUS_MIC,
6933 ALC256_FIXUP_ASUS_AIO_GPIO2,
6934 ALC233_FIXUP_ASUS_MIC_NO_PRESENCE,
6935 ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE,
6936 ALC233_FIXUP_LENOVO_MULTI_CODECS,
6937 ALC233_FIXUP_ACER_HEADSET_MIC,
6938 ALC294_FIXUP_LENOVO_MIC_LOCATION,
6939 ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE,
6940 ALC225_FIXUP_S3_POP_NOISE,
6941 ALC700_FIXUP_INTEL_REFERENCE,
6942 ALC274_FIXUP_DELL_BIND_DACS,
6943 ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
6944 ALC298_FIXUP_TPT470_DOCK_FIX,
6945 ALC298_FIXUP_TPT470_DOCK,
6946 ALC255_FIXUP_DUMMY_LINEOUT_VERB,
6947 ALC255_FIXUP_DELL_HEADSET_MIC,
6948 ALC256_FIXUP_HUAWEI_MACH_WX9_PINS,
6949 ALC298_FIXUP_HUAWEI_MBX_STEREO,
6950 ALC295_FIXUP_HP_X360,
6951 ALC221_FIXUP_HP_HEADSET_MIC,
6952 ALC285_FIXUP_LENOVO_HEADPHONE_NOISE,
6953 ALC295_FIXUP_HP_AUTO_MUTE,
6954 ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
6955 ALC294_FIXUP_ASUS_MIC,
6956 ALC294_FIXUP_ASUS_HEADSET_MIC,
6957 ALC294_FIXUP_ASUS_SPK,
6958 ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
6959 ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
6960 ALC255_FIXUP_ACER_HEADSET_MIC,
6961 ALC295_FIXUP_CHROME_BOOK,
6962 ALC225_FIXUP_HEADSET_JACK,
6963 ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE,
6964 ALC225_FIXUP_WYSE_AUTO_MUTE,
6965 ALC225_FIXUP_WYSE_DISABLE_MIC_VREF,
6966 ALC286_FIXUP_ACER_AIO_HEADSET_MIC,
6967 ALC256_FIXUP_ASUS_HEADSET_MIC,
6968 ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
6969 ALC299_FIXUP_PREDATOR_SPK,
6970 ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE,
6971 ALC289_FIXUP_DELL_SPK2,
6972 ALC289_FIXUP_DUAL_SPK,
6973 ALC294_FIXUP_SPK2_TO_DAC1,
6974 ALC294_FIXUP_ASUS_DUAL_SPK,
6975 ALC285_FIXUP_THINKPAD_X1_GEN7,
6976 ALC285_FIXUP_THINKPAD_HEADSET_JACK,
6977 ALC294_FIXUP_ASUS_HPE,
6978 ALC294_FIXUP_ASUS_COEF_1B,
6979 ALC294_FIXUP_ASUS_GX502_HP,
6980 ALC294_FIXUP_ASUS_GX502_PINS,
6981 ALC294_FIXUP_ASUS_GX502_VERBS,
6982 ALC294_FIXUP_ASUS_GU502_HP,
6983 ALC294_FIXUP_ASUS_GU502_PINS,
6984 ALC294_FIXUP_ASUS_GU502_VERBS,
6985 ALC285_FIXUP_HP_GPIO_LED,
6986 ALC285_FIXUP_HP_MUTE_LED,
6987 ALC236_FIXUP_HP_GPIO_LED,
6988 ALC236_FIXUP_HP_MUTE_LED,
6989 ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,
6990 ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
6991 ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
6992 ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
6993 ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS,
6994 ALC269VC_FIXUP_ACER_HEADSET_MIC,
6995 ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE,
6996 ALC289_FIXUP_ASUS_GA401,
6997 ALC289_FIXUP_ASUS_GA502,
6998 ALC256_FIXUP_ACER_MIC_NO_PRESENCE,
6999 ALC285_FIXUP_HP_GPIO_AMP_INIT,
7000 ALC269_FIXUP_CZC_B20,
7001 ALC269_FIXUP_CZC_TMI,
7002 ALC269_FIXUP_CZC_L101,
7003 ALC269_FIXUP_LEMOTE_A1802,
7004 ALC269_FIXUP_LEMOTE_A190X,
7005 ALC256_FIXUP_INTEL_NUC8_RUGGED,
7006 ALC233_FIXUP_INTEL_NUC8_DMIC,
7007 ALC233_FIXUP_INTEL_NUC8_BOOST,
7008 ALC256_FIXUP_INTEL_NUC10,
7009 ALC255_FIXUP_XIAOMI_HEADSET_MIC,
7010 ALC274_FIXUP_HP_MIC,
7011 ALC274_FIXUP_HP_HEADSET_MIC,
7012 ALC274_FIXUP_HP_ENVY_GPIO,
7013 ALC256_FIXUP_ASUS_HPE,
7014 ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
7015 ALC287_FIXUP_HP_GPIO_LED,
7016 ALC256_FIXUP_HP_HEADSET_MIC,
7017 ALC245_FIXUP_HP_GPIO_LED,
7018 ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
7019 ALC282_FIXUP_ACER_DISABLE_LINEOUT,
7020 ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST,
7021 ALC256_FIXUP_ACER_HEADSET_MIC,
7022 ALC285_FIXUP_IDEAPAD_S740_COEF,
7023 ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST,
7024 ALC295_FIXUP_ASUS_DACS,
7025 ALC295_FIXUP_HP_OMEN,
7026 ALC285_FIXUP_HP_SPECTRE_X360,
7027 ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP,
7028 ALC623_FIXUP_LENOVO_THINKSTATION_P340,
7029 ALC255_FIXUP_ACER_HEADPHONE_AND_MIC,
7030 ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST,
7031 ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS,
7032 ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,
7033 ALC287_FIXUP_YOGA7_14ITL_SPEAKERS,
7034 ALC287_FIXUP_13S_GEN2_SPEAKERS,
7035 ALC256_FIXUP_SET_COEF_DEFAULTS,
7036 ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
7037 ALC233_FIXUP_NO_AUDIO_JACK,
7038 ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME,
7039 ALC285_FIXUP_LEGION_Y9000X_SPEAKERS,
7040 ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,
7041 ALC287_FIXUP_LEGION_16ACHG6,
7042 ALC287_FIXUP_CS35L41_I2C_2,
7043 ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED,
7044 ALC245_FIXUP_CS35L41_SPI_2,
7045 ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED,
7046 ALC245_FIXUP_CS35L41_SPI_4,
7047 ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED,
7048 ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED,
7049 ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE,
7050};
7051
7052static const struct hda_fixup alc269_fixups[] = {
7053 [ALC269_FIXUP_GPIO2] = {
7054 .type = HDA_FIXUP_FUNC,
7055 .v.func = alc_fixup_gpio2,
7056 },
7057 [ALC269_FIXUP_SONY_VAIO] = {
7058 .type = HDA_FIXUP_PINCTLS,
7059 .v.pins = (const struct hda_pintbl[]) {
7060 {0x19, PIN_VREFGRD},
7061 {}
7062 }
7063 },
7064 [ALC275_FIXUP_SONY_VAIO_GPIO2] = {
7065 .type = HDA_FIXUP_FUNC,
7066 .v.func = alc275_fixup_gpio4_off,
7067 .chained = true,
7068 .chain_id = ALC269_FIXUP_SONY_VAIO
7069 },
7070 [ALC269_FIXUP_DELL_M101Z] = {
7071 .type = HDA_FIXUP_VERBS,
7072 .v.verbs = (const struct hda_verb[]) {
7073
7074 {0x20, AC_VERB_SET_COEF_INDEX, 13},
7075 {0x20, AC_VERB_SET_PROC_COEF, 0x4040},
7076 {}
7077 }
7078 },
7079 [ALC269_FIXUP_SKU_IGNORE] = {
7080 .type = HDA_FIXUP_FUNC,
7081 .v.func = alc_fixup_sku_ignore,
7082 },
7083 [ALC269_FIXUP_ASUS_G73JW] = {
7084 .type = HDA_FIXUP_PINS,
7085 .v.pins = (const struct hda_pintbl[]) {
7086 { 0x17, 0x99130111 },
7087 { }
7088 }
7089 },
7090 [ALC269_FIXUP_LENOVO_EAPD] = {
7091 .type = HDA_FIXUP_VERBS,
7092 .v.verbs = (const struct hda_verb[]) {
7093 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
7094 {}
7095 }
7096 },
7097 [ALC275_FIXUP_SONY_HWEQ] = {
7098 .type = HDA_FIXUP_FUNC,
7099 .v.func = alc269_fixup_hweq,
7100 .chained = true,
7101 .chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
7102 },
7103 [ALC275_FIXUP_SONY_DISABLE_AAMIX] = {
7104 .type = HDA_FIXUP_FUNC,
7105 .v.func = alc_fixup_disable_aamix,
7106 .chained = true,
7107 .chain_id = ALC269_FIXUP_SONY_VAIO
7108 },
7109 [ALC271_FIXUP_DMIC] = {
7110 .type = HDA_FIXUP_FUNC,
7111 .v.func = alc271_fixup_dmic,
7112 },
7113 [ALC269_FIXUP_PCM_44K] = {
7114 .type = HDA_FIXUP_FUNC,
7115 .v.func = alc269_fixup_pcm_44k,
7116 .chained = true,
7117 .chain_id = ALC269_FIXUP_QUANTA_MUTE
7118 },
7119 [ALC269_FIXUP_STEREO_DMIC] = {
7120 .type = HDA_FIXUP_FUNC,
7121 .v.func = alc269_fixup_stereo_dmic,
7122 },
7123 [ALC269_FIXUP_HEADSET_MIC] = {
7124 .type = HDA_FIXUP_FUNC,
7125 .v.func = alc269_fixup_headset_mic,
7126 },
7127 [ALC269_FIXUP_QUANTA_MUTE] = {
7128 .type = HDA_FIXUP_FUNC,
7129 .v.func = alc269_fixup_quanta_mute,
7130 },
7131 [ALC269_FIXUP_LIFEBOOK] = {
7132 .type = HDA_FIXUP_PINS,
7133 .v.pins = (const struct hda_pintbl[]) {
7134 { 0x1a, 0x2101103f },
7135 { 0x1b, 0x23a11040 },
7136 { }
7137 },
7138 .chained = true,
7139 .chain_id = ALC269_FIXUP_QUANTA_MUTE
7140 },
7141 [ALC269_FIXUP_LIFEBOOK_EXTMIC] = {
7142 .type = HDA_FIXUP_PINS,
7143 .v.pins = (const struct hda_pintbl[]) {
7144 { 0x19, 0x01a1903c },
7145 { }
7146 },
7147 },
7148 [ALC269_FIXUP_LIFEBOOK_HP_PIN] = {
7149 .type = HDA_FIXUP_PINS,
7150 .v.pins = (const struct hda_pintbl[]) {
7151 { 0x21, 0x0221102f },
7152 { }
7153 },
7154 },
7155 [ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT] = {
7156 .type = HDA_FIXUP_FUNC,
7157 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
7158 },
7159 [ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC] = {
7160 .type = HDA_FIXUP_FUNC,
7161 .v.func = alc269_fixup_pincfg_U7x7_headset_mic,
7162 },
7163 [ALC269_FIXUP_AMIC] = {
7164 .type = HDA_FIXUP_PINS,
7165 .v.pins = (const struct hda_pintbl[]) {
7166 { 0x14, 0x99130110 },
7167 { 0x15, 0x0121401f },
7168 { 0x18, 0x01a19c20 },
7169 { 0x19, 0x99a3092f },
7170 { }
7171 },
7172 },
7173 [ALC269_FIXUP_DMIC] = {
7174 .type = HDA_FIXUP_PINS,
7175 .v.pins = (const struct hda_pintbl[]) {
7176 { 0x12, 0x99a3092f },
7177 { 0x14, 0x99130110 },
7178 { 0x15, 0x0121401f },
7179 { 0x18, 0x01a19c20 },
7180 { }
7181 },
7182 },
7183 [ALC269VB_FIXUP_AMIC] = {
7184 .type = HDA_FIXUP_PINS,
7185 .v.pins = (const struct hda_pintbl[]) {
7186 { 0x14, 0x99130110 },
7187 { 0x18, 0x01a19c20 },
7188 { 0x19, 0x99a3092f },
7189 { 0x21, 0x0121401f },
7190 { }
7191 },
7192 },
7193 [ALC269VB_FIXUP_DMIC] = {
7194 .type = HDA_FIXUP_PINS,
7195 .v.pins = (const struct hda_pintbl[]) {
7196 { 0x12, 0x99a3092f },
7197 { 0x14, 0x99130110 },
7198 { 0x18, 0x01a19c20 },
7199 { 0x21, 0x0121401f },
7200 { }
7201 },
7202 },
7203 [ALC269_FIXUP_HP_MUTE_LED] = {
7204 .type = HDA_FIXUP_FUNC,
7205 .v.func = alc269_fixup_hp_mute_led,
7206 },
7207 [ALC269_FIXUP_HP_MUTE_LED_MIC1] = {
7208 .type = HDA_FIXUP_FUNC,
7209 .v.func = alc269_fixup_hp_mute_led_mic1,
7210 },
7211 [ALC269_FIXUP_HP_MUTE_LED_MIC2] = {
7212 .type = HDA_FIXUP_FUNC,
7213 .v.func = alc269_fixup_hp_mute_led_mic2,
7214 },
7215 [ALC269_FIXUP_HP_MUTE_LED_MIC3] = {
7216 .type = HDA_FIXUP_FUNC,
7217 .v.func = alc269_fixup_hp_mute_led_mic3,
7218 .chained = true,
7219 .chain_id = ALC295_FIXUP_HP_AUTO_MUTE
7220 },
7221 [ALC269_FIXUP_HP_GPIO_LED] = {
7222 .type = HDA_FIXUP_FUNC,
7223 .v.func = alc269_fixup_hp_gpio_led,
7224 },
7225 [ALC269_FIXUP_HP_GPIO_MIC1_LED] = {
7226 .type = HDA_FIXUP_FUNC,
7227 .v.func = alc269_fixup_hp_gpio_mic1_led,
7228 },
7229 [ALC269_FIXUP_HP_LINE1_MIC1_LED] = {
7230 .type = HDA_FIXUP_FUNC,
7231 .v.func = alc269_fixup_hp_line1_mic1_led,
7232 },
7233 [ALC269_FIXUP_INV_DMIC] = {
7234 .type = HDA_FIXUP_FUNC,
7235 .v.func = alc_fixup_inv_dmic,
7236 },
7237 [ALC269_FIXUP_NO_SHUTUP] = {
7238 .type = HDA_FIXUP_FUNC,
7239 .v.func = alc_fixup_no_shutup,
7240 },
7241 [ALC269_FIXUP_LENOVO_DOCK] = {
7242 .type = HDA_FIXUP_PINS,
7243 .v.pins = (const struct hda_pintbl[]) {
7244 { 0x19, 0x23a11040 },
7245 { 0x1b, 0x2121103f },
7246 { }
7247 },
7248 .chained = true,
7249 .chain_id = ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT
7250 },
7251 [ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST] = {
7252 .type = HDA_FIXUP_FUNC,
7253 .v.func = alc269_fixup_limit_int_mic_boost,
7254 .chained = true,
7255 .chain_id = ALC269_FIXUP_LENOVO_DOCK,
7256 },
7257 [ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT] = {
7258 .type = HDA_FIXUP_FUNC,
7259 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
7260 .chained = true,
7261 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
7262 },
7263 [ALC269_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7264 .type = HDA_FIXUP_PINS,
7265 .v.pins = (const struct hda_pintbl[]) {
7266 { 0x19, 0x01a1913c },
7267 { 0x1a, 0x01a1913d },
7268 { }
7269 },
7270 .chained = true,
7271 .chain_id = ALC269_FIXUP_HEADSET_MODE
7272 },
7273 [ALC269_FIXUP_DELL2_MIC_NO_PRESENCE] = {
7274 .type = HDA_FIXUP_PINS,
7275 .v.pins = (const struct hda_pintbl[]) {
7276 { 0x16, 0x21014020 },
7277 { 0x19, 0x21a19030 },
7278 { 0x1a, 0x01a1913c },
7279 { }
7280 },
7281 .chained = true,
7282 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7283 },
7284 [ALC269_FIXUP_DELL3_MIC_NO_PRESENCE] = {
7285 .type = HDA_FIXUP_PINS,
7286 .v.pins = (const struct hda_pintbl[]) {
7287 { 0x1a, 0x01a1913c },
7288 { }
7289 },
7290 .chained = true,
7291 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7292 },
7293 [ALC269_FIXUP_DELL4_MIC_NO_PRESENCE] = {
7294 .type = HDA_FIXUP_PINS,
7295 .v.pins = (const struct hda_pintbl[]) {
7296 { 0x19, 0x01a1913c },
7297 { 0x1b, 0x01a1913d },
7298 { }
7299 },
7300 .chained = true,
7301 .chain_id = ALC269_FIXUP_HEADSET_MODE
7302 },
7303 [ALC269_FIXUP_HEADSET_MODE] = {
7304 .type = HDA_FIXUP_FUNC,
7305 .v.func = alc_fixup_headset_mode,
7306 .chained = true,
7307 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
7308 },
7309 [ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
7310 .type = HDA_FIXUP_FUNC,
7311 .v.func = alc_fixup_headset_mode_no_hp_mic,
7312 },
7313 [ALC269_FIXUP_ASPIRE_HEADSET_MIC] = {
7314 .type = HDA_FIXUP_PINS,
7315 .v.pins = (const struct hda_pintbl[]) {
7316 { 0x19, 0x01a1913c },
7317 { }
7318 },
7319 .chained = true,
7320 .chain_id = ALC269_FIXUP_HEADSET_MODE,
7321 },
7322 [ALC286_FIXUP_SONY_MIC_NO_PRESENCE] = {
7323 .type = HDA_FIXUP_PINS,
7324 .v.pins = (const struct hda_pintbl[]) {
7325 { 0x18, 0x01a1913c },
7326 { }
7327 },
7328 .chained = true,
7329 .chain_id = ALC269_FIXUP_HEADSET_MIC
7330 },
7331 [ALC256_FIXUP_HUAWEI_MACH_WX9_PINS] = {
7332 .type = HDA_FIXUP_PINS,
7333 .v.pins = (const struct hda_pintbl[]) {
7334 {0x12, 0x90a60130},
7335 {0x13, 0x40000000},
7336 {0x14, 0x90170110},
7337 {0x18, 0x411111f0},
7338 {0x19, 0x04a11040},
7339 {0x1a, 0x411111f0},
7340 {0x1b, 0x90170112},
7341 {0x1d, 0x40759a05},
7342 {0x1e, 0x411111f0},
7343 {0x21, 0x04211020},
7344 { }
7345 },
7346 .chained = true,
7347 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
7348 },
7349 [ALC298_FIXUP_HUAWEI_MBX_STEREO] = {
7350 .type = HDA_FIXUP_FUNC,
7351 .v.func = alc298_fixup_huawei_mbx_stereo,
7352 .chained = true,
7353 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
7354 },
7355 [ALC269_FIXUP_ASUS_X101_FUNC] = {
7356 .type = HDA_FIXUP_FUNC,
7357 .v.func = alc269_fixup_x101_headset_mic,
7358 },
7359 [ALC269_FIXUP_ASUS_X101_VERB] = {
7360 .type = HDA_FIXUP_VERBS,
7361 .v.verbs = (const struct hda_verb[]) {
7362 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
7363 {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
7364 {0x20, AC_VERB_SET_PROC_COEF, 0x0310},
7365 { }
7366 },
7367 .chained = true,
7368 .chain_id = ALC269_FIXUP_ASUS_X101_FUNC
7369 },
7370 [ALC269_FIXUP_ASUS_X101] = {
7371 .type = HDA_FIXUP_PINS,
7372 .v.pins = (const struct hda_pintbl[]) {
7373 { 0x18, 0x04a1182c },
7374 { }
7375 },
7376 .chained = true,
7377 .chain_id = ALC269_FIXUP_ASUS_X101_VERB
7378 },
7379 [ALC271_FIXUP_AMIC_MIC2] = {
7380 .type = HDA_FIXUP_PINS,
7381 .v.pins = (const struct hda_pintbl[]) {
7382 { 0x14, 0x99130110 },
7383 { 0x19, 0x01a19c20 },
7384 { 0x1b, 0x99a7012f },
7385 { 0x21, 0x0121401f },
7386 { }
7387 },
7388 },
7389 [ALC271_FIXUP_HP_GATE_MIC_JACK] = {
7390 .type = HDA_FIXUP_FUNC,
7391 .v.func = alc271_hp_gate_mic_jack,
7392 .chained = true,
7393 .chain_id = ALC271_FIXUP_AMIC_MIC2,
7394 },
7395 [ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572] = {
7396 .type = HDA_FIXUP_FUNC,
7397 .v.func = alc269_fixup_limit_int_mic_boost,
7398 .chained = true,
7399 .chain_id = ALC271_FIXUP_HP_GATE_MIC_JACK,
7400 },
7401 [ALC269_FIXUP_ACER_AC700] = {
7402 .type = HDA_FIXUP_PINS,
7403 .v.pins = (const struct hda_pintbl[]) {
7404 { 0x12, 0x99a3092f },
7405 { 0x14, 0x99130110 },
7406 { 0x18, 0x03a11c20 },
7407 { 0x1e, 0x0346101e },
7408 { 0x21, 0x0321101f },
7409 { }
7410 },
7411 .chained = true,
7412 .chain_id = ALC271_FIXUP_DMIC,
7413 },
7414 [ALC269_FIXUP_LIMIT_INT_MIC_BOOST] = {
7415 .type = HDA_FIXUP_FUNC,
7416 .v.func = alc269_fixup_limit_int_mic_boost,
7417 .chained = true,
7418 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
7419 },
7420 [ALC269VB_FIXUP_ASUS_ZENBOOK] = {
7421 .type = HDA_FIXUP_FUNC,
7422 .v.func = alc269_fixup_limit_int_mic_boost,
7423 .chained = true,
7424 .chain_id = ALC269VB_FIXUP_DMIC,
7425 },
7426 [ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A] = {
7427 .type = HDA_FIXUP_VERBS,
7428 .v.verbs = (const struct hda_verb[]) {
7429
7430 { 0x20, AC_VERB_SET_COEF_INDEX, 0x12 },
7431 { 0x20, AC_VERB_SET_PROC_COEF, 0x2800 },
7432 {}
7433 },
7434 .chained = true,
7435 .chain_id = ALC269VB_FIXUP_ASUS_ZENBOOK,
7436 },
7437 [ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED] = {
7438 .type = HDA_FIXUP_FUNC,
7439 .v.func = alc269_fixup_limit_int_mic_boost,
7440 .chained = true,
7441 .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC1,
7442 },
7443 [ALC269VB_FIXUP_ORDISSIMO_EVE2] = {
7444 .type = HDA_FIXUP_PINS,
7445 .v.pins = (const struct hda_pintbl[]) {
7446 { 0x12, 0x99a3092f },
7447 { 0x18, 0x03a11d20 },
7448 { 0x19, 0x411111f0 },
7449 { }
7450 },
7451 },
7452 [ALC283_FIXUP_CHROME_BOOK] = {
7453 .type = HDA_FIXUP_FUNC,
7454 .v.func = alc283_fixup_chromebook,
7455 },
7456 [ALC283_FIXUP_SENSE_COMBO_JACK] = {
7457 .type = HDA_FIXUP_FUNC,
7458 .v.func = alc283_fixup_sense_combo_jack,
7459 .chained = true,
7460 .chain_id = ALC283_FIXUP_CHROME_BOOK,
7461 },
7462 [ALC282_FIXUP_ASUS_TX300] = {
7463 .type = HDA_FIXUP_FUNC,
7464 .v.func = alc282_fixup_asus_tx300,
7465 },
7466 [ALC283_FIXUP_INT_MIC] = {
7467 .type = HDA_FIXUP_VERBS,
7468 .v.verbs = (const struct hda_verb[]) {
7469 {0x20, AC_VERB_SET_COEF_INDEX, 0x1a},
7470 {0x20, AC_VERB_SET_PROC_COEF, 0x0011},
7471 { }
7472 },
7473 .chained = true,
7474 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
7475 },
7476 [ALC290_FIXUP_SUBWOOFER_HSJACK] = {
7477 .type = HDA_FIXUP_PINS,
7478 .v.pins = (const struct hda_pintbl[]) {
7479 { 0x17, 0x90170112 },
7480 { }
7481 },
7482 .chained = true,
7483 .chain_id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
7484 },
7485 [ALC290_FIXUP_SUBWOOFER] = {
7486 .type = HDA_FIXUP_PINS,
7487 .v.pins = (const struct hda_pintbl[]) {
7488 { 0x17, 0x90170112 },
7489 { }
7490 },
7491 .chained = true,
7492 .chain_id = ALC290_FIXUP_MONO_SPEAKERS,
7493 },
7494 [ALC290_FIXUP_MONO_SPEAKERS] = {
7495 .type = HDA_FIXUP_FUNC,
7496 .v.func = alc290_fixup_mono_speakers,
7497 },
7498 [ALC290_FIXUP_MONO_SPEAKERS_HSJACK] = {
7499 .type = HDA_FIXUP_FUNC,
7500 .v.func = alc290_fixup_mono_speakers,
7501 .chained = true,
7502 .chain_id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
7503 },
7504 [ALC269_FIXUP_THINKPAD_ACPI] = {
7505 .type = HDA_FIXUP_FUNC,
7506 .v.func = alc_fixup_thinkpad_acpi,
7507 .chained = true,
7508 .chain_id = ALC269_FIXUP_SKU_IGNORE,
7509 },
7510 [ALC269_FIXUP_DMIC_THINKPAD_ACPI] = {
7511 .type = HDA_FIXUP_FUNC,
7512 .v.func = alc_fixup_inv_dmic,
7513 .chained = true,
7514 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
7515 },
7516 [ALC255_FIXUP_ACER_MIC_NO_PRESENCE] = {
7517 .type = HDA_FIXUP_PINS,
7518 .v.pins = (const struct hda_pintbl[]) {
7519 { 0x19, 0x01a1913c },
7520 { }
7521 },
7522 .chained = true,
7523 .chain_id = ALC255_FIXUP_HEADSET_MODE
7524 },
7525 [ALC255_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7526 .type = HDA_FIXUP_PINS,
7527 .v.pins = (const struct hda_pintbl[]) {
7528 { 0x19, 0x01a1913c },
7529 { }
7530 },
7531 .chained = true,
7532 .chain_id = ALC255_FIXUP_HEADSET_MODE
7533 },
7534 [ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7535 .type = HDA_FIXUP_PINS,
7536 .v.pins = (const struct hda_pintbl[]) {
7537 { 0x19, 0x01a1913c },
7538 { 0x1a, 0x01a1913d },
7539 { }
7540 },
7541 .chained = true,
7542 .chain_id = ALC255_FIXUP_HEADSET_MODE
7543 },
7544 [ALC255_FIXUP_DELL2_MIC_NO_PRESENCE] = {
7545 .type = HDA_FIXUP_PINS,
7546 .v.pins = (const struct hda_pintbl[]) {
7547 { 0x19, 0x01a1913c },
7548 { }
7549 },
7550 .chained = true,
7551 .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
7552 },
7553 [ALC255_FIXUP_HEADSET_MODE] = {
7554 .type = HDA_FIXUP_FUNC,
7555 .v.func = alc_fixup_headset_mode_alc255,
7556 .chained = true,
7557 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
7558 },
7559 [ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
7560 .type = HDA_FIXUP_FUNC,
7561 .v.func = alc_fixup_headset_mode_alc255_no_hp_mic,
7562 },
7563 [ALC293_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7564 .type = HDA_FIXUP_PINS,
7565 .v.pins = (const struct hda_pintbl[]) {
7566 { 0x18, 0x01a1913d },
7567 { 0x1a, 0x01a1913c },
7568 { }
7569 },
7570 .chained = true,
7571 .chain_id = ALC269_FIXUP_HEADSET_MODE
7572 },
7573 [ALC292_FIXUP_TPT440_DOCK] = {
7574 .type = HDA_FIXUP_FUNC,
7575 .v.func = alc_fixup_tpt440_dock,
7576 .chained = true,
7577 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
7578 },
7579 [ALC292_FIXUP_TPT440] = {
7580 .type = HDA_FIXUP_FUNC,
7581 .v.func = alc_fixup_disable_aamix,
7582 .chained = true,
7583 .chain_id = ALC292_FIXUP_TPT440_DOCK,
7584 },
7585 [ALC283_FIXUP_HEADSET_MIC] = {
7586 .type = HDA_FIXUP_PINS,
7587 .v.pins = (const struct hda_pintbl[]) {
7588 { 0x19, 0x04a110f0 },
7589 { },
7590 },
7591 },
7592 [ALC255_FIXUP_MIC_MUTE_LED] = {
7593 .type = HDA_FIXUP_FUNC,
7594 .v.func = alc_fixup_micmute_led,
7595 },
7596 [ALC282_FIXUP_ASPIRE_V5_PINS] = {
7597 .type = HDA_FIXUP_PINS,
7598 .v.pins = (const struct hda_pintbl[]) {
7599 { 0x12, 0x90a60130 },
7600 { 0x14, 0x90170110 },
7601 { 0x17, 0x40000008 },
7602 { 0x18, 0x411111f0 },
7603 { 0x19, 0x01a1913c },
7604 { 0x1a, 0x411111f0 },
7605 { 0x1b, 0x411111f0 },
7606 { 0x1d, 0x40f89b2d },
7607 { 0x1e, 0x411111f0 },
7608 { 0x21, 0x0321101f },
7609 { },
7610 },
7611 },
7612 [ALC269VB_FIXUP_ASPIRE_E1_COEF] = {
7613 .type = HDA_FIXUP_FUNC,
7614 .v.func = alc269vb_fixup_aspire_e1_coef,
7615 },
7616 [ALC280_FIXUP_HP_GPIO4] = {
7617 .type = HDA_FIXUP_FUNC,
7618 .v.func = alc280_fixup_hp_gpio4,
7619 },
7620 [ALC286_FIXUP_HP_GPIO_LED] = {
7621 .type = HDA_FIXUP_FUNC,
7622 .v.func = alc286_fixup_hp_gpio_led,
7623 },
7624 [ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY] = {
7625 .type = HDA_FIXUP_FUNC,
7626 .v.func = alc280_fixup_hp_gpio2_mic_hotkey,
7627 },
7628 [ALC280_FIXUP_HP_DOCK_PINS] = {
7629 .type = HDA_FIXUP_PINS,
7630 .v.pins = (const struct hda_pintbl[]) {
7631 { 0x1b, 0x21011020 },
7632 { 0x1a, 0x01a1903c },
7633 { 0x18, 0x2181103f },
7634 { },
7635 },
7636 .chained = true,
7637 .chain_id = ALC280_FIXUP_HP_GPIO4
7638 },
7639 [ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED] = {
7640 .type = HDA_FIXUP_PINS,
7641 .v.pins = (const struct hda_pintbl[]) {
7642 { 0x1b, 0x21011020 },
7643 { 0x18, 0x2181103f },
7644 { },
7645 },
7646 .chained = true,
7647 .chain_id = ALC269_FIXUP_HP_GPIO_MIC1_LED
7648 },
7649 [ALC280_FIXUP_HP_9480M] = {
7650 .type = HDA_FIXUP_FUNC,
7651 .v.func = alc280_fixup_hp_9480m,
7652 },
7653 [ALC245_FIXUP_HP_X360_AMP] = {
7654 .type = HDA_FIXUP_FUNC,
7655 .v.func = alc245_fixup_hp_x360_amp,
7656 .chained = true,
7657 .chain_id = ALC245_FIXUP_HP_GPIO_LED
7658 },
7659 [ALC288_FIXUP_DELL_HEADSET_MODE] = {
7660 .type = HDA_FIXUP_FUNC,
7661 .v.func = alc_fixup_headset_mode_dell_alc288,
7662 .chained = true,
7663 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
7664 },
7665 [ALC288_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7666 .type = HDA_FIXUP_PINS,
7667 .v.pins = (const struct hda_pintbl[]) {
7668 { 0x18, 0x01a1913c },
7669 { 0x1a, 0x01a1913d },
7670 { }
7671 },
7672 .chained = true,
7673 .chain_id = ALC288_FIXUP_DELL_HEADSET_MODE
7674 },
7675 [ALC288_FIXUP_DISABLE_AAMIX] = {
7676 .type = HDA_FIXUP_FUNC,
7677 .v.func = alc_fixup_disable_aamix,
7678 .chained = true,
7679 .chain_id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE
7680 },
7681 [ALC288_FIXUP_DELL_XPS_13] = {
7682 .type = HDA_FIXUP_FUNC,
7683 .v.func = alc_fixup_dell_xps13,
7684 .chained = true,
7685 .chain_id = ALC288_FIXUP_DISABLE_AAMIX
7686 },
7687 [ALC292_FIXUP_DISABLE_AAMIX] = {
7688 .type = HDA_FIXUP_FUNC,
7689 .v.func = alc_fixup_disable_aamix,
7690 .chained = true,
7691 .chain_id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE
7692 },
7693 [ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK] = {
7694 .type = HDA_FIXUP_FUNC,
7695 .v.func = alc_fixup_disable_aamix,
7696 .chained = true,
7697 .chain_id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE
7698 },
7699 [ALC292_FIXUP_DELL_E7X_AAMIX] = {
7700 .type = HDA_FIXUP_FUNC,
7701 .v.func = alc_fixup_dell_xps13,
7702 .chained = true,
7703 .chain_id = ALC292_FIXUP_DISABLE_AAMIX
7704 },
7705 [ALC292_FIXUP_DELL_E7X] = {
7706 .type = HDA_FIXUP_FUNC,
7707 .v.func = alc_fixup_micmute_led,
7708
7709 .chained_before = true,
7710 .chain_id = ALC292_FIXUP_DELL_E7X_AAMIX,
7711 },
7712 [ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE] = {
7713 .type = HDA_FIXUP_PINS,
7714 .v.pins = (const struct hda_pintbl[]) {
7715 { 0x18, 0x01a1913c },
7716 { }
7717 },
7718 .chained_before = true,
7719 .chain_id = ALC269_FIXUP_HEADSET_MODE,
7720 },
7721 [ALC298_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7722 .type = HDA_FIXUP_PINS,
7723 .v.pins = (const struct hda_pintbl[]) {
7724 { 0x18, 0x01a1913c },
7725 { 0x1a, 0x01a1913d },
7726 { }
7727 },
7728 .chained = true,
7729 .chain_id = ALC269_FIXUP_HEADSET_MODE
7730 },
7731 [ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE] = {
7732 .type = HDA_FIXUP_PINS,
7733 .v.pins = (const struct hda_pintbl[]) {
7734 { 0x18, 0x01a1913c },
7735 { }
7736 },
7737 .chained = true,
7738 .chain_id = ALC269_FIXUP_HEADSET_MODE
7739 },
7740 [ALC275_FIXUP_DELL_XPS] = {
7741 .type = HDA_FIXUP_VERBS,
7742 .v.verbs = (const struct hda_verb[]) {
7743
7744 {0x20, AC_VERB_SET_COEF_INDEX, 0x1f},
7745 {0x20, AC_VERB_SET_PROC_COEF, 0x00c0},
7746 {0x20, AC_VERB_SET_COEF_INDEX, 0x30},
7747 {0x20, AC_VERB_SET_PROC_COEF, 0x00b1},
7748 {}
7749 }
7750 },
7751 [ALC293_FIXUP_LENOVO_SPK_NOISE] = {
7752 .type = HDA_FIXUP_FUNC,
7753 .v.func = alc_fixup_disable_aamix,
7754 .chained = true,
7755 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
7756 },
7757 [ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY] = {
7758 .type = HDA_FIXUP_FUNC,
7759 .v.func = alc233_fixup_lenovo_line2_mic_hotkey,
7760 },
7761 [ALC233_FIXUP_INTEL_NUC8_DMIC] = {
7762 .type = HDA_FIXUP_FUNC,
7763 .v.func = alc_fixup_inv_dmic,
7764 .chained = true,
7765 .chain_id = ALC233_FIXUP_INTEL_NUC8_BOOST,
7766 },
7767 [ALC233_FIXUP_INTEL_NUC8_BOOST] = {
7768 .type = HDA_FIXUP_FUNC,
7769 .v.func = alc269_fixup_limit_int_mic_boost
7770 },
7771 [ALC255_FIXUP_DELL_SPK_NOISE] = {
7772 .type = HDA_FIXUP_FUNC,
7773 .v.func = alc_fixup_disable_aamix,
7774 .chained = true,
7775 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
7776 },
7777 [ALC225_FIXUP_DISABLE_MIC_VREF] = {
7778 .type = HDA_FIXUP_FUNC,
7779 .v.func = alc_fixup_disable_mic_vref,
7780 .chained = true,
7781 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
7782 },
7783 [ALC225_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7784 .type = HDA_FIXUP_VERBS,
7785 .v.verbs = (const struct hda_verb[]) {
7786
7787 { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
7788 { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
7789 {}
7790 },
7791 .chained = true,
7792 .chain_id = ALC225_FIXUP_DISABLE_MIC_VREF
7793 },
7794 [ALC280_FIXUP_HP_HEADSET_MIC] = {
7795 .type = HDA_FIXUP_FUNC,
7796 .v.func = alc_fixup_disable_aamix,
7797 .chained = true,
7798 .chain_id = ALC269_FIXUP_HEADSET_MIC,
7799 },
7800 [ALC221_FIXUP_HP_FRONT_MIC] = {
7801 .type = HDA_FIXUP_PINS,
7802 .v.pins = (const struct hda_pintbl[]) {
7803 { 0x19, 0x02a19020 },
7804 { }
7805 },
7806 },
7807 [ALC292_FIXUP_TPT460] = {
7808 .type = HDA_FIXUP_FUNC,
7809 .v.func = alc_fixup_tpt440_dock,
7810 .chained = true,
7811 .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE,
7812 },
7813 [ALC298_FIXUP_SPK_VOLUME] = {
7814 .type = HDA_FIXUP_FUNC,
7815 .v.func = alc298_fixup_speaker_volume,
7816 .chained = true,
7817 .chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
7818 },
7819 [ALC298_FIXUP_LENOVO_SPK_VOLUME] = {
7820 .type = HDA_FIXUP_FUNC,
7821 .v.func = alc298_fixup_speaker_volume,
7822 },
7823 [ALC295_FIXUP_DISABLE_DAC3] = {
7824 .type = HDA_FIXUP_FUNC,
7825 .v.func = alc295_fixup_disable_dac3,
7826 },
7827 [ALC285_FIXUP_SPEAKER2_TO_DAC1] = {
7828 .type = HDA_FIXUP_FUNC,
7829 .v.func = alc285_fixup_speaker2_to_dac1,
7830 .chained = true,
7831 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
7832 },
7833 [ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {
7834 .type = HDA_FIXUP_PINS,
7835 .v.pins = (const struct hda_pintbl[]) {
7836 { 0x1b, 0x90170151 },
7837 { }
7838 },
7839 .chained = true,
7840 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
7841 },
7842 [ALC269_FIXUP_ATIV_BOOK_8] = {
7843 .type = HDA_FIXUP_FUNC,
7844 .v.func = alc_fixup_auto_mute_via_amp,
7845 .chained = true,
7846 .chain_id = ALC269_FIXUP_NO_SHUTUP
7847 },
7848 [ALC221_FIXUP_HP_MIC_NO_PRESENCE] = {
7849 .type = HDA_FIXUP_PINS,
7850 .v.pins = (const struct hda_pintbl[]) {
7851 { 0x18, 0x01a1913c },
7852 { 0x1a, 0x01a1913d },
7853 { }
7854 },
7855 .chained = true,
7856 .chain_id = ALC269_FIXUP_HEADSET_MODE
7857 },
7858 [ALC256_FIXUP_ASUS_HEADSET_MODE] = {
7859 .type = HDA_FIXUP_FUNC,
7860 .v.func = alc_fixup_headset_mode,
7861 },
7862 [ALC256_FIXUP_ASUS_MIC] = {
7863 .type = HDA_FIXUP_PINS,
7864 .v.pins = (const struct hda_pintbl[]) {
7865 { 0x13, 0x90a60160 },
7866 { 0x19, 0x04a11120 },
7867 { }
7868 },
7869 .chained = true,
7870 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7871 },
7872 [ALC256_FIXUP_ASUS_AIO_GPIO2] = {
7873 .type = HDA_FIXUP_FUNC,
7874
7875 .v.func = alc_fixup_gpio4,
7876 },
7877 [ALC233_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7878 .type = HDA_FIXUP_PINS,
7879 .v.pins = (const struct hda_pintbl[]) {
7880 { 0x19, 0x01a1913c },
7881 { }
7882 },
7883 .chained = true,
7884 .chain_id = ALC269_FIXUP_HEADSET_MIC
7885 },
7886 [ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE] = {
7887 .type = HDA_FIXUP_VERBS,
7888 .v.verbs = (const struct hda_verb[]) {
7889
7890 {0x20, AC_VERB_SET_COEF_INDEX, 0x40},
7891 {0x20, AC_VERB_SET_PROC_COEF, 0x8800},
7892 {}
7893 },
7894 .chained = true,
7895 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
7896 },
7897 [ALC233_FIXUP_LENOVO_MULTI_CODECS] = {
7898 .type = HDA_FIXUP_FUNC,
7899 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
7900 .chained = true,
7901 .chain_id = ALC269_FIXUP_GPIO2
7902 },
7903 [ALC233_FIXUP_ACER_HEADSET_MIC] = {
7904 .type = HDA_FIXUP_VERBS,
7905 .v.verbs = (const struct hda_verb[]) {
7906 { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
7907 { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
7908 { }
7909 },
7910 .chained = true,
7911 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
7912 },
7913 [ALC294_FIXUP_LENOVO_MIC_LOCATION] = {
7914 .type = HDA_FIXUP_PINS,
7915 .v.pins = (const struct hda_pintbl[]) {
7916
7917
7918
7919
7920
7921 { 0x1a, 0x04a19040 },
7922 { }
7923 },
7924 },
7925 [ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE] = {
7926 .type = HDA_FIXUP_PINS,
7927 .v.pins = (const struct hda_pintbl[]) {
7928 { 0x16, 0x0101102f },
7929 { 0x19, 0x02a1913c },
7930 { 0x1a, 0x01a19030 },
7931 { 0x1b, 0x02011020 },
7932 { }
7933 },
7934 .chained = true,
7935 .chain_id = ALC225_FIXUP_S3_POP_NOISE
7936 },
7937 [ALC225_FIXUP_S3_POP_NOISE] = {
7938 .type = HDA_FIXUP_FUNC,
7939 .v.func = alc225_fixup_s3_pop_noise,
7940 .chained = true,
7941 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7942 },
7943 [ALC700_FIXUP_INTEL_REFERENCE] = {
7944 .type = HDA_FIXUP_VERBS,
7945 .v.verbs = (const struct hda_verb[]) {
7946
7947 {0x20, AC_VERB_SET_COEF_INDEX, 0x45},
7948 {0x20, AC_VERB_SET_PROC_COEF, 0x5289},
7949 {0x20, AC_VERB_SET_COEF_INDEX, 0x4A},
7950 {0x20, AC_VERB_SET_PROC_COEF, 0x001b},
7951 {0x58, AC_VERB_SET_COEF_INDEX, 0x00},
7952 {0x58, AC_VERB_SET_PROC_COEF, 0x3888},
7953 {0x20, AC_VERB_SET_COEF_INDEX, 0x6f},
7954 {0x20, AC_VERB_SET_PROC_COEF, 0x2c0b},
7955 {}
7956 }
7957 },
7958 [ALC274_FIXUP_DELL_BIND_DACS] = {
7959 .type = HDA_FIXUP_FUNC,
7960 .v.func = alc274_fixup_bind_dacs,
7961 .chained = true,
7962 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
7963 },
7964 [ALC274_FIXUP_DELL_AIO_LINEOUT_VERB] = {
7965 .type = HDA_FIXUP_PINS,
7966 .v.pins = (const struct hda_pintbl[]) {
7967 { 0x1b, 0x0401102f },
7968 { }
7969 },
7970 .chained = true,
7971 .chain_id = ALC274_FIXUP_DELL_BIND_DACS
7972 },
7973 [ALC298_FIXUP_TPT470_DOCK_FIX] = {
7974 .type = HDA_FIXUP_FUNC,
7975 .v.func = alc_fixup_tpt470_dock,
7976 .chained = true,
7977 .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE
7978 },
7979 [ALC298_FIXUP_TPT470_DOCK] = {
7980 .type = HDA_FIXUP_FUNC,
7981 .v.func = alc_fixup_tpt470_dacs,
7982 .chained = true,
7983 .chain_id = ALC298_FIXUP_TPT470_DOCK_FIX
7984 },
7985 [ALC255_FIXUP_DUMMY_LINEOUT_VERB] = {
7986 .type = HDA_FIXUP_PINS,
7987 .v.pins = (const struct hda_pintbl[]) {
7988 { 0x14, 0x0201101f },
7989 { }
7990 },
7991 .chained = true,
7992 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
7993 },
7994 [ALC255_FIXUP_DELL_HEADSET_MIC] = {
7995 .type = HDA_FIXUP_PINS,
7996 .v.pins = (const struct hda_pintbl[]) {
7997 { 0x19, 0x01a1913c },
7998 { }
7999 },
8000 .chained = true,
8001 .chain_id = ALC269_FIXUP_HEADSET_MIC
8002 },
8003 [ALC295_FIXUP_HP_X360] = {
8004 .type = HDA_FIXUP_FUNC,
8005 .v.func = alc295_fixup_hp_top_speakers,
8006 .chained = true,
8007 .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC3
8008 },
8009 [ALC221_FIXUP_HP_HEADSET_MIC] = {
8010 .type = HDA_FIXUP_PINS,
8011 .v.pins = (const struct hda_pintbl[]) {
8012 { 0x19, 0x0181313f},
8013 { }
8014 },
8015 .chained = true,
8016 .chain_id = ALC269_FIXUP_HEADSET_MIC
8017 },
8018 [ALC285_FIXUP_LENOVO_HEADPHONE_NOISE] = {
8019 .type = HDA_FIXUP_FUNC,
8020 .v.func = alc285_fixup_invalidate_dacs,
8021 .chained = true,
8022 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
8023 },
8024 [ALC295_FIXUP_HP_AUTO_MUTE] = {
8025 .type = HDA_FIXUP_FUNC,
8026 .v.func = alc_fixup_auto_mute_via_amp,
8027 },
8028 [ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE] = {
8029 .type = HDA_FIXUP_PINS,
8030 .v.pins = (const struct hda_pintbl[]) {
8031 { 0x18, 0x01a1913c },
8032 { }
8033 },
8034 .chained = true,
8035 .chain_id = ALC269_FIXUP_HEADSET_MIC
8036 },
8037 [ALC294_FIXUP_ASUS_MIC] = {
8038 .type = HDA_FIXUP_PINS,
8039 .v.pins = (const struct hda_pintbl[]) {
8040 { 0x13, 0x90a60160 },
8041 { 0x19, 0x04a11120 },
8042 { }
8043 },
8044 .chained = true,
8045 .chain_id = ALC269_FIXUP_HEADSET_MIC
8046 },
8047 [ALC294_FIXUP_ASUS_HEADSET_MIC] = {
8048 .type = HDA_FIXUP_PINS,
8049 .v.pins = (const struct hda_pintbl[]) {
8050 { 0x19, 0x01a1103c },
8051 { }
8052 },
8053 .chained = true,
8054 .chain_id = ALC269_FIXUP_HEADSET_MIC
8055 },
8056 [ALC294_FIXUP_ASUS_SPK] = {
8057 .type = HDA_FIXUP_VERBS,
8058 .v.verbs = (const struct hda_verb[]) {
8059
8060 { 0x20, AC_VERB_SET_COEF_INDEX, 0x40 },
8061 { 0x20, AC_VERB_SET_PROC_COEF, 0x8800 },
8062 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
8063 { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
8064 { }
8065 },
8066 .chained = true,
8067 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8068 },
8069 [ALC295_FIXUP_CHROME_BOOK] = {
8070 .type = HDA_FIXUP_FUNC,
8071 .v.func = alc295_fixup_chromebook,
8072 .chained = true,
8073 .chain_id = ALC225_FIXUP_HEADSET_JACK
8074 },
8075 [ALC225_FIXUP_HEADSET_JACK] = {
8076 .type = HDA_FIXUP_FUNC,
8077 .v.func = alc_fixup_headset_jack,
8078 },
8079 [ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
8080 .type = HDA_FIXUP_PINS,
8081 .v.pins = (const struct hda_pintbl[]) {
8082 { 0x1a, 0x01a1913c },
8083 { }
8084 },
8085 .chained = true,
8086 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8087 },
8088 [ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE] = {
8089 .type = HDA_FIXUP_VERBS,
8090 .v.verbs = (const struct hda_verb[]) {
8091
8092 { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
8093 { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
8094 { }
8095 },
8096 .chained = true,
8097 .chain_id = ALC285_FIXUP_LENOVO_HEADPHONE_NOISE
8098 },
8099 [ALC255_FIXUP_ACER_HEADSET_MIC] = {
8100 .type = HDA_FIXUP_PINS,
8101 .v.pins = (const struct hda_pintbl[]) {
8102 { 0x19, 0x03a11130 },
8103 { 0x1a, 0x90a60140 },
8104 { }
8105 },
8106 .chained = true,
8107 .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
8108 },
8109 [ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE] = {
8110 .type = HDA_FIXUP_PINS,
8111 .v.pins = (const struct hda_pintbl[]) {
8112 { 0x16, 0x01011020 },
8113 { 0x19, 0x01a1913c },
8114 { }
8115 },
8116 .chained = true,
8117 .chain_id = ALC225_FIXUP_WYSE_AUTO_MUTE
8118 },
8119 [ALC225_FIXUP_WYSE_AUTO_MUTE] = {
8120 .type = HDA_FIXUP_FUNC,
8121 .v.func = alc_fixup_auto_mute_via_amp,
8122 .chained = true,
8123 .chain_id = ALC225_FIXUP_WYSE_DISABLE_MIC_VREF
8124 },
8125 [ALC225_FIXUP_WYSE_DISABLE_MIC_VREF] = {
8126 .type = HDA_FIXUP_FUNC,
8127 .v.func = alc_fixup_disable_mic_vref,
8128 .chained = true,
8129 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8130 },
8131 [ALC286_FIXUP_ACER_AIO_HEADSET_MIC] = {
8132 .type = HDA_FIXUP_VERBS,
8133 .v.verbs = (const struct hda_verb[]) {
8134 { 0x20, AC_VERB_SET_COEF_INDEX, 0x4f },
8135 { 0x20, AC_VERB_SET_PROC_COEF, 0x5029 },
8136 { }
8137 },
8138 .chained = true,
8139 .chain_id = ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE
8140 },
8141 [ALC256_FIXUP_ASUS_HEADSET_MIC] = {
8142 .type = HDA_FIXUP_PINS,
8143 .v.pins = (const struct hda_pintbl[]) {
8144 { 0x19, 0x03a11020 },
8145 { }
8146 },
8147 .chained = true,
8148 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8149 },
8150 [ALC256_FIXUP_ASUS_MIC_NO_PRESENCE] = {
8151 .type = HDA_FIXUP_PINS,
8152 .v.pins = (const struct hda_pintbl[]) {
8153 { 0x19, 0x04a11120 },
8154 { }
8155 },
8156 .chained = true,
8157 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8158 },
8159 [ALC299_FIXUP_PREDATOR_SPK] = {
8160 .type = HDA_FIXUP_PINS,
8161 .v.pins = (const struct hda_pintbl[]) {
8162 { 0x21, 0x90170150 },
8163 { }
8164 }
8165 },
8166 [ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE] = {
8167 .type = HDA_FIXUP_PINS,
8168 .v.pins = (const struct hda_pintbl[]) {
8169 { 0x19, 0x04a11040 },
8170 { 0x21, 0x04211020 },
8171 { }
8172 },
8173 .chained = true,
8174 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8175 },
8176 [ALC289_FIXUP_DELL_SPK2] = {
8177 .type = HDA_FIXUP_PINS,
8178 .v.pins = (const struct hda_pintbl[]) {
8179 { 0x17, 0x90170130 },
8180 { }
8181 },
8182 .chained = true,
8183 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE
8184 },
8185 [ALC289_FIXUP_DUAL_SPK] = {
8186 .type = HDA_FIXUP_FUNC,
8187 .v.func = alc285_fixup_speaker2_to_dac1,
8188 .chained = true,
8189 .chain_id = ALC289_FIXUP_DELL_SPK2
8190 },
8191 [ALC294_FIXUP_SPK2_TO_DAC1] = {
8192 .type = HDA_FIXUP_FUNC,
8193 .v.func = alc285_fixup_speaker2_to_dac1,
8194 .chained = true,
8195 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8196 },
8197 [ALC294_FIXUP_ASUS_DUAL_SPK] = {
8198 .type = HDA_FIXUP_FUNC,
8199
8200 .v.func = alc_fixup_gpio4,
8201 .chained = true,
8202 .chain_id = ALC294_FIXUP_SPK2_TO_DAC1
8203 },
8204 [ALC285_FIXUP_THINKPAD_X1_GEN7] = {
8205 .type = HDA_FIXUP_FUNC,
8206 .v.func = alc285_fixup_thinkpad_x1_gen7,
8207 .chained = true,
8208 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
8209 },
8210 [ALC285_FIXUP_THINKPAD_HEADSET_JACK] = {
8211 .type = HDA_FIXUP_FUNC,
8212 .v.func = alc_fixup_headset_jack,
8213 .chained = true,
8214 .chain_id = ALC285_FIXUP_THINKPAD_X1_GEN7
8215 },
8216 [ALC294_FIXUP_ASUS_HPE] = {
8217 .type = HDA_FIXUP_VERBS,
8218 .v.verbs = (const struct hda_verb[]) {
8219
8220 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
8221 { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
8222 { }
8223 },
8224 .chained = true,
8225 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8226 },
8227 [ALC294_FIXUP_ASUS_GX502_PINS] = {
8228 .type = HDA_FIXUP_PINS,
8229 .v.pins = (const struct hda_pintbl[]) {
8230 { 0x19, 0x03a11050 },
8231 { 0x1a, 0x01a11830 },
8232 { 0x21, 0x03211020 },
8233 { }
8234 },
8235 .chained = true,
8236 .chain_id = ALC294_FIXUP_ASUS_GX502_VERBS
8237 },
8238 [ALC294_FIXUP_ASUS_GX502_VERBS] = {
8239 .type = HDA_FIXUP_VERBS,
8240 .v.verbs = (const struct hda_verb[]) {
8241
8242 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
8243
8244 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
8245 { }
8246 },
8247 .chained = true,
8248 .chain_id = ALC294_FIXUP_ASUS_GX502_HP
8249 },
8250 [ALC294_FIXUP_ASUS_GX502_HP] = {
8251 .type = HDA_FIXUP_FUNC,
8252 .v.func = alc294_fixup_gx502_hp,
8253 },
8254 [ALC294_FIXUP_ASUS_GU502_PINS] = {
8255 .type = HDA_FIXUP_PINS,
8256 .v.pins = (const struct hda_pintbl[]) {
8257 { 0x19, 0x01a11050 },
8258 { 0x1a, 0x01a11830 },
8259 { 0x21, 0x012110f0 },
8260 { }
8261 },
8262 .chained = true,
8263 .chain_id = ALC294_FIXUP_ASUS_GU502_VERBS
8264 },
8265 [ALC294_FIXUP_ASUS_GU502_VERBS] = {
8266 .type = HDA_FIXUP_VERBS,
8267 .v.verbs = (const struct hda_verb[]) {
8268
8269 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
8270
8271 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
8272
8273 { 0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
8274 { }
8275 },
8276 .chained = true,
8277 .chain_id = ALC294_FIXUP_ASUS_GU502_HP
8278 },
8279 [ALC294_FIXUP_ASUS_GU502_HP] = {
8280 .type = HDA_FIXUP_FUNC,
8281 .v.func = alc294_fixup_gu502_hp,
8282 },
8283 [ALC294_FIXUP_ASUS_COEF_1B] = {
8284 .type = HDA_FIXUP_VERBS,
8285 .v.verbs = (const struct hda_verb[]) {
8286
8287
8288
8289 { 0x20, AC_VERB_SET_COEF_INDEX, 0x1b },
8290 { 0x20, AC_VERB_SET_PROC_COEF, 0x4e4b },
8291 { }
8292 },
8293 .chained = true,
8294 .chain_id = ALC289_FIXUP_ASUS_GA401,
8295 },
8296 [ALC285_FIXUP_HP_GPIO_LED] = {
8297 .type = HDA_FIXUP_FUNC,
8298 .v.func = alc285_fixup_hp_gpio_led,
8299 },
8300 [ALC285_FIXUP_HP_MUTE_LED] = {
8301 .type = HDA_FIXUP_FUNC,
8302 .v.func = alc285_fixup_hp_mute_led,
8303 },
8304 [ALC236_FIXUP_HP_GPIO_LED] = {
8305 .type = HDA_FIXUP_FUNC,
8306 .v.func = alc236_fixup_hp_gpio_led,
8307 },
8308 [ALC236_FIXUP_HP_MUTE_LED] = {
8309 .type = HDA_FIXUP_FUNC,
8310 .v.func = alc236_fixup_hp_mute_led,
8311 },
8312 [ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF] = {
8313 .type = HDA_FIXUP_FUNC,
8314 .v.func = alc236_fixup_hp_mute_led_micmute_vref,
8315 },
8316 [ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
8317 .type = HDA_FIXUP_VERBS,
8318 .v.verbs = (const struct hda_verb[]) {
8319 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc5 },
8320 { }
8321 },
8322 },
8323 [ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
8324 .type = HDA_FIXUP_VERBS,
8325 .v.verbs = (const struct hda_verb[]) {
8326 { 0x20, AC_VERB_SET_COEF_INDEX, 0x08},
8327 { 0x20, AC_VERB_SET_PROC_COEF, 0x2fcf},
8328 { }
8329 },
8330 },
8331 [ALC295_FIXUP_ASUS_MIC_NO_PRESENCE] = {
8332 .type = HDA_FIXUP_PINS,
8333 .v.pins = (const struct hda_pintbl[]) {
8334 { 0x19, 0x01a1913c },
8335 { }
8336 },
8337 .chained = true,
8338 .chain_id = ALC269_FIXUP_HEADSET_MODE
8339 },
8340 [ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS] = {
8341 .type = HDA_FIXUP_PINS,
8342 .v.pins = (const struct hda_pintbl[]) {
8343 { 0x14, 0x90100120 },
8344 { 0x18, 0x02a111f0 },
8345 { 0x1a, 0x01011020 },
8346 { },
8347 },
8348 .chained = true,
8349 .chain_id = ALC269_FIXUP_HEADSET_MIC
8350 },
8351 [ALC269VC_FIXUP_ACER_HEADSET_MIC] = {
8352 .type = HDA_FIXUP_PINS,
8353 .v.pins = (const struct hda_pintbl[]) {
8354 { 0x18, 0x02a11030 },
8355 { }
8356 },
8357 .chained = true,
8358 .chain_id = ALC269_FIXUP_HEADSET_MIC
8359 },
8360 [ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE] = {
8361 .type = HDA_FIXUP_PINS,
8362 .v.pins = (const struct hda_pintbl[]) {
8363 { 0x18, 0x01a11130 },
8364 { }
8365 },
8366 .chained = true,
8367 .chain_id = ALC269_FIXUP_HEADSET_MIC
8368 },
8369 [ALC289_FIXUP_ASUS_GA401] = {
8370 .type = HDA_FIXUP_FUNC,
8371 .v.func = alc289_fixup_asus_ga401,
8372 .chained = true,
8373 .chain_id = ALC289_FIXUP_ASUS_GA502,
8374 },
8375 [ALC289_FIXUP_ASUS_GA502] = {
8376 .type = HDA_FIXUP_PINS,
8377 .v.pins = (const struct hda_pintbl[]) {
8378 { 0x19, 0x03a11020 },
8379 { }
8380 },
8381 },
8382 [ALC256_FIXUP_ACER_MIC_NO_PRESENCE] = {
8383 .type = HDA_FIXUP_PINS,
8384 .v.pins = (const struct hda_pintbl[]) {
8385 { 0x19, 0x02a11120 },
8386 { }
8387 },
8388 .chained = true,
8389 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8390 },
8391 [ALC285_FIXUP_HP_GPIO_AMP_INIT] = {
8392 .type = HDA_FIXUP_FUNC,
8393 .v.func = alc285_fixup_hp_gpio_amp_init,
8394 .chained = true,
8395 .chain_id = ALC285_FIXUP_HP_GPIO_LED
8396 },
8397 [ALC269_FIXUP_CZC_B20] = {
8398 .type = HDA_FIXUP_PINS,
8399 .v.pins = (const struct hda_pintbl[]) {
8400 { 0x12, 0x411111f0 },
8401 { 0x14, 0x90170110 },
8402 { 0x15, 0x032f1020 },
8403 { 0x17, 0x411111f0 },
8404 { 0x18, 0x03ab1040 },
8405 { 0x19, 0xb7a7013f },
8406 { 0x1a, 0x0181305f },
8407 { 0x1b, 0x411111f0 },
8408 { 0x1d, 0x411111f0 },
8409 { 0x1e, 0x411111f0 },
8410 { }
8411 },
8412 .chain_id = ALC269_FIXUP_DMIC,
8413 },
8414 [ALC269_FIXUP_CZC_TMI] = {
8415 .type = HDA_FIXUP_PINS,
8416 .v.pins = (const struct hda_pintbl[]) {
8417 { 0x12, 0x4000c000 },
8418 { 0x14, 0x90170110 },
8419 { 0x15, 0x0421401f },
8420 { 0x17, 0x411111f0 },
8421 { 0x18, 0x04a19020 },
8422 { 0x19, 0x411111f0 },
8423 { 0x1a, 0x411111f0 },
8424 { 0x1b, 0x411111f0 },
8425 { 0x1d, 0x40448505 },
8426 { 0x1e, 0x411111f0 },
8427 { 0x20, 0x8000ffff },
8428 { }
8429 },
8430 .chain_id = ALC269_FIXUP_DMIC,
8431 },
8432 [ALC269_FIXUP_CZC_L101] = {
8433 .type = HDA_FIXUP_PINS,
8434 .v.pins = (const struct hda_pintbl[]) {
8435 { 0x12, 0x40000000 },
8436 { 0x14, 0x01014010 },
8437 { 0x15, 0x411111f0 },
8438 { 0x16, 0x411111f0 },
8439 { 0x18, 0x01a19020 },
8440 { 0x19, 0x02a19021 },
8441 { 0x1a, 0x0181302f },
8442 { 0x1b, 0x0221401f },
8443 { 0x1c, 0x411111f0 },
8444 { 0x1d, 0x4044c601 },
8445 { 0x1e, 0x411111f0 },
8446 { }
8447 },
8448 .chain_id = ALC269_FIXUP_DMIC,
8449 },
8450 [ALC269_FIXUP_LEMOTE_A1802] = {
8451 .type = HDA_FIXUP_PINS,
8452 .v.pins = (const struct hda_pintbl[]) {
8453 { 0x12, 0x40000000 },
8454 { 0x14, 0x90170110 },
8455 { 0x17, 0x411111f0 },
8456 { 0x18, 0x03a19040 },
8457 { 0x19, 0x90a70130 },
8458 { 0x1a, 0x411111f0 },
8459 { 0x1b, 0x411111f0 },
8460 { 0x1d, 0x40489d2d },
8461 { 0x1e, 0x411111f0 },
8462 { 0x20, 0x0003ffff },
8463 { 0x21, 0x03214020 },
8464 { }
8465 },
8466 .chain_id = ALC269_FIXUP_DMIC,
8467 },
8468 [ALC269_FIXUP_LEMOTE_A190X] = {
8469 .type = HDA_FIXUP_PINS,
8470 .v.pins = (const struct hda_pintbl[]) {
8471 { 0x14, 0x99130110 },
8472 { 0x15, 0x0121401f },
8473 { 0x18, 0x01a19c20 },
8474 { 0x19, 0x99a3092f },
8475 { 0x1b, 0x0201401f },
8476 { }
8477 },
8478 .chain_id = ALC269_FIXUP_DMIC,
8479 },
8480 [ALC256_FIXUP_INTEL_NUC8_RUGGED] = {
8481 .type = HDA_FIXUP_PINS,
8482 .v.pins = (const struct hda_pintbl[]) {
8483 { 0x1b, 0x01a1913c },
8484 { }
8485 },
8486 .chained = true,
8487 .chain_id = ALC269_FIXUP_HEADSET_MODE
8488 },
8489 [ALC256_FIXUP_INTEL_NUC10] = {
8490 .type = HDA_FIXUP_PINS,
8491 .v.pins = (const struct hda_pintbl[]) {
8492 { 0x19, 0x01a1913c },
8493 { }
8494 },
8495 .chained = true,
8496 .chain_id = ALC269_FIXUP_HEADSET_MODE
8497 },
8498 [ALC255_FIXUP_XIAOMI_HEADSET_MIC] = {
8499 .type = HDA_FIXUP_VERBS,
8500 .v.verbs = (const struct hda_verb[]) {
8501 { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
8502 { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
8503 { }
8504 },
8505 .chained = true,
8506 .chain_id = ALC289_FIXUP_ASUS_GA502
8507 },
8508 [ALC274_FIXUP_HP_MIC] = {
8509 .type = HDA_FIXUP_VERBS,
8510 .v.verbs = (const struct hda_verb[]) {
8511 { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
8512 { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
8513 { }
8514 },
8515 },
8516 [ALC274_FIXUP_HP_HEADSET_MIC] = {
8517 .type = HDA_FIXUP_FUNC,
8518 .v.func = alc274_fixup_hp_headset_mic,
8519 .chained = true,
8520 .chain_id = ALC274_FIXUP_HP_MIC
8521 },
8522 [ALC274_FIXUP_HP_ENVY_GPIO] = {
8523 .type = HDA_FIXUP_FUNC,
8524 .v.func = alc274_fixup_hp_envy_gpio,
8525 },
8526 [ALC256_FIXUP_ASUS_HPE] = {
8527 .type = HDA_FIXUP_VERBS,
8528 .v.verbs = (const struct hda_verb[]) {
8529
8530 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
8531 { 0x20, AC_VERB_SET_PROC_COEF, 0x7778 },
8532 { }
8533 },
8534 .chained = true,
8535 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8536 },
8537 [ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK] = {
8538 .type = HDA_FIXUP_FUNC,
8539 .v.func = alc_fixup_headset_jack,
8540 .chained = true,
8541 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
8542 },
8543 [ALC287_FIXUP_HP_GPIO_LED] = {
8544 .type = HDA_FIXUP_FUNC,
8545 .v.func = alc287_fixup_hp_gpio_led,
8546 },
8547 [ALC256_FIXUP_HP_HEADSET_MIC] = {
8548 .type = HDA_FIXUP_FUNC,
8549 .v.func = alc274_fixup_hp_headset_mic,
8550 },
8551 [ALC236_FIXUP_DELL_AIO_HEADSET_MIC] = {
8552 .type = HDA_FIXUP_FUNC,
8553 .v.func = alc_fixup_no_int_mic,
8554 .chained = true,
8555 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
8556 },
8557 [ALC282_FIXUP_ACER_DISABLE_LINEOUT] = {
8558 .type = HDA_FIXUP_PINS,
8559 .v.pins = (const struct hda_pintbl[]) {
8560 { 0x1b, 0x411111f0 },
8561 { 0x18, 0x01a1913c },
8562 { },
8563 },
8564 .chained = true,
8565 .chain_id = ALC269_FIXUP_HEADSET_MODE
8566 },
8567 [ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST] = {
8568 .type = HDA_FIXUP_FUNC,
8569 .v.func = alc269_fixup_limit_int_mic_boost,
8570 .chained = true,
8571 .chain_id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
8572 },
8573 [ALC256_FIXUP_ACER_HEADSET_MIC] = {
8574 .type = HDA_FIXUP_PINS,
8575 .v.pins = (const struct hda_pintbl[]) {
8576 { 0x19, 0x02a1113c },
8577 { 0x1a, 0x90a1092f },
8578 { }
8579 },
8580 .chained = true,
8581 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8582 },
8583 [ALC285_FIXUP_IDEAPAD_S740_COEF] = {
8584 .type = HDA_FIXUP_FUNC,
8585 .v.func = alc285_fixup_ideapad_s740_coef,
8586 .chained = true,
8587 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
8588 },
8589 [ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST] = {
8590 .type = HDA_FIXUP_FUNC,
8591 .v.func = alc269_fixup_limit_int_mic_boost,
8592 .chained = true,
8593 .chain_id = ALC285_FIXUP_HP_MUTE_LED,
8594 },
8595 [ALC295_FIXUP_ASUS_DACS] = {
8596 .type = HDA_FIXUP_FUNC,
8597 .v.func = alc295_fixup_asus_dacs,
8598 },
8599 [ALC295_FIXUP_HP_OMEN] = {
8600 .type = HDA_FIXUP_PINS,
8601 .v.pins = (const struct hda_pintbl[]) {
8602 { 0x12, 0xb7a60130 },
8603 { 0x13, 0x40000000 },
8604 { 0x14, 0x411111f0 },
8605 { 0x16, 0x411111f0 },
8606 { 0x17, 0x90170110 },
8607 { 0x18, 0x411111f0 },
8608 { 0x19, 0x02a11030 },
8609 { 0x1a, 0x411111f0 },
8610 { 0x1b, 0x04a19030 },
8611 { 0x1d, 0x40600001 },
8612 { 0x1e, 0x411111f0 },
8613 { 0x21, 0x03211020 },
8614 {}
8615 },
8616 .chained = true,
8617 .chain_id = ALC269_FIXUP_HP_LINE1_MIC1_LED,
8618 },
8619 [ALC285_FIXUP_HP_SPECTRE_X360] = {
8620 .type = HDA_FIXUP_FUNC,
8621 .v.func = alc285_fixup_hp_spectre_x360,
8622 },
8623 [ALC285_FIXUP_HP_SPECTRE_X360_EB1] = {
8624 .type = HDA_FIXUP_FUNC,
8625 .v.func = alc285_fixup_hp_spectre_x360_eb1
8626 },
8627 [ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP] = {
8628 .type = HDA_FIXUP_FUNC,
8629 .v.func = alc285_fixup_ideapad_s740_coef,
8630 .chained = true,
8631 .chain_id = ALC285_FIXUP_THINKPAD_HEADSET_JACK,
8632 },
8633 [ALC623_FIXUP_LENOVO_THINKSTATION_P340] = {
8634 .type = HDA_FIXUP_FUNC,
8635 .v.func = alc_fixup_no_shutup,
8636 .chained = true,
8637 .chain_id = ALC283_FIXUP_HEADSET_MIC,
8638 },
8639 [ALC255_FIXUP_ACER_HEADPHONE_AND_MIC] = {
8640 .type = HDA_FIXUP_PINS,
8641 .v.pins = (const struct hda_pintbl[]) {
8642 { 0x21, 0x03211030 },
8643 { }
8644 },
8645 .chained = true,
8646 .chain_id = ALC255_FIXUP_XIAOMI_HEADSET_MIC
8647 },
8648 [ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST] = {
8649 .type = HDA_FIXUP_FUNC,
8650 .v.func = alc269_fixup_limit_int_mic_boost,
8651 .chained = true,
8652 .chain_id = ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,
8653 },
8654 [ALC285_FIXUP_LEGION_Y9000X_SPEAKERS] = {
8655 .type = HDA_FIXUP_FUNC,
8656 .v.func = alc285_fixup_ideapad_s740_coef,
8657 .chained = true,
8658 .chain_id = ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,
8659 },
8660 [ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE] = {
8661 .type = HDA_FIXUP_FUNC,
8662 .v.func = alc287_fixup_legion_15imhg05_speakers,
8663 .chained = true,
8664 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
8665 },
8666 [ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS] = {
8667 .type = HDA_FIXUP_VERBS,
8668
8669 .v.verbs = (const struct hda_verb[]) {
8670
8671 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
8672 { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
8673
8674 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8675 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
8676 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8677 { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
8678 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8679
8680 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8681 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
8682 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8683 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8684 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8685
8686
8687 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
8688 { 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
8689
8690 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8691 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
8692 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8693 { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
8694 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8695
8696 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8697 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
8698 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8699 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8700 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8701 {}
8702 },
8703 .chained = true,
8704 .chain_id = ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,
8705 },
8706 [ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE] = {
8707 .type = HDA_FIXUP_FUNC,
8708 .v.func = alc287_fixup_legion_15imhg05_speakers,
8709 .chained = true,
8710 .chain_id = ALC269_FIXUP_HEADSET_MODE,
8711 },
8712 [ALC287_FIXUP_YOGA7_14ITL_SPEAKERS] = {
8713 .type = HDA_FIXUP_VERBS,
8714 .v.verbs = (const struct hda_verb[]) {
8715
8716 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
8717 { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
8718
8719 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8720 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
8721 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8722 { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
8723 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8724
8725 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8726 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
8727 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8728 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8729 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8730
8731
8732 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
8733 { 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
8734
8735 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8736 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
8737 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8738 { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
8739 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8740
8741 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8742 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
8743 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8744 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8745 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8746 {}
8747 },
8748 .chained = true,
8749 .chain_id = ALC269_FIXUP_HEADSET_MODE,
8750 },
8751 [ALC287_FIXUP_13S_GEN2_SPEAKERS] = {
8752 .type = HDA_FIXUP_VERBS,
8753 .v.verbs = (const struct hda_verb[]) {
8754 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
8755 { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
8756 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8757 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
8758 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8759 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8760 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8761 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
8762 { 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
8763 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8764 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
8765 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8766 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8767 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8768 {}
8769 },
8770 .chained = true,
8771 .chain_id = ALC269_FIXUP_HEADSET_MODE,
8772 },
8773 [ALC256_FIXUP_SET_COEF_DEFAULTS] = {
8774 .type = HDA_FIXUP_FUNC,
8775 .v.func = alc256_fixup_set_coef_defaults,
8776 },
8777 [ALC245_FIXUP_HP_GPIO_LED] = {
8778 .type = HDA_FIXUP_FUNC,
8779 .v.func = alc245_fixup_hp_gpio_led,
8780 },
8781 [ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
8782 .type = HDA_FIXUP_PINS,
8783 .v.pins = (const struct hda_pintbl[]) {
8784 { 0x19, 0x03a11120 },
8785 { }
8786 },
8787 .chained = true,
8788 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
8789 },
8790 [ALC233_FIXUP_NO_AUDIO_JACK] = {
8791 .type = HDA_FIXUP_FUNC,
8792 .v.func = alc233_fixup_no_audio_jack,
8793 },
8794 [ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME] = {
8795 .type = HDA_FIXUP_FUNC,
8796 .v.func = alc256_fixup_mic_no_presence_and_resume,
8797 .chained = true,
8798 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8799 },
8800 [ALC287_FIXUP_LEGION_16ACHG6] = {
8801 .type = HDA_FIXUP_FUNC,
8802 .v.func = alc287_fixup_legion_16achg6_speakers,
8803 },
8804 [ALC287_FIXUP_CS35L41_I2C_2] = {
8805 .type = HDA_FIXUP_FUNC,
8806 .v.func = cs35l41_fixup_i2c_two,
8807 .chained = true,
8808 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
8809 },
8810 [ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED] = {
8811 .type = HDA_FIXUP_FUNC,
8812 .v.func = cs35l41_fixup_i2c_two,
8813 .chained = true,
8814 .chain_id = ALC285_FIXUP_HP_MUTE_LED,
8815 },
8816 [ALC245_FIXUP_CS35L41_SPI_2] = {
8817 .type = HDA_FIXUP_FUNC,
8818 .v.func = cs35l41_fixup_spi_two,
8819 },
8820 [ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED] = {
8821 .type = HDA_FIXUP_FUNC,
8822 .v.func = cs35l41_fixup_spi_two,
8823 .chained = true,
8824 .chain_id = ALC285_FIXUP_HP_GPIO_LED,
8825 },
8826 [ALC245_FIXUP_CS35L41_SPI_4] = {
8827 .type = HDA_FIXUP_FUNC,
8828 .v.func = cs35l41_fixup_spi_four,
8829 },
8830 [ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED] = {
8831 .type = HDA_FIXUP_FUNC,
8832 .v.func = cs35l41_fixup_spi_four,
8833 .chained = true,
8834 .chain_id = ALC285_FIXUP_HP_GPIO_LED,
8835 },
8836 [ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED] = {
8837 .type = HDA_FIXUP_VERBS,
8838 .v.verbs = (const struct hda_verb[]) {
8839 { 0x20, AC_VERB_SET_COEF_INDEX, 0x19 },
8840 { 0x20, AC_VERB_SET_PROC_COEF, 0x8e11 },
8841 { }
8842 },
8843 .chained = true,
8844 .chain_id = ALC285_FIXUP_HP_MUTE_LED,
8845 },
8846 [ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET] = {
8847 .type = HDA_FIXUP_FUNC,
8848 .v.func = alc_fixup_dell4_mic_no_presence_quiet,
8849 .chained = true,
8850 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
8851 },
8852 [ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE] = {
8853 .type = HDA_FIXUP_PINS,
8854 .v.pins = (const struct hda_pintbl[]) {
8855 { 0x19, 0x02a1112c },
8856 { }
8857 },
8858 .chained = true,
8859 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8860 },
8861};
8862
8863static const struct snd_pci_quirk alc269_fixup_tbl[] = {
8864 SND_PCI_QUIRK(0x1025, 0x0283, "Acer TravelMate 8371", ALC269_FIXUP_INV_DMIC),
8865 SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC),
8866 SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC),
8867 SND_PCI_QUIRK(0x1025, 0x047c, "Acer AC700", ALC269_FIXUP_ACER_AC700),
8868 SND_PCI_QUIRK(0x1025, 0x072d, "Acer Aspire V5-571G", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
8869 SND_PCI_QUIRK(0x1025, 0x0740, "Acer AO725", ALC271_FIXUP_HP_GATE_MIC_JACK),
8870 SND_PCI_QUIRK(0x1025, 0x0742, "Acer AO756", ALC271_FIXUP_HP_GATE_MIC_JACK),
8871 SND_PCI_QUIRK(0x1025, 0x0762, "Acer Aspire E1-472", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
8872 SND_PCI_QUIRK(0x1025, 0x0775, "Acer Aspire E1-572", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
8873 SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS),
8874 SND_PCI_QUIRK(0x1025, 0x080d, "Acer Aspire V5-122P", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
8875 SND_PCI_QUIRK(0x1025, 0x0840, "Acer Aspire E1", ALC269VB_FIXUP_ASPIRE_E1_COEF),
8876 SND_PCI_QUIRK(0x1025, 0x101c, "Acer Veriton N2510G", ALC269_FIXUP_LIFEBOOK),
8877 SND_PCI_QUIRK(0x1025, 0x102b, "Acer Aspire C24-860", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE),
8878 SND_PCI_QUIRK(0x1025, 0x1065, "Acer Aspire C20-820", ALC269VC_FIXUP_ACER_HEADSET_MIC),
8879 SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK),
8880 SND_PCI_QUIRK(0x1025, 0x1094, "Acer Aspire E5-575T", ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST),
8881 SND_PCI_QUIRK(0x1025, 0x1099, "Acer Aspire E5-523G", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
8882 SND_PCI_QUIRK(0x1025, 0x110e, "Acer Aspire ES1-432", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
8883 SND_PCI_QUIRK(0x1025, 0x1166, "Acer Veriton N4640G", ALC269_FIXUP_LIFEBOOK),
8884 SND_PCI_QUIRK(0x1025, 0x1167, "Acer Veriton N6640G", ALC269_FIXUP_LIFEBOOK),
8885 SND_PCI_QUIRK(0x1025, 0x1246, "Acer Predator Helios 500", ALC299_FIXUP_PREDATOR_SPK),
8886 SND_PCI_QUIRK(0x1025, 0x1247, "Acer vCopperbox", ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS),
8887 SND_PCI_QUIRK(0x1025, 0x1248, "Acer Veriton N4660G", ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE),
8888 SND_PCI_QUIRK(0x1025, 0x1269, "Acer SWIFT SF314-54", ALC256_FIXUP_ACER_HEADSET_MIC),
8889 SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
8890 SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
8891 SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
8892 SND_PCI_QUIRK(0x1025, 0x129c, "Acer SWIFT SF314-55", ALC256_FIXUP_ACER_HEADSET_MIC),
8893 SND_PCI_QUIRK(0x1025, 0x1300, "Acer SWIFT SF314-56", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
8894 SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
8895 SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", ALC233_FIXUP_ACER_HEADSET_MIC),
8896 SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC),
8897 SND_PCI_QUIRK(0x1025, 0x141f, "Acer Spin SP513-54N", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
8898 SND_PCI_QUIRK(0x1025, 0x142b, "Acer Swift SF314-42", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
8899 SND_PCI_QUIRK(0x1025, 0x1430, "Acer TravelMate B311R-31", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
8900 SND_PCI_QUIRK(0x1025, 0x1466, "Acer Aspire A515-56", ALC255_FIXUP_ACER_HEADPHONE_AND_MIC),
8901 SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
8902 SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS),
8903 SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X),
8904 SND_PCI_QUIRK(0x1028, 0x05be, "Dell Latitude E6540", ALC292_FIXUP_DELL_E7X),
8905 SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X),
8906 SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X),
8907 SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER),
8908 SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
8909 SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
8910 SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
8911 SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
8912 SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
8913 SND_PCI_QUIRK(0x1028, 0x062c, "Dell Latitude E5550", ALC292_FIXUP_DELL_E7X),
8914 SND_PCI_QUIRK(0x1028, 0x062e, "Dell Latitude E7450", ALC292_FIXUP_DELL_E7X),
8915 SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),
8916 SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
8917 SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
8918 SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13),
8919 SND_PCI_QUIRK(0x1028, 0x0669, "Dell Optiplex 9020m", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
8920 SND_PCI_QUIRK(0x1028, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK),
8921 SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
8922 SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
8923 SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
8924 SND_PCI_QUIRK(0x1028, 0x06db, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
8925 SND_PCI_QUIRK(0x1028, 0x06dd, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
8926 SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
8927 SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
8928 SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
8929 SND_PCI_QUIRK(0x1028, 0x0706, "Dell Inspiron 7559", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
8930 SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE),
8931 SND_PCI_QUIRK(0x1028, 0x0738, "Dell Precision 5820", ALC269_FIXUP_NO_SHUTUP),
8932 SND_PCI_QUIRK(0x1028, 0x075c, "Dell XPS 27 7760", ALC298_FIXUP_SPK_VOLUME),
8933 SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME),
8934 SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
8935 SND_PCI_QUIRK(0x1028, 0x07b0, "Dell Precision 7520", ALC295_FIXUP_DISABLE_DAC3),
8936 SND_PCI_QUIRK(0x1028, 0x080c, "Dell WYSE", ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE),
8937 SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
8938 SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
8939 SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
8940 SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
8941 SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB),
8942 SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE),
8943 SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE),
8944 SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
8945 SND_PCI_QUIRK(0x1028, 0x097d, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
8946 SND_PCI_QUIRK(0x1028, 0x097e, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
8947 SND_PCI_QUIRK(0x1028, 0x098d, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
8948 SND_PCI_QUIRK(0x1028, 0x09bf, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
8949 SND_PCI_QUIRK(0x1028, 0x0a2e, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
8950 SND_PCI_QUIRK(0x1028, 0x0a30, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
8951 SND_PCI_QUIRK(0x1028, 0x0a38, "Dell Latitude 7520", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET),
8952 SND_PCI_QUIRK(0x1028, 0x0a58, "Dell", ALC255_FIXUP_DELL_HEADSET_MIC),
8953 SND_PCI_QUIRK(0x1028, 0x0a61, "Dell XPS 15 9510", ALC289_FIXUP_DUAL_SPK),
8954 SND_PCI_QUIRK(0x1028, 0x0a62, "Dell Precision 5560", ALC289_FIXUP_DUAL_SPK),
8955 SND_PCI_QUIRK(0x1028, 0x0a9d, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
8956 SND_PCI_QUIRK(0x1028, 0x0a9e, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
8957 SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
8958 SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
8959 SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
8960 SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),
8961 SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED),
8962 SND_PCI_QUIRK(0x103c, 0x21f9, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8963 SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8964 SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8965 SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8966 SND_PCI_QUIRK(0x103c, 0x221c, "HP EliteBook 755 G2", ALC280_FIXUP_HP_HEADSET_MIC),
8967 SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8968 SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8969 SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
8970 SND_PCI_QUIRK(0x103c, 0x2237, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
8971 SND_PCI_QUIRK(0x103c, 0x2238, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
8972 SND_PCI_QUIRK(0x103c, 0x2239, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
8973 SND_PCI_QUIRK(0x103c, 0x224b, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
8974 SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8975 SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8976 SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8977 SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8978 SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8979 SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8980 SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED),
8981 SND_PCI_QUIRK(0x103c, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY),
8982 SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8983 SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8984 SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8985 SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8986 SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8987 SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8988 SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8989 SND_PCI_QUIRK(0x103c, 0x226e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8990 SND_PCI_QUIRK(0x103c, 0x2271, "HP", ALC286_FIXUP_HP_GPIO_LED),
8991 SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8992 SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC280_FIXUP_HP_DOCK_PINS),
8993 SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8994 SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC280_FIXUP_HP_DOCK_PINS),
8995 SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8996 SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8997 SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8998 SND_PCI_QUIRK(0x103c, 0x228b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8999 SND_PCI_QUIRK(0x103c, 0x228e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9000 SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9001 SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9002 SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9003 SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9004 SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9005 SND_PCI_QUIRK(0x103c, 0x22c5, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9006 SND_PCI_QUIRK(0x103c, 0x22c7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9007 SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9008 SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9009 SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC280_FIXUP_HP_9480M),
9010 SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9011 SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9012 SND_PCI_QUIRK(0x103c, 0x2334, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9013 SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9014 SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9015 SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9016 SND_PCI_QUIRK(0x103c, 0x802e, "HP Z240 SFF", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9017 SND_PCI_QUIRK(0x103c, 0x802f, "HP Z240", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9018 SND_PCI_QUIRK(0x103c, 0x8077, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
9019 SND_PCI_QUIRK(0x103c, 0x8158, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
9020 SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9021 SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC),
9022 SND_PCI_QUIRK(0x103c, 0x827e, "HP x360", ALC295_FIXUP_HP_X360),
9023 SND_PCI_QUIRK(0x103c, 0x827f, "HP x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9024 SND_PCI_QUIRK(0x103c, 0x82bf, "HP G3 mini", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9025 SND_PCI_QUIRK(0x103c, 0x82c0, "HP G3 mini premium", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9026 SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9027 SND_PCI_QUIRK(0x103c, 0x841c, "HP Pavilion 15-CK0xx", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9028 SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9029 SND_PCI_QUIRK(0x103c, 0x84da, "HP OMEN dc0019-ur", ALC295_FIXUP_HP_OMEN),
9030 SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9031 SND_PCI_QUIRK(0x103c, 0x8519, "HP Spectre x360 15-df0xxx", ALC285_FIXUP_HP_SPECTRE_X360),
9032 SND_PCI_QUIRK(0x103c, 0x860f, "HP ZBook 15 G6", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9033 SND_PCI_QUIRK(0x103c, 0x861f, "HP Elite Dragonfly G1", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9034 SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED),
9035 SND_PCI_QUIRK(0x103c, 0x86c7, "HP Envy AiO 32", ALC274_FIXUP_HP_ENVY_GPIO),
9036 SND_PCI_QUIRK(0x103c, 0x8716, "HP Elite Dragonfly G2 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9037 SND_PCI_QUIRK(0x103c, 0x8720, "HP EliteBook x360 1040 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9038 SND_PCI_QUIRK(0x103c, 0x8724, "HP EliteBook 850 G7", ALC285_FIXUP_HP_GPIO_LED),
9039 SND_PCI_QUIRK(0x103c, 0x8728, "HP EliteBook 840 G7", ALC285_FIXUP_HP_GPIO_LED),
9040 SND_PCI_QUIRK(0x103c, 0x8729, "HP", ALC285_FIXUP_HP_GPIO_LED),
9041 SND_PCI_QUIRK(0x103c, 0x8730, "HP ProBook 445 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9042 SND_PCI_QUIRK(0x103c, 0x8735, "HP ProBook 435 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9043 SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9044 SND_PCI_QUIRK(0x103c, 0x8760, "HP", ALC285_FIXUP_HP_MUTE_LED),
9045 SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED),
9046 SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED),
9047 SND_PCI_QUIRK(0x103c, 0x8780, "HP ZBook Fury 17 G7 Mobile Workstation",
9048 ALC285_FIXUP_HP_GPIO_AMP_INIT),
9049 SND_PCI_QUIRK(0x103c, 0x8783, "HP ZBook Fury 15 G7 Mobile Workstation",
9050 ALC285_FIXUP_HP_GPIO_AMP_INIT),
9051 SND_PCI_QUIRK(0x103c, 0x8788, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
9052 SND_PCI_QUIRK(0x103c, 0x87c8, "HP", ALC287_FIXUP_HP_GPIO_LED),
9053 SND_PCI_QUIRK(0x103c, 0x87e5, "HP ProBook 440 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9054 SND_PCI_QUIRK(0x103c, 0x87e7, "HP ProBook 450 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9055 SND_PCI_QUIRK(0x103c, 0x87f1, "HP ProBook 630 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9056 SND_PCI_QUIRK(0x103c, 0x87f2, "HP ProBook 640 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9057 SND_PCI_QUIRK(0x103c, 0x87f4, "HP", ALC287_FIXUP_HP_GPIO_LED),
9058 SND_PCI_QUIRK(0x103c, 0x87f5, "HP", ALC287_FIXUP_HP_GPIO_LED),
9059 SND_PCI_QUIRK(0x103c, 0x87f6, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
9060 SND_PCI_QUIRK(0x103c, 0x87f7, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
9061 SND_PCI_QUIRK(0x103c, 0x8805, "HP ProBook 650 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9062 SND_PCI_QUIRK(0x103c, 0x880d, "HP EliteBook 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9063 SND_PCI_QUIRK(0x103c, 0x8811, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
9064 SND_PCI_QUIRK(0x103c, 0x8812, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
9065 SND_PCI_QUIRK(0x103c, 0x8846, "HP EliteBook 850 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9066 SND_PCI_QUIRK(0x103c, 0x8847, "HP EliteBook x360 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9067 SND_PCI_QUIRK(0x103c, 0x884b, "HP EliteBook 840 Aero G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9068 SND_PCI_QUIRK(0x103c, 0x884c, "HP EliteBook 840 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9069 SND_PCI_QUIRK(0x103c, 0x8862, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST),
9070 SND_PCI_QUIRK(0x103c, 0x8863, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST),
9071 SND_PCI_QUIRK(0x103c, 0x886d, "HP ZBook Fury 17.3 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9072 SND_PCI_QUIRK(0x103c, 0x8870, "HP ZBook Fury 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9073 SND_PCI_QUIRK(0x103c, 0x8873, "HP ZBook Studio 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9074 SND_PCI_QUIRK(0x103c, 0x888d, "HP ZBook Power 15.6 inch G8 Mobile Workstation PC", ALC236_FIXUP_HP_GPIO_LED),
9075 SND_PCI_QUIRK(0x103c, 0x8895, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED),
9076 SND_PCI_QUIRK(0x103c, 0x8896, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_MUTE_LED),
9077 SND_PCI_QUIRK(0x103c, 0x8898, "HP EliteBook 845 G8 Notebook PC", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),
9078 SND_PCI_QUIRK(0x103c, 0x88d0, "HP Pavilion 15-eh1xxx (mainboard 88D0)", ALC287_FIXUP_HP_GPIO_LED),
9079 SND_PCI_QUIRK(0x103c, 0x896e, "HP EliteBook x360 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9080 SND_PCI_QUIRK(0x103c, 0x8971, "HP EliteBook 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9081 SND_PCI_QUIRK(0x103c, 0x8972, "HP EliteBook 840 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9082 SND_PCI_QUIRK(0x103c, 0x8973, "HP EliteBook 860 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9083 SND_PCI_QUIRK(0x103c, 0x8974, "HP EliteBook 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9084 SND_PCI_QUIRK(0x103c, 0x8975, "HP EliteBook x360 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9085 SND_PCI_QUIRK(0x103c, 0x8981, "HP Elite Dragonfly G3", ALC245_FIXUP_CS35L41_SPI_4),
9086 SND_PCI_QUIRK(0x103c, 0x898e, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2),
9087 SND_PCI_QUIRK(0x103c, 0x898f, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2),
9088 SND_PCI_QUIRK(0x103c, 0x8991, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9089 SND_PCI_QUIRK(0x103c, 0x8992, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2),
9090 SND_PCI_QUIRK(0x103c, 0x8994, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9091 SND_PCI_QUIRK(0x103c, 0x8995, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2),
9092 SND_PCI_QUIRK(0x103c, 0x89a4, "HP ProBook 440 G9", ALC236_FIXUP_HP_GPIO_LED),
9093 SND_PCI_QUIRK(0x103c, 0x89a6, "HP ProBook 450 G9", ALC236_FIXUP_HP_GPIO_LED),
9094 SND_PCI_QUIRK(0x103c, 0x89aa, "HP EliteBook 630 G9", ALC236_FIXUP_HP_GPIO_LED),
9095 SND_PCI_QUIRK(0x103c, 0x89ac, "HP EliteBook 640 G9", ALC236_FIXUP_HP_GPIO_LED),
9096 SND_PCI_QUIRK(0x103c, 0x89ae, "HP EliteBook 650 G9", ALC236_FIXUP_HP_GPIO_LED),
9097 SND_PCI_QUIRK(0x103c, 0x89c3, "Zbook Studio G9", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
9098 SND_PCI_QUIRK(0x103c, 0x89c6, "Zbook Fury 17 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9099 SND_PCI_QUIRK(0x103c, 0x89ca, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9100 SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
9101 SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
9102 SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9103 SND_PCI_QUIRK(0x1043, 0x10a1, "ASUS UX391UA", ALC294_FIXUP_ASUS_SPK),
9104 SND_PCI_QUIRK(0x1043, 0x10c0, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
9105 SND_PCI_QUIRK(0x1043, 0x10d0, "ASUS X540LA/X540LJ", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
9106 SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9107 SND_PCI_QUIRK(0x1043, 0x11c0, "ASUS X556UR", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
9108 SND_PCI_QUIRK(0x1043, 0x125e, "ASUS Q524UQK", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
9109 SND_PCI_QUIRK(0x1043, 0x1271, "ASUS X430UN", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
9110 SND_PCI_QUIRK(0x1043, 0x1290, "ASUS X441SA", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
9111 SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
9112 SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),
9113 SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC),
9114 SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
9115 SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
9116 SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
9117 SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
9118 SND_PCI_QUIRK(0x1043, 0x1740, "ASUS UX430UA", ALC295_FIXUP_ASUS_DACS),
9119 SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_DUAL_SPK),
9120 SND_PCI_QUIRK(0x1043, 0x1662, "ASUS GV301QH", ALC294_FIXUP_ASUS_DUAL_SPK),
9121 SND_PCI_QUIRK(0x1043, 0x1881, "ASUS Zephyrus S/M", ALC294_FIXUP_ASUS_GX502_PINS),
9122 SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC),
9123 SND_PCI_QUIRK(0x1043, 0x18f1, "Asus FX505DT", ALC256_FIXUP_ASUS_HEADSET_MIC),
9124 SND_PCI_QUIRK(0x1043, 0x194e, "ASUS UX563FD", ALC294_FIXUP_ASUS_HPE),
9125 SND_PCI_QUIRK(0x1043, 0x1970, "ASUS UX550VE", ALC289_FIXUP_ASUS_GA401),
9126 SND_PCI_QUIRK(0x1043, 0x1982, "ASUS B1400CEPE", ALC256_FIXUP_ASUS_HPE),
9127 SND_PCI_QUIRK(0x1043, 0x19ce, "ASUS B9450FA", ALC294_FIXUP_ASUS_HPE),
9128 SND_PCI_QUIRK(0x1043, 0x19e1, "ASUS UX581LV", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE),
9129 SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
9130 SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC),
9131 SND_PCI_QUIRK(0x1043, 0x1b11, "ASUS UX431DA", ALC294_FIXUP_ASUS_COEF_1B),
9132 SND_PCI_QUIRK(0x1043, 0x1b13, "Asus U41SV", ALC269_FIXUP_INV_DMIC),
9133 SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
9134 SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9135 SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
9136 SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE),
9137 SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502),
9138 SND_PCI_QUIRK(0x1043, 0x1e51, "ASUS Zephyrus M15", ALC294_FIXUP_ASUS_GU502_PINS),
9139 SND_PCI_QUIRK(0x1043, 0x1e8e, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA401),
9140 SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401),
9141 SND_PCI_QUIRK(0x1043, 0x1d42, "ASUS Zephyrus G14 2022", ALC289_FIXUP_ASUS_GA401),
9142 SND_PCI_QUIRK(0x1043, 0x16b2, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),
9143 SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
9144 SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
9145 SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
9146 SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
9147 SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
9148 SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
9149 SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
9150 SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
9151 SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
9152 SND_PCI_QUIRK(0x104d, 0x9099, "Sony VAIO S13", ALC275_FIXUP_SONY_DISABLE_AAMIX),
9153 SND_PCI_QUIRK(0x104d, 0x90b5, "Sony VAIO Pro 11", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
9154 SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
9155 SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),
9156 SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT),
9157 SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN),
9158 SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC),
9159 SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN),
9160 SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),
9161 SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE),
9162 SND_PCI_QUIRK(0x10ec, 0x118c, "Medion EE4254 MD62100", ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE),
9163 SND_PCI_QUIRK(0x10ec, 0x1230, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
9164 SND_PCI_QUIRK(0x10ec, 0x1252, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
9165 SND_PCI_QUIRK(0x10ec, 0x1254, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
9166 SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-SZ6", ALC269_FIXUP_HEADSET_MODE),
9167 SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
9168 SND_PCI_QUIRK(0x144d, 0xc169, "Samsung Notebook 9 Pen (NP930SBE-K01US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
9169 SND_PCI_QUIRK(0x144d, 0xc176, "Samsung Notebook 9 Pro (NP930MBE-K04US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
9170 SND_PCI_QUIRK(0x144d, 0xc189, "Samsung Galaxy Flex Book (NT950QCG-X716)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
9171 SND_PCI_QUIRK(0x144d, 0xc18a, "Samsung Galaxy Book Ion (NP930XCJ-K01US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
9172 SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
9173 SND_PCI_QUIRK(0x144d, 0xc812, "Samsung Notebook Pen S (NT950SBE-X58)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
9174 SND_PCI_QUIRK(0x144d, 0xc830, "Samsung Galaxy Book Ion (NT950XCJ-X716A)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
9175 SND_PCI_QUIRK(0x144d, 0xc832, "Samsung Galaxy Book Flex Alpha (NP730QCJ)", ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
9176 SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
9177 SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),
9178 SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC),
9179 SND_PCI_QUIRK(0x152d, 0x1082, "Quanta NL3", ALC269_FIXUP_LIFEBOOK),
9180 SND_PCI_QUIRK(0x1558, 0x1323, "Clevo N130ZU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9181 SND_PCI_QUIRK(0x1558, 0x1325, "Clevo N15[01][CW]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9182 SND_PCI_QUIRK(0x1558, 0x1401, "Clevo L140[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9183 SND_PCI_QUIRK(0x1558, 0x1403, "Clevo N140CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9184 SND_PCI_QUIRK(0x1558, 0x1404, "Clevo N150CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9185 SND_PCI_QUIRK(0x1558, 0x14a1, "Clevo L141MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9186 SND_PCI_QUIRK(0x1558, 0x4018, "Clevo NV40M[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9187 SND_PCI_QUIRK(0x1558, 0x4019, "Clevo NV40MZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9188 SND_PCI_QUIRK(0x1558, 0x4020, "Clevo NV40MB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9189 SND_PCI_QUIRK(0x1558, 0x40a1, "Clevo NL40GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9190 SND_PCI_QUIRK(0x1558, 0x40c1, "Clevo NL40[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9191 SND_PCI_QUIRK(0x1558, 0x40d1, "Clevo NL41DU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9192 SND_PCI_QUIRK(0x1558, 0x5015, "Clevo NH5[58]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9193 SND_PCI_QUIRK(0x1558, 0x5017, "Clevo NH7[79]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9194 SND_PCI_QUIRK(0x1558, 0x50a3, "Clevo NJ51GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9195 SND_PCI_QUIRK(0x1558, 0x50b3, "Clevo NK50S[BEZ]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9196 SND_PCI_QUIRK(0x1558, 0x50b6, "Clevo NK50S5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9197 SND_PCI_QUIRK(0x1558, 0x50b8, "Clevo NK50SZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9198 SND_PCI_QUIRK(0x1558, 0x50d5, "Clevo NP50D5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9199 SND_PCI_QUIRK(0x1558, 0x50e1, "Clevo NH5[58]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9200 SND_PCI_QUIRK(0x1558, 0x50e2, "Clevo NH7[79]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9201 SND_PCI_QUIRK(0x1558, 0x50f0, "Clevo NH50A[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9202 SND_PCI_QUIRK(0x1558, 0x50f2, "Clevo NH50E[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9203 SND_PCI_QUIRK(0x1558, 0x50f3, "Clevo NH58DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9204 SND_PCI_QUIRK(0x1558, 0x50f5, "Clevo NH55EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9205 SND_PCI_QUIRK(0x1558, 0x50f6, "Clevo NH55DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9206 SND_PCI_QUIRK(0x1558, 0x5101, "Clevo S510WU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9207 SND_PCI_QUIRK(0x1558, 0x5157, "Clevo W517GU1", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9208 SND_PCI_QUIRK(0x1558, 0x51a1, "Clevo NS50MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9209 SND_PCI_QUIRK(0x1558, 0x70a1, "Clevo NB70T[HJK]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9210 SND_PCI_QUIRK(0x1558, 0x70b3, "Clevo NK70SB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9211 SND_PCI_QUIRK(0x1558, 0x70f2, "Clevo NH79EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9212 SND_PCI_QUIRK(0x1558, 0x70f3, "Clevo NH77DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9213 SND_PCI_QUIRK(0x1558, 0x70f4, "Clevo NH77EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9214 SND_PCI_QUIRK(0x1558, 0x70f6, "Clevo NH77DPQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9215 SND_PCI_QUIRK(0x1558, 0x8228, "Clevo NR40BU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9216 SND_PCI_QUIRK(0x1558, 0x8520, "Clevo NH50D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9217 SND_PCI_QUIRK(0x1558, 0x8521, "Clevo NH77D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9218 SND_PCI_QUIRK(0x1558, 0x8535, "Clevo NH50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9219 SND_PCI_QUIRK(0x1558, 0x8536, "Clevo NH79D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9220 SND_PCI_QUIRK(0x1558, 0x8550, "Clevo NH[57][0-9][ER][ACDH]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9221 SND_PCI_QUIRK(0x1558, 0x8551, "Clevo NH[57][0-9][ER][ACDH]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9222 SND_PCI_QUIRK(0x1558, 0x8560, "Clevo NH[57][0-9][ER][ACDH]Q", ALC269_FIXUP_HEADSET_MIC),
9223 SND_PCI_QUIRK(0x1558, 0x8561, "Clevo NH[57][0-9][ER][ACDH]Q", ALC269_FIXUP_HEADSET_MIC),
9224 SND_PCI_QUIRK(0x1558, 0x8562, "Clevo NH[57][0-9]RZ[Q]", ALC269_FIXUP_DMIC),
9225 SND_PCI_QUIRK(0x1558, 0x8668, "Clevo NP50B[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9226 SND_PCI_QUIRK(0x1558, 0x866d, "Clevo NP5[05]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9227 SND_PCI_QUIRK(0x1558, 0x867c, "Clevo NP7[01]PNP", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9228 SND_PCI_QUIRK(0x1558, 0x867d, "Clevo NP7[01]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9229 SND_PCI_QUIRK(0x1558, 0x8680, "Clevo NJ50LU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9230 SND_PCI_QUIRK(0x1558, 0x8686, "Clevo NH50[CZ]U", ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME),
9231 SND_PCI_QUIRK(0x1558, 0x8a20, "Clevo NH55DCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9232 SND_PCI_QUIRK(0x1558, 0x8a51, "Clevo NH70RCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9233 SND_PCI_QUIRK(0x1558, 0x8d50, "Clevo NH55RCQ-M", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9234 SND_PCI_QUIRK(0x1558, 0x951d, "Clevo N950T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9235 SND_PCI_QUIRK(0x1558, 0x9600, "Clevo N960K[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9236 SND_PCI_QUIRK(0x1558, 0x961d, "Clevo N960S[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9237 SND_PCI_QUIRK(0x1558, 0x971d, "Clevo N970T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9238 SND_PCI_QUIRK(0x1558, 0xa500, "Clevo NL5[03]RU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9239 SND_PCI_QUIRK(0x1558, 0xa600, "Clevo NL50NU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9240 SND_PCI_QUIRK(0x1558, 0xb018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9241 SND_PCI_QUIRK(0x1558, 0xb019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9242 SND_PCI_QUIRK(0x1558, 0xb022, "Clevo NH77D[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9243 SND_PCI_QUIRK(0x1558, 0xc018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9244 SND_PCI_QUIRK(0x1558, 0xc019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9245 SND_PCI_QUIRK(0x1558, 0xc022, "Clevo NH77[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9246 SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
9247 SND_PCI_QUIRK(0x17aa, 0x1048, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),
9248 SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
9249 SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
9250 SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
9251 SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
9252 SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
9253 SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),
9254 SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST),
9255 SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK),
9256 SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),
9257 SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK),
9258 SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK),
9259 SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440),
9260 SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK),
9261 SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK),
9262 SND_PCI_QUIRK(0x17aa, 0x2211, "Thinkpad W541", ALC292_FIXUP_TPT440_DOCK),
9263 SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK),
9264 SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK),
9265 SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9266 SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK),
9267 SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK),
9268 SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK),
9269 SND_PCI_QUIRK(0x17aa, 0x222d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9270 SND_PCI_QUIRK(0x17aa, 0x222e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9271 SND_PCI_QUIRK(0x17aa, 0x2231, "Thinkpad T560", ALC292_FIXUP_TPT460),
9272 SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460),
9273 SND_PCI_QUIRK(0x17aa, 0x2245, "Thinkpad T470", ALC298_FIXUP_TPT470_DOCK),
9274 SND_PCI_QUIRK(0x17aa, 0x2246, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9275 SND_PCI_QUIRK(0x17aa, 0x2247, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9276 SND_PCI_QUIRK(0x17aa, 0x2249, "Thinkpad", ALC292_FIXUP_TPT460),
9277 SND_PCI_QUIRK(0x17aa, 0x224b, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9278 SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9279 SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9280 SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9281 SND_PCI_QUIRK(0x17aa, 0x2292, "Thinkpad X1 Carbon 7th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
9282 SND_PCI_QUIRK(0x17aa, 0x22be, "Thinkpad X1 Carbon 8th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
9283 SND_PCI_QUIRK(0x17aa, 0x22c1, "Thinkpad P1 Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
9284 SND_PCI_QUIRK(0x17aa, 0x22c2, "Thinkpad X1 Extreme Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
9285 SND_PCI_QUIRK(0x17aa, 0x22f1, "Thinkpad", ALC287_FIXUP_CS35L41_I2C_2),
9286 SND_PCI_QUIRK(0x17aa, 0x22f2, "Thinkpad", ALC287_FIXUP_CS35L41_I2C_2),
9287 SND_PCI_QUIRK(0x17aa, 0x22f3, "Thinkpad", ALC287_FIXUP_CS35L41_I2C_2),
9288 SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
9289 SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
9290 SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
9291 SND_PCI_QUIRK(0x17aa, 0x3111, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
9292 SND_PCI_QUIRK(0x17aa, 0x312a, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
9293 SND_PCI_QUIRK(0x17aa, 0x312f, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
9294 SND_PCI_QUIRK(0x17aa, 0x313c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
9295 SND_PCI_QUIRK(0x17aa, 0x3151, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
9296 SND_PCI_QUIRK(0x17aa, 0x3176, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
9297 SND_PCI_QUIRK(0x17aa, 0x3178, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
9298 SND_PCI_QUIRK(0x17aa, 0x31af, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),
9299 SND_PCI_QUIRK(0x17aa, 0x3813, "Legion 7i 15IMHG05", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
9300 SND_PCI_QUIRK(0x17aa, 0x3818, "Lenovo C940", ALC298_FIXUP_LENOVO_SPK_VOLUME),
9301 SND_PCI_QUIRK(0x17aa, 0x3819, "Lenovo 13s Gen2 ITL", ALC287_FIXUP_13S_GEN2_SPEAKERS),
9302 SND_PCI_QUIRK(0x17aa, 0x3820, "Yoga Duet 7 13ITL6", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
9303 SND_PCI_QUIRK(0x17aa, 0x3824, "Legion Y9000X 2020", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),
9304 SND_PCI_QUIRK(0x17aa, 0x3827, "Ideapad S740", ALC285_FIXUP_IDEAPAD_S740_COEF),
9305 SND_PCI_QUIRK(0x17aa, 0x3834, "Lenovo IdeaPad Slim 9i 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
9306 SND_PCI_QUIRK(0x17aa, 0x383d, "Legion Y9000X 2019", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),
9307 SND_PCI_QUIRK(0x17aa, 0x3843, "Yoga 9i", ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP),
9308 SND_PCI_QUIRK(0x17aa, 0x3847, "Legion 7 16ACHG6", ALC287_FIXUP_LEGION_16ACHG6),
9309 SND_PCI_QUIRK(0x17aa, 0x384a, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
9310 SND_PCI_QUIRK(0x17aa, 0x3852, "Lenovo Yoga 7 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
9311 SND_PCI_QUIRK(0x17aa, 0x3853, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
9312 SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
9313 SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
9314 SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
9315 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
9316 SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9317 SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC),
9318 SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK),
9319 SND_PCI_QUIRK(0x17aa, 0x5026, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9320 SND_PCI_QUIRK(0x17aa, 0x5034, "Thinkpad T450", ALC292_FIXUP_TPT440_DOCK),
9321 SND_PCI_QUIRK(0x17aa, 0x5036, "Thinkpad T450s", ALC292_FIXUP_TPT440_DOCK),
9322 SND_PCI_QUIRK(0x17aa, 0x503c, "Thinkpad L450", ALC292_FIXUP_TPT440_DOCK),
9323 SND_PCI_QUIRK(0x17aa, 0x504a, "ThinkPad X260", ALC292_FIXUP_TPT440_DOCK),
9324 SND_PCI_QUIRK(0x17aa, 0x504b, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
9325 SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460),
9326 SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460),
9327 SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460),
9328 SND_PCI_QUIRK(0x17aa, 0x505d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9329 SND_PCI_QUIRK(0x17aa, 0x505f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9330 SND_PCI_QUIRK(0x17aa, 0x5062, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9331 SND_PCI_QUIRK(0x17aa, 0x508b, "Thinkpad X12 Gen 1", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
9332 SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9333 SND_PCI_QUIRK(0x17aa, 0x511e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9334 SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9335 SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
9336 SND_PCI_QUIRK(0x1849, 0x1233, "ASRock NUC Box 1100", ALC233_FIXUP_NO_AUDIO_JACK),
9337 SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS),
9338 SND_PCI_QUIRK(0x1b35, 0x1235, "CZC B20", ALC269_FIXUP_CZC_B20),
9339 SND_PCI_QUIRK(0x1b35, 0x1236, "CZC TMI", ALC269_FIXUP_CZC_TMI),
9340 SND_PCI_QUIRK(0x1b35, 0x1237, "CZC L101", ALC269_FIXUP_CZC_L101),
9341 SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2),
9342 SND_PCI_QUIRK(0x1c06, 0x2013, "Lemote A1802", ALC269_FIXUP_LEMOTE_A1802),
9343 SND_PCI_QUIRK(0x1c06, 0x2015, "Lemote A190X", ALC269_FIXUP_LEMOTE_A190X),
9344 SND_PCI_QUIRK(0x1d05, 0x1132, "TongFang PHxTxX1", ALC256_FIXUP_SET_COEF_DEFAULTS),
9345 SND_PCI_QUIRK(0x1d05, 0x1096, "TongFang GMxMRxx", ALC269_FIXUP_NO_SHUTUP),
9346 SND_PCI_QUIRK(0x1d05, 0x1100, "TongFang GKxNRxx", ALC269_FIXUP_NO_SHUTUP),
9347 SND_PCI_QUIRK(0x1d05, 0x1111, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
9348 SND_PCI_QUIRK(0x1d05, 0x1119, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
9349 SND_PCI_QUIRK(0x1d05, 0x1129, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
9350 SND_PCI_QUIRK(0x1d05, 0x1147, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP),
9351 SND_PCI_QUIRK(0x1d05, 0x115c, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP),
9352 SND_PCI_QUIRK(0x1d05, 0x121b, "TongFang GMxAGxx", ALC269_FIXUP_NO_SHUTUP),
9353 SND_PCI_QUIRK(0x1d72, 0x1602, "RedmiBook", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
9354 SND_PCI_QUIRK(0x1d72, 0x1701, "XiaomiNotebook Pro", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE),
9355 SND_PCI_QUIRK(0x1d72, 0x1901, "RedmiBook 14", ALC256_FIXUP_ASUS_HEADSET_MIC),
9356 SND_PCI_QUIRK(0x1d72, 0x1947, "RedmiBook Air", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
9357 SND_PCI_QUIRK(0x8086, 0x2074, "Intel NUC 8", ALC233_FIXUP_INTEL_NUC8_DMIC),
9358 SND_PCI_QUIRK(0x8086, 0x2080, "Intel NUC 8 Rugged", ALC256_FIXUP_INTEL_NUC8_RUGGED),
9359 SND_PCI_QUIRK(0x8086, 0x2081, "Intel NUC 10", ALC256_FIXUP_INTEL_NUC10),
9360 SND_PCI_QUIRK(0xf111, 0x0001, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
9361
9362#if 0
9363
9364
9365
9366
9367
9368 SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
9369 ALC269_FIXUP_AMIC),
9370 SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC),
9371 SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC),
9372 SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC),
9373 SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC),
9374 SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269_FIXUP_AMIC),
9375 SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269_FIXUP_AMIC),
9376 SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269_FIXUP_AMIC),
9377 SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_FIXUP_AMIC),
9378 SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269_FIXUP_AMIC),
9379 SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_FIXUP_AMIC),
9380 SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_FIXUP_AMIC),
9381 SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_FIXUP_AMIC),
9382 SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_FIXUP_AMIC),
9383 SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_FIXUP_AMIC),
9384 SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_FIXUP_AMIC),
9385 SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_FIXUP_AMIC),
9386 SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_FIXUP_AMIC),
9387 SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_FIXUP_AMIC),
9388 SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_FIXUP_AMIC),
9389 SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_FIXUP_AMIC),
9390 SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_FIXUP_AMIC),
9391 SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_FIXUP_AMIC),
9392 SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_FIXUP_AMIC),
9393 SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_FIXUP_AMIC),
9394 SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_FIXUP_AMIC),
9395 SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_FIXUP_AMIC),
9396 SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_FIXUP_AMIC),
9397 SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_FIXUP_AMIC),
9398 SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_FIXUP_AMIC),
9399 SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_FIXUP_AMIC),
9400 SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_FIXUP_AMIC),
9401 SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_FIXUP_AMIC),
9402 SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_FIXUP_AMIC),
9403 SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_FIXUP_AMIC),
9404 SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_FIXUP_DMIC),
9405 SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_FIXUP_AMIC),
9406 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_AMIC),
9407 SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_FIXUP_DMIC),
9408 SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_FIXUP_DMIC),
9409#endif
9410 {}
9411};
9412
9413static const struct snd_pci_quirk alc269_fixup_vendor_tbl[] = {
9414 SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
9415 SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED),
9416 SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
9417 SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", ALC269_FIXUP_THINKPAD_ACPI),
9418 SND_PCI_QUIRK_VENDOR(0x19e5, "Huawei Matebook", ALC255_FIXUP_MIC_MUTE_LED),
9419 {}
9420};
9421
9422static const struct hda_model_fixup alc269_fixup_models[] = {
9423 {.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"},
9424 {.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"},
9425 {.id = ALC269_FIXUP_STEREO_DMIC, .name = "alc269-dmic"},
9426 {.id = ALC271_FIXUP_DMIC, .name = "alc271-dmic"},
9427 {.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"},
9428 {.id = ALC269_FIXUP_HEADSET_MIC, .name = "headset-mic"},
9429 {.id = ALC269_FIXUP_HEADSET_MODE, .name = "headset-mode"},
9430 {.id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, .name = "headset-mode-no-hp-mic"},
9431 {.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
9432 {.id = ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST, .name = "lenovo-dock-limit-boost"},
9433 {.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
9434 {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic1-led"},
9435 {.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
9436 {.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
9437 {.id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, .name = "dell-headset3"},
9438 {.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, .name = "dell-headset4"},
9439 {.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},
9440 {.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"},
9441 {.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
9442 {.id = ALC292_FIXUP_TPT440, .name = "tpt440"},
9443 {.id = ALC292_FIXUP_TPT460, .name = "tpt460"},
9444 {.id = ALC298_FIXUP_TPT470_DOCK_FIX, .name = "tpt470-dock-fix"},
9445 {.id = ALC298_FIXUP_TPT470_DOCK, .name = "tpt470-dock"},
9446 {.id = ALC233_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
9447 {.id = ALC700_FIXUP_INTEL_REFERENCE, .name = "alc700-ref"},
9448 {.id = ALC269_FIXUP_SONY_VAIO, .name = "vaio"},
9449 {.id = ALC269_FIXUP_DELL_M101Z, .name = "dell-m101z"},
9450 {.id = ALC269_FIXUP_ASUS_G73JW, .name = "asus-g73jw"},
9451 {.id = ALC269_FIXUP_LENOVO_EAPD, .name = "lenovo-eapd"},
9452 {.id = ALC275_FIXUP_SONY_HWEQ, .name = "sony-hweq"},
9453 {.id = ALC269_FIXUP_PCM_44K, .name = "pcm44k"},
9454 {.id = ALC269_FIXUP_LIFEBOOK, .name = "lifebook"},
9455 {.id = ALC269_FIXUP_LIFEBOOK_EXTMIC, .name = "lifebook-extmic"},
9456 {.id = ALC269_FIXUP_LIFEBOOK_HP_PIN, .name = "lifebook-hp-pin"},
9457 {.id = ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC, .name = "lifebook-u7x7"},
9458 {.id = ALC269VB_FIXUP_AMIC, .name = "alc269vb-amic"},
9459 {.id = ALC269VB_FIXUP_DMIC, .name = "alc269vb-dmic"},
9460 {.id = ALC269_FIXUP_HP_MUTE_LED_MIC1, .name = "hp-mute-led-mic1"},
9461 {.id = ALC269_FIXUP_HP_MUTE_LED_MIC2, .name = "hp-mute-led-mic2"},
9462 {.id = ALC269_FIXUP_HP_MUTE_LED_MIC3, .name = "hp-mute-led-mic3"},
9463 {.id = ALC269_FIXUP_HP_GPIO_MIC1_LED, .name = "hp-gpio-mic1"},
9464 {.id = ALC269_FIXUP_HP_LINE1_MIC1_LED, .name = "hp-line1-mic1"},
9465 {.id = ALC269_FIXUP_NO_SHUTUP, .name = "noshutup"},
9466 {.id = ALC286_FIXUP_SONY_MIC_NO_PRESENCE, .name = "sony-nomic"},
9467 {.id = ALC269_FIXUP_ASPIRE_HEADSET_MIC, .name = "aspire-headset-mic"},
9468 {.id = ALC269_FIXUP_ASUS_X101, .name = "asus-x101"},
9469 {.id = ALC271_FIXUP_HP_GATE_MIC_JACK, .name = "acer-ao7xx"},
9470 {.id = ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572, .name = "acer-aspire-e1"},
9471 {.id = ALC269_FIXUP_ACER_AC700, .name = "acer-ac700"},
9472 {.id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST, .name = "limit-mic-boost"},
9473 {.id = ALC269VB_FIXUP_ASUS_ZENBOOK, .name = "asus-zenbook"},
9474 {.id = ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A, .name = "asus-zenbook-ux31a"},
9475 {.id = ALC269VB_FIXUP_ORDISSIMO_EVE2, .name = "ordissimo"},
9476 {.id = ALC282_FIXUP_ASUS_TX300, .name = "asus-tx300"},
9477 {.id = ALC283_FIXUP_INT_MIC, .name = "alc283-int-mic"},
9478 {.id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK, .name = "mono-speakers"},
9479 {.id = ALC290_FIXUP_SUBWOOFER_HSJACK, .name = "alc290-subwoofer"},
9480 {.id = ALC269_FIXUP_THINKPAD_ACPI, .name = "thinkpad"},
9481 {.id = ALC269_FIXUP_DMIC_THINKPAD_ACPI, .name = "dmic-thinkpad"},
9482 {.id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE, .name = "alc255-acer"},
9483 {.id = ALC255_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc255-asus"},
9484 {.id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc255-dell1"},
9485 {.id = ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "alc255-dell2"},
9486 {.id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc293-dell1"},
9487 {.id = ALC283_FIXUP_HEADSET_MIC, .name = "alc283-headset"},
9488 {.id = ALC255_FIXUP_MIC_MUTE_LED, .name = "alc255-dell-mute"},
9489 {.id = ALC282_FIXUP_ASPIRE_V5_PINS, .name = "aspire-v5"},
9490 {.id = ALC269VB_FIXUP_ASPIRE_E1_COEF, .name = "aspire-e1-coef"},
9491 {.id = ALC280_FIXUP_HP_GPIO4, .name = "hp-gpio4"},
9492 {.id = ALC286_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
9493 {.id = ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY, .name = "hp-gpio2-hotkey"},
9494 {.id = ALC280_FIXUP_HP_DOCK_PINS, .name = "hp-dock-pins"},
9495 {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic"},
9496 {.id = ALC280_FIXUP_HP_9480M, .name = "hp-9480m"},
9497 {.id = ALC288_FIXUP_DELL_HEADSET_MODE, .name = "alc288-dell-headset"},
9498 {.id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc288-dell1"},
9499 {.id = ALC288_FIXUP_DELL_XPS_13, .name = "alc288-dell-xps13"},
9500 {.id = ALC292_FIXUP_DELL_E7X, .name = "dell-e7x"},
9501 {.id = ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK, .name = "alc293-dell"},
9502 {.id = ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc298-dell1"},
9503 {.id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, .name = "alc298-dell-aio"},
9504 {.id = ALC275_FIXUP_DELL_XPS, .name = "alc275-dell-xps"},
9505 {.id = ALC293_FIXUP_LENOVO_SPK_NOISE, .name = "lenovo-spk-noise"},
9506 {.id = ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, .name = "lenovo-hotkey"},
9507 {.id = ALC255_FIXUP_DELL_SPK_NOISE, .name = "dell-spk-noise"},
9508 {.id = ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc225-dell1"},
9509 {.id = ALC295_FIXUP_DISABLE_DAC3, .name = "alc295-disable-dac3"},
9510 {.id = ALC285_FIXUP_SPEAKER2_TO_DAC1, .name = "alc285-speaker2-to-dac1"},
9511 {.id = ALC280_FIXUP_HP_HEADSET_MIC, .name = "alc280-hp-headset"},
9512 {.id = ALC221_FIXUP_HP_FRONT_MIC, .name = "alc221-hp-mic"},
9513 {.id = ALC298_FIXUP_SPK_VOLUME, .name = "alc298-spk-volume"},
9514 {.id = ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER, .name = "dell-inspiron-7559"},
9515 {.id = ALC269_FIXUP_ATIV_BOOK_8, .name = "ativ-book"},
9516 {.id = ALC221_FIXUP_HP_MIC_NO_PRESENCE, .name = "alc221-hp-mic"},
9517 {.id = ALC256_FIXUP_ASUS_HEADSET_MODE, .name = "alc256-asus-headset"},
9518 {.id = ALC256_FIXUP_ASUS_MIC, .name = "alc256-asus-mic"},
9519 {.id = ALC256_FIXUP_ASUS_AIO_GPIO2, .name = "alc256-asus-aio"},
9520 {.id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc233-asus"},
9521 {.id = ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE, .name = "alc233-eapd"},
9522 {.id = ALC294_FIXUP_LENOVO_MIC_LOCATION, .name = "alc294-lenovo-mic"},
9523 {.id = ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE, .name = "alc225-wyse"},
9524 {.id = ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, .name = "alc274-dell-aio"},
9525 {.id = ALC255_FIXUP_DUMMY_LINEOUT_VERB, .name = "alc255-dummy-lineout"},
9526 {.id = ALC255_FIXUP_DELL_HEADSET_MIC, .name = "alc255-dell-headset"},
9527 {.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"},
9528 {.id = ALC225_FIXUP_HEADSET_JACK, .name = "alc-headset-jack"},
9529 {.id = ALC295_FIXUP_CHROME_BOOK, .name = "alc-chrome-book"},
9530 {.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"},
9531 {.id = ALC298_FIXUP_HUAWEI_MBX_STEREO, .name = "huawei-mbx-stereo"},
9532 {.id = ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, .name = "alc256-medion-headset"},
9533 {.id = ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET, .name = "alc298-samsung-headphone"},
9534 {.id = ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET, .name = "alc256-samsung-headphone"},
9535 {.id = ALC255_FIXUP_XIAOMI_HEADSET_MIC, .name = "alc255-xiaomi-headset"},
9536 {.id = ALC274_FIXUP_HP_MIC, .name = "alc274-hp-mic-detect"},
9537 {.id = ALC245_FIXUP_HP_X360_AMP, .name = "alc245-hp-x360-amp"},
9538 {.id = ALC295_FIXUP_HP_OMEN, .name = "alc295-hp-omen"},
9539 {.id = ALC285_FIXUP_HP_SPECTRE_X360, .name = "alc285-hp-spectre-x360"},
9540 {.id = ALC285_FIXUP_HP_SPECTRE_X360_EB1, .name = "alc285-hp-spectre-x360-eb1"},
9541 {.id = ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP, .name = "alc287-ideapad-bass-spk-amp"},
9542 {.id = ALC623_FIXUP_LENOVO_THINKSTATION_P340, .name = "alc623-lenovo-thinkstation-p340"},
9543 {.id = ALC255_FIXUP_ACER_HEADPHONE_AND_MIC, .name = "alc255-acer-headphone-and-mic"},
9544 {.id = ALC285_FIXUP_HP_GPIO_AMP_INIT, .name = "alc285-hp-amp-init"},
9545 {}
9546};
9547#define ALC225_STANDARD_PINS \
9548 {0x21, 0x04211020}
9549
9550#define ALC256_STANDARD_PINS \
9551 {0x12, 0x90a60140}, \
9552 {0x14, 0x90170110}, \
9553 {0x21, 0x02211020}
9554
9555#define ALC282_STANDARD_PINS \
9556 {0x14, 0x90170110}
9557
9558#define ALC290_STANDARD_PINS \
9559 {0x12, 0x99a30130}
9560
9561#define ALC292_STANDARD_PINS \
9562 {0x14, 0x90170110}, \
9563 {0x15, 0x0221401f}
9564
9565#define ALC295_STANDARD_PINS \
9566 {0x12, 0xb7a60130}, \
9567 {0x14, 0x90170110}, \
9568 {0x21, 0x04211020}
9569
9570#define ALC298_STANDARD_PINS \
9571 {0x12, 0x90a60130}, \
9572 {0x21, 0x03211020}
9573
9574static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
9575 SND_HDA_PIN_QUIRK(0x10ec0221, 0x103c, "HP Workstation", ALC221_FIXUP_HP_HEADSET_MIC,
9576 {0x14, 0x01014020},
9577 {0x17, 0x90170110},
9578 {0x18, 0x02a11030},
9579 {0x19, 0x0181303F},
9580 {0x21, 0x0221102f}),
9581 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1025, "Acer", ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
9582 {0x12, 0x90a601c0},
9583 {0x14, 0x90171120},
9584 {0x21, 0x02211030}),
9585 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
9586 {0x14, 0x90170110},
9587 {0x1b, 0x90a70130},
9588 {0x21, 0x03211020}),
9589 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
9590 {0x1a, 0x90a70130},
9591 {0x1b, 0x90170110},
9592 {0x21, 0x03211020}),
9593 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
9594 ALC225_STANDARD_PINS,
9595 {0x12, 0xb7a60130},
9596 {0x14, 0x901701a0}),
9597 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
9598 ALC225_STANDARD_PINS,
9599 {0x12, 0xb7a60130},
9600 {0x14, 0x901701b0}),
9601 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
9602 ALC225_STANDARD_PINS,
9603 {0x12, 0xb7a60150},
9604 {0x14, 0x901701a0}),
9605 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
9606 ALC225_STANDARD_PINS,
9607 {0x12, 0xb7a60150},
9608 {0x14, 0x901701b0}),
9609 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
9610 ALC225_STANDARD_PINS,
9611 {0x12, 0xb7a60130},
9612 {0x1b, 0x90170110}),
9613 SND_HDA_PIN_QUIRK(0x10ec0233, 0x8086, "Intel NUC Skull Canyon", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
9614 {0x1b, 0x01111010},
9615 {0x1e, 0x01451130},
9616 {0x21, 0x02211020}),
9617 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
9618 {0x12, 0x90a60140},
9619 {0x14, 0x90170110},
9620 {0x19, 0x02a11030},
9621 {0x21, 0x02211020}),
9622 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
9623 {0x14, 0x90170110},
9624 {0x19, 0x02a11030},
9625 {0x1a, 0x02a11040},
9626 {0x1b, 0x01014020},
9627 {0x21, 0x0221101f}),
9628 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
9629 {0x14, 0x90170110},
9630 {0x19, 0x02a11030},
9631 {0x1a, 0x02a11040},
9632 {0x1b, 0x01011020},
9633 {0x21, 0x0221101f}),
9634 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
9635 {0x14, 0x90170110},
9636 {0x19, 0x02a11020},
9637 {0x1a, 0x02a11030},
9638 {0x21, 0x0221101f}),
9639 SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
9640 {0x21, 0x02211010}),
9641 SND_HDA_PIN_QUIRK(0x10ec0236, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
9642 {0x14, 0x90170110},
9643 {0x19, 0x02a11020},
9644 {0x21, 0x02211030}),
9645 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
9646 {0x14, 0x90170110},
9647 {0x21, 0x02211020}),
9648 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9649 {0x14, 0x90170130},
9650 {0x21, 0x02211040}),
9651 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9652 {0x12, 0x90a60140},
9653 {0x14, 0x90170110},
9654 {0x21, 0x02211020}),
9655 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9656 {0x12, 0x90a60160},
9657 {0x14, 0x90170120},
9658 {0x21, 0x02211030}),
9659 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9660 {0x14, 0x90170110},
9661 {0x1b, 0x02011020},
9662 {0x21, 0x0221101f}),
9663 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9664 {0x14, 0x90170110},
9665 {0x1b, 0x01011020},
9666 {0x21, 0x0221101f}),
9667 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9668 {0x14, 0x90170130},
9669 {0x1b, 0x01014020},
9670 {0x21, 0x0221103f}),
9671 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9672 {0x14, 0x90170130},
9673 {0x1b, 0x01011020},
9674 {0x21, 0x0221103f}),
9675 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9676 {0x14, 0x90170130},
9677 {0x1b, 0x02011020},
9678 {0x21, 0x0221103f}),
9679 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9680 {0x14, 0x90170150},
9681 {0x1b, 0x02011020},
9682 {0x21, 0x0221105f}),
9683 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9684 {0x14, 0x90170110},
9685 {0x1b, 0x01014020},
9686 {0x21, 0x0221101f}),
9687 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9688 {0x12, 0x90a60160},
9689 {0x14, 0x90170120},
9690 {0x17, 0x90170140},
9691 {0x21, 0x0321102f}),
9692 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9693 {0x12, 0x90a60160},
9694 {0x14, 0x90170130},
9695 {0x21, 0x02211040}),
9696 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9697 {0x12, 0x90a60160},
9698 {0x14, 0x90170140},
9699 {0x21, 0x02211050}),
9700 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9701 {0x12, 0x90a60170},
9702 {0x14, 0x90170120},
9703 {0x21, 0x02211030}),
9704 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9705 {0x12, 0x90a60170},
9706 {0x14, 0x90170130},
9707 {0x21, 0x02211040}),
9708 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9709 {0x12, 0x90a60170},
9710 {0x14, 0x90171130},
9711 {0x21, 0x02211040}),
9712 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9713 {0x12, 0x90a60170},
9714 {0x14, 0x90170140},
9715 {0x21, 0x02211050}),
9716 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5548", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9717 {0x12, 0x90a60180},
9718 {0x14, 0x90170130},
9719 {0x21, 0x02211040}),
9720 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5565", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9721 {0x12, 0x90a60180},
9722 {0x14, 0x90170120},
9723 {0x21, 0x02211030}),
9724 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9725 {0x1b, 0x01011020},
9726 {0x21, 0x02211010}),
9727 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
9728 {0x14, 0x90170110},
9729 {0x1b, 0x90a70130},
9730 {0x21, 0x04211020}),
9731 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
9732 {0x14, 0x90170110},
9733 {0x1b, 0x90a70130},
9734 {0x21, 0x03211020}),
9735 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
9736 {0x12, 0x90a60130},
9737 {0x14, 0x90170110},
9738 {0x21, 0x03211020}),
9739 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
9740 {0x12, 0x90a60130},
9741 {0x14, 0x90170110},
9742 {0x21, 0x04211020}),
9743 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
9744 {0x1a, 0x90a70130},
9745 {0x1b, 0x90170110},
9746 {0x21, 0x03211020}),
9747 SND_HDA_PIN_QUIRK(0x10ec0256, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
9748 {0x14, 0x90170110},
9749 {0x19, 0x02a11020},
9750 {0x21, 0x0221101f}),
9751 SND_HDA_PIN_QUIRK(0x10ec0274, 0x103c, "HP", ALC274_FIXUP_HP_HEADSET_MIC,
9752 {0x17, 0x90170110},
9753 {0x19, 0x03a11030},
9754 {0x21, 0x03211020}),
9755 SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
9756 {0x12, 0x90a60130},
9757 {0x14, 0x90170110},
9758 {0x15, 0x0421101f},
9759 {0x1a, 0x04a11020}),
9760 SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED,
9761 {0x12, 0x90a60140},
9762 {0x14, 0x90170110},
9763 {0x15, 0x0421101f},
9764 {0x18, 0x02811030},
9765 {0x1a, 0x04a1103f},
9766 {0x1b, 0x02011020}),
9767 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP 15 Touchsmart", ALC269_FIXUP_HP_MUTE_LED_MIC1,
9768 ALC282_STANDARD_PINS,
9769 {0x12, 0x99a30130},
9770 {0x19, 0x03a11020},
9771 {0x21, 0x0321101f}),
9772 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
9773 ALC282_STANDARD_PINS,
9774 {0x12, 0x99a30130},
9775 {0x19, 0x03a11020},
9776 {0x21, 0x03211040}),
9777 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
9778 ALC282_STANDARD_PINS,
9779 {0x12, 0x99a30130},
9780 {0x19, 0x03a11030},
9781 {0x21, 0x03211020}),
9782 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
9783 ALC282_STANDARD_PINS,
9784 {0x12, 0x99a30130},
9785 {0x19, 0x04a11020},
9786 {0x21, 0x0421101f}),
9787 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED,
9788 ALC282_STANDARD_PINS,
9789 {0x12, 0x90a60140},
9790 {0x19, 0x04a11030},
9791 {0x21, 0x04211020}),
9792 SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
9793 ALC282_STANDARD_PINS,
9794 {0x12, 0x90a609c0},
9795 {0x18, 0x03a11830},
9796 {0x19, 0x04a19831},
9797 {0x1a, 0x0481303f},
9798 {0x1b, 0x04211020},
9799 {0x21, 0x0321101f}),
9800 SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
9801 ALC282_STANDARD_PINS,
9802 {0x12, 0x90a60940},
9803 {0x18, 0x03a11830},
9804 {0x19, 0x04a19831},
9805 {0x1a, 0x0481303f},
9806 {0x1b, 0x04211020},
9807 {0x21, 0x0321101f}),
9808 SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
9809 ALC282_STANDARD_PINS,
9810 {0x12, 0x90a60130},
9811 {0x21, 0x0321101f}),
9812 SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
9813 {0x12, 0x90a60160},
9814 {0x14, 0x90170120},
9815 {0x21, 0x02211030}),
9816 SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
9817 ALC282_STANDARD_PINS,
9818 {0x12, 0x90a60130},
9819 {0x19, 0x03a11020},
9820 {0x21, 0x0321101f}),
9821 SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
9822 {0x12, 0x90a60130},
9823 {0x14, 0x90170110},
9824 {0x19, 0x04a11040},
9825 {0x21, 0x04211020}),
9826 SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
9827 {0x14, 0x90170110},
9828 {0x19, 0x04a11040},
9829 {0x1d, 0x40600001},
9830 {0x21, 0x04211020}),
9831 SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
9832 {0x14, 0x90170110},
9833 {0x19, 0x04a11040},
9834 {0x21, 0x04211020}),
9835 SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_HEADSET_JACK,
9836 {0x14, 0x90170110},
9837 {0x17, 0x90170111},
9838 {0x19, 0x03a11030},
9839 {0x21, 0x03211020}),
9840 SND_HDA_PIN_QUIRK(0x10ec0286, 0x1025, "Acer", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
9841 {0x12, 0x90a60130},
9842 {0x17, 0x90170110},
9843 {0x21, 0x02211020}),
9844 SND_HDA_PIN_QUIRK(0x10ec0288, 0x1028, "Dell", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
9845 {0x12, 0x90a60120},
9846 {0x14, 0x90170110},
9847 {0x21, 0x0321101f}),
9848 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
9849 ALC290_STANDARD_PINS,
9850 {0x15, 0x04211040},
9851 {0x18, 0x90170112},
9852 {0x1a, 0x04a11020}),
9853 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
9854 ALC290_STANDARD_PINS,
9855 {0x15, 0x04211040},
9856 {0x18, 0x90170110},
9857 {0x1a, 0x04a11020}),
9858 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
9859 ALC290_STANDARD_PINS,
9860 {0x15, 0x0421101f},
9861 {0x1a, 0x04a11020}),
9862 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
9863 ALC290_STANDARD_PINS,
9864 {0x15, 0x04211020},
9865 {0x1a, 0x04a11040}),
9866 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
9867 ALC290_STANDARD_PINS,
9868 {0x14, 0x90170110},
9869 {0x15, 0x04211020},
9870 {0x1a, 0x04a11040}),
9871 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
9872 ALC290_STANDARD_PINS,
9873 {0x14, 0x90170110},
9874 {0x15, 0x04211020},
9875 {0x1a, 0x04a11020}),
9876 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
9877 ALC290_STANDARD_PINS,
9878 {0x14, 0x90170110},
9879 {0x15, 0x0421101f},
9880 {0x1a, 0x04a11020}),
9881 SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
9882 ALC292_STANDARD_PINS,
9883 {0x12, 0x90a60140},
9884 {0x16, 0x01014020},
9885 {0x19, 0x01a19030}),
9886 SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
9887 ALC292_STANDARD_PINS,
9888 {0x12, 0x90a60140},
9889 {0x16, 0x01014020},
9890 {0x18, 0x02a19031},
9891 {0x19, 0x01a1903e}),
9892 SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
9893 ALC292_STANDARD_PINS,
9894 {0x12, 0x90a60140}),
9895 SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
9896 ALC292_STANDARD_PINS,
9897 {0x13, 0x90a60140},
9898 {0x16, 0x21014020},
9899 {0x19, 0x21a19030}),
9900 SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
9901 ALC292_STANDARD_PINS,
9902 {0x13, 0x90a60140}),
9903 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_HPE,
9904 {0x17, 0x90170110},
9905 {0x21, 0x04211020}),
9906 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_MIC,
9907 {0x14, 0x90170110},
9908 {0x1b, 0x90a70130},
9909 {0x21, 0x04211020}),
9910 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
9911 {0x12, 0x90a60130},
9912 {0x17, 0x90170110},
9913 {0x21, 0x03211020}),
9914 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
9915 {0x12, 0x90a60130},
9916 {0x17, 0x90170110},
9917 {0x21, 0x04211020}),
9918 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
9919 {0x12, 0x90a60130},
9920 {0x17, 0x90170110},
9921 {0x21, 0x03211020}),
9922 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
9923 {0x12, 0x90a60120},
9924 {0x17, 0x90170110},
9925 {0x21, 0x04211030}),
9926 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
9927 {0x12, 0x90a60130},
9928 {0x17, 0x90170110},
9929 {0x21, 0x03211020}),
9930 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
9931 {0x12, 0x90a60130},
9932 {0x17, 0x90170110},
9933 {0x21, 0x03211020}),
9934 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
9935 {0x14, 0x90170110},
9936 {0x21, 0x04211020}),
9937 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
9938 {0x14, 0x90170110},
9939 {0x21, 0x04211030}),
9940 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
9941 ALC295_STANDARD_PINS,
9942 {0x17, 0x21014020},
9943 {0x18, 0x21a19030}),
9944 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
9945 ALC295_STANDARD_PINS,
9946 {0x17, 0x21014040},
9947 {0x18, 0x21a19050}),
9948 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
9949 ALC295_STANDARD_PINS),
9950 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
9951 ALC298_STANDARD_PINS,
9952 {0x17, 0x90170110}),
9953 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
9954 ALC298_STANDARD_PINS,
9955 {0x17, 0x90170140}),
9956 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
9957 ALC298_STANDARD_PINS,
9958 {0x17, 0x90170150}),
9959 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_SPK_VOLUME,
9960 {0x12, 0xb7a60140},
9961 {0x13, 0xb7a60150},
9962 {0x17, 0x90170110},
9963 {0x1a, 0x03011020},
9964 {0x21, 0x03211030}),
9965 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
9966 {0x12, 0xb7a60140},
9967 {0x17, 0x90170110},
9968 {0x1a, 0x03a11030},
9969 {0x21, 0x03211020}),
9970 SND_HDA_PIN_QUIRK(0x10ec0299, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
9971 ALC225_STANDARD_PINS,
9972 {0x12, 0xb7a60130},
9973 {0x17, 0x90170110}),
9974 SND_HDA_PIN_QUIRK(0x10ec0623, 0x17aa, "Lenovo", ALC283_FIXUP_HEADSET_MIC,
9975 {0x14, 0x01014010},
9976 {0x17, 0x90170120},
9977 {0x18, 0x02a11030},
9978 {0x19, 0x02a1103f},
9979 {0x21, 0x0221101f}),
9980 {}
9981};
9982
9983
9984
9985
9986
9987
9988
9989static const struct snd_hda_pin_quirk alc269_fallback_pin_fixup_tbl[] = {
9990 SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
9991 {0x19, 0x40000000},
9992 {0x1b, 0x40000000}),
9993 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9994 {0x19, 0x40000000},
9995 {0x1a, 0x40000000}),
9996 SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9997 {0x19, 0x40000000},
9998 {0x1a, 0x40000000}),
9999 SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
10000 {0x19, 0x40000000},
10001 {0x1a, 0x40000000}),
10002 {}
10003};
10004
10005static void alc269_fill_coef(struct hda_codec *codec)
10006{
10007 struct alc_spec *spec = codec->spec;
10008 int val;
10009
10010 if (spec->codec_variant != ALC269_TYPE_ALC269VB)
10011 return;
10012
10013 if ((alc_get_coef0(codec) & 0x00ff) < 0x015) {
10014 alc_write_coef_idx(codec, 0xf, 0x960b);
10015 alc_write_coef_idx(codec, 0xe, 0x8817);
10016 }
10017
10018 if ((alc_get_coef0(codec) & 0x00ff) == 0x016) {
10019 alc_write_coef_idx(codec, 0xf, 0x960b);
10020 alc_write_coef_idx(codec, 0xe, 0x8814);
10021 }
10022
10023 if ((alc_get_coef0(codec) & 0x00ff) == 0x017) {
10024
10025 alc_update_coef_idx(codec, 0x04, 0, 1<<11);
10026 }
10027
10028 if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {
10029 val = alc_read_coef_idx(codec, 0xd);
10030 if (val != -1 && (val & 0x0c00) >> 10 != 0x1) {
10031
10032 alc_write_coef_idx(codec, 0xd, val | (1<<10));
10033 }
10034 val = alc_read_coef_idx(codec, 0x17);
10035 if (val != -1 && (val & 0x01c0) >> 6 != 0x4) {
10036
10037 alc_write_coef_idx(codec, 0x17, val | (1<<7));
10038 }
10039 }
10040
10041
10042 alc_update_coef_idx(codec, 0x4, 0, 1<<11);
10043}
10044
10045
10046
10047static int patch_alc269(struct hda_codec *codec)
10048{
10049 struct alc_spec *spec;
10050 int err;
10051
10052 err = alc_alloc_spec(codec, 0x0b);
10053 if (err < 0)
10054 return err;
10055
10056 spec = codec->spec;
10057 spec->gen.shared_mic_vref_pin = 0x18;
10058 codec->power_save_node = 0;
10059
10060#ifdef CONFIG_PM
10061 codec->patch_ops.suspend = alc269_suspend;
10062 codec->patch_ops.resume = alc269_resume;
10063#endif
10064 spec->shutup = alc_default_shutup;
10065 spec->init_hook = alc_default_init;
10066
10067 switch (codec->core.vendor_id) {
10068 case 0x10ec0269:
10069 spec->codec_variant = ALC269_TYPE_ALC269VA;
10070 switch (alc_get_coef0(codec) & 0x00f0) {
10071 case 0x0010:
10072 if (codec->bus->pci &&
10073 codec->bus->pci->subsystem_vendor == 0x1025 &&
10074 spec->cdefine.platform_type == 1)
10075 err = alc_codec_rename(codec, "ALC271X");
10076 spec->codec_variant = ALC269_TYPE_ALC269VB;
10077 break;
10078 case 0x0020:
10079 if (codec->bus->pci &&
10080 codec->bus->pci->subsystem_vendor == 0x17aa &&
10081 codec->bus->pci->subsystem_device == 0x21f3)
10082 err = alc_codec_rename(codec, "ALC3202");
10083 spec->codec_variant = ALC269_TYPE_ALC269VC;
10084 break;
10085 case 0x0030:
10086 spec->codec_variant = ALC269_TYPE_ALC269VD;
10087 break;
10088 default:
10089 alc_fix_pll_init(codec, 0x20, 0x04, 15);
10090 }
10091 if (err < 0)
10092 goto error;
10093 spec->shutup = alc269_shutup;
10094 spec->init_hook = alc269_fill_coef;
10095 alc269_fill_coef(codec);
10096 break;
10097
10098 case 0x10ec0280:
10099 case 0x10ec0290:
10100 spec->codec_variant = ALC269_TYPE_ALC280;
10101 break;
10102 case 0x10ec0282:
10103 spec->codec_variant = ALC269_TYPE_ALC282;
10104 spec->shutup = alc282_shutup;
10105 spec->init_hook = alc282_init;
10106 break;
10107 case 0x10ec0233:
10108 case 0x10ec0283:
10109 spec->codec_variant = ALC269_TYPE_ALC283;
10110 spec->shutup = alc283_shutup;
10111 spec->init_hook = alc283_init;
10112 break;
10113 case 0x10ec0284:
10114 case 0x10ec0292:
10115 spec->codec_variant = ALC269_TYPE_ALC284;
10116 break;
10117 case 0x10ec0293:
10118 spec->codec_variant = ALC269_TYPE_ALC293;
10119 break;
10120 case 0x10ec0286:
10121 case 0x10ec0288:
10122 spec->codec_variant = ALC269_TYPE_ALC286;
10123 break;
10124 case 0x10ec0298:
10125 spec->codec_variant = ALC269_TYPE_ALC298;
10126 break;
10127 case 0x10ec0235:
10128 case 0x10ec0255:
10129 spec->codec_variant = ALC269_TYPE_ALC255;
10130 spec->shutup = alc256_shutup;
10131 spec->init_hook = alc256_init;
10132 break;
10133 case 0x10ec0230:
10134 case 0x10ec0236:
10135 case 0x10ec0256:
10136 spec->codec_variant = ALC269_TYPE_ALC256;
10137 spec->shutup = alc256_shutup;
10138 spec->init_hook = alc256_init;
10139 spec->gen.mixer_nid = 0;
10140 break;
10141 case 0x10ec0257:
10142 spec->codec_variant = ALC269_TYPE_ALC257;
10143 spec->shutup = alc256_shutup;
10144 spec->init_hook = alc256_init;
10145 spec->gen.mixer_nid = 0;
10146 break;
10147 case 0x10ec0215:
10148 case 0x10ec0245:
10149 case 0x10ec0285:
10150 case 0x10ec0289:
10151 spec->codec_variant = ALC269_TYPE_ALC215;
10152 spec->shutup = alc225_shutup;
10153 spec->init_hook = alc225_init;
10154 spec->gen.mixer_nid = 0;
10155 break;
10156 case 0x10ec0225:
10157 case 0x10ec0295:
10158 case 0x10ec0299:
10159 spec->codec_variant = ALC269_TYPE_ALC225;
10160 spec->shutup = alc225_shutup;
10161 spec->init_hook = alc225_init;
10162 spec->gen.mixer_nid = 0;
10163 break;
10164 case 0x10ec0287:
10165 spec->codec_variant = ALC269_TYPE_ALC287;
10166 spec->shutup = alc225_shutup;
10167 spec->init_hook = alc225_init;
10168 spec->gen.mixer_nid = 0;
10169 break;
10170 case 0x10ec0234:
10171 case 0x10ec0274:
10172 case 0x10ec0294:
10173 spec->codec_variant = ALC269_TYPE_ALC294;
10174 spec->gen.mixer_nid = 0;
10175 alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3));
10176 spec->init_hook = alc294_init;
10177 break;
10178 case 0x10ec0300:
10179 spec->codec_variant = ALC269_TYPE_ALC300;
10180 spec->gen.mixer_nid = 0;
10181 break;
10182 case 0x10ec0623:
10183 spec->codec_variant = ALC269_TYPE_ALC623;
10184 break;
10185 case 0x10ec0700:
10186 case 0x10ec0701:
10187 case 0x10ec0703:
10188 case 0x10ec0711:
10189 spec->codec_variant = ALC269_TYPE_ALC700;
10190 spec->gen.mixer_nid = 0;
10191 alc_update_coef_idx(codec, 0x4a, 1 << 15, 0);
10192 spec->init_hook = alc294_init;
10193 break;
10194
10195 }
10196
10197 if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) {
10198 spec->has_alc5505_dsp = 1;
10199 spec->init_hook = alc5505_dsp_init;
10200 }
10201
10202 alc_pre_init(codec);
10203
10204 snd_hda_pick_fixup(codec, alc269_fixup_models,
10205 alc269_fixup_tbl, alc269_fixups);
10206
10207
10208
10209
10210 if (codec->fixup_id == ALC282_FIXUP_ASUS_TX300 &&
10211 codec->core.vendor_id == 0x10ec0294) {
10212 codec_dbg(codec, "Clear wrong fixup for ASUS ROG Strix G17\n");
10213 codec->fixup_id = HDA_FIXUP_ID_NOT_SET;
10214 }
10215
10216 snd_hda_pick_pin_fixup(codec, alc269_pin_fixup_tbl, alc269_fixups, true);
10217 snd_hda_pick_pin_fixup(codec, alc269_fallback_pin_fixup_tbl, alc269_fixups, false);
10218 snd_hda_pick_fixup(codec, NULL, alc269_fixup_vendor_tbl,
10219 alc269_fixups);
10220 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
10221
10222 alc_auto_parse_customize_define(codec);
10223
10224 if (has_cdefine_beep(codec))
10225 spec->gen.beep_nid = 0x01;
10226
10227
10228 err = alc269_parse_auto_config(codec);
10229 if (err < 0)
10230 goto error;
10231
10232 if (!spec->gen.no_analog && spec->gen.beep_nid && spec->gen.mixer_nid) {
10233 err = set_beep_amp(spec, spec->gen.mixer_nid, 0x04, HDA_INPUT);
10234 if (err < 0)
10235 goto error;
10236 }
10237
10238 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
10239
10240 return 0;
10241
10242 error:
10243 alc_free(codec);
10244 return err;
10245}
10246
10247
10248
10249
10250
10251static int alc861_parse_auto_config(struct hda_codec *codec)
10252{
10253 static const hda_nid_t alc861_ignore[] = { 0x1d, 0 };
10254 static const hda_nid_t alc861_ssids[] = { 0x0e, 0x0f, 0x0b, 0 };
10255 return alc_parse_auto_config(codec, alc861_ignore, alc861_ssids);
10256}
10257
10258
10259enum {
10260 ALC861_FIXUP_FSC_AMILO_PI1505,
10261 ALC861_FIXUP_AMP_VREF_0F,
10262 ALC861_FIXUP_NO_JACK_DETECT,
10263 ALC861_FIXUP_ASUS_A6RP,
10264 ALC660_FIXUP_ASUS_W7J,
10265};
10266
10267
10268static void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec,
10269 const struct hda_fixup *fix, int action)
10270{
10271 struct alc_spec *spec = codec->spec;
10272 unsigned int val;
10273
10274 if (action != HDA_FIXUP_ACT_INIT)
10275 return;
10276 val = snd_hda_codec_get_pin_target(codec, 0x0f);
10277 if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)))
10278 val |= AC_PINCTL_IN_EN;
10279 val |= AC_PINCTL_VREF_50;
10280 snd_hda_set_pin_ctl(codec, 0x0f, val);
10281 spec->gen.keep_vref_in_automute = 1;
10282}
10283
10284
10285static void alc_fixup_no_jack_detect(struct hda_codec *codec,
10286 const struct hda_fixup *fix, int action)
10287{
10288 if (action == HDA_FIXUP_ACT_PRE_PROBE)
10289 codec->no_jack_detect = 1;
10290}
10291
10292static const struct hda_fixup alc861_fixups[] = {
10293 [ALC861_FIXUP_FSC_AMILO_PI1505] = {
10294 .type = HDA_FIXUP_PINS,
10295 .v.pins = (const struct hda_pintbl[]) {
10296 { 0x0b, 0x0221101f },
10297 { 0x0f, 0x90170310 },
10298 { }
10299 }
10300 },
10301 [ALC861_FIXUP_AMP_VREF_0F] = {
10302 .type = HDA_FIXUP_FUNC,
10303 .v.func = alc861_fixup_asus_amp_vref_0f,
10304 },
10305 [ALC861_FIXUP_NO_JACK_DETECT] = {
10306 .type = HDA_FIXUP_FUNC,
10307 .v.func = alc_fixup_no_jack_detect,
10308 },
10309 [ALC861_FIXUP_ASUS_A6RP] = {
10310 .type = HDA_FIXUP_FUNC,
10311 .v.func = alc861_fixup_asus_amp_vref_0f,
10312 .chained = true,
10313 .chain_id = ALC861_FIXUP_NO_JACK_DETECT,
10314 },
10315 [ALC660_FIXUP_ASUS_W7J] = {
10316 .type = HDA_FIXUP_VERBS,
10317 .v.verbs = (const struct hda_verb[]) {
10318
10319
10320
10321 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
10322 { }
10323 },
10324 }
10325};
10326
10327static const struct snd_pci_quirk alc861_fixup_tbl[] = {
10328 SND_PCI_QUIRK(0x1043, 0x1253, "ASUS W7J", ALC660_FIXUP_ASUS_W7J),
10329 SND_PCI_QUIRK(0x1043, 0x1263, "ASUS Z35HL", ALC660_FIXUP_ASUS_W7J),
10330 SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP),
10331 SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", ALC861_FIXUP_AMP_VREF_0F),
10332 SND_PCI_QUIRK(0x1462, 0x7254, "HP DX2200", ALC861_FIXUP_NO_JACK_DETECT),
10333 SND_PCI_QUIRK_VENDOR(0x1584, "Haier/Uniwill", ALC861_FIXUP_AMP_VREF_0F),
10334 SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", ALC861_FIXUP_FSC_AMILO_PI1505),
10335 {}
10336};
10337
10338
10339
10340static int patch_alc861(struct hda_codec *codec)
10341{
10342 struct alc_spec *spec;
10343 int err;
10344
10345 err = alc_alloc_spec(codec, 0x15);
10346 if (err < 0)
10347 return err;
10348
10349 spec = codec->spec;
10350 if (has_cdefine_beep(codec))
10351 spec->gen.beep_nid = 0x23;
10352
10353#ifdef CONFIG_PM
10354 spec->power_hook = alc_power_eapd;
10355#endif
10356
10357 alc_pre_init(codec);
10358
10359 snd_hda_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);
10360 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
10361
10362
10363 err = alc861_parse_auto_config(codec);
10364 if (err < 0)
10365 goto error;
10366
10367 if (!spec->gen.no_analog) {
10368 err = set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
10369 if (err < 0)
10370 goto error;
10371 }
10372
10373 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
10374
10375 return 0;
10376
10377 error:
10378 alc_free(codec);
10379 return err;
10380}
10381
10382
10383
10384
10385
10386
10387
10388
10389static int alc861vd_parse_auto_config(struct hda_codec *codec)
10390{
10391 static const hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
10392 static const hda_nid_t alc861vd_ssids[] = { 0x15, 0x1b, 0x14, 0 };
10393 return alc_parse_auto_config(codec, alc861vd_ignore, alc861vd_ssids);
10394}
10395
10396enum {
10397 ALC660VD_FIX_ASUS_GPIO1,
10398 ALC861VD_FIX_DALLAS,
10399};
10400
10401
10402static void alc861vd_fixup_dallas(struct hda_codec *codec,
10403 const struct hda_fixup *fix, int action)
10404{
10405 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
10406 snd_hda_override_pin_caps(codec, 0x18, 0x00000734);
10407 snd_hda_override_pin_caps(codec, 0x19, 0x0000073c);
10408 }
10409}
10410
10411
10412static void alc660vd_fixup_asus_gpio1(struct hda_codec *codec,
10413 const struct hda_fixup *fix, int action)
10414{
10415 struct alc_spec *spec = codec->spec;
10416
10417 if (action == HDA_FIXUP_ACT_PRE_PROBE)
10418 spec->gpio_mask |= 0x02;
10419 alc_fixup_gpio(codec, action, 0x01);
10420}
10421
10422static const struct hda_fixup alc861vd_fixups[] = {
10423 [ALC660VD_FIX_ASUS_GPIO1] = {
10424 .type = HDA_FIXUP_FUNC,
10425 .v.func = alc660vd_fixup_asus_gpio1,
10426 },
10427 [ALC861VD_FIX_DALLAS] = {
10428 .type = HDA_FIXUP_FUNC,
10429 .v.func = alc861vd_fixup_dallas,
10430 },
10431};
10432
10433static const struct snd_pci_quirk alc861vd_fixup_tbl[] = {
10434 SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_FIX_DALLAS),
10435 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
10436 SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_FIX_DALLAS),
10437 {}
10438};
10439
10440
10441
10442static int patch_alc861vd(struct hda_codec *codec)
10443{
10444 struct alc_spec *spec;
10445 int err;
10446
10447 err = alc_alloc_spec(codec, 0x0b);
10448 if (err < 0)
10449 return err;
10450
10451 spec = codec->spec;
10452 if (has_cdefine_beep(codec))
10453 spec->gen.beep_nid = 0x23;
10454
10455 spec->shutup = alc_eapd_shutup;
10456
10457 alc_pre_init(codec);
10458
10459 snd_hda_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);
10460 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
10461
10462
10463 err = alc861vd_parse_auto_config(codec);
10464 if (err < 0)
10465 goto error;
10466
10467 if (!spec->gen.no_analog) {
10468 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
10469 if (err < 0)
10470 goto error;
10471 }
10472
10473 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
10474
10475 return 0;
10476
10477 error:
10478 alc_free(codec);
10479 return err;
10480}
10481
10482
10483
10484
10485
10486
10487
10488
10489
10490
10491
10492
10493
10494
10495
10496
10497
10498static int alc662_parse_auto_config(struct hda_codec *codec)
10499{
10500 static const hda_nid_t alc662_ignore[] = { 0x1d, 0 };
10501 static const hda_nid_t alc663_ssids[] = { 0x15, 0x1b, 0x14, 0x21 };
10502 static const hda_nid_t alc662_ssids[] = { 0x15, 0x1b, 0x14, 0 };
10503 const hda_nid_t *ssids;
10504
10505 if (codec->core.vendor_id == 0x10ec0272 || codec->core.vendor_id == 0x10ec0663 ||
10506 codec->core.vendor_id == 0x10ec0665 || codec->core.vendor_id == 0x10ec0670 ||
10507 codec->core.vendor_id == 0x10ec0671)
10508 ssids = alc663_ssids;
10509 else
10510 ssids = alc662_ssids;
10511 return alc_parse_auto_config(codec, alc662_ignore, ssids);
10512}
10513
10514static void alc272_fixup_mario(struct hda_codec *codec,
10515 const struct hda_fixup *fix, int action)
10516{
10517 if (action != HDA_FIXUP_ACT_PRE_PROBE)
10518 return;
10519 if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
10520 (0x3b << AC_AMPCAP_OFFSET_SHIFT) |
10521 (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |
10522 (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |
10523 (0 << AC_AMPCAP_MUTE_SHIFT)))
10524 codec_warn(codec, "failed to override amp caps for NID 0x2\n");
10525}
10526
10527static const struct snd_pcm_chmap_elem asus_pcm_2_1_chmaps[] = {
10528 { .channels = 2,
10529 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
10530 { .channels = 4,
10531 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
10532 SNDRV_CHMAP_NA, SNDRV_CHMAP_LFE } },
10533 { }
10534};
10535
10536
10537static void alc_fixup_bass_chmap(struct hda_codec *codec,
10538 const struct hda_fixup *fix, int action)
10539{
10540 if (action == HDA_FIXUP_ACT_BUILD) {
10541 struct alc_spec *spec = codec->spec;
10542 spec->gen.pcm_rec[0]->stream[0].chmap = asus_pcm_2_1_chmaps;
10543 }
10544}
10545
10546
10547static unsigned int gpio_led_power_filter(struct hda_codec *codec,
10548 hda_nid_t nid,
10549 unsigned int power_state)
10550{
10551 struct alc_spec *spec = codec->spec;
10552 if (nid == codec->core.afg && power_state == AC_PWRST_D3 && spec->gpio_data)
10553 return AC_PWRST_D0;
10554 return power_state;
10555}
10556
10557static void alc662_fixup_led_gpio1(struct hda_codec *codec,
10558 const struct hda_fixup *fix, int action)
10559{
10560 struct alc_spec *spec = codec->spec;
10561
10562 alc_fixup_hp_gpio_led(codec, action, 0x01, 0);
10563 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
10564 spec->mute_led_polarity = 1;
10565 codec->power_filter = gpio_led_power_filter;
10566 }
10567}
10568
10569static void alc662_usi_automute_hook(struct hda_codec *codec,
10570 struct hda_jack_callback *jack)
10571{
10572 struct alc_spec *spec = codec->spec;
10573 int vref;
10574 msleep(200);
10575 snd_hda_gen_hp_automute(codec, jack);
10576
10577 vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
10578 msleep(100);
10579 snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
10580 vref);
10581}
10582
10583static void alc662_fixup_usi_headset_mic(struct hda_codec *codec,
10584 const struct hda_fixup *fix, int action)
10585{
10586 struct alc_spec *spec = codec->spec;
10587 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
10588 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
10589 spec->gen.hp_automute_hook = alc662_usi_automute_hook;
10590 }
10591}
10592
10593static void alc662_aspire_ethos_mute_speakers(struct hda_codec *codec,
10594 struct hda_jack_callback *cb)
10595{
10596
10597
10598
10599
10600
10601
10602 if (snd_hda_jack_detect_state(codec, 0x1b) == HDA_JACK_PRESENT) {
10603 snd_hda_set_pin_ctl_cache(codec, 0x15, 0);
10604 snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
10605 } else {
10606 snd_hda_set_pin_ctl_cache(codec, 0x15, PIN_OUT);
10607 snd_hda_set_pin_ctl_cache(codec, 0x18, PIN_OUT);
10608 }
10609}
10610
10611static void alc662_fixup_aspire_ethos_hp(struct hda_codec *codec,
10612 const struct hda_fixup *fix, int action)
10613{
10614
10615 if (!is_jack_detectable(codec, 0x1b))
10616 return;
10617
10618 switch (action) {
10619 case HDA_FIXUP_ACT_PRE_PROBE:
10620 snd_hda_jack_detect_enable_callback(codec, 0x1b,
10621 alc662_aspire_ethos_mute_speakers);
10622
10623 alc_setup_gpio(codec, 0x02);
10624 break;
10625 case HDA_FIXUP_ACT_INIT:
10626
10627
10628
10629 alc662_aspire_ethos_mute_speakers(codec, NULL);
10630 break;
10631 }
10632}
10633
10634static void alc671_fixup_hp_headset_mic2(struct hda_codec *codec,
10635 const struct hda_fixup *fix, int action)
10636{
10637 struct alc_spec *spec = codec->spec;
10638
10639 static const struct hda_pintbl pincfgs[] = {
10640 { 0x19, 0x02a11040 },
10641 { 0x1b, 0x0181304f },
10642 { }
10643 };
10644
10645 switch (action) {
10646 case HDA_FIXUP_ACT_PRE_PROBE:
10647 spec->gen.mixer_nid = 0;
10648 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
10649 snd_hda_apply_pincfgs(codec, pincfgs);
10650 break;
10651 case HDA_FIXUP_ACT_INIT:
10652 alc_write_coef_idx(codec, 0x19, 0xa054);
10653 break;
10654 }
10655}
10656
10657static void alc897_hp_automute_hook(struct hda_codec *codec,
10658 struct hda_jack_callback *jack)
10659{
10660 struct alc_spec *spec = codec->spec;
10661 int vref;
10662
10663 snd_hda_gen_hp_automute(codec, jack);
10664 vref = spec->gen.hp_jack_present ? (PIN_HP | AC_PINCTL_VREF_100) : PIN_HP;
10665 snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
10666 vref);
10667}
10668
10669static void alc897_fixup_lenovo_headset_mic(struct hda_codec *codec,
10670 const struct hda_fixup *fix, int action)
10671{
10672 struct alc_spec *spec = codec->spec;
10673 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
10674 spec->gen.hp_automute_hook = alc897_hp_automute_hook;
10675 }
10676}
10677
10678static const struct coef_fw alc668_coefs[] = {
10679 WRITE_COEF(0x01, 0xbebe), WRITE_COEF(0x02, 0xaaaa), WRITE_COEF(0x03, 0x0),
10680 WRITE_COEF(0x04, 0x0180), WRITE_COEF(0x06, 0x0), WRITE_COEF(0x07, 0x0f80),
10681 WRITE_COEF(0x08, 0x0031), WRITE_COEF(0x0a, 0x0060), WRITE_COEF(0x0b, 0x0),
10682 WRITE_COEF(0x0c, 0x7cf7), WRITE_COEF(0x0d, 0x1080), WRITE_COEF(0x0e, 0x7f7f),
10683 WRITE_COEF(0x0f, 0xcccc), WRITE_COEF(0x10, 0xddcc), WRITE_COEF(0x11, 0x0001),
10684 WRITE_COEF(0x13, 0x0), WRITE_COEF(0x14, 0x2aa0), WRITE_COEF(0x17, 0xa940),
10685 WRITE_COEF(0x19, 0x0), WRITE_COEF(0x1a, 0x0), WRITE_COEF(0x1b, 0x0),
10686 WRITE_COEF(0x1c, 0x0), WRITE_COEF(0x1d, 0x0), WRITE_COEF(0x1e, 0x7418),
10687 WRITE_COEF(0x1f, 0x0804), WRITE_COEF(0x20, 0x4200), WRITE_COEF(0x21, 0x0468),
10688 WRITE_COEF(0x22, 0x8ccc), WRITE_COEF(0x23, 0x0250), WRITE_COEF(0x24, 0x7418),
10689 WRITE_COEF(0x27, 0x0), WRITE_COEF(0x28, 0x8ccc), WRITE_COEF(0x2a, 0xff00),
10690 WRITE_COEF(0x2b, 0x8000), WRITE_COEF(0xa7, 0xff00), WRITE_COEF(0xa8, 0x8000),
10691 WRITE_COEF(0xaa, 0x2e17), WRITE_COEF(0xab, 0xa0c0), WRITE_COEF(0xac, 0x0),
10692 WRITE_COEF(0xad, 0x0), WRITE_COEF(0xae, 0x2ac6), WRITE_COEF(0xaf, 0xa480),
10693 WRITE_COEF(0xb0, 0x0), WRITE_COEF(0xb1, 0x0), WRITE_COEF(0xb2, 0x0),
10694 WRITE_COEF(0xb3, 0x0), WRITE_COEF(0xb4, 0x0), WRITE_COEF(0xb5, 0x1040),
10695 WRITE_COEF(0xb6, 0xd697), WRITE_COEF(0xb7, 0x902b), WRITE_COEF(0xb8, 0xd697),
10696 WRITE_COEF(0xb9, 0x902b), WRITE_COEF(0xba, 0xb8ba), WRITE_COEF(0xbb, 0xaaab),
10697 WRITE_COEF(0xbc, 0xaaaf), WRITE_COEF(0xbd, 0x6aaa), WRITE_COEF(0xbe, 0x1c02),
10698 WRITE_COEF(0xc0, 0x00ff), WRITE_COEF(0xc1, 0x0fa6),
10699 {}
10700};
10701
10702static void alc668_restore_default_value(struct hda_codec *codec)
10703{
10704 alc_process_coef_fw(codec, alc668_coefs);
10705}
10706
10707enum {
10708 ALC662_FIXUP_ASPIRE,
10709 ALC662_FIXUP_LED_GPIO1,
10710 ALC662_FIXUP_IDEAPAD,
10711 ALC272_FIXUP_MARIO,
10712 ALC662_FIXUP_CZC_ET26,
10713 ALC662_FIXUP_CZC_P10T,
10714 ALC662_FIXUP_SKU_IGNORE,
10715 ALC662_FIXUP_HP_RP5800,
10716 ALC662_FIXUP_ASUS_MODE1,
10717 ALC662_FIXUP_ASUS_MODE2,
10718 ALC662_FIXUP_ASUS_MODE3,
10719 ALC662_FIXUP_ASUS_MODE4,
10720 ALC662_FIXUP_ASUS_MODE5,
10721 ALC662_FIXUP_ASUS_MODE6,
10722 ALC662_FIXUP_ASUS_MODE7,
10723 ALC662_FIXUP_ASUS_MODE8,
10724 ALC662_FIXUP_NO_JACK_DETECT,
10725 ALC662_FIXUP_ZOTAC_Z68,
10726 ALC662_FIXUP_INV_DMIC,
10727 ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
10728 ALC668_FIXUP_DELL_MIC_NO_PRESENCE,
10729 ALC662_FIXUP_HEADSET_MODE,
10730 ALC668_FIXUP_HEADSET_MODE,
10731 ALC662_FIXUP_BASS_MODE4_CHMAP,
10732 ALC662_FIXUP_BASS_16,
10733 ALC662_FIXUP_BASS_1A,
10734 ALC662_FIXUP_BASS_CHMAP,
10735 ALC668_FIXUP_AUTO_MUTE,
10736 ALC668_FIXUP_DELL_DISABLE_AAMIX,
10737 ALC668_FIXUP_DELL_XPS13,
10738 ALC662_FIXUP_ASUS_Nx50,
10739 ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
10740 ALC668_FIXUP_ASUS_Nx51,
10741 ALC668_FIXUP_MIC_COEF,
10742 ALC668_FIXUP_ASUS_G751,
10743 ALC891_FIXUP_HEADSET_MODE,
10744 ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
10745 ALC662_FIXUP_ACER_VERITON,
10746 ALC892_FIXUP_ASROCK_MOBO,
10747 ALC662_FIXUP_USI_FUNC,
10748 ALC662_FIXUP_USI_HEADSET_MODE,
10749 ALC662_FIXUP_LENOVO_MULTI_CODECS,
10750 ALC669_FIXUP_ACER_ASPIRE_ETHOS,
10751 ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET,
10752 ALC671_FIXUP_HP_HEADSET_MIC2,
10753 ALC662_FIXUP_ACER_X2660G_HEADSET_MODE,
10754 ALC662_FIXUP_ACER_NITRO_HEADSET_MODE,
10755 ALC668_FIXUP_ASUS_NO_HEADSET_MIC,
10756 ALC668_FIXUP_HEADSET_MIC,
10757 ALC668_FIXUP_MIC_DET_COEF,
10758 ALC897_FIXUP_LENOVO_HEADSET_MIC,
10759 ALC897_FIXUP_HEADSET_MIC_PIN,
10760};
10761
10762static const struct hda_fixup alc662_fixups[] = {
10763 [ALC662_FIXUP_ASPIRE] = {
10764 .type = HDA_FIXUP_PINS,
10765 .v.pins = (const struct hda_pintbl[]) {
10766 { 0x15, 0x99130112 },
10767 { }
10768 }
10769 },
10770 [ALC662_FIXUP_LED_GPIO1] = {
10771 .type = HDA_FIXUP_FUNC,
10772 .v.func = alc662_fixup_led_gpio1,
10773 },
10774 [ALC662_FIXUP_IDEAPAD] = {
10775 .type = HDA_FIXUP_PINS,
10776 .v.pins = (const struct hda_pintbl[]) {
10777 { 0x17, 0x99130112 },
10778 { }
10779 },
10780 .chained = true,
10781 .chain_id = ALC662_FIXUP_LED_GPIO1,
10782 },
10783 [ALC272_FIXUP_MARIO] = {
10784 .type = HDA_FIXUP_FUNC,
10785 .v.func = alc272_fixup_mario,
10786 },
10787 [ALC662_FIXUP_CZC_ET26] = {
10788 .type = HDA_FIXUP_PINS,
10789 .v.pins = (const struct hda_pintbl[]) {
10790 {0x12, 0x403cc000},
10791 {0x14, 0x90170110},
10792 {0x15, 0x411111f0},
10793 {0x16, 0x411111f0},
10794 {0x18, 0x01a19030},
10795 {0x19, 0x90a7013f},
10796 {0x1a, 0x01014020},
10797 {0x1b, 0x0121401f},
10798 {0x1c, 0x411111f0},
10799 {0x1d, 0x411111f0},
10800 {0x1e, 0x40478e35},
10801 {}
10802 },
10803 .chained = true,
10804 .chain_id = ALC662_FIXUP_SKU_IGNORE
10805 },
10806 [ALC662_FIXUP_CZC_P10T] = {
10807 .type = HDA_FIXUP_VERBS,
10808 .v.verbs = (const struct hda_verb[]) {
10809 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
10810 {}
10811 }
10812 },
10813 [ALC662_FIXUP_SKU_IGNORE] = {
10814 .type = HDA_FIXUP_FUNC,
10815 .v.func = alc_fixup_sku_ignore,
10816 },
10817 [ALC662_FIXUP_HP_RP5800] = {
10818 .type = HDA_FIXUP_PINS,
10819 .v.pins = (const struct hda_pintbl[]) {
10820 { 0x14, 0x0221201f },
10821 { }
10822 },
10823 .chained = true,
10824 .chain_id = ALC662_FIXUP_SKU_IGNORE
10825 },
10826 [ALC662_FIXUP_ASUS_MODE1] = {
10827 .type = HDA_FIXUP_PINS,
10828 .v.pins = (const struct hda_pintbl[]) {
10829 { 0x14, 0x99130110 },
10830 { 0x18, 0x01a19c20 },
10831 { 0x19, 0x99a3092f },
10832 { 0x21, 0x0121401f },
10833 { }
10834 },
10835 .chained = true,
10836 .chain_id = ALC662_FIXUP_SKU_IGNORE
10837 },
10838 [ALC662_FIXUP_ASUS_MODE2] = {
10839 .type = HDA_FIXUP_PINS,
10840 .v.pins = (const struct hda_pintbl[]) {
10841 { 0x14, 0x99130110 },
10842 { 0x18, 0x01a19820 },
10843 { 0x19, 0x99a3092f },
10844 { 0x1b, 0x0121401f },
10845 { }
10846 },
10847 .chained = true,
10848 .chain_id = ALC662_FIXUP_SKU_IGNORE
10849 },
10850 [ALC662_FIXUP_ASUS_MODE3] = {
10851 .type = HDA_FIXUP_PINS,
10852 .v.pins = (const struct hda_pintbl[]) {
10853 { 0x14, 0x99130110 },
10854 { 0x15, 0x0121441f },
10855 { 0x18, 0x01a19840 },
10856 { 0x19, 0x99a3094f },
10857 { 0x21, 0x01211420 },
10858 { }
10859 },
10860 .chained = true,
10861 .chain_id = ALC662_FIXUP_SKU_IGNORE
10862 },
10863 [ALC662_FIXUP_ASUS_MODE4] = {
10864 .type = HDA_FIXUP_PINS,
10865 .v.pins = (const struct hda_pintbl[]) {
10866 { 0x14, 0x99130110 },
10867 { 0x16, 0x99130111 },
10868 { 0x18, 0x01a19840 },
10869 { 0x19, 0x99a3094f },
10870 { 0x21, 0x0121441f },
10871 { }
10872 },
10873 .chained = true,
10874 .chain_id = ALC662_FIXUP_SKU_IGNORE
10875 },
10876 [ALC662_FIXUP_ASUS_MODE5] = {
10877 .type = HDA_FIXUP_PINS,
10878 .v.pins = (const struct hda_pintbl[]) {
10879 { 0x14, 0x99130110 },
10880 { 0x15, 0x0121441f },
10881 { 0x16, 0x99130111 },
10882 { 0x18, 0x01a19840 },
10883 { 0x19, 0x99a3094f },
10884 { }
10885 },
10886 .chained = true,
10887 .chain_id = ALC662_FIXUP_SKU_IGNORE
10888 },
10889 [ALC662_FIXUP_ASUS_MODE6] = {
10890 .type = HDA_FIXUP_PINS,
10891 .v.pins = (const struct hda_pintbl[]) {
10892 { 0x14, 0x99130110 },
10893 { 0x15, 0x01211420 },
10894 { 0x18, 0x01a19840 },
10895 { 0x19, 0x99a3094f },
10896 { 0x1b, 0x0121441f },
10897 { }
10898 },
10899 .chained = true,
10900 .chain_id = ALC662_FIXUP_SKU_IGNORE
10901 },
10902 [ALC662_FIXUP_ASUS_MODE7] = {
10903 .type = HDA_FIXUP_PINS,
10904 .v.pins = (const struct hda_pintbl[]) {
10905 { 0x14, 0x99130110 },
10906 { 0x17, 0x99130111 },
10907 { 0x18, 0x01a19840 },
10908 { 0x19, 0x99a3094f },
10909 { 0x1b, 0x01214020 },
10910 { 0x21, 0x0121401f },
10911 { }
10912 },
10913 .chained = true,
10914 .chain_id = ALC662_FIXUP_SKU_IGNORE
10915 },
10916 [ALC662_FIXUP_ASUS_MODE8] = {
10917 .type = HDA_FIXUP_PINS,
10918 .v.pins = (const struct hda_pintbl[]) {
10919 { 0x14, 0x99130110 },
10920 { 0x12, 0x99a30970 },
10921 { 0x15, 0x01214020 },
10922 { 0x17, 0x99130111 },
10923 { 0x18, 0x01a19840 },
10924 { 0x21, 0x0121401f },
10925 { }
10926 },
10927 .chained = true,
10928 .chain_id = ALC662_FIXUP_SKU_IGNORE
10929 },
10930 [ALC662_FIXUP_NO_JACK_DETECT] = {
10931 .type = HDA_FIXUP_FUNC,
10932 .v.func = alc_fixup_no_jack_detect,
10933 },
10934 [ALC662_FIXUP_ZOTAC_Z68] = {
10935 .type = HDA_FIXUP_PINS,
10936 .v.pins = (const struct hda_pintbl[]) {
10937 { 0x1b, 0x02214020 },
10938 { }
10939 }
10940 },
10941 [ALC662_FIXUP_INV_DMIC] = {
10942 .type = HDA_FIXUP_FUNC,
10943 .v.func = alc_fixup_inv_dmic,
10944 },
10945 [ALC668_FIXUP_DELL_XPS13] = {
10946 .type = HDA_FIXUP_FUNC,
10947 .v.func = alc_fixup_dell_xps13,
10948 .chained = true,
10949 .chain_id = ALC668_FIXUP_DELL_DISABLE_AAMIX
10950 },
10951 [ALC668_FIXUP_DELL_DISABLE_AAMIX] = {
10952 .type = HDA_FIXUP_FUNC,
10953 .v.func = alc_fixup_disable_aamix,
10954 .chained = true,
10955 .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
10956 },
10957 [ALC668_FIXUP_AUTO_MUTE] = {
10958 .type = HDA_FIXUP_FUNC,
10959 .v.func = alc_fixup_auto_mute_via_amp,
10960 .chained = true,
10961 .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
10962 },
10963 [ALC662_FIXUP_DELL_MIC_NO_PRESENCE] = {
10964 .type = HDA_FIXUP_PINS,
10965 .v.pins = (const struct hda_pintbl[]) {
10966 { 0x19, 0x03a1113c },
10967
10968 { }
10969 },
10970 .chained = true,
10971 .chain_id = ALC662_FIXUP_HEADSET_MODE
10972 },
10973 [ALC662_FIXUP_HEADSET_MODE] = {
10974 .type = HDA_FIXUP_FUNC,
10975 .v.func = alc_fixup_headset_mode_alc662,
10976 },
10977 [ALC668_FIXUP_DELL_MIC_NO_PRESENCE] = {
10978 .type = HDA_FIXUP_PINS,
10979 .v.pins = (const struct hda_pintbl[]) {
10980 { 0x19, 0x03a1913d },
10981 { 0x1b, 0x03a1113c },
10982 { }
10983 },
10984 .chained = true,
10985 .chain_id = ALC668_FIXUP_HEADSET_MODE
10986 },
10987 [ALC668_FIXUP_HEADSET_MODE] = {
10988 .type = HDA_FIXUP_FUNC,
10989 .v.func = alc_fixup_headset_mode_alc668,
10990 },
10991 [ALC662_FIXUP_BASS_MODE4_CHMAP] = {
10992 .type = HDA_FIXUP_FUNC,
10993 .v.func = alc_fixup_bass_chmap,
10994 .chained = true,
10995 .chain_id = ALC662_FIXUP_ASUS_MODE4
10996 },
10997 [ALC662_FIXUP_BASS_16] = {
10998 .type = HDA_FIXUP_PINS,
10999 .v.pins = (const struct hda_pintbl[]) {
11000 {0x16, 0x80106111},
11001 {}
11002 },
11003 .chained = true,
11004 .chain_id = ALC662_FIXUP_BASS_CHMAP,
11005 },
11006 [ALC662_FIXUP_BASS_1A] = {
11007 .type = HDA_FIXUP_PINS,
11008 .v.pins = (const struct hda_pintbl[]) {
11009 {0x1a, 0x80106111},
11010 {}
11011 },
11012 .chained = true,
11013 .chain_id = ALC662_FIXUP_BASS_CHMAP,
11014 },
11015 [ALC662_FIXUP_BASS_CHMAP] = {
11016 .type = HDA_FIXUP_FUNC,
11017 .v.func = alc_fixup_bass_chmap,
11018 },
11019 [ALC662_FIXUP_ASUS_Nx50] = {
11020 .type = HDA_FIXUP_FUNC,
11021 .v.func = alc_fixup_auto_mute_via_amp,
11022 .chained = true,
11023 .chain_id = ALC662_FIXUP_BASS_1A
11024 },
11025 [ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE] = {
11026 .type = HDA_FIXUP_FUNC,
11027 .v.func = alc_fixup_headset_mode_alc668,
11028 .chain_id = ALC662_FIXUP_BASS_CHMAP
11029 },
11030 [ALC668_FIXUP_ASUS_Nx51] = {
11031 .type = HDA_FIXUP_PINS,
11032 .v.pins = (const struct hda_pintbl[]) {
11033 { 0x19, 0x03a1913d },
11034 { 0x1a, 0x90170151 },
11035 { 0x1b, 0x03a1113c },
11036 {}
11037 },
11038 .chained = true,
11039 .chain_id = ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
11040 },
11041 [ALC668_FIXUP_MIC_COEF] = {
11042 .type = HDA_FIXUP_VERBS,
11043 .v.verbs = (const struct hda_verb[]) {
11044 { 0x20, AC_VERB_SET_COEF_INDEX, 0xc3 },
11045 { 0x20, AC_VERB_SET_PROC_COEF, 0x4000 },
11046 {}
11047 },
11048 },
11049 [ALC668_FIXUP_ASUS_G751] = {
11050 .type = HDA_FIXUP_PINS,
11051 .v.pins = (const struct hda_pintbl[]) {
11052 { 0x16, 0x0421101f },
11053 {}
11054 },
11055 .chained = true,
11056 .chain_id = ALC668_FIXUP_MIC_COEF
11057 },
11058 [ALC891_FIXUP_HEADSET_MODE] = {
11059 .type = HDA_FIXUP_FUNC,
11060 .v.func = alc_fixup_headset_mode,
11061 },
11062 [ALC891_FIXUP_DELL_MIC_NO_PRESENCE] = {
11063 .type = HDA_FIXUP_PINS,
11064 .v.pins = (const struct hda_pintbl[]) {
11065 { 0x19, 0x03a1913d },
11066 { 0x1b, 0x03a1113c },
11067 { }
11068 },
11069 .chained = true,
11070 .chain_id = ALC891_FIXUP_HEADSET_MODE
11071 },
11072 [ALC662_FIXUP_ACER_VERITON] = {
11073 .type = HDA_FIXUP_PINS,
11074 .v.pins = (const struct hda_pintbl[]) {
11075 { 0x15, 0x50170120 },
11076 { }
11077 }
11078 },
11079 [ALC892_FIXUP_ASROCK_MOBO] = {
11080 .type = HDA_FIXUP_PINS,
11081 .v.pins = (const struct hda_pintbl[]) {
11082 { 0x15, 0x40f000f0 },
11083 { 0x16, 0x40f000f0 },
11084 { }
11085 }
11086 },
11087 [ALC662_FIXUP_USI_FUNC] = {
11088 .type = HDA_FIXUP_FUNC,
11089 .v.func = alc662_fixup_usi_headset_mic,
11090 },
11091 [ALC662_FIXUP_USI_HEADSET_MODE] = {
11092 .type = HDA_FIXUP_PINS,
11093 .v.pins = (const struct hda_pintbl[]) {
11094 { 0x19, 0x02a1913c },
11095 { 0x18, 0x01a1903d },
11096 { }
11097 },
11098 .chained = true,
11099 .chain_id = ALC662_FIXUP_USI_FUNC
11100 },
11101 [ALC662_FIXUP_LENOVO_MULTI_CODECS] = {
11102 .type = HDA_FIXUP_FUNC,
11103 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
11104 },
11105 [ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET] = {
11106 .type = HDA_FIXUP_FUNC,
11107 .v.func = alc662_fixup_aspire_ethos_hp,
11108 },
11109 [ALC669_FIXUP_ACER_ASPIRE_ETHOS] = {
11110 .type = HDA_FIXUP_PINS,
11111 .v.pins = (const struct hda_pintbl[]) {
11112 { 0x15, 0x92130110 },
11113 { 0x18, 0x99130111 },
11114 { 0x1b, 0x11130012 },
11115 { }
11116 },
11117 .chained = true,
11118 .chain_id = ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET
11119 },
11120 [ALC671_FIXUP_HP_HEADSET_MIC2] = {
11121 .type = HDA_FIXUP_FUNC,
11122 .v.func = alc671_fixup_hp_headset_mic2,
11123 },
11124 [ALC662_FIXUP_ACER_X2660G_HEADSET_MODE] = {
11125 .type = HDA_FIXUP_PINS,
11126 .v.pins = (const struct hda_pintbl[]) {
11127 { 0x1a, 0x02a1113c },
11128 { }
11129 },
11130 .chained = true,
11131 .chain_id = ALC662_FIXUP_USI_FUNC
11132 },
11133 [ALC662_FIXUP_ACER_NITRO_HEADSET_MODE] = {
11134 .type = HDA_FIXUP_PINS,
11135 .v.pins = (const struct hda_pintbl[]) {
11136 { 0x1a, 0x01a11140 },
11137 { 0x1b, 0x0221144f },
11138 { }
11139 },
11140 .chained = true,
11141 .chain_id = ALC662_FIXUP_USI_FUNC
11142 },
11143 [ALC668_FIXUP_ASUS_NO_HEADSET_MIC] = {
11144 .type = HDA_FIXUP_PINS,
11145 .v.pins = (const struct hda_pintbl[]) {
11146 { 0x1b, 0x04a1112c },
11147 { }
11148 },
11149 .chained = true,
11150 .chain_id = ALC668_FIXUP_HEADSET_MIC
11151 },
11152 [ALC668_FIXUP_HEADSET_MIC] = {
11153 .type = HDA_FIXUP_FUNC,
11154 .v.func = alc269_fixup_headset_mic,
11155 .chained = true,
11156 .chain_id = ALC668_FIXUP_MIC_DET_COEF
11157 },
11158 [ALC668_FIXUP_MIC_DET_COEF] = {
11159 .type = HDA_FIXUP_VERBS,
11160 .v.verbs = (const struct hda_verb[]) {
11161 { 0x20, AC_VERB_SET_COEF_INDEX, 0x15 },
11162 { 0x20, AC_VERB_SET_PROC_COEF, 0x0d60 },
11163 {}
11164 },
11165 },
11166 [ALC897_FIXUP_LENOVO_HEADSET_MIC] = {
11167 .type = HDA_FIXUP_FUNC,
11168 .v.func = alc897_fixup_lenovo_headset_mic,
11169 },
11170 [ALC897_FIXUP_HEADSET_MIC_PIN] = {
11171 .type = HDA_FIXUP_PINS,
11172 .v.pins = (const struct hda_pintbl[]) {
11173 { 0x1a, 0x03a11050 },
11174 { }
11175 },
11176 .chained = true,
11177 .chain_id = ALC897_FIXUP_LENOVO_HEADSET_MIC
11178 },
11179};
11180
11181static const struct snd_pci_quirk alc662_fixup_tbl[] = {
11182 SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2),
11183 SND_PCI_QUIRK(0x1025, 0x022f, "Acer Aspire One", ALC662_FIXUP_INV_DMIC),
11184 SND_PCI_QUIRK(0x1025, 0x0241, "Packard Bell DOTS", ALC662_FIXUP_INV_DMIC),
11185 SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
11186 SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),
11187 SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC),
11188 SND_PCI_QUIRK(0x1025, 0x034a, "Gateway LT27", ALC662_FIXUP_INV_DMIC),
11189 SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
11190 SND_PCI_QUIRK(0x1025, 0x0566, "Acer Aspire Ethos 8951G", ALC669_FIXUP_ACER_ASPIRE_ETHOS),
11191 SND_PCI_QUIRK(0x1025, 0x123c, "Acer Nitro N50-600", ALC662_FIXUP_ACER_NITRO_HEADSET_MODE),
11192 SND_PCI_QUIRK(0x1025, 0x124e, "Acer 2660G", ALC662_FIXUP_ACER_X2660G_HEADSET_MODE),
11193 SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11194 SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11195 SND_PCI_QUIRK(0x1028, 0x05fe, "Dell XPS 15", ALC668_FIXUP_DELL_XPS13),
11196 SND_PCI_QUIRK(0x1028, 0x060a, "Dell XPS 13", ALC668_FIXUP_DELL_XPS13),
11197 SND_PCI_QUIRK(0x1028, 0x060d, "Dell M3800", ALC668_FIXUP_DELL_XPS13),
11198 SND_PCI_QUIRK(0x1028, 0x0625, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11199 SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11200 SND_PCI_QUIRK(0x1028, 0x0696, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11201 SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11202 SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11203 SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
11204 SND_PCI_QUIRK(0x103c, 0x873e, "HP", ALC671_FIXUP_HP_HEADSET_MIC2),
11205 SND_PCI_QUIRK(0x103c, 0x885f, "HP 288 Pro G8", ALC671_FIXUP_HP_HEADSET_MIC2),
11206 SND_PCI_QUIRK(0x1043, 0x1080, "Asus UX501VW", ALC668_FIXUP_HEADSET_MODE),
11207 SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_ASUS_Nx50),
11208 SND_PCI_QUIRK(0x1043, 0x129d, "Asus N750", ALC662_FIXUP_ASUS_Nx50),
11209 SND_PCI_QUIRK(0x1043, 0x12ff, "ASUS G751", ALC668_FIXUP_ASUS_G751),
11210 SND_PCI_QUIRK(0x1043, 0x13df, "Asus N550JX", ALC662_FIXUP_BASS_1A),
11211 SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
11212 SND_PCI_QUIRK(0x1043, 0x15a7, "ASUS UX51VZH", ALC662_FIXUP_BASS_16),
11213 SND_PCI_QUIRK(0x1043, 0x177d, "ASUS N551", ALC668_FIXUP_ASUS_Nx51),
11214 SND_PCI_QUIRK(0x1043, 0x17bd, "ASUS N751", ALC668_FIXUP_ASUS_Nx51),
11215 SND_PCI_QUIRK(0x1043, 0x185d, "ASUS G551JW", ALC668_FIXUP_ASUS_NO_HEADSET_MIC),
11216 SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71SL", ALC662_FIXUP_ASUS_MODE8),
11217 SND_PCI_QUIRK(0x1043, 0x1b73, "ASUS N55SF", ALC662_FIXUP_BASS_16),
11218 SND_PCI_QUIRK(0x1043, 0x1bf3, "ASUS N76VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
11219 SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),
11220 SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
11221 SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
11222 SND_PCI_QUIRK(0x14cd, 0x5003, "USI", ALC662_FIXUP_USI_HEADSET_MODE),
11223 SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC662_FIXUP_LENOVO_MULTI_CODECS),
11224 SND_PCI_QUIRK(0x17aa, 0x1057, "Lenovo P360", ALC897_FIXUP_HEADSET_MIC_PIN),
11225 SND_PCI_QUIRK(0x17aa, 0x32ca, "Lenovo ThinkCentre M80", ALC897_FIXUP_HEADSET_MIC_PIN),
11226 SND_PCI_QUIRK(0x17aa, 0x32cb, "Lenovo ThinkCentre M70", ALC897_FIXUP_HEADSET_MIC_PIN),
11227 SND_PCI_QUIRK(0x17aa, 0x32cf, "Lenovo ThinkCentre M950", ALC897_FIXUP_HEADSET_MIC_PIN),
11228 SND_PCI_QUIRK(0x17aa, 0x32f7, "Lenovo ThinkCentre M90", ALC897_FIXUP_HEADSET_MIC_PIN),
11229 SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
11230 SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
11231 SND_PCI_QUIRK(0x1849, 0x5892, "ASRock B150M", ALC892_FIXUP_ASROCK_MOBO),
11232 SND_PCI_QUIRK(0x19da, 0xa130, "Zotac Z68", ALC662_FIXUP_ZOTAC_Z68),
11233 SND_PCI_QUIRK(0x1b0a, 0x01b8, "ACER Veriton", ALC662_FIXUP_ACER_VERITON),
11234 SND_PCI_QUIRK(0x1b35, 0x1234, "CZC ET26", ALC662_FIXUP_CZC_ET26),
11235 SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
11236
11237#if 0
11238
11239
11240
11241
11242
11243 SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1),
11244 SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3),
11245 SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1),
11246 SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC662_FIXUP_ASUS_MODE3),
11247 SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
11248 SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11249 SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
11250 SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC662_FIXUP_ASUS_MODE1),
11251 SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC662_FIXUP_ASUS_MODE1),
11252 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11253 SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC662_FIXUP_ASUS_MODE7),
11254 SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC662_FIXUP_ASUS_MODE7),
11255 SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC662_FIXUP_ASUS_MODE8),
11256 SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC662_FIXUP_ASUS_MODE3),
11257 SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC662_FIXUP_ASUS_MODE1),
11258 SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11259 SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_FIXUP_ASUS_MODE2),
11260 SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC662_FIXUP_ASUS_MODE1),
11261 SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11262 SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
11263 SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
11264 SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11265 SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC662_FIXUP_ASUS_MODE1),
11266 SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC662_FIXUP_ASUS_MODE3),
11267 SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_FIXUP_ASUS_MODE2),
11268 SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11269 SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC662_FIXUP_ASUS_MODE5),
11270 SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
11271 SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11272 SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC662_FIXUP_ASUS_MODE1),
11273 SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11274 SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11275 SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC662_FIXUP_ASUS_MODE3),
11276 SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC662_FIXUP_ASUS_MODE3),
11277 SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC662_FIXUP_ASUS_MODE1),
11278 SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC662_FIXUP_ASUS_MODE1),
11279 SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC662_FIXUP_ASUS_MODE1),
11280 SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC662_FIXUP_ASUS_MODE1),
11281 SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC662_FIXUP_ASUS_MODE1),
11282 SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11283 SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_FIXUP_ASUS_MODE2),
11284 SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC662_FIXUP_ASUS_MODE1),
11285 SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
11286 SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC662_FIXUP_ASUS_MODE3),
11287 SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC662_FIXUP_ASUS_MODE1),
11288 SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC662_FIXUP_ASUS_MODE1),
11289 SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC662_FIXUP_ASUS_MODE1),
11290 SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_FIXUP_ASUS_MODE2),
11291 SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
11292 SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE4),
11293#endif
11294 {}
11295};
11296
11297static const struct hda_model_fixup alc662_fixup_models[] = {
11298 {.id = ALC662_FIXUP_ASPIRE, .name = "aspire"},
11299 {.id = ALC662_FIXUP_IDEAPAD, .name = "ideapad"},
11300 {.id = ALC272_FIXUP_MARIO, .name = "mario"},
11301 {.id = ALC662_FIXUP_HP_RP5800, .name = "hp-rp5800"},
11302 {.id = ALC662_FIXUP_ASUS_MODE1, .name = "asus-mode1"},
11303 {.id = ALC662_FIXUP_ASUS_MODE2, .name = "asus-mode2"},
11304 {.id = ALC662_FIXUP_ASUS_MODE3, .name = "asus-mode3"},
11305 {.id = ALC662_FIXUP_ASUS_MODE4, .name = "asus-mode4"},
11306 {.id = ALC662_FIXUP_ASUS_MODE5, .name = "asus-mode5"},
11307 {.id = ALC662_FIXUP_ASUS_MODE6, .name = "asus-mode6"},
11308 {.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},
11309 {.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},
11310 {.id = ALC662_FIXUP_ZOTAC_Z68, .name = "zotac-z68"},
11311 {.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"},
11312 {.id = ALC662_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc662-headset-multi"},
11313 {.id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
11314 {.id = ALC662_FIXUP_HEADSET_MODE, .name = "alc662-headset"},
11315 {.id = ALC668_FIXUP_HEADSET_MODE, .name = "alc668-headset"},
11316 {.id = ALC662_FIXUP_BASS_16, .name = "bass16"},
11317 {.id = ALC662_FIXUP_BASS_1A, .name = "bass1a"},
11318 {.id = ALC668_FIXUP_AUTO_MUTE, .name = "automute"},
11319 {.id = ALC668_FIXUP_DELL_XPS13, .name = "dell-xps13"},
11320 {.id = ALC662_FIXUP_ASUS_Nx50, .name = "asus-nx50"},
11321 {.id = ALC668_FIXUP_ASUS_Nx51, .name = "asus-nx51"},
11322 {.id = ALC668_FIXUP_ASUS_G751, .name = "asus-g751"},
11323 {.id = ALC891_FIXUP_HEADSET_MODE, .name = "alc891-headset"},
11324 {.id = ALC891_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc891-headset-multi"},
11325 {.id = ALC662_FIXUP_ACER_VERITON, .name = "acer-veriton"},
11326 {.id = ALC892_FIXUP_ASROCK_MOBO, .name = "asrock-mobo"},
11327 {.id = ALC662_FIXUP_USI_HEADSET_MODE, .name = "usi-headset"},
11328 {.id = ALC662_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
11329 {.id = ALC669_FIXUP_ACER_ASPIRE_ETHOS, .name = "aspire-ethos"},
11330 {}
11331};
11332
11333static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = {
11334 SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
11335 {0x17, 0x02211010},
11336 {0x18, 0x01a19030},
11337 {0x1a, 0x01813040},
11338 {0x21, 0x01014020}),
11339 SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
11340 {0x16, 0x01813030},
11341 {0x17, 0x02211010},
11342 {0x18, 0x01a19040},
11343 {0x21, 0x01014020}),
11344 SND_HDA_PIN_QUIRK(0x10ec0662, 0x1028, "Dell", ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
11345 {0x14, 0x01014010},
11346 {0x18, 0x01a19020},
11347 {0x1a, 0x0181302f},
11348 {0x1b, 0x0221401f}),
11349 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
11350 {0x12, 0x99a30130},
11351 {0x14, 0x90170110},
11352 {0x15, 0x0321101f},
11353 {0x16, 0x03011020}),
11354 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
11355 {0x12, 0x99a30140},
11356 {0x14, 0x90170110},
11357 {0x15, 0x0321101f},
11358 {0x16, 0x03011020}),
11359 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
11360 {0x12, 0x99a30150},
11361 {0x14, 0x90170110},
11362 {0x15, 0x0321101f},
11363 {0x16, 0x03011020}),
11364 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
11365 {0x14, 0x90170110},
11366 {0x15, 0x0321101f},
11367 {0x16, 0x03011020}),
11368 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell XPS 15", ALC668_FIXUP_AUTO_MUTE,
11369 {0x12, 0x90a60130},
11370 {0x14, 0x90170110},
11371 {0x15, 0x0321101f}),
11372 SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
11373 {0x14, 0x01014010},
11374 {0x17, 0x90170150},
11375 {0x19, 0x02a11060},
11376 {0x1b, 0x01813030},
11377 {0x21, 0x02211020}),
11378 SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
11379 {0x14, 0x01014010},
11380 {0x18, 0x01a19040},
11381 {0x1b, 0x01813030},
11382 {0x21, 0x02211020}),
11383 SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
11384 {0x14, 0x01014020},
11385 {0x17, 0x90170110},
11386 {0x18, 0x01a19050},
11387 {0x1b, 0x01813040},
11388 {0x21, 0x02211030}),
11389 {}
11390};
11391
11392
11393
11394static int patch_alc662(struct hda_codec *codec)
11395{
11396 struct alc_spec *spec;
11397 int err;
11398
11399 err = alc_alloc_spec(codec, 0x0b);
11400 if (err < 0)
11401 return err;
11402
11403 spec = codec->spec;
11404
11405 spec->shutup = alc_eapd_shutup;
11406
11407
11408 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
11409
11410 alc_fix_pll_init(codec, 0x20, 0x04, 15);
11411
11412 switch (codec->core.vendor_id) {
11413 case 0x10ec0668:
11414 spec->init_hook = alc668_restore_default_value;
11415 break;
11416 }
11417
11418 alc_pre_init(codec);
11419
11420 snd_hda_pick_fixup(codec, alc662_fixup_models,
11421 alc662_fixup_tbl, alc662_fixups);
11422 snd_hda_pick_pin_fixup(codec, alc662_pin_fixup_tbl, alc662_fixups, true);
11423 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
11424
11425 alc_auto_parse_customize_define(codec);
11426
11427 if (has_cdefine_beep(codec))
11428 spec->gen.beep_nid = 0x01;
11429
11430 if ((alc_get_coef0(codec) & (1 << 14)) &&
11431 codec->bus->pci && codec->bus->pci->subsystem_vendor == 0x1025 &&
11432 spec->cdefine.platform_type == 1) {
11433 err = alc_codec_rename(codec, "ALC272X");
11434 if (err < 0)
11435 goto error;
11436 }
11437
11438
11439 err = alc662_parse_auto_config(codec);
11440 if (err < 0)
11441 goto error;
11442
11443 if (!spec->gen.no_analog && spec->gen.beep_nid) {
11444 switch (codec->core.vendor_id) {
11445 case 0x10ec0662:
11446 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
11447 break;
11448 case 0x10ec0272:
11449 case 0x10ec0663:
11450 case 0x10ec0665:
11451 case 0x10ec0668:
11452 err = set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
11453 break;
11454 case 0x10ec0273:
11455 err = set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
11456 break;
11457 }
11458 if (err < 0)
11459 goto error;
11460 }
11461
11462 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
11463
11464 return 0;
11465
11466 error:
11467 alc_free(codec);
11468 return err;
11469}
11470
11471
11472
11473
11474
11475static int alc680_parse_auto_config(struct hda_codec *codec)
11476{
11477 return alc_parse_auto_config(codec, NULL, NULL);
11478}
11479
11480
11481
11482static int patch_alc680(struct hda_codec *codec)
11483{
11484 int err;
11485
11486
11487 err = alc_alloc_spec(codec, 0);
11488 if (err < 0)
11489 return err;
11490
11491
11492 err = alc680_parse_auto_config(codec);
11493 if (err < 0) {
11494 alc_free(codec);
11495 return err;
11496 }
11497
11498 return 0;
11499}
11500
11501
11502
11503
11504static const struct hda_device_id snd_hda_id_realtek[] = {
11505 HDA_CODEC_ENTRY(0x10ec0215, "ALC215", patch_alc269),
11506 HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269),
11507 HDA_CODEC_ENTRY(0x10ec0222, "ALC222", patch_alc269),
11508 HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269),
11509 HDA_CODEC_ENTRY(0x10ec0230, "ALC236", patch_alc269),
11510 HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269),
11511 HDA_CODEC_ENTRY(0x10ec0233, "ALC233", patch_alc269),
11512 HDA_CODEC_ENTRY(0x10ec0234, "ALC234", patch_alc269),
11513 HDA_CODEC_ENTRY(0x10ec0235, "ALC233", patch_alc269),
11514 HDA_CODEC_ENTRY(0x10ec0236, "ALC236", patch_alc269),
11515 HDA_CODEC_ENTRY(0x10ec0245, "ALC245", patch_alc269),
11516 HDA_CODEC_ENTRY(0x10ec0255, "ALC255", patch_alc269),
11517 HDA_CODEC_ENTRY(0x10ec0256, "ALC256", patch_alc269),
11518 HDA_CODEC_ENTRY(0x10ec0257, "ALC257", patch_alc269),
11519 HDA_CODEC_ENTRY(0x10ec0260, "ALC260", patch_alc260),
11520 HDA_CODEC_ENTRY(0x10ec0262, "ALC262", patch_alc262),
11521 HDA_CODEC_ENTRY(0x10ec0267, "ALC267", patch_alc268),
11522 HDA_CODEC_ENTRY(0x10ec0268, "ALC268", patch_alc268),
11523 HDA_CODEC_ENTRY(0x10ec0269, "ALC269", patch_alc269),
11524 HDA_CODEC_ENTRY(0x10ec0270, "ALC270", patch_alc269),
11525 HDA_CODEC_ENTRY(0x10ec0272, "ALC272", patch_alc662),
11526 HDA_CODEC_ENTRY(0x10ec0274, "ALC274", patch_alc269),
11527 HDA_CODEC_ENTRY(0x10ec0275, "ALC275", patch_alc269),
11528 HDA_CODEC_ENTRY(0x10ec0276, "ALC276", patch_alc269),
11529 HDA_CODEC_ENTRY(0x10ec0280, "ALC280", patch_alc269),
11530 HDA_CODEC_ENTRY(0x10ec0282, "ALC282", patch_alc269),
11531 HDA_CODEC_ENTRY(0x10ec0283, "ALC283", patch_alc269),
11532 HDA_CODEC_ENTRY(0x10ec0284, "ALC284", patch_alc269),
11533 HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269),
11534 HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269),
11535 HDA_CODEC_ENTRY(0x10ec0287, "ALC287", patch_alc269),
11536 HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269),
11537 HDA_CODEC_ENTRY(0x10ec0289, "ALC289", patch_alc269),
11538 HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269),
11539 HDA_CODEC_ENTRY(0x10ec0292, "ALC292", patch_alc269),
11540 HDA_CODEC_ENTRY(0x10ec0293, "ALC293", patch_alc269),
11541 HDA_CODEC_ENTRY(0x10ec0294, "ALC294", patch_alc269),
11542 HDA_CODEC_ENTRY(0x10ec0295, "ALC295", patch_alc269),
11543 HDA_CODEC_ENTRY(0x10ec0298, "ALC298", patch_alc269),
11544 HDA_CODEC_ENTRY(0x10ec0299, "ALC299", patch_alc269),
11545 HDA_CODEC_ENTRY(0x10ec0300, "ALC300", patch_alc269),
11546 HDA_CODEC_ENTRY(0x10ec0623, "ALC623", patch_alc269),
11547 HDA_CODEC_REV_ENTRY(0x10ec0861, 0x100340, "ALC660", patch_alc861),
11548 HDA_CODEC_ENTRY(0x10ec0660, "ALC660-VD", patch_alc861vd),
11549 HDA_CODEC_ENTRY(0x10ec0861, "ALC861", patch_alc861),
11550 HDA_CODEC_ENTRY(0x10ec0862, "ALC861-VD", patch_alc861vd),
11551 HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100002, "ALC662 rev2", patch_alc882),
11552 HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100101, "ALC662 rev1", patch_alc662),
11553 HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100300, "ALC662 rev3", patch_alc662),
11554 HDA_CODEC_ENTRY(0x10ec0663, "ALC663", patch_alc662),
11555 HDA_CODEC_ENTRY(0x10ec0665, "ALC665", patch_alc662),
11556 HDA_CODEC_ENTRY(0x10ec0667, "ALC667", patch_alc662),
11557 HDA_CODEC_ENTRY(0x10ec0668, "ALC668", patch_alc662),
11558 HDA_CODEC_ENTRY(0x10ec0670, "ALC670", patch_alc662),
11559 HDA_CODEC_ENTRY(0x10ec0671, "ALC671", patch_alc662),
11560 HDA_CODEC_ENTRY(0x10ec0680, "ALC680", patch_alc680),
11561 HDA_CODEC_ENTRY(0x10ec0700, "ALC700", patch_alc269),
11562 HDA_CODEC_ENTRY(0x10ec0701, "ALC701", patch_alc269),
11563 HDA_CODEC_ENTRY(0x10ec0703, "ALC703", patch_alc269),
11564 HDA_CODEC_ENTRY(0x10ec0711, "ALC711", patch_alc269),
11565 HDA_CODEC_ENTRY(0x10ec0867, "ALC891", patch_alc662),
11566 HDA_CODEC_ENTRY(0x10ec0880, "ALC880", patch_alc880),
11567 HDA_CODEC_ENTRY(0x10ec0882, "ALC882", patch_alc882),
11568 HDA_CODEC_ENTRY(0x10ec0883, "ALC883", patch_alc882),
11569 HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100101, "ALC889A", patch_alc882),
11570 HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100103, "ALC889A", patch_alc882),
11571 HDA_CODEC_ENTRY(0x10ec0885, "ALC885", patch_alc882),
11572 HDA_CODEC_ENTRY(0x10ec0887, "ALC887", patch_alc882),
11573 HDA_CODEC_REV_ENTRY(0x10ec0888, 0x100101, "ALC1200", patch_alc882),
11574 HDA_CODEC_ENTRY(0x10ec0888, "ALC888", patch_alc882),
11575 HDA_CODEC_ENTRY(0x10ec0889, "ALC889", patch_alc882),
11576 HDA_CODEC_ENTRY(0x10ec0892, "ALC892", patch_alc662),
11577 HDA_CODEC_ENTRY(0x10ec0897, "ALC897", patch_alc662),
11578 HDA_CODEC_ENTRY(0x10ec0899, "ALC898", patch_alc882),
11579 HDA_CODEC_ENTRY(0x10ec0900, "ALC1150", patch_alc882),
11580 HDA_CODEC_ENTRY(0x10ec0b00, "ALCS1200A", patch_alc882),
11581 HDA_CODEC_ENTRY(0x10ec1168, "ALC1220", patch_alc882),
11582 HDA_CODEC_ENTRY(0x10ec1220, "ALC1220", patch_alc882),
11583 {}
11584};
11585MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_realtek);
11586
11587MODULE_LICENSE("GPL");
11588MODULE_DESCRIPTION("Realtek HD-audio codec");
11589
11590static struct hda_codec_driver realtek_driver = {
11591 .id = snd_hda_id_realtek,
11592};
11593
11594module_hda_codec_driver(realtek_driver);
11595