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