Merge branch 'topic/hda-config-pm-cleanup' into for-next
[linux-2.6-block.git] / sound / pci / hda / patch_realtek.c
CommitLineData
d0fa1179 1// SPDX-License-Identifier: GPL-2.0-or-later
1da177e4
LT
2/*
3 * Universal Interface for Intel High Definition Audio Codec
4 *
1d045db9 5 * HD audio interface patch for Realtek ALC codecs
1da177e4 6 *
df694daa
KY
7 * Copyright (c) 2004 Kailang Yang <kailang@realtek.com.tw>
8 * PeiSen Hou <pshou@realtek.com.tw>
1da177e4 9 * Takashi Iwai <tiwai@suse.de>
409a3e98 10 * Jonathan Woithe <jwoithe@just42.net>
1da177e4
LT
11 */
12
7ce66933 13#include <linux/acpi.h>
1da177e4
LT
14#include <linux/init.h>
15#include <linux/delay.h>
16#include <linux/slab.h>
17#include <linux/pci.h>
08fb0d0e 18#include <linux/dmi.h>
da155d5b 19#include <linux/module.h>
33f4acd3 20#include <linux/input.h>
87dc3648 21#include <linux/leds.h>
35a17444 22#include <linux/ctype.h>
1da177e4 23#include <sound/core.h>
9ad0e496 24#include <sound/jack.h>
be57bfff 25#include <sound/hda_codec.h>
1da177e4 26#include "hda_local.h"
23d30f28 27#include "hda_auto_parser.h"
1835a0f9 28#include "hda_jack.h"
08c189f2 29#include "hda_generic.h"
d3dca026 30#include "hda_component.h"
1da177e4 31
cd63a5ff
TI
32/* keep halting ALC5505 DSP, for power saving */
33#define HALT_REALTEK_ALC5505
34
4a79ba34
TI
35/* extra amp-initialization sequence types */
36enum {
1c76aa5f 37 ALC_INIT_UNDEFINED,
4a79ba34
TI
38 ALC_INIT_NONE,
39 ALC_INIT_DEFAULT,
4a79ba34
TI
40};
41
73bdd597
DH
42enum {
43 ALC_HEADSET_MODE_UNKNOWN,
44 ALC_HEADSET_MODE_UNPLUGGED,
45 ALC_HEADSET_MODE_HEADSET,
46 ALC_HEADSET_MODE_MIC,
47 ALC_HEADSET_MODE_HEADPHONE,
48};
49
50enum {
51 ALC_HEADSET_TYPE_UNKNOWN,
52 ALC_HEADSET_TYPE_CTIA,
53 ALC_HEADSET_TYPE_OMTP,
54};
55
c7b60a89
HW
56enum {
57 ALC_KEY_MICMUTE_INDEX,
58};
59
da00c244
KY
60struct alc_customize_define {
61 unsigned int sku_cfg;
62 unsigned char port_connectivity;
63 unsigned char check_sum;
64 unsigned char customization;
65 unsigned char external_amp;
66 unsigned int enable_pcbeep:1;
67 unsigned int platform_type:1;
68 unsigned int swap:1;
69 unsigned int override:1;
90622917 70 unsigned int fixup:1; /* Means that this sku is set by driver, not read from hw */
da00c244
KY
71};
72
766538ac
TI
73struct alc_coef_led {
74 unsigned int idx;
75 unsigned int mask;
76 unsigned int on;
77 unsigned int off;
78};
79
1da177e4 80struct alc_spec {
08c189f2 81 struct hda_gen_spec gen; /* must be at head */
23d30f28 82
1da177e4 83 /* codec parameterization */
da00c244 84 struct alc_customize_define cdefine;
08c189f2 85 unsigned int parse_flags; /* flag for snd_hda_parse_pin_defcfg() */
834be88d 86
5579cd6f
TI
87 /* GPIO bits */
88 unsigned int gpio_mask;
89 unsigned int gpio_dir;
90 unsigned int gpio_data;
215c850c 91 bool gpio_write_delay; /* add a delay before writing gpio_data */
5579cd6f 92
8d3d1ece 93 /* mute LED for HP laptops, see vref_mute_led_set() */
08fb0d0e 94 int mute_led_polarity;
dbd13179 95 int micmute_led_polarity;
08fb0d0e 96 hda_nid_t mute_led_nid;
9c5dc3bf 97 hda_nid_t cap_mute_led_nid;
08fb0d0e 98
0f32fd19
TI
99 unsigned int gpio_mute_led_mask;
100 unsigned int gpio_mic_led_mask;
766538ac
TI
101 struct alc_coef_led mute_led_coef;
102 struct alc_coef_led mic_led_coef;
b837a9f5 103 struct mutex coef_mutex;
9f5c6faf 104
73bdd597
DH
105 hda_nid_t headset_mic_pin;
106 hda_nid_t headphone_mic_pin;
107 int current_headset_mode;
108 int current_headset_type;
109
ae6b813a
TI
110 /* hooks */
111 void (*init_hook)(struct hda_codec *codec);
c97259df 112 void (*power_hook)(struct hda_codec *codec);
1c716153 113 void (*shutup)(struct hda_codec *codec);
d922b51d 114
4a79ba34 115 int init_amp;
d433a678 116 int codec_variant; /* flag for other variants */
97a26570
KY
117 unsigned int has_alc5505_dsp:1;
118 unsigned int no_depop_delay:1;
693abe11 119 unsigned int done_hp_init:1;
c0ca5ece 120 unsigned int no_shutup_pins:1;
d3ba58bb 121 unsigned int ultra_low_power:1;
476c02e0 122 unsigned int has_hs_key:1;
92666d45 123 unsigned int no_internal_mic_pin:1;
69ea4c9d 124 unsigned int en_3kpull_low:1;
e64f14f4 125
2c3bf9ab
TI
126 /* for PLL fix */
127 hda_nid_t pll_nid;
128 unsigned int pll_coef_idx, pll_coef_bit;
1bb7e43e 129 unsigned int coef0;
33f4acd3 130 struct input_dev *kb_dev;
c7b60a89 131 u8 alc_mute_keycode_map[1];
d3dca026
LT
132
133 /* component binding */
d3dca026 134 struct hda_component comps[HDA_MAX_COMPONENTS];
df694daa
KY
135};
136
f2a227cd
TI
137/*
138 * COEF access helper functions
139 */
140
2a845837
TI
141static void coef_mutex_lock(struct hda_codec *codec)
142{
143 struct alc_spec *spec = codec->spec;
144
145 snd_hda_power_up_pm(codec);
146 mutex_lock(&spec->coef_mutex);
147}
148
149static void coef_mutex_unlock(struct hda_codec *codec)
150{
151 struct alc_spec *spec = codec->spec;
152
153 mutex_unlock(&spec->coef_mutex);
154 snd_hda_power_down_pm(codec);
155}
156
b837a9f5
TI
157static int __alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
158 unsigned int coef_idx)
f2a227cd
TI
159{
160 unsigned int val;
161
162 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
163 val = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PROC_COEF, 0);
164 return val;
165}
166
b837a9f5
TI
167static int alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
168 unsigned int coef_idx)
169{
b837a9f5
TI
170 unsigned int val;
171
2a845837 172 coef_mutex_lock(codec);
b837a9f5 173 val = __alc_read_coefex_idx(codec, nid, coef_idx);
2a845837 174 coef_mutex_unlock(codec);
b837a9f5
TI
175 return val;
176}
177
f2a227cd
TI
178#define alc_read_coef_idx(codec, coef_idx) \
179 alc_read_coefex_idx(codec, 0x20, coef_idx)
180
b837a9f5
TI
181static void __alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
182 unsigned int coef_idx, unsigned int coef_val)
f2a227cd
TI
183{
184 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
185 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PROC_COEF, coef_val);
186}
187
b837a9f5
TI
188static void alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
189 unsigned int coef_idx, unsigned int coef_val)
190{
2a845837 191 coef_mutex_lock(codec);
b837a9f5 192 __alc_write_coefex_idx(codec, nid, coef_idx, coef_val);
2a845837 193 coef_mutex_unlock(codec);
b837a9f5
TI
194}
195
f2a227cd
TI
196#define alc_write_coef_idx(codec, coef_idx, coef_val) \
197 alc_write_coefex_idx(codec, 0x20, coef_idx, coef_val)
198
b837a9f5
TI
199static void __alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
200 unsigned int coef_idx, unsigned int mask,
201 unsigned int bits_set)
202{
203 unsigned int val = __alc_read_coefex_idx(codec, nid, coef_idx);
204
205 if (val != -1)
206 __alc_write_coefex_idx(codec, nid, coef_idx,
207 (val & ~mask) | bits_set);
208}
209
98b24883
TI
210static void alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
211 unsigned int coef_idx, unsigned int mask,
212 unsigned int bits_set)
213{
2a845837 214 coef_mutex_lock(codec);
b837a9f5 215 __alc_update_coefex_idx(codec, nid, coef_idx, mask, bits_set);
2a845837 216 coef_mutex_unlock(codec);
98b24883
TI
217}
218
219#define alc_update_coef_idx(codec, coef_idx, mask, bits_set) \
220 alc_update_coefex_idx(codec, 0x20, coef_idx, mask, bits_set)
221
f2a227cd
TI
222/* a special bypass for COEF 0; read the cached value at the second time */
223static unsigned int alc_get_coef0(struct hda_codec *codec)
224{
225 struct alc_spec *spec = codec->spec;
226
227 if (!spec->coef0)
228 spec->coef0 = alc_read_coef_idx(codec, 0);
229 return spec->coef0;
230}
231
54db6c39
TI
232/* coef writes/updates batch */
233struct coef_fw {
234 unsigned char nid;
235 unsigned char idx;
236 unsigned short mask;
237 unsigned short val;
238};
239
240#define UPDATE_COEFEX(_nid, _idx, _mask, _val) \
241 { .nid = (_nid), .idx = (_idx), .mask = (_mask), .val = (_val) }
242#define WRITE_COEFEX(_nid, _idx, _val) UPDATE_COEFEX(_nid, _idx, -1, _val)
243#define WRITE_COEF(_idx, _val) WRITE_COEFEX(0x20, _idx, _val)
244#define UPDATE_COEF(_idx, _mask, _val) UPDATE_COEFEX(0x20, _idx, _mask, _val)
245
246static void alc_process_coef_fw(struct hda_codec *codec,
247 const struct coef_fw *fw)
248{
2a845837 249 coef_mutex_lock(codec);
54db6c39
TI
250 for (; fw->nid; fw++) {
251 if (fw->mask == (unsigned short)-1)
b837a9f5 252 __alc_write_coefex_idx(codec, fw->nid, fw->idx, fw->val);
54db6c39 253 else
b837a9f5
TI
254 __alc_update_coefex_idx(codec, fw->nid, fw->idx,
255 fw->mask, fw->val);
54db6c39 256 }
2a845837 257 coef_mutex_unlock(codec);
54db6c39
TI
258}
259
df694daa 260/*
1d045db9 261 * GPIO setup tables, used in initialization
df694daa 262 */
5579cd6f 263
bc9f98a9 264/* Enable GPIO mask and set output */
5579cd6f
TI
265static void alc_setup_gpio(struct hda_codec *codec, unsigned int mask)
266{
267 struct alc_spec *spec = codec->spec;
bc9f98a9 268
5579cd6f
TI
269 spec->gpio_mask |= mask;
270 spec->gpio_dir |= mask;
271 spec->gpio_data |= mask;
272}
bc9f98a9 273
5579cd6f
TI
274static void alc_write_gpio_data(struct hda_codec *codec)
275{
276 struct alc_spec *spec = codec->spec;
277
278 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
279 spec->gpio_data);
280}
281
aaf312de
TI
282static void alc_update_gpio_data(struct hda_codec *codec, unsigned int mask,
283 bool on)
284{
285 struct alc_spec *spec = codec->spec;
286 unsigned int oldval = spec->gpio_data;
287
288 if (on)
289 spec->gpio_data |= mask;
290 else
291 spec->gpio_data &= ~mask;
292 if (oldval != spec->gpio_data)
293 alc_write_gpio_data(codec);
294}
295
5579cd6f
TI
296static void alc_write_gpio(struct hda_codec *codec)
297{
298 struct alc_spec *spec = codec->spec;
299
300 if (!spec->gpio_mask)
301 return;
302
303 snd_hda_codec_write(codec, codec->core.afg, 0,
304 AC_VERB_SET_GPIO_MASK, spec->gpio_mask);
305 snd_hda_codec_write(codec, codec->core.afg, 0,
306 AC_VERB_SET_GPIO_DIRECTION, spec->gpio_dir);
215c850c
TI
307 if (spec->gpio_write_delay)
308 msleep(1);
5579cd6f
TI
309 alc_write_gpio_data(codec);
310}
311
312static void alc_fixup_gpio(struct hda_codec *codec, int action,
313 unsigned int mask)
314{
315 if (action == HDA_FIXUP_ACT_PRE_PROBE)
316 alc_setup_gpio(codec, mask);
317}
318
319static void alc_fixup_gpio1(struct hda_codec *codec,
320 const struct hda_fixup *fix, int action)
321{
322 alc_fixup_gpio(codec, action, 0x01);
323}
324
325static void alc_fixup_gpio2(struct hda_codec *codec,
326 const struct hda_fixup *fix, int action)
327{
328 alc_fixup_gpio(codec, action, 0x02);
329}
330
331static void alc_fixup_gpio3(struct hda_codec *codec,
332 const struct hda_fixup *fix, int action)
333{
334 alc_fixup_gpio(codec, action, 0x03);
335}
bdd148a3 336
ae065f1c
TI
337static void alc_fixup_gpio4(struct hda_codec *codec,
338 const struct hda_fixup *fix, int action)
339{
340 alc_fixup_gpio(codec, action, 0x04);
341}
342
8a503555
TI
343static void alc_fixup_micmute_led(struct hda_codec *codec,
344 const struct hda_fixup *fix, int action)
345{
e65bf997 346 if (action == HDA_FIXUP_ACT_PRE_PROBE)
8a503555
TI
347 snd_hda_gen_add_micmute_led_cdev(codec, NULL);
348}
349
2c3bf9ab
TI
350/*
351 * Fix hardware PLL issue
352 * On some codecs, the analog PLL gating control must be off while
353 * the default value is 1.
354 */
355static void alc_fix_pll(struct hda_codec *codec)
356{
357 struct alc_spec *spec = codec->spec;
2c3bf9ab 358
98b24883
TI
359 if (spec->pll_nid)
360 alc_update_coefex_idx(codec, spec->pll_nid, spec->pll_coef_idx,
361 1 << spec->pll_coef_bit, 0);
2c3bf9ab
TI
362}
363
364static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
365 unsigned int coef_idx, unsigned int coef_bit)
366{
367 struct alc_spec *spec = codec->spec;
368 spec->pll_nid = nid;
369 spec->pll_coef_idx = coef_idx;
370 spec->pll_coef_bit = coef_bit;
371 alc_fix_pll(codec);
372}
373
cf5a2279 374/* update the master volume per volume-knob's unsol event */
1a4f69d5
TI
375static void alc_update_knob_master(struct hda_codec *codec,
376 struct hda_jack_callback *jack)
cf5a2279
TI
377{
378 unsigned int val;
379 struct snd_kcontrol *kctl;
380 struct snd_ctl_elem_value *uctl;
381
382 kctl = snd_hda_find_mixer_ctl(codec, "Master Playback Volume");
383 if (!kctl)
384 return;
385 uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
386 if (!uctl)
387 return;
2ebab40e 388 val = snd_hda_codec_read(codec, jack->nid, 0,
cf5a2279
TI
389 AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
390 val &= HDA_AMP_VOLMASK;
391 uctl->value.integer.value[0] = val;
392 uctl->value.integer.value[1] = val;
393 kctl->put(kctl, uctl);
394 kfree(uctl);
395}
396
29adc4b9 397static void alc880_unsol_event(struct hda_codec *codec, unsigned int res)
f21d78e2 398{
29adc4b9
DH
399 /* For some reason, the res given from ALC880 is broken.
400 Here we adjust it properly. */
401 snd_hda_jack_unsol_event(codec, res >> 2);
f21d78e2
TI
402}
403
394c97f8
KY
404/* Change EAPD to verb control */
405static void alc_fill_eapd_coef(struct hda_codec *codec)
406{
407 int coef;
408
409 coef = alc_get_coef0(codec);
410
7639a06c 411 switch (codec->core.vendor_id) {
394c97f8
KY
412 case 0x10ec0262:
413 alc_update_coef_idx(codec, 0x7, 0, 1<<5);
414 break;
415 case 0x10ec0267:
416 case 0x10ec0268:
417 alc_update_coef_idx(codec, 0x7, 0, 1<<13);
418 break;
419 case 0x10ec0269:
420 if ((coef & 0x00f0) == 0x0010)
421 alc_update_coef_idx(codec, 0xd, 0, 1<<14);
422 if ((coef & 0x00f0) == 0x0020)
423 alc_update_coef_idx(codec, 0x4, 1<<15, 0);
424 if ((coef & 0x00f0) == 0x0030)
425 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
426 break;
427 case 0x10ec0280:
428 case 0x10ec0284:
429 case 0x10ec0290:
430 case 0x10ec0292:
431 alc_update_coef_idx(codec, 0x4, 1<<15, 0);
432 break;
4231430d 433 case 0x10ec0225:
44be77c5
TI
434 case 0x10ec0295:
435 case 0x10ec0299:
436 alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
c0dbbdad 437 fallthrough;
44be77c5 438 case 0x10ec0215:
fcfc9f71
KY
439 case 0x10ec0285:
440 case 0x10ec0289:
441 alc_update_coef_idx(codec, 0x36, 1<<13, 0);
442 fallthrough;
1948fc06 443 case 0x10ec0230:
394c97f8 444 case 0x10ec0233:
ea04a1db 445 case 0x10ec0235:
c4473744 446 case 0x10ec0236:
7fbdcd83 447 case 0x10ec0245:
394c97f8 448 case 0x10ec0255:
c4473744 449 case 0x10ec0256:
527f4643 450 case 0x19e58326:
f429e7e4 451 case 0x10ec0257:
394c97f8
KY
452 case 0x10ec0282:
453 case 0x10ec0283:
454 case 0x10ec0286:
455 case 0x10ec0288:
506b62c3 456 case 0x10ec0298:
1078bef0 457 case 0x10ec0300:
394c97f8
KY
458 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
459 break;
3aabf94c
KY
460 case 0x10ec0275:
461 alc_update_coef_idx(codec, 0xe, 0, 1<<0);
462 break;
8822702f
HW
463 case 0x10ec0287:
464 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
465 alc_write_coef_idx(codec, 0x8, 0x4ab7);
466 break;
394c97f8
KY
467 case 0x10ec0293:
468 alc_update_coef_idx(codec, 0xa, 1<<13, 0);
469 break;
dcd4f0db
KY
470 case 0x10ec0234:
471 case 0x10ec0274:
472 case 0x10ec0294:
6fbae35a
KY
473 case 0x10ec0700:
474 case 0x10ec0701:
475 case 0x10ec0703:
83629532 476 case 0x10ec0711:
dcd4f0db
KY
477 alc_update_coef_idx(codec, 0x10, 1<<15, 0);
478 break;
394c97f8
KY
479 case 0x10ec0662:
480 if ((coef & 0x00f0) == 0x0030)
481 alc_update_coef_idx(codec, 0x4, 1<<10, 0); /* EAPD Ctrl */
482 break;
483 case 0x10ec0272:
484 case 0x10ec0273:
485 case 0x10ec0663:
486 case 0x10ec0665:
487 case 0x10ec0670:
488 case 0x10ec0671:
489 case 0x10ec0672:
490 alc_update_coef_idx(codec, 0xd, 0, 1<<14); /* EAPD Ctrl */
491 break;
9194a1eb 492 case 0x10ec0222:
f0778871
KY
493 case 0x10ec0623:
494 alc_update_coef_idx(codec, 0x19, 1<<13, 0);
495 break;
394c97f8
KY
496 case 0x10ec0668:
497 alc_update_coef_idx(codec, 0x7, 3<<13, 0);
498 break;
499 case 0x10ec0867:
500 alc_update_coef_idx(codec, 0x4, 1<<10, 0);
501 break;
502 case 0x10ec0888:
503 if ((coef & 0x00f0) == 0x0020 || (coef & 0x00f0) == 0x0030)
504 alc_update_coef_idx(codec, 0x7, 1<<5, 0);
505 break;
506 case 0x10ec0892:
e5782a5d 507 case 0x10ec0897:
394c97f8
KY
508 alc_update_coef_idx(codec, 0x7, 1<<5, 0);
509 break;
510 case 0x10ec0899:
511 case 0x10ec0900:
6d9ffcff 512 case 0x10ec0b00:
65553b12 513 case 0x10ec1168:
a535ad57 514 case 0x10ec1220:
394c97f8
KY
515 alc_update_coef_idx(codec, 0x7, 1<<1, 0);
516 break;
517 }
518}
519
f9423e7a
KY
520/* additional initialization for ALC888 variants */
521static void alc888_coef_init(struct hda_codec *codec)
522{
1df8874b
KY
523 switch (alc_get_coef0(codec) & 0x00f0) {
524 /* alc888-VA */
525 case 0x00:
526 /* alc888-VB */
527 case 0x10:
528 alc_update_coef_idx(codec, 7, 0, 0x2030); /* Turn EAPD to High */
529 break;
530 }
87a8c370
JK
531}
532
3fb4a508
TI
533/* turn on/off EAPD control (only if available) */
534static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
535{
536 if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
537 return;
538 if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
539 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
540 on ? 2 : 0);
541}
542
691f1fcc
TI
543/* turn on/off EAPD controls of the codec */
544static void alc_auto_setup_eapd(struct hda_codec *codec, bool on)
545{
546 /* We currently only handle front, HP */
caf3c043 547 static const hda_nid_t pins[] = {
af95b414 548 0x0f, 0x10, 0x14, 0x15, 0x17, 0
39fa84e9 549 };
caf3c043 550 const hda_nid_t *p;
39fa84e9
TI
551 for (p = pins; *p; p++)
552 set_eapd(codec, *p, on);
691f1fcc
TI
553}
554
dad3197d
KY
555static int find_ext_mic_pin(struct hda_codec *codec);
556
557static void alc_headset_mic_no_shutup(struct hda_codec *codec)
558{
559 const struct hda_pincfg *pin;
560 int mic_pin = find_ext_mic_pin(codec);
561 int i;
562
563 /* don't shut up pins when unloading the driver; otherwise it breaks
564 * the default pin setup at the next load of the driver
565 */
566 if (codec->bus->shutdown)
567 return;
568
569 snd_array_for_each(&codec->init_pins, i, pin) {
570 /* use read here for syncing after issuing each verb */
571 if (pin->nid != mic_pin)
572 snd_hda_codec_read(codec, pin->nid, 0,
573 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
574 }
575
576 codec->pins_shutup = 1;
577}
578
c0ca5ece
TI
579static void alc_shutup_pins(struct hda_codec *codec)
580{
581 struct alc_spec *spec = codec->spec;
582
dad3197d 583 switch (codec->core.vendor_id) {
5aec9891
KY
584 case 0x10ec0236:
585 case 0x10ec0256:
527f4643 586 case 0x19e58326:
66c5d718 587 case 0x10ec0283:
dad3197d
KY
588 case 0x10ec0286:
589 case 0x10ec0288:
590 case 0x10ec0298:
591 alc_headset_mic_no_shutup(codec);
592 break;
593 default:
594 if (!spec->no_shutup_pins)
595 snd_hda_shutup_pins(codec);
596 break;
597 }
c0ca5ece
TI
598}
599
1c716153 600/* generic shutup callback;
4ce8e6a5 601 * just turning off EAPD and a little pause for avoiding pop-noise
1c716153
TI
602 */
603static void alc_eapd_shutup(struct hda_codec *codec)
604{
97a26570
KY
605 struct alc_spec *spec = codec->spec;
606
1c716153 607 alc_auto_setup_eapd(codec, false);
97a26570
KY
608 if (!spec->no_depop_delay)
609 msleep(200);
c0ca5ece 610 alc_shutup_pins(codec);
1c716153
TI
611}
612
1d045db9 613/* generic EAPD initialization */
4a79ba34 614static void alc_auto_init_amp(struct hda_codec *codec, int type)
bc9f98a9 615{
39fa84e9 616 alc_auto_setup_eapd(codec, true);
5579cd6f 617 alc_write_gpio(codec);
4a79ba34 618 switch (type) {
4a79ba34 619 case ALC_INIT_DEFAULT:
7639a06c 620 switch (codec->core.vendor_id) {
c9b58006 621 case 0x10ec0260:
98b24883 622 alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x2010);
c9b58006 623 break;
c9b58006
KY
624 case 0x10ec0880:
625 case 0x10ec0882:
626 case 0x10ec0883:
627 case 0x10ec0885:
1df8874b 628 alc_update_coef_idx(codec, 7, 0, 0x2030);
c9b58006 629 break;
f9423e7a 630 case 0x10ec0888:
4a79ba34 631 alc888_coef_init(codec);
f9423e7a 632 break;
bc9f98a9 633 }
4a79ba34
TI
634 break;
635 }
636}
637
35a39f98
TI
638/* get a primary headphone pin if available */
639static hda_nid_t alc_get_hp_pin(struct alc_spec *spec)
640{
641 if (spec->gen.autocfg.hp_pins[0])
642 return spec->gen.autocfg.hp_pins[0];
643 if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
644 return spec->gen.autocfg.line_out_pins[0];
645 return 0;
646}
08c189f2 647
1d045db9 648/*
08c189f2 649 * Realtek SSID verification
1d045db9 650 */
42cf0d01 651
08c189f2
TI
652/* Could be any non-zero and even value. When used as fixup, tells
653 * the driver to ignore any present sku defines.
654 */
655#define ALC_FIXUP_SKU_IGNORE (2)
1a1455de 656
08c189f2
TI
657static void alc_fixup_sku_ignore(struct hda_codec *codec,
658 const struct hda_fixup *fix, int action)
1a1455de 659{
1a1455de 660 struct alc_spec *spec = codec->spec;
08c189f2
TI
661 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
662 spec->cdefine.fixup = 1;
663 spec->cdefine.sku_cfg = ALC_FIXUP_SKU_IGNORE;
1a1455de 664 }
1a1455de
TI
665}
666
b5c6611f
ML
667static void alc_fixup_no_depop_delay(struct hda_codec *codec,
668 const struct hda_fixup *fix, int action)
669{
670 struct alc_spec *spec = codec->spec;
671
84d2dc3e 672 if (action == HDA_FIXUP_ACT_PROBE) {
b5c6611f 673 spec->no_depop_delay = 1;
84d2dc3e
ML
674 codec->depop_delay = 0;
675 }
b5c6611f
ML
676}
677
08c189f2 678static int alc_auto_parse_customize_define(struct hda_codec *codec)
4a79ba34 679{
08c189f2
TI
680 unsigned int ass, tmp, i;
681 unsigned nid = 0;
4a79ba34
TI
682 struct alc_spec *spec = codec->spec;
683
08c189f2 684 spec->cdefine.enable_pcbeep = 1; /* assume always enabled */
4a79ba34 685
08c189f2
TI
686 if (spec->cdefine.fixup) {
687 ass = spec->cdefine.sku_cfg;
688 if (ass == ALC_FIXUP_SKU_IGNORE)
689 return -1;
690 goto do_sku;
bb35febd
TI
691 }
692
5100cd07
TI
693 if (!codec->bus->pci)
694 return -1;
7639a06c 695 ass = codec->core.subsystem_id & 0xffff;
08c189f2
TI
696 if (ass != codec->bus->pci->subsystem_device && (ass & 1))
697 goto do_sku;
4a79ba34 698
08c189f2 699 nid = 0x1d;
7639a06c 700 if (codec->core.vendor_id == 0x10ec0260)
08c189f2
TI
701 nid = 0x17;
702 ass = snd_hda_codec_get_pincfg(codec, nid);
42cf0d01 703
08c189f2 704 if (!(ass & 1)) {
4e76a883 705 codec_info(codec, "%s: SKU not ready 0x%08x\n",
7639a06c 706 codec->core.chip_name, ass);
08c189f2 707 return -1;
42cf0d01
DH
708 }
709
08c189f2
TI
710 /* check sum */
711 tmp = 0;
712 for (i = 1; i < 16; i++) {
713 if ((ass >> i) & 1)
714 tmp++;
ae8a60a5 715 }
08c189f2
TI
716 if (((ass >> 16) & 0xf) != tmp)
717 return -1;
ae8a60a5 718
da00c244
KY
719 spec->cdefine.port_connectivity = ass >> 30;
720 spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
721 spec->cdefine.check_sum = (ass >> 16) & 0xf;
722 spec->cdefine.customization = ass >> 8;
723do_sku:
724 spec->cdefine.sku_cfg = ass;
725 spec->cdefine.external_amp = (ass & 0x38) >> 3;
726 spec->cdefine.platform_type = (ass & 0x4) >> 2;
727 spec->cdefine.swap = (ass & 0x2) >> 1;
728 spec->cdefine.override = ass & 0x1;
729
4e76a883 730 codec_dbg(codec, "SKU: Nid=0x%x sku_cfg=0x%08x\n",
da00c244 731 nid, spec->cdefine.sku_cfg);
4e76a883 732 codec_dbg(codec, "SKU: port_connectivity=0x%x\n",
da00c244 733 spec->cdefine.port_connectivity);
4e76a883
TI
734 codec_dbg(codec, "SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
735 codec_dbg(codec, "SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
736 codec_dbg(codec, "SKU: customization=0x%08x\n", spec->cdefine.customization);
737 codec_dbg(codec, "SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
738 codec_dbg(codec, "SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
739 codec_dbg(codec, "SKU: swap=0x%x\n", spec->cdefine.swap);
740 codec_dbg(codec, "SKU: override=0x%x\n", spec->cdefine.override);
da00c244
KY
741
742 return 0;
743}
744
08c189f2
TI
745/* return the position of NID in the list, or -1 if not found */
746static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
747{
748 int i;
749 for (i = 0; i < nums; i++)
750 if (list[i] == nid)
751 return i;
752 return -1;
753}
1d045db9 754/* return true if the given NID is found in the list */
3af9ee6b
TI
755static bool found_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
756{
21268961 757 return find_idx_in_nid_list(nid, list, nums) >= 0;
3af9ee6b
TI
758}
759
4a79ba34
TI
760/* check subsystem ID and set up device-specific initialization;
761 * return 1 if initialized, 0 if invalid SSID
762 */
763/* 32-bit subsystem ID for BIOS loading in HD Audio codec.
764 * 31 ~ 16 : Manufacture ID
765 * 15 ~ 8 : SKU ID
766 * 7 ~ 0 : Assembly ID
767 * port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
768 */
58c57cfa 769static int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports)
4a79ba34
TI
770{
771 unsigned int ass, tmp, i;
772 unsigned nid;
773 struct alc_spec *spec = codec->spec;
774
90622917
DH
775 if (spec->cdefine.fixup) {
776 ass = spec->cdefine.sku_cfg;
777 if (ass == ALC_FIXUP_SKU_IGNORE)
778 return 0;
779 goto do_sku;
780 }
781
7639a06c 782 ass = codec->core.subsystem_id & 0xffff;
5100cd07
TI
783 if (codec->bus->pci &&
784 ass != codec->bus->pci->subsystem_device && (ass & 1))
4a79ba34
TI
785 goto do_sku;
786
787 /* invalid SSID, check the special NID pin defcfg instead */
788 /*
def319f9 789 * 31~30 : port connectivity
4a79ba34
TI
790 * 29~21 : reserve
791 * 20 : PCBEEP input
792 * 19~16 : Check sum (15:1)
793 * 15~1 : Custom
794 * 0 : override
795 */
796 nid = 0x1d;
7639a06c 797 if (codec->core.vendor_id == 0x10ec0260)
4a79ba34
TI
798 nid = 0x17;
799 ass = snd_hda_codec_get_pincfg(codec, nid);
4e76a883
TI
800 codec_dbg(codec,
801 "realtek: No valid SSID, checking pincfg 0x%08x for NID 0x%x\n",
cb6605c1 802 ass, nid);
6227cdce 803 if (!(ass & 1))
4a79ba34
TI
804 return 0;
805 if ((ass >> 30) != 1) /* no physical connection */
806 return 0;
807
808 /* check sum */
809 tmp = 0;
810 for (i = 1; i < 16; i++) {
811 if ((ass >> i) & 1)
812 tmp++;
813 }
814 if (((ass >> 16) & 0xf) != tmp)
815 return 0;
816do_sku:
4e76a883 817 codec_dbg(codec, "realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
7639a06c 818 ass & 0xffff, codec->core.vendor_id);
4a79ba34
TI
819 /*
820 * 0 : override
821 * 1 : Swap Jack
822 * 2 : 0 --> Desktop, 1 --> Laptop
823 * 3~5 : External Amplifier control
824 * 7~6 : Reserved
825 */
826 tmp = (ass & 0x38) >> 3; /* external Amp control */
1c76aa5f
TI
827 if (spec->init_amp == ALC_INIT_UNDEFINED) {
828 switch (tmp) {
829 case 1:
5579cd6f 830 alc_setup_gpio(codec, 0x01);
1c76aa5f
TI
831 break;
832 case 3:
5579cd6f 833 alc_setup_gpio(codec, 0x02);
1c76aa5f
TI
834 break;
835 case 7:
2bdccfd2 836 alc_setup_gpio(codec, 0x04);
1c76aa5f
TI
837 break;
838 case 5:
839 default:
840 spec->init_amp = ALC_INIT_DEFAULT;
841 break;
842 }
bc9f98a9 843 }
ea1fb29a 844
8c427226 845 /* is laptop or Desktop and enable the function "Mute internal speaker
c9b58006
KY
846 * when the external headphone out jack is plugged"
847 */
8c427226 848 if (!(ass & 0x8000))
4a79ba34 849 return 1;
c9b58006
KY
850 /*
851 * 10~8 : Jack location
852 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
853 * 14~13: Resvered
854 * 15 : 1 --> enable the function "Mute internal speaker
855 * when the external headphone out jack is plugged"
856 */
35a39f98 857 if (!alc_get_hp_pin(spec)) {
01d4825d 858 hda_nid_t nid;
c9b58006 859 tmp = (ass >> 11) & 0x3; /* HP to chassis */
58c57cfa 860 nid = ports[tmp];
08c189f2
TI
861 if (found_in_nid_list(nid, spec->gen.autocfg.line_out_pins,
862 spec->gen.autocfg.line_outs))
3af9ee6b 863 return 1;
08c189f2 864 spec->gen.autocfg.hp_pins[0] = nid;
c9b58006 865 }
4a79ba34
TI
866 return 1;
867}
ea1fb29a 868
3e6179b8
TI
869/* Check the validity of ALC subsystem-id
870 * ports contains an array of 4 pin NIDs for port-A, E, D and I */
871static void alc_ssid_check(struct hda_codec *codec, const hda_nid_t *ports)
4a79ba34 872{
58c57cfa 873 if (!alc_subsystem_id(codec, ports)) {
4a79ba34 874 struct alc_spec *spec = codec->spec;
67791202
TI
875 if (spec->init_amp == ALC_INIT_UNDEFINED) {
876 codec_dbg(codec,
877 "realtek: Enable default setup for auto mode as fallback\n");
878 spec->init_amp = ALC_INIT_DEFAULT;
879 }
4a79ba34 880 }
21268961 881}
1a1455de 882
1d045db9 883/*
ef8ef5fb 884 */
f9e336f6 885
9d36a7dc
DH
886static void alc_fixup_inv_dmic(struct hda_codec *codec,
887 const struct hda_fixup *fix, int action)
125821ae
TI
888{
889 struct alc_spec *spec = codec->spec;
668d1e96 890
9d36a7dc 891 spec->gen.inv_dmic_split = 1;
6e72aa5f
TI
892}
893
e9edcee0 894
08c189f2 895static int alc_build_controls(struct hda_codec *codec)
1d045db9 896{
a5cb463a 897 int err;
e9427969 898
08c189f2
TI
899 err = snd_hda_gen_build_controls(codec);
900 if (err < 0)
901 return err;
1da177e4 902
1727a771 903 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_BUILD);
1c4a54b4 904 return 0;
a361d84b
KY
905}
906
a361d84b 907
df694daa 908/*
08c189f2 909 * Common callbacks
df694daa 910 */
a361d84b 911
c9af753f
TI
912static void alc_pre_init(struct hda_codec *codec)
913{
914 alc_fill_eapd_coef(codec);
915}
916
aeac1a0d
KY
917#define is_s3_resume(codec) \
918 ((codec)->core.dev.power.power_state.event == PM_EVENT_RESUME)
c9af753f
TI
919#define is_s4_resume(codec) \
920 ((codec)->core.dev.power.power_state.event == PM_EVENT_RESTORE)
1e707769
KY
921#define is_s4_suspend(codec) \
922 ((codec)->core.dev.power.power_state.event == PM_EVENT_FREEZE)
c9af753f 923
08c189f2 924static int alc_init(struct hda_codec *codec)
1d045db9
TI
925{
926 struct alc_spec *spec = codec->spec;
a361d84b 927
c9af753f
TI
928 /* hibernation resume needs the full chip initialization */
929 if (is_s4_resume(codec))
930 alc_pre_init(codec);
931
08c189f2
TI
932 if (spec->init_hook)
933 spec->init_hook(codec);
a361d84b 934
89781d08 935 spec->gen.skip_verbs = 1; /* applied in below */
607ca3bd 936 snd_hda_gen_init(codec);
08c189f2
TI
937 alc_fix_pll(codec);
938 alc_auto_init_amp(codec, spec->init_amp);
89781d08 939 snd_hda_apply_verbs(codec); /* apply verbs here after own init */
3abf2f36 940
1727a771 941 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT);
a361d84b 942
1d045db9
TI
943 return 0;
944}
a361d84b 945
c3d9ca93
RD
946#define alc_free snd_hda_gen_free
947
08c189f2 948static inline void alc_shutup(struct hda_codec *codec)
1d045db9
TI
949{
950 struct alc_spec *spec = codec->spec;
a361d84b 951
c7273bd6
TI
952 if (!snd_hda_get_bool_hint(codec, "shutup"))
953 return; /* disabled explicitly by hints */
954
08c189f2
TI
955 if (spec && spec->shutup)
956 spec->shutup(codec);
9bfb2844 957 else
c0ca5ece 958 alc_shutup_pins(codec);
1d045db9
TI
959}
960
08c189f2 961static void alc_power_eapd(struct hda_codec *codec)
1d045db9 962{
08c189f2 963 alc_auto_setup_eapd(codec, false);
1d045db9 964}
2134ea4f 965
08c189f2 966static int alc_suspend(struct hda_codec *codec)
1d045db9
TI
967{
968 struct alc_spec *spec = codec->spec;
08c189f2
TI
969 alc_shutup(codec);
970 if (spec && spec->power_hook)
971 spec->power_hook(codec);
a361d84b
KY
972 return 0;
973}
974
08c189f2 975static int alc_resume(struct hda_codec *codec)
1d045db9 976{
97a26570
KY
977 struct alc_spec *spec = codec->spec;
978
979 if (!spec->no_depop_delay)
980 msleep(150); /* to avoid pop noise */
08c189f2 981 codec->patch_ops.init(codec);
1a462be5 982 snd_hda_regmap_sync(codec);
08c189f2
TI
983 hda_call_check_power_status(codec, 0x01);
984 return 0;
1d045db9 985}
f6a92248 986
1d045db9 987/*
1d045db9 988 */
08c189f2
TI
989static const struct hda_codec_ops alc_patch_ops = {
990 .build_controls = alc_build_controls,
991 .build_pcms = snd_hda_gen_build_pcms,
992 .init = alc_init,
993 .free = alc_free,
994 .unsol_event = snd_hda_jack_unsol_event,
08c189f2 995 .resume = alc_resume,
08c189f2 996 .suspend = alc_suspend,
fce52a3b 997 .check_power_status = snd_hda_gen_check_power_status,
08c189f2 998};
f6a92248 999
f53281e6 1000
ded255be 1001#define alc_codec_rename(codec, name) snd_hda_codec_set_name(codec, name)
e01bf509 1002
e4770629 1003/*
4b016931 1004 * Rename codecs appropriately from COEF value or subvendor id
e4770629 1005 */
08c189f2
TI
1006struct alc_codec_rename_table {
1007 unsigned int vendor_id;
1008 unsigned short coef_mask;
1009 unsigned short coef_bits;
1010 const char *name;
1011};
84898e87 1012
4b016931
KY
1013struct alc_codec_rename_pci_table {
1014 unsigned int codec_vendor_id;
1015 unsigned short pci_subvendor;
1016 unsigned short pci_subdevice;
1017 const char *name;
1018};
1019
6b0f95c4 1020static const struct alc_codec_rename_table rename_tbl[] = {
e6e5f7ad 1021 { 0x10ec0221, 0xf00f, 0x1003, "ALC231" },
08c189f2
TI
1022 { 0x10ec0269, 0xfff0, 0x3010, "ALC277" },
1023 { 0x10ec0269, 0xf0f0, 0x2010, "ALC259" },
1024 { 0x10ec0269, 0xf0f0, 0x3010, "ALC258" },
1025 { 0x10ec0269, 0x00f0, 0x0010, "ALC269VB" },
1026 { 0x10ec0269, 0xffff, 0xa023, "ALC259" },
1027 { 0x10ec0269, 0xffff, 0x6023, "ALC281X" },
1028 { 0x10ec0269, 0x00f0, 0x0020, "ALC269VC" },
1029 { 0x10ec0269, 0x00f0, 0x0030, "ALC269VD" },
e6e5f7ad 1030 { 0x10ec0662, 0xffff, 0x4020, "ALC656" },
08c189f2
TI
1031 { 0x10ec0887, 0x00f0, 0x0030, "ALC887-VD" },
1032 { 0x10ec0888, 0x00f0, 0x0030, "ALC888-VD" },
1033 { 0x10ec0888, 0xf0f0, 0x3020, "ALC886" },
1034 { 0x10ec0899, 0x2000, 0x2000, "ALC899" },
1035 { 0x10ec0892, 0xffff, 0x8020, "ALC661" },
1036 { 0x10ec0892, 0xffff, 0x8011, "ALC661" },
1037 { 0x10ec0892, 0xffff, 0x4011, "ALC656" },
1038 { } /* terminator */
1039};
84898e87 1040
6b0f95c4 1041static const struct alc_codec_rename_pci_table rename_pci_tbl[] = {
4b016931
KY
1042 { 0x10ec0280, 0x1028, 0, "ALC3220" },
1043 { 0x10ec0282, 0x1028, 0, "ALC3221" },
1044 { 0x10ec0283, 0x1028, 0, "ALC3223" },
193177de 1045 { 0x10ec0288, 0x1028, 0, "ALC3263" },
4b016931 1046 { 0x10ec0292, 0x1028, 0, "ALC3226" },
193177de 1047 { 0x10ec0293, 0x1028, 0, "ALC3235" },
4b016931
KY
1048 { 0x10ec0255, 0x1028, 0, "ALC3234" },
1049 { 0x10ec0668, 0x1028, 0, "ALC3661" },
e6e5f7ad
KY
1050 { 0x10ec0275, 0x1028, 0, "ALC3260" },
1051 { 0x10ec0899, 0x1028, 0, "ALC3861" },
2c674fac 1052 { 0x10ec0298, 0x1028, 0, "ALC3266" },
736f20a7 1053 { 0x10ec0236, 0x1028, 0, "ALC3204" },
82324502 1054 { 0x10ec0256, 0x1028, 0, "ALC3246" },
4231430d 1055 { 0x10ec0225, 0x1028, 0, "ALC3253" },
7d727869 1056 { 0x10ec0295, 0x1028, 0, "ALC3254" },
28f1f9b2 1057 { 0x10ec0299, 0x1028, 0, "ALC3271" },
e6e5f7ad
KY
1058 { 0x10ec0670, 0x1025, 0, "ALC669X" },
1059 { 0x10ec0676, 0x1025, 0, "ALC679X" },
1060 { 0x10ec0282, 0x1043, 0, "ALC3229" },
1061 { 0x10ec0233, 0x1043, 0, "ALC3236" },
1062 { 0x10ec0280, 0x103c, 0, "ALC3228" },
1063 { 0x10ec0282, 0x103c, 0, "ALC3227" },
1064 { 0x10ec0286, 0x103c, 0, "ALC3242" },
1065 { 0x10ec0290, 0x103c, 0, "ALC3241" },
1066 { 0x10ec0668, 0x103c, 0, "ALC3662" },
1067 { 0x10ec0283, 0x17aa, 0, "ALC3239" },
1068 { 0x10ec0292, 0x17aa, 0, "ALC3232" },
4b016931
KY
1069 { } /* terminator */
1070};
1071
08c189f2 1072static int alc_codec_rename_from_preset(struct hda_codec *codec)
1d045db9 1073{
08c189f2 1074 const struct alc_codec_rename_table *p;
4b016931 1075 const struct alc_codec_rename_pci_table *q;
60db6b53 1076
08c189f2 1077 for (p = rename_tbl; p->vendor_id; p++) {
7639a06c 1078 if (p->vendor_id != codec->core.vendor_id)
08c189f2
TI
1079 continue;
1080 if ((alc_get_coef0(codec) & p->coef_mask) == p->coef_bits)
1081 return alc_codec_rename(codec, p->name);
1d045db9 1082 }
4b016931 1083
5100cd07
TI
1084 if (!codec->bus->pci)
1085 return 0;
4b016931 1086 for (q = rename_pci_tbl; q->codec_vendor_id; q++) {
7639a06c 1087 if (q->codec_vendor_id != codec->core.vendor_id)
4b016931
KY
1088 continue;
1089 if (q->pci_subvendor != codec->bus->pci->subsystem_vendor)
1090 continue;
1091 if (!q->pci_subdevice ||
1092 q->pci_subdevice == codec->bus->pci->subsystem_device)
1093 return alc_codec_rename(codec, q->name);
1094 }
1095
08c189f2 1096 return 0;
1d045db9 1097}
f53281e6 1098
e4770629 1099
1d045db9
TI
1100/*
1101 * Digital-beep handlers
1102 */
1103#ifdef CONFIG_SND_HDA_INPUT_BEEP
fea80fae
TI
1104
1105/* additional beep mixers; private_value will be overwritten */
1106static const struct snd_kcontrol_new alc_beep_mixer[] = {
1107 HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
1108 HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
1109};
1110
1111/* set up and create beep controls */
1112static int set_beep_amp(struct alc_spec *spec, hda_nid_t nid,
1113 int idx, int dir)
1114{
1115 struct snd_kcontrol_new *knew;
1116 unsigned int beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir);
1117 int i;
1118
1119 for (i = 0; i < ARRAY_SIZE(alc_beep_mixer); i++) {
1120 knew = snd_hda_gen_add_kctl(&spec->gen, NULL,
1121 &alc_beep_mixer[i]);
1122 if (!knew)
1123 return -ENOMEM;
1124 knew->private_value = beep_amp;
1125 }
1126 return 0;
1127}
84898e87 1128
6317e5eb 1129static const struct snd_pci_quirk beep_allow_list[] = {
7110005e 1130 SND_PCI_QUIRK(0x1043, 0x103c, "ASUS", 1),
a4b7f21d 1131 SND_PCI_QUIRK(0x1043, 0x115d, "ASUS", 1),
1d045db9 1132 SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),
8554ee40 1133 SND_PCI_QUIRK(0x1043, 0x8376, "EeePC", 1),
1d045db9
TI
1134 SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1),
1135 SND_PCI_QUIRK(0x1043, 0x831a, "EeePC", 1),
1136 SND_PCI_QUIRK(0x1043, 0x834a, "EeePC", 1),
78f8baf1 1137 SND_PCI_QUIRK(0x1458, 0xa002, "GA-MA790X", 1),
1d045db9 1138 SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),
6317e5eb 1139 /* denylist -- no beep available */
051c78af
TI
1140 SND_PCI_QUIRK(0x17aa, 0x309e, "Lenovo ThinkCentre M73", 0),
1141 SND_PCI_QUIRK(0x17aa, 0x30a3, "Lenovo ThinkCentre M93", 0),
1d045db9 1142 {}
fe3eb0a7
KY
1143};
1144
1d045db9
TI
1145static inline int has_cdefine_beep(struct hda_codec *codec)
1146{
1147 struct alc_spec *spec = codec->spec;
1148 const struct snd_pci_quirk *q;
6317e5eb 1149 q = snd_pci_quirk_lookup(codec->bus->pci, beep_allow_list);
1d045db9
TI
1150 if (q)
1151 return q->value;
1152 return spec->cdefine.enable_pcbeep;
1153}
1154#else
fea80fae 1155#define set_beep_amp(spec, nid, idx, dir) 0
1d045db9
TI
1156#define has_cdefine_beep(codec) 0
1157#endif
84898e87 1158
1d045db9
TI
1159/* parse the BIOS configuration and set up the alc_spec */
1160/* return 1 if successful, 0 if the proper config is not found,
1161 * or a negative error code
1162 */
3e6179b8
TI
1163static int alc_parse_auto_config(struct hda_codec *codec,
1164 const hda_nid_t *ignore_nids,
1165 const hda_nid_t *ssid_nids)
1d045db9
TI
1166{
1167 struct alc_spec *spec = codec->spec;
08c189f2 1168 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
1d045db9 1169 int err;
26f5df26 1170
53c334ad
TI
1171 err = snd_hda_parse_pin_defcfg(codec, cfg, ignore_nids,
1172 spec->parse_flags);
1d045db9
TI
1173 if (err < 0)
1174 return err;
3e6179b8
TI
1175
1176 if (ssid_nids)
1177 alc_ssid_check(codec, ssid_nids);
64154835 1178
08c189f2
TI
1179 err = snd_hda_gen_parse_auto_config(codec, cfg);
1180 if (err < 0)
1181 return err;
070cff4c 1182
1d045db9 1183 return 1;
60db6b53 1184}
f6a92248 1185
3de95173
TI
1186/* common preparation job for alc_spec */
1187static int alc_alloc_spec(struct hda_codec *codec, hda_nid_t mixer_nid)
1188{
1189 struct alc_spec *spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1190 int err;
1191
1192 if (!spec)
1193 return -ENOMEM;
1194 codec->spec = spec;
08c189f2
TI
1195 snd_hda_gen_spec_init(&spec->gen);
1196 spec->gen.mixer_nid = mixer_nid;
1197 spec->gen.own_eapd_ctl = 1;
1098b7c2 1198 codec->single_adc_amp = 1;
08c189f2
TI
1199 /* FIXME: do we need this for all Realtek codec models? */
1200 codec->spdif_status_reset = 1;
a6e7d0a4 1201 codec->forced_resume = 1;
225068ab 1202 codec->patch_ops = alc_patch_ops;
b837a9f5 1203 mutex_init(&spec->coef_mutex);
3de95173
TI
1204
1205 err = alc_codec_rename_from_preset(codec);
1206 if (err < 0) {
1207 kfree(spec);
1208 return err;
1209 }
1210 return 0;
1211}
1212
3e6179b8
TI
1213static int alc880_parse_auto_config(struct hda_codec *codec)
1214{
1215 static const hda_nid_t alc880_ignore[] = { 0x1d, 0 };
7d7eb9ea 1216 static const hda_nid_t alc880_ssids[] = { 0x15, 0x1b, 0x14, 0 };
3e6179b8
TI
1217 return alc_parse_auto_config(codec, alc880_ignore, alc880_ssids);
1218}
1219
ee3b2969
TI
1220/*
1221 * ALC880 fix-ups
1222 */
1223enum {
411225a0 1224 ALC880_FIXUP_GPIO1,
ee3b2969
TI
1225 ALC880_FIXUP_GPIO2,
1226 ALC880_FIXUP_MEDION_RIM,
dc6af52d 1227 ALC880_FIXUP_LG,
db8a38e5 1228 ALC880_FIXUP_LG_LW25,
f02aab5d 1229 ALC880_FIXUP_W810,
27e917f8 1230 ALC880_FIXUP_EAPD_COEF,
b9368f5c 1231 ALC880_FIXUP_TCL_S700,
cf5a2279
TI
1232 ALC880_FIXUP_VOL_KNOB,
1233 ALC880_FIXUP_FUJITSU,
ba533818 1234 ALC880_FIXUP_F1734,
817de92f 1235 ALC880_FIXUP_UNIWILL,
967b88c4 1236 ALC880_FIXUP_UNIWILL_DIG,
96e225f6 1237 ALC880_FIXUP_Z71V,
487a588d 1238 ALC880_FIXUP_ASUS_W5A,
67b6ec31
TI
1239 ALC880_FIXUP_3ST_BASE,
1240 ALC880_FIXUP_3ST,
1241 ALC880_FIXUP_3ST_DIG,
1242 ALC880_FIXUP_5ST_BASE,
1243 ALC880_FIXUP_5ST,
1244 ALC880_FIXUP_5ST_DIG,
1245 ALC880_FIXUP_6ST_BASE,
1246 ALC880_FIXUP_6ST,
1247 ALC880_FIXUP_6ST_DIG,
5397145f 1248 ALC880_FIXUP_6ST_AUTOMUTE,
ee3b2969
TI
1249};
1250
cf5a2279
TI
1251/* enable the volume-knob widget support on NID 0x21 */
1252static void alc880_fixup_vol_knob(struct hda_codec *codec,
1727a771 1253 const struct hda_fixup *fix, int action)
cf5a2279 1254{
1727a771 1255 if (action == HDA_FIXUP_ACT_PROBE)
62f949bf
TI
1256 snd_hda_jack_detect_enable_callback(codec, 0x21,
1257 alc_update_knob_master);
cf5a2279
TI
1258}
1259
1727a771 1260static const struct hda_fixup alc880_fixups[] = {
411225a0 1261 [ALC880_FIXUP_GPIO1] = {
5579cd6f
TI
1262 .type = HDA_FIXUP_FUNC,
1263 .v.func = alc_fixup_gpio1,
411225a0 1264 },
ee3b2969 1265 [ALC880_FIXUP_GPIO2] = {
5579cd6f
TI
1266 .type = HDA_FIXUP_FUNC,
1267 .v.func = alc_fixup_gpio2,
ee3b2969
TI
1268 },
1269 [ALC880_FIXUP_MEDION_RIM] = {
1727a771 1270 .type = HDA_FIXUP_VERBS,
ee3b2969
TI
1271 .v.verbs = (const struct hda_verb[]) {
1272 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1273 { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
1274 { }
1275 },
1276 .chained = true,
1277 .chain_id = ALC880_FIXUP_GPIO2,
1278 },
dc6af52d 1279 [ALC880_FIXUP_LG] = {
1727a771
TI
1280 .type = HDA_FIXUP_PINS,
1281 .v.pins = (const struct hda_pintbl[]) {
dc6af52d
TI
1282 /* disable bogus unused pins */
1283 { 0x16, 0x411111f0 },
1284 { 0x18, 0x411111f0 },
1285 { 0x1a, 0x411111f0 },
1286 { }
1287 }
1288 },
db8a38e5
TI
1289 [ALC880_FIXUP_LG_LW25] = {
1290 .type = HDA_FIXUP_PINS,
1291 .v.pins = (const struct hda_pintbl[]) {
1292 { 0x1a, 0x0181344f }, /* line-in */
1293 { 0x1b, 0x0321403f }, /* headphone */
1294 { }
1295 }
1296 },
f02aab5d 1297 [ALC880_FIXUP_W810] = {
1727a771
TI
1298 .type = HDA_FIXUP_PINS,
1299 .v.pins = (const struct hda_pintbl[]) {
f02aab5d
TI
1300 /* disable bogus unused pins */
1301 { 0x17, 0x411111f0 },
1302 { }
1303 },
1304 .chained = true,
1305 .chain_id = ALC880_FIXUP_GPIO2,
1306 },
27e917f8 1307 [ALC880_FIXUP_EAPD_COEF] = {
1727a771 1308 .type = HDA_FIXUP_VERBS,
27e917f8
TI
1309 .v.verbs = (const struct hda_verb[]) {
1310 /* change to EAPD mode */
1311 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1312 { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
1313 {}
1314 },
1315 },
b9368f5c 1316 [ALC880_FIXUP_TCL_S700] = {
1727a771 1317 .type = HDA_FIXUP_VERBS,
b9368f5c
TI
1318 .v.verbs = (const struct hda_verb[]) {
1319 /* change to EAPD mode */
1320 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1321 { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
1322 {}
1323 },
1324 .chained = true,
1325 .chain_id = ALC880_FIXUP_GPIO2,
1326 },
cf5a2279 1327 [ALC880_FIXUP_VOL_KNOB] = {
1727a771 1328 .type = HDA_FIXUP_FUNC,
cf5a2279
TI
1329 .v.func = alc880_fixup_vol_knob,
1330 },
1331 [ALC880_FIXUP_FUJITSU] = {
1332 /* override all pins as BIOS on old Amilo is broken */
1727a771
TI
1333 .type = HDA_FIXUP_PINS,
1334 .v.pins = (const struct hda_pintbl[]) {
bb148bde 1335 { 0x14, 0x0121401f }, /* HP */
cf5a2279
TI
1336 { 0x15, 0x99030120 }, /* speaker */
1337 { 0x16, 0x99030130 }, /* bass speaker */
1338 { 0x17, 0x411111f0 }, /* N/A */
1339 { 0x18, 0x411111f0 }, /* N/A */
1340 { 0x19, 0x01a19950 }, /* mic-in */
1341 { 0x1a, 0x411111f0 }, /* N/A */
1342 { 0x1b, 0x411111f0 }, /* N/A */
1343 { 0x1c, 0x411111f0 }, /* N/A */
1344 { 0x1d, 0x411111f0 }, /* N/A */
1345 { 0x1e, 0x01454140 }, /* SPDIF out */
1346 { }
1347 },
1348 .chained = true,
1349 .chain_id = ALC880_FIXUP_VOL_KNOB,
1350 },
ba533818
TI
1351 [ALC880_FIXUP_F1734] = {
1352 /* almost compatible with FUJITSU, but no bass and SPDIF */
1727a771
TI
1353 .type = HDA_FIXUP_PINS,
1354 .v.pins = (const struct hda_pintbl[]) {
bb148bde 1355 { 0x14, 0x0121401f }, /* HP */
ba533818
TI
1356 { 0x15, 0x99030120 }, /* speaker */
1357 { 0x16, 0x411111f0 }, /* N/A */
1358 { 0x17, 0x411111f0 }, /* N/A */
1359 { 0x18, 0x411111f0 }, /* N/A */
1360 { 0x19, 0x01a19950 }, /* mic-in */
1361 { 0x1a, 0x411111f0 }, /* N/A */
1362 { 0x1b, 0x411111f0 }, /* N/A */
1363 { 0x1c, 0x411111f0 }, /* N/A */
1364 { 0x1d, 0x411111f0 }, /* N/A */
1365 { 0x1e, 0x411111f0 }, /* N/A */
1366 { }
1367 },
1368 .chained = true,
1369 .chain_id = ALC880_FIXUP_VOL_KNOB,
1370 },
817de92f
TI
1371 [ALC880_FIXUP_UNIWILL] = {
1372 /* need to fix HP and speaker pins to be parsed correctly */
1727a771
TI
1373 .type = HDA_FIXUP_PINS,
1374 .v.pins = (const struct hda_pintbl[]) {
817de92f
TI
1375 { 0x14, 0x0121411f }, /* HP */
1376 { 0x15, 0x99030120 }, /* speaker */
1377 { 0x16, 0x99030130 }, /* bass speaker */
1378 { }
1379 },
1380 },
967b88c4 1381 [ALC880_FIXUP_UNIWILL_DIG] = {
1727a771
TI
1382 .type = HDA_FIXUP_PINS,
1383 .v.pins = (const struct hda_pintbl[]) {
967b88c4
TI
1384 /* disable bogus unused pins */
1385 { 0x17, 0x411111f0 },
1386 { 0x19, 0x411111f0 },
1387 { 0x1b, 0x411111f0 },
1388 { 0x1f, 0x411111f0 },
1389 { }
1390 }
1391 },
96e225f6 1392 [ALC880_FIXUP_Z71V] = {
1727a771
TI
1393 .type = HDA_FIXUP_PINS,
1394 .v.pins = (const struct hda_pintbl[]) {
96e225f6
TI
1395 /* set up the whole pins as BIOS is utterly broken */
1396 { 0x14, 0x99030120 }, /* speaker */
1397 { 0x15, 0x0121411f }, /* HP */
1398 { 0x16, 0x411111f0 }, /* N/A */
1399 { 0x17, 0x411111f0 }, /* N/A */
1400 { 0x18, 0x01a19950 }, /* mic-in */
1401 { 0x19, 0x411111f0 }, /* N/A */
1402 { 0x1a, 0x01813031 }, /* line-in */
1403 { 0x1b, 0x411111f0 }, /* N/A */
1404 { 0x1c, 0x411111f0 }, /* N/A */
1405 { 0x1d, 0x411111f0 }, /* N/A */
1406 { 0x1e, 0x0144111e }, /* SPDIF */
1407 { }
1408 }
1409 },
487a588d
TI
1410 [ALC880_FIXUP_ASUS_W5A] = {
1411 .type = HDA_FIXUP_PINS,
1412 .v.pins = (const struct hda_pintbl[]) {
1413 /* set up the whole pins as BIOS is utterly broken */
1414 { 0x14, 0x0121411f }, /* HP */
1415 { 0x15, 0x411111f0 }, /* N/A */
1416 { 0x16, 0x411111f0 }, /* N/A */
1417 { 0x17, 0x411111f0 }, /* N/A */
1418 { 0x18, 0x90a60160 }, /* mic */
1419 { 0x19, 0x411111f0 }, /* N/A */
1420 { 0x1a, 0x411111f0 }, /* N/A */
1421 { 0x1b, 0x411111f0 }, /* N/A */
1422 { 0x1c, 0x411111f0 }, /* N/A */
1423 { 0x1d, 0x411111f0 }, /* N/A */
1424 { 0x1e, 0xb743111e }, /* SPDIF out */
1425 { }
1426 },
1427 .chained = true,
1428 .chain_id = ALC880_FIXUP_GPIO1,
1429 },
67b6ec31 1430 [ALC880_FIXUP_3ST_BASE] = {
1727a771
TI
1431 .type = HDA_FIXUP_PINS,
1432 .v.pins = (const struct hda_pintbl[]) {
67b6ec31
TI
1433 { 0x14, 0x01014010 }, /* line-out */
1434 { 0x15, 0x411111f0 }, /* N/A */
1435 { 0x16, 0x411111f0 }, /* N/A */
1436 { 0x17, 0x411111f0 }, /* N/A */
1437 { 0x18, 0x01a19c30 }, /* mic-in */
1438 { 0x19, 0x0121411f }, /* HP */
1439 { 0x1a, 0x01813031 }, /* line-in */
1440 { 0x1b, 0x02a19c40 }, /* front-mic */
1441 { 0x1c, 0x411111f0 }, /* N/A */
1442 { 0x1d, 0x411111f0 }, /* N/A */
1443 /* 0x1e is filled in below */
1444 { 0x1f, 0x411111f0 }, /* N/A */
1445 { }
1446 }
1447 },
1448 [ALC880_FIXUP_3ST] = {
1727a771
TI
1449 .type = HDA_FIXUP_PINS,
1450 .v.pins = (const struct hda_pintbl[]) {
67b6ec31
TI
1451 { 0x1e, 0x411111f0 }, /* N/A */
1452 { }
1453 },
1454 .chained = true,
1455 .chain_id = ALC880_FIXUP_3ST_BASE,
1456 },
1457 [ALC880_FIXUP_3ST_DIG] = {
1727a771
TI
1458 .type = HDA_FIXUP_PINS,
1459 .v.pins = (const struct hda_pintbl[]) {
67b6ec31
TI
1460 { 0x1e, 0x0144111e }, /* SPDIF */
1461 { }
1462 },
1463 .chained = true,
1464 .chain_id = ALC880_FIXUP_3ST_BASE,
1465 },
1466 [ALC880_FIXUP_5ST_BASE] = {
1727a771
TI
1467 .type = HDA_FIXUP_PINS,
1468 .v.pins = (const struct hda_pintbl[]) {
67b6ec31
TI
1469 { 0x14, 0x01014010 }, /* front */
1470 { 0x15, 0x411111f0 }, /* N/A */
1471 { 0x16, 0x01011411 }, /* CLFE */
1472 { 0x17, 0x01016412 }, /* surr */
1473 { 0x18, 0x01a19c30 }, /* mic-in */
1474 { 0x19, 0x0121411f }, /* HP */
1475 { 0x1a, 0x01813031 }, /* line-in */
1476 { 0x1b, 0x02a19c40 }, /* front-mic */
1477 { 0x1c, 0x411111f0 }, /* N/A */
1478 { 0x1d, 0x411111f0 }, /* N/A */
1479 /* 0x1e is filled in below */
1480 { 0x1f, 0x411111f0 }, /* N/A */
1481 { }
1482 }
1483 },
1484 [ALC880_FIXUP_5ST] = {
1727a771
TI
1485 .type = HDA_FIXUP_PINS,
1486 .v.pins = (const struct hda_pintbl[]) {
67b6ec31
TI
1487 { 0x1e, 0x411111f0 }, /* N/A */
1488 { }
1489 },
1490 .chained = true,
1491 .chain_id = ALC880_FIXUP_5ST_BASE,
1492 },
1493 [ALC880_FIXUP_5ST_DIG] = {
1727a771
TI
1494 .type = HDA_FIXUP_PINS,
1495 .v.pins = (const struct hda_pintbl[]) {
67b6ec31
TI
1496 { 0x1e, 0x0144111e }, /* SPDIF */
1497 { }
1498 },
1499 .chained = true,
1500 .chain_id = ALC880_FIXUP_5ST_BASE,
1501 },
1502 [ALC880_FIXUP_6ST_BASE] = {
1727a771
TI
1503 .type = HDA_FIXUP_PINS,
1504 .v.pins = (const struct hda_pintbl[]) {
67b6ec31
TI
1505 { 0x14, 0x01014010 }, /* front */
1506 { 0x15, 0x01016412 }, /* surr */
1507 { 0x16, 0x01011411 }, /* CLFE */
1508 { 0x17, 0x01012414 }, /* side */
1509 { 0x18, 0x01a19c30 }, /* mic-in */
1510 { 0x19, 0x02a19c40 }, /* front-mic */
1511 { 0x1a, 0x01813031 }, /* line-in */
1512 { 0x1b, 0x0121411f }, /* HP */
1513 { 0x1c, 0x411111f0 }, /* N/A */
1514 { 0x1d, 0x411111f0 }, /* N/A */
1515 /* 0x1e is filled in below */
1516 { 0x1f, 0x411111f0 }, /* N/A */
1517 { }
1518 }
1519 },
1520 [ALC880_FIXUP_6ST] = {
1727a771
TI
1521 .type = HDA_FIXUP_PINS,
1522 .v.pins = (const struct hda_pintbl[]) {
67b6ec31
TI
1523 { 0x1e, 0x411111f0 }, /* N/A */
1524 { }
1525 },
1526 .chained = true,
1527 .chain_id = ALC880_FIXUP_6ST_BASE,
1528 },
1529 [ALC880_FIXUP_6ST_DIG] = {
1727a771
TI
1530 .type = HDA_FIXUP_PINS,
1531 .v.pins = (const struct hda_pintbl[]) {
67b6ec31
TI
1532 { 0x1e, 0x0144111e }, /* SPDIF */
1533 { }
1534 },
1535 .chained = true,
1536 .chain_id = ALC880_FIXUP_6ST_BASE,
1537 },
5397145f
TI
1538 [ALC880_FIXUP_6ST_AUTOMUTE] = {
1539 .type = HDA_FIXUP_PINS,
1540 .v.pins = (const struct hda_pintbl[]) {
1541 { 0x1b, 0x0121401f }, /* HP with jack detect */
1542 { }
1543 },
1544 .chained_before = true,
1545 .chain_id = ALC880_FIXUP_6ST_BASE,
1546 },
ee3b2969
TI
1547};
1548
1549static const struct snd_pci_quirk alc880_fixup_tbl[] = {
f02aab5d 1550 SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_FIXUP_W810),
487a588d 1551 SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS W5A", ALC880_FIXUP_ASUS_W5A),
96e225f6 1552 SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_FIXUP_Z71V),
29e3fdcc 1553 SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_FIXUP_GPIO1),
6538de03 1554 SND_PCI_QUIRK(0x147b, 0x1045, "ABit AA8XE", ALC880_FIXUP_6ST_AUTOMUTE),
29e3fdcc 1555 SND_PCI_QUIRK(0x1558, 0x5401, "Clevo GPIO2", ALC880_FIXUP_GPIO2),
27e917f8 1556 SND_PCI_QUIRK_VENDOR(0x1558, "Clevo", ALC880_FIXUP_EAPD_COEF),
967b88c4 1557 SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_FIXUP_UNIWILL_DIG),
ba533818 1558 SND_PCI_QUIRK(0x1584, 0x9054, "Uniwill", ALC880_FIXUP_F1734),
817de92f 1559 SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_FIXUP_UNIWILL),
7833c7e8 1560 SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_FIXUP_VOL_KNOB),
f02aab5d 1561 SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_FIXUP_W810),
ee3b2969 1562 SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_FIXUP_MEDION_RIM),
5397145f 1563 SND_PCI_QUIRK(0x1631, 0xe011, "PB 13201056", ALC880_FIXUP_6ST_AUTOMUTE),
a161574e 1564 SND_PCI_QUIRK(0x1734, 0x107c, "FSC Amilo M1437", ALC880_FIXUP_FUJITSU),
cf5a2279 1565 SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FIXUP_FUJITSU),
ba533818 1566 SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_FIXUP_F1734),
cf5a2279 1567 SND_PCI_QUIRK(0x1734, 0x10b0, "FSC Amilo Pi1556", ALC880_FIXUP_FUJITSU),
dc6af52d
TI
1568 SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_FIXUP_LG),
1569 SND_PCI_QUIRK(0x1854, 0x005f, "LG P1 Express", ALC880_FIXUP_LG),
1570 SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_FIXUP_LG),
db8a38e5 1571 SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_FIXUP_LG_LW25),
b9368f5c 1572 SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_FIXUP_TCL_S700),
67b6ec31
TI
1573
1574 /* Below is the copied entries from alc880_quirks.c.
1575 * It's not quite sure whether BIOS sets the correct pin-config table
1576 * on these machines, thus they are kept to be compatible with
1577 * the old static quirks. Once when it's confirmed to work without
1578 * these overrides, it'd be better to remove.
1579 */
1580 SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_FIXUP_5ST_DIG),
1581 SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_FIXUP_6ST),
1582 SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_FIXUP_3ST_DIG),
1583 SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_FIXUP_6ST_DIG),
1584 SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_FIXUP_6ST_DIG),
1585 SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_FIXUP_6ST_DIG),
1586 SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_FIXUP_3ST_DIG),
1587 SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_FIXUP_3ST),
1588 SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_FIXUP_6ST_DIG),
1589 SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_FIXUP_3ST),
1590 SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_FIXUP_3ST),
1591 SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_FIXUP_5ST),
1592 SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_FIXUP_5ST),
1593 SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_FIXUP_5ST),
1594 SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_FIXUP_6ST_DIG),
1595 SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_FIXUP_6ST_DIG),
1596 SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_FIXUP_6ST_DIG),
1597 SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_FIXUP_6ST_DIG),
1598 SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_FIXUP_5ST_DIG),
1599 SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_FIXUP_5ST_DIG),
1600 SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_FIXUP_5ST_DIG),
1601 SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_FIXUP_6ST_DIG), /* broken BIOS */
1602 SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_FIXUP_6ST_DIG),
1603 SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1604 SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1605 SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1606 SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1607 SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1608 SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1609 SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1610 SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1611 SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1612 SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1613 /* default Intel */
1614 SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_FIXUP_3ST),
1615 SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_FIXUP_5ST_DIG),
1616 SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_FIXUP_6ST_DIG),
1617 {}
1618};
1619
1727a771 1620static const struct hda_model_fixup alc880_fixup_models[] = {
67b6ec31
TI
1621 {.id = ALC880_FIXUP_3ST, .name = "3stack"},
1622 {.id = ALC880_FIXUP_3ST_DIG, .name = "3stack-digout"},
1623 {.id = ALC880_FIXUP_5ST, .name = "5stack"},
1624 {.id = ALC880_FIXUP_5ST_DIG, .name = "5stack-digout"},
1625 {.id = ALC880_FIXUP_6ST, .name = "6stack"},
1626 {.id = ALC880_FIXUP_6ST_DIG, .name = "6stack-digout"},
5397145f 1627 {.id = ALC880_FIXUP_6ST_AUTOMUTE, .name = "6stack-automute"},
ee3b2969
TI
1628 {}
1629};
1630
1631
1d045db9
TI
1632/*
1633 * OK, here we have finally the patch for ALC880
1634 */
1d045db9 1635static int patch_alc880(struct hda_codec *codec)
60db6b53 1636{
1d045db9 1637 struct alc_spec *spec;
1d045db9 1638 int err;
f6a92248 1639
3de95173
TI
1640 err = alc_alloc_spec(codec, 0x0b);
1641 if (err < 0)
1642 return err;
64154835 1643
3de95173 1644 spec = codec->spec;
08c189f2 1645 spec->gen.need_dac_fix = 1;
7504b6cd 1646 spec->gen.beep_nid = 0x01;
f53281e6 1647
225068ab
TI
1648 codec->patch_ops.unsol_event = alc880_unsol_event;
1649
c9af753f
TI
1650 alc_pre_init(codec);
1651
1727a771 1652 snd_hda_pick_fixup(codec, alc880_fixup_models, alc880_fixup_tbl,
67b6ec31 1653 alc880_fixups);
1727a771 1654 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
ee3b2969 1655
67b6ec31
TI
1656 /* automatic parse from the BIOS config */
1657 err = alc880_parse_auto_config(codec);
1658 if (err < 0)
1659 goto error;
fe3eb0a7 1660
fea80fae
TI
1661 if (!spec->gen.no_analog) {
1662 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
1663 if (err < 0)
1664 goto error;
1665 }
f53281e6 1666
1727a771 1667 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
589876e2 1668
1d045db9 1669 return 0;
e16fb6d1
TI
1670
1671 error:
1672 alc_free(codec);
1673 return err;
226b1ec8
KY
1674}
1675
1d045db9 1676
60db6b53 1677/*
1d045db9 1678 * ALC260 support
60db6b53 1679 */
1d045db9 1680static int alc260_parse_auto_config(struct hda_codec *codec)
f6a92248 1681{
1d045db9 1682 static const hda_nid_t alc260_ignore[] = { 0x17, 0 };
3e6179b8
TI
1683 static const hda_nid_t alc260_ssids[] = { 0x10, 0x15, 0x0f, 0 };
1684 return alc_parse_auto_config(codec, alc260_ignore, alc260_ssids);
f6a92248
KY
1685}
1686
1d045db9
TI
1687/*
1688 * Pin config fixes
1689 */
1690enum {
ca8f0424
TI
1691 ALC260_FIXUP_HP_DC5750,
1692 ALC260_FIXUP_HP_PIN_0F,
1693 ALC260_FIXUP_COEF,
15317ab2 1694 ALC260_FIXUP_GPIO1,
20f7d928
TI
1695 ALC260_FIXUP_GPIO1_TOGGLE,
1696 ALC260_FIXUP_REPLACER,
0a1c4fa2 1697 ALC260_FIXUP_HP_B1900,
118cb4a4 1698 ALC260_FIXUP_KN1,
39aedee7 1699 ALC260_FIXUP_FSC_S7020,
5ebd3bbd 1700 ALC260_FIXUP_FSC_S7020_JWSE,
d08c5ef2 1701 ALC260_FIXUP_VAIO_PINS,
1d045db9
TI
1702};
1703
20f7d928
TI
1704static void alc260_gpio1_automute(struct hda_codec *codec)
1705{
1706 struct alc_spec *spec = codec->spec;
aaf312de
TI
1707
1708 alc_update_gpio_data(codec, 0x01, spec->gen.hp_jack_present);
20f7d928
TI
1709}
1710
1711static void alc260_fixup_gpio1_toggle(struct hda_codec *codec,
1727a771 1712 const struct hda_fixup *fix, int action)
20f7d928
TI
1713{
1714 struct alc_spec *spec = codec->spec;
1727a771 1715 if (action == HDA_FIXUP_ACT_PROBE) {
20f7d928
TI
1716 /* although the machine has only one output pin, we need to
1717 * toggle GPIO1 according to the jack state
1718 */
08c189f2
TI
1719 spec->gen.automute_hook = alc260_gpio1_automute;
1720 spec->gen.detect_hp = 1;
1721 spec->gen.automute_speaker = 1;
1722 spec->gen.autocfg.hp_pins[0] = 0x0f; /* copy it for automute */
62f949bf 1723 snd_hda_jack_detect_enable_callback(codec, 0x0f,
08c189f2 1724 snd_hda_gen_hp_automute);
5579cd6f 1725 alc_setup_gpio(codec, 0x01);
20f7d928
TI
1726 }
1727}
1728
118cb4a4 1729static void alc260_fixup_kn1(struct hda_codec *codec,
1727a771 1730 const struct hda_fixup *fix, int action)
118cb4a4
TI
1731{
1732 struct alc_spec *spec = codec->spec;
1727a771 1733 static const struct hda_pintbl pincfgs[] = {
118cb4a4
TI
1734 { 0x0f, 0x02214000 }, /* HP/speaker */
1735 { 0x12, 0x90a60160 }, /* int mic */
1736 { 0x13, 0x02a19000 }, /* ext mic */
1737 { 0x18, 0x01446000 }, /* SPDIF out */
1738 /* disable bogus I/O pins */
1739 { 0x10, 0x411111f0 },
1740 { 0x11, 0x411111f0 },
1741 { 0x14, 0x411111f0 },
1742 { 0x15, 0x411111f0 },
1743 { 0x16, 0x411111f0 },
1744 { 0x17, 0x411111f0 },
1745 { 0x19, 0x411111f0 },
1746 { }
1747 };
1748
1749 switch (action) {
1727a771
TI
1750 case HDA_FIXUP_ACT_PRE_PROBE:
1751 snd_hda_apply_pincfgs(codec, pincfgs);
118cb4a4
TI
1752 spec->init_amp = ALC_INIT_NONE;
1753 break;
1754 }
1755}
1756
39aedee7
TI
1757static void alc260_fixup_fsc_s7020(struct hda_codec *codec,
1758 const struct hda_fixup *fix, int action)
1759{
1760 struct alc_spec *spec = codec->spec;
1c76aa5f 1761 if (action == HDA_FIXUP_ACT_PRE_PROBE)
5ebd3bbd
TI
1762 spec->init_amp = ALC_INIT_NONE;
1763}
39aedee7 1764
5ebd3bbd
TI
1765static void alc260_fixup_fsc_s7020_jwse(struct hda_codec *codec,
1766 const struct hda_fixup *fix, int action)
1767{
1768 struct alc_spec *spec = codec->spec;
1769 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
f811c3cf 1770 spec->gen.add_jack_modes = 1;
5ebd3bbd 1771 spec->gen.hp_mic = 1;
e6e0ee50 1772 }
39aedee7
TI
1773}
1774
1727a771 1775static const struct hda_fixup alc260_fixups[] = {
ca8f0424 1776 [ALC260_FIXUP_HP_DC5750] = {
1727a771
TI
1777 .type = HDA_FIXUP_PINS,
1778 .v.pins = (const struct hda_pintbl[]) {
1d045db9
TI
1779 { 0x11, 0x90130110 }, /* speaker */
1780 { }
1781 }
1782 },
ca8f0424 1783 [ALC260_FIXUP_HP_PIN_0F] = {
1727a771
TI
1784 .type = HDA_FIXUP_PINS,
1785 .v.pins = (const struct hda_pintbl[]) {
ca8f0424
TI
1786 { 0x0f, 0x01214000 }, /* HP */
1787 { }
1788 }
1789 },
1790 [ALC260_FIXUP_COEF] = {
1727a771 1791 .type = HDA_FIXUP_VERBS,
ca8f0424 1792 .v.verbs = (const struct hda_verb[]) {
e30cf2d2
RM
1793 { 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1794 { 0x1a, AC_VERB_SET_PROC_COEF, 0x3040 },
ca8f0424
TI
1795 { }
1796 },
ca8f0424 1797 },
15317ab2 1798 [ALC260_FIXUP_GPIO1] = {
5579cd6f
TI
1799 .type = HDA_FIXUP_FUNC,
1800 .v.func = alc_fixup_gpio1,
15317ab2 1801 },
20f7d928 1802 [ALC260_FIXUP_GPIO1_TOGGLE] = {
1727a771 1803 .type = HDA_FIXUP_FUNC,
20f7d928
TI
1804 .v.func = alc260_fixup_gpio1_toggle,
1805 .chained = true,
1806 .chain_id = ALC260_FIXUP_HP_PIN_0F,
1807 },
1808 [ALC260_FIXUP_REPLACER] = {
1727a771 1809 .type = HDA_FIXUP_VERBS,
20f7d928 1810 .v.verbs = (const struct hda_verb[]) {
192a98e2
TI
1811 { 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1812 { 0x1a, AC_VERB_SET_PROC_COEF, 0x3050 },
20f7d928
TI
1813 { }
1814 },
1815 .chained = true,
1816 .chain_id = ALC260_FIXUP_GPIO1_TOGGLE,
1817 },
0a1c4fa2 1818 [ALC260_FIXUP_HP_B1900] = {
1727a771 1819 .type = HDA_FIXUP_FUNC,
0a1c4fa2
TI
1820 .v.func = alc260_fixup_gpio1_toggle,
1821 .chained = true,
1822 .chain_id = ALC260_FIXUP_COEF,
118cb4a4
TI
1823 },
1824 [ALC260_FIXUP_KN1] = {
1727a771 1825 .type = HDA_FIXUP_FUNC,
118cb4a4
TI
1826 .v.func = alc260_fixup_kn1,
1827 },
39aedee7
TI
1828 [ALC260_FIXUP_FSC_S7020] = {
1829 .type = HDA_FIXUP_FUNC,
1830 .v.func = alc260_fixup_fsc_s7020,
1831 },
5ebd3bbd
TI
1832 [ALC260_FIXUP_FSC_S7020_JWSE] = {
1833 .type = HDA_FIXUP_FUNC,
1834 .v.func = alc260_fixup_fsc_s7020_jwse,
1835 .chained = true,
1836 .chain_id = ALC260_FIXUP_FSC_S7020,
1837 },
d08c5ef2
TI
1838 [ALC260_FIXUP_VAIO_PINS] = {
1839 .type = HDA_FIXUP_PINS,
1840 .v.pins = (const struct hda_pintbl[]) {
1841 /* Pin configs are missing completely on some VAIOs */
1842 { 0x0f, 0x01211020 },
1843 { 0x10, 0x0001003f },
1844 { 0x11, 0x411111f0 },
1845 { 0x12, 0x01a15930 },
1846 { 0x13, 0x411111f0 },
1847 { 0x14, 0x411111f0 },
1848 { 0x15, 0x411111f0 },
1849 { 0x16, 0x411111f0 },
1850 { 0x17, 0x411111f0 },
1851 { 0x18, 0x411111f0 },
1852 { 0x19, 0x411111f0 },
1853 { }
1854 }
1855 },
1d045db9
TI
1856};
1857
1858static const struct snd_pci_quirk alc260_fixup_tbl[] = {
15317ab2 1859 SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_FIXUP_GPIO1),
ca8f0424 1860 SND_PCI_QUIRK(0x1025, 0x007f, "Acer Aspire 9500", ALC260_FIXUP_COEF),
15317ab2 1861 SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_FIXUP_GPIO1),
ca8f0424 1862 SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", ALC260_FIXUP_HP_DC5750),
0a1c4fa2 1863 SND_PCI_QUIRK(0x103c, 0x30ba, "HP Presario B1900", ALC260_FIXUP_HP_B1900),
d08c5ef2 1864 SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_FIXUP_VAIO_PINS),
0f5a5b85 1865 SND_PCI_QUIRK(0x104d, 0x81e2, "Sony VAIO TX", ALC260_FIXUP_HP_PIN_0F),
39aedee7 1866 SND_PCI_QUIRK(0x10cf, 0x1326, "FSC LifeBook S7020", ALC260_FIXUP_FSC_S7020),
b1f58085 1867 SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FIXUP_GPIO1),
118cb4a4 1868 SND_PCI_QUIRK(0x152d, 0x0729, "Quanta KN1", ALC260_FIXUP_KN1),
20f7d928 1869 SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_FIXUP_REPLACER),
ca8f0424 1870 SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_FIXUP_COEF),
1d045db9
TI
1871 {}
1872};
1873
5ebd3bbd
TI
1874static const struct hda_model_fixup alc260_fixup_models[] = {
1875 {.id = ALC260_FIXUP_GPIO1, .name = "gpio1"},
1876 {.id = ALC260_FIXUP_COEF, .name = "coef"},
1877 {.id = ALC260_FIXUP_FSC_S7020, .name = "fujitsu"},
1878 {.id = ALC260_FIXUP_FSC_S7020_JWSE, .name = "fujitsu-jwse"},
1879 {}
1880};
1881
1d045db9
TI
1882/*
1883 */
1d045db9 1884static int patch_alc260(struct hda_codec *codec)
977ddd6b 1885{
1d045db9 1886 struct alc_spec *spec;
c3c2c9e7 1887 int err;
1d045db9 1888
3de95173
TI
1889 err = alc_alloc_spec(codec, 0x07);
1890 if (err < 0)
1891 return err;
1d045db9 1892
3de95173 1893 spec = codec->spec;
ea46c3c8
TI
1894 /* as quite a few machines require HP amp for speaker outputs,
1895 * it's easier to enable it unconditionally; even if it's unneeded,
1896 * it's almost harmless.
1897 */
1898 spec->gen.prefer_hp_amp = 1;
7504b6cd 1899 spec->gen.beep_nid = 0x01;
1d045db9 1900
225068ab
TI
1901 spec->shutup = alc_eapd_shutup;
1902
c9af753f
TI
1903 alc_pre_init(codec);
1904
5ebd3bbd
TI
1905 snd_hda_pick_fixup(codec, alc260_fixup_models, alc260_fixup_tbl,
1906 alc260_fixups);
1727a771 1907 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
977ddd6b 1908
c3c2c9e7
TI
1909 /* automatic parse from the BIOS config */
1910 err = alc260_parse_auto_config(codec);
1911 if (err < 0)
1912 goto error;
977ddd6b 1913
fea80fae
TI
1914 if (!spec->gen.no_analog) {
1915 err = set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
1916 if (err < 0)
1917 goto error;
1918 }
977ddd6b 1919
1727a771 1920 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
589876e2 1921
1d045db9 1922 return 0;
e16fb6d1
TI
1923
1924 error:
1925 alc_free(codec);
1926 return err;
6981d184
TI
1927}
1928
1d045db9
TI
1929
1930/*
1931 * ALC882/883/885/888/889 support
1932 *
1933 * ALC882 is almost identical with ALC880 but has cleaner and more flexible
1934 * configuration. Each pin widget can choose any input DACs and a mixer.
1935 * Each ADC is connected from a mixer of all inputs. This makes possible
1936 * 6-channel independent captures.
1937 *
1938 * In addition, an independent DAC for the multi-playback (not used in this
1939 * driver yet).
1940 */
1d045db9
TI
1941
1942/*
1943 * Pin config fixes
1944 */
ff818c24 1945enum {
5c0ebfbe
TI
1946 ALC882_FIXUP_ABIT_AW9D_MAX,
1947 ALC882_FIXUP_LENOVO_Y530,
1948 ALC882_FIXUP_PB_M5210,
1949 ALC882_FIXUP_ACER_ASPIRE_7736,
1950 ALC882_FIXUP_ASUS_W90V,
8f239214 1951 ALC889_FIXUP_CD,
b2c53e20 1952 ALC889_FIXUP_FRONT_HP_NO_PRESENCE,
5c0ebfbe 1953 ALC889_FIXUP_VAIO_TT,
0e7cc2e7 1954 ALC888_FIXUP_EEE1601,
4841b8e6 1955 ALC886_FIXUP_EAPD,
177943a3 1956 ALC882_FIXUP_EAPD,
7a6069bf 1957 ALC883_FIXUP_EAPD,
8812c4f9 1958 ALC883_FIXUP_ACER_EAPD,
1a97b7f2
TI
1959 ALC882_FIXUP_GPIO1,
1960 ALC882_FIXUP_GPIO2,
eb844d51 1961 ALC882_FIXUP_GPIO3,
68ef0561
TI
1962 ALC889_FIXUP_COEF,
1963 ALC882_FIXUP_ASUS_W2JC,
c3e837bb
TI
1964 ALC882_FIXUP_ACER_ASPIRE_4930G,
1965 ALC882_FIXUP_ACER_ASPIRE_8930G,
1966 ALC882_FIXUP_ASPIRE_8930G_VERBS,
5671087f 1967 ALC885_FIXUP_MACPRO_GPIO,
02a237b2 1968 ALC889_FIXUP_DAC_ROUTE,
1a97b7f2
TI
1969 ALC889_FIXUP_MBP_VREF,
1970 ALC889_FIXUP_IMAC91_VREF,
e7729a41 1971 ALC889_FIXUP_MBA11_VREF,
0756f09c 1972 ALC889_FIXUP_MBA21_VREF,
c20f31ec 1973 ALC889_FIXUP_MP11_VREF,
9f660a1c 1974 ALC889_FIXUP_MP41_VREF,
6e72aa5f 1975 ALC882_FIXUP_INV_DMIC,
e427c237 1976 ALC882_FIXUP_NO_PRIMARY_HP,
1f0bbf03 1977 ALC887_FIXUP_ASUS_BASS,
eb9ca3ab 1978 ALC887_FIXUP_BASS_CHMAP,
7beb3a6e 1979 ALC1220_FIXUP_GB_DUAL_CODECS,
c1933008 1980 ALC1220_FIXUP_GB_X570,
0202f5cd 1981 ALC1220_FIXUP_CLEVO_P950,
80690a27
RS
1982 ALC1220_FIXUP_CLEVO_PB51ED,
1983 ALC1220_FIXUP_CLEVO_PB51ED_PINS,
ca184355
JHP
1984 ALC887_FIXUP_ASUS_AUDIO,
1985 ALC887_FIXUP_ASUS_HMIC,
9bfa7b36 1986 ALCS1200A_FIXUP_MIC_VREF,
baaacbff 1987 ALC888VD_FIXUP_MIC_100VREF,
ff818c24
TI
1988};
1989
68ef0561 1990static void alc889_fixup_coef(struct hda_codec *codec,
1727a771 1991 const struct hda_fixup *fix, int action)
68ef0561 1992{
1727a771 1993 if (action != HDA_FIXUP_ACT_INIT)
68ef0561 1994 return;
1df8874b 1995 alc_update_coef_idx(codec, 7, 0, 0x2030);
68ef0561
TI
1996}
1997
5671087f
TI
1998/* set up GPIO at initialization */
1999static void alc885_fixup_macpro_gpio(struct hda_codec *codec,
1727a771 2000 const struct hda_fixup *fix, int action)
5671087f 2001{
215c850c
TI
2002 struct alc_spec *spec = codec->spec;
2003
2004 spec->gpio_write_delay = true;
2005 alc_fixup_gpio3(codec, fix, action);
5671087f
TI
2006}
2007
02a237b2
TI
2008/* Fix the connection of some pins for ALC889:
2009 * At least, Acer Aspire 5935 shows the connections to DAC3/4 don't
2010 * work correctly (bko#42740)
2011 */
2012static void alc889_fixup_dac_route(struct hda_codec *codec,
1727a771 2013 const struct hda_fixup *fix, int action)
02a237b2 2014{
1727a771 2015 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
ef8d60fb 2016 /* fake the connections during parsing the tree */
caf3c043
MM
2017 static const hda_nid_t conn1[] = { 0x0c, 0x0d };
2018 static const hda_nid_t conn2[] = { 0x0e, 0x0f };
2019 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2020 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
2021 snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn2), conn2);
2022 snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn2), conn2);
1727a771 2023 } else if (action == HDA_FIXUP_ACT_PROBE) {
ef8d60fb 2024 /* restore the connections */
caf3c043
MM
2025 static const hda_nid_t conn[] = { 0x0c, 0x0d, 0x0e, 0x0f, 0x26 };
2026 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
2027 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn), conn);
2028 snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn), conn);
2029 snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn), conn);
02a237b2
TI
2030 }
2031}
2032
1a97b7f2
TI
2033/* Set VREF on HP pin */
2034static void alc889_fixup_mbp_vref(struct hda_codec *codec,
1727a771 2035 const struct hda_fixup *fix, int action)
1a97b7f2 2036{
caf3c043 2037 static const hda_nid_t nids[] = { 0x14, 0x15, 0x19 };
1a97b7f2 2038 struct alc_spec *spec = codec->spec;
1a97b7f2
TI
2039 int i;
2040
1727a771 2041 if (action != HDA_FIXUP_ACT_INIT)
1a97b7f2
TI
2042 return;
2043 for (i = 0; i < ARRAY_SIZE(nids); i++) {
2044 unsigned int val = snd_hda_codec_get_pincfg(codec, nids[i]);
2045 if (get_defcfg_device(val) != AC_JACK_HP_OUT)
2046 continue;
d3f02d60 2047 val = snd_hda_codec_get_pin_target(codec, nids[i]);
1a97b7f2 2048 val |= AC_PINCTL_VREF_80;
cdd03ced 2049 snd_hda_set_pin_ctl(codec, nids[i], val);
08c189f2 2050 spec->gen.keep_vref_in_automute = 1;
1a97b7f2
TI
2051 break;
2052 }
2053}
2054
0756f09c
TI
2055static void alc889_fixup_mac_pins(struct hda_codec *codec,
2056 const hda_nid_t *nids, int num_nids)
1a97b7f2
TI
2057{
2058 struct alc_spec *spec = codec->spec;
1a97b7f2
TI
2059 int i;
2060
0756f09c 2061 for (i = 0; i < num_nids; i++) {
1a97b7f2 2062 unsigned int val;
d3f02d60 2063 val = snd_hda_codec_get_pin_target(codec, nids[i]);
1a97b7f2 2064 val |= AC_PINCTL_VREF_50;
cdd03ced 2065 snd_hda_set_pin_ctl(codec, nids[i], val);
1a97b7f2 2066 }
08c189f2 2067 spec->gen.keep_vref_in_automute = 1;
1a97b7f2
TI
2068}
2069
0756f09c
TI
2070/* Set VREF on speaker pins on imac91 */
2071static void alc889_fixup_imac91_vref(struct hda_codec *codec,
2072 const struct hda_fixup *fix, int action)
2073{
caf3c043 2074 static const hda_nid_t nids[] = { 0x18, 0x1a };
0756f09c
TI
2075
2076 if (action == HDA_FIXUP_ACT_INIT)
2077 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2078}
2079
e7729a41
AV
2080/* Set VREF on speaker pins on mba11 */
2081static void alc889_fixup_mba11_vref(struct hda_codec *codec,
2082 const struct hda_fixup *fix, int action)
2083{
caf3c043 2084 static const hda_nid_t nids[] = { 0x18 };
e7729a41
AV
2085
2086 if (action == HDA_FIXUP_ACT_INIT)
2087 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2088}
2089
0756f09c
TI
2090/* Set VREF on speaker pins on mba21 */
2091static void alc889_fixup_mba21_vref(struct hda_codec *codec,
2092 const struct hda_fixup *fix, int action)
2093{
caf3c043 2094 static const hda_nid_t nids[] = { 0x18, 0x19 };
0756f09c
TI
2095
2096 if (action == HDA_FIXUP_ACT_INIT)
2097 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2098}
2099
e427c237 2100/* Don't take HP output as primary
d9111496
FLVC
2101 * Strangely, the speaker output doesn't work on Vaio Z and some Vaio
2102 * all-in-one desktop PCs (for example VGC-LN51JGB) through DAC 0x05
e427c237
TI
2103 */
2104static void alc882_fixup_no_primary_hp(struct hda_codec *codec,
1727a771 2105 const struct hda_fixup *fix, int action)
e427c237
TI
2106{
2107 struct alc_spec *spec = codec->spec;
da96fb5b 2108 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
08c189f2 2109 spec->gen.no_primary_hp = 1;
da96fb5b
TI
2110 spec->gen.no_multi_io = 1;
2111 }
e427c237
TI
2112}
2113
eb9ca3ab
TI
2114static void alc_fixup_bass_chmap(struct hda_codec *codec,
2115 const struct hda_fixup *fix, int action);
2116
7beb3a6e
TI
2117/* For dual-codec configuration, we need to disable some features to avoid
2118 * conflicts of kctls and PCM streams
2119 */
2120static void alc_fixup_dual_codecs(struct hda_codec *codec,
2121 const struct hda_fixup *fix, int action)
2122{
2123 struct alc_spec *spec = codec->spec;
2124
2125 if (action != HDA_FIXUP_ACT_PRE_PROBE)
2126 return;
2127 /* disable vmaster */
2128 spec->gen.suppress_vmaster = 1;
2129 /* auto-mute and auto-mic switch don't work with multiple codecs */
2130 spec->gen.suppress_auto_mute = 1;
2131 spec->gen.suppress_auto_mic = 1;
2132 /* disable aamix as well */
2133 spec->gen.mixer_nid = 0;
2134 /* add location prefix to avoid conflicts */
2135 codec->force_pin_prefix = 1;
2136}
2137
2138static void rename_ctl(struct hda_codec *codec, const char *oldname,
2139 const char *newname)
2140{
2141 struct snd_kcontrol *kctl;
2142
2143 kctl = snd_hda_find_mixer_ctl(codec, oldname);
2144 if (kctl)
b51c2253 2145 snd_ctl_rename(codec->card, kctl, newname);
7beb3a6e
TI
2146}
2147
2148static void alc1220_fixup_gb_dual_codecs(struct hda_codec *codec,
2149 const struct hda_fixup *fix,
2150 int action)
2151{
2152 alc_fixup_dual_codecs(codec, fix, action);
2153 switch (action) {
2154 case HDA_FIXUP_ACT_PRE_PROBE:
2155 /* override card longname to provide a unique UCM profile */
2156 strcpy(codec->card->longname, "HDAudio-Gigabyte-ALC1220DualCodecs");
2157 break;
2158 case HDA_FIXUP_ACT_BUILD:
2159 /* rename Capture controls depending on the codec */
2160 rename_ctl(codec, "Capture Volume",
2161 codec->addr == 0 ?
2162 "Rear-Panel Capture Volume" :
2163 "Front-Panel Capture Volume");
2164 rename_ctl(codec, "Capture Switch",
2165 codec->addr == 0 ?
2166 "Rear-Panel Capture Switch" :
2167 "Front-Panel Capture Switch");
2168 break;
2169 }
2170}
2171
c1933008
CL
2172static void alc1220_fixup_gb_x570(struct hda_codec *codec,
2173 const struct hda_fixup *fix,
2174 int action)
2175{
2176 static const hda_nid_t conn1[] = { 0x0c };
2177 static const struct coef_fw gb_x570_coefs[] = {
41a86013 2178 WRITE_COEF(0x07, 0x03c0),
c1933008
CL
2179 WRITE_COEF(0x1a, 0x01c1),
2180 WRITE_COEF(0x1b, 0x0202),
2181 WRITE_COEF(0x43, 0x3005),
2182 {}
2183 };
2184
2185 switch (action) {
2186 case HDA_FIXUP_ACT_PRE_PROBE:
2187 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2188 snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
2189 break;
2190 case HDA_FIXUP_ACT_INIT:
2191 alc_process_coef_fw(codec, gb_x570_coefs);
2192 break;
2193 }
2194}
2195
0202f5cd
P
2196static void alc1220_fixup_clevo_p950(struct hda_codec *codec,
2197 const struct hda_fixup *fix,
2198 int action)
2199{
caf3c043 2200 static const hda_nid_t conn1[] = { 0x0c };
0202f5cd
P
2201
2202 if (action != HDA_FIXUP_ACT_PRE_PROBE)
2203 return;
2204
2205 alc_update_coef_idx(codec, 0x7, 0, 0x3c3);
2206 /* We therefore want to make sure 0x14 (front headphone) and
2207 * 0x1b (speakers) use the stereo DAC 0x02
2208 */
caf3c043
MM
2209 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2210 snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
0202f5cd
P
2211}
2212
7f665b1c
JS
2213static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
2214 const struct hda_fixup *fix, int action);
2215
80690a27 2216static void alc1220_fixup_clevo_pb51ed(struct hda_codec *codec,
7f665b1c
JS
2217 const struct hda_fixup *fix,
2218 int action)
2219{
2220 alc1220_fixup_clevo_p950(codec, fix, action);
2221 alc_fixup_headset_mode_no_hp_mic(codec, fix, action);
2222}
2223
ca184355
JHP
2224static void alc887_asus_hp_automute_hook(struct hda_codec *codec,
2225 struct hda_jack_callback *jack)
2226{
2227 struct alc_spec *spec = codec->spec;
2228 unsigned int vref;
2229
2230 snd_hda_gen_hp_automute(codec, jack);
2231
2232 if (spec->gen.hp_jack_present)
2233 vref = AC_PINCTL_VREF_80;
2234 else
2235 vref = AC_PINCTL_VREF_HIZ;
2236 snd_hda_set_pin_ctl(codec, 0x19, PIN_HP | vref);
2237}
2238
2239static void alc887_fixup_asus_jack(struct hda_codec *codec,
2240 const struct hda_fixup *fix, int action)
2241{
2242 struct alc_spec *spec = codec->spec;
2243 if (action != HDA_FIXUP_ACT_PROBE)
2244 return;
2245 snd_hda_set_pin_ctl_cache(codec, 0x1b, PIN_HP);
2246 spec->gen.hp_automute_hook = alc887_asus_hp_automute_hook;
2247}
2248
1727a771 2249static const struct hda_fixup alc882_fixups[] = {
5c0ebfbe 2250 [ALC882_FIXUP_ABIT_AW9D_MAX] = {
1727a771
TI
2251 .type = HDA_FIXUP_PINS,
2252 .v.pins = (const struct hda_pintbl[]) {
1d045db9
TI
2253 { 0x15, 0x01080104 }, /* side */
2254 { 0x16, 0x01011012 }, /* rear */
2255 { 0x17, 0x01016011 }, /* clfe */
2785591a 2256 { }
145a902b
DH
2257 }
2258 },
5c0ebfbe 2259 [ALC882_FIXUP_LENOVO_Y530] = {
1727a771
TI
2260 .type = HDA_FIXUP_PINS,
2261 .v.pins = (const struct hda_pintbl[]) {
1d045db9
TI
2262 { 0x15, 0x99130112 }, /* rear int speakers */
2263 { 0x16, 0x99130111 }, /* subwoofer */
ac612407
DH
2264 { }
2265 }
2266 },
5c0ebfbe 2267 [ALC882_FIXUP_PB_M5210] = {
fd108215
TI
2268 .type = HDA_FIXUP_PINCTLS,
2269 .v.pins = (const struct hda_pintbl[]) {
2270 { 0x19, PIN_VREF50 },
357f915e
KY
2271 {}
2272 }
2273 },
5c0ebfbe 2274 [ALC882_FIXUP_ACER_ASPIRE_7736] = {
1727a771 2275 .type = HDA_FIXUP_FUNC,
23d30f28 2276 .v.func = alc_fixup_sku_ignore,
6981d184 2277 },
5c0ebfbe 2278 [ALC882_FIXUP_ASUS_W90V] = {
1727a771
TI
2279 .type = HDA_FIXUP_PINS,
2280 .v.pins = (const struct hda_pintbl[]) {
5cdf745e
TI
2281 { 0x16, 0x99130110 }, /* fix sequence for CLFE */
2282 { }
2283 }
2284 },
8f239214 2285 [ALC889_FIXUP_CD] = {
1727a771
TI
2286 .type = HDA_FIXUP_PINS,
2287 .v.pins = (const struct hda_pintbl[]) {
8f239214
MB
2288 { 0x1c, 0x993301f0 }, /* CD */
2289 { }
2290 }
2291 },
b2c53e20
DH
2292 [ALC889_FIXUP_FRONT_HP_NO_PRESENCE] = {
2293 .type = HDA_FIXUP_PINS,
2294 .v.pins = (const struct hda_pintbl[]) {
2295 { 0x1b, 0x02214120 }, /* Front HP jack is flaky, disable jack detect */
2296 { }
2297 },
2298 .chained = true,
2299 .chain_id = ALC889_FIXUP_CD,
2300 },
5c0ebfbe 2301 [ALC889_FIXUP_VAIO_TT] = {
1727a771
TI
2302 .type = HDA_FIXUP_PINS,
2303 .v.pins = (const struct hda_pintbl[]) {
5c0ebfbe
TI
2304 { 0x17, 0x90170111 }, /* hidden surround speaker */
2305 { }
2306 }
2307 },
0e7cc2e7 2308 [ALC888_FIXUP_EEE1601] = {
1727a771 2309 .type = HDA_FIXUP_VERBS,
0e7cc2e7
TI
2310 .v.verbs = (const struct hda_verb[]) {
2311 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2312 { 0x20, AC_VERB_SET_PROC_COEF, 0x0838 },
2313 { }
2314 }
177943a3 2315 },
4841b8e6
PH
2316 [ALC886_FIXUP_EAPD] = {
2317 .type = HDA_FIXUP_VERBS,
2318 .v.verbs = (const struct hda_verb[]) {
2319 /* change to EAPD mode */
2320 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2321 { 0x20, AC_VERB_SET_PROC_COEF, 0x0068 },
2322 { }
2323 }
2324 },
177943a3 2325 [ALC882_FIXUP_EAPD] = {
1727a771 2326 .type = HDA_FIXUP_VERBS,
177943a3
TI
2327 .v.verbs = (const struct hda_verb[]) {
2328 /* change to EAPD mode */
2329 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2330 { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
2331 { }
2332 }
2333 },
7a6069bf 2334 [ALC883_FIXUP_EAPD] = {
1727a771 2335 .type = HDA_FIXUP_VERBS,
7a6069bf
TI
2336 .v.verbs = (const struct hda_verb[]) {
2337 /* change to EAPD mode */
2338 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2339 { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2340 { }
2341 }
2342 },
8812c4f9 2343 [ALC883_FIXUP_ACER_EAPD] = {
1727a771 2344 .type = HDA_FIXUP_VERBS,
8812c4f9
TI
2345 .v.verbs = (const struct hda_verb[]) {
2346 /* eanable EAPD on Acer laptops */
2347 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2348 { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2349 { }
2350 }
2351 },
1a97b7f2 2352 [ALC882_FIXUP_GPIO1] = {
5579cd6f
TI
2353 .type = HDA_FIXUP_FUNC,
2354 .v.func = alc_fixup_gpio1,
1a97b7f2
TI
2355 },
2356 [ALC882_FIXUP_GPIO2] = {
5579cd6f
TI
2357 .type = HDA_FIXUP_FUNC,
2358 .v.func = alc_fixup_gpio2,
1a97b7f2 2359 },
eb844d51 2360 [ALC882_FIXUP_GPIO3] = {
5579cd6f
TI
2361 .type = HDA_FIXUP_FUNC,
2362 .v.func = alc_fixup_gpio3,
eb844d51 2363 },
68ef0561 2364 [ALC882_FIXUP_ASUS_W2JC] = {
5579cd6f
TI
2365 .type = HDA_FIXUP_FUNC,
2366 .v.func = alc_fixup_gpio1,
68ef0561
TI
2367 .chained = true,
2368 .chain_id = ALC882_FIXUP_EAPD,
2369 },
2370 [ALC889_FIXUP_COEF] = {
1727a771 2371 .type = HDA_FIXUP_FUNC,
68ef0561
TI
2372 .v.func = alc889_fixup_coef,
2373 },
c3e837bb 2374 [ALC882_FIXUP_ACER_ASPIRE_4930G] = {
1727a771
TI
2375 .type = HDA_FIXUP_PINS,
2376 .v.pins = (const struct hda_pintbl[]) {
c3e837bb
TI
2377 { 0x16, 0x99130111 }, /* CLFE speaker */
2378 { 0x17, 0x99130112 }, /* surround speaker */
2379 { }
038d4fef
TI
2380 },
2381 .chained = true,
2382 .chain_id = ALC882_FIXUP_GPIO1,
c3e837bb
TI
2383 },
2384 [ALC882_FIXUP_ACER_ASPIRE_8930G] = {
1727a771
TI
2385 .type = HDA_FIXUP_PINS,
2386 .v.pins = (const struct hda_pintbl[]) {
c3e837bb
TI
2387 { 0x16, 0x99130111 }, /* CLFE speaker */
2388 { 0x1b, 0x99130112 }, /* surround speaker */
2389 { }
2390 },
2391 .chained = true,
2392 .chain_id = ALC882_FIXUP_ASPIRE_8930G_VERBS,
2393 },
2394 [ALC882_FIXUP_ASPIRE_8930G_VERBS] = {
2395 /* additional init verbs for Acer Aspire 8930G */
1727a771 2396 .type = HDA_FIXUP_VERBS,
c3e837bb
TI
2397 .v.verbs = (const struct hda_verb[]) {
2398 /* Enable all DACs */
2399 /* DAC DISABLE/MUTE 1? */
2400 /* setting bits 1-5 disables DAC nids 0x02-0x06
2401 * apparently. Init=0x38 */
2402 { 0x20, AC_VERB_SET_COEF_INDEX, 0x03 },
2403 { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2404 /* DAC DISABLE/MUTE 2? */
2405 /* some bit here disables the other DACs.
2406 * Init=0x4900 */
2407 { 0x20, AC_VERB_SET_COEF_INDEX, 0x08 },
2408 { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2409 /* DMIC fix
2410 * This laptop has a stereo digital microphone.
2411 * The mics are only 1cm apart which makes the stereo
2412 * useless. However, either the mic or the ALC889
2413 * makes the signal become a difference/sum signal
2414 * instead of standard stereo, which is annoying.
2415 * So instead we flip this bit which makes the
2416 * codec replicate the sum signal to both channels,
2417 * turning it into a normal mono mic.
2418 */
2419 /* DMIC_CONTROL? Init value = 0x0001 */
2420 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2421 { 0x20, AC_VERB_SET_PROC_COEF, 0x0003 },
2422 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2423 { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2424 { }
038d4fef
TI
2425 },
2426 .chained = true,
2427 .chain_id = ALC882_FIXUP_GPIO1,
c3e837bb 2428 },
5671087f 2429 [ALC885_FIXUP_MACPRO_GPIO] = {
1727a771 2430 .type = HDA_FIXUP_FUNC,
5671087f
TI
2431 .v.func = alc885_fixup_macpro_gpio,
2432 },
02a237b2 2433 [ALC889_FIXUP_DAC_ROUTE] = {
1727a771 2434 .type = HDA_FIXUP_FUNC,
02a237b2
TI
2435 .v.func = alc889_fixup_dac_route,
2436 },
1a97b7f2 2437 [ALC889_FIXUP_MBP_VREF] = {
1727a771 2438 .type = HDA_FIXUP_FUNC,
1a97b7f2
TI
2439 .v.func = alc889_fixup_mbp_vref,
2440 .chained = true,
2441 .chain_id = ALC882_FIXUP_GPIO1,
2442 },
2443 [ALC889_FIXUP_IMAC91_VREF] = {
1727a771 2444 .type = HDA_FIXUP_FUNC,
1a97b7f2
TI
2445 .v.func = alc889_fixup_imac91_vref,
2446 .chained = true,
2447 .chain_id = ALC882_FIXUP_GPIO1,
2448 },
e7729a41
AV
2449 [ALC889_FIXUP_MBA11_VREF] = {
2450 .type = HDA_FIXUP_FUNC,
2451 .v.func = alc889_fixup_mba11_vref,
2452 .chained = true,
2453 .chain_id = ALC889_FIXUP_MBP_VREF,
2454 },
0756f09c
TI
2455 [ALC889_FIXUP_MBA21_VREF] = {
2456 .type = HDA_FIXUP_FUNC,
2457 .v.func = alc889_fixup_mba21_vref,
2458 .chained = true,
2459 .chain_id = ALC889_FIXUP_MBP_VREF,
2460 },
c20f31ec
TI
2461 [ALC889_FIXUP_MP11_VREF] = {
2462 .type = HDA_FIXUP_FUNC,
2463 .v.func = alc889_fixup_mba11_vref,
2464 .chained = true,
2465 .chain_id = ALC885_FIXUP_MACPRO_GPIO,
2466 },
9f660a1c
MK
2467 [ALC889_FIXUP_MP41_VREF] = {
2468 .type = HDA_FIXUP_FUNC,
2469 .v.func = alc889_fixup_mbp_vref,
2470 .chained = true,
2471 .chain_id = ALC885_FIXUP_MACPRO_GPIO,
2472 },
6e72aa5f 2473 [ALC882_FIXUP_INV_DMIC] = {
1727a771 2474 .type = HDA_FIXUP_FUNC,
9d36a7dc 2475 .v.func = alc_fixup_inv_dmic,
6e72aa5f 2476 },
e427c237 2477 [ALC882_FIXUP_NO_PRIMARY_HP] = {
1727a771 2478 .type = HDA_FIXUP_FUNC,
e427c237
TI
2479 .v.func = alc882_fixup_no_primary_hp,
2480 },
1f0bbf03
TI
2481 [ALC887_FIXUP_ASUS_BASS] = {
2482 .type = HDA_FIXUP_PINS,
2483 .v.pins = (const struct hda_pintbl[]) {
2484 {0x16, 0x99130130}, /* bass speaker */
2485 {}
2486 },
eb9ca3ab
TI
2487 .chained = true,
2488 .chain_id = ALC887_FIXUP_BASS_CHMAP,
2489 },
2490 [ALC887_FIXUP_BASS_CHMAP] = {
2491 .type = HDA_FIXUP_FUNC,
2492 .v.func = alc_fixup_bass_chmap,
1f0bbf03 2493 },
7beb3a6e
TI
2494 [ALC1220_FIXUP_GB_DUAL_CODECS] = {
2495 .type = HDA_FIXUP_FUNC,
2496 .v.func = alc1220_fixup_gb_dual_codecs,
2497 },
c1933008
CL
2498 [ALC1220_FIXUP_GB_X570] = {
2499 .type = HDA_FIXUP_FUNC,
2500 .v.func = alc1220_fixup_gb_x570,
2501 },
0202f5cd
P
2502 [ALC1220_FIXUP_CLEVO_P950] = {
2503 .type = HDA_FIXUP_FUNC,
2504 .v.func = alc1220_fixup_clevo_p950,
2505 },
80690a27 2506 [ALC1220_FIXUP_CLEVO_PB51ED] = {
7f665b1c 2507 .type = HDA_FIXUP_FUNC,
80690a27 2508 .v.func = alc1220_fixup_clevo_pb51ed,
7f665b1c 2509 },
80690a27 2510 [ALC1220_FIXUP_CLEVO_PB51ED_PINS] = {
7f665b1c
JS
2511 .type = HDA_FIXUP_PINS,
2512 .v.pins = (const struct hda_pintbl[]) {
2513 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
2514 {}
2515 },
2516 .chained = true,
80690a27 2517 .chain_id = ALC1220_FIXUP_CLEVO_PB51ED,
7f665b1c 2518 },
ca184355
JHP
2519 [ALC887_FIXUP_ASUS_AUDIO] = {
2520 .type = HDA_FIXUP_PINS,
2521 .v.pins = (const struct hda_pintbl[]) {
2522 { 0x15, 0x02a14150 }, /* use as headset mic, without its own jack detect */
2523 { 0x19, 0x22219420 },
2524 {}
2525 },
2526 },
2527 [ALC887_FIXUP_ASUS_HMIC] = {
2528 .type = HDA_FIXUP_FUNC,
2529 .v.func = alc887_fixup_asus_jack,
2530 .chained = true,
2531 .chain_id = ALC887_FIXUP_ASUS_AUDIO,
2532 },
9bfa7b36
ML
2533 [ALCS1200A_FIXUP_MIC_VREF] = {
2534 .type = HDA_FIXUP_PINCTLS,
2535 .v.pins = (const struct hda_pintbl[]) {
2536 { 0x18, PIN_VREF50 }, /* rear mic */
2537 { 0x19, PIN_VREF50 }, /* front mic */
2538 {}
2539 }
2540 },
baaacbff
KY
2541 [ALC888VD_FIXUP_MIC_100VREF] = {
2542 .type = HDA_FIXUP_PINCTLS,
2543 .v.pins = (const struct hda_pintbl[]) {
2544 { 0x18, PIN_VREF100 }, /* headset mic */
2545 {}
2546 }
2547 },
ff818c24
TI
2548};
2549
1d045db9 2550static const struct snd_pci_quirk alc882_fixup_tbl[] = {
8812c4f9
TI
2551 SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD),
2552 SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
b5d724b1 2553 SND_PCI_QUIRK(0x1025, 0x0107, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
8812c4f9
TI
2554 SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD),
2555 SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2556 SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD),
2557 SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_FIXUP_ACER_EAPD),
c3e837bb
TI
2558 SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
2559 ALC882_FIXUP_ACER_ASPIRE_4930G),
2560 SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
2561 ALC882_FIXUP_ACER_ASPIRE_4930G),
2562 SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
2563 ALC882_FIXUP_ACER_ASPIRE_8930G),
2564 SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
2565 ALC882_FIXUP_ACER_ASPIRE_8930G),
b265047a
TI
2566 SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
2567 ALC882_FIXUP_ACER_ASPIRE_4930G),
2568 SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
c3e837bb
TI
2569 SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
2570 ALC882_FIXUP_ACER_ASPIRE_4930G),
2571 SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
2572 ALC882_FIXUP_ACER_ASPIRE_4930G),
f5c53d89
TI
2573 SND_PCI_QUIRK(0x1025, 0x021e, "Acer Aspire 5739G",
2574 ALC882_FIXUP_ACER_ASPIRE_4930G),
02a237b2 2575 SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),
fe97da1f 2576 SND_PCI_QUIRK(0x1025, 0x026b, "Acer Aspire 8940G", ALC882_FIXUP_ACER_ASPIRE_8930G),
ac9b1cdd 2577 SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736),
177943a3 2578 SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD),
5c0ebfbe 2579 SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),
68ef0561 2580 SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_FIXUP_ASUS_W2JC),
ca184355 2581 SND_PCI_QUIRK(0x1043, 0x2390, "Asus D700SA", ALC887_FIXUP_ASUS_HMIC),
0e7cc2e7 2582 SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601),
1f0bbf03 2583 SND_PCI_QUIRK(0x1043, 0x84bc, "ASUS ET2700", ALC887_FIXUP_ASUS_BASS),
85bcf96c 2584 SND_PCI_QUIRK(0x1043, 0x8691, "ASUS ROG Ranger VIII", ALC882_FIXUP_GPIO3),
9bfa7b36 2585 SND_PCI_QUIRK(0x1043, 0x8797, "ASUS TUF B550M-PLUS", ALCS1200A_FIXUP_MIC_VREF),
b7529c18
TI
2586 SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP),
2587 SND_PCI_QUIRK(0x104d, 0x9044, "Sony VAIO AiO", ALC882_FIXUP_NO_PRIMARY_HP),
ac9b1cdd 2588 SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT),
e427c237 2589 SND_PCI_QUIRK(0x104d, 0x905a, "Sony Vaio Z", ALC882_FIXUP_NO_PRIMARY_HP),
3f3c3714 2590 SND_PCI_QUIRK(0x104d, 0x9060, "Sony Vaio VPCL14M1R", ALC882_FIXUP_NO_PRIMARY_HP),
5671087f
TI
2591
2592 /* All Apple entries are in codec SSIDs */
1a97b7f2
TI
2593 SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF),
2594 SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC889_FIXUP_MBP_VREF),
2595 SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
c20f31ec 2596 SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC889_FIXUP_MP11_VREF),
5671087f
TI
2597 SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_FIXUP_MACPRO_GPIO),
2598 SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_FIXUP_MACPRO_GPIO),
1a97b7f2
TI
2599 SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC889_FIXUP_MBP_VREF),
2600 SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889_FIXUP_MBP_VREF),
5671087f 2601 SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD),
e7729a41 2602 SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC889_FIXUP_MBA11_VREF),
0756f09c 2603 SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBA21_VREF),
1a97b7f2
TI
2604 SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889_FIXUP_MBP_VREF),
2605 SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
5671087f 2606 SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO),
1a97b7f2
TI
2607 SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF),
2608 SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF),
2609 SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF),
9f660a1c 2610 SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 4,1/5,1", ALC889_FIXUP_MP41_VREF),
05193639 2611 SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF),
1a97b7f2
TI
2612 SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),
2613 SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),
649ccd08 2614 SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_MBA11_VREF),
5671087f 2615
7a6069bf 2616 SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),
baaacbff 2617 SND_PCI_QUIRK(0x10ec, 0x12d8, "iBase Elo Touch", ALC888VD_FIXUP_MIC_100VREF),
4841b8e6 2618 SND_PCI_QUIRK(0x13fe, 0x1009, "Advantech MIT-W101", ALC886_FIXUP_EAPD),
b2c53e20 2619 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE),
7beb3a6e 2620 SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
c1933008 2621 SND_PCI_QUIRK(0x1458, 0xa0cd, "Gigabyte X570 Aorus Master", ALC1220_FIXUP_GB_X570),
ea354196 2622 SND_PCI_QUIRK(0x1458, 0xa0ce, "Gigabyte X570 Aorus Xtreme", ALC1220_FIXUP_GB_X570),
41a86013 2623 SND_PCI_QUIRK(0x1458, 0xa0d5, "Gigabyte X570S Aorus Master", ALC1220_FIXUP_GB_X570),
a0b03952 2624 SND_PCI_QUIRK(0x1462, 0x11f7, "MSI-GE63", ALC1220_FIXUP_CLEVO_P950),
a655e2b1 2625 SND_PCI_QUIRK(0x1462, 0x1228, "MSI-GP63", ALC1220_FIXUP_CLEVO_P950),
09926202 2626 SND_PCI_QUIRK(0x1462, 0x1229, "MSI-GP73", ALC1220_FIXUP_CLEVO_P950),
1d3aa4a5 2627 SND_PCI_QUIRK(0x1462, 0x1275, "MSI-GL63", ALC1220_FIXUP_CLEVO_P950),
7dafba37 2628 SND_PCI_QUIRK(0x1462, 0x1276, "MSI-GL73", ALC1220_FIXUP_CLEVO_P950),
cc5049ae 2629 SND_PCI_QUIRK(0x1462, 0x1293, "MSI-GP65", ALC1220_FIXUP_CLEVO_P950),
d2c3b14e 2630 SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),
26af1772 2631 SND_PCI_QUIRK(0x1462, 0xcc34, "MSI Godlike X570", ALC1220_FIXUP_GB_DUAL_CODECS),
63691587 2632 SND_PCI_QUIRK(0x1462, 0xda57, "MSI Z270-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
d2c3b14e 2633 SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
5c0ebfbe 2634 SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
36d4d213 2635 SND_PCI_QUIRK(0x1558, 0x3702, "Clevo X370SN[VW]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
13e1a4cd
TI
2636 SND_PCI_QUIRK(0x1558, 0x50d3, "Clevo PC50[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2637 SND_PCI_QUIRK(0x1558, 0x65d1, "Clevo PB51[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2638 SND_PCI_QUIRK(0x1558, 0x65d2, "Clevo PB51R[CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2639 SND_PCI_QUIRK(0x1558, 0x65e1, "Clevo PB51[ED][DF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2640 SND_PCI_QUIRK(0x1558, 0x65e5, "Clevo PC50D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
aef454b4 2641 SND_PCI_QUIRK(0x1558, 0x65f1, "Clevo PC50HS", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
9eb6f5c3 2642 SND_PCI_QUIRK(0x1558, 0x65f5, "Clevo PD50PN[NRT]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
b7a58228 2643 SND_PCI_QUIRK(0x1558, 0x66a2, "Clevo PE60RNE", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
33affa7f 2644 SND_PCI_QUIRK(0x1558, 0x66a6, "Clevo PE60SN[CDE]-[GS]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
13e1a4cd
TI
2645 SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2646 SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2647 SND_PCI_QUIRK(0x1558, 0x67e5, "Clevo PC70D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
dbfe8350 2648 SND_PCI_QUIRK(0x1558, 0x67f1, "Clevo PC70H[PRS]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
d4995121 2649 SND_PCI_QUIRK(0x1558, 0x67f5, "Clevo PD70PN[NRT]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
13e1a4cd 2650 SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
1f8d398e 2651 SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170SM", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
cc03069a 2652 SND_PCI_QUIRK(0x1558, 0x7715, "Clevo X170KM-G", ALC1220_FIXUP_CLEVO_PB51ED),
0202f5cd 2653 SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),
b5acfe15 2654 SND_PCI_QUIRK(0x1558, 0x9506, "Clevo P955HQ", ALC1220_FIXUP_CLEVO_P950),
13e1a4cd 2655 SND_PCI_QUIRK(0x1558, 0x950a, "Clevo P955H[PR]", ALC1220_FIXUP_CLEVO_P950),
f3d737b6 2656 SND_PCI_QUIRK(0x1558, 0x95e1, "Clevo P95xER", ALC1220_FIXUP_CLEVO_P950),
2f0d520a 2657 SND_PCI_QUIRK(0x1558, 0x95e2, "Clevo P950ER", ALC1220_FIXUP_CLEVO_P950),
b5acfe15
PH
2658 SND_PCI_QUIRK(0x1558, 0x95e3, "Clevo P955[ER]T", ALC1220_FIXUP_CLEVO_P950),
2659 SND_PCI_QUIRK(0x1558, 0x95e4, "Clevo P955ER", ALC1220_FIXUP_CLEVO_P950),
2660 SND_PCI_QUIRK(0x1558, 0x95e5, "Clevo P955EE6", ALC1220_FIXUP_CLEVO_P950),
2661 SND_PCI_QUIRK(0x1558, 0x95e6, "Clevo P950R[CDF]", ALC1220_FIXUP_CLEVO_P950),
503d90b3
RS
2662 SND_PCI_QUIRK(0x1558, 0x96e1, "Clevo P960[ER][CDFN]-K", ALC1220_FIXUP_CLEVO_P950),
2663 SND_PCI_QUIRK(0x1558, 0x97e1, "Clevo P970[ER][CDFN]", ALC1220_FIXUP_CLEVO_P950),
b5acfe15 2664 SND_PCI_QUIRK(0x1558, 0x97e2, "Clevo P970RC-M", ALC1220_FIXUP_CLEVO_P950),
b7a58228 2665 SND_PCI_QUIRK(0x1558, 0xd502, "Clevo PD50SNE", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
7a6069bf
TI
2666 SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
2667 SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),
ac9b1cdd 2668 SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),
68ef0561 2669 SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_FIXUP_COEF),
ff818c24
TI
2670 {}
2671};
2672
1727a771 2673static const struct hda_model_fixup alc882_fixup_models[] = {
772c2917
TI
2674 {.id = ALC882_FIXUP_ABIT_AW9D_MAX, .name = "abit-aw9d"},
2675 {.id = ALC882_FIXUP_LENOVO_Y530, .name = "lenovo-y530"},
2676 {.id = ALC882_FIXUP_ACER_ASPIRE_7736, .name = "acer-aspire-7736"},
2677 {.id = ALC882_FIXUP_ASUS_W90V, .name = "asus-w90v"},
2678 {.id = ALC889_FIXUP_CD, .name = "cd"},
2679 {.id = ALC889_FIXUP_FRONT_HP_NO_PRESENCE, .name = "no-front-hp"},
2680 {.id = ALC889_FIXUP_VAIO_TT, .name = "vaio-tt"},
2681 {.id = ALC888_FIXUP_EEE1601, .name = "eee1601"},
2682 {.id = ALC882_FIXUP_EAPD, .name = "alc882-eapd"},
2683 {.id = ALC883_FIXUP_EAPD, .name = "alc883-eapd"},
2684 {.id = ALC882_FIXUP_GPIO1, .name = "gpio1"},
2685 {.id = ALC882_FIXUP_GPIO2, .name = "gpio2"},
2686 {.id = ALC882_FIXUP_GPIO3, .name = "gpio3"},
2687 {.id = ALC889_FIXUP_COEF, .name = "alc889-coef"},
2688 {.id = ALC882_FIXUP_ASUS_W2JC, .name = "asus-w2jc"},
912093bc
TI
2689 {.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name = "acer-aspire-4930g"},
2690 {.id = ALC882_FIXUP_ACER_ASPIRE_8930G, .name = "acer-aspire-8930g"},
2691 {.id = ALC883_FIXUP_ACER_EAPD, .name = "acer-aspire"},
772c2917
TI
2692 {.id = ALC885_FIXUP_MACPRO_GPIO, .name = "macpro-gpio"},
2693 {.id = ALC889_FIXUP_DAC_ROUTE, .name = "dac-route"},
2694 {.id = ALC889_FIXUP_MBP_VREF, .name = "mbp-vref"},
2695 {.id = ALC889_FIXUP_IMAC91_VREF, .name = "imac91-vref"},
2696 {.id = ALC889_FIXUP_MBA11_VREF, .name = "mba11-vref"},
2697 {.id = ALC889_FIXUP_MBA21_VREF, .name = "mba21-vref"},
2698 {.id = ALC889_FIXUP_MP11_VREF, .name = "mp11-vref"},
2699 {.id = ALC889_FIXUP_MP41_VREF, .name = "mp41-vref"},
6e72aa5f 2700 {.id = ALC882_FIXUP_INV_DMIC, .name = "inv-dmic"},
e427c237 2701 {.id = ALC882_FIXUP_NO_PRIMARY_HP, .name = "no-primary-hp"},
772c2917 2702 {.id = ALC887_FIXUP_ASUS_BASS, .name = "asus-bass"},
ba90d6a6 2703 {.id = ALC1220_FIXUP_GB_DUAL_CODECS, .name = "dual-codecs"},
63394a16 2704 {.id = ALC1220_FIXUP_GB_X570, .name = "gb-x570"},
772c2917 2705 {.id = ALC1220_FIXUP_CLEVO_P950, .name = "clevo-p950"},
912093bc
TI
2706 {}
2707};
2708
119b75c1
HW
2709static const struct snd_hda_pin_quirk alc882_pin_fixup_tbl[] = {
2710 SND_HDA_PIN_QUIRK(0x10ec1220, 0x1043, "ASUS", ALC1220_FIXUP_CLEVO_P950,
2711 {0x14, 0x01014010},
2712 {0x15, 0x01011012},
2713 {0x16, 0x01016011},
2714 {0x18, 0x01a19040},
2715 {0x19, 0x02a19050},
2716 {0x1a, 0x0181304f},
2717 {0x1b, 0x0221401f},
2718 {0x1e, 0x01456130}),
2719 SND_HDA_PIN_QUIRK(0x10ec1220, 0x1462, "MS-7C35", ALC1220_FIXUP_CLEVO_P950,
2720 {0x14, 0x01015010},
2721 {0x15, 0x01011012},
2722 {0x16, 0x01011011},
2723 {0x18, 0x01a11040},
2724 {0x19, 0x02a19050},
2725 {0x1a, 0x0181104f},
2726 {0x1b, 0x0221401f},
2727 {0x1e, 0x01451130}),
2728 {}
2729};
2730
f6a92248 2731/*
1d045db9 2732 * BIOS auto configuration
f6a92248 2733 */
1d045db9
TI
2734/* almost identical with ALC880 parser... */
2735static int alc882_parse_auto_config(struct hda_codec *codec)
2736{
1d045db9 2737 static const hda_nid_t alc882_ignore[] = { 0x1d, 0 };
3e6179b8
TI
2738 static const hda_nid_t alc882_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2739 return alc_parse_auto_config(codec, alc882_ignore, alc882_ssids);
1d045db9 2740}
b896b4eb 2741
1d045db9
TI
2742/*
2743 */
1d045db9 2744static int patch_alc882(struct hda_codec *codec)
f6a92248
KY
2745{
2746 struct alc_spec *spec;
1a97b7f2 2747 int err;
f6a92248 2748
3de95173
TI
2749 err = alc_alloc_spec(codec, 0x0b);
2750 if (err < 0)
2751 return err;
f6a92248 2752
3de95173 2753 spec = codec->spec;
1f0f4b80 2754
7639a06c 2755 switch (codec->core.vendor_id) {
1d045db9
TI
2756 case 0x10ec0882:
2757 case 0x10ec0885:
acf08081 2758 case 0x10ec0900:
6d9ffcff 2759 case 0x10ec0b00:
a535ad57 2760 case 0x10ec1220:
1d045db9
TI
2761 break;
2762 default:
2763 /* ALC883 and variants */
2764 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2765 break;
c793bec5 2766 }
977ddd6b 2767
c9af753f
TI
2768 alc_pre_init(codec);
2769
1727a771 2770 snd_hda_pick_fixup(codec, alc882_fixup_models, alc882_fixup_tbl,
912093bc 2771 alc882_fixups);
119b75c1 2772 snd_hda_pick_pin_fixup(codec, alc882_pin_fixup_tbl, alc882_fixups, true);
1727a771 2773 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
ff818c24 2774
1d045db9
TI
2775 alc_auto_parse_customize_define(codec);
2776
7504b6cd
TI
2777 if (has_cdefine_beep(codec))
2778 spec->gen.beep_nid = 0x01;
2779
1a97b7f2
TI
2780 /* automatic parse from the BIOS config */
2781 err = alc882_parse_auto_config(codec);
2782 if (err < 0)
2783 goto error;
f6a92248 2784
fea80fae
TI
2785 if (!spec->gen.no_analog && spec->gen.beep_nid) {
2786 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2787 if (err < 0)
2788 goto error;
2789 }
f6a92248 2790
1727a771 2791 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
589876e2 2792
f6a92248 2793 return 0;
e16fb6d1
TI
2794
2795 error:
2796 alc_free(codec);
2797 return err;
f6a92248
KY
2798}
2799
df694daa 2800
df694daa 2801/*
1d045db9 2802 * ALC262 support
df694daa 2803 */
1d045db9 2804static int alc262_parse_auto_config(struct hda_codec *codec)
df694daa 2805{
1d045db9 2806 static const hda_nid_t alc262_ignore[] = { 0x1d, 0 };
3e6179b8
TI
2807 static const hda_nid_t alc262_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2808 return alc_parse_auto_config(codec, alc262_ignore, alc262_ssids);
df694daa
KY
2809}
2810
df694daa 2811/*
1d045db9 2812 * Pin config fixes
df694daa 2813 */
cfc9b06f 2814enum {
ea4e7af1 2815 ALC262_FIXUP_FSC_H270,
7513e6da 2816 ALC262_FIXUP_FSC_S7110,
ea4e7af1
TI
2817 ALC262_FIXUP_HP_Z200,
2818 ALC262_FIXUP_TYAN,
c470150c 2819 ALC262_FIXUP_LENOVO_3000,
b42590b8
TI
2820 ALC262_FIXUP_BENQ,
2821 ALC262_FIXUP_BENQ_T31,
6e72aa5f 2822 ALC262_FIXUP_INV_DMIC,
b5c6611f 2823 ALC262_FIXUP_INTEL_BAYLEYBAY,
cfc9b06f
TI
2824};
2825
1727a771 2826static const struct hda_fixup alc262_fixups[] = {
ea4e7af1 2827 [ALC262_FIXUP_FSC_H270] = {
1727a771
TI
2828 .type = HDA_FIXUP_PINS,
2829 .v.pins = (const struct hda_pintbl[]) {
1d045db9
TI
2830 { 0x14, 0x99130110 }, /* speaker */
2831 { 0x15, 0x0221142f }, /* front HP */
2832 { 0x1b, 0x0121141f }, /* rear HP */
2833 { }
2834 }
2835 },
7513e6da
TI
2836 [ALC262_FIXUP_FSC_S7110] = {
2837 .type = HDA_FIXUP_PINS,
2838 .v.pins = (const struct hda_pintbl[]) {
2839 { 0x15, 0x90170110 }, /* speaker */
2840 { }
2841 },
2842 .chained = true,
2843 .chain_id = ALC262_FIXUP_BENQ,
2844 },
ea4e7af1 2845 [ALC262_FIXUP_HP_Z200] = {
1727a771
TI
2846 .type = HDA_FIXUP_PINS,
2847 .v.pins = (const struct hda_pintbl[]) {
1d045db9 2848 { 0x16, 0x99130120 }, /* internal speaker */
73413b12
TI
2849 { }
2850 }
cfc9b06f 2851 },
ea4e7af1 2852 [ALC262_FIXUP_TYAN] = {
1727a771
TI
2853 .type = HDA_FIXUP_PINS,
2854 .v.pins = (const struct hda_pintbl[]) {
ea4e7af1
TI
2855 { 0x14, 0x1993e1f0 }, /* int AUX */
2856 { }
2857 }
2858 },
c470150c 2859 [ALC262_FIXUP_LENOVO_3000] = {
fd108215
TI
2860 .type = HDA_FIXUP_PINCTLS,
2861 .v.pins = (const struct hda_pintbl[]) {
2862 { 0x19, PIN_VREF50 },
b42590b8
TI
2863 {}
2864 },
2865 .chained = true,
2866 .chain_id = ALC262_FIXUP_BENQ,
2867 },
2868 [ALC262_FIXUP_BENQ] = {
1727a771 2869 .type = HDA_FIXUP_VERBS,
b42590b8 2870 .v.verbs = (const struct hda_verb[]) {
c470150c
TI
2871 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2872 { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2873 {}
2874 }
2875 },
b42590b8 2876 [ALC262_FIXUP_BENQ_T31] = {
1727a771 2877 .type = HDA_FIXUP_VERBS,
b42590b8
TI
2878 .v.verbs = (const struct hda_verb[]) {
2879 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2880 { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2881 {}
2882 }
2883 },
6e72aa5f 2884 [ALC262_FIXUP_INV_DMIC] = {
1727a771 2885 .type = HDA_FIXUP_FUNC,
9d36a7dc 2886 .v.func = alc_fixup_inv_dmic,
6e72aa5f 2887 },
b5c6611f
ML
2888 [ALC262_FIXUP_INTEL_BAYLEYBAY] = {
2889 .type = HDA_FIXUP_FUNC,
2890 .v.func = alc_fixup_no_depop_delay,
2891 },
cfc9b06f
TI
2892};
2893
1d045db9 2894static const struct snd_pci_quirk alc262_fixup_tbl[] = {
ea4e7af1 2895 SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", ALC262_FIXUP_HP_Z200),
7513e6da 2896 SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu Lifebook S7110", ALC262_FIXUP_FSC_S7110),
3dcd3be3 2897 SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ),
ea4e7af1 2898 SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN),
275ec0cb 2899 SND_PCI_QUIRK(0x1734, 0x1141, "FSC ESPRIMO U9210", ALC262_FIXUP_FSC_H270),
ea4e7af1 2900 SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270),
c470150c 2901 SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000),
b42590b8
TI
2902 SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ),
2903 SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_FIXUP_BENQ_T31),
b5c6611f 2904 SND_PCI_QUIRK(0x8086, 0x7270, "BayleyBay", ALC262_FIXUP_INTEL_BAYLEYBAY),
cfc9b06f
TI
2905 {}
2906};
df694daa 2907
1727a771 2908static const struct hda_model_fixup alc262_fixup_models[] = {
6e72aa5f 2909 {.id = ALC262_FIXUP_INV_DMIC, .name = "inv-dmic"},
e43c44d6
TI
2910 {.id = ALC262_FIXUP_FSC_H270, .name = "fsc-h270"},
2911 {.id = ALC262_FIXUP_FSC_S7110, .name = "fsc-s7110"},
2912 {.id = ALC262_FIXUP_HP_Z200, .name = "hp-z200"},
2913 {.id = ALC262_FIXUP_TYAN, .name = "tyan"},
2914 {.id = ALC262_FIXUP_LENOVO_3000, .name = "lenovo-3000"},
2915 {.id = ALC262_FIXUP_BENQ, .name = "benq"},
2916 {.id = ALC262_FIXUP_BENQ_T31, .name = "benq-t31"},
2917 {.id = ALC262_FIXUP_INTEL_BAYLEYBAY, .name = "bayleybay"},
6e72aa5f
TI
2918 {}
2919};
1d045db9 2920
1d045db9
TI
2921/*
2922 */
1d045db9 2923static int patch_alc262(struct hda_codec *codec)
df694daa
KY
2924{
2925 struct alc_spec *spec;
df694daa
KY
2926 int err;
2927
3de95173
TI
2928 err = alc_alloc_spec(codec, 0x0b);
2929 if (err < 0)
2930 return err;
df694daa 2931
3de95173 2932 spec = codec->spec;
08c189f2 2933 spec->gen.shared_mic_vref_pin = 0x18;
1d045db9 2934
225068ab
TI
2935 spec->shutup = alc_eapd_shutup;
2936
1d045db9
TI
2937#if 0
2938 /* pshou 07/11/05 set a zero PCM sample to DAC when FIFO is
2939 * under-run
2940 */
98b24883 2941 alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x80);
1d045db9 2942#endif
1d045db9
TI
2943 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2944
c9af753f
TI
2945 alc_pre_init(codec);
2946
1727a771 2947 snd_hda_pick_fixup(codec, alc262_fixup_models, alc262_fixup_tbl,
6e72aa5f 2948 alc262_fixups);
1727a771 2949 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
9c7f852e 2950
af741c15
TI
2951 alc_auto_parse_customize_define(codec);
2952
7504b6cd
TI
2953 if (has_cdefine_beep(codec))
2954 spec->gen.beep_nid = 0x01;
2955
42399f7a
TI
2956 /* automatic parse from the BIOS config */
2957 err = alc262_parse_auto_config(codec);
2958 if (err < 0)
2959 goto error;
df694daa 2960
fea80fae
TI
2961 if (!spec->gen.no_analog && spec->gen.beep_nid) {
2962 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2963 if (err < 0)
2964 goto error;
2965 }
2134ea4f 2966
1727a771 2967 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
589876e2 2968
1da177e4 2969 return 0;
e16fb6d1
TI
2970
2971 error:
2972 alc_free(codec);
2973 return err;
1da177e4
LT
2974}
2975
f32610ed 2976/*
1d045db9 2977 * ALC268
f32610ed 2978 */
1d045db9 2979/* bind Beep switches of both NID 0x0f and 0x10 */
a717777d
TI
2980static int alc268_beep_switch_put(struct snd_kcontrol *kcontrol,
2981 struct snd_ctl_elem_value *ucontrol)
2982{
2983 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2984 unsigned long pval;
2985 int err;
2986
2987 mutex_lock(&codec->control_mutex);
2988 pval = kcontrol->private_value;
2989 kcontrol->private_value = (pval & ~0xff) | 0x0f;
2990 err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2991 if (err >= 0) {
2992 kcontrol->private_value = (pval & ~0xff) | 0x10;
2993 err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2994 }
2995 kcontrol->private_value = pval;
2996 mutex_unlock(&codec->control_mutex);
2997 return err;
2998}
f32610ed 2999
1d045db9
TI
3000static const struct snd_kcontrol_new alc268_beep_mixer[] = {
3001 HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
a717777d
TI
3002 {
3003 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3004 .name = "Beep Playback Switch",
3005 .subdevice = HDA_SUBDEV_AMP_FLAG,
3006 .info = snd_hda_mixer_amp_switch_info,
3007 .get = snd_hda_mixer_amp_switch_get,
3008 .put = alc268_beep_switch_put,
3009 .private_value = HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT)
3010 },
f32610ed
JS
3011};
3012
1d045db9
TI
3013/* set PCBEEP vol = 0, mute connections */
3014static const struct hda_verb alc268_beep_init_verbs[] = {
3015 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3016 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3017 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3018 { }
f32610ed
JS
3019};
3020
6e72aa5f
TI
3021enum {
3022 ALC268_FIXUP_INV_DMIC,
cb766404 3023 ALC268_FIXUP_HP_EAPD,
24eff328 3024 ALC268_FIXUP_SPDIF,
6e72aa5f
TI
3025};
3026
1727a771 3027static const struct hda_fixup alc268_fixups[] = {
6e72aa5f 3028 [ALC268_FIXUP_INV_DMIC] = {
1727a771 3029 .type = HDA_FIXUP_FUNC,
9d36a7dc 3030 .v.func = alc_fixup_inv_dmic,
6e72aa5f 3031 },
cb766404 3032 [ALC268_FIXUP_HP_EAPD] = {
1727a771 3033 .type = HDA_FIXUP_VERBS,
cb766404
TI
3034 .v.verbs = (const struct hda_verb[]) {
3035 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 0},
3036 {}
3037 }
3038 },
24eff328
TI
3039 [ALC268_FIXUP_SPDIF] = {
3040 .type = HDA_FIXUP_PINS,
3041 .v.pins = (const struct hda_pintbl[]) {
3042 { 0x1e, 0x014b1180 }, /* enable SPDIF out */
3043 {}
3044 }
3045 },
6e72aa5f
TI
3046};
3047
1727a771 3048static const struct hda_model_fixup alc268_fixup_models[] = {
6e72aa5f 3049 {.id = ALC268_FIXUP_INV_DMIC, .name = "inv-dmic"},
cb766404 3050 {.id = ALC268_FIXUP_HP_EAPD, .name = "hp-eapd"},
03bf11c9 3051 {.id = ALC268_FIXUP_SPDIF, .name = "spdif"},
cb766404
TI
3052 {}
3053};
3054
3055static const struct snd_pci_quirk alc268_fixup_tbl[] = {
24eff328 3056 SND_PCI_QUIRK(0x1025, 0x0139, "Acer TravelMate 6293", ALC268_FIXUP_SPDIF),
fcd8f3b1 3057 SND_PCI_QUIRK(0x1025, 0x015b, "Acer AOA 150 (ZG5)", ALC268_FIXUP_INV_DMIC),
cb766404
TI
3058 /* below is codec SSID since multiple Toshiba laptops have the
3059 * same PCI SSID 1179:ff00
3060 */
3061 SND_PCI_QUIRK(0x1179, 0xff06, "Toshiba P200", ALC268_FIXUP_HP_EAPD),
6e72aa5f
TI
3062 {}
3063};
3064
f32610ed
JS
3065/*
3066 * BIOS auto configuration
3067 */
1d045db9 3068static int alc268_parse_auto_config(struct hda_codec *codec)
f32610ed 3069{
3e6179b8 3070 static const hda_nid_t alc268_ssids[] = { 0x15, 0x1b, 0x14, 0 };
7504b6cd 3071 return alc_parse_auto_config(codec, NULL, alc268_ssids);
f32610ed
JS
3072}
3073
1d045db9
TI
3074/*
3075 */
1d045db9 3076static int patch_alc268(struct hda_codec *codec)
f32610ed
JS
3077{
3078 struct alc_spec *spec;
a5cb463a 3079 int i, err;
f32610ed 3080
1d045db9 3081 /* ALC268 has no aa-loopback mixer */
3de95173
TI
3082 err = alc_alloc_spec(codec, 0);
3083 if (err < 0)
3084 return err;
3085
3086 spec = codec->spec;
2722b535
TI
3087 if (has_cdefine_beep(codec))
3088 spec->gen.beep_nid = 0x01;
1f0f4b80 3089
225068ab
TI
3090 spec->shutup = alc_eapd_shutup;
3091
c9af753f
TI
3092 alc_pre_init(codec);
3093
1727a771
TI
3094 snd_hda_pick_fixup(codec, alc268_fixup_models, alc268_fixup_tbl, alc268_fixups);
3095 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
6e72aa5f 3096
6ebb8053
TI
3097 /* automatic parse from the BIOS config */
3098 err = alc268_parse_auto_config(codec);
e16fb6d1
TI
3099 if (err < 0)
3100 goto error;
f32610ed 3101
7504b6cd
TI
3102 if (err > 0 && !spec->gen.no_analog &&
3103 spec->gen.autocfg.speaker_pins[0] != 0x1d) {
a5cb463a
TI
3104 for (i = 0; i < ARRAY_SIZE(alc268_beep_mixer); i++) {
3105 if (!snd_hda_gen_add_kctl(&spec->gen, NULL,
3106 &alc268_beep_mixer[i])) {
3107 err = -ENOMEM;
3108 goto error;
3109 }
3110 }
7504b6cd 3111 snd_hda_add_verbs(codec, alc268_beep_init_verbs);
1d045db9
TI
3112 if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
3113 /* override the amp caps for beep generator */
3114 snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
3115 (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
3116 (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
3117 (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
3118 (0 << AC_AMPCAP_MUTE_SHIFT));
2f893286
KY
3119 }
3120
1727a771 3121 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
6e72aa5f 3122
f32610ed 3123 return 0;
e16fb6d1
TI
3124
3125 error:
3126 alc_free(codec);
3127 return err;
f32610ed
JS
3128}
3129
bc9f98a9 3130/*
1d045db9 3131 * ALC269
bc9f98a9 3132 */
08c189f2 3133
1d045db9 3134static const struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
1d045db9 3135 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
bc9f98a9
KY
3136};
3137
1d045db9 3138static const struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
1d045db9 3139 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
bc9f98a9 3140};
291702f0 3141
1d045db9
TI
3142/* different alc269-variants */
3143enum {
3144 ALC269_TYPE_ALC269VA,
3145 ALC269_TYPE_ALC269VB,
3146 ALC269_TYPE_ALC269VC,
adcc70b2 3147 ALC269_TYPE_ALC269VD,
065380f0
KY
3148 ALC269_TYPE_ALC280,
3149 ALC269_TYPE_ALC282,
2af02be7 3150 ALC269_TYPE_ALC283,
065380f0 3151 ALC269_TYPE_ALC284,
4731d5de 3152 ALC269_TYPE_ALC293,
7fc7d047 3153 ALC269_TYPE_ALC286,
506b62c3 3154 ALC269_TYPE_ALC298,
1d04c9de 3155 ALC269_TYPE_ALC255,
4344aec8 3156 ALC269_TYPE_ALC256,
f429e7e4 3157 ALC269_TYPE_ALC257,
0a6f0600 3158 ALC269_TYPE_ALC215,
4231430d 3159 ALC269_TYPE_ALC225,
60571929 3160 ALC269_TYPE_ALC245,
99cee034 3161 ALC269_TYPE_ALC287,
dcd4f0db 3162 ALC269_TYPE_ALC294,
1078bef0 3163 ALC269_TYPE_ALC300,
f0778871 3164 ALC269_TYPE_ALC623,
6fbae35a 3165 ALC269_TYPE_ALC700,
bc9f98a9
KY
3166};
3167
3168/*
1d045db9 3169 * BIOS auto configuration
bc9f98a9 3170 */
1d045db9
TI
3171static int alc269_parse_auto_config(struct hda_codec *codec)
3172{
1d045db9 3173 static const hda_nid_t alc269_ignore[] = { 0x1d, 0 };
3e6179b8
TI
3174 static const hda_nid_t alc269_ssids[] = { 0, 0x1b, 0x14, 0x21 };
3175 static const hda_nid_t alc269va_ssids[] = { 0x15, 0x1b, 0x14, 0 };
3176 struct alc_spec *spec = codec->spec;
adcc70b2
KY
3177 const hda_nid_t *ssids;
3178
3179 switch (spec->codec_variant) {
3180 case ALC269_TYPE_ALC269VA:
3181 case ALC269_TYPE_ALC269VC:
065380f0
KY
3182 case ALC269_TYPE_ALC280:
3183 case ALC269_TYPE_ALC284:
4731d5de 3184 case ALC269_TYPE_ALC293:
adcc70b2
KY
3185 ssids = alc269va_ssids;
3186 break;
3187 case ALC269_TYPE_ALC269VB:
3188 case ALC269_TYPE_ALC269VD:
065380f0 3189 case ALC269_TYPE_ALC282:
2af02be7 3190 case ALC269_TYPE_ALC283:
7fc7d047 3191 case ALC269_TYPE_ALC286:
506b62c3 3192 case ALC269_TYPE_ALC298:
1d04c9de 3193 case ALC269_TYPE_ALC255:
4344aec8 3194 case ALC269_TYPE_ALC256:
f429e7e4 3195 case ALC269_TYPE_ALC257:
0a6f0600 3196 case ALC269_TYPE_ALC215:
4231430d 3197 case ALC269_TYPE_ALC225:
60571929 3198 case ALC269_TYPE_ALC245:
99cee034 3199 case ALC269_TYPE_ALC287:
dcd4f0db 3200 case ALC269_TYPE_ALC294:
1078bef0 3201 case ALC269_TYPE_ALC300:
f0778871 3202 case ALC269_TYPE_ALC623:
6fbae35a 3203 case ALC269_TYPE_ALC700:
adcc70b2
KY
3204 ssids = alc269_ssids;
3205 break;
3206 default:
3207 ssids = alc269_ssids;
3208 break;
3209 }
bc9f98a9 3210
3e6179b8 3211 return alc_parse_auto_config(codec, alc269_ignore, ssids);
1d045db9 3212}
bc9f98a9 3213
476c02e0
HW
3214static const struct hda_jack_keymap alc_headset_btn_keymap[] = {
3215 { SND_JACK_BTN_0, KEY_PLAYPAUSE },
3216 { SND_JACK_BTN_1, KEY_VOICECOMMAND },
3217 { SND_JACK_BTN_2, KEY_VOLUMEUP },
3218 { SND_JACK_BTN_3, KEY_VOLUMEDOWN },
3219 {}
3220};
3221
3222static void alc_headset_btn_callback(struct hda_codec *codec,
3223 struct hda_jack_callback *jack)
3224{
3225 int report = 0;
3226
3227 if (jack->unsol_res & (7 << 13))
3228 report |= SND_JACK_BTN_0;
3229
3230 if (jack->unsol_res & (1 << 16 | 3 << 8))
3231 report |= SND_JACK_BTN_1;
3232
3233 /* Volume up key */
3234 if (jack->unsol_res & (7 << 23))
3235 report |= SND_JACK_BTN_2;
3236
3237 /* Volume down key */
3238 if (jack->unsol_res & (7 << 10))
3239 report |= SND_JACK_BTN_3;
3240
04f7791b 3241 snd_hda_jack_set_button_state(codec, jack->nid, report);
476c02e0
HW
3242}
3243
3244static void alc_disable_headset_jack_key(struct hda_codec *codec)
3245{
3246 struct alc_spec *spec = codec->spec;
3247
3248 if (!spec->has_hs_key)
3249 return;
3250
3251 switch (codec->core.vendor_id) {
3252 case 0x10ec0215:
3253 case 0x10ec0225:
3254 case 0x10ec0285:
c72b9bfe 3255 case 0x10ec0287:
476c02e0
HW
3256 case 0x10ec0295:
3257 case 0x10ec0289:
3258 case 0x10ec0299:
3259 alc_write_coef_idx(codec, 0x48, 0x0);
3260 alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3261 alc_update_coef_idx(codec, 0x44, 0x0045 << 8, 0x0);
3262 break;
1948fc06 3263 case 0x10ec0230:
476c02e0
HW
3264 case 0x10ec0236:
3265 case 0x10ec0256:
cae2bdb5 3266 case 0x10ec0257:
527f4643 3267 case 0x19e58326:
476c02e0
HW
3268 alc_write_coef_idx(codec, 0x48, 0x0);
3269 alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3270 break;
3271 }
3272}
3273
3274static void alc_enable_headset_jack_key(struct hda_codec *codec)
3275{
3276 struct alc_spec *spec = codec->spec;
3277
3278 if (!spec->has_hs_key)
3279 return;
3280
3281 switch (codec->core.vendor_id) {
3282 case 0x10ec0215:
3283 case 0x10ec0225:
3284 case 0x10ec0285:
c72b9bfe 3285 case 0x10ec0287:
476c02e0
HW
3286 case 0x10ec0295:
3287 case 0x10ec0289:
3288 case 0x10ec0299:
3289 alc_write_coef_idx(codec, 0x48, 0xd011);
3290 alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3291 alc_update_coef_idx(codec, 0x44, 0x007f << 8, 0x0045 << 8);
3292 break;
1948fc06 3293 case 0x10ec0230:
476c02e0
HW
3294 case 0x10ec0236:
3295 case 0x10ec0256:
cae2bdb5 3296 case 0x10ec0257:
527f4643 3297 case 0x19e58326:
476c02e0
HW
3298 alc_write_coef_idx(codec, 0x48, 0xd011);
3299 alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3300 break;
3301 }
3302}
3303
3304static void alc_fixup_headset_jack(struct hda_codec *codec,
3305 const struct hda_fixup *fix, int action)
3306{
3307 struct alc_spec *spec = codec->spec;
04f7791b 3308 hda_nid_t hp_pin;
476c02e0
HW
3309
3310 switch (action) {
3311 case HDA_FIXUP_ACT_PRE_PROBE:
3312 spec->has_hs_key = 1;
3313 snd_hda_jack_detect_enable_callback(codec, 0x55,
3314 alc_headset_btn_callback);
476c02e0 3315 break;
04f7791b
HW
3316 case HDA_FIXUP_ACT_BUILD:
3317 hp_pin = alc_get_hp_pin(spec);
3318 if (!hp_pin || snd_hda_jack_bind_keymap(codec, 0x55,
3319 alc_headset_btn_keymap,
3320 hp_pin))
3321 snd_hda_jack_add_kctl(codec, 0x55, "Headset Jack",
3322 false, SND_JACK_HEADSET,
3323 alc_headset_btn_keymap);
3324
476c02e0
HW
3325 alc_enable_headset_jack_key(codec);
3326 break;
3327 }
3328}
3329
1387e2d1 3330static void alc269vb_toggle_power_output(struct hda_codec *codec, int power_up)
1d045db9 3331{
98b24883 3332 alc_update_coef_idx(codec, 0x04, 1 << 11, power_up ? (1 << 11) : 0);
1d045db9 3333}
291702f0 3334
1d045db9
TI
3335static void alc269_shutup(struct hda_codec *codec)
3336{
adcc70b2
KY
3337 struct alc_spec *spec = codec->spec;
3338
1387e2d1
KY
3339 if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3340 alc269vb_toggle_power_output(codec, 0);
3341 if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
3342 (alc_get_coef0(codec) & 0x00ff) == 0x018) {
1d045db9
TI
3343 msleep(150);
3344 }
c0ca5ece 3345 alc_shutup_pins(codec);
1d045db9 3346}
291702f0 3347
6b0f95c4 3348static const struct coef_fw alc282_coefs[] = {
54db6c39 3349 WRITE_COEF(0x03, 0x0002), /* Power Down Control */
32fa7e49 3350 UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
54db6c39
TI
3351 WRITE_COEF(0x07, 0x0200), /* DMIC control */
3352 UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
3353 UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
3354 WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
3355 WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
3356 WRITE_COEF(0x0e, 0x6e00), /* LDO1/2/3, DAC/ADC */
3357 UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
3358 UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
3359 WRITE_COEF(0x6f, 0x0), /* Class D test 4 */
3360 UPDATE_COEF(0x0c, 0xfe00, 0), /* IO power down directly */
3361 WRITE_COEF(0x34, 0xa0c0), /* ANC */
3362 UPDATE_COEF(0x16, 0x0008, 0), /* AGC MUX */
3363 UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
3364 UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
3365 WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
3366 WRITE_COEF(0x63, 0x2902), /* PLL */
3367 WRITE_COEF(0x68, 0xa080), /* capless control 2 */
3368 WRITE_COEF(0x69, 0x3400), /* capless control 3 */
3369 WRITE_COEF(0x6a, 0x2f3e), /* capless control 4 */
3370 WRITE_COEF(0x6b, 0x0), /* capless control 5 */
3371 UPDATE_COEF(0x6d, 0x0fff, 0x0900), /* class D test 2 */
3372 WRITE_COEF(0x6e, 0x110a), /* class D test 3 */
3373 UPDATE_COEF(0x70, 0x00f8, 0x00d8), /* class D test 5 */
3374 WRITE_COEF(0x71, 0x0014), /* class D test 6 */
3375 WRITE_COEF(0x72, 0xc2ba), /* classD OCP */
3376 UPDATE_COEF(0x77, 0x0f80, 0), /* classD pure DC test */
3377 WRITE_COEF(0x6c, 0xfc06), /* Class D amp control */
3378 {}
3379};
3380
cb149cb3
KY
3381static void alc282_restore_default_value(struct hda_codec *codec)
3382{
54db6c39 3383 alc_process_coef_fw(codec, alc282_coefs);
cb149cb3
KY
3384}
3385
7b5c7a02
KY
3386static void alc282_init(struct hda_codec *codec)
3387{
3388 struct alc_spec *spec = codec->spec;
35a39f98 3389 hda_nid_t hp_pin = alc_get_hp_pin(spec);
7b5c7a02
KY
3390 bool hp_pin_sense;
3391 int coef78;
3392
cb149cb3
KY
3393 alc282_restore_default_value(codec);
3394
7b5c7a02
KY
3395 if (!hp_pin)
3396 return;
3397 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3398 coef78 = alc_read_coef_idx(codec, 0x78);
3399
3400 /* Index 0x78 Direct Drive HP AMP LPM Control 1 */
3401 /* Headphone capless set to high power mode */
3402 alc_write_coef_idx(codec, 0x78, 0x9004);
3403
3404 if (hp_pin_sense)
3405 msleep(2);
3406
3407 snd_hda_codec_write(codec, hp_pin, 0,
3408 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3409
3410 if (hp_pin_sense)
3411 msleep(85);
3412
3413 snd_hda_codec_write(codec, hp_pin, 0,
3414 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3415
3416 if (hp_pin_sense)
3417 msleep(100);
3418
3419 /* Headphone capless set to normal mode */
3420 alc_write_coef_idx(codec, 0x78, coef78);
3421}
3422
3423static void alc282_shutup(struct hda_codec *codec)
3424{
3425 struct alc_spec *spec = codec->spec;
35a39f98 3426 hda_nid_t hp_pin = alc_get_hp_pin(spec);
7b5c7a02
KY
3427 bool hp_pin_sense;
3428 int coef78;
3429
3430 if (!hp_pin) {
3431 alc269_shutup(codec);
3432 return;
3433 }
3434
3435 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3436 coef78 = alc_read_coef_idx(codec, 0x78);
3437 alc_write_coef_idx(codec, 0x78, 0x9004);
3438
3439 if (hp_pin_sense)
3440 msleep(2);
3441
3442 snd_hda_codec_write(codec, hp_pin, 0,
3443 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3444
3445 if (hp_pin_sense)
3446 msleep(85);
3447
c0ca5ece
TI
3448 if (!spec->no_shutup_pins)
3449 snd_hda_codec_write(codec, hp_pin, 0,
3450 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
7b5c7a02
KY
3451
3452 if (hp_pin_sense)
3453 msleep(100);
3454
3455 alc_auto_setup_eapd(codec, false);
c0ca5ece 3456 alc_shutup_pins(codec);
7b5c7a02
KY
3457 alc_write_coef_idx(codec, 0x78, coef78);
3458}
3459
6b0f95c4 3460static const struct coef_fw alc283_coefs[] = {
54db6c39 3461 WRITE_COEF(0x03, 0x0002), /* Power Down Control */
56779864 3462 UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
54db6c39
TI
3463 WRITE_COEF(0x07, 0x0200), /* DMIC control */
3464 UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
3465 UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
3466 WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
3467 WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
3468 WRITE_COEF(0x0e, 0x6fc0), /* LDO1/2/3, DAC/ADC */
3469 UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
3470 UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
3471 WRITE_COEF(0x3a, 0x0), /* Class D test 4 */
3472 UPDATE_COEF(0x0c, 0xfe00, 0x0), /* IO power down directly */
3473 WRITE_COEF(0x22, 0xa0c0), /* ANC */
3474 UPDATE_COEFEX(0x53, 0x01, 0x000f, 0x0008), /* AGC MUX */
3475 UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
3476 UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
3477 WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
3478 WRITE_COEF(0x2e, 0x2902), /* PLL */
3479 WRITE_COEF(0x33, 0xa080), /* capless control 2 */
3480 WRITE_COEF(0x34, 0x3400), /* capless control 3 */
3481 WRITE_COEF(0x35, 0x2f3e), /* capless control 4 */
3482 WRITE_COEF(0x36, 0x0), /* capless control 5 */
3483 UPDATE_COEF(0x38, 0x0fff, 0x0900), /* class D test 2 */
3484 WRITE_COEF(0x39, 0x110a), /* class D test 3 */
3485 UPDATE_COEF(0x3b, 0x00f8, 0x00d8), /* class D test 5 */
3486 WRITE_COEF(0x3c, 0x0014), /* class D test 6 */
3487 WRITE_COEF(0x3d, 0xc2ba), /* classD OCP */
3488 UPDATE_COEF(0x42, 0x0f80, 0x0), /* classD pure DC test */
3489 WRITE_COEF(0x49, 0x0), /* test mode */
3490 UPDATE_COEF(0x40, 0xf800, 0x9800), /* Class D DC enable */
3491 UPDATE_COEF(0x42, 0xf000, 0x2000), /* DC offset */
3492 WRITE_COEF(0x37, 0xfc06), /* Class D amp control */
56779864 3493 UPDATE_COEF(0x1b, 0x8000, 0), /* HP JD control */
54db6c39
TI
3494 {}
3495};
3496
6bd55b04
KY
3497static void alc283_restore_default_value(struct hda_codec *codec)
3498{
54db6c39 3499 alc_process_coef_fw(codec, alc283_coefs);
6bd55b04
KY
3500}
3501
2af02be7
KY
3502static void alc283_init(struct hda_codec *codec)
3503{
3504 struct alc_spec *spec = codec->spec;
35a39f98 3505 hda_nid_t hp_pin = alc_get_hp_pin(spec);
2af02be7 3506 bool hp_pin_sense;
2af02be7 3507
6bd55b04
KY
3508 alc283_restore_default_value(codec);
3509
2af02be7
KY
3510 if (!hp_pin)
3511 return;
a59d7199
KY
3512
3513 msleep(30);
2af02be7
KY
3514 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3515
3516 /* Index 0x43 Direct Drive HP AMP LPM Control 1 */
3517 /* Headphone capless set to high power mode */
3518 alc_write_coef_idx(codec, 0x43, 0x9004);
3519
3520 snd_hda_codec_write(codec, hp_pin, 0,
3521 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3522
3523 if (hp_pin_sense)
3524 msleep(85);
3525
3526 snd_hda_codec_write(codec, hp_pin, 0,
3527 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3528
3529 if (hp_pin_sense)
3530 msleep(85);
3531 /* Index 0x46 Combo jack auto switch control 2 */
3532 /* 3k pull low control for Headset jack. */
98b24883 3533 alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
2af02be7
KY
3534 /* Headphone capless set to normal mode */
3535 alc_write_coef_idx(codec, 0x43, 0x9614);
3536}
3537
3538static void alc283_shutup(struct hda_codec *codec)
3539{
3540 struct alc_spec *spec = codec->spec;
35a39f98 3541 hda_nid_t hp_pin = alc_get_hp_pin(spec);
2af02be7 3542 bool hp_pin_sense;
2af02be7
KY
3543
3544 if (!hp_pin) {
3545 alc269_shutup(codec);
3546 return;
3547 }
3548
3549 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3550
3551 alc_write_coef_idx(codec, 0x43, 0x9004);
3552
b450b17c
HP
3553 /*depop hp during suspend*/
3554 alc_write_coef_idx(codec, 0x06, 0x2100);
3555
2af02be7
KY
3556 snd_hda_codec_write(codec, hp_pin, 0,
3557 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3558
3559 if (hp_pin_sense)
88011c09 3560 msleep(100);
2af02be7 3561
c0ca5ece
TI
3562 if (!spec->no_shutup_pins)
3563 snd_hda_codec_write(codec, hp_pin, 0,
3564 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
2af02be7 3565
98b24883 3566 alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
2af02be7
KY
3567
3568 if (hp_pin_sense)
88011c09 3569 msleep(100);
0435b3ff 3570 alc_auto_setup_eapd(codec, false);
c0ca5ece 3571 alc_shutup_pins(codec);
2af02be7
KY
3572 alc_write_coef_idx(codec, 0x43, 0x9614);
3573}
3574
4a219ef8
KY
3575static void alc256_init(struct hda_codec *codec)
3576{
3577 struct alc_spec *spec = codec->spec;
35a39f98 3578 hda_nid_t hp_pin = alc_get_hp_pin(spec);
4a219ef8
KY
3579 bool hp_pin_sense;
3580
1f680609
YY
3581 if (spec->ultra_low_power) {
3582 alc_update_coef_idx(codec, 0x03, 1<<1, 1<<1);
3583 alc_update_coef_idx(codec, 0x08, 3<<2, 3<<2);
3584 alc_update_coef_idx(codec, 0x08, 7<<4, 0);
3585 alc_update_coef_idx(codec, 0x3b, 1<<15, 0);
3586 alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3587 msleep(30);
3588 }
3589
4a219ef8 3590 if (!hp_pin)
6447c962 3591 hp_pin = 0x21;
4a219ef8
KY
3592
3593 msleep(30);
3594
3595 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3596
3597 if (hp_pin_sense)
3598 msleep(2);
3599
3600 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
3601
3602 snd_hda_codec_write(codec, hp_pin, 0,
3603 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3604
6447c962 3605 if (hp_pin_sense || spec->ultra_low_power)
4a219ef8
KY
3606 msleep(85);
3607
3608 snd_hda_codec_write(codec, hp_pin, 0,
3609 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3610
6447c962 3611 if (hp_pin_sense || spec->ultra_low_power)
4a219ef8
KY
3612 msleep(100);
3613
3614 alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
3615 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
88d42b2b
KY
3616 alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15); /* Clear bit */
3617 alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15);
c4473744
TH
3618 /*
3619 * Expose headphone mic (or possibly Line In on some machines) instead
3620 * of PC Beep on 1Ah, and disable 1Ah loopback for all outputs. See
3621 * Documentation/sound/hd-audio/realtek-pc-beep.rst for details of
3622 * this register.
3623 */
3624 alc_write_coef_idx(codec, 0x36, 0x5757);
4a219ef8
KY
3625}
3626
3627static void alc256_shutup(struct hda_codec *codec)
3628{
3629 struct alc_spec *spec = codec->spec;
35a39f98 3630 hda_nid_t hp_pin = alc_get_hp_pin(spec);
4a219ef8
KY
3631 bool hp_pin_sense;
3632
6447c962
KY
3633 if (!hp_pin)
3634 hp_pin = 0x21;
4a219ef8 3635
69ea4c9d 3636 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
4a219ef8
KY
3637 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3638
3639 if (hp_pin_sense)
3640 msleep(2);
3641
3642 snd_hda_codec_write(codec, hp_pin, 0,
3643 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3644
6447c962 3645 if (hp_pin_sense || spec->ultra_low_power)
4a219ef8
KY
3646 msleep(85);
3647
1c9609e3
TI
3648 /* 3k pull low control for Headset jack. */
3649 /* NOTE: call this before clearing the pin, otherwise codec stalls */
3f742490
HW
3650 /* If disable 3k pulldown control for alc257, the Mic detection will not work correctly
3651 * when booting with headset plugged. So skip setting it for the codec alc257
3652 */
69ea4c9d 3653 if (spec->en_3kpull_low)
3f742490 3654 alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
1c9609e3 3655
c0ca5ece
TI
3656 if (!spec->no_shutup_pins)
3657 snd_hda_codec_write(codec, hp_pin, 0,
3658 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
4a219ef8 3659
6447c962 3660 if (hp_pin_sense || spec->ultra_low_power)
4a219ef8
KY
3661 msleep(100);
3662
3663 alc_auto_setup_eapd(codec, false);
c0ca5ece 3664 alc_shutup_pins(codec);
6447c962
KY
3665 if (spec->ultra_low_power) {
3666 msleep(50);
3667 alc_update_coef_idx(codec, 0x03, 1<<1, 0);
3668 alc_update_coef_idx(codec, 0x08, 7<<4, 7<<4);
3669 alc_update_coef_idx(codec, 0x08, 3<<2, 0);
3670 alc_update_coef_idx(codec, 0x3b, 1<<15, 1<<15);
3671 alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3672 msleep(30);
3673 }
4a219ef8
KY
3674}
3675
3c24e483
KY
3676static void alc285_hp_init(struct hda_codec *codec)
3677{
3678 struct alc_spec *spec = codec->spec;
3679 hda_nid_t hp_pin = alc_get_hp_pin(spec);
3680 int i, val;
3681 int coef38, coef0d, coef36;
3682
b34bf658 3683 alc_write_coefex_idx(codec, 0x58, 0x00, 0x1888); /* write default value */
3c24e483
KY
3684 alc_update_coef_idx(codec, 0x4a, 1<<15, 1<<15); /* Reset HP JD */
3685 coef38 = alc_read_coef_idx(codec, 0x38); /* Amp control */
3686 coef0d = alc_read_coef_idx(codec, 0x0d); /* Digital Misc control */
3687 coef36 = alc_read_coef_idx(codec, 0x36); /* Passthrough Control */
3688 alc_update_coef_idx(codec, 0x38, 1<<4, 0x0);
3689 alc_update_coef_idx(codec, 0x0d, 0x110, 0x0);
3690
3691 alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
3692
3693 if (hp_pin)
3694 snd_hda_codec_write(codec, hp_pin, 0,
3695 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3696
3697 msleep(130);
3698 alc_update_coef_idx(codec, 0x36, 1<<14, 1<<14);
3699 alc_update_coef_idx(codec, 0x36, 1<<13, 0x0);
3700
3701 if (hp_pin)
3702 snd_hda_codec_write(codec, hp_pin, 0,
3703 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3704 msleep(10);
3705 alc_write_coef_idx(codec, 0x67, 0x0); /* Set HP depop to manual mode */
3706 alc_write_coefex_idx(codec, 0x58, 0x00, 0x7880);
3707 alc_write_coefex_idx(codec, 0x58, 0x0f, 0xf049);
3708 alc_update_coefex_idx(codec, 0x58, 0x03, 0x00f0, 0x00c0);
3709
3710 alc_write_coefex_idx(codec, 0x58, 0x00, 0xf888); /* HP depop procedure start */
3711 val = alc_read_coefex_idx(codec, 0x58, 0x00);
3712 for (i = 0; i < 20 && val & 0x8000; i++) {
3713 msleep(50);
3714 val = alc_read_coefex_idx(codec, 0x58, 0x00);
3715 } /* Wait for depop procedure finish */
3716
3717 alc_write_coefex_idx(codec, 0x58, 0x00, val); /* write back the result */
3718 alc_update_coef_idx(codec, 0x38, 1<<4, coef38);
3719 alc_update_coef_idx(codec, 0x0d, 0x110, coef0d);
3720 alc_update_coef_idx(codec, 0x36, 3<<13, coef36);
3721
3722 msleep(50);
3723 alc_update_coef_idx(codec, 0x4a, 1<<15, 0);
3724}
3725
da911b1f
KY
3726static void alc225_init(struct hda_codec *codec)
3727{
3728 struct alc_spec *spec = codec->spec;
35a39f98 3729 hda_nid_t hp_pin = alc_get_hp_pin(spec);
da911b1f
KY
3730 bool hp1_pin_sense, hp2_pin_sense;
3731
1f680609
YY
3732 if (spec->ultra_low_power) {
3733 alc_update_coef_idx(codec, 0x08, 0x0f << 2, 3<<2);
3734 alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3735 alc_update_coef_idx(codec, 0x33, 1<<11, 0);
3736 msleep(30);
3737 }
3738
60571929
KY
3739 if (spec->codec_variant != ALC269_TYPE_ALC287 &&
3740 spec->codec_variant != ALC269_TYPE_ALC245)
3c24e483
KY
3741 /* required only at boot or S3 and S4 resume time */
3742 if (!spec->done_hp_init ||
3743 is_s3_resume(codec) ||
3744 is_s4_resume(codec)) {
3745 alc285_hp_init(codec);
3746 spec->done_hp_init = true;
3747 }
3748
da911b1f 3749 if (!hp_pin)
d3ba58bb 3750 hp_pin = 0x21;
da911b1f
KY
3751 msleep(30);
3752
3753 hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3754 hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3755
3756 if (hp1_pin_sense || hp2_pin_sense)
3757 msleep(2);
3758
3759 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
3760
d3ba58bb 3761 if (hp1_pin_sense || spec->ultra_low_power)
da911b1f
KY
3762 snd_hda_codec_write(codec, hp_pin, 0,
3763 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3764 if (hp2_pin_sense)
3765 snd_hda_codec_write(codec, 0x16, 0,
3766 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3767
d3ba58bb 3768 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
da911b1f
KY
3769 msleep(85);
3770
d3ba58bb 3771 if (hp1_pin_sense || spec->ultra_low_power)
da911b1f
KY
3772 snd_hda_codec_write(codec, hp_pin, 0,
3773 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3774 if (hp2_pin_sense)
3775 snd_hda_codec_write(codec, 0x16, 0,
3776 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3777
d3ba58bb 3778 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
da911b1f
KY
3779 msleep(100);
3780
3781 alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3782 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
3783}
3784
3785static void alc225_shutup(struct hda_codec *codec)
3786{
3787 struct alc_spec *spec = codec->spec;
35a39f98 3788 hda_nid_t hp_pin = alc_get_hp_pin(spec);
da911b1f
KY
3789 bool hp1_pin_sense, hp2_pin_sense;
3790
d3ba58bb
KY
3791 if (!hp_pin)
3792 hp_pin = 0x21;
476c02e0
HW
3793
3794 alc_disable_headset_jack_key(codec);
da911b1f
KY
3795 /* 3k pull low control for Headset jack. */
3796 alc_update_coef_idx(codec, 0x4a, 0, 3 << 10);
3797
3798 hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3799 hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3800
3801 if (hp1_pin_sense || hp2_pin_sense)
3802 msleep(2);
3803
d3ba58bb 3804 if (hp1_pin_sense || spec->ultra_low_power)
da911b1f
KY
3805 snd_hda_codec_write(codec, hp_pin, 0,
3806 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3807 if (hp2_pin_sense)
3808 snd_hda_codec_write(codec, 0x16, 0,
3809 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3810
d3ba58bb 3811 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
da911b1f
KY
3812 msleep(85);
3813
d3ba58bb 3814 if (hp1_pin_sense || spec->ultra_low_power)
da911b1f
KY
3815 snd_hda_codec_write(codec, hp_pin, 0,
3816 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3817 if (hp2_pin_sense)
3818 snd_hda_codec_write(codec, 0x16, 0,
3819 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3820
d3ba58bb 3821 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
da911b1f
KY
3822 msleep(100);
3823
3824 alc_auto_setup_eapd(codec, false);
c0ca5ece 3825 alc_shutup_pins(codec);
d3ba58bb
KY
3826 if (spec->ultra_low_power) {
3827 msleep(50);
3828 alc_update_coef_idx(codec, 0x08, 0x0f << 2, 0x0c << 2);
3829 alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3830 alc_update_coef_idx(codec, 0x33, 1<<11, 1<<11);
3831 alc_update_coef_idx(codec, 0x4a, 3<<4, 2<<4);
3832 msleep(30);
3833 }
476c02e0
HW
3834
3835 alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3836 alc_enable_headset_jack_key(codec);
da911b1f
KY
3837}
3838
c2d6af53
KY
3839static void alc_default_init(struct hda_codec *codec)
3840{
3841 struct alc_spec *spec = codec->spec;
35a39f98 3842 hda_nid_t hp_pin = alc_get_hp_pin(spec);
c2d6af53
KY
3843 bool hp_pin_sense;
3844
3845 if (!hp_pin)
3846 return;
3847
3848 msleep(30);
3849
3850 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3851
3852 if (hp_pin_sense)
3853 msleep(2);
3854
3855 snd_hda_codec_write(codec, hp_pin, 0,
3856 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3857
3858 if (hp_pin_sense)
3859 msleep(85);
3860
3861 snd_hda_codec_write(codec, hp_pin, 0,
3862 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3863
3864 if (hp_pin_sense)
3865 msleep(100);
3866}
3867
3868static void alc_default_shutup(struct hda_codec *codec)
3869{
3870 struct alc_spec *spec = codec->spec;
35a39f98 3871 hda_nid_t hp_pin = alc_get_hp_pin(spec);
c2d6af53
KY
3872 bool hp_pin_sense;
3873
3874 if (!hp_pin) {
3875 alc269_shutup(codec);
3876 return;
3877 }
3878
3879 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3880
3881 if (hp_pin_sense)
3882 msleep(2);
3883
3884 snd_hda_codec_write(codec, hp_pin, 0,
3885 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3886
3887 if (hp_pin_sense)
3888 msleep(85);
3889
c0ca5ece
TI
3890 if (!spec->no_shutup_pins)
3891 snd_hda_codec_write(codec, hp_pin, 0,
3892 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
c2d6af53
KY
3893
3894 if (hp_pin_sense)
3895 msleep(100);
3896
3897 alc_auto_setup_eapd(codec, false);
c0ca5ece 3898 alc_shutup_pins(codec);
c2d6af53
KY
3899}
3900
693abe11
KY
3901static void alc294_hp_init(struct hda_codec *codec)
3902{
3903 struct alc_spec *spec = codec->spec;
35a39f98 3904 hda_nid_t hp_pin = alc_get_hp_pin(spec);
693abe11
KY
3905 int i, val;
3906
3907 if (!hp_pin)
3908 return;
3909
3910 snd_hda_codec_write(codec, hp_pin, 0,
3911 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3912
3913 msleep(100);
3914
c0ca5ece
TI
3915 if (!spec->no_shutup_pins)
3916 snd_hda_codec_write(codec, hp_pin, 0,
3917 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
693abe11
KY
3918
3919 alc_update_coef_idx(codec, 0x6f, 0x000f, 0);/* Set HP depop to manual mode */
3920 alc_update_coefex_idx(codec, 0x58, 0x00, 0x8000, 0x8000); /* HP depop procedure start */
3921
3922 /* Wait for depop procedure finish */
3923 val = alc_read_coefex_idx(codec, 0x58, 0x01);
3924 for (i = 0; i < 20 && val & 0x0080; i++) {
3925 msleep(50);
3926 val = alc_read_coefex_idx(codec, 0x58, 0x01);
3927 }
3928 /* Set HP depop to auto mode */
3929 alc_update_coef_idx(codec, 0x6f, 0x000f, 0x000b);
3930 msleep(50);
3931}
3932
3933static void alc294_init(struct hda_codec *codec)
3934{
3935 struct alc_spec *spec = codec->spec;
3936
f6ef4e0e
TI
3937 /* required only at boot or S4 resume time */
3938 if (!spec->done_hp_init ||
3939 codec->core.dev.power.power_state.event == PM_EVENT_RESTORE) {
693abe11
KY
3940 alc294_hp_init(codec);
3941 spec->done_hp_init = true;
3942 }
3943 alc_default_init(codec);
3944}
3945
ad60d502
KY
3946static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg,
3947 unsigned int val)
3948{
3949 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3950 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val & 0xffff); /* LSB */
3951 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val >> 16); /* MSB */
3952}
3953
3954static int alc5505_coef_get(struct hda_codec *codec, unsigned int index_reg)
3955{
3956 unsigned int val;
3957
3958 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3959 val = snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3960 & 0xffff;
3961 val |= snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3962 << 16;
3963 return val;
3964}
3965
3966static void alc5505_dsp_halt(struct hda_codec *codec)
3967{
3968 unsigned int val;
3969
3970 alc5505_coef_set(codec, 0x3000, 0x000c); /* DSP CPU stop */
3971 alc5505_coef_set(codec, 0x880c, 0x0008); /* DDR enter self refresh */
3972 alc5505_coef_set(codec, 0x61c0, 0x11110080); /* Clock control for PLL and CPU */
3973 alc5505_coef_set(codec, 0x6230, 0xfc0d4011); /* Disable Input OP */
3974 alc5505_coef_set(codec, 0x61b4, 0x040a2b03); /* Stop PLL2 */
3975 alc5505_coef_set(codec, 0x61b0, 0x00005b17); /* Stop PLL1 */
3976 alc5505_coef_set(codec, 0x61b8, 0x04133303); /* Stop PLL3 */
3977 val = alc5505_coef_get(codec, 0x6220);
3978 alc5505_coef_set(codec, 0x6220, (val | 0x3000)); /* switch Ringbuffer clock to DBUS clock */
3979}
3980
3981static void alc5505_dsp_back_from_halt(struct hda_codec *codec)
3982{
3983 alc5505_coef_set(codec, 0x61b8, 0x04133302);
3984 alc5505_coef_set(codec, 0x61b0, 0x00005b16);
3985 alc5505_coef_set(codec, 0x61b4, 0x040a2b02);
3986 alc5505_coef_set(codec, 0x6230, 0xf80d4011);
3987 alc5505_coef_set(codec, 0x6220, 0x2002010f);
3988 alc5505_coef_set(codec, 0x880c, 0x00000004);
3989}
3990
3991static void alc5505_dsp_init(struct hda_codec *codec)
3992{
3993 unsigned int val;
3994
3995 alc5505_dsp_halt(codec);
3996 alc5505_dsp_back_from_halt(codec);
3997 alc5505_coef_set(codec, 0x61b0, 0x5b14); /* PLL1 control */
3998 alc5505_coef_set(codec, 0x61b0, 0x5b16);
3999 alc5505_coef_set(codec, 0x61b4, 0x04132b00); /* PLL2 control */
4000 alc5505_coef_set(codec, 0x61b4, 0x04132b02);
4001 alc5505_coef_set(codec, 0x61b8, 0x041f3300); /* PLL3 control*/
4002 alc5505_coef_set(codec, 0x61b8, 0x041f3302);
4003 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_CODEC_RESET, 0); /* Function reset */
4004 alc5505_coef_set(codec, 0x61b8, 0x041b3302);
4005 alc5505_coef_set(codec, 0x61b8, 0x04173302);
4006 alc5505_coef_set(codec, 0x61b8, 0x04163302);
4007 alc5505_coef_set(codec, 0x8800, 0x348b328b); /* DRAM control */
4008 alc5505_coef_set(codec, 0x8808, 0x00020022); /* DRAM control */
4009 alc5505_coef_set(codec, 0x8818, 0x00000400); /* DRAM control */
4010
4011 val = alc5505_coef_get(codec, 0x6200) >> 16; /* Read revision ID */
4012 if (val <= 3)
4013 alc5505_coef_set(codec, 0x6220, 0x2002010f); /* I/O PAD Configuration */
4014 else
4015 alc5505_coef_set(codec, 0x6220, 0x6002018f);
4016
4017 alc5505_coef_set(codec, 0x61ac, 0x055525f0); /**/
4018 alc5505_coef_set(codec, 0x61c0, 0x12230080); /* Clock control */
4019 alc5505_coef_set(codec, 0x61b4, 0x040e2b02); /* PLL2 control */
4020 alc5505_coef_set(codec, 0x61bc, 0x010234f8); /* OSC Control */
4021 alc5505_coef_set(codec, 0x880c, 0x00000004); /* DRAM Function control */
4022 alc5505_coef_set(codec, 0x880c, 0x00000003);
4023 alc5505_coef_set(codec, 0x880c, 0x00000010);
cd63a5ff
TI
4024
4025#ifdef HALT_REALTEK_ALC5505
4026 alc5505_dsp_halt(codec);
4027#endif
ad60d502
KY
4028}
4029
cd63a5ff 4030#ifdef HALT_REALTEK_ALC5505
8a71821f
PLB
4031#define alc5505_dsp_suspend(codec) do { } while (0) /* NOP */
4032#define alc5505_dsp_resume(codec) do { } while (0) /* NOP */
cd63a5ff
TI
4033#else
4034#define alc5505_dsp_suspend(codec) alc5505_dsp_halt(codec)
4035#define alc5505_dsp_resume(codec) alc5505_dsp_back_from_halt(codec)
4036#endif
4037
ad60d502
KY
4038static int alc269_suspend(struct hda_codec *codec)
4039{
4040 struct alc_spec *spec = codec->spec;
4041
4042 if (spec->has_alc5505_dsp)
cd63a5ff 4043 alc5505_dsp_suspend(codec);
1873ebd3 4044
ad60d502
KY
4045 return alc_suspend(codec);
4046}
4047
1d045db9
TI
4048static int alc269_resume(struct hda_codec *codec)
4049{
adcc70b2
KY
4050 struct alc_spec *spec = codec->spec;
4051
1387e2d1
KY
4052 if (spec->codec_variant == ALC269_TYPE_ALC269VB)
4053 alc269vb_toggle_power_output(codec, 0);
4054 if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
adcc70b2 4055 (alc_get_coef0(codec) & 0x00ff) == 0x018) {
1d045db9
TI
4056 msleep(150);
4057 }
8c427226 4058
1d045db9 4059 codec->patch_ops.init(codec);
f1d4e28b 4060
1387e2d1
KY
4061 if (spec->codec_variant == ALC269_TYPE_ALC269VB)
4062 alc269vb_toggle_power_output(codec, 1);
4063 if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
adcc70b2 4064 (alc_get_coef0(codec) & 0x00ff) == 0x017) {
1d045db9
TI
4065 msleep(200);
4066 }
f1d4e28b 4067
1a462be5 4068 snd_hda_regmap_sync(codec);
1d045db9 4069 hda_call_check_power_status(codec, 0x01);
f475371a
HW
4070
4071 /* on some machine, the BIOS will clear the codec gpio data when enter
4072 * suspend, and won't restore the data after resume, so we restore it
4073 * in the driver.
4074 */
d261eec8
TI
4075 if (spec->gpio_data)
4076 alc_write_gpio_data(codec);
f475371a 4077
ad60d502 4078 if (spec->has_alc5505_dsp)
cd63a5ff 4079 alc5505_dsp_resume(codec);
c5177c86 4080
1d045db9
TI
4081 return 0;
4082}
f1d4e28b 4083
108cc108 4084static void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec,
1727a771 4085 const struct hda_fixup *fix, int action)
108cc108
DH
4086{
4087 struct alc_spec *spec = codec->spec;
4088
1727a771 4089 if (action == HDA_FIXUP_ACT_PRE_PROBE)
108cc108
DH
4090 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
4091}
4092
fdcc968a
JMG
4093static void alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec *codec,
4094 const struct hda_fixup *fix,
4095 int action)
4096{
4097 unsigned int cfg_headphone = snd_hda_codec_get_pincfg(codec, 0x21);
4098 unsigned int cfg_headset_mic = snd_hda_codec_get_pincfg(codec, 0x19);
4099
4100 if (cfg_headphone && cfg_headset_mic == 0x411111f0)
4101 snd_hda_codec_set_pincfg(codec, 0x19,
4102 (cfg_headphone & ~AC_DEFCFG_DEVICE) |
4103 (AC_JACK_MIC_IN << AC_DEFCFG_DEVICE_SHIFT));
4104}
4105
1d045db9 4106static void alc269_fixup_hweq(struct hda_codec *codec,
1727a771 4107 const struct hda_fixup *fix, int action)
1d045db9 4108{
98b24883
TI
4109 if (action == HDA_FIXUP_ACT_INIT)
4110 alc_update_coef_idx(codec, 0x1e, 0, 0x80);
1d045db9 4111}
f1d4e28b 4112
7c478f03
DH
4113static void alc269_fixup_headset_mic(struct hda_codec *codec,
4114 const struct hda_fixup *fix, int action)
4115{
4116 struct alc_spec *spec = codec->spec;
4117
4118 if (action == HDA_FIXUP_ACT_PRE_PROBE)
4119 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
4120}
4121
1d045db9 4122static void alc271_fixup_dmic(struct hda_codec *codec,
1727a771 4123 const struct hda_fixup *fix, int action)
1d045db9
TI
4124{
4125 static const struct hda_verb verbs[] = {
4126 {0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
4127 {0x20, AC_VERB_SET_PROC_COEF, 0x4000},
4128 {}
4129 };
4130 unsigned int cfg;
f1d4e28b 4131
7639a06c
TI
4132 if (strcmp(codec->core.chip_name, "ALC271X") &&
4133 strcmp(codec->core.chip_name, "ALC269VB"))
1d045db9
TI
4134 return;
4135 cfg = snd_hda_codec_get_pincfg(codec, 0x12);
4136 if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED)
4137 snd_hda_sequence_write(codec, verbs);
4138}
f1d4e28b 4139
c8426b27
TI
4140/* Fix the speaker amp after resume, etc */
4141static void alc269vb_fixup_aspire_e1_coef(struct hda_codec *codec,
4142 const struct hda_fixup *fix,
4143 int action)
4144{
4145 if (action == HDA_FIXUP_ACT_INIT)
4146 alc_update_coef_idx(codec, 0x0d, 0x6000, 0x6000);
4147}
4148
017f2a10 4149static void alc269_fixup_pcm_44k(struct hda_codec *codec,
1727a771 4150 const struct hda_fixup *fix, int action)
017f2a10
TI
4151{
4152 struct alc_spec *spec = codec->spec;
4153
1727a771 4154 if (action != HDA_FIXUP_ACT_PROBE)
017f2a10
TI
4155 return;
4156
4157 /* Due to a hardware problem on Lenovo Ideadpad, we need to
4158 * fix the sample rate of analog I/O to 44.1kHz
4159 */
08c189f2
TI
4160 spec->gen.stream_analog_playback = &alc269_44k_pcm_analog_playback;
4161 spec->gen.stream_analog_capture = &alc269_44k_pcm_analog_capture;
017f2a10
TI
4162}
4163
adabb3ec 4164static void alc269_fixup_stereo_dmic(struct hda_codec *codec,
1727a771 4165 const struct hda_fixup *fix, int action)
adabb3ec 4166{
adabb3ec
TI
4167 /* The digital-mic unit sends PDM (differential signal) instead of
4168 * the standard PCM, thus you can't record a valid mono stream as is.
4169 * Below is a workaround specific to ALC269 to control the dmic
4170 * signal source as mono.
4171 */
98b24883
TI
4172 if (action == HDA_FIXUP_ACT_INIT)
4173 alc_update_coef_idx(codec, 0x07, 0, 0x80);
adabb3ec
TI
4174}
4175
24519911
TI
4176static void alc269_quanta_automute(struct hda_codec *codec)
4177{
08c189f2 4178 snd_hda_gen_update_outputs(codec);
24519911 4179
1687ccc8
TI
4180 alc_write_coef_idx(codec, 0x0c, 0x680);
4181 alc_write_coef_idx(codec, 0x0c, 0x480);
24519911
TI
4182}
4183
4184static void alc269_fixup_quanta_mute(struct hda_codec *codec,
1727a771 4185 const struct hda_fixup *fix, int action)
24519911
TI
4186{
4187 struct alc_spec *spec = codec->spec;
1727a771 4188 if (action != HDA_FIXUP_ACT_PROBE)
24519911 4189 return;
08c189f2 4190 spec->gen.automute_hook = alc269_quanta_automute;
24519911
TI
4191}
4192
d240d1dc 4193static void alc269_x101_hp_automute_hook(struct hda_codec *codec,
1a4f69d5 4194 struct hda_jack_callback *jack)
d240d1dc
DH
4195{
4196 struct alc_spec *spec = codec->spec;
4197 int vref;
4198 msleep(200);
4199 snd_hda_gen_hp_automute(codec, jack);
4200
4201 vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
4202 msleep(100);
4203 snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4204 vref);
4205 msleep(500);
4206 snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4207 vref);
4208}
4209
a2ef03fe
TE
4210/*
4211 * Magic sequence to make Huawei Matebook X right speaker working (bko#197801)
4212 */
4213struct hda_alc298_mbxinit {
4214 unsigned char value_0x23;
4215 unsigned char value_0x25;
4216};
4217
4218static void alc298_huawei_mbx_stereo_seq(struct hda_codec *codec,
4219 const struct hda_alc298_mbxinit *initval,
4220 bool first)
4221{
4222 snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x0);
4223 alc_write_coef_idx(codec, 0x26, 0xb000);
4224
4225 if (first)
4226 snd_hda_codec_write(codec, 0x21, 0, AC_VERB_GET_PIN_SENSE, 0x0);
4227
4228 snd_hda_codec_write(codec, 0x6, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
4229 alc_write_coef_idx(codec, 0x26, 0xf000);
4230 alc_write_coef_idx(codec, 0x23, initval->value_0x23);
4231
4232 if (initval->value_0x23 != 0x1e)
4233 alc_write_coef_idx(codec, 0x25, initval->value_0x25);
4234
4235 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
4236 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
4237}
4238
4239static void alc298_fixup_huawei_mbx_stereo(struct hda_codec *codec,
4240 const struct hda_fixup *fix,
4241 int action)
4242{
4243 /* Initialization magic */
4244 static const struct hda_alc298_mbxinit dac_init[] = {
4245 {0x0c, 0x00}, {0x0d, 0x00}, {0x0e, 0x00}, {0x0f, 0x00},
4246 {0x10, 0x00}, {0x1a, 0x40}, {0x1b, 0x82}, {0x1c, 0x00},
4247 {0x1d, 0x00}, {0x1e, 0x00}, {0x1f, 0x00},
4248 {0x20, 0xc2}, {0x21, 0xc8}, {0x22, 0x26}, {0x23, 0x24},
4249 {0x27, 0xff}, {0x28, 0xff}, {0x29, 0xff}, {0x2a, 0x8f},
4250 {0x2b, 0x02}, {0x2c, 0x48}, {0x2d, 0x34}, {0x2e, 0x00},
4251 {0x2f, 0x00},
4252 {0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00},
4253 {0x34, 0x00}, {0x35, 0x01}, {0x36, 0x93}, {0x37, 0x0c},
4254 {0x38, 0x00}, {0x39, 0x00}, {0x3a, 0xf8}, {0x38, 0x80},
4255 {}
4256 };
4257 const struct hda_alc298_mbxinit *seq;
4258
4259 if (action != HDA_FIXUP_ACT_INIT)
4260 return;
4261
4262 /* Start */
4263 snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x00);
4264 snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
4265 alc_write_coef_idx(codec, 0x26, 0xf000);
4266 alc_write_coef_idx(codec, 0x22, 0x31);
4267 alc_write_coef_idx(codec, 0x23, 0x0b);
4268 alc_write_coef_idx(codec, 0x25, 0x00);
4269 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
4270 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
4271
4272 for (seq = dac_init; seq->value_0x23; seq++)
4273 alc298_huawei_mbx_stereo_seq(codec, seq, seq == dac_init);
4274}
4275
d240d1dc
DH
4276static void alc269_fixup_x101_headset_mic(struct hda_codec *codec,
4277 const struct hda_fixup *fix, int action)
4278{
4279 struct alc_spec *spec = codec->spec;
4280 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4281 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
4282 spec->gen.hp_automute_hook = alc269_x101_hp_automute_hook;
4283 }
4284}
4285
766538ac
TI
4286static void alc_update_vref_led(struct hda_codec *codec, hda_nid_t pin,
4287 bool polarity, bool on)
4288{
4289 unsigned int pinval;
4290
4291 if (!pin)
4292 return;
4293 if (polarity)
4294 on = !on;
4295 pinval = snd_hda_codec_get_pin_target(codec, pin);
4296 pinval &= ~AC_PINCTL_VREFEN;
4297 pinval |= on ? AC_PINCTL_VREF_80 : AC_PINCTL_VREF_HIZ;
4298 /* temporarily power up/down for setting VREF */
4299 snd_hda_power_up_pm(codec);
4300 snd_hda_set_pin_ctl_cache(codec, pin, pinval);
4301 snd_hda_power_down_pm(codec);
4302}
d240d1dc 4303
08fb0d0e 4304/* update mute-LED according to the speaker mute state via mic VREF pin */
8d3d1ece
TI
4305static int vref_mute_led_set(struct led_classdev *led_cdev,
4306 enum led_brightness brightness)
6d3cd5d4 4307{
8d3d1ece 4308 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
08fb0d0e 4309 struct alc_spec *spec = codec->spec;
08fb0d0e 4310
766538ac
TI
4311 alc_update_vref_led(codec, spec->mute_led_nid,
4312 spec->mute_led_polarity, brightness);
8d3d1ece 4313 return 0;
6d3cd5d4
DH
4314}
4315
d5b6b65e
DH
4316/* Make sure the led works even in runtime suspend */
4317static unsigned int led_power_filter(struct hda_codec *codec,
4318 hda_nid_t nid,
4319 unsigned int power_state)
4320{
4321 struct alc_spec *spec = codec->spec;
4322
50dd9050
HW
4323 if (power_state != AC_PWRST_D3 || nid == 0 ||
4324 (nid != spec->mute_led_nid && nid != spec->cap_mute_led_nid))
d5b6b65e
DH
4325 return power_state;
4326
4327 /* Set pin ctl again, it might have just been set to 0 */
4328 snd_hda_set_pin_ctl(codec, nid,
4329 snd_hda_codec_get_pin_target(codec, nid));
4330
cffd3966 4331 return snd_hda_gen_path_power_filter(codec, nid, power_state);
d5b6b65e
DH
4332}
4333
08fb0d0e
TI
4334static void alc269_fixup_hp_mute_led(struct hda_codec *codec,
4335 const struct hda_fixup *fix, int action)
6d3cd5d4
DH
4336{
4337 struct alc_spec *spec = codec->spec;
08fb0d0e
TI
4338 const struct dmi_device *dev = NULL;
4339
4340 if (action != HDA_FIXUP_ACT_PRE_PROBE)
4341 return;
4342
4343 while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) {
4344 int pol, pin;
4345 if (sscanf(dev->name, "HP_Mute_LED_%d_%x", &pol, &pin) != 2)
4346 continue;
4347 if (pin < 0x0a || pin >= 0x10)
4348 break;
4349 spec->mute_led_polarity = pol;
4350 spec->mute_led_nid = pin - 0x0a + 0x18;
8d3d1ece 4351 snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
d5b6b65e 4352 codec->power_filter = led_power_filter;
4e76a883
TI
4353 codec_dbg(codec,
4354 "Detected mute LED for %x:%d\n", spec->mute_led_nid,
08fb0d0e 4355 spec->mute_led_polarity);
6d3cd5d4
DH
4356 break;
4357 }
4358}
4359
85c467dc
TI
4360static void alc269_fixup_hp_mute_led_micx(struct hda_codec *codec,
4361 const struct hda_fixup *fix,
4362 int action, hda_nid_t pin)
d06ac143
DH
4363{
4364 struct alc_spec *spec = codec->spec;
85c467dc 4365
d06ac143
DH
4366 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4367 spec->mute_led_polarity = 0;
85c467dc 4368 spec->mute_led_nid = pin;
8d3d1ece 4369 snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
d5b6b65e 4370 codec->power_filter = led_power_filter;
d06ac143
DH
4371 }
4372}
4373
85c467dc
TI
4374static void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec,
4375 const struct hda_fixup *fix, int action)
4376{
4377 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x18);
4378}
4379
08fb0d0e
TI
4380static void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec,
4381 const struct hda_fixup *fix, int action)
420b0feb 4382{
85c467dc 4383 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x19);
420b0feb
TI
4384}
4385
7f783bd5
TB
4386static void alc269_fixup_hp_mute_led_mic3(struct hda_codec *codec,
4387 const struct hda_fixup *fix, int action)
4388{
85c467dc 4389 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1b);
7f783bd5
TB
4390}
4391
0f32fd19
TI
4392/* update LED status via GPIO */
4393static void alc_update_gpio_led(struct hda_codec *codec, unsigned int mask,
dbd13179 4394 int polarity, bool enabled)
9f5c6faf 4395{
dbd13179 4396 if (polarity)
0f32fd19 4397 enabled = !enabled;
d261eec8 4398 alc_update_gpio_data(codec, mask, !enabled); /* muted -> LED on */
9f5c6faf
TI
4399}
4400
0f32fd19 4401/* turn on/off mute LED via GPIO per vmaster hook */
8d3d1ece
TI
4402static int gpio_mute_led_set(struct led_classdev *led_cdev,
4403 enum led_brightness brightness)
9f5c6faf 4404{
8d3d1ece 4405 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
9f5c6faf 4406 struct alc_spec *spec = codec->spec;
9f5c6faf 4407
dbd13179 4408 alc_update_gpio_led(codec, spec->gpio_mute_led_mask,
8d3d1ece
TI
4409 spec->mute_led_polarity, !brightness);
4410 return 0;
0f32fd19 4411}
9f5c6faf 4412
0f32fd19 4413/* turn on/off mic-mute LED via GPIO per capture hook */
87dc3648
KHF
4414static int micmute_led_set(struct led_classdev *led_cdev,
4415 enum led_brightness brightness)
4416{
4417 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4418 struct alc_spec *spec = codec->spec;
4419
4420 alc_update_gpio_led(codec, spec->gpio_mic_led_mask,
40469064 4421 spec->micmute_led_polarity, !brightness);
87dc3648
KHF
4422 return 0;
4423}
4424
01e4a275
TI
4425/* setup mute and mic-mute GPIO bits, add hooks appropriately */
4426static void alc_fixup_hp_gpio_led(struct hda_codec *codec,
4427 int action,
4428 unsigned int mute_mask,
4429 unsigned int micmute_mask)
9f5c6faf
TI
4430{
4431 struct alc_spec *spec = codec->spec;
9f5c6faf 4432
01e4a275
TI
4433 alc_fixup_gpio(codec, action, mute_mask | micmute_mask);
4434
4435 if (action != HDA_FIXUP_ACT_PRE_PROBE)
4436 return;
4437 if (mute_mask) {
4438 spec->gpio_mute_led_mask = mute_mask;
8d3d1ece 4439 snd_hda_gen_add_mute_led_cdev(codec, gpio_mute_led_set);
01e4a275
TI
4440 }
4441 if (micmute_mask) {
4442 spec->gpio_mic_led_mask = micmute_mask;
7cdf8c49 4443 snd_hda_gen_add_micmute_led_cdev(codec, micmute_led_set);
9f5c6faf
TI
4444 }
4445}
4446
e7d66cf7
JS
4447static void alc236_fixup_hp_gpio_led(struct hda_codec *codec,
4448 const struct hda_fixup *fix, int action)
4449{
4450 alc_fixup_hp_gpio_led(codec, action, 0x02, 0x01);
4451}
4452
01e4a275 4453static void alc269_fixup_hp_gpio_led(struct hda_codec *codec,
eaa8e5ef
KY
4454 const struct hda_fixup *fix, int action)
4455{
01e4a275
TI
4456 alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
4457}
eaa8e5ef 4458
f5a88b0a
KHF
4459static void alc285_fixup_hp_gpio_led(struct hda_codec *codec,
4460 const struct hda_fixup *fix, int action)
4461{
3e0650ab 4462 alc_fixup_hp_gpio_led(codec, action, 0x04, 0x01);
f5a88b0a
KHF
4463}
4464
01e4a275
TI
4465static void alc286_fixup_hp_gpio_led(struct hda_codec *codec,
4466 const struct hda_fixup *fix, int action)
4467{
4468 alc_fixup_hp_gpio_led(codec, action, 0x02, 0x20);
9f5c6faf
TI
4469}
4470
a0ccbc53
KY
4471static void alc287_fixup_hp_gpio_led(struct hda_codec *codec,
4472 const struct hda_fixup *fix, int action)
4473{
4474 alc_fixup_hp_gpio_led(codec, action, 0x10, 0);
4475}
4476
5fc462c3
JC
4477static void alc245_fixup_hp_gpio_led(struct hda_codec *codec,
4478 const struct hda_fixup *fix, int action)
4479{
4480 struct alc_spec *spec = codec->spec;
4481
4482 if (action == HDA_FIXUP_ACT_PRE_PROBE)
4483 spec->micmute_led_polarity = 1;
4484 alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
4485}
4486
8a503555
TI
4487/* turn on/off mic-mute LED per capture hook via VREF change */
4488static int vref_micmute_led_set(struct led_classdev *led_cdev,
4489 enum led_brightness brightness)
9c5dc3bf 4490{
8a503555 4491 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
9c5dc3bf 4492 struct alc_spec *spec = codec->spec;
9c5dc3bf 4493
766538ac
TI
4494 alc_update_vref_led(codec, spec->cap_mute_led_nid,
4495 spec->micmute_led_polarity, brightness);
8a503555 4496 return 0;
9c5dc3bf
KY
4497}
4498
4499static void alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec,
4500 const struct hda_fixup *fix, int action)
4501{
4502 struct alc_spec *spec = codec->spec;
9c5dc3bf 4503
01e4a275 4504 alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
9c5dc3bf 4505 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
01e4a275
TI
4506 /* Like hp_gpio_mic1_led, but also needs GPIO4 low to
4507 * enable headphone amp
4508 */
4509 spec->gpio_mask |= 0x10;
4510 spec->gpio_dir |= 0x10;
9c5dc3bf 4511 spec->cap_mute_led_nid = 0x18;
8a503555 4512 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
50dd9050 4513 codec->power_filter = led_power_filter;
9c5dc3bf
KY
4514 }
4515}
4516
7a5255f1
DH
4517static void alc280_fixup_hp_gpio4(struct hda_codec *codec,
4518 const struct hda_fixup *fix, int action)
4519{
7a5255f1 4520 struct alc_spec *spec = codec->spec;
7a5255f1 4521
01e4a275 4522 alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
7a5255f1 4523 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
7a5255f1 4524 spec->cap_mute_led_nid = 0x18;
8a503555 4525 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
7a5255f1
DH
4526 codec->power_filter = led_power_filter;
4527 }
4528}
4529
c3bb2b52
TI
4530/* HP Spectre x360 14 model needs a unique workaround for enabling the amp;
4531 * it needs to toggle the GPIO0 once on and off at each time (bko#210633)
4532 */
4533static void alc245_fixup_hp_x360_amp(struct hda_codec *codec,
4534 const struct hda_fixup *fix, int action)
4535{
4536 struct alc_spec *spec = codec->spec;
4537
4538 switch (action) {
4539 case HDA_FIXUP_ACT_PRE_PROBE:
4540 spec->gpio_mask |= 0x01;
4541 spec->gpio_dir |= 0x01;
4542 break;
4543 case HDA_FIXUP_ACT_INIT:
4544 /* need to toggle GPIO to enable the amp */
4545 alc_update_gpio_data(codec, 0x01, true);
4546 msleep(100);
4547 alc_update_gpio_data(codec, 0x01, false);
4548 break;
4549 }
4550}
4551
622464c8
TI
4552/* toggle GPIO2 at each time stream is started; we use PREPARE state instead */
4553static void alc274_hp_envy_pcm_hook(struct hda_pcm_stream *hinfo,
4554 struct hda_codec *codec,
4555 struct snd_pcm_substream *substream,
4556 int action)
4557{
4558 switch (action) {
4559 case HDA_GEN_PCM_ACT_PREPARE:
4560 alc_update_gpio_data(codec, 0x04, true);
4561 break;
4562 case HDA_GEN_PCM_ACT_CLEANUP:
4563 alc_update_gpio_data(codec, 0x04, false);
4564 break;
4565 }
4566}
4567
4568static void alc274_fixup_hp_envy_gpio(struct hda_codec *codec,
4569 const struct hda_fixup *fix,
4570 int action)
4571{
4572 struct alc_spec *spec = codec->spec;
4573
4574 if (action == HDA_FIXUP_ACT_PROBE) {
4575 spec->gpio_mask |= 0x04;
4576 spec->gpio_dir |= 0x04;
4577 spec->gen.pcm_playback_hook = alc274_hp_envy_pcm_hook;
4578 }
4579}
4580
766538ac
TI
4581static void alc_update_coef_led(struct hda_codec *codec,
4582 struct alc_coef_led *led,
4583 bool polarity, bool on)
4584{
4585 if (polarity)
4586 on = !on;
4587 /* temporarily power up/down for setting COEF bit */
4588 alc_update_coef_idx(codec, led->idx, led->mask,
4589 on ? led->on : led->off);
4590}
4591
431e76c3 4592/* update mute-LED according to the speaker mute state via COEF bit */
8d3d1ece
TI
4593static int coef_mute_led_set(struct led_classdev *led_cdev,
4594 enum led_brightness brightness)
431e76c3 4595{
8d3d1ece 4596 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
431e76c3
KY
4597 struct alc_spec *spec = codec->spec;
4598
766538ac
TI
4599 alc_update_coef_led(codec, &spec->mute_led_coef,
4600 spec->mute_led_polarity, brightness);
8d3d1ece 4601 return 0;
431e76c3
KY
4602}
4603
4604static void alc285_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4605 const struct hda_fixup *fix,
4606 int action)
4607{
4608 struct alc_spec *spec = codec->spec;
4609
4610 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4611 spec->mute_led_polarity = 0;
766538ac
TI
4612 spec->mute_led_coef.idx = 0x0b;
4613 spec->mute_led_coef.mask = 1 << 3;
4614 spec->mute_led_coef.on = 1 << 3;
4615 spec->mute_led_coef.off = 0;
8d3d1ece 4616 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
431e76c3
KY
4617 }
4618}
4619
24164f43
KY
4620static void alc236_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4621 const struct hda_fixup *fix,
4622 int action)
4623{
4624 struct alc_spec *spec = codec->spec;
4625
4626 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4627 spec->mute_led_polarity = 0;
766538ac
TI
4628 spec->mute_led_coef.idx = 0x34;
4629 spec->mute_led_coef.mask = 1 << 5;
4630 spec->mute_led_coef.on = 0;
4631 spec->mute_led_coef.off = 1 << 5;
8d3d1ece 4632 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
24164f43
KY
4633 }
4634}
4635
0659400f
LG
4636static void alc236_fixup_hp_mute_led_coefbit2(struct hda_codec *codec,
4637 const struct hda_fixup *fix, int action)
4638{
4639 struct alc_spec *spec = codec->spec;
4640
4641 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4642 spec->mute_led_polarity = 0;
4643 spec->mute_led_coef.idx = 0x07;
4644 spec->mute_led_coef.mask = 1;
4645 spec->mute_led_coef.on = 1;
4646 spec->mute_led_coef.off = 0;
4647 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4648 }
4649}
4650
93dc18e1
SJ
4651static void alc245_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4652 const struct hda_fixup *fix,
4653 int action)
4654{
4655 struct alc_spec *spec = codec->spec;
4656
4657 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4658 spec->mute_led_polarity = 0;
4659 spec->mute_led_coef.idx = 0x0b;
4660 spec->mute_led_coef.mask = 3 << 2;
4661 spec->mute_led_coef.on = 2 << 2;
4662 spec->mute_led_coef.off = 1 << 2;
4663 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4664 }
4665}
4666
431e76c3 4667/* turn on/off mic-mute LED per capture hook by coef bit */
8a503555
TI
4668static int coef_micmute_led_set(struct led_classdev *led_cdev,
4669 enum led_brightness brightness)
431e76c3 4670{
8a503555 4671 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
431e76c3
KY
4672 struct alc_spec *spec = codec->spec;
4673
766538ac
TI
4674 alc_update_coef_led(codec, &spec->mic_led_coef,
4675 spec->micmute_led_polarity, brightness);
8a503555 4676 return 0;
431e76c3
KY
4677}
4678
4679static void alc285_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4680 const struct hda_fixup *fix, int action)
4681{
4682 struct alc_spec *spec = codec->spec;
4683
4684 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
766538ac
TI
4685 spec->mic_led_coef.idx = 0x19;
4686 spec->mic_led_coef.mask = 1 << 13;
4687 spec->mic_led_coef.on = 1 << 13;
4688 spec->mic_led_coef.off = 0;
8a503555 4689 snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
431e76c3
KY
4690 }
4691}
4692
ca88eeb3
LG
4693static void alc285_fixup_hp_gpio_micmute_led(struct hda_codec *codec,
4694 const struct hda_fixup *fix, int action)
4695{
4696 struct alc_spec *spec = codec->spec;
4697
4698 if (action == HDA_FIXUP_ACT_PRE_PROBE)
4699 spec->micmute_led_polarity = 1;
4700 alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
4701}
4702
24164f43
KY
4703static void alc236_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4704 const struct hda_fixup *fix, int action)
4705{
4706 struct alc_spec *spec = codec->spec;
4707
4708 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
766538ac
TI
4709 spec->mic_led_coef.idx = 0x35;
4710 spec->mic_led_coef.mask = 3 << 2;
4711 spec->mic_led_coef.on = 2 << 2;
4712 spec->mic_led_coef.off = 1 << 2;
8a503555 4713 snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
24164f43
KY
4714 }
4715}
4716
431e76c3
KY
4717static void alc285_fixup_hp_mute_led(struct hda_codec *codec,
4718 const struct hda_fixup *fix, int action)
4719{
4720 alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
4721 alc285_fixup_hp_coef_micmute_led(codec, fix, action);
4722}
4723
ca88eeb3
LG
4724static void alc285_fixup_hp_spectre_x360_mute_led(struct hda_codec *codec,
4725 const struct hda_fixup *fix, int action)
4726{
4727 alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
4728 alc285_fixup_hp_gpio_micmute_led(codec, fix, action);
4729}
4730
24164f43
KY
4731static void alc236_fixup_hp_mute_led(struct hda_codec *codec,
4732 const struct hda_fixup *fix, int action)
4733{
4734 alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
4735 alc236_fixup_hp_coef_micmute_led(codec, fix, action);
4736}
4737
75b62ab6
JW
4738static void alc236_fixup_hp_micmute_led_vref(struct hda_codec *codec,
4739 const struct hda_fixup *fix, int action)
4740{
4741 struct alc_spec *spec = codec->spec;
4742
4743 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4744 spec->cap_mute_led_nid = 0x1a;
4745 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4746 codec->power_filter = led_power_filter;
4747 }
4748}
4749
4750static void alc236_fixup_hp_mute_led_micmute_vref(struct hda_codec *codec,
4751 const struct hda_fixup *fix, int action)
4752{
4753 alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
4754 alc236_fixup_hp_micmute_led_vref(codec, fix, action);
4755}
4756
a2d57ebe
KM
4757static inline void alc298_samsung_write_coef_pack(struct hda_codec *codec,
4758 const unsigned short coefs[2])
4759{
4760 alc_write_coef_idx(codec, 0x23, coefs[0]);
4761 alc_write_coef_idx(codec, 0x25, coefs[1]);
4762 alc_write_coef_idx(codec, 0x26, 0xb011);
4763}
4764
4765struct alc298_samsung_amp_desc {
4766 unsigned char nid;
4767 unsigned short init_seq[2][2];
4768};
4769
4770static void alc298_fixup_samsung_amp(struct hda_codec *codec,
4771 const struct hda_fixup *fix, int action)
4772{
4773 int i, j;
4774 static const unsigned short init_seq[][2] = {
4775 { 0x19, 0x00 }, { 0x20, 0xc0 }, { 0x22, 0x44 }, { 0x23, 0x08 },
4776 { 0x24, 0x85 }, { 0x25, 0x41 }, { 0x35, 0x40 }, { 0x36, 0x01 },
4777 { 0x38, 0x81 }, { 0x3a, 0x03 }, { 0x3b, 0x81 }, { 0x40, 0x3e },
4778 { 0x41, 0x07 }, { 0x400, 0x1 }
4779 };
4780 static const struct alc298_samsung_amp_desc amps[] = {
4781 { 0x3a, { { 0x18, 0x1 }, { 0x26, 0x0 } } },
4782 { 0x39, { { 0x18, 0x2 }, { 0x26, 0x1 } } }
4783 };
4784
4785 if (action != HDA_FIXUP_ACT_INIT)
4786 return;
4787
4788 for (i = 0; i < ARRAY_SIZE(amps); i++) {
4789 alc_write_coef_idx(codec, 0x22, amps[i].nid);
4790
4791 for (j = 0; j < ARRAY_SIZE(amps[i].init_seq); j++)
4792 alc298_samsung_write_coef_pack(codec, amps[i].init_seq[j]);
4793
4794 for (j = 0; j < ARRAY_SIZE(init_seq); j++)
4795 alc298_samsung_write_coef_pack(codec, init_seq[j]);
4796 }
4797}
4798
6a30abaa 4799#if IS_REACHABLE(CONFIG_INPUT)
33f4acd3
DH
4800static void gpio2_mic_hotkey_event(struct hda_codec *codec,
4801 struct hda_jack_callback *event)
4802{
4803 struct alc_spec *spec = codec->spec;
4804
4805 /* GPIO2 just toggles on a keypress/keyrelease cycle. Therefore
4806 send both key on and key off event for every interrupt. */
c7b60a89 4807 input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 1);
33f4acd3 4808 input_sync(spec->kb_dev);
c7b60a89 4809 input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 0);
33f4acd3
DH
4810 input_sync(spec->kb_dev);
4811}
33f4acd3 4812
3694cb29
K
4813static int alc_register_micmute_input_device(struct hda_codec *codec)
4814{
4815 struct alc_spec *spec = codec->spec;
c7b60a89 4816 int i;
3694cb29
K
4817
4818 spec->kb_dev = input_allocate_device();
4819 if (!spec->kb_dev) {
4820 codec_err(codec, "Out of memory (input_allocate_device)\n");
4821 return -ENOMEM;
4822 }
c7b60a89
HW
4823
4824 spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX] = KEY_MICMUTE;
4825
3694cb29
K
4826 spec->kb_dev->name = "Microphone Mute Button";
4827 spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY);
c7b60a89
HW
4828 spec->kb_dev->keycodesize = sizeof(spec->alc_mute_keycode_map[0]);
4829 spec->kb_dev->keycodemax = ARRAY_SIZE(spec->alc_mute_keycode_map);
4830 spec->kb_dev->keycode = spec->alc_mute_keycode_map;
4831 for (i = 0; i < ARRAY_SIZE(spec->alc_mute_keycode_map); i++)
4832 set_bit(spec->alc_mute_keycode_map[i], spec->kb_dev->keybit);
3694cb29
K
4833
4834 if (input_register_device(spec->kb_dev)) {
4835 codec_err(codec, "input_register_device failed\n");
4836 input_free_device(spec->kb_dev);
4837 spec->kb_dev = NULL;
4838 return -ENOMEM;
4839 }
4840
4841 return 0;
4842}
4843
01e4a275
TI
4844/* GPIO1 = set according to SKU external amp
4845 * GPIO2 = mic mute hotkey
4846 * GPIO3 = mute LED
4847 * GPIO4 = mic mute LED
4848 */
33f4acd3
DH
4849static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec,
4850 const struct hda_fixup *fix, int action)
4851{
33f4acd3
DH
4852 struct alc_spec *spec = codec->spec;
4853
01e4a275 4854 alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
33f4acd3 4855 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1c76aa5f 4856 spec->init_amp = ALC_INIT_DEFAULT;
3694cb29 4857 if (alc_register_micmute_input_device(codec) != 0)
33f4acd3 4858 return;
33f4acd3 4859
01e4a275
TI
4860 spec->gpio_mask |= 0x06;
4861 spec->gpio_dir |= 0x02;
4862 spec->gpio_data |= 0x02;
7639a06c 4863 snd_hda_codec_write_cache(codec, codec->core.afg, 0,
33f4acd3 4864 AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x04);
7639a06c 4865 snd_hda_jack_detect_enable_callback(codec, codec->core.afg,
33f4acd3 4866 gpio2_mic_hotkey_event);
33f4acd3
DH
4867 return;
4868 }
4869
4870 if (!spec->kb_dev)
4871 return;
4872
4873 switch (action) {
33f4acd3
DH
4874 case HDA_FIXUP_ACT_FREE:
4875 input_unregister_device(spec->kb_dev);
33f4acd3
DH
4876 spec->kb_dev = NULL;
4877 }
33f4acd3
DH
4878}
4879
01e4a275
TI
4880/* Line2 = mic mute hotkey
4881 * GPIO2 = mic mute LED
4882 */
3694cb29
K
4883static void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec,
4884 const struct hda_fixup *fix, int action)
4885{
3694cb29
K
4886 struct alc_spec *spec = codec->spec;
4887
01e4a275 4888 alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
3694cb29 4889 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1c76aa5f 4890 spec->init_amp = ALC_INIT_DEFAULT;
3694cb29
K
4891 if (alc_register_micmute_input_device(codec) != 0)
4892 return;
4893
3694cb29
K
4894 snd_hda_jack_detect_enable_callback(codec, 0x1b,
4895 gpio2_mic_hotkey_event);
3694cb29
K
4896 return;
4897 }
4898
4899 if (!spec->kb_dev)
4900 return;
4901
4902 switch (action) {
3694cb29
K
4903 case HDA_FIXUP_ACT_FREE:
4904 input_unregister_device(spec->kb_dev);
4905 spec->kb_dev = NULL;
4906 }
4907}
c469652b
TI
4908#else /* INPUT */
4909#define alc280_fixup_hp_gpio2_mic_hotkey NULL
4910#define alc233_fixup_lenovo_line2_mic_hotkey NULL
4911#endif /* INPUT */
3694cb29 4912
9c5dc3bf
KY
4913static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec,
4914 const struct hda_fixup *fix, int action)
4915{
4916 struct alc_spec *spec = codec->spec;
4917
1bce62a6 4918 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1a);
9c5dc3bf 4919 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
9c5dc3bf 4920 spec->cap_mute_led_nid = 0x18;
8a503555 4921 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
9c5dc3bf
KY
4922 }
4923}
4924
6b0f95c4 4925static const struct coef_fw alc225_pre_hsmode[] = {
5a36767a
KY
4926 UPDATE_COEF(0x4a, 1<<8, 0),
4927 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0),
4928 UPDATE_COEF(0x63, 3<<14, 3<<14),
4929 UPDATE_COEF(0x4a, 3<<4, 2<<4),
4930 UPDATE_COEF(0x4a, 3<<10, 3<<10),
4931 UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10),
4932 UPDATE_COEF(0x4a, 3<<10, 0),
4933 {}
4934};
4935
73bdd597
DH
4936static void alc_headset_mode_unplugged(struct hda_codec *codec)
4937{
92666d45 4938 struct alc_spec *spec = codec->spec;
6b0f95c4 4939 static const struct coef_fw coef0255[] = {
717f43d8 4940 WRITE_COEF(0x1b, 0x0c0b), /* LDO and MISC control */
54db6c39
TI
4941 WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
4942 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
4943 WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
4944 WRITE_COEFEX(0x57, 0x03, 0x8aa6), /* Direct Drive HP Amp control */
4945 {}
4946 };
6b0f95c4 4947 static const struct coef_fw coef0256[] = {
e69e7e03 4948 WRITE_COEF(0x1b, 0x0c4b), /* LDO and MISC control */
717f43d8
KY
4949 WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
4950 WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
4951 WRITE_COEFEX(0x57, 0x03, 0x09a3), /* Direct Drive HP Amp control */
4952 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
e69e7e03
KY
4953 {}
4954 };
6b0f95c4 4955 static const struct coef_fw coef0233[] = {
54db6c39
TI
4956 WRITE_COEF(0x1b, 0x0c0b),
4957 WRITE_COEF(0x45, 0xc429),
4958 UPDATE_COEF(0x35, 0x4000, 0),
4959 WRITE_COEF(0x06, 0x2104),
4960 WRITE_COEF(0x1a, 0x0001),
4961 WRITE_COEF(0x26, 0x0004),
4962 WRITE_COEF(0x32, 0x42a3),
4963 {}
4964 };
6b0f95c4 4965 static const struct coef_fw coef0288[] = {
f3b70332
KY
4966 UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
4967 UPDATE_COEF(0x50, 0x2000, 0x2000),
4968 UPDATE_COEF(0x56, 0x0006, 0x0006),
4969 UPDATE_COEF(0x66, 0x0008, 0),
4970 UPDATE_COEF(0x67, 0x2000, 0),
4971 {}
4972 };
6b0f95c4 4973 static const struct coef_fw coef0298[] = {
89542936
KY
4974 UPDATE_COEF(0x19, 0x1300, 0x0300),
4975 {}
4976 };
6b0f95c4 4977 static const struct coef_fw coef0292[] = {
54db6c39
TI
4978 WRITE_COEF(0x76, 0x000e),
4979 WRITE_COEF(0x6c, 0x2400),
4980 WRITE_COEF(0x18, 0x7308),
4981 WRITE_COEF(0x6b, 0xc429),
4982 {}
4983 };
6b0f95c4 4984 static const struct coef_fw coef0293[] = {
54db6c39
TI
4985 UPDATE_COEF(0x10, 7<<8, 6<<8), /* SET Line1 JD to 0 */
4986 UPDATE_COEFEX(0x57, 0x05, 1<<15|1<<13, 0x0), /* SET charge pump by verb */
4987 UPDATE_COEFEX(0x57, 0x03, 1<<10, 1<<10), /* SET EN_OSW to 1 */
4988 UPDATE_COEF(0x1a, 1<<3, 1<<3), /* Combo JD gating with LINE1-VREFO */
4989 WRITE_COEF(0x45, 0xc429), /* Set to TRS type */
4990 UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
4991 {}
4992 };
6b0f95c4 4993 static const struct coef_fw coef0668[] = {
54db6c39
TI
4994 WRITE_COEF(0x15, 0x0d40),
4995 WRITE_COEF(0xb7, 0x802b),
4996 {}
4997 };
6b0f95c4 4998 static const struct coef_fw coef0225[] = {
5a36767a 4999 UPDATE_COEF(0x63, 3<<14, 0),
4cc9b9d6
KY
5000 {}
5001 };
6b0f95c4 5002 static const struct coef_fw coef0274[] = {
71683c32
KY
5003 UPDATE_COEF(0x4a, 0x0100, 0),
5004 UPDATE_COEFEX(0x57, 0x05, 0x4000, 0),
5005 UPDATE_COEF(0x6b, 0xf000, 0x5000),
5006 UPDATE_COEF(0x4a, 0x0010, 0),
5007 UPDATE_COEF(0x4a, 0x0c00, 0x0c00),
5008 WRITE_COEF(0x45, 0x5289),
5009 UPDATE_COEF(0x4a, 0x0c00, 0),
5010 {}
5011 };
54db6c39 5012
92666d45
KY
5013 if (spec->no_internal_mic_pin) {
5014 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
5015 return;
5016 }
5017
7639a06c 5018 switch (codec->core.vendor_id) {
9a22a8f5 5019 case 0x10ec0255:
e69e7e03
KY
5020 alc_process_coef_fw(codec, coef0255);
5021 break;
1948fc06 5022 case 0x10ec0230:
736f20a7 5023 case 0x10ec0236:
7081adf3 5024 case 0x10ec0256:
527f4643 5025 case 0x19e58326:
e69e7e03 5026 alc_process_coef_fw(codec, coef0256);
9a22a8f5 5027 break;
71683c32
KY
5028 case 0x10ec0234:
5029 case 0x10ec0274:
5030 case 0x10ec0294:
5031 alc_process_coef_fw(codec, coef0274);
5032 break;
13fd08a3 5033 case 0x10ec0233:
73bdd597 5034 case 0x10ec0283:
54db6c39 5035 alc_process_coef_fw(codec, coef0233);
73bdd597 5036 break;
f3b70332
KY
5037 case 0x10ec0286:
5038 case 0x10ec0288:
89542936
KY
5039 alc_process_coef_fw(codec, coef0288);
5040 break;
1a5bc8d9 5041 case 0x10ec0298:
89542936 5042 alc_process_coef_fw(codec, coef0298);
f3b70332
KY
5043 alc_process_coef_fw(codec, coef0288);
5044 break;
73bdd597 5045 case 0x10ec0292:
54db6c39 5046 alc_process_coef_fw(codec, coef0292);
73bdd597 5047 break;
a22aa26f 5048 case 0x10ec0293:
54db6c39 5049 alc_process_coef_fw(codec, coef0293);
a22aa26f 5050 break;
73bdd597 5051 case 0x10ec0668:
54db6c39 5052 alc_process_coef_fw(codec, coef0668);
73bdd597 5053 break;
c2b691ee 5054 case 0x10ec0215:
4cc9b9d6 5055 case 0x10ec0225:
c2b691ee 5056 case 0x10ec0285:
7d727869 5057 case 0x10ec0295:
c2b691ee 5058 case 0x10ec0289:
28f1f9b2 5059 case 0x10ec0299:
4d4b0c52 5060 alc_process_coef_fw(codec, alc225_pre_hsmode);
4cc9b9d6
KY
5061 alc_process_coef_fw(codec, coef0225);
5062 break;
78f4f7c2
KY
5063 case 0x10ec0867:
5064 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5065 break;
73bdd597 5066 }
4e76a883 5067 codec_dbg(codec, "Headset jack set to unplugged mode.\n");
73bdd597
DH
5068}
5069
5070
5071static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
5072 hda_nid_t mic_pin)
5073{
6b0f95c4 5074 static const struct coef_fw coef0255[] = {
54db6c39
TI
5075 WRITE_COEFEX(0x57, 0x03, 0x8aa6),
5076 WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
5077 {}
5078 };
6b0f95c4 5079 static const struct coef_fw coef0256[] = {
717f43d8
KY
5080 UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14), /* Direct Drive HP Amp control(Set to verb control)*/
5081 WRITE_COEFEX(0x57, 0x03, 0x09a3),
5082 WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
5083 {}
5084 };
6b0f95c4 5085 static const struct coef_fw coef0233[] = {
54db6c39
TI
5086 UPDATE_COEF(0x35, 0, 1<<14),
5087 WRITE_COEF(0x06, 0x2100),
5088 WRITE_COEF(0x1a, 0x0021),
5089 WRITE_COEF(0x26, 0x008c),
5090 {}
5091 };
6b0f95c4 5092 static const struct coef_fw coef0288[] = {
89542936 5093 UPDATE_COEF(0x4f, 0x00c0, 0),
f3b70332
KY
5094 UPDATE_COEF(0x50, 0x2000, 0),
5095 UPDATE_COEF(0x56, 0x0006, 0),
5096 UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
5097 UPDATE_COEF(0x66, 0x0008, 0x0008),
5098 UPDATE_COEF(0x67, 0x2000, 0x2000),
5099 {}
5100 };
6b0f95c4 5101 static const struct coef_fw coef0292[] = {
54db6c39
TI
5102 WRITE_COEF(0x19, 0xa208),
5103 WRITE_COEF(0x2e, 0xacf0),
5104 {}
5105 };
6b0f95c4 5106 static const struct coef_fw coef0293[] = {
54db6c39
TI
5107 UPDATE_COEFEX(0x57, 0x05, 0, 1<<15|1<<13), /* SET charge pump by verb */
5108 UPDATE_COEFEX(0x57, 0x03, 1<<10, 0), /* SET EN_OSW to 0 */
5109 UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
5110 {}
5111 };
6b0f95c4 5112 static const struct coef_fw coef0688[] = {
54db6c39
TI
5113 WRITE_COEF(0xb7, 0x802b),
5114 WRITE_COEF(0xb5, 0x1040),
5115 UPDATE_COEF(0xc3, 0, 1<<12),
5116 {}
5117 };
6b0f95c4 5118 static const struct coef_fw coef0225[] = {
4cc9b9d6
KY
5119 UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14),
5120 UPDATE_COEF(0x4a, 3<<4, 2<<4),
5121 UPDATE_COEF(0x63, 3<<14, 0),
5122 {}
5123 };
6b0f95c4 5124 static const struct coef_fw coef0274[] = {
71683c32
KY
5125 UPDATE_COEFEX(0x57, 0x05, 0x4000, 0x4000),
5126 UPDATE_COEF(0x4a, 0x0010, 0),
5127 UPDATE_COEF(0x6b, 0xf000, 0),
5128 {}
5129 };
54db6c39 5130
7639a06c 5131 switch (codec->core.vendor_id) {
9a22a8f5
KY
5132 case 0x10ec0255:
5133 alc_write_coef_idx(codec, 0x45, 0xc489);
5134 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
54db6c39 5135 alc_process_coef_fw(codec, coef0255);
9a22a8f5
KY
5136 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5137 break;
1948fc06 5138 case 0x10ec0230:
717f43d8
KY
5139 case 0x10ec0236:
5140 case 0x10ec0256:
527f4643 5141 case 0x19e58326:
717f43d8
KY
5142 alc_write_coef_idx(codec, 0x45, 0xc489);
5143 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5144 alc_process_coef_fw(codec, coef0256);
5145 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5146 break;
71683c32
KY
5147 case 0x10ec0234:
5148 case 0x10ec0274:
5149 case 0x10ec0294:
5150 alc_write_coef_idx(codec, 0x45, 0x4689);
5151 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5152 alc_process_coef_fw(codec, coef0274);
5153 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5154 break;
13fd08a3 5155 case 0x10ec0233:
73bdd597
DH
5156 case 0x10ec0283:
5157 alc_write_coef_idx(codec, 0x45, 0xc429);
5158 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
54db6c39 5159 alc_process_coef_fw(codec, coef0233);
73bdd597
DH
5160 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5161 break;
f3b70332
KY
5162 case 0x10ec0286:
5163 case 0x10ec0288:
1a5bc8d9 5164 case 0x10ec0298:
f3b70332
KY
5165 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5166 alc_process_coef_fw(codec, coef0288);
5167 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5168 break;
73bdd597
DH
5169 case 0x10ec0292:
5170 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
54db6c39 5171 alc_process_coef_fw(codec, coef0292);
73bdd597 5172 break;
a22aa26f
KY
5173 case 0x10ec0293:
5174 /* Set to TRS mode */
5175 alc_write_coef_idx(codec, 0x45, 0xc429);
5176 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
54db6c39 5177 alc_process_coef_fw(codec, coef0293);
a22aa26f
KY
5178 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5179 break;
78f4f7c2
KY
5180 case 0x10ec0867:
5181 alc_update_coefex_idx(codec, 0x57, 0x5, 0, 1<<14);
c0dbbdad 5182 fallthrough;
9eb5d0e6 5183 case 0x10ec0221:
1f8b46cd
DH
5184 case 0x10ec0662:
5185 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5186 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5187 break;
73bdd597
DH
5188 case 0x10ec0668:
5189 alc_write_coef_idx(codec, 0x11, 0x0001);
5190 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
54db6c39 5191 alc_process_coef_fw(codec, coef0688);
73bdd597
DH
5192 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5193 break;
c2b691ee 5194 case 0x10ec0215:
4cc9b9d6 5195 case 0x10ec0225:
c2b691ee 5196 case 0x10ec0285:
7d727869 5197 case 0x10ec0295:
c2b691ee 5198 case 0x10ec0289:
28f1f9b2 5199 case 0x10ec0299:
5a36767a 5200 alc_process_coef_fw(codec, alc225_pre_hsmode);
4cc9b9d6
KY
5201 alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x31<<10);
5202 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5203 alc_process_coef_fw(codec, coef0225);
5204 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5205 break;
73bdd597 5206 }
4e76a883 5207 codec_dbg(codec, "Headset jack set to mic-in mode.\n");
73bdd597
DH
5208}
5209
5210static void alc_headset_mode_default(struct hda_codec *codec)
5211{
6b0f95c4 5212 static const struct coef_fw coef0225[] = {
5a36767a
KY
5213 UPDATE_COEF(0x45, 0x3f<<10, 0x30<<10),
5214 UPDATE_COEF(0x45, 0x3f<<10, 0x31<<10),
5215 UPDATE_COEF(0x49, 3<<8, 0<<8),
5216 UPDATE_COEF(0x4a, 3<<4, 3<<4),
5217 UPDATE_COEF(0x63, 3<<14, 0),
5218 UPDATE_COEF(0x67, 0xf000, 0x3000),
2ae95577
DH
5219 {}
5220 };
6b0f95c4 5221 static const struct coef_fw coef0255[] = {
54db6c39
TI
5222 WRITE_COEF(0x45, 0xc089),
5223 WRITE_COEF(0x45, 0xc489),
5224 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5225 WRITE_COEF(0x49, 0x0049),
5226 {}
5227 };
6b0f95c4 5228 static const struct coef_fw coef0256[] = {
717f43d8
KY
5229 WRITE_COEF(0x45, 0xc489),
5230 WRITE_COEFEX(0x57, 0x03, 0x0da3),
5231 WRITE_COEF(0x49, 0x0049),
5232 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
5233 WRITE_COEF(0x06, 0x6100),
5234 {}
5235 };
6b0f95c4 5236 static const struct coef_fw coef0233[] = {
54db6c39
TI
5237 WRITE_COEF(0x06, 0x2100),
5238 WRITE_COEF(0x32, 0x4ea3),
5239 {}
5240 };
6b0f95c4 5241 static const struct coef_fw coef0288[] = {
f3b70332
KY
5242 UPDATE_COEF(0x4f, 0xfcc0, 0xc400), /* Set to TRS type */
5243 UPDATE_COEF(0x50, 0x2000, 0x2000),
5244 UPDATE_COEF(0x56, 0x0006, 0x0006),
5245 UPDATE_COEF(0x66, 0x0008, 0),
5246 UPDATE_COEF(0x67, 0x2000, 0),
5247 {}
5248 };
6b0f95c4 5249 static const struct coef_fw coef0292[] = {
54db6c39
TI
5250 WRITE_COEF(0x76, 0x000e),
5251 WRITE_COEF(0x6c, 0x2400),
5252 WRITE_COEF(0x6b, 0xc429),
5253 WRITE_COEF(0x18, 0x7308),
5254 {}
5255 };
6b0f95c4 5256 static const struct coef_fw coef0293[] = {
54db6c39
TI
5257 UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
5258 WRITE_COEF(0x45, 0xC429), /* Set to TRS type */
5259 UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
5260 {}
5261 };
6b0f95c4 5262 static const struct coef_fw coef0688[] = {
54db6c39
TI
5263 WRITE_COEF(0x11, 0x0041),
5264 WRITE_COEF(0x15, 0x0d40),
5265 WRITE_COEF(0xb7, 0x802b),
5266 {}
5267 };
6b0f95c4 5268 static const struct coef_fw coef0274[] = {
71683c32
KY
5269 WRITE_COEF(0x45, 0x4289),
5270 UPDATE_COEF(0x4a, 0x0010, 0x0010),
5271 UPDATE_COEF(0x6b, 0x0f00, 0),
5272 UPDATE_COEF(0x49, 0x0300, 0x0300),
5273 {}
5274 };
54db6c39 5275
7639a06c 5276 switch (codec->core.vendor_id) {
c2b691ee 5277 case 0x10ec0215:
2ae95577 5278 case 0x10ec0225:
c2b691ee 5279 case 0x10ec0285:
7d727869 5280 case 0x10ec0295:
c2b691ee 5281 case 0x10ec0289:
28f1f9b2 5282 case 0x10ec0299:
5a36767a 5283 alc_process_coef_fw(codec, alc225_pre_hsmode);
2ae95577
DH
5284 alc_process_coef_fw(codec, coef0225);
5285 break;
9a22a8f5 5286 case 0x10ec0255:
54db6c39 5287 alc_process_coef_fw(codec, coef0255);
9a22a8f5 5288 break;
1948fc06 5289 case 0x10ec0230:
717f43d8
KY
5290 case 0x10ec0236:
5291 case 0x10ec0256:
527f4643 5292 case 0x19e58326:
717f43d8
KY
5293 alc_write_coef_idx(codec, 0x1b, 0x0e4b);
5294 alc_write_coef_idx(codec, 0x45, 0xc089);
5295 msleep(50);
5296 alc_process_coef_fw(codec, coef0256);
5297 break;
71683c32
KY
5298 case 0x10ec0234:
5299 case 0x10ec0274:
5300 case 0x10ec0294:
5301 alc_process_coef_fw(codec, coef0274);
5302 break;
13fd08a3 5303 case 0x10ec0233:
73bdd597 5304 case 0x10ec0283:
54db6c39 5305 alc_process_coef_fw(codec, coef0233);
73bdd597 5306 break;
f3b70332
KY
5307 case 0x10ec0286:
5308 case 0x10ec0288:
1a5bc8d9 5309 case 0x10ec0298:
f3b70332
KY
5310 alc_process_coef_fw(codec, coef0288);
5311 break;
73bdd597 5312 case 0x10ec0292:
54db6c39 5313 alc_process_coef_fw(codec, coef0292);
73bdd597 5314 break;
a22aa26f 5315 case 0x10ec0293:
54db6c39 5316 alc_process_coef_fw(codec, coef0293);
a22aa26f 5317 break;
73bdd597 5318 case 0x10ec0668:
54db6c39 5319 alc_process_coef_fw(codec, coef0688);
73bdd597 5320 break;
78f4f7c2
KY
5321 case 0x10ec0867:
5322 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5323 break;
73bdd597 5324 }
4e76a883 5325 codec_dbg(codec, "Headset jack set to headphone (default) mode.\n");
73bdd597
DH
5326}
5327
5328/* Iphone type */
5329static void alc_headset_mode_ctia(struct hda_codec *codec)
5330{
89542936
KY
5331 int val;
5332
6b0f95c4 5333 static const struct coef_fw coef0255[] = {
54db6c39
TI
5334 WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
5335 WRITE_COEF(0x1b, 0x0c2b),
5336 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5337 {}
5338 };
6b0f95c4 5339 static const struct coef_fw coef0256[] = {
e69e7e03 5340 WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
717f43d8 5341 WRITE_COEF(0x1b, 0x0e6b),
e69e7e03
KY
5342 {}
5343 };
6b0f95c4 5344 static const struct coef_fw coef0233[] = {
54db6c39
TI
5345 WRITE_COEF(0x45, 0xd429),
5346 WRITE_COEF(0x1b, 0x0c2b),
5347 WRITE_COEF(0x32, 0x4ea3),
5348 {}
5349 };
6b0f95c4 5350 static const struct coef_fw coef0288[] = {
f3b70332
KY
5351 UPDATE_COEF(0x50, 0x2000, 0x2000),
5352 UPDATE_COEF(0x56, 0x0006, 0x0006),
5353 UPDATE_COEF(0x66, 0x0008, 0),
5354 UPDATE_COEF(0x67, 0x2000, 0),
5355 {}
5356 };
6b0f95c4 5357 static const struct coef_fw coef0292[] = {
54db6c39
TI
5358 WRITE_COEF(0x6b, 0xd429),
5359 WRITE_COEF(0x76, 0x0008),
5360 WRITE_COEF(0x18, 0x7388),
5361 {}
5362 };
6b0f95c4 5363 static const struct coef_fw coef0293[] = {
54db6c39
TI
5364 WRITE_COEF(0x45, 0xd429), /* Set to ctia type */
5365 UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
5366 {}
5367 };
6b0f95c4 5368 static const struct coef_fw coef0688[] = {
54db6c39
TI
5369 WRITE_COEF(0x11, 0x0001),
5370 WRITE_COEF(0x15, 0x0d60),
5371 WRITE_COEF(0xc3, 0x0000),
5372 {}
5373 };
6b0f95c4 5374 static const struct coef_fw coef0225_1[] = {
4cc9b9d6 5375 UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
5a36767a
KY
5376 UPDATE_COEF(0x63, 3<<14, 2<<14),
5377 {}
5378 };
6b0f95c4 5379 static const struct coef_fw coef0225_2[] = {
5a36767a
KY
5380 UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
5381 UPDATE_COEF(0x63, 3<<14, 1<<14),
4cc9b9d6
KY
5382 {}
5383 };
54db6c39 5384
7639a06c 5385 switch (codec->core.vendor_id) {
9a22a8f5 5386 case 0x10ec0255:
54db6c39 5387 alc_process_coef_fw(codec, coef0255);
9a22a8f5 5388 break;
1948fc06 5389 case 0x10ec0230:
736f20a7 5390 case 0x10ec0236:
e69e7e03 5391 case 0x10ec0256:
527f4643 5392 case 0x19e58326:
e69e7e03
KY
5393 alc_process_coef_fw(codec, coef0256);
5394 break;
71683c32
KY
5395 case 0x10ec0234:
5396 case 0x10ec0274:
5397 case 0x10ec0294:
5398 alc_write_coef_idx(codec, 0x45, 0xd689);
5399 break;
13fd08a3 5400 case 0x10ec0233:
73bdd597 5401 case 0x10ec0283:
54db6c39 5402 alc_process_coef_fw(codec, coef0233);
73bdd597 5403 break;
1a5bc8d9 5404 case 0x10ec0298:
89542936
KY
5405 val = alc_read_coef_idx(codec, 0x50);
5406 if (val & (1 << 12)) {
5407 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
5408 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5409 msleep(300);
5410 } else {
5411 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
5412 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5413 msleep(300);
5414 }
5415 break;
f3b70332
KY
5416 case 0x10ec0286:
5417 case 0x10ec0288:
5418 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5419 msleep(300);
5420 alc_process_coef_fw(codec, coef0288);
5421 break;
73bdd597 5422 case 0x10ec0292:
54db6c39 5423 alc_process_coef_fw(codec, coef0292);
73bdd597 5424 break;
a22aa26f 5425 case 0x10ec0293:
54db6c39 5426 alc_process_coef_fw(codec, coef0293);
a22aa26f 5427 break;
73bdd597 5428 case 0x10ec0668:
54db6c39 5429 alc_process_coef_fw(codec, coef0688);
73bdd597 5430 break;
c2b691ee 5431 case 0x10ec0215:
4cc9b9d6 5432 case 0x10ec0225:
c2b691ee 5433 case 0x10ec0285:
7d727869 5434 case 0x10ec0295:
c2b691ee 5435 case 0x10ec0289:
28f1f9b2 5436 case 0x10ec0299:
5a36767a
KY
5437 val = alc_read_coef_idx(codec, 0x45);
5438 if (val & (1 << 9))
5439 alc_process_coef_fw(codec, coef0225_2);
5440 else
5441 alc_process_coef_fw(codec, coef0225_1);
4cc9b9d6 5442 break;
78f4f7c2
KY
5443 case 0x10ec0867:
5444 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5445 break;
73bdd597 5446 }
4e76a883 5447 codec_dbg(codec, "Headset jack set to iPhone-style headset mode.\n");
73bdd597
DH
5448}
5449
5450/* Nokia type */
5451static void alc_headset_mode_omtp(struct hda_codec *codec)
5452{
6b0f95c4 5453 static const struct coef_fw coef0255[] = {
54db6c39
TI
5454 WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
5455 WRITE_COEF(0x1b, 0x0c2b),
5456 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5457 {}
5458 };
6b0f95c4 5459 static const struct coef_fw coef0256[] = {
e69e7e03 5460 WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
717f43d8 5461 WRITE_COEF(0x1b, 0x0e6b),
e69e7e03
KY
5462 {}
5463 };
6b0f95c4 5464 static const struct coef_fw coef0233[] = {
54db6c39
TI
5465 WRITE_COEF(0x45, 0xe429),
5466 WRITE_COEF(0x1b, 0x0c2b),
5467 WRITE_COEF(0x32, 0x4ea3),
5468 {}
5469 };
6b0f95c4 5470 static const struct coef_fw coef0288[] = {
f3b70332
KY
5471 UPDATE_COEF(0x50, 0x2000, 0x2000),
5472 UPDATE_COEF(0x56, 0x0006, 0x0006),
5473 UPDATE_COEF(0x66, 0x0008, 0),
5474 UPDATE_COEF(0x67, 0x2000, 0),
5475 {}
5476 };
6b0f95c4 5477 static const struct coef_fw coef0292[] = {
54db6c39
TI
5478 WRITE_COEF(0x6b, 0xe429),
5479 WRITE_COEF(0x76, 0x0008),
5480 WRITE_COEF(0x18, 0x7388),
5481 {}
5482 };
6b0f95c4 5483 static const struct coef_fw coef0293[] = {
54db6c39
TI
5484 WRITE_COEF(0x45, 0xe429), /* Set to omtp type */
5485 UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
5486 {}
5487 };
6b0f95c4 5488 static const struct coef_fw coef0688[] = {
54db6c39
TI
5489 WRITE_COEF(0x11, 0x0001),
5490 WRITE_COEF(0x15, 0x0d50),
5491 WRITE_COEF(0xc3, 0x0000),
5492 {}
5493 };
6b0f95c4 5494 static const struct coef_fw coef0225[] = {
4cc9b9d6 5495 UPDATE_COEF(0x45, 0x3f<<10, 0x39<<10),
5a36767a 5496 UPDATE_COEF(0x63, 3<<14, 2<<14),
4cc9b9d6
KY
5497 {}
5498 };
54db6c39 5499
7639a06c 5500 switch (codec->core.vendor_id) {
9a22a8f5 5501 case 0x10ec0255:
54db6c39 5502 alc_process_coef_fw(codec, coef0255);
9a22a8f5 5503 break;
1948fc06 5504 case 0x10ec0230:
736f20a7 5505 case 0x10ec0236:
e69e7e03 5506 case 0x10ec0256:
527f4643 5507 case 0x19e58326:
e69e7e03
KY
5508 alc_process_coef_fw(codec, coef0256);
5509 break;
71683c32
KY
5510 case 0x10ec0234:
5511 case 0x10ec0274:
5512 case 0x10ec0294:
5513 alc_write_coef_idx(codec, 0x45, 0xe689);
5514 break;
13fd08a3 5515 case 0x10ec0233:
73bdd597 5516 case 0x10ec0283:
54db6c39 5517 alc_process_coef_fw(codec, coef0233);
73bdd597 5518 break;
1a5bc8d9
KY
5519 case 0x10ec0298:
5520 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);/* Headset output enable */
89542936
KY
5521 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5522 msleep(300);
5523 break;
f3b70332
KY
5524 case 0x10ec0286:
5525 case 0x10ec0288:
5526 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5527 msleep(300);
5528 alc_process_coef_fw(codec, coef0288);
5529 break;
73bdd597 5530 case 0x10ec0292:
54db6c39 5531 alc_process_coef_fw(codec, coef0292);
73bdd597 5532 break;
a22aa26f 5533 case 0x10ec0293:
54db6c39 5534 alc_process_coef_fw(codec, coef0293);
a22aa26f 5535 break;
73bdd597 5536 case 0x10ec0668:
54db6c39 5537 alc_process_coef_fw(codec, coef0688);
73bdd597 5538 break;
c2b691ee 5539 case 0x10ec0215:
4cc9b9d6 5540 case 0x10ec0225:
c2b691ee 5541 case 0x10ec0285:
7d727869 5542 case 0x10ec0295:
c2b691ee 5543 case 0x10ec0289:
28f1f9b2 5544 case 0x10ec0299:
4cc9b9d6
KY
5545 alc_process_coef_fw(codec, coef0225);
5546 break;
73bdd597 5547 }
4e76a883 5548 codec_dbg(codec, "Headset jack set to Nokia-style headset mode.\n");
73bdd597
DH
5549}
5550
5551static void alc_determine_headset_type(struct hda_codec *codec)
5552{
5553 int val;
5554 bool is_ctia = false;
5555 struct alc_spec *spec = codec->spec;
6b0f95c4 5556 static const struct coef_fw coef0255[] = {
54db6c39
TI
5557 WRITE_COEF(0x45, 0xd089), /* combo jack auto switch control(Check type)*/
5558 WRITE_COEF(0x49, 0x0149), /* combo jack auto switch control(Vref
5559 conteol) */
5560 {}
5561 };
6b0f95c4 5562 static const struct coef_fw coef0288[] = {
f3b70332
KY
5563 UPDATE_COEF(0x4f, 0xfcc0, 0xd400), /* Check Type */
5564 {}
5565 };
6b0f95c4 5566 static const struct coef_fw coef0298[] = {
89542936
KY
5567 UPDATE_COEF(0x50, 0x2000, 0x2000),
5568 UPDATE_COEF(0x56, 0x0006, 0x0006),
5569 UPDATE_COEF(0x66, 0x0008, 0),
5570 UPDATE_COEF(0x67, 0x2000, 0),
5571 UPDATE_COEF(0x19, 0x1300, 0x1300),
5572 {}
5573 };
6b0f95c4 5574 static const struct coef_fw coef0293[] = {
54db6c39
TI
5575 UPDATE_COEF(0x4a, 0x000f, 0x0008), /* Combo Jack auto detect */
5576 WRITE_COEF(0x45, 0xD429), /* Set to ctia type */
5577 {}
5578 };
6b0f95c4 5579 static const struct coef_fw coef0688[] = {
54db6c39
TI
5580 WRITE_COEF(0x11, 0x0001),
5581 WRITE_COEF(0xb7, 0x802b),
5582 WRITE_COEF(0x15, 0x0d60),
5583 WRITE_COEF(0xc3, 0x0c00),
5584 {}
5585 };
6b0f95c4 5586 static const struct coef_fw coef0274[] = {
71683c32
KY
5587 UPDATE_COEF(0x4a, 0x0010, 0),
5588 UPDATE_COEF(0x4a, 0x8000, 0),
5589 WRITE_COEF(0x45, 0xd289),
5590 UPDATE_COEF(0x49, 0x0300, 0x0300),
5591 {}
5592 };
73bdd597 5593
92666d45
KY
5594 if (spec->no_internal_mic_pin) {
5595 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
5596 return;
5597 }
5598
7639a06c 5599 switch (codec->core.vendor_id) {
9a22a8f5 5600 case 0x10ec0255:
717f43d8
KY
5601 alc_process_coef_fw(codec, coef0255);
5602 msleep(300);
5603 val = alc_read_coef_idx(codec, 0x46);
5604 is_ctia = (val & 0x0070) == 0x0070;
5605 break;
1948fc06 5606 case 0x10ec0230:
717f43d8 5607 case 0x10ec0236:
7081adf3 5608 case 0x10ec0256:
527f4643 5609 case 0x19e58326:
717f43d8
KY
5610 alc_write_coef_idx(codec, 0x1b, 0x0e4b);
5611 alc_write_coef_idx(codec, 0x06, 0x6104);
5612 alc_write_coefex_idx(codec, 0x57, 0x3, 0x09a3);
5613
5614 snd_hda_codec_write(codec, 0x21, 0,
5615 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5616 msleep(80);
5617 snd_hda_codec_write(codec, 0x21, 0,
5618 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5619
54db6c39 5620 alc_process_coef_fw(codec, coef0255);
9a22a8f5
KY
5621 msleep(300);
5622 val = alc_read_coef_idx(codec, 0x46);
5623 is_ctia = (val & 0x0070) == 0x0070;
717f43d8
KY
5624
5625 alc_write_coefex_idx(codec, 0x57, 0x3, 0x0da3);
5626 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5627
5628 snd_hda_codec_write(codec, 0x21, 0,
5629 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5630 msleep(80);
5631 snd_hda_codec_write(codec, 0x21, 0,
5632 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
9a22a8f5 5633 break;
71683c32
KY
5634 case 0x10ec0234:
5635 case 0x10ec0274:
5636 case 0x10ec0294:
5637 alc_process_coef_fw(codec, coef0274);
febf2256 5638 msleep(850);
71683c32
KY
5639 val = alc_read_coef_idx(codec, 0x46);
5640 is_ctia = (val & 0x00f0) == 0x00f0;
5641 break;
13fd08a3 5642 case 0x10ec0233:
73bdd597
DH
5643 case 0x10ec0283:
5644 alc_write_coef_idx(codec, 0x45, 0xd029);
5645 msleep(300);
5646 val = alc_read_coef_idx(codec, 0x46);
5647 is_ctia = (val & 0x0070) == 0x0070;
5648 break;
1a5bc8d9 5649 case 0x10ec0298:
89542936
KY
5650 snd_hda_codec_write(codec, 0x21, 0,
5651 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5652 msleep(100);
5653 snd_hda_codec_write(codec, 0x21, 0,
5654 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5655 msleep(200);
5656
5657 val = alc_read_coef_idx(codec, 0x50);
5658 if (val & (1 << 12)) {
5659 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
5660 alc_process_coef_fw(codec, coef0288);
5661 msleep(350);
5662 val = alc_read_coef_idx(codec, 0x50);
5663 is_ctia = (val & 0x0070) == 0x0070;
5664 } else {
5665 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
5666 alc_process_coef_fw(codec, coef0288);
5667 msleep(350);
5668 val = alc_read_coef_idx(codec, 0x50);
5669 is_ctia = (val & 0x0070) == 0x0070;
5670 }
5671 alc_process_coef_fw(codec, coef0298);
5672 snd_hda_codec_write(codec, 0x21, 0,
5673 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP);
5674 msleep(75);
5675 snd_hda_codec_write(codec, 0x21, 0,
5676 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5677 break;
f3b70332
KY
5678 case 0x10ec0286:
5679 case 0x10ec0288:
5680 alc_process_coef_fw(codec, coef0288);
5681 msleep(350);
5682 val = alc_read_coef_idx(codec, 0x50);
5683 is_ctia = (val & 0x0070) == 0x0070;
5684 break;
73bdd597
DH
5685 case 0x10ec0292:
5686 alc_write_coef_idx(codec, 0x6b, 0xd429);
5687 msleep(300);
5688 val = alc_read_coef_idx(codec, 0x6c);
5689 is_ctia = (val & 0x001c) == 0x001c;
5690 break;
a22aa26f 5691 case 0x10ec0293:
54db6c39 5692 alc_process_coef_fw(codec, coef0293);
a22aa26f
KY
5693 msleep(300);
5694 val = alc_read_coef_idx(codec, 0x46);
5695 is_ctia = (val & 0x0070) == 0x0070;
5696 break;
73bdd597 5697 case 0x10ec0668:
54db6c39 5698 alc_process_coef_fw(codec, coef0688);
73bdd597
DH
5699 msleep(300);
5700 val = alc_read_coef_idx(codec, 0xbe);
5701 is_ctia = (val & 0x1c02) == 0x1c02;
5702 break;
c2b691ee 5703 case 0x10ec0215:
4cc9b9d6 5704 case 0x10ec0225:
c2b691ee 5705 case 0x10ec0285:
7d727869 5706 case 0x10ec0295:
c2b691ee 5707 case 0x10ec0289:
28f1f9b2 5708 case 0x10ec0299:
da911b1f
KY
5709 snd_hda_codec_write(codec, 0x21, 0,
5710 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5711 msleep(80);
5712 snd_hda_codec_write(codec, 0x21, 0,
5713 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5714
5a36767a
KY
5715 alc_process_coef_fw(codec, alc225_pre_hsmode);
5716 alc_update_coef_idx(codec, 0x67, 0xf000, 0x1000);
5717 val = alc_read_coef_idx(codec, 0x45);
5718 if (val & (1 << 9)) {
5719 alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5720 alc_update_coef_idx(codec, 0x49, 3<<8, 2<<8);
5721 msleep(800);
5722 val = alc_read_coef_idx(codec, 0x46);
5723 is_ctia = (val & 0x00f0) == 0x00f0;
5724 } else {
5725 alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5726 alc_update_coef_idx(codec, 0x49, 3<<8, 1<<8);
5727 msleep(800);
5728 val = alc_read_coef_idx(codec, 0x46);
5729 is_ctia = (val & 0x00f0) == 0x00f0;
5730 }
5731 alc_update_coef_idx(codec, 0x4a, 7<<6, 7<<6);
5732 alc_update_coef_idx(codec, 0x4a, 3<<4, 3<<4);
5733 alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
da911b1f
KY
5734
5735 snd_hda_codec_write(codec, 0x21, 0,
5736 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5737 msleep(80);
5738 snd_hda_codec_write(codec, 0x21, 0,
5739 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
4cc9b9d6 5740 break;
78f4f7c2
KY
5741 case 0x10ec0867:
5742 is_ctia = true;
5743 break;
73bdd597
DH
5744 }
5745
4e76a883 5746 codec_dbg(codec, "Headset jack detected iPhone-style headset: %s\n",
73bdd597
DH
5747 is_ctia ? "yes" : "no");
5748 spec->current_headset_type = is_ctia ? ALC_HEADSET_TYPE_CTIA : ALC_HEADSET_TYPE_OMTP;
5749}
5750
5751static void alc_update_headset_mode(struct hda_codec *codec)
5752{
5753 struct alc_spec *spec = codec->spec;
5754
5755 hda_nid_t mux_pin = spec->gen.imux_pins[spec->gen.cur_mux[0]];
35a39f98 5756 hda_nid_t hp_pin = alc_get_hp_pin(spec);
73bdd597
DH
5757
5758 int new_headset_mode;
5759
5760 if (!snd_hda_jack_detect(codec, hp_pin))
5761 new_headset_mode = ALC_HEADSET_MODE_UNPLUGGED;
5762 else if (mux_pin == spec->headset_mic_pin)
5763 new_headset_mode = ALC_HEADSET_MODE_HEADSET;
5764 else if (mux_pin == spec->headphone_mic_pin)
5765 new_headset_mode = ALC_HEADSET_MODE_MIC;
5766 else
5767 new_headset_mode = ALC_HEADSET_MODE_HEADPHONE;
5768
5959a6bc
DH
5769 if (new_headset_mode == spec->current_headset_mode) {
5770 snd_hda_gen_update_outputs(codec);
73bdd597 5771 return;
5959a6bc 5772 }
73bdd597
DH
5773
5774 switch (new_headset_mode) {
5775 case ALC_HEADSET_MODE_UNPLUGGED:
5776 alc_headset_mode_unplugged(codec);
aeac1a0d
KY
5777 spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5778 spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
73bdd597
DH
5779 spec->gen.hp_jack_present = false;
5780 break;
5781 case ALC_HEADSET_MODE_HEADSET:
5782 if (spec->current_headset_type == ALC_HEADSET_TYPE_UNKNOWN)
5783 alc_determine_headset_type(codec);
5784 if (spec->current_headset_type == ALC_HEADSET_TYPE_CTIA)
5785 alc_headset_mode_ctia(codec);
5786 else if (spec->current_headset_type == ALC_HEADSET_TYPE_OMTP)
5787 alc_headset_mode_omtp(codec);
5788 spec->gen.hp_jack_present = true;
5789 break;
5790 case ALC_HEADSET_MODE_MIC:
5791 alc_headset_mode_mic_in(codec, hp_pin, spec->headphone_mic_pin);
5792 spec->gen.hp_jack_present = false;
5793 break;
5794 case ALC_HEADSET_MODE_HEADPHONE:
5795 alc_headset_mode_default(codec);
5796 spec->gen.hp_jack_present = true;
5797 break;
5798 }
5799 if (new_headset_mode != ALC_HEADSET_MODE_MIC) {
5800 snd_hda_set_pin_ctl_cache(codec, hp_pin,
5801 AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
1f8b46cd 5802 if (spec->headphone_mic_pin && spec->headphone_mic_pin != hp_pin)
73bdd597
DH
5803 snd_hda_set_pin_ctl_cache(codec, spec->headphone_mic_pin,
5804 PIN_VREFHIZ);
5805 }
5806 spec->current_headset_mode = new_headset_mode;
5807
5808 snd_hda_gen_update_outputs(codec);
5809}
5810
5811static void alc_update_headset_mode_hook(struct hda_codec *codec,
7fe30711
TI
5812 struct snd_kcontrol *kcontrol,
5813 struct snd_ctl_elem_value *ucontrol)
73bdd597
DH
5814{
5815 alc_update_headset_mode(codec);
5816}
5817
1a4f69d5
TI
5818static void alc_update_headset_jack_cb(struct hda_codec *codec,
5819 struct hda_jack_callback *jack)
73bdd597 5820{
73bdd597 5821 snd_hda_gen_hp_automute(codec, jack);
e54f30be 5822 alc_update_headset_mode(codec);
73bdd597
DH
5823}
5824
5825static void alc_probe_headset_mode(struct hda_codec *codec)
5826{
5827 int i;
5828 struct alc_spec *spec = codec->spec;
5829 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5830
5831 /* Find mic pins */
5832 for (i = 0; i < cfg->num_inputs; i++) {
5833 if (cfg->inputs[i].is_headset_mic && !spec->headset_mic_pin)
5834 spec->headset_mic_pin = cfg->inputs[i].pin;
5835 if (cfg->inputs[i].is_headphone_mic && !spec->headphone_mic_pin)
5836 spec->headphone_mic_pin = cfg->inputs[i].pin;
5837 }
5838
0bed2aa3 5839 WARN_ON(spec->gen.cap_sync_hook);
73bdd597
DH
5840 spec->gen.cap_sync_hook = alc_update_headset_mode_hook;
5841 spec->gen.automute_hook = alc_update_headset_mode;
5842 spec->gen.hp_automute_hook = alc_update_headset_jack_cb;
5843}
5844
5845static void alc_fixup_headset_mode(struct hda_codec *codec,
5846 const struct hda_fixup *fix, int action)
5847{
5848 struct alc_spec *spec = codec->spec;
5849
5850 switch (action) {
5851 case HDA_FIXUP_ACT_PRE_PROBE:
5852 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC | HDA_PINCFG_HEADPHONE_MIC;
5853 break;
5854 case HDA_FIXUP_ACT_PROBE:
5855 alc_probe_headset_mode(codec);
5856 break;
5857 case HDA_FIXUP_ACT_INIT:
aeac1a0d
KY
5858 if (is_s3_resume(codec) || is_s4_resume(codec)) {
5859 spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5860 spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
5861 }
73bdd597
DH
5862 alc_update_headset_mode(codec);
5863 break;
5864 }
5865}
5866
5867static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
5868 const struct hda_fixup *fix, int action)
5869{
5870 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5871 struct alc_spec *spec = codec->spec;
5872 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5873 }
5874 else
5875 alc_fixup_headset_mode(codec, fix, action);
5876}
5877
31278997
KY
5878static void alc255_set_default_jack_type(struct hda_codec *codec)
5879{
5880 /* Set to iphone type */
6b0f95c4 5881 static const struct coef_fw alc255fw[] = {
54db6c39
TI
5882 WRITE_COEF(0x1b, 0x880b),
5883 WRITE_COEF(0x45, 0xd089),
5884 WRITE_COEF(0x1b, 0x080b),
5885 WRITE_COEF(0x46, 0x0004),
5886 WRITE_COEF(0x1b, 0x0c0b),
5887 {}
5888 };
6b0f95c4 5889 static const struct coef_fw alc256fw[] = {
e69e7e03
KY
5890 WRITE_COEF(0x1b, 0x884b),
5891 WRITE_COEF(0x45, 0xd089),
5892 WRITE_COEF(0x1b, 0x084b),
5893 WRITE_COEF(0x46, 0x0004),
5894 WRITE_COEF(0x1b, 0x0c4b),
5895 {}
5896 };
5897 switch (codec->core.vendor_id) {
5898 case 0x10ec0255:
5899 alc_process_coef_fw(codec, alc255fw);
5900 break;
1948fc06 5901 case 0x10ec0230:
736f20a7 5902 case 0x10ec0236:
e69e7e03 5903 case 0x10ec0256:
527f4643 5904 case 0x19e58326:
e69e7e03
KY
5905 alc_process_coef_fw(codec, alc256fw);
5906 break;
5907 }
31278997
KY
5908 msleep(30);
5909}
5910
9a22a8f5
KY
5911static void alc_fixup_headset_mode_alc255(struct hda_codec *codec,
5912 const struct hda_fixup *fix, int action)
5913{
5914 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
31278997 5915 alc255_set_default_jack_type(codec);
9a22a8f5
KY
5916 }
5917 alc_fixup_headset_mode(codec, fix, action);
5918}
5919
31278997
KY
5920static void alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec,
5921 const struct hda_fixup *fix, int action)
5922{
5923 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5924 struct alc_spec *spec = codec->spec;
5925 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5926 alc255_set_default_jack_type(codec);
72cea3a3 5927 }
31278997
KY
5928 else
5929 alc_fixup_headset_mode(codec, fix, action);
5930}
5931
e1e62b98
KY
5932static void alc288_update_headset_jack_cb(struct hda_codec *codec,
5933 struct hda_jack_callback *jack)
5934{
5935 struct alc_spec *spec = codec->spec;
e1e62b98
KY
5936
5937 alc_update_headset_jack_cb(codec, jack);
5938 /* Headset Mic enable or disable, only for Dell Dino */
d44a6864 5939 alc_update_gpio_data(codec, 0x40, spec->gen.hp_jack_present);
e1e62b98
KY
5940}
5941
5942static void alc_fixup_headset_mode_dell_alc288(struct hda_codec *codec,
5943 const struct hda_fixup *fix, int action)
5944{
5945 alc_fixup_headset_mode(codec, fix, action);
5946 if (action == HDA_FIXUP_ACT_PROBE) {
5947 struct alc_spec *spec = codec->spec;
d44a6864
TI
5948 /* toggled via hp_automute_hook */
5949 spec->gpio_mask |= 0x40;
5950 spec->gpio_dir |= 0x40;
e1e62b98
KY
5951 spec->gen.hp_automute_hook = alc288_update_headset_jack_cb;
5952 }
5953}
5954
493a52a9
HW
5955static void alc_fixup_auto_mute_via_amp(struct hda_codec *codec,
5956 const struct hda_fixup *fix, int action)
5957{
5958 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5959 struct alc_spec *spec = codec->spec;
5960 spec->gen.auto_mute_via_amp = 1;
5961 }
5962}
5963
9b745ab8
TI
5964static void alc_fixup_no_shutup(struct hda_codec *codec,
5965 const struct hda_fixup *fix, int action)
5966{
efe55732 5967 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
9b745ab8 5968 struct alc_spec *spec = codec->spec;
c0ca5ece 5969 spec->no_shutup_pins = 1;
9b745ab8
TI
5970 }
5971}
5972
5e6db669
GM
5973static void alc_fixup_disable_aamix(struct hda_codec *codec,
5974 const struct hda_fixup *fix, int action)
5975{
5976 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5977 struct alc_spec *spec = codec->spec;
5978 /* Disable AA-loopback as it causes white noise */
5979 spec->gen.mixer_nid = 0;
5980 }
5981}
5982
7f57d803
TI
5983/* fixup for Thinkpad docks: add dock pins, avoid HP parser fixup */
5984static void alc_fixup_tpt440_dock(struct hda_codec *codec,
5985 const struct hda_fixup *fix, int action)
5986{
5987 static const struct hda_pintbl pincfgs[] = {
5988 { 0x16, 0x21211010 }, /* dock headphone */
5989 { 0x19, 0x21a11010 }, /* dock mic */
5990 { }
5991 };
5992 struct alc_spec *spec = codec->spec;
5993
5994 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5995 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
5996 codec->power_save_node = 0; /* avoid click noises */
5997 snd_hda_apply_pincfgs(codec, pincfgs);
5998 }
5999}
6000
61fcf8ec
KY
6001static void alc_fixup_tpt470_dock(struct hda_codec *codec,
6002 const struct hda_fixup *fix, int action)
6003{
6004 static const struct hda_pintbl pincfgs[] = {
6005 { 0x17, 0x21211010 }, /* dock headphone */
6006 { 0x19, 0x21a11010 }, /* dock mic */
6007 { }
6008 };
6009 struct alc_spec *spec = codec->spec;
6010
6011 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6012 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
71db96dd
TI
6013 snd_hda_apply_pincfgs(codec, pincfgs);
6014 } else if (action == HDA_FIXUP_ACT_INIT) {
61fcf8ec
KY
6015 /* Enable DOCK device */
6016 snd_hda_codec_write(codec, 0x17, 0,
6017 AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
6018 /* Enable DOCK device */
6019 snd_hda_codec_write(codec, 0x19, 0,
6020 AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
61fcf8ec
KY
6021 }
6022}
6023
399c01aa
TI
6024static void alc_fixup_tpt470_dacs(struct hda_codec *codec,
6025 const struct hda_fixup *fix, int action)
6026{
6027 /* Assure the speaker pin to be coupled with DAC NID 0x03; otherwise
6028 * the speaker output becomes too low by some reason on Thinkpads with
6029 * ALC298 codec
6030 */
6031 static const hda_nid_t preferred_pairs[] = {
6032 0x14, 0x03, 0x17, 0x02, 0x21, 0x02,
6033 0
6034 };
6035 struct alc_spec *spec = codec->spec;
6036
6037 if (action == HDA_FIXUP_ACT_PRE_PROBE)
6038 spec->gen.preferred_dacs = preferred_pairs;
6039}
6040
8eedd3a7
TI
6041static void alc295_fixup_asus_dacs(struct hda_codec *codec,
6042 const struct hda_fixup *fix, int action)
6043{
6044 static const hda_nid_t preferred_pairs[] = {
6045 0x17, 0x02, 0x21, 0x03, 0
6046 };
6047 struct alc_spec *spec = codec->spec;
6048
6049 if (action == HDA_FIXUP_ACT_PRE_PROBE)
6050 spec->gen.preferred_dacs = preferred_pairs;
6051}
6052
9476d369 6053static void alc_shutup_dell_xps13(struct hda_codec *codec)
033b0a7c
GM
6054{
6055 struct alc_spec *spec = codec->spec;
35a39f98 6056 int hp_pin = alc_get_hp_pin(spec);
033b0a7c 6057
9476d369
GM
6058 /* Prevent pop noises when headphones are plugged in */
6059 snd_hda_codec_write(codec, hp_pin, 0,
6060 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
6061 msleep(20);
033b0a7c
GM
6062}
6063
6064static void alc_fixup_dell_xps13(struct hda_codec *codec,
6065 const struct hda_fixup *fix, int action)
6066{
3e1b0c4a
TI
6067 struct alc_spec *spec = codec->spec;
6068 struct hda_input_mux *imux = &spec->gen.input_mux;
6069 int i;
f38663ab 6070
3e1b0c4a
TI
6071 switch (action) {
6072 case HDA_FIXUP_ACT_PRE_PROBE:
6073 /* mic pin 0x19 must be initialized with Vref Hi-Z, otherwise
6074 * it causes a click noise at start up
6075 */
6076 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
efe55732 6077 spec->shutup = alc_shutup_dell_xps13;
3e1b0c4a
TI
6078 break;
6079 case HDA_FIXUP_ACT_PROBE:
f38663ab
GM
6080 /* Make the internal mic the default input source. */
6081 for (i = 0; i < imux->num_items; i++) {
6082 if (spec->gen.imux_pins[i] == 0x12) {
6083 spec->gen.cur_mux[0] = i;
6084 break;
6085 }
6086 }
3e1b0c4a 6087 break;
033b0a7c
GM
6088 }
6089}
6090
1f8b46cd
DH
6091static void alc_fixup_headset_mode_alc662(struct hda_codec *codec,
6092 const struct hda_fixup *fix, int action)
6093{
6094 struct alc_spec *spec = codec->spec;
6095
6096 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6097 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
6098 spec->gen.hp_mic = 1; /* Mic-in is same pin as headphone */
b40eda64
DH
6099
6100 /* Disable boost for mic-in permanently. (This code is only called
6101 from quirks that guarantee that the headphone is at NID 0x1b.) */
6102 snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000);
6103 snd_hda_override_wcaps(codec, 0x1b, get_wcaps(codec, 0x1b) & ~AC_WCAP_IN_AMP);
1f8b46cd
DH
6104 } else
6105 alc_fixup_headset_mode(codec, fix, action);
6106}
6107
73bdd597
DH
6108static void alc_fixup_headset_mode_alc668(struct hda_codec *codec,
6109 const struct hda_fixup *fix, int action)
6110{
6111 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
73bdd597 6112 alc_write_coef_idx(codec, 0xc4, 0x8000);
98b24883 6113 alc_update_coef_idx(codec, 0xc2, ~0xfe, 0);
73bdd597
DH
6114 snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
6115 }
6116 alc_fixup_headset_mode(codec, fix, action);
6117}
6118
bde7bc60
CCC
6119/* Returns the nid of the external mic input pin, or 0 if it cannot be found. */
6120static int find_ext_mic_pin(struct hda_codec *codec)
6121{
6122 struct alc_spec *spec = codec->spec;
6123 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
6124 hda_nid_t nid;
6125 unsigned int defcfg;
6126 int i;
6127
6128 for (i = 0; i < cfg->num_inputs; i++) {
6129 if (cfg->inputs[i].type != AUTO_PIN_MIC)
6130 continue;
6131 nid = cfg->inputs[i].pin;
6132 defcfg = snd_hda_codec_get_pincfg(codec, nid);
6133 if (snd_hda_get_input_pin_attr(defcfg) == INPUT_PIN_ATTR_INT)
6134 continue;
6135 return nid;
6136 }
6137
6138 return 0;
6139}
6140
08a978db 6141static void alc271_hp_gate_mic_jack(struct hda_codec *codec,
1727a771 6142 const struct hda_fixup *fix,
08a978db
DR
6143 int action)
6144{
6145 struct alc_spec *spec = codec->spec;
6146
0db75790 6147 if (action == HDA_FIXUP_ACT_PROBE) {
bde7bc60 6148 int mic_pin = find_ext_mic_pin(codec);
35a39f98 6149 int hp_pin = alc_get_hp_pin(spec);
bde7bc60
CCC
6150
6151 if (snd_BUG_ON(!mic_pin || !hp_pin))
0db75790 6152 return;
bde7bc60 6153 snd_hda_jack_set_gating_jack(codec, mic_pin, hp_pin);
0db75790 6154 }
08a978db 6155}
693b613d 6156
3e0d611b
DH
6157static void alc269_fixup_limit_int_mic_boost(struct hda_codec *codec,
6158 const struct hda_fixup *fix,
6159 int action)
6160{
6161 struct alc_spec *spec = codec->spec;
6162 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
6163 int i;
6164
6165 /* The mic boosts on level 2 and 3 are too noisy
6166 on the internal mic input.
6167 Therefore limit the boost to 0 or 1. */
6168
6169 if (action != HDA_FIXUP_ACT_PROBE)
6170 return;
6171
6172 for (i = 0; i < cfg->num_inputs; i++) {
6173 hda_nid_t nid = cfg->inputs[i].pin;
6174 unsigned int defcfg;
6175 if (cfg->inputs[i].type != AUTO_PIN_MIC)
6176 continue;
6177 defcfg = snd_hda_codec_get_pincfg(codec, nid);
6178 if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
6179 continue;
6180
6181 snd_hda_override_amp_caps(codec, nid, HDA_INPUT,
6182 (0x00 << AC_AMPCAP_OFFSET_SHIFT) |
6183 (0x01 << AC_AMPCAP_NUM_STEPS_SHIFT) |
6184 (0x2f << AC_AMPCAP_STEP_SIZE_SHIFT) |
6185 (0 << AC_AMPCAP_MUTE_SHIFT));
6186 }
6187}
6188
cd217a63 6189static void alc283_hp_automute_hook(struct hda_codec *codec,
1a4f69d5 6190 struct hda_jack_callback *jack)
cd217a63
KY
6191{
6192 struct alc_spec *spec = codec->spec;
6193 int vref;
6194
6195 msleep(200);
6196 snd_hda_gen_hp_automute(codec, jack);
6197
6198 vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
6199
6200 msleep(600);
6201 snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
6202 vref);
6203}
6204
cd217a63
KY
6205static void alc283_fixup_chromebook(struct hda_codec *codec,
6206 const struct hda_fixup *fix, int action)
6207{
6208 struct alc_spec *spec = codec->spec;
cd217a63
KY
6209
6210 switch (action) {
6211 case HDA_FIXUP_ACT_PRE_PROBE:
0202e99c 6212 snd_hda_override_wcaps(codec, 0x03, 0);
d2e92709
TI
6213 /* Disable AA-loopback as it causes white noise */
6214 spec->gen.mixer_nid = 0;
38070219 6215 break;
0202e99c 6216 case HDA_FIXUP_ACT_INIT:
de9481cb
KY
6217 /* MIC2-VREF control */
6218 /* Set to manual mode */
98b24883 6219 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
0202e99c 6220 /* Enable Line1 input control by verb */
98b24883 6221 alc_update_coef_idx(codec, 0x1a, 0, 1 << 4);
0202e99c
KY
6222 break;
6223 }
6224}
6225
6226static void alc283_fixup_sense_combo_jack(struct hda_codec *codec,
6227 const struct hda_fixup *fix, int action)
6228{
6229 struct alc_spec *spec = codec->spec;
0202e99c
KY
6230
6231 switch (action) {
6232 case HDA_FIXUP_ACT_PRE_PROBE:
cd217a63 6233 spec->gen.hp_automute_hook = alc283_hp_automute_hook;
38070219
KY
6234 break;
6235 case HDA_FIXUP_ACT_INIT:
cd217a63
KY
6236 /* MIC2-VREF control */
6237 /* Set to manual mode */
98b24883 6238 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
cd217a63
KY
6239 break;
6240 }
6241}
6242
7bba2157
TI
6243/* mute tablet speaker pin (0x14) via dock plugging in addition */
6244static void asus_tx300_automute(struct hda_codec *codec)
6245{
6246 struct alc_spec *spec = codec->spec;
6247 snd_hda_gen_update_outputs(codec);
6248 if (snd_hda_jack_detect(codec, 0x1b))
6249 spec->gen.mute_bits |= (1ULL << 0x14);
6250}
6251
6252static void alc282_fixup_asus_tx300(struct hda_codec *codec,
6253 const struct hda_fixup *fix, int action)
6254{
6255 struct alc_spec *spec = codec->spec;
7bba2157
TI
6256 static const struct hda_pintbl dock_pins[] = {
6257 { 0x1b, 0x21114000 }, /* dock speaker pin */
6258 {}
6259 };
7bba2157
TI
6260
6261 switch (action) {
6262 case HDA_FIXUP_ACT_PRE_PROBE:
1c76aa5f 6263 spec->init_amp = ALC_INIT_DEFAULT;
ae065f1c
TI
6264 /* TX300 needs to set up GPIO2 for the speaker amp */
6265 alc_setup_gpio(codec, 0x04);
7bba2157
TI
6266 snd_hda_apply_pincfgs(codec, dock_pins);
6267 spec->gen.auto_mute_via_amp = 1;
6268 spec->gen.automute_hook = asus_tx300_automute;
6269 snd_hda_jack_detect_enable_callback(codec, 0x1b,
7bba2157
TI
6270 snd_hda_gen_hp_automute);
6271 break;
5579cd6f
TI
6272 case HDA_FIXUP_ACT_PROBE:
6273 spec->init_amp = ALC_INIT_DEFAULT;
6274 break;
7bba2157
TI
6275 case HDA_FIXUP_ACT_BUILD:
6276 /* this is a bit tricky; give more sane names for the main
6277 * (tablet) speaker and the dock speaker, respectively
6278 */
56798e6b
TI
6279 rename_ctl(codec, "Speaker Playback Switch",
6280 "Dock Speaker Playback Switch");
6281 rename_ctl(codec, "Bass Speaker Playback Switch",
6282 "Speaker Playback Switch");
7bba2157
TI
6283 break;
6284 }
6285}
6286
338cae56
DH
6287static void alc290_fixup_mono_speakers(struct hda_codec *codec,
6288 const struct hda_fixup *fix, int action)
6289{
0f4881dc
DH
6290 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6291 /* DAC node 0x03 is giving mono output. We therefore want to
6292 make sure 0x14 (front speaker) and 0x15 (headphones) use the
6293 stereo DAC, while leaving 0x17 (bass speaker) for node 0x03. */
caf3c043
MM
6294 static const hda_nid_t conn1[] = { 0x0c };
6295 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
6296 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
0f4881dc 6297 }
338cae56
DH
6298}
6299
dd9aa335
HW
6300static void alc298_fixup_speaker_volume(struct hda_codec *codec,
6301 const struct hda_fixup *fix, int action)
6302{
6303 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6304 /* The speaker is routed to the Node 0x06 by a mistake, as a result
6305 we can't adjust the speaker's volume since this node does not has
6306 Amp-out capability. we change the speaker's route to:
6307 Node 0x02 (Audio Output) -> Node 0x0c (Audio Mixer) -> Node 0x17 (
6308 Pin Complex), since Node 0x02 has Amp-out caps, we can adjust
6309 speaker's volume now. */
6310
caf3c043
MM
6311 static const hda_nid_t conn1[] = { 0x0c };
6312 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn1), conn1);
dd9aa335
HW
6313 }
6314}
6315
e312a869
TI
6316/* disable DAC3 (0x06) selection on NID 0x17 as it has no volume amp control */
6317static void alc295_fixup_disable_dac3(struct hda_codec *codec,
6318 const struct hda_fixup *fix, int action)
6319{
6320 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
caf3c043
MM
6321 static const hda_nid_t conn[] = { 0x02, 0x03 };
6322 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
e312a869
TI
6323 }
6324}
6325
d2cd795c
JK
6326/* force NID 0x17 (Bass Speaker) to DAC1 to share it with the main speaker */
6327static void alc285_fixup_speaker2_to_dac1(struct hda_codec *codec,
6328 const struct hda_fixup *fix, int action)
6329{
6330 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
caf3c043
MM
6331 static const hda_nid_t conn[] = { 0x02 };
6332 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
d2cd795c
JK
6333 }
6334}
6335
98973f2f
KP
6336/* Hook to update amp GPIO4 for automute */
6337static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec,
6338 struct hda_jack_callback *jack)
6339{
6340 struct alc_spec *spec = codec->spec;
6341
6342 snd_hda_gen_hp_automute(codec, jack);
6343 /* mute_led_polarity is set to 0, so we pass inverted value here */
dbd13179
KHF
6344 alc_update_gpio_led(codec, 0x10, spec->mute_led_polarity,
6345 !spec->gen.hp_jack_present);
98973f2f
KP
6346}
6347
6348/* Manage GPIOs for HP EliteBook Folio 9480m.
6349 *
6350 * GPIO4 is the headphone amplifier power control
6351 * GPIO3 is the audio output mute indicator LED
6352 */
6353
6354static void alc280_fixup_hp_9480m(struct hda_codec *codec,
6355 const struct hda_fixup *fix,
6356 int action)
6357{
6358 struct alc_spec *spec = codec->spec;
98973f2f 6359
01e4a275 6360 alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
98973f2f 6361 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
01e4a275
TI
6362 /* amp at GPIO4; toggled via alc280_hp_gpio4_automute_hook() */
6363 spec->gpio_mask |= 0x10;
6364 spec->gpio_dir |= 0x10;
98973f2f 6365 spec->gen.hp_automute_hook = alc280_hp_gpio4_automute_hook;
98973f2f
KP
6366 }
6367}
6368
ae065f1c
TI
6369static void alc275_fixup_gpio4_off(struct hda_codec *codec,
6370 const struct hda_fixup *fix,
6371 int action)
6372{
6373 struct alc_spec *spec = codec->spec;
6374
6375 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6376 spec->gpio_mask |= 0x04;
6377 spec->gpio_dir |= 0x04;
6378 /* set data bit low */
6379 }
6380}
6381
6a6660d0
TI
6382/* Quirk for Thinkpad X1 7th and 8th Gen
6383 * The following fixed routing needed
6384 * DAC1 (NID 0x02) -> Speaker (NID 0x14); some eq applied secretly
6385 * DAC2 (NID 0x03) -> Bass (NID 0x17) & Headphone (NID 0x21); sharing a DAC
6386 * DAC3 (NID 0x06) -> Unused, due to the lack of volume amp
6387 */
6388static void alc285_fixup_thinkpad_x1_gen7(struct hda_codec *codec,
6389 const struct hda_fixup *fix, int action)
6390{
6391 static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */
6392 static const hda_nid_t preferred_pairs[] = {
6393 0x14, 0x02, 0x17, 0x03, 0x21, 0x03, 0
6394 };
6395 struct alc_spec *spec = codec->spec;
6396
6397 switch (action) {
6398 case HDA_FIXUP_ACT_PRE_PROBE:
6399 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6400 spec->gen.preferred_dacs = preferred_pairs;
6401 break;
6402 case HDA_FIXUP_ACT_BUILD:
6403 /* The generic parser creates somewhat unintuitive volume ctls
6404 * with the fixed routing above, and the shared DAC2 may be
6405 * confusing for PA.
6406 * Rename those to unique names so that PA doesn't touch them
6407 * and use only Master volume.
6408 */
6409 rename_ctl(codec, "Front Playback Volume", "DAC1 Playback Volume");
6410 rename_ctl(codec, "Bass Speaker Playback Volume", "DAC2 Playback Volume");
6411 break;
6412 }
6413}
6414
ca169cc2
KY
6415static void alc233_alc662_fixup_lenovo_dual_codecs(struct hda_codec *codec,
6416 const struct hda_fixup *fix,
6417 int action)
6418{
6419 alc_fixup_dual_codecs(codec, fix, action);
6420 switch (action) {
6421 case HDA_FIXUP_ACT_PRE_PROBE:
6422 /* override card longname to provide a unique UCM profile */
6423 strcpy(codec->card->longname, "HDAudio-Lenovo-DualCodecs");
6424 break;
6425 case HDA_FIXUP_ACT_BUILD:
6426 /* rename Capture controls depending on the codec */
6427 rename_ctl(codec, "Capture Volume",
6428 codec->addr == 0 ?
6429 "Rear-Panel Capture Volume" :
6430 "Front-Panel Capture Volume");
6431 rename_ctl(codec, "Capture Switch",
6432 codec->addr == 0 ?
6433 "Rear-Panel Capture Switch" :
6434 "Front-Panel Capture Switch");
6435 break;
6436 }
6437}
6438
52e4e368
KHF
6439static void alc225_fixup_s3_pop_noise(struct hda_codec *codec,
6440 const struct hda_fixup *fix, int action)
6441{
6442 if (action != HDA_FIXUP_ACT_PRE_PROBE)
6443 return;
6444
6445 codec->power_save_node = 1;
6446}
6447
92266651
KY
6448/* Forcibly assign NID 0x03 to HP/LO while NID 0x02 to SPK for EQ */
6449static void alc274_fixup_bind_dacs(struct hda_codec *codec,
6450 const struct hda_fixup *fix, int action)
6451{
6452 struct alc_spec *spec = codec->spec;
caf3c043 6453 static const hda_nid_t preferred_pairs[] = {
92266651
KY
6454 0x21, 0x03, 0x1b, 0x03, 0x16, 0x02,
6455 0
6456 };
6457
6458 if (action != HDA_FIXUP_ACT_PRE_PROBE)
6459 return;
6460
6461 spec->gen.preferred_dacs = preferred_pairs;
0700d3d1
KY
6462 spec->gen.auto_mute_via_amp = 1;
6463 codec->power_save_node = 0;
92266651
KY
6464}
6465
c84bfedc
TI
6466/* avoid DAC 0x06 for bass speaker 0x17; it has no volume control */
6467static void alc289_fixup_asus_ga401(struct hda_codec *codec,
6468 const struct hda_fixup *fix, int action)
6469{
6470 static const hda_nid_t preferred_pairs[] = {
6471 0x14, 0x02, 0x17, 0x02, 0x21, 0x03, 0
6472 };
6473 struct alc_spec *spec = codec->spec;
6474
6475 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6476 spec->gen.preferred_dacs = preferred_pairs;
6477 spec->gen.obey_preferred_dacs = 1;
6478 }
6479}
6480
c4cfcf6f
HW
6481/* The DAC of NID 0x3 will introduce click/pop noise on headphones, so invalidate it */
6482static void alc285_fixup_invalidate_dacs(struct hda_codec *codec,
6483 const struct hda_fixup *fix, int action)
6484{
6485 if (action != HDA_FIXUP_ACT_PRE_PROBE)
6486 return;
6487
6488 snd_hda_override_wcaps(codec, 0x03, 0);
6489}
6490
8a8de09c
KY
6491static void alc_combo_jack_hp_jd_restart(struct hda_codec *codec)
6492{
6493 switch (codec->core.vendor_id) {
6494 case 0x10ec0274:
6495 case 0x10ec0294:
6496 case 0x10ec0225:
6497 case 0x10ec0295:
6498 case 0x10ec0299:
6499 alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15); /* Reset HP JD */
6500 alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15);
6501 break;
1948fc06 6502 case 0x10ec0230:
8a8de09c
KY
6503 case 0x10ec0235:
6504 case 0x10ec0236:
6505 case 0x10ec0255:
6506 case 0x10ec0256:
cae2bdb5 6507 case 0x10ec0257:
527f4643 6508 case 0x19e58326:
8a8de09c
KY
6509 alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15); /* Reset HP JD */
6510 alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15);
6511 break;
6512 }
6513}
6514
8983eb60
KY
6515static void alc295_fixup_chromebook(struct hda_codec *codec,
6516 const struct hda_fixup *fix, int action)
6517{
d3ba58bb
KY
6518 struct alc_spec *spec = codec->spec;
6519
8983eb60 6520 switch (action) {
d3ba58bb
KY
6521 case HDA_FIXUP_ACT_PRE_PROBE:
6522 spec->ultra_low_power = true;
6523 break;
8983eb60 6524 case HDA_FIXUP_ACT_INIT:
8a8de09c 6525 alc_combo_jack_hp_jd_restart(codec);
8983eb60
KY
6526 break;
6527 }
6528}
6529
d1dd4211
KY
6530static void alc_fixup_disable_mic_vref(struct hda_codec *codec,
6531 const struct hda_fixup *fix, int action)
6532{
6533 if (action == HDA_FIXUP_ACT_PRE_PROBE)
6534 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
6535}
6536
c3cdf189
LJ
6537
6538static void alc294_gx502_toggle_output(struct hda_codec *codec,
6539 struct hda_jack_callback *cb)
6540{
6541 /* The Windows driver sets the codec up in a very different way where
6542 * it appears to leave 0x10 = 0x8a20 set. For Linux we need to toggle it
6543 */
6544 if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
6545 alc_write_coef_idx(codec, 0x10, 0x8a20);
6546 else
6547 alc_write_coef_idx(codec, 0x10, 0x0a20);
6548}
6549
6550static void alc294_fixup_gx502_hp(struct hda_codec *codec,
6551 const struct hda_fixup *fix, int action)
6552{
6553 /* Pin 0x21: headphones/headset mic */
6554 if (!is_jack_detectable(codec, 0x21))
6555 return;
6556
6557 switch (action) {
6558 case HDA_FIXUP_ACT_PRE_PROBE:
6559 snd_hda_jack_detect_enable_callback(codec, 0x21,
6560 alc294_gx502_toggle_output);
6561 break;
6562 case HDA_FIXUP_ACT_INIT:
6563 /* Make sure to start in a correct state, i.e. if
6564 * headphones have been plugged in before powering up the system
6565 */
6566 alc294_gx502_toggle_output(codec, NULL);
6567 break;
6568 }
6569}
6570
c1b55029
DC
6571static void alc294_gu502_toggle_output(struct hda_codec *codec,
6572 struct hda_jack_callback *cb)
6573{
6574 /* Windows sets 0x10 to 0x8420 for Node 0x20 which is
6575 * responsible from changes between speakers and headphones
6576 */
6577 if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
6578 alc_write_coef_idx(codec, 0x10, 0x8420);
6579 else
6580 alc_write_coef_idx(codec, 0x10, 0x0a20);
6581}
6582
6583static void alc294_fixup_gu502_hp(struct hda_codec *codec,
6584 const struct hda_fixup *fix, int action)
6585{
6586 if (!is_jack_detectable(codec, 0x21))
6587 return;
6588
6589 switch (action) {
6590 case HDA_FIXUP_ACT_PRE_PROBE:
6591 snd_hda_jack_detect_enable_callback(codec, 0x21,
6592 alc294_gu502_toggle_output);
6593 break;
6594 case HDA_FIXUP_ACT_INIT:
6595 alc294_gu502_toggle_output(codec, NULL);
6596 break;
6597 }
6598}
6599
56496253
KY
6600static void alc285_fixup_hp_gpio_amp_init(struct hda_codec *codec,
6601 const struct hda_fixup *fix, int action)
6602{
6603 if (action != HDA_FIXUP_ACT_INIT)
6604 return;
6605
6606 msleep(100);
6607 alc_write_coef_idx(codec, 0x65, 0x0);
6608}
6609
8a8de09c
KY
6610static void alc274_fixup_hp_headset_mic(struct hda_codec *codec,
6611 const struct hda_fixup *fix, int action)
6612{
6613 switch (action) {
6614 case HDA_FIXUP_ACT_INIT:
6615 alc_combo_jack_hp_jd_restart(codec);
6616 break;
6617 }
6618}
6619
92666d45
KY
6620static void alc_fixup_no_int_mic(struct hda_codec *codec,
6621 const struct hda_fixup *fix, int action)
6622{
6623 struct alc_spec *spec = codec->spec;
6624
6625 switch (action) {
6626 case HDA_FIXUP_ACT_PRE_PROBE:
6627 /* Mic RING SLEEVE swap for combo jack */
6628 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
6629 spec->no_internal_mic_pin = true;
6630 break;
6631 case HDA_FIXUP_ACT_INIT:
6632 alc_combo_jack_hp_jd_restart(codec);
6633 break;
6634 }
6635}
6636
d94befbb
DB
6637/* GPIO1 = amplifier on/off
6638 * GPIO3 = mic mute LED
6639 */
6640static void alc285_fixup_hp_spectre_x360_eb1(struct hda_codec *codec,
6641 const struct hda_fixup *fix, int action)
6642{
6643 static const hda_nid_t conn[] = { 0x02 };
6644
6645 struct alc_spec *spec = codec->spec;
6646 static const struct hda_pintbl pincfgs[] = {
6647 { 0x14, 0x90170110 }, /* front/high speakers */
6648 { 0x17, 0x90170130 }, /* back/bass speakers */
6649 { }
6650 };
6651
6652 //enable micmute led
6653 alc_fixup_hp_gpio_led(codec, action, 0x00, 0x04);
6654
6655 switch (action) {
6656 case HDA_FIXUP_ACT_PRE_PROBE:
6657 spec->micmute_led_polarity = 1;
6658 /* needed for amp of back speakers */
6659 spec->gpio_mask |= 0x01;
6660 spec->gpio_dir |= 0x01;
6661 snd_hda_apply_pincfgs(codec, pincfgs);
6662 /* share DAC to have unified volume control */
6663 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
6664 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6665 break;
6666 case HDA_FIXUP_ACT_INIT:
6667 /* need to toggle GPIO to enable the amp of back speakers */
6668 alc_update_gpio_data(codec, 0x01, true);
6669 msleep(100);
6670 alc_update_gpio_data(codec, 0x01, false);
6671 break;
6672 }
6673}
6674
434591b2
ED
6675static void alc285_fixup_hp_spectre_x360(struct hda_codec *codec,
6676 const struct hda_fixup *fix, int action)
6677{
6678 static const hda_nid_t conn[] = { 0x02 };
6679 static const struct hda_pintbl pincfgs[] = {
6680 { 0x14, 0x90170110 }, /* rear speaker */
6681 { }
6682 };
6683
6684 switch (action) {
6685 case HDA_FIXUP_ACT_PRE_PROBE:
6686 snd_hda_apply_pincfgs(codec, pincfgs);
6687 /* force front speaker to DAC1 */
6688 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6689 break;
6690 }
6691}
6692
c0621669
AA
6693static void alc285_fixup_hp_envy_x360(struct hda_codec *codec,
6694 const struct hda_fixup *fix,
6695 int action)
6696{
6697 static const struct coef_fw coefs[] = {
6698 WRITE_COEF(0x08, 0x6a0c), WRITE_COEF(0x0d, 0xa023),
6699 WRITE_COEF(0x10, 0x0320), WRITE_COEF(0x1a, 0x8c03),
6700 WRITE_COEF(0x25, 0x1800), WRITE_COEF(0x26, 0x003a),
6701 WRITE_COEF(0x28, 0x1dfe), WRITE_COEF(0x29, 0xb014),
6702 WRITE_COEF(0x2b, 0x1dfe), WRITE_COEF(0x37, 0xfe15),
6703 WRITE_COEF(0x38, 0x7909), WRITE_COEF(0x45, 0xd489),
6704 WRITE_COEF(0x46, 0x00f4), WRITE_COEF(0x4a, 0x21e0),
6705 WRITE_COEF(0x66, 0x03f0), WRITE_COEF(0x67, 0x1000),
6706 WRITE_COEF(0x6e, 0x1005), { }
6707 };
6708
6709 static const struct hda_pintbl pincfgs[] = {
6710 { 0x12, 0xb7a60130 }, /* Internal microphone*/
6711 { 0x14, 0x90170150 }, /* B&O soundbar speakers */
6712 { 0x17, 0x90170153 }, /* Side speakers */
6713 { 0x19, 0x03a11040 }, /* Headset microphone */
6714 { }
6715 };
6716
6717 switch (action) {
6718 case HDA_FIXUP_ACT_PRE_PROBE:
6719 snd_hda_apply_pincfgs(codec, pincfgs);
6720
6721 /* Fixes volume control problem for side speakers */
6722 alc295_fixup_disable_dac3(codec, fix, action);
6723
6724 /* Fixes no sound from headset speaker */
6725 snd_hda_codec_amp_stereo(codec, 0x21, HDA_OUTPUT, 0, -1, 0);
6726
6727 /* Auto-enable headset mic when plugged */
6728 snd_hda_jack_set_gating_jack(codec, 0x19, 0x21);
6729
6730 /* Headset mic volume enhancement */
6731 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREF50);
6732 break;
6733 case HDA_FIXUP_ACT_INIT:
6734 alc_process_coef_fw(codec, coefs);
6735 break;
6736 case HDA_FIXUP_ACT_BUILD:
6737 rename_ctl(codec, "Bass Speaker Playback Volume",
6738 "B&O-Tuned Playback Volume");
6739 rename_ctl(codec, "Front Playback Switch",
6740 "B&O Soundbar Playback Switch");
6741 rename_ctl(codec, "Bass Speaker Playback Switch",
6742 "Side Speaker Playback Switch");
6743 break;
6744 }
6745}
6746
b317b032
TI
6747/* for hda_fixup_thinkpad_acpi() */
6748#include "thinkpad_helper.c"
b67ae3f1 6749
d5a6cabf
TI
6750static void alc_fixup_thinkpad_acpi(struct hda_codec *codec,
6751 const struct hda_fixup *fix, int action)
6752{
6753 alc_fixup_no_shutup(codec, fix, action); /* reduce click noise */
6754 hda_fixup_thinkpad_acpi(codec, fix, action);
6755}
6756
ad7cc2d4
CB
6757/* Fixup for Lenovo Legion 15IMHg05 speaker output on headset removal. */
6758static void alc287_fixup_legion_15imhg05_speakers(struct hda_codec *codec,
6759 const struct hda_fixup *fix,
6760 int action)
6761{
6762 struct alc_spec *spec = codec->spec;
6763
6764 switch (action) {
6765 case HDA_FIXUP_ACT_PRE_PROBE:
6766 spec->gen.suppress_auto_mute = 1;
6767 break;
6768 }
6769}
6770
7ce66933
SB
6771static void comp_acpi_device_notify(acpi_handle handle, u32 event, void *data)
6772{
6773 struct hda_codec *cdc = data;
6774 struct alc_spec *spec = cdc->spec;
7ce66933
SB
6775
6776 codec_info(cdc, "ACPI Notification %d\n", event);
6777
fd895a74
RF
6778 hda_component_acpi_device_notify(spec->comps, ARRAY_SIZE(spec->comps),
6779 handle, event, data);
7ce66933
SB
6780}
6781
d3dca026
LT
6782static int comp_bind(struct device *dev)
6783{
6784 struct hda_codec *cdc = dev_to_hda_codec(dev);
6785 struct alc_spec *spec = cdc->spec;
7ce66933
SB
6786 int ret;
6787
fd895a74 6788 ret = hda_component_manager_bind(cdc, spec->comps);
7ce66933
SB
6789 if (ret)
6790 return ret;
1873ebd3 6791
fd895a74
RF
6792 return hda_component_manager_bind_acpi_notifications(cdc,
6793 spec->comps, ARRAY_SIZE(spec->comps),
6794 comp_acpi_device_notify, cdc);
d3dca026
LT
6795}
6796
6797static void comp_unbind(struct device *dev)
6798{
6799 struct hda_codec *cdc = dev_to_hda_codec(dev);
6800 struct alc_spec *spec = cdc->spec;
6801
fd895a74
RF
6802 hda_component_manager_unbind_acpi_notifications(cdc, spec->comps, comp_acpi_device_notify);
6803 hda_component_manager_unbind(cdc, spec->comps);
d3dca026
LT
6804}
6805
6806static const struct component_master_ops comp_master_ops = {
6807 .bind = comp_bind,
6808 .unbind = comp_unbind,
6809};
6810
6811static void comp_generic_playback_hook(struct hda_pcm_stream *hinfo, struct hda_codec *cdc,
6812 struct snd_pcm_substream *sub, int action)
6813{
6814 struct alc_spec *spec = cdc->spec;
ae7abe36 6815
fd895a74 6816 hda_component_manager_playback_hook(spec->comps, ARRAY_SIZE(spec->comps), action);
ae7abe36
SB
6817}
6818
cf0d9566
RF
6819static void comp_generic_fixup(struct hda_codec *cdc, int action, const char *bus,
6820 const char *hid, const char *match_str, int count)
3babae91 6821{
3babae91 6822 struct alc_spec *spec = cdc->spec;
3babae91
SD
6823 int ret;
6824
6825 switch (action) {
6826 case HDA_FIXUP_ACT_PRE_PROBE:
fd895a74
RF
6827 ret = hda_component_manager_init(cdc, spec->comps, count, bus, hid,
6828 match_str, &comp_master_ops);
3babae91 6829 if (ret)
fd895a74
RF
6830 return;
6831
6832 spec->gen.pcm_playback_hook = comp_generic_playback_hook;
3babae91
SD
6833 break;
6834 case HDA_FIXUP_ACT_FREE:
fd895a74 6835 hda_component_manager_free(cdc, &comp_master_ops);
3babae91
SD
6836 break;
6837 }
6838}
6839
ae7abe36
SB
6840static void cs35l41_fixup_i2c_two(struct hda_codec *cdc, const struct hda_fixup *fix, int action)
6841{
cf0d9566 6842 comp_generic_fixup(cdc, action, "i2c", "CSC3551", "-%s:00-cs35l41-hda.%d", 2);
ae7abe36
SB
6843}
6844
42320660
SB
6845static void cs35l41_fixup_i2c_four(struct hda_codec *cdc, const struct hda_fixup *fix, int action)
6846{
cf0d9566 6847 comp_generic_fixup(cdc, action, "i2c", "CSC3551", "-%s:00-cs35l41-hda.%d", 4);
42320660
SB
6848}
6849
07bcab93
LT
6850static void cs35l41_fixup_spi_two(struct hda_codec *codec, const struct hda_fixup *fix, int action)
6851{
cf0d9566 6852 comp_generic_fixup(codec, action, "spi", "CSC3551", "-%s:00-cs35l41-hda.%d", 2);
225f6e1b
TI
6853}
6854
07bcab93
LT
6855static void cs35l41_fixup_spi_four(struct hda_codec *codec, const struct hda_fixup *fix, int action)
6856{
cf0d9566 6857 comp_generic_fixup(codec, action, "spi", "CSC3551", "-%s:00-cs35l41-hda.%d", 4);
07bcab93
LT
6858}
6859
d3dca026
LT
6860static void alc287_fixup_legion_16achg6_speakers(struct hda_codec *cdc, const struct hda_fixup *fix,
6861 int action)
6862{
cf0d9566 6863 comp_generic_fixup(cdc, action, "i2c", "CLSA0100", "-%s:00-cs35l41-hda.%d", 2);
d3dca026
LT
6864}
6865
1e24881d
LT
6866static void alc287_fixup_legion_16ithg6_speakers(struct hda_codec *cdc, const struct hda_fixup *fix,
6867 int action)
6868{
cf0d9566 6869 comp_generic_fixup(cdc, action, "i2c", "CLSA0101", "-%s:00-cs35l41-hda.%d", 2);
1e24881d
LT
6870}
6871
c33f0d4f
ST
6872static void cs35l56_fixup_i2c_two(struct hda_codec *cdc, const struct hda_fixup *fix, int action)
6873{
6874 comp_generic_fixup(cdc, action, "i2c", "CSC3556", "-%s:00-cs35l56-hda.%d", 2);
6875}
6876
6877static void cs35l56_fixup_i2c_four(struct hda_codec *cdc, const struct hda_fixup *fix, int action)
6878{
6879 comp_generic_fixup(cdc, action, "i2c", "CSC3556", "-%s:00-cs35l56-hda.%d", 4);
6880}
6881
6882static void cs35l56_fixup_spi_two(struct hda_codec *cdc, const struct hda_fixup *fix, int action)
6883{
6884 comp_generic_fixup(cdc, action, "spi", "CSC3556", "-%s:00-cs35l56-hda.%d", 2);
6885}
6886
b2d6a1fd
ST
6887static void cs35l56_fixup_spi_four(struct hda_codec *cdc, const struct hda_fixup *fix, int action)
6888{
6889 comp_generic_fixup(cdc, action, "spi", "CSC3556", "-%s:00-cs35l56-hda.%d", 4);
1e24881d
LT
6890}
6891
c33f0d4f
ST
6892static void alc285_fixup_asus_ga403u(struct hda_codec *cdc, const struct hda_fixup *fix, int action)
6893{
6894 /*
6895 * The same SSID has been re-used in different hardware, they have
6896 * different codecs and the newer GA403U has a ALC285.
6897 */
6898 if (cdc->core.vendor_id == 0x10ec0285)
6899 cs35l56_fixup_i2c_two(cdc, fix, action);
6900 else
6901 alc_fixup_inv_dmic(cdc, fix, action);
6902}
6903
3babae91
SD
6904static void tas2781_fixup_i2c(struct hda_codec *cdc,
6905 const struct hda_fixup *fix, int action)
6906{
cf0d9566 6907 comp_generic_fixup(cdc, action, "i2c", "TIAS2781", "-%s:00", 1);
3babae91
SD
6908}
6909
b5cb53fd
GK
6910static void yoga7_14arb7_fixup_i2c(struct hda_codec *cdc,
6911 const struct hda_fixup *fix, int action)
6912{
cf0d9566 6913 comp_generic_fixup(cdc, action, "i2c", "INT8866", "-%s:00", 1);
b5cb53fd
GK
6914}
6915
bd2d8305
IM
6916static void alc256_fixup_acer_sfg16_micmute_led(struct hda_codec *codec,
6917 const struct hda_fixup *fix, int action)
6918{
6919 alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
6920}
6921
6922
bbf8ff6b
TB
6923/* for alc295_fixup_hp_top_speakers */
6924#include "hp_x360_helper.c"
6925
26928ca1
TI
6926/* for alc285_fixup_ideapad_s740_coef() */
6927#include "ideapad_s740_helper.c"
6928
619764cc
WS
6929static const struct coef_fw alc256_fixup_set_coef_defaults_coefs[] = {
6930 WRITE_COEF(0x10, 0x0020), WRITE_COEF(0x24, 0x0000),
6931 WRITE_COEF(0x26, 0x0000), WRITE_COEF(0x29, 0x3000),
6932 WRITE_COEF(0x37, 0xfe05), WRITE_COEF(0x45, 0x5089),
6933 {}
6934};
6935
6936static void alc256_fixup_set_coef_defaults(struct hda_codec *codec,
6937 const struct hda_fixup *fix,
6938 int action)
dd6dd6e3
WS
6939{
6940 /*
619764cc
WS
6941 * A certain other OS sets these coeffs to different values. On at least
6942 * one TongFang barebone these settings might survive even a cold
6943 * reboot. So to restore a clean slate the values are explicitly reset
6944 * to default here. Without this, the external microphone is always in a
6945 * plugged-in state, while the internal microphone is always in an
6946 * unplugged state, breaking the ability to use the internal microphone.
6947 */
6948 alc_process_coef_fw(codec, alc256_fixup_set_coef_defaults_coefs);
dd6dd6e3
WS
6949}
6950
174a7fb3
WS
6951static const struct coef_fw alc233_fixup_no_audio_jack_coefs[] = {
6952 WRITE_COEF(0x1a, 0x9003), WRITE_COEF(0x1b, 0x0e2b), WRITE_COEF(0x37, 0xfe06),
6953 WRITE_COEF(0x38, 0x4981), WRITE_COEF(0x45, 0xd489), WRITE_COEF(0x46, 0x0074),
6954 WRITE_COEF(0x49, 0x0149),
6955 {}
6956};
6957
6958static void alc233_fixup_no_audio_jack(struct hda_codec *codec,
6959 const struct hda_fixup *fix,
6960 int action)
6961{
6962 /*
6963 * The audio jack input and output is not detected on the ASRock NUC Box
6964 * 1100 series when cold booting without this fix. Warm rebooting from a
6965 * certain other OS makes the audio functional, as COEF settings are
6966 * preserved in this case. This fix sets these altered COEF values as
6967 * the default.
6968 */
6969 alc_process_coef_fw(codec, alc233_fixup_no_audio_jack_coefs);
6970}
6971
edca7cc4
WS
6972static void alc256_fixup_mic_no_presence_and_resume(struct hda_codec *codec,
6973 const struct hda_fixup *fix,
6974 int action)
6975{
6976 /*
6977 * The Clevo NJ51CU comes either with the ALC293 or the ALC256 codec,
6978 * but uses the 0x8686 subproduct id in both cases. The ALC256 codec
6979 * needs an additional quirk for sound working after suspend and resume.
6980 */
6981 if (codec->core.vendor_id == 0x10ec0256) {
6982 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
6983 snd_hda_codec_set_pincfg(codec, 0x19, 0x04a11120);
6984 } else {
6985 snd_hda_codec_set_pincfg(codec, 0x1a, 0x04a1113c);
6986 }
6987}
6988
1e5dc398
HW
6989static void alc256_decrease_headphone_amp_val(struct hda_codec *codec,
6990 const struct hda_fixup *fix, int action)
6991{
6992 u32 caps;
6993 u8 nsteps, offs;
6994
6995 if (action != HDA_FIXUP_ACT_PRE_PROBE)
6996 return;
6997
6998 caps = query_amp_caps(codec, 0x3, HDA_OUTPUT);
6999 nsteps = ((caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT) - 10;
7000 offs = ((caps & AC_AMPCAP_OFFSET) >> AC_AMPCAP_OFFSET_SHIFT) - 10;
7001 caps &= ~AC_AMPCAP_NUM_STEPS & ~AC_AMPCAP_OFFSET;
7002 caps |= (nsteps << AC_AMPCAP_NUM_STEPS_SHIFT) | (offs << AC_AMPCAP_OFFSET_SHIFT);
7003
7004 if (snd_hda_override_amp_caps(codec, 0x3, HDA_OUTPUT, caps))
7005 codec_warn(codec, "failed to override amp caps for NID 0x3\n");
7006}
7007
1efcdd9c
GM
7008static void alc_fixup_dell4_mic_no_presence_quiet(struct hda_codec *codec,
7009 const struct hda_fixup *fix,
7010 int action)
7011{
7012 struct alc_spec *spec = codec->spec;
7013 struct hda_input_mux *imux = &spec->gen.input_mux;
7014 int i;
7015
7016 alc269_fixup_limit_int_mic_boost(codec, fix, action);
7017
7018 switch (action) {
7019 case HDA_FIXUP_ACT_PRE_PROBE:
7020 /**
7021 * Set the vref of pin 0x19 (Headset Mic) and pin 0x1b (Headphone Mic)
7022 * to Hi-Z to avoid pop noises at startup and when plugging and
7023 * unplugging headphones.
7024 */
7025 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
7026 snd_hda_codec_set_pin_target(codec, 0x1b, PIN_VREFHIZ);
7027 break;
7028 case HDA_FIXUP_ACT_PROBE:
7029 /**
7030 * Make the internal mic (0x12) the default input source to
7031 * prevent pop noises on cold boot.
7032 */
7033 for (i = 0; i < imux->num_items; i++) {
7034 if (spec->gen.imux_pins[i] == 0x12) {
7035 spec->gen.cur_mux[0] = i;
7036 break;
7037 }
7038 }
7039 break;
7040 }
7041}
7042
3790a3d6
PJ
7043static void alc287_fixup_yoga9_14iap7_bass_spk_pin(struct hda_codec *codec,
7044 const struct hda_fixup *fix, int action)
7045{
7046 /*
7047 * The Pin Complex 0x17 for the bass speakers is wrongly reported as
7048 * unconnected.
7049 */
7050 static const struct hda_pintbl pincfgs[] = {
7051 { 0x17, 0x90170121 },
7052 { }
7053 };
7054 /*
7055 * Avoid DAC 0x06 and 0x08, as they have no volume controls.
7056 * DAC 0x02 and 0x03 would be fine.
7057 */
7058 static const hda_nid_t conn[] = { 0x02, 0x03 };
7059 /*
7060 * Prefer both speakerbar (0x14) and bass speakers (0x17) connected to DAC 0x02.
7061 * Headphones (0x21) are connected to DAC 0x03.
7062 */
7063 static const hda_nid_t preferred_pairs[] = {
7064 0x14, 0x02,
7065 0x17, 0x02,
7066 0x21, 0x03,
7067 0
7068 };
7069 struct alc_spec *spec = codec->spec;
7070
7071 switch (action) {
7072 case HDA_FIXUP_ACT_PRE_PROBE:
7073 snd_hda_apply_pincfgs(codec, pincfgs);
7074 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
7075 spec->gen.preferred_dacs = preferred_pairs;
7076 break;
7077 }
7078}
7079
2912cdda
PJ
7080static void alc295_fixup_dell_inspiron_top_speakers(struct hda_codec *codec,
7081 const struct hda_fixup *fix, int action)
7082{
7083 static const struct hda_pintbl pincfgs[] = {
7084 { 0x14, 0x90170151 },
7085 { 0x17, 0x90170150 },
7086 { }
7087 };
7088 static const hda_nid_t conn[] = { 0x02, 0x03 };
7089 static const hda_nid_t preferred_pairs[] = {
7090 0x14, 0x02,
7091 0x17, 0x03,
7092 0x21, 0x02,
7093 0
7094 };
7095 struct alc_spec *spec = codec->spec;
7096
7097 alc_fixup_no_shutup(codec, fix, action);
7098
7099 switch (action) {
7100 case HDA_FIXUP_ACT_PRE_PROBE:
7101 snd_hda_apply_pincfgs(codec, pincfgs);
7102 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
7103 spec->gen.preferred_dacs = preferred_pairs;
7104 break;
7105 }
7106}
7107
e43252db
KY
7108/* Forcibly assign NID 0x03 to HP while NID 0x02 to SPK */
7109static void alc287_fixup_bind_dacs(struct hda_codec *codec,
7110 const struct hda_fixup *fix, int action)
7111{
7112 struct alc_spec *spec = codec->spec;
7113 static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */
7114 static const hda_nid_t preferred_pairs[] = {
7115 0x17, 0x02, 0x21, 0x03, 0
7116 };
7117
7118 if (action != HDA_FIXUP_ACT_PRE_PROBE)
7119 return;
7120
7121 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
7122 spec->gen.preferred_dacs = preferred_pairs;
7123 spec->gen.auto_mute_via_amp = 1;
fb6254df
KY
7124 if (spec->gen.autocfg.speaker_pins[0] != 0x14) {
7125 snd_hda_codec_write_cache(codec, 0x14, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
7126 0x0); /* Make sure 0x14 was disable */
7127 }
e43252db 7128}
c8c0a03e
KY
7129/* Fix none verb table of Headset Mic pin */
7130static void alc_fixup_headset_mic(struct hda_codec *codec,
7131 const struct hda_fixup *fix, int action)
7132{
7133 struct alc_spec *spec = codec->spec;
7134 static const struct hda_pintbl pincfgs[] = {
7135 { 0x19, 0x03a1103c },
7136 { }
7137 };
7138
7139 switch (action) {
7140 case HDA_FIXUP_ACT_PRE_PROBE:
7141 snd_hda_apply_pincfgs(codec, pincfgs);
7142 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
7143 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
7144 break;
7145 }
7146}
e43252db 7147
61456da0
AG
7148static void alc245_fixup_hp_spectre_x360_eu0xxx(struct hda_codec *codec,
7149 const struct hda_fixup *fix, int action)
7150{
7151 /*
7152 * The Pin Complex 0x14 for the treble speakers is wrongly reported as
7153 * unconnected.
7154 * The Pin Complex 0x17 for the bass speakers has the lowest association
7155 * and sequence values so shift it up a bit to squeeze 0x14 in.
7156 */
7157 static const struct hda_pintbl pincfgs[] = {
7158 { 0x14, 0x90170110 }, // top/treble
7159 { 0x17, 0x90170111 }, // bottom/bass
7160 { }
7161 };
7162
7163 /*
7164 * Force DAC 0x02 for the bass speakers 0x17.
7165 */
7166 static const hda_nid_t conn[] = { 0x02 };
7167
7168 switch (action) {
7169 case HDA_FIXUP_ACT_PRE_PROBE:
7170 snd_hda_apply_pincfgs(codec, pincfgs);
7171 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
7172 break;
7173 }
7174
7175 cs35l41_fixup_i2c_two(codec, fix, action);
7176 alc245_fixup_hp_mute_led_coefbit(codec, fix, action);
7177 alc245_fixup_hp_gpio_led(codec, fix, action);
7178}
7179
1e707769
KY
7180/*
7181 * ALC287 PCM hooks
7182 */
7183static void alc287_alc1318_playback_pcm_hook(struct hda_pcm_stream *hinfo,
7184 struct hda_codec *codec,
7185 struct snd_pcm_substream *substream,
7186 int action)
7187{
7188 alc_write_coef_idx(codec, 0x10, 0x8806); /* Change MLK to GPIO3 */
7189 switch (action) {
7190 case HDA_GEN_PCM_ACT_OPEN:
7191 alc_write_coefex_idx(codec, 0x5a, 0x00, 0x954f); /* write gpio3 to high */
7192 break;
7193 case HDA_GEN_PCM_ACT_CLOSE:
7194 alc_write_coefex_idx(codec, 0x5a, 0x00, 0x554f); /* write gpio3 as default value */
7195 break;
7196 }
7197}
7198
03002d18 7199static void alc287_s4_power_gpio3_default(struct hda_codec *codec)
1e707769
KY
7200{
7201 if (is_s4_suspend(codec)) {
7202 alc_write_coef_idx(codec, 0x10, 0x8806); /* Change MLK to GPIO3 */
7203 alc_write_coefex_idx(codec, 0x5a, 0x00, 0x554f); /* write gpio3 as default value */
7204 }
7205}
7206
7207static void alc287_fixup_lenovo_thinkpad_with_alc1318(struct hda_codec *codec,
7208 const struct hda_fixup *fix, int action)
7209{
7210 struct alc_spec *spec = codec->spec;
7211
7212 if (action != HDA_FIXUP_ACT_PRE_PROBE)
7213 return;
7214 spec->power_hook = alc287_s4_power_gpio3_default;
7215 spec->gen.pcm_playback_hook = alc287_alc1318_playback_pcm_hook;
7216}
7217
e43252db 7218
1d045db9 7219enum {
f73bbf63 7220 ALC269_FIXUP_GPIO2,
1d045db9
TI
7221 ALC269_FIXUP_SONY_VAIO,
7222 ALC275_FIXUP_SONY_VAIO_GPIO2,
7223 ALC269_FIXUP_DELL_M101Z,
7224 ALC269_FIXUP_SKU_IGNORE,
7225 ALC269_FIXUP_ASUS_G73JW,
e959f2be
PLB
7226 ALC269_FIXUP_ASUS_N7601ZM_PINS,
7227 ALC269_FIXUP_ASUS_N7601ZM,
1d045db9
TI
7228 ALC269_FIXUP_LENOVO_EAPD,
7229 ALC275_FIXUP_SONY_HWEQ,
e9bd7d5c 7230 ALC275_FIXUP_SONY_DISABLE_AAMIX,
1d045db9 7231 ALC271_FIXUP_DMIC,
017f2a10 7232 ALC269_FIXUP_PCM_44K,
adabb3ec 7233 ALC269_FIXUP_STEREO_DMIC,
7c478f03 7234 ALC269_FIXUP_HEADSET_MIC,
24519911
TI
7235 ALC269_FIXUP_QUANTA_MUTE,
7236 ALC269_FIXUP_LIFEBOOK,
2041d564 7237 ALC269_FIXUP_LIFEBOOK_EXTMIC,
cc7016ab 7238 ALC269_FIXUP_LIFEBOOK_HP_PIN,
4df3fd17 7239 ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT,
fdcc968a 7240 ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC,
a4297b5d
TI
7241 ALC269_FIXUP_AMIC,
7242 ALC269_FIXUP_DMIC,
7243 ALC269VB_FIXUP_AMIC,
7244 ALC269VB_FIXUP_DMIC,
08fb0d0e 7245 ALC269_FIXUP_HP_MUTE_LED,
d06ac143 7246 ALC269_FIXUP_HP_MUTE_LED_MIC1,
08fb0d0e 7247 ALC269_FIXUP_HP_MUTE_LED_MIC2,
7f783bd5 7248 ALC269_FIXUP_HP_MUTE_LED_MIC3,
9f5c6faf 7249 ALC269_FIXUP_HP_GPIO_LED,
9c5dc3bf
KY
7250 ALC269_FIXUP_HP_GPIO_MIC1_LED,
7251 ALC269_FIXUP_HP_LINE1_MIC1_LED,
693b613d 7252 ALC269_FIXUP_INV_DMIC,
108cc108 7253 ALC269_FIXUP_LENOVO_DOCK,
b590b38c 7254 ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST,
9b745ab8 7255 ALC269_FIXUP_NO_SHUTUP,
88cfcf86 7256 ALC286_FIXUP_SONY_MIC_NO_PRESENCE,
108cc108 7257 ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
73bdd597
DH
7258 ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
7259 ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
338cae56 7260 ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
fcc6c877 7261 ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
1efcdd9c 7262 ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET,
73bdd597
DH
7263 ALC269_FIXUP_HEADSET_MODE,
7264 ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
7819717b 7265 ALC269_FIXUP_ASPIRE_HEADSET_MIC,
d240d1dc
DH
7266 ALC269_FIXUP_ASUS_X101_FUNC,
7267 ALC269_FIXUP_ASUS_X101_VERB,
7268 ALC269_FIXUP_ASUS_X101,
08a978db
DR
7269 ALC271_FIXUP_AMIC_MIC2,
7270 ALC271_FIXUP_HP_GATE_MIC_JACK,
b1e8972e 7271 ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572,
42397004 7272 ALC269_FIXUP_ACER_AC700,
3e0d611b 7273 ALC269_FIXUP_LIMIT_INT_MIC_BOOST,
2cede303 7274 ALC269VB_FIXUP_ASUS_ZENBOOK,
23870831 7275 ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A,
f882c4be 7276 ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE,
8e35cd4a 7277 ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED,
02b504d9 7278 ALC269VB_FIXUP_ORDISSIMO_EVE2,
cd217a63 7279 ALC283_FIXUP_CHROME_BOOK,
0202e99c 7280 ALC283_FIXUP_SENSE_COMBO_JACK,
7bba2157 7281 ALC282_FIXUP_ASUS_TX300,
1bb3e062 7282 ALC283_FIXUP_INT_MIC,
338cae56 7283 ALC290_FIXUP_MONO_SPEAKERS,
0f4881dc
DH
7284 ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
7285 ALC290_FIXUP_SUBWOOFER,
7286 ALC290_FIXUP_SUBWOOFER_HSJACK,
b67ae3f1 7287 ALC269_FIXUP_THINKPAD_ACPI,
56f27013 7288 ALC269_FIXUP_DMIC_THINKPAD_ACPI,
7c9caa29 7289 ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO,
5824ce8d 7290 ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
615966ad 7291 ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
9a22a8f5 7292 ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
31278997 7293 ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
9a22a8f5 7294 ALC255_FIXUP_HEADSET_MODE,
31278997 7295 ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,
a22aa26f 7296 ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
1c37c223 7297 ALC292_FIXUP_TPT440_DOCK,
9a811230 7298 ALC292_FIXUP_TPT440,
abaa2274 7299 ALC283_FIXUP_HEADSET_MIC,
b3802783 7300 ALC255_FIXUP_MIC_MUTE_LED,
1a22e775 7301 ALC282_FIXUP_ASPIRE_V5_PINS,
c8426b27 7302 ALC269VB_FIXUP_ASPIRE_E1_COEF,
7a5255f1 7303 ALC280_FIXUP_HP_GPIO4,
eaa8e5ef 7304 ALC286_FIXUP_HP_GPIO_LED,
33f4acd3 7305 ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY,
b4b33f9d 7306 ALC280_FIXUP_HP_DOCK_PINS,
04d5466a 7307 ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED,
98973f2f 7308 ALC280_FIXUP_HP_9480M,
c3bb2b52 7309 ALC245_FIXUP_HP_X360_AMP,
d94befbb 7310 ALC285_FIXUP_HP_SPECTRE_X360_EB1,
c0621669 7311 ALC285_FIXUP_HP_ENVY_X360,
e1e62b98
KY
7312 ALC288_FIXUP_DELL_HEADSET_MODE,
7313 ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
831bfdf9
HW
7314 ALC288_FIXUP_DELL_XPS_13,
7315 ALC288_FIXUP_DISABLE_AAMIX,
5fab5829 7316 ALC292_FIXUP_DELL_E7X_AAMIX,
8b99aba7
TI
7317 ALC292_FIXUP_DELL_E7X,
7318 ALC292_FIXUP_DISABLE_AAMIX,
c04017ea 7319 ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK,
54324221 7320 ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
977e6276 7321 ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
2f726aec 7322 ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
6ed1131f 7323 ALC275_FIXUP_DELL_XPS,
23adc192 7324 ALC293_FIXUP_LENOVO_SPK_NOISE,
3694cb29 7325 ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
3b43b71f 7326 ALC255_FIXUP_DELL_SPK_NOISE,
d1dd4211 7327 ALC225_FIXUP_DISABLE_MIC_VREF,
2ae95577 7328 ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
e312a869 7329 ALC295_FIXUP_DISABLE_DAC3,
d2cd795c 7330 ALC285_FIXUP_SPEAKER2_TO_DAC1,
4b963ae1
AS
7331 ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1,
7332 ALC285_FIXUP_ASUS_HEADSET_MIC,
b759a5f0 7333 ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS,
8cc87c05
LJ
7334 ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1,
7335 ALC285_FIXUP_ASUS_I2C_HEADSET_MIC,
f883982d 7336 ALC280_FIXUP_HP_HEADSET_MIC,
e549d190 7337 ALC221_FIXUP_HP_FRONT_MIC,
c636b95e 7338 ALC292_FIXUP_TPT460,
dd9aa335 7339 ALC298_FIXUP_SPK_VOLUME,
f86de9b1 7340 ALC298_FIXUP_LENOVO_SPK_VOLUME,
fd06c77e 7341 ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER,
823ff161 7342 ALC269_FIXUP_ATIV_BOOK_8,
4ba5c853 7343 ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE,
9eb5d0e6 7344 ALC221_FIXUP_HP_MIC_NO_PRESENCE,
c1732ede
CC
7345 ALC256_FIXUP_ASUS_HEADSET_MODE,
7346 ALC256_FIXUP_ASUS_MIC,
eeed4cd1 7347 ALC256_FIXUP_ASUS_AIO_GPIO2,
216d7aeb
CC
7348 ALC233_FIXUP_ASUS_MIC_NO_PRESENCE,
7349 ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE,
ca169cc2 7350 ALC233_FIXUP_LENOVO_MULTI_CODECS,
ea5c7eba 7351 ALC233_FIXUP_ACER_HEADSET_MIC,
f33f79f3 7352 ALC294_FIXUP_LENOVO_MIC_LOCATION,
5f364135 7353 ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE,
52e4e368 7354 ALC225_FIXUP_S3_POP_NOISE,
b84e8436 7355 ALC700_FIXUP_INTEL_REFERENCE,
92266651
KY
7356 ALC274_FIXUP_DELL_BIND_DACS,
7357 ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
399c01aa 7358 ALC298_FIXUP_TPT470_DOCK_FIX,
61fcf8ec 7359 ALC298_FIXUP_TPT470_DOCK,
ae104a21 7360 ALC255_FIXUP_DUMMY_LINEOUT_VERB,
f0ba9d69 7361 ALC255_FIXUP_DELL_HEADSET_MIC,
0fbf21c3 7362 ALC256_FIXUP_HUAWEI_MACH_WX9_PINS,
a2ef03fe 7363 ALC298_FIXUP_HUAWEI_MBX_STEREO,
bbf8ff6b 7364 ALC295_FIXUP_HP_X360,
8a328ac1 7365 ALC221_FIXUP_HP_HEADSET_MIC,
c4cfcf6f 7366 ALC285_FIXUP_LENOVO_HEADPHONE_NOISE,
e8ed64b0 7367 ALC295_FIXUP_HP_AUTO_MUTE,
33aaebd4 7368 ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
d8ae458e 7369 ALC294_FIXUP_ASUS_MIC,
4e051106
JHP
7370 ALC294_FIXUP_ASUS_HEADSET_MIC,
7371 ALC294_FIXUP_ASUS_SPK,
89e3a568 7372 ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
c8c6ee61 7373 ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
cbc05fd6 7374 ALC255_FIXUP_ACER_HEADSET_MIC,
10f5b1b8 7375 ALC295_FIXUP_CHROME_BOOK,
8983eb60 7376 ALC225_FIXUP_HEADSET_JACK,
136824ef
KY
7377 ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE,
7378 ALC225_FIXUP_WYSE_AUTO_MUTE,
7379 ALC225_FIXUP_WYSE_DISABLE_MIC_VREF,
667a8f73 7380 ALC286_FIXUP_ACER_AIO_HEADSET_MIC,
8c8967a7 7381 ALC256_FIXUP_ASUS_HEADSET_MIC,
e1037354 7382 ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
e2a829b3 7383 ALC299_FIXUP_PREDATOR_SPK,
bd9c10bc 7384 ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE,
f0d9da19 7385 ALC289_FIXUP_DELL_SPK1,
e79c2269
KY
7386 ALC289_FIXUP_DELL_SPK2,
7387 ALC289_FIXUP_DUAL_SPK,
f0d9da19 7388 ALC289_FIXUP_RTK_AMP_DUAL_SPK,
48e01504
CC
7389 ALC294_FIXUP_SPK2_TO_DAC1,
7390 ALC294_FIXUP_ASUS_DUAL_SPK,
6a6660d0 7391 ALC285_FIXUP_THINKPAD_X1_GEN7,
76f7dec0 7392 ALC285_FIXUP_THINKPAD_HEADSET_JACK,
724418b8
MA
7393 ALC294_FIXUP_ASUS_ALLY,
7394 ALC294_FIXUP_ASUS_ALLY_PINS,
7395 ALC294_FIXUP_ASUS_ALLY_VERBS,
7396 ALC294_FIXUP_ASUS_ALLY_SPEAKER,
8b33a134 7397 ALC294_FIXUP_ASUS_HPE,
1b94e59d 7398 ALC294_FIXUP_ASUS_COEF_1B,
c3cdf189
LJ
7399 ALC294_FIXUP_ASUS_GX502_HP,
7400 ALC294_FIXUP_ASUS_GX502_PINS,
7401 ALC294_FIXUP_ASUS_GX502_VERBS,
c1b55029
DC
7402 ALC294_FIXUP_ASUS_GU502_HP,
7403 ALC294_FIXUP_ASUS_GU502_PINS,
7404 ALC294_FIXUP_ASUS_GU502_VERBS,
c611e659 7405 ALC294_FIXUP_ASUS_G513_PINS,
bc2c2354 7406 ALC285_FIXUP_ASUS_G533Z_PINS,
f5a88b0a 7407 ALC285_FIXUP_HP_GPIO_LED,
431e76c3 7408 ALC285_FIXUP_HP_MUTE_LED,
ca88eeb3 7409 ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED,
0659400f 7410 ALC236_FIXUP_HP_MUTE_LED_COEFBIT2,
e7d66cf7 7411 ALC236_FIXUP_HP_GPIO_LED,
24164f43 7412 ALC236_FIXUP_HP_MUTE_LED,
75b62ab6 7413 ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,
a2d57ebe 7414 ALC298_FIXUP_SAMSUNG_AMP,
14425f1f 7415 ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
ef248d9b 7416 ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
9e43342b 7417 ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
8eae7e9b 7418 ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS,
6e15d126 7419 ALC269VC_FIXUP_ACER_HEADSET_MIC,
781c90c0 7420 ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE,
293a92c1 7421 ALC289_FIXUP_ASUS_GA401,
4b43d05a 7422 ALC289_FIXUP_ASUS_GA502,
f50a121d 7423 ALC256_FIXUP_ACER_MIC_NO_PRESENCE,
56496253 7424 ALC285_FIXUP_HP_GPIO_AMP_INIT,
f1ec5be1
HC
7425 ALC269_FIXUP_CZC_B20,
7426 ALC269_FIXUP_CZC_TMI,
7427 ALC269_FIXUP_CZC_L101,
7428 ALC269_FIXUP_LEMOTE_A1802,
7429 ALC269_FIXUP_LEMOTE_A190X,
e2d2fded 7430 ALC256_FIXUP_INTEL_NUC8_RUGGED,
d1ee66c5
PC
7431 ALC233_FIXUP_INTEL_NUC8_DMIC,
7432 ALC233_FIXUP_INTEL_NUC8_BOOST,
73e7161e 7433 ALC256_FIXUP_INTEL_NUC10,
fc19d559 7434 ALC255_FIXUP_XIAOMI_HEADSET_MIC,
13468bfa 7435 ALC274_FIXUP_HP_MIC,
8a8de09c 7436 ALC274_FIXUP_HP_HEADSET_MIC,
622464c8 7437 ALC274_FIXUP_HP_ENVY_GPIO,
ef9ce66f 7438 ALC256_FIXUP_ASUS_HPE,
446b8185 7439 ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
a0ccbc53 7440 ALC287_FIXUP_HP_GPIO_LED,
9e885770 7441 ALC256_FIXUP_HP_HEADSET_MIC,
5fc462c3 7442 ALC245_FIXUP_HP_GPIO_LED,
92666d45 7443 ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
34cdf405 7444 ALC282_FIXUP_ACER_DISABLE_LINEOUT,
495dc763 7445 ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST,
d0e18561 7446 ALC256_FIXUP_ACER_HEADSET_MIC,
26928ca1 7447 ALC285_FIXUP_IDEAPAD_S740_COEF,
bd15b155 7448 ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST,
8eedd3a7 7449 ALC295_FIXUP_ASUS_DACS,
5d84b531 7450 ALC295_FIXUP_HP_OMEN,
f2be77fe 7451 ALC285_FIXUP_HP_SPECTRE_X360,
9ebaef05 7452 ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP,
29c8f40b 7453 ALC623_FIXUP_LENOVO_THINKSTATION_P340,
57c9e21a 7454 ALC255_FIXUP_ACER_HEADPHONE_AND_MIC,
8903376d 7455 ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST,
ad7cc2d4
CB
7456 ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS,
7457 ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,
7458 ALC287_FIXUP_YOGA7_14ITL_SPEAKERS,
56ec3e75 7459 ALC298_FIXUP_LENOVO_C940_DUET7,
0ac32a39 7460 ALC287_FIXUP_LENOVO_14IRP8_DUETITL,
39815cdf 7461 ALC287_FIXUP_LENOVO_LEGION_7,
dd6dd6e3 7462 ALC287_FIXUP_13S_GEN2_SPEAKERS,
619764cc 7463 ALC256_FIXUP_SET_COEF_DEFAULTS,
1278cc5a 7464 ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
174a7fb3 7465 ALC233_FIXUP_NO_AUDIO_JACK,
edca7cc4 7466 ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME,
8f4c9042
BF
7467 ALC285_FIXUP_LEGION_Y9000X_SPEAKERS,
7468 ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,
d3dca026 7469 ALC287_FIXUP_LEGION_16ACHG6,
ae7abe36 7470 ALC287_FIXUP_CS35L41_I2C_2,
b3fbe536 7471 ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED,
42320660 7472 ALC287_FIXUP_CS35L41_I2C_4,
07bcab93 7473 ALC245_FIXUP_CS35L41_SPI_2,
ce18f905 7474 ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED,
07bcab93
LT
7475 ALC245_FIXUP_CS35L41_SPI_4,
7476 ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED,
91502a9a 7477 ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED,
309d7363 7478 ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE,
1e24881d 7479 ALC287_FIXUP_LEGION_16ITHG6,
3790a3d6
PJ
7480 ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK,
7481 ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN,
9b714a59 7482 ALC287_FIXUP_YOGA9_14IMH9_BASS_SPK_PIN,
2912cdda 7483 ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS,
a4517c4f 7484 ALC236_FIXUP_DELL_DUAL_CODECS,
f7b069cf 7485 ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI,
3babae91 7486 ALC287_FIXUP_TAS2781_I2C,
b5cb53fd 7487 ALC287_FIXUP_YOGA7_14ARB7_I2C,
93dc18e1 7488 ALC245_FIXUP_HP_MUTE_LED_COEFBIT,
c99c26b1 7489 ALC245_FIXUP_HP_X360_MUTE_LEDS,
e43252db 7490 ALC287_FIXUP_THINKPAD_I2S_SPK,
d93eeca6 7491 ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD,
c8c0a03e 7492 ALC2XX_FIXUP_HEADSET_MIC,
f0d9da19 7493 ALC289_FIXUP_DELL_CS35L41_SPI_2,
6ae90e90 7494 ALC294_FIXUP_CS35L41_I2C_2,
b2d6a1fd 7495 ALC245_FIXUP_CS35L56_SPI_4_HP_GPIO_LED,
bd2d8305 7496 ALC256_FIXUP_ACER_SFG16_MICMUTE_LED,
1e5dc398 7497 ALC256_FIXUP_HEADPHONE_AMP_VOL,
61456da0 7498 ALC245_FIXUP_HP_SPECTRE_X360_EU0XXX,
c33f0d4f
ST
7499 ALC285_FIXUP_CS35L56_SPI_2,
7500 ALC285_FIXUP_CS35L56_I2C_2,
7501 ALC285_FIXUP_CS35L56_I2C_4,
7502 ALC285_FIXUP_ASUS_GA403U,
0672b017
VT
7503 ALC285_FIXUP_ASUS_GA403U_HEADSET_MIC,
7504 ALC285_FIXUP_ASUS_GA403U_I2C_SPEAKER2_TO_DAC1,
7505 ALC285_FIXUP_ASUS_GU605_SPI_2_HEADSET_MIC,
1e707769
KY
7506 ALC285_FIXUP_ASUS_GU605_SPI_SPEAKER2_TO_DAC1,
7507 ALC287_FIXUP_LENOVO_THKPAD_WH_ALC1318,
f1d4e28b
KY
7508};
7509
56ec3e75
TI
7510/* A special fixup for Lenovo C940 and Yoga Duet 7;
7511 * both have the very same PCI SSID, and we need to apply different fixups
7512 * depending on the codec ID
7513 */
7514static void alc298_fixup_lenovo_c940_duet7(struct hda_codec *codec,
7515 const struct hda_fixup *fix,
7516 int action)
7517{
7518 int id;
7519
7520 if (codec->core.vendor_id == 0x10ec0298)
7521 id = ALC298_FIXUP_LENOVO_SPK_VOLUME; /* C940 */
7522 else
7523 id = ALC287_FIXUP_YOGA7_14ITL_SPEAKERS; /* Duet 7 */
7524 __snd_hda_apply_fixup(codec, id, action, 0);
7525}
7526
0ac32a39
WW
7527/* A special fixup for Lenovo Slim/Yoga Pro 9 14IRP8 and Yoga DuetITL 2021;
7528 * 14IRP8 PCI SSID will mistakenly be matched with the DuetITL codec SSID,
7529 * so we need to apply a different fixup in this case. The only DuetITL codec
7530 * SSID reported so far is the 17aa:3802 while the 14IRP8 has the 17aa:38be
7531 * and 17aa:38bf. If it weren't for the PCI SSID, the 14IRP8 models would
7532 * have matched correctly by their codecs.
7533 */
7534static void alc287_fixup_lenovo_14irp8_duetitl(struct hda_codec *codec,
7535 const struct hda_fixup *fix,
7536 int action)
7537{
7538 int id;
7539
7540 if (codec->core.subsystem_id == 0x17aa3802)
7541 id = ALC287_FIXUP_YOGA7_14ITL_SPEAKERS; /* DuetITL */
7542 else
7543 id = ALC287_FIXUP_TAS2781_I2C; /* 14IRP8 */
7544 __snd_hda_apply_fixup(codec, id, action, 0);
7545}
7546
39815cdf
TI
7547/* Another hilarious PCI SSID conflict with Lenovo Legion Pro 7 16ARX8H (with
7548 * TAS2781 codec) and Legion 7i 16IAX7 (with CS35L41 codec);
7549 * we apply a corresponding fixup depending on the codec SSID instead
7550 */
7551static void alc287_fixup_lenovo_legion_7(struct hda_codec *codec,
7552 const struct hda_fixup *fix,
7553 int action)
7554{
7555 int id;
7556
7557 if (codec->core.subsystem_id == 0x17aa38a8)
7558 id = ALC287_FIXUP_TAS2781_I2C; /* Legion Pro 7 16ARX8H */
7559 else
7560 id = ALC287_FIXUP_CS35L41_I2C_2; /* Legion 7i 16IAX7 */
7561 __snd_hda_apply_fixup(codec, id, action, 0);
7562}
7563
1727a771 7564static const struct hda_fixup alc269_fixups[] = {
f73bbf63
KHF
7565 [ALC269_FIXUP_GPIO2] = {
7566 .type = HDA_FIXUP_FUNC,
7567 .v.func = alc_fixup_gpio2,
7568 },
1d045db9 7569 [ALC269_FIXUP_SONY_VAIO] = {
fd108215
TI
7570 .type = HDA_FIXUP_PINCTLS,
7571 .v.pins = (const struct hda_pintbl[]) {
7572 {0x19, PIN_VREFGRD},
1d045db9
TI
7573 {}
7574 }
f1d4e28b 7575 },
1d045db9 7576 [ALC275_FIXUP_SONY_VAIO_GPIO2] = {
ae065f1c
TI
7577 .type = HDA_FIXUP_FUNC,
7578 .v.func = alc275_fixup_gpio4_off,
1d045db9
TI
7579 .chained = true,
7580 .chain_id = ALC269_FIXUP_SONY_VAIO
7581 },
7582 [ALC269_FIXUP_DELL_M101Z] = {
1727a771 7583 .type = HDA_FIXUP_VERBS,
1d045db9
TI
7584 .v.verbs = (const struct hda_verb[]) {
7585 /* Enables internal speaker */
7586 {0x20, AC_VERB_SET_COEF_INDEX, 13},
7587 {0x20, AC_VERB_SET_PROC_COEF, 0x4040},
7588 {}
7589 }
7590 },
7591 [ALC269_FIXUP_SKU_IGNORE] = {
1727a771 7592 .type = HDA_FIXUP_FUNC,
23d30f28 7593 .v.func = alc_fixup_sku_ignore,
1d045db9
TI
7594 },
7595 [ALC269_FIXUP_ASUS_G73JW] = {
1727a771
TI
7596 .type = HDA_FIXUP_PINS,
7597 .v.pins = (const struct hda_pintbl[]) {
1d045db9
TI
7598 { 0x17, 0x99130111 }, /* subwoofer */
7599 { }
7600 }
7601 },
e959f2be
PLB
7602 [ALC269_FIXUP_ASUS_N7601ZM_PINS] = {
7603 .type = HDA_FIXUP_PINS,
7604 .v.pins = (const struct hda_pintbl[]) {
7605 { 0x19, 0x03A11050 },
7606 { 0x1a, 0x03A11C30 },
7607 { 0x21, 0x03211420 },
7608 { }
7609 }
7610 },
7611 [ALC269_FIXUP_ASUS_N7601ZM] = {
7612 .type = HDA_FIXUP_VERBS,
7613 .v.verbs = (const struct hda_verb[]) {
7614 {0x20, AC_VERB_SET_COEF_INDEX, 0x62},
7615 {0x20, AC_VERB_SET_PROC_COEF, 0xa007},
7616 {0x20, AC_VERB_SET_COEF_INDEX, 0x10},
7617 {0x20, AC_VERB_SET_PROC_COEF, 0x8420},
7618 {0x20, AC_VERB_SET_COEF_INDEX, 0x0f},
7619 {0x20, AC_VERB_SET_PROC_COEF, 0x7774},
7620 { }
7621 },
7622 .chained = true,
7623 .chain_id = ALC269_FIXUP_ASUS_N7601ZM_PINS,
7624 },
1d045db9 7625 [ALC269_FIXUP_LENOVO_EAPD] = {
1727a771 7626 .type = HDA_FIXUP_VERBS,
1d045db9
TI
7627 .v.verbs = (const struct hda_verb[]) {
7628 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
7629 {}
7630 }
7631 },
7632 [ALC275_FIXUP_SONY_HWEQ] = {
1727a771 7633 .type = HDA_FIXUP_FUNC,
1d045db9
TI
7634 .v.func = alc269_fixup_hweq,
7635 .chained = true,
7636 .chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
7637 },
e9bd7d5c
TI
7638 [ALC275_FIXUP_SONY_DISABLE_AAMIX] = {
7639 .type = HDA_FIXUP_FUNC,
7640 .v.func = alc_fixup_disable_aamix,
7641 .chained = true,
7642 .chain_id = ALC269_FIXUP_SONY_VAIO
7643 },
1d045db9 7644 [ALC271_FIXUP_DMIC] = {
1727a771 7645 .type = HDA_FIXUP_FUNC,
1d045db9 7646 .v.func = alc271_fixup_dmic,
f1d4e28b 7647 },
017f2a10 7648 [ALC269_FIXUP_PCM_44K] = {
1727a771 7649 .type = HDA_FIXUP_FUNC,
017f2a10 7650 .v.func = alc269_fixup_pcm_44k,
012e7eb1
DH
7651 .chained = true,
7652 .chain_id = ALC269_FIXUP_QUANTA_MUTE
017f2a10 7653 },
adabb3ec 7654 [ALC269_FIXUP_STEREO_DMIC] = {
1727a771 7655 .type = HDA_FIXUP_FUNC,
adabb3ec
TI
7656 .v.func = alc269_fixup_stereo_dmic,
7657 },
7c478f03
DH
7658 [ALC269_FIXUP_HEADSET_MIC] = {
7659 .type = HDA_FIXUP_FUNC,
7660 .v.func = alc269_fixup_headset_mic,
7661 },
24519911 7662 [ALC269_FIXUP_QUANTA_MUTE] = {
1727a771 7663 .type = HDA_FIXUP_FUNC,
24519911
TI
7664 .v.func = alc269_fixup_quanta_mute,
7665 },
7666 [ALC269_FIXUP_LIFEBOOK] = {
1727a771
TI
7667 .type = HDA_FIXUP_PINS,
7668 .v.pins = (const struct hda_pintbl[]) {
24519911
TI
7669 { 0x1a, 0x2101103f }, /* dock line-out */
7670 { 0x1b, 0x23a11040 }, /* dock mic-in */
7671 { }
7672 },
7673 .chained = true,
7674 .chain_id = ALC269_FIXUP_QUANTA_MUTE
7675 },
2041d564
DH
7676 [ALC269_FIXUP_LIFEBOOK_EXTMIC] = {
7677 .type = HDA_FIXUP_PINS,
7678 .v.pins = (const struct hda_pintbl[]) {
7679 { 0x19, 0x01a1903c }, /* headset mic, with jack detect */
7680 { }
7681 },
7682 },
cc7016ab
TI
7683 [ALC269_FIXUP_LIFEBOOK_HP_PIN] = {
7684 .type = HDA_FIXUP_PINS,
7685 .v.pins = (const struct hda_pintbl[]) {
7686 { 0x21, 0x0221102f }, /* HP out */
7687 { }
7688 },
7689 },
4df3fd17
TI
7690 [ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT] = {
7691 .type = HDA_FIXUP_FUNC,
7692 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
7693 },
fdcc968a
JMG
7694 [ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC] = {
7695 .type = HDA_FIXUP_FUNC,
7696 .v.func = alc269_fixup_pincfg_U7x7_headset_mic,
7697 },
7c9caa29
VK
7698 [ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO] = {
7699 .type = HDA_FIXUP_PINS,
7700 .v.pins = (const struct hda_pintbl[]) {
7701 { 0x18, 0x03a19020 }, /* headset mic */
7702 { 0x1b, 0x90170150 }, /* speaker */
7703 { }
7704 },
7705 },
a4297b5d 7706 [ALC269_FIXUP_AMIC] = {
1727a771
TI
7707 .type = HDA_FIXUP_PINS,
7708 .v.pins = (const struct hda_pintbl[]) {
a4297b5d
TI
7709 { 0x14, 0x99130110 }, /* speaker */
7710 { 0x15, 0x0121401f }, /* HP out */
7711 { 0x18, 0x01a19c20 }, /* mic */
7712 { 0x19, 0x99a3092f }, /* int-mic */
7713 { }
7714 },
7715 },
7716 [ALC269_FIXUP_DMIC] = {
1727a771
TI
7717 .type = HDA_FIXUP_PINS,
7718 .v.pins = (const struct hda_pintbl[]) {
a4297b5d
TI
7719 { 0x12, 0x99a3092f }, /* int-mic */
7720 { 0x14, 0x99130110 }, /* speaker */
7721 { 0x15, 0x0121401f }, /* HP out */
7722 { 0x18, 0x01a19c20 }, /* mic */
7723 { }
7724 },
7725 },
7726 [ALC269VB_FIXUP_AMIC] = {
1727a771
TI
7727 .type = HDA_FIXUP_PINS,
7728 .v.pins = (const struct hda_pintbl[]) {
a4297b5d
TI
7729 { 0x14, 0x99130110 }, /* speaker */
7730 { 0x18, 0x01a19c20 }, /* mic */
7731 { 0x19, 0x99a3092f }, /* int-mic */
7732 { 0x21, 0x0121401f }, /* HP out */
7733 { }
7734 },
7735 },
2267ea97 7736 [ALC269VB_FIXUP_DMIC] = {
1727a771
TI
7737 .type = HDA_FIXUP_PINS,
7738 .v.pins = (const struct hda_pintbl[]) {
a4297b5d
TI
7739 { 0x12, 0x99a3092f }, /* int-mic */
7740 { 0x14, 0x99130110 }, /* speaker */
7741 { 0x18, 0x01a19c20 }, /* mic */
7742 { 0x21, 0x0121401f }, /* HP out */
7743 { }
7744 },
7745 },
08fb0d0e 7746 [ALC269_FIXUP_HP_MUTE_LED] = {
1727a771 7747 .type = HDA_FIXUP_FUNC,
08fb0d0e 7748 .v.func = alc269_fixup_hp_mute_led,
6d3cd5d4 7749 },
d06ac143
DH
7750 [ALC269_FIXUP_HP_MUTE_LED_MIC1] = {
7751 .type = HDA_FIXUP_FUNC,
7752 .v.func = alc269_fixup_hp_mute_led_mic1,
7753 },
08fb0d0e 7754 [ALC269_FIXUP_HP_MUTE_LED_MIC2] = {
1727a771 7755 .type = HDA_FIXUP_FUNC,
08fb0d0e 7756 .v.func = alc269_fixup_hp_mute_led_mic2,
420b0feb 7757 },
7f783bd5
TB
7758 [ALC269_FIXUP_HP_MUTE_LED_MIC3] = {
7759 .type = HDA_FIXUP_FUNC,
7760 .v.func = alc269_fixup_hp_mute_led_mic3,
e8ed64b0
GKK
7761 .chained = true,
7762 .chain_id = ALC295_FIXUP_HP_AUTO_MUTE
7f783bd5 7763 },
9f5c6faf
TI
7764 [ALC269_FIXUP_HP_GPIO_LED] = {
7765 .type = HDA_FIXUP_FUNC,
7766 .v.func = alc269_fixup_hp_gpio_led,
7767 },
9c5dc3bf
KY
7768 [ALC269_FIXUP_HP_GPIO_MIC1_LED] = {
7769 .type = HDA_FIXUP_FUNC,
7770 .v.func = alc269_fixup_hp_gpio_mic1_led,
7771 },
7772 [ALC269_FIXUP_HP_LINE1_MIC1_LED] = {
7773 .type = HDA_FIXUP_FUNC,
7774 .v.func = alc269_fixup_hp_line1_mic1_led,
7775 },
693b613d 7776 [ALC269_FIXUP_INV_DMIC] = {
1727a771 7777 .type = HDA_FIXUP_FUNC,
9d36a7dc 7778 .v.func = alc_fixup_inv_dmic,
693b613d 7779 },
9b745ab8
TI
7780 [ALC269_FIXUP_NO_SHUTUP] = {
7781 .type = HDA_FIXUP_FUNC,
7782 .v.func = alc_fixup_no_shutup,
7783 },
108cc108 7784 [ALC269_FIXUP_LENOVO_DOCK] = {
1727a771
TI
7785 .type = HDA_FIXUP_PINS,
7786 .v.pins = (const struct hda_pintbl[]) {
108cc108
DH
7787 { 0x19, 0x23a11040 }, /* dock mic */
7788 { 0x1b, 0x2121103f }, /* dock headphone */
7789 { }
7790 },
7791 .chained = true,
7792 .chain_id = ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT
7793 },
b590b38c
TI
7794 [ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST] = {
7795 .type = HDA_FIXUP_FUNC,
7796 .v.func = alc269_fixup_limit_int_mic_boost,
7797 .chained = true,
7798 .chain_id = ALC269_FIXUP_LENOVO_DOCK,
7799 },
108cc108 7800 [ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT] = {
1727a771 7801 .type = HDA_FIXUP_FUNC,
108cc108 7802 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
52129000
DH
7803 .chained = true,
7804 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
108cc108 7805 },
73bdd597
DH
7806 [ALC269_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7807 .type = HDA_FIXUP_PINS,
7808 .v.pins = (const struct hda_pintbl[]) {
7809 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7810 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7811 { }
7812 },
7813 .chained = true,
7814 .chain_id = ALC269_FIXUP_HEADSET_MODE
7815 },
7816 [ALC269_FIXUP_DELL2_MIC_NO_PRESENCE] = {
7817 .type = HDA_FIXUP_PINS,
7818 .v.pins = (const struct hda_pintbl[]) {
7819 { 0x16, 0x21014020 }, /* dock line out */
7820 { 0x19, 0x21a19030 }, /* dock mic */
7821 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7822 { }
7823 },
7824 .chained = true,
7825 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7826 },
338cae56
DH
7827 [ALC269_FIXUP_DELL3_MIC_NO_PRESENCE] = {
7828 .type = HDA_FIXUP_PINS,
7829 .v.pins = (const struct hda_pintbl[]) {
7830 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7831 { }
7832 },
7833 .chained = true,
7834 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7835 },
fcc6c877
KY
7836 [ALC269_FIXUP_DELL4_MIC_NO_PRESENCE] = {
7837 .type = HDA_FIXUP_PINS,
7838 .v.pins = (const struct hda_pintbl[]) {
7839 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7840 { 0x1b, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7841 { }
7842 },
7843 .chained = true,
7844 .chain_id = ALC269_FIXUP_HEADSET_MODE
7845 },
73bdd597
DH
7846 [ALC269_FIXUP_HEADSET_MODE] = {
7847 .type = HDA_FIXUP_FUNC,
7848 .v.func = alc_fixup_headset_mode,
6676f308 7849 .chained = true,
b3802783 7850 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
73bdd597
DH
7851 },
7852 [ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
7853 .type = HDA_FIXUP_FUNC,
7854 .v.func = alc_fixup_headset_mode_no_hp_mic,
7855 },
7819717b
TI
7856 [ALC269_FIXUP_ASPIRE_HEADSET_MIC] = {
7857 .type = HDA_FIXUP_PINS,
7858 .v.pins = (const struct hda_pintbl[]) {
7859 { 0x19, 0x01a1913c }, /* headset mic w/o jack detect */
7860 { }
7861 },
7862 .chained = true,
7863 .chain_id = ALC269_FIXUP_HEADSET_MODE,
7864 },
88cfcf86
DH
7865 [ALC286_FIXUP_SONY_MIC_NO_PRESENCE] = {
7866 .type = HDA_FIXUP_PINS,
7867 .v.pins = (const struct hda_pintbl[]) {
7868 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7869 { }
7870 },
fbc78ad6
DH
7871 .chained = true,
7872 .chain_id = ALC269_FIXUP_HEADSET_MIC
88cfcf86 7873 },
0fbf21c3 7874 [ALC256_FIXUP_HUAWEI_MACH_WX9_PINS] = {
8ac51bbc
AB
7875 .type = HDA_FIXUP_PINS,
7876 .v.pins = (const struct hda_pintbl[]) {
7877 {0x12, 0x90a60130},
7878 {0x13, 0x40000000},
7879 {0x14, 0x90170110},
7880 {0x18, 0x411111f0},
7881 {0x19, 0x04a11040},
7882 {0x1a, 0x411111f0},
7883 {0x1b, 0x90170112},
7884 {0x1d, 0x40759a05},
7885 {0x1e, 0x411111f0},
7886 {0x21, 0x04211020},
7887 { }
7888 },
e2744fd7
AB
7889 .chained = true,
7890 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
8ac51bbc 7891 },
a2ef03fe
TE
7892 [ALC298_FIXUP_HUAWEI_MBX_STEREO] = {
7893 .type = HDA_FIXUP_FUNC,
7894 .v.func = alc298_fixup_huawei_mbx_stereo,
7895 .chained = true,
7896 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
7897 },
d240d1dc
DH
7898 [ALC269_FIXUP_ASUS_X101_FUNC] = {
7899 .type = HDA_FIXUP_FUNC,
7900 .v.func = alc269_fixup_x101_headset_mic,
7901 },
7902 [ALC269_FIXUP_ASUS_X101_VERB] = {
7903 .type = HDA_FIXUP_VERBS,
7904 .v.verbs = (const struct hda_verb[]) {
7905 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
7906 {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
7907 {0x20, AC_VERB_SET_PROC_COEF, 0x0310},
7908 { }
7909 },
7910 .chained = true,
7911 .chain_id = ALC269_FIXUP_ASUS_X101_FUNC
7912 },
7913 [ALC269_FIXUP_ASUS_X101] = {
7914 .type = HDA_FIXUP_PINS,
7915 .v.pins = (const struct hda_pintbl[]) {
7916 { 0x18, 0x04a1182c }, /* Headset mic */
7917 { }
7918 },
7919 .chained = true,
7920 .chain_id = ALC269_FIXUP_ASUS_X101_VERB
7921 },
08a978db 7922 [ALC271_FIXUP_AMIC_MIC2] = {
1727a771
TI
7923 .type = HDA_FIXUP_PINS,
7924 .v.pins = (const struct hda_pintbl[]) {
08a978db
DR
7925 { 0x14, 0x99130110 }, /* speaker */
7926 { 0x19, 0x01a19c20 }, /* mic */
7927 { 0x1b, 0x99a7012f }, /* int-mic */
7928 { 0x21, 0x0121401f }, /* HP out */
7929 { }
7930 },
7931 },
7932 [ALC271_FIXUP_HP_GATE_MIC_JACK] = {
1727a771 7933 .type = HDA_FIXUP_FUNC,
08a978db
DR
7934 .v.func = alc271_hp_gate_mic_jack,
7935 .chained = true,
7936 .chain_id = ALC271_FIXUP_AMIC_MIC2,
7937 },
b1e8972e
OR
7938 [ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572] = {
7939 .type = HDA_FIXUP_FUNC,
7940 .v.func = alc269_fixup_limit_int_mic_boost,
7941 .chained = true,
7942 .chain_id = ALC271_FIXUP_HP_GATE_MIC_JACK,
7943 },
42397004
DR
7944 [ALC269_FIXUP_ACER_AC700] = {
7945 .type = HDA_FIXUP_PINS,
7946 .v.pins = (const struct hda_pintbl[]) {
7947 { 0x12, 0x99a3092f }, /* int-mic */
7948 { 0x14, 0x99130110 }, /* speaker */
7949 { 0x18, 0x03a11c20 }, /* mic */
7950 { 0x1e, 0x0346101e }, /* SPDIF1 */
7951 { 0x21, 0x0321101f }, /* HP out */
7952 { }
7953 },
7954 .chained = true,
7955 .chain_id = ALC271_FIXUP_DMIC,
7956 },
3e0d611b
DH
7957 [ALC269_FIXUP_LIMIT_INT_MIC_BOOST] = {
7958 .type = HDA_FIXUP_FUNC,
7959 .v.func = alc269_fixup_limit_int_mic_boost,
2793769f
DH
7960 .chained = true,
7961 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
3e0d611b 7962 },
2cede303
OR
7963 [ALC269VB_FIXUP_ASUS_ZENBOOK] = {
7964 .type = HDA_FIXUP_FUNC,
7965 .v.func = alc269_fixup_limit_int_mic_boost,
7966 .chained = true,
7967 .chain_id = ALC269VB_FIXUP_DMIC,
7968 },
23870831
TI
7969 [ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A] = {
7970 .type = HDA_FIXUP_VERBS,
7971 .v.verbs = (const struct hda_verb[]) {
7972 /* class-D output amp +5dB */
7973 { 0x20, AC_VERB_SET_COEF_INDEX, 0x12 },
7974 { 0x20, AC_VERB_SET_PROC_COEF, 0x2800 },
7975 {}
7976 },
7977 .chained = true,
7978 .chain_id = ALC269VB_FIXUP_ASUS_ZENBOOK,
7979 },
f882c4be
MT
7980 [ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7981 .type = HDA_FIXUP_PINS,
7982 .v.pins = (const struct hda_pintbl[]) {
7983 { 0x18, 0x01a110f0 }, /* use as headset mic */
7984 { }
7985 },
7986 .chained = true,
7987 .chain_id = ALC269_FIXUP_HEADSET_MIC
7988 },
8e35cd4a
DH
7989 [ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED] = {
7990 .type = HDA_FIXUP_FUNC,
7991 .v.func = alc269_fixup_limit_int_mic_boost,
7992 .chained = true,
7993 .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC1,
7994 },
02b504d9
AA
7995 [ALC269VB_FIXUP_ORDISSIMO_EVE2] = {
7996 .type = HDA_FIXUP_PINS,
7997 .v.pins = (const struct hda_pintbl[]) {
7998 { 0x12, 0x99a3092f }, /* int-mic */
7999 { 0x18, 0x03a11d20 }, /* mic */
8000 { 0x19, 0x411111f0 }, /* Unused bogus pin */
8001 { }
8002 },
8003 },
cd217a63
KY
8004 [ALC283_FIXUP_CHROME_BOOK] = {
8005 .type = HDA_FIXUP_FUNC,
8006 .v.func = alc283_fixup_chromebook,
8007 },
0202e99c
KY
8008 [ALC283_FIXUP_SENSE_COMBO_JACK] = {
8009 .type = HDA_FIXUP_FUNC,
8010 .v.func = alc283_fixup_sense_combo_jack,
8011 .chained = true,
8012 .chain_id = ALC283_FIXUP_CHROME_BOOK,
8013 },
7bba2157
TI
8014 [ALC282_FIXUP_ASUS_TX300] = {
8015 .type = HDA_FIXUP_FUNC,
8016 .v.func = alc282_fixup_asus_tx300,
8017 },
1bb3e062
KY
8018 [ALC283_FIXUP_INT_MIC] = {
8019 .type = HDA_FIXUP_VERBS,
8020 .v.verbs = (const struct hda_verb[]) {
8021 {0x20, AC_VERB_SET_COEF_INDEX, 0x1a},
8022 {0x20, AC_VERB_SET_PROC_COEF, 0x0011},
8023 { }
8024 },
8025 .chained = true,
8026 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
8027 },
0f4881dc
DH
8028 [ALC290_FIXUP_SUBWOOFER_HSJACK] = {
8029 .type = HDA_FIXUP_PINS,
8030 .v.pins = (const struct hda_pintbl[]) {
8031 { 0x17, 0x90170112 }, /* subwoofer */
8032 { }
8033 },
8034 .chained = true,
8035 .chain_id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
8036 },
8037 [ALC290_FIXUP_SUBWOOFER] = {
8038 .type = HDA_FIXUP_PINS,
8039 .v.pins = (const struct hda_pintbl[]) {
8040 { 0x17, 0x90170112 }, /* subwoofer */
8041 { }
8042 },
8043 .chained = true,
8044 .chain_id = ALC290_FIXUP_MONO_SPEAKERS,
8045 },
338cae56
DH
8046 [ALC290_FIXUP_MONO_SPEAKERS] = {
8047 .type = HDA_FIXUP_FUNC,
8048 .v.func = alc290_fixup_mono_speakers,
0f4881dc
DH
8049 },
8050 [ALC290_FIXUP_MONO_SPEAKERS_HSJACK] = {
8051 .type = HDA_FIXUP_FUNC,
8052 .v.func = alc290_fixup_mono_speakers,
338cae56
DH
8053 .chained = true,
8054 .chain_id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
8055 },
b67ae3f1
DH
8056 [ALC269_FIXUP_THINKPAD_ACPI] = {
8057 .type = HDA_FIXUP_FUNC,
d5a6cabf 8058 .v.func = alc_fixup_thinkpad_acpi,
09da111a
TI
8059 .chained = true,
8060 .chain_id = ALC269_FIXUP_SKU_IGNORE,
b67ae3f1 8061 },
56f27013
DH
8062 [ALC269_FIXUP_DMIC_THINKPAD_ACPI] = {
8063 .type = HDA_FIXUP_FUNC,
8064 .v.func = alc_fixup_inv_dmic,
8065 .chained = true,
8066 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
8067 },
5824ce8d 8068 [ALC255_FIXUP_ACER_MIC_NO_PRESENCE] = {
17d30460
HW
8069 .type = HDA_FIXUP_PINS,
8070 .v.pins = (const struct hda_pintbl[]) {
8071 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8072 { }
5824ce8d
CC
8073 },
8074 .chained = true,
17d30460 8075 .chain_id = ALC255_FIXUP_HEADSET_MODE
5824ce8d 8076 },
615966ad
CC
8077 [ALC255_FIXUP_ASUS_MIC_NO_PRESENCE] = {
8078 .type = HDA_FIXUP_PINS,
8079 .v.pins = (const struct hda_pintbl[]) {
8080 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8081 { }
8082 },
8083 .chained = true,
8084 .chain_id = ALC255_FIXUP_HEADSET_MODE
8085 },
9a22a8f5
KY
8086 [ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = {
8087 .type = HDA_FIXUP_PINS,
8088 .v.pins = (const struct hda_pintbl[]) {
8089 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8090 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
8091 { }
8092 },
8093 .chained = true,
8094 .chain_id = ALC255_FIXUP_HEADSET_MODE
8095 },
31278997
KY
8096 [ALC255_FIXUP_DELL2_MIC_NO_PRESENCE] = {
8097 .type = HDA_FIXUP_PINS,
8098 .v.pins = (const struct hda_pintbl[]) {
8099 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8100 { }
8101 },
8102 .chained = true,
8103 .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
8104 },
9a22a8f5
KY
8105 [ALC255_FIXUP_HEADSET_MODE] = {
8106 .type = HDA_FIXUP_FUNC,
8107 .v.func = alc_fixup_headset_mode_alc255,
4a83d42a 8108 .chained = true,
b3802783 8109 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
9a22a8f5 8110 },
31278997
KY
8111 [ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
8112 .type = HDA_FIXUP_FUNC,
8113 .v.func = alc_fixup_headset_mode_alc255_no_hp_mic,
8114 },
a22aa26f
KY
8115 [ALC293_FIXUP_DELL1_MIC_NO_PRESENCE] = {
8116 .type = HDA_FIXUP_PINS,
8117 .v.pins = (const struct hda_pintbl[]) {
8118 { 0x18, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
8119 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8120 { }
8121 },
8122 .chained = true,
8123 .chain_id = ALC269_FIXUP_HEADSET_MODE
8124 },
1c37c223 8125 [ALC292_FIXUP_TPT440_DOCK] = {
ec56af67 8126 .type = HDA_FIXUP_FUNC,
7f57d803 8127 .v.func = alc_fixup_tpt440_dock,
1c37c223
TI
8128 .chained = true,
8129 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
8130 },
9a811230
TI
8131 [ALC292_FIXUP_TPT440] = {
8132 .type = HDA_FIXUP_FUNC,
157f0b7f 8133 .v.func = alc_fixup_disable_aamix,
9a811230
TI
8134 .chained = true,
8135 .chain_id = ALC292_FIXUP_TPT440_DOCK,
8136 },
abaa2274 8137 [ALC283_FIXUP_HEADSET_MIC] = {
9dc12862
DD
8138 .type = HDA_FIXUP_PINS,
8139 .v.pins = (const struct hda_pintbl[]) {
8140 { 0x19, 0x04a110f0 },
8141 { },
8142 },
8143 },
b3802783 8144 [ALC255_FIXUP_MIC_MUTE_LED] = {
00ef9940 8145 .type = HDA_FIXUP_FUNC,
8a503555 8146 .v.func = alc_fixup_micmute_led,
00ef9940 8147 },
1a22e775
TI
8148 [ALC282_FIXUP_ASPIRE_V5_PINS] = {
8149 .type = HDA_FIXUP_PINS,
8150 .v.pins = (const struct hda_pintbl[]) {
8151 { 0x12, 0x90a60130 },
8152 { 0x14, 0x90170110 },
8153 { 0x17, 0x40000008 },
8154 { 0x18, 0x411111f0 },
0420694d 8155 { 0x19, 0x01a1913c },
1a22e775
TI
8156 { 0x1a, 0x411111f0 },
8157 { 0x1b, 0x411111f0 },
8158 { 0x1d, 0x40f89b2d },
8159 { 0x1e, 0x411111f0 },
8160 { 0x21, 0x0321101f },
8161 { },
8162 },
8163 },
c8426b27
TI
8164 [ALC269VB_FIXUP_ASPIRE_E1_COEF] = {
8165 .type = HDA_FIXUP_FUNC,
8166 .v.func = alc269vb_fixup_aspire_e1_coef,
8167 },
7a5255f1
DH
8168 [ALC280_FIXUP_HP_GPIO4] = {
8169 .type = HDA_FIXUP_FUNC,
8170 .v.func = alc280_fixup_hp_gpio4,
8171 },
eaa8e5ef
KY
8172 [ALC286_FIXUP_HP_GPIO_LED] = {
8173 .type = HDA_FIXUP_FUNC,
8174 .v.func = alc286_fixup_hp_gpio_led,
8175 },
33f4acd3
DH
8176 [ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY] = {
8177 .type = HDA_FIXUP_FUNC,
8178 .v.func = alc280_fixup_hp_gpio2_mic_hotkey,
8179 },
b4b33f9d
TC
8180 [ALC280_FIXUP_HP_DOCK_PINS] = {
8181 .type = HDA_FIXUP_PINS,
8182 .v.pins = (const struct hda_pintbl[]) {
8183 { 0x1b, 0x21011020 }, /* line-out */
8184 { 0x1a, 0x01a1903c }, /* headset mic */
8185 { 0x18, 0x2181103f }, /* line-in */
8186 { },
8187 },
8188 .chained = true,
8189 .chain_id = ALC280_FIXUP_HP_GPIO4
8190 },
04d5466a
JK
8191 [ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED] = {
8192 .type = HDA_FIXUP_PINS,
8193 .v.pins = (const struct hda_pintbl[]) {
8194 { 0x1b, 0x21011020 }, /* line-out */
8195 { 0x18, 0x2181103f }, /* line-in */
8196 { },
8197 },
8198 .chained = true,
8199 .chain_id = ALC269_FIXUP_HP_GPIO_MIC1_LED
8200 },
98973f2f
KP
8201 [ALC280_FIXUP_HP_9480M] = {
8202 .type = HDA_FIXUP_FUNC,
8203 .v.func = alc280_fixup_hp_9480m,
8204 },
c3bb2b52
TI
8205 [ALC245_FIXUP_HP_X360_AMP] = {
8206 .type = HDA_FIXUP_FUNC,
8207 .v.func = alc245_fixup_hp_x360_amp,
5fc462c3
JC
8208 .chained = true,
8209 .chain_id = ALC245_FIXUP_HP_GPIO_LED
c3bb2b52 8210 },
e1e62b98
KY
8211 [ALC288_FIXUP_DELL_HEADSET_MODE] = {
8212 .type = HDA_FIXUP_FUNC,
8213 .v.func = alc_fixup_headset_mode_dell_alc288,
8214 .chained = true,
b3802783 8215 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
e1e62b98
KY
8216 },
8217 [ALC288_FIXUP_DELL1_MIC_NO_PRESENCE] = {
8218 .type = HDA_FIXUP_PINS,
8219 .v.pins = (const struct hda_pintbl[]) {
8220 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8221 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
8222 { }
8223 },
8224 .chained = true,
8225 .chain_id = ALC288_FIXUP_DELL_HEADSET_MODE
8226 },
831bfdf9
HW
8227 [ALC288_FIXUP_DISABLE_AAMIX] = {
8228 .type = HDA_FIXUP_FUNC,
8229 .v.func = alc_fixup_disable_aamix,
8230 .chained = true,
d44a6864 8231 .chain_id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE
831bfdf9
HW
8232 },
8233 [ALC288_FIXUP_DELL_XPS_13] = {
8234 .type = HDA_FIXUP_FUNC,
8235 .v.func = alc_fixup_dell_xps13,
8236 .chained = true,
8237 .chain_id = ALC288_FIXUP_DISABLE_AAMIX
8238 },
8b99aba7
TI
8239 [ALC292_FIXUP_DISABLE_AAMIX] = {
8240 .type = HDA_FIXUP_FUNC,
8241 .v.func = alc_fixup_disable_aamix,
831bfdf9
HW
8242 .chained = true,
8243 .chain_id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE
8b99aba7 8244 },
c04017ea
DH
8245 [ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK] = {
8246 .type = HDA_FIXUP_FUNC,
8247 .v.func = alc_fixup_disable_aamix,
8248 .chained = true,
8249 .chain_id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE
8250 },
5fab5829 8251 [ALC292_FIXUP_DELL_E7X_AAMIX] = {
8b99aba7
TI
8252 .type = HDA_FIXUP_FUNC,
8253 .v.func = alc_fixup_dell_xps13,
8254 .chained = true,
8255 .chain_id = ALC292_FIXUP_DISABLE_AAMIX
8256 },
5fab5829
TI
8257 [ALC292_FIXUP_DELL_E7X] = {
8258 .type = HDA_FIXUP_FUNC,
8a503555 8259 .v.func = alc_fixup_micmute_led,
5fab5829
TI
8260 /* micmute fixup must be applied at last */
8261 .chained_before = true,
8262 .chain_id = ALC292_FIXUP_DELL_E7X_AAMIX,
8263 },
54324221
JM
8264 [ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE] = {
8265 .type = HDA_FIXUP_PINS,
8266 .v.pins = (const struct hda_pintbl[]) {
8267 { 0x18, 0x01a1913c }, /* headset mic w/o jack detect */
8268 { }
8269 },
8270 .chained_before = true,
8271 .chain_id = ALC269_FIXUP_HEADSET_MODE,
8272 },
977e6276
KY
8273 [ALC298_FIXUP_DELL1_MIC_NO_PRESENCE] = {
8274 .type = HDA_FIXUP_PINS,
8275 .v.pins = (const struct hda_pintbl[]) {
8276 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8277 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
8278 { }
8279 },
8280 .chained = true,
8281 .chain_id = ALC269_FIXUP_HEADSET_MODE
8282 },
2f726aec
HW
8283 [ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE] = {
8284 .type = HDA_FIXUP_PINS,
8285 .v.pins = (const struct hda_pintbl[]) {
8286 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8287 { }
8288 },
8289 .chained = true,
8290 .chain_id = ALC269_FIXUP_HEADSET_MODE
8291 },
6ed1131f
KY
8292 [ALC275_FIXUP_DELL_XPS] = {
8293 .type = HDA_FIXUP_VERBS,
8294 .v.verbs = (const struct hda_verb[]) {
8295 /* Enables internal speaker */
8296 {0x20, AC_VERB_SET_COEF_INDEX, 0x1f},
8297 {0x20, AC_VERB_SET_PROC_COEF, 0x00c0},
8298 {0x20, AC_VERB_SET_COEF_INDEX, 0x30},
8299 {0x20, AC_VERB_SET_PROC_COEF, 0x00b1},
8300 {}
8301 }
8302 },
23adc192
HW
8303 [ALC293_FIXUP_LENOVO_SPK_NOISE] = {
8304 .type = HDA_FIXUP_FUNC,
8305 .v.func = alc_fixup_disable_aamix,
8306 .chained = true,
8307 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
8308 },
3694cb29
K
8309 [ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY] = {
8310 .type = HDA_FIXUP_FUNC,
8311 .v.func = alc233_fixup_lenovo_line2_mic_hotkey,
8312 },
d1ee66c5
PC
8313 [ALC233_FIXUP_INTEL_NUC8_DMIC] = {
8314 .type = HDA_FIXUP_FUNC,
8315 .v.func = alc_fixup_inv_dmic,
8316 .chained = true,
8317 .chain_id = ALC233_FIXUP_INTEL_NUC8_BOOST,
8318 },
8319 [ALC233_FIXUP_INTEL_NUC8_BOOST] = {
8320 .type = HDA_FIXUP_FUNC,
8321 .v.func = alc269_fixup_limit_int_mic_boost
8322 },
3b43b71f
KHF
8323 [ALC255_FIXUP_DELL_SPK_NOISE] = {
8324 .type = HDA_FIXUP_FUNC,
8325 .v.func = alc_fixup_disable_aamix,
8326 .chained = true,
8327 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
8328 },
d1dd4211
KY
8329 [ALC225_FIXUP_DISABLE_MIC_VREF] = {
8330 .type = HDA_FIXUP_FUNC,
8331 .v.func = alc_fixup_disable_mic_vref,
8332 .chained = true,
8333 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
8334 },
2ae95577
DH
8335 [ALC225_FIXUP_DELL1_MIC_NO_PRESENCE] = {
8336 .type = HDA_FIXUP_VERBS,
8337 .v.verbs = (const struct hda_verb[]) {
8338 /* Disable pass-through path for FRONT 14h */
8339 { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
8340 { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
8341 {}
8342 },
8343 .chained = true,
d1dd4211 8344 .chain_id = ALC225_FIXUP_DISABLE_MIC_VREF
2ae95577 8345 },
f883982d
TI
8346 [ALC280_FIXUP_HP_HEADSET_MIC] = {
8347 .type = HDA_FIXUP_FUNC,
8348 .v.func = alc_fixup_disable_aamix,
8349 .chained = true,
8350 .chain_id = ALC269_FIXUP_HEADSET_MIC,
8351 },
e549d190
HW
8352 [ALC221_FIXUP_HP_FRONT_MIC] = {
8353 .type = HDA_FIXUP_PINS,
8354 .v.pins = (const struct hda_pintbl[]) {
8355 { 0x19, 0x02a19020 }, /* Front Mic */
8356 { }
8357 },
8358 },
c636b95e
SE
8359 [ALC292_FIXUP_TPT460] = {
8360 .type = HDA_FIXUP_FUNC,
8361 .v.func = alc_fixup_tpt440_dock,
8362 .chained = true,
8363 .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE,
8364 },
dd9aa335
HW
8365 [ALC298_FIXUP_SPK_VOLUME] = {
8366 .type = HDA_FIXUP_FUNC,
8367 .v.func = alc298_fixup_speaker_volume,
59ec4b57 8368 .chained = true,
2f726aec 8369 .chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
dd9aa335 8370 },
f86de9b1
KY
8371 [ALC298_FIXUP_LENOVO_SPK_VOLUME] = {
8372 .type = HDA_FIXUP_FUNC,
8373 .v.func = alc298_fixup_speaker_volume,
8374 },
e312a869
TI
8375 [ALC295_FIXUP_DISABLE_DAC3] = {
8376 .type = HDA_FIXUP_FUNC,
8377 .v.func = alc295_fixup_disable_dac3,
8378 },
d2cd795c
JK
8379 [ALC285_FIXUP_SPEAKER2_TO_DAC1] = {
8380 .type = HDA_FIXUP_FUNC,
8381 .v.func = alc285_fixup_speaker2_to_dac1,
c37c0ab0
HW
8382 .chained = true,
8383 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
d2cd795c 8384 },
4b963ae1
AS
8385 [ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1] = {
8386 .type = HDA_FIXUP_FUNC,
8387 .v.func = alc285_fixup_speaker2_to_dac1,
8388 .chained = true,
8389 .chain_id = ALC245_FIXUP_CS35L41_SPI_2
8390 },
8391 [ALC285_FIXUP_ASUS_HEADSET_MIC] = {
8392 .type = HDA_FIXUP_PINS,
8393 .v.pins = (const struct hda_pintbl[]) {
8394 { 0x19, 0x03a11050 },
8395 { 0x1b, 0x03a11c30 },
8396 { }
8397 },
8398 .chained = true,
8399 .chain_id = ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1
8400 },
b759a5f0
LJ
8401 [ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS] = {
8402 .type = HDA_FIXUP_PINS,
8403 .v.pins = (const struct hda_pintbl[]) {
8404 { 0x14, 0x90170120 },
8405 { }
8406 },
8407 .chained = true,
8408 .chain_id = ALC285_FIXUP_ASUS_HEADSET_MIC
8409 },
8cc87c05
LJ
8410 [ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1] = {
8411 .type = HDA_FIXUP_FUNC,
8412 .v.func = alc285_fixup_speaker2_to_dac1,
8413 .chained = true,
8414 .chain_id = ALC287_FIXUP_CS35L41_I2C_2
8415 },
8416 [ALC285_FIXUP_ASUS_I2C_HEADSET_MIC] = {
8417 .type = HDA_FIXUP_PINS,
8418 .v.pins = (const struct hda_pintbl[]) {
8419 { 0x19, 0x03a11050 },
8420 { 0x1b, 0x03a11c30 },
8421 { }
8422 },
8423 .chained = true,
8424 .chain_id = ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1
8425 },
fd06c77e
KHF
8426 [ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {
8427 .type = HDA_FIXUP_PINS,
8428 .v.pins = (const struct hda_pintbl[]) {
8429 { 0x1b, 0x90170151 },
8430 { }
8431 },
8432 .chained = true,
8433 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
8434 },
823ff161
GM
8435 [ALC269_FIXUP_ATIV_BOOK_8] = {
8436 .type = HDA_FIXUP_FUNC,
8437 .v.func = alc_fixup_auto_mute_via_amp,
8438 .chained = true,
8439 .chain_id = ALC269_FIXUP_NO_SHUTUP
8440 },
4ba5c853
MT
8441 [ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE] = {
8442 .type = HDA_FIXUP_PINS,
8443 .v.pins = (const struct hda_pintbl[]) {
8444 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8445 { 0x1a, 0x01813030 }, /* use as headphone mic, without its own jack detect */
8446 { }
8447 },
8448 .chained = true,
8449 .chain_id = ALC269_FIXUP_HEADSET_MODE
8450 },
9eb5d0e6
KY
8451 [ALC221_FIXUP_HP_MIC_NO_PRESENCE] = {
8452 .type = HDA_FIXUP_PINS,
8453 .v.pins = (const struct hda_pintbl[]) {
8454 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8455 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
8456 { }
8457 },
8458 .chained = true,
8459 .chain_id = ALC269_FIXUP_HEADSET_MODE
8460 },
c1732ede
CC
8461 [ALC256_FIXUP_ASUS_HEADSET_MODE] = {
8462 .type = HDA_FIXUP_FUNC,
8463 .v.func = alc_fixup_headset_mode,
8464 },
8465 [ALC256_FIXUP_ASUS_MIC] = {
8466 .type = HDA_FIXUP_PINS,
8467 .v.pins = (const struct hda_pintbl[]) {
8468 { 0x13, 0x90a60160 }, /* use as internal mic */
8469 { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
8470 { }
8471 },
8472 .chained = true,
8473 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8474 },
eeed4cd1 8475 [ALC256_FIXUP_ASUS_AIO_GPIO2] = {
ae065f1c
TI
8476 .type = HDA_FIXUP_FUNC,
8477 /* Set up GPIO2 for the speaker amp */
8478 .v.func = alc_fixup_gpio4,
eeed4cd1 8479 },
216d7aeb
CC
8480 [ALC233_FIXUP_ASUS_MIC_NO_PRESENCE] = {
8481 .type = HDA_FIXUP_PINS,
8482 .v.pins = (const struct hda_pintbl[]) {
8483 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8484 { }
8485 },
8486 .chained = true,
8487 .chain_id = ALC269_FIXUP_HEADSET_MIC
8488 },
8489 [ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE] = {
8490 .type = HDA_FIXUP_VERBS,
8491 .v.verbs = (const struct hda_verb[]) {
8492 /* Enables internal speaker */
8493 {0x20, AC_VERB_SET_COEF_INDEX, 0x40},
8494 {0x20, AC_VERB_SET_PROC_COEF, 0x8800},
8495 {}
8496 },
8497 .chained = true,
8498 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
8499 },
ca169cc2
KY
8500 [ALC233_FIXUP_LENOVO_MULTI_CODECS] = {
8501 .type = HDA_FIXUP_FUNC,
8502 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
f73bbf63
KHF
8503 .chained = true,
8504 .chain_id = ALC269_FIXUP_GPIO2
ca169cc2 8505 },
ea5c7eba
JHP
8506 [ALC233_FIXUP_ACER_HEADSET_MIC] = {
8507 .type = HDA_FIXUP_VERBS,
8508 .v.verbs = (const struct hda_verb[]) {
8509 { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
8510 { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
8511 { }
8512 },
8513 .chained = true,
8514 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
8515 },
f33f79f3
HW
8516 [ALC294_FIXUP_LENOVO_MIC_LOCATION] = {
8517 .type = HDA_FIXUP_PINS,
8518 .v.pins = (const struct hda_pintbl[]) {
8519 /* Change the mic location from front to right, otherwise there are
8520 two front mics with the same name, pulseaudio can't handle them.
8521 This is just a temporary workaround, after applying this fixup,
8522 there will be one "Front Mic" and one "Mic" in this machine.
8523 */
8524 { 0x1a, 0x04a19040 },
8525 { }
8526 },
8527 },
5f364135
KY
8528 [ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE] = {
8529 .type = HDA_FIXUP_PINS,
8530 .v.pins = (const struct hda_pintbl[]) {
8531 { 0x16, 0x0101102f }, /* Rear Headset HP */
8532 { 0x19, 0x02a1913c }, /* use as Front headset mic, without its own jack detect */
8533 { 0x1a, 0x01a19030 }, /* Rear Headset MIC */
8534 { 0x1b, 0x02011020 },
8535 { }
8536 },
8537 .chained = true,
52e4e368
KHF
8538 .chain_id = ALC225_FIXUP_S3_POP_NOISE
8539 },
8540 [ALC225_FIXUP_S3_POP_NOISE] = {
8541 .type = HDA_FIXUP_FUNC,
8542 .v.func = alc225_fixup_s3_pop_noise,
8543 .chained = true,
5f364135
KY
8544 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8545 },
b84e8436
PH
8546 [ALC700_FIXUP_INTEL_REFERENCE] = {
8547 .type = HDA_FIXUP_VERBS,
8548 .v.verbs = (const struct hda_verb[]) {
8549 /* Enables internal speaker */
8550 {0x20, AC_VERB_SET_COEF_INDEX, 0x45},
8551 {0x20, AC_VERB_SET_PROC_COEF, 0x5289},
8552 {0x20, AC_VERB_SET_COEF_INDEX, 0x4A},
8553 {0x20, AC_VERB_SET_PROC_COEF, 0x001b},
8554 {0x58, AC_VERB_SET_COEF_INDEX, 0x00},
8555 {0x58, AC_VERB_SET_PROC_COEF, 0x3888},
8556 {0x20, AC_VERB_SET_COEF_INDEX, 0x6f},
8557 {0x20, AC_VERB_SET_PROC_COEF, 0x2c0b},
8558 {}
8559 }
8560 },
92266651
KY
8561 [ALC274_FIXUP_DELL_BIND_DACS] = {
8562 .type = HDA_FIXUP_FUNC,
8563 .v.func = alc274_fixup_bind_dacs,
8564 .chained = true,
8565 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
8566 },
8567 [ALC274_FIXUP_DELL_AIO_LINEOUT_VERB] = {
8568 .type = HDA_FIXUP_PINS,
8569 .v.pins = (const struct hda_pintbl[]) {
8570 { 0x1b, 0x0401102f },
8571 { }
8572 },
8573 .chained = true,
8574 .chain_id = ALC274_FIXUP_DELL_BIND_DACS
8575 },
399c01aa 8576 [ALC298_FIXUP_TPT470_DOCK_FIX] = {
61fcf8ec
KY
8577 .type = HDA_FIXUP_FUNC,
8578 .v.func = alc_fixup_tpt470_dock,
8579 .chained = true,
8580 .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE
8581 },
399c01aa
TI
8582 [ALC298_FIXUP_TPT470_DOCK] = {
8583 .type = HDA_FIXUP_FUNC,
8584 .v.func = alc_fixup_tpt470_dacs,
8585 .chained = true,
8586 .chain_id = ALC298_FIXUP_TPT470_DOCK_FIX
8587 },
ae104a21
KY
8588 [ALC255_FIXUP_DUMMY_LINEOUT_VERB] = {
8589 .type = HDA_FIXUP_PINS,
8590 .v.pins = (const struct hda_pintbl[]) {
8591 { 0x14, 0x0201101f },
8592 { }
8593 },
8594 .chained = true,
8595 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
8596 },
f0ba9d69
KY
8597 [ALC255_FIXUP_DELL_HEADSET_MIC] = {
8598 .type = HDA_FIXUP_PINS,
8599 .v.pins = (const struct hda_pintbl[]) {
8600 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8601 { }
8602 },
3ce0d5aa
HW
8603 .chained = true,
8604 .chain_id = ALC269_FIXUP_HEADSET_MIC
f0ba9d69 8605 },
bbf8ff6b
TB
8606 [ALC295_FIXUP_HP_X360] = {
8607 .type = HDA_FIXUP_FUNC,
8608 .v.func = alc295_fixup_hp_top_speakers,
8609 .chained = true,
8610 .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC3
8a328ac1
KY
8611 },
8612 [ALC221_FIXUP_HP_HEADSET_MIC] = {
8613 .type = HDA_FIXUP_PINS,
8614 .v.pins = (const struct hda_pintbl[]) {
8615 { 0x19, 0x0181313f},
8616 { }
8617 },
8618 .chained = true,
8619 .chain_id = ALC269_FIXUP_HEADSET_MIC
8620 },
c4cfcf6f
HW
8621 [ALC285_FIXUP_LENOVO_HEADPHONE_NOISE] = {
8622 .type = HDA_FIXUP_FUNC,
8623 .v.func = alc285_fixup_invalidate_dacs,
6ba189c5
HW
8624 .chained = true,
8625 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
c4cfcf6f 8626 },
e8ed64b0
GKK
8627 [ALC295_FIXUP_HP_AUTO_MUTE] = {
8628 .type = HDA_FIXUP_FUNC,
8629 .v.func = alc_fixup_auto_mute_via_amp,
8630 },
33aaebd4
CC
8631 [ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE] = {
8632 .type = HDA_FIXUP_PINS,
8633 .v.pins = (const struct hda_pintbl[]) {
8634 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8635 { }
8636 },
8637 .chained = true,
8638 .chain_id = ALC269_FIXUP_HEADSET_MIC
8639 },
d8ae458e
CC
8640 [ALC294_FIXUP_ASUS_MIC] = {
8641 .type = HDA_FIXUP_PINS,
8642 .v.pins = (const struct hda_pintbl[]) {
8643 { 0x13, 0x90a60160 }, /* use as internal mic */
8644 { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
8645 { }
8646 },
8647 .chained = true,
ef9ddb9d 8648 .chain_id = ALC269_FIXUP_HEADSET_MIC
d8ae458e 8649 },
4e051106
JHP
8650 [ALC294_FIXUP_ASUS_HEADSET_MIC] = {
8651 .type = HDA_FIXUP_PINS,
8652 .v.pins = (const struct hda_pintbl[]) {
82b01149 8653 { 0x19, 0x01a1103c }, /* use as headset mic */
4e051106
JHP
8654 { }
8655 },
8656 .chained = true,
ef9ddb9d 8657 .chain_id = ALC269_FIXUP_HEADSET_MIC
4e051106
JHP
8658 },
8659 [ALC294_FIXUP_ASUS_SPK] = {
8660 .type = HDA_FIXUP_VERBS,
8661 .v.verbs = (const struct hda_verb[]) {
8662 /* Set EAPD high */
8663 { 0x20, AC_VERB_SET_COEF_INDEX, 0x40 },
8664 { 0x20, AC_VERB_SET_PROC_COEF, 0x8800 },
473fbe13
KY
8665 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
8666 { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
4e051106
JHP
8667 { }
8668 },
8669 .chained = true,
8670 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8671 },
c8a9afa6 8672 [ALC295_FIXUP_CHROME_BOOK] = {
e854747d 8673 .type = HDA_FIXUP_FUNC,
c8a9afa6 8674 .v.func = alc295_fixup_chromebook,
8983eb60
KY
8675 .chained = true,
8676 .chain_id = ALC225_FIXUP_HEADSET_JACK
8677 },
8678 [ALC225_FIXUP_HEADSET_JACK] = {
8679 .type = HDA_FIXUP_FUNC,
8680 .v.func = alc_fixup_headset_jack,
e854747d 8681 },
89e3a568
JS
8682 [ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
8683 .type = HDA_FIXUP_PINS,
8684 .v.pins = (const struct hda_pintbl[]) {
8685 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8686 { }
8687 },
8688 .chained = true,
8689 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8690 },
c8c6ee61
HW
8691 [ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE] = {
8692 .type = HDA_FIXUP_VERBS,
8693 .v.verbs = (const struct hda_verb[]) {
8694 /* Disable PCBEEP-IN passthrough */
8695 { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
8696 { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
8697 { }
8698 },
8699 .chained = true,
8700 .chain_id = ALC285_FIXUP_LENOVO_HEADPHONE_NOISE
8701 },
cbc05fd6
JHP
8702 [ALC255_FIXUP_ACER_HEADSET_MIC] = {
8703 .type = HDA_FIXUP_PINS,
8704 .v.pins = (const struct hda_pintbl[]) {
8705 { 0x19, 0x03a11130 },
8706 { 0x1a, 0x90a60140 }, /* use as internal mic */
8707 { }
8708 },
8709 .chained = true,
8710 .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
8711 },
136824ef
KY
8712 [ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE] = {
8713 .type = HDA_FIXUP_PINS,
8714 .v.pins = (const struct hda_pintbl[]) {
8715 { 0x16, 0x01011020 }, /* Rear Line out */
8716 { 0x19, 0x01a1913c }, /* use as Front headset mic, without its own jack detect */
8717 { }
8718 },
8719 .chained = true,
8720 .chain_id = ALC225_FIXUP_WYSE_AUTO_MUTE
8721 },
8722 [ALC225_FIXUP_WYSE_AUTO_MUTE] = {
8723 .type = HDA_FIXUP_FUNC,
8724 .v.func = alc_fixup_auto_mute_via_amp,
8725 .chained = true,
8726 .chain_id = ALC225_FIXUP_WYSE_DISABLE_MIC_VREF
8727 },
8728 [ALC225_FIXUP_WYSE_DISABLE_MIC_VREF] = {
8729 .type = HDA_FIXUP_FUNC,
8730 .v.func = alc_fixup_disable_mic_vref,
8731 .chained = true,
8732 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8733 },
667a8f73
JHP
8734 [ALC286_FIXUP_ACER_AIO_HEADSET_MIC] = {
8735 .type = HDA_FIXUP_VERBS,
8736 .v.verbs = (const struct hda_verb[]) {
8737 { 0x20, AC_VERB_SET_COEF_INDEX, 0x4f },
8738 { 0x20, AC_VERB_SET_PROC_COEF, 0x5029 },
8739 { }
8740 },
8741 .chained = true,
8742 .chain_id = ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE
8743 },
8c8967a7
DD
8744 [ALC256_FIXUP_ASUS_HEADSET_MIC] = {
8745 .type = HDA_FIXUP_PINS,
8746 .v.pins = (const struct hda_pintbl[]) {
8747 { 0x19, 0x03a11020 }, /* headset mic with jack detect */
8748 { }
8749 },
8750 .chained = true,
8751 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8752 },
e1037354
JHP
8753 [ALC256_FIXUP_ASUS_MIC_NO_PRESENCE] = {
8754 .type = HDA_FIXUP_PINS,
8755 .v.pins = (const struct hda_pintbl[]) {
8756 { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
8757 { }
8758 },
8759 .chained = true,
8760 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8761 },
e2a829b3
BR
8762 [ALC299_FIXUP_PREDATOR_SPK] = {
8763 .type = HDA_FIXUP_PINS,
8764 .v.pins = (const struct hda_pintbl[]) {
8765 { 0x21, 0x90170150 }, /* use as headset mic, without its own jack detect */
8766 { }
8767 }
8768 },
bd9c10bc 8769 [ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE] = {
60083f9e
JHP
8770 .type = HDA_FIXUP_PINS,
8771 .v.pins = (const struct hda_pintbl[]) {
bd9c10bc
JMG
8772 { 0x19, 0x04a11040 },
8773 { 0x21, 0x04211020 },
60083f9e
JHP
8774 { }
8775 },
8776 .chained = true,
bd9c10bc 8777 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
60083f9e 8778 },
f0d9da19
KY
8779 [ALC289_FIXUP_DELL_SPK1] = {
8780 .type = HDA_FIXUP_PINS,
8781 .v.pins = (const struct hda_pintbl[]) {
8782 { 0x14, 0x90170140 },
8783 { }
8784 },
8785 .chained = true,
8786 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE
8787 },
e79c2269 8788 [ALC289_FIXUP_DELL_SPK2] = {
bd9c10bc
JMG
8789 .type = HDA_FIXUP_PINS,
8790 .v.pins = (const struct hda_pintbl[]) {
e79c2269 8791 { 0x17, 0x90170130 }, /* bass spk */
bd9c10bc
JMG
8792 { }
8793 },
8794 .chained = true,
e79c2269 8795 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE
bd9c10bc 8796 },
e79c2269
KY
8797 [ALC289_FIXUP_DUAL_SPK] = {
8798 .type = HDA_FIXUP_FUNC,
8799 .v.func = alc285_fixup_speaker2_to_dac1,
8800 .chained = true,
8801 .chain_id = ALC289_FIXUP_DELL_SPK2
8802 },
f0d9da19
KY
8803 [ALC289_FIXUP_RTK_AMP_DUAL_SPK] = {
8804 .type = HDA_FIXUP_FUNC,
8805 .v.func = alc285_fixup_speaker2_to_dac1,
8806 .chained = true,
8807 .chain_id = ALC289_FIXUP_DELL_SPK1
8808 },
48e01504
CC
8809 [ALC294_FIXUP_SPK2_TO_DAC1] = {
8810 .type = HDA_FIXUP_FUNC,
8811 .v.func = alc285_fixup_speaker2_to_dac1,
8812 .chained = true,
8813 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8814 },
8815 [ALC294_FIXUP_ASUS_DUAL_SPK] = {
436e2550
JHP
8816 .type = HDA_FIXUP_FUNC,
8817 /* The GPIO must be pulled to initialize the AMP */
8818 .v.func = alc_fixup_gpio4,
8819 .chained = true,
48e01504 8820 .chain_id = ALC294_FIXUP_SPK2_TO_DAC1
436e2550 8821 },
724418b8
MA
8822 [ALC294_FIXUP_ASUS_ALLY] = {
8823 .type = HDA_FIXUP_FUNC,
8824 .v.func = cs35l41_fixup_i2c_two,
8825 .chained = true,
8826 .chain_id = ALC294_FIXUP_ASUS_ALLY_PINS
8827 },
8828 [ALC294_FIXUP_ASUS_ALLY_PINS] = {
8829 .type = HDA_FIXUP_PINS,
8830 .v.pins = (const struct hda_pintbl[]) {
8831 { 0x19, 0x03a11050 },
8832 { 0x1a, 0x03a11c30 },
8833 { 0x21, 0x03211420 },
8834 { }
8835 },
8836 .chained = true,
8837 .chain_id = ALC294_FIXUP_ASUS_ALLY_VERBS
8838 },
8839 [ALC294_FIXUP_ASUS_ALLY_VERBS] = {
8840 .type = HDA_FIXUP_VERBS,
8841 .v.verbs = (const struct hda_verb[]) {
8842 { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
8843 { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
8844 { 0x20, AC_VERB_SET_COEF_INDEX, 0x46 },
8845 { 0x20, AC_VERB_SET_PROC_COEF, 0x0004 },
8846 { 0x20, AC_VERB_SET_COEF_INDEX, 0x47 },
8847 { 0x20, AC_VERB_SET_PROC_COEF, 0xa47a },
8848 { 0x20, AC_VERB_SET_COEF_INDEX, 0x49 },
8849 { 0x20, AC_VERB_SET_PROC_COEF, 0x0049},
8850 { 0x20, AC_VERB_SET_COEF_INDEX, 0x4a },
8851 { 0x20, AC_VERB_SET_PROC_COEF, 0x201b },
8852 { 0x20, AC_VERB_SET_COEF_INDEX, 0x6b },
8853 { 0x20, AC_VERB_SET_PROC_COEF, 0x4278},
8854 { }
8855 },
8856 .chained = true,
8857 .chain_id = ALC294_FIXUP_ASUS_ALLY_SPEAKER
8858 },
8859 [ALC294_FIXUP_ASUS_ALLY_SPEAKER] = {
8860 .type = HDA_FIXUP_FUNC,
8861 .v.func = alc285_fixup_speaker2_to_dac1,
8862 },
6a6660d0
TI
8863 [ALC285_FIXUP_THINKPAD_X1_GEN7] = {
8864 .type = HDA_FIXUP_FUNC,
8865 .v.func = alc285_fixup_thinkpad_x1_gen7,
8866 .chained = true,
8867 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
8868 },
76f7dec0
KY
8869 [ALC285_FIXUP_THINKPAD_HEADSET_JACK] = {
8870 .type = HDA_FIXUP_FUNC,
8871 .v.func = alc_fixup_headset_jack,
8872 .chained = true,
6a6660d0 8873 .chain_id = ALC285_FIXUP_THINKPAD_X1_GEN7
76f7dec0 8874 },
8b33a134
JHP
8875 [ALC294_FIXUP_ASUS_HPE] = {
8876 .type = HDA_FIXUP_VERBS,
8877 .v.verbs = (const struct hda_verb[]) {
8878 /* Set EAPD high */
8879 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
8880 { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
8881 { }
8882 },
8883 .chained = true,
8884 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8885 },
c3cdf189
LJ
8886 [ALC294_FIXUP_ASUS_GX502_PINS] = {
8887 .type = HDA_FIXUP_PINS,
8888 .v.pins = (const struct hda_pintbl[]) {
8889 { 0x19, 0x03a11050 }, /* front HP mic */
8890 { 0x1a, 0x01a11830 }, /* rear external mic */
8891 { 0x21, 0x03211020 }, /* front HP out */
8892 { }
8893 },
8894 .chained = true,
8895 .chain_id = ALC294_FIXUP_ASUS_GX502_VERBS
8896 },
8897 [ALC294_FIXUP_ASUS_GX502_VERBS] = {
8898 .type = HDA_FIXUP_VERBS,
8899 .v.verbs = (const struct hda_verb[]) {
8900 /* set 0x15 to HP-OUT ctrl */
8901 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
8902 /* unmute the 0x15 amp */
8903 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
8904 { }
8905 },
8906 .chained = true,
8907 .chain_id = ALC294_FIXUP_ASUS_GX502_HP
8908 },
8909 [ALC294_FIXUP_ASUS_GX502_HP] = {
8910 .type = HDA_FIXUP_FUNC,
8911 .v.func = alc294_fixup_gx502_hp,
8912 },
c1b55029
DC
8913 [ALC294_FIXUP_ASUS_GU502_PINS] = {
8914 .type = HDA_FIXUP_PINS,
8915 .v.pins = (const struct hda_pintbl[]) {
8916 { 0x19, 0x01a11050 }, /* rear HP mic */
8917 { 0x1a, 0x01a11830 }, /* rear external mic */
8918 { 0x21, 0x012110f0 }, /* rear HP out */
8919 { }
8920 },
8921 .chained = true,
8922 .chain_id = ALC294_FIXUP_ASUS_GU502_VERBS
8923 },
8924 [ALC294_FIXUP_ASUS_GU502_VERBS] = {
8925 .type = HDA_FIXUP_VERBS,
8926 .v.verbs = (const struct hda_verb[]) {
8927 /* set 0x15 to HP-OUT ctrl */
8928 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
8929 /* unmute the 0x15 amp */
8930 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
8931 /* set 0x1b to HP-OUT */
8932 { 0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
8933 { }
8934 },
8935 .chained = true,
8936 .chain_id = ALC294_FIXUP_ASUS_GU502_HP
8937 },
8938 [ALC294_FIXUP_ASUS_GU502_HP] = {
8939 .type = HDA_FIXUP_FUNC,
8940 .v.func = alc294_fixup_gu502_hp,
c611e659
LJ
8941 },
8942 [ALC294_FIXUP_ASUS_G513_PINS] = {
8943 .type = HDA_FIXUP_PINS,
8944 .v.pins = (const struct hda_pintbl[]) {
8945 { 0x19, 0x03a11050 }, /* front HP mic */
8946 { 0x1a, 0x03a11c30 }, /* rear external mic */
8947 { 0x21, 0x03211420 }, /* front HP out */
8948 { }
8949 },
c1b55029 8950 },
bc2c2354
LJ
8951 [ALC285_FIXUP_ASUS_G533Z_PINS] = {
8952 .type = HDA_FIXUP_PINS,
8953 .v.pins = (const struct hda_pintbl[]) {
66ba7c88
LJ
8954 { 0x14, 0x90170152 }, /* Speaker Surround Playback Switch */
8955 { 0x19, 0x03a19020 }, /* Mic Boost Volume */
8956 { 0x1a, 0x03a11c30 }, /* Mic Boost Volume */
8957 { 0x1e, 0x90170151 }, /* Rear jack, IN OUT EAPD Detect */
8958 { 0x21, 0x03211420 },
bc2c2354
LJ
8959 { }
8960 },
bc2c2354 8961 },
1b94e59d
TI
8962 [ALC294_FIXUP_ASUS_COEF_1B] = {
8963 .type = HDA_FIXUP_VERBS,
8964 .v.verbs = (const struct hda_verb[]) {
8965 /* Set bit 10 to correct noisy output after reboot from
8966 * Windows 10 (due to pop noise reduction?)
8967 */
8968 { 0x20, AC_VERB_SET_COEF_INDEX, 0x1b },
8969 { 0x20, AC_VERB_SET_PROC_COEF, 0x4e4b },
8970 { }
8971 },
f8fbcdfb
TI
8972 .chained = true,
8973 .chain_id = ALC289_FIXUP_ASUS_GA401,
1b94e59d 8974 },
f5a88b0a
KHF
8975 [ALC285_FIXUP_HP_GPIO_LED] = {
8976 .type = HDA_FIXUP_FUNC,
8977 .v.func = alc285_fixup_hp_gpio_led,
8978 },
431e76c3
KY
8979 [ALC285_FIXUP_HP_MUTE_LED] = {
8980 .type = HDA_FIXUP_FUNC,
8981 .v.func = alc285_fixup_hp_mute_led,
8982 },
ca88eeb3
LG
8983 [ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED] = {
8984 .type = HDA_FIXUP_FUNC,
8985 .v.func = alc285_fixup_hp_spectre_x360_mute_led,
8986 },
0659400f
LG
8987 [ALC236_FIXUP_HP_MUTE_LED_COEFBIT2] = {
8988 .type = HDA_FIXUP_FUNC,
8989 .v.func = alc236_fixup_hp_mute_led_coefbit2,
8990 },
e7d66cf7
JS
8991 [ALC236_FIXUP_HP_GPIO_LED] = {
8992 .type = HDA_FIXUP_FUNC,
8993 .v.func = alc236_fixup_hp_gpio_led,
8994 },
24164f43
KY
8995 [ALC236_FIXUP_HP_MUTE_LED] = {
8996 .type = HDA_FIXUP_FUNC,
8997 .v.func = alc236_fixup_hp_mute_led,
8998 },
75b62ab6
JW
8999 [ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF] = {
9000 .type = HDA_FIXUP_FUNC,
9001 .v.func = alc236_fixup_hp_mute_led_micmute_vref,
9002 },
a2d57ebe
KM
9003 [ALC298_FIXUP_SAMSUNG_AMP] = {
9004 .type = HDA_FIXUP_FUNC,
9005 .v.func = alc298_fixup_samsung_amp,
9006 .chained = true,
9007 .chain_id = ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET
9008 },
14425f1f
MP
9009 [ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
9010 .type = HDA_FIXUP_VERBS,
9011 .v.verbs = (const struct hda_verb[]) {
9012 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc5 },
9013 { }
9014 },
9015 },
ef248d9b
MK
9016 [ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
9017 .type = HDA_FIXUP_VERBS,
9018 .v.verbs = (const struct hda_verb[]) {
9019 { 0x20, AC_VERB_SET_COEF_INDEX, 0x08},
9020 { 0x20, AC_VERB_SET_PROC_COEF, 0x2fcf},
9021 { }
9022 },
9023 },
9e43342b
CC
9024 [ALC295_FIXUP_ASUS_MIC_NO_PRESENCE] = {
9025 .type = HDA_FIXUP_PINS,
9026 .v.pins = (const struct hda_pintbl[]) {
9027 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
9028 { }
9029 },
9030 .chained = true,
9031 .chain_id = ALC269_FIXUP_HEADSET_MODE
9032 },
8eae7e9b
JHP
9033 [ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS] = {
9034 .type = HDA_FIXUP_PINS,
9035 .v.pins = (const struct hda_pintbl[]) {
9036 { 0x14, 0x90100120 }, /* use as internal speaker */
9037 { 0x18, 0x02a111f0 }, /* use as headset mic, without its own jack detect */
9038 { 0x1a, 0x01011020 }, /* use as line out */
9039 { },
9040 },
9041 .chained = true,
9042 .chain_id = ALC269_FIXUP_HEADSET_MIC
9043 },
6e15d126
JHP
9044 [ALC269VC_FIXUP_ACER_HEADSET_MIC] = {
9045 .type = HDA_FIXUP_PINS,
9046 .v.pins = (const struct hda_pintbl[]) {
9047 { 0x18, 0x02a11030 }, /* use as headset mic */
9048 { }
9049 },
9050 .chained = true,
9051 .chain_id = ALC269_FIXUP_HEADSET_MIC
9052 },
781c90c0
JHP
9053 [ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE] = {
9054 .type = HDA_FIXUP_PINS,
9055 .v.pins = (const struct hda_pintbl[]) {
9056 { 0x18, 0x01a11130 }, /* use as headset mic, without its own jack detect */
9057 { }
9058 },
9059 .chained = true,
9060 .chain_id = ALC269_FIXUP_HEADSET_MIC
9061 },
293a92c1 9062 [ALC289_FIXUP_ASUS_GA401] = {
c84bfedc
TI
9063 .type = HDA_FIXUP_FUNC,
9064 .v.func = alc289_fixup_asus_ga401,
9065 .chained = true,
9066 .chain_id = ALC289_FIXUP_ASUS_GA502,
ff53664d 9067 },
4b43d05a
AS
9068 [ALC289_FIXUP_ASUS_GA502] = {
9069 .type = HDA_FIXUP_PINS,
9070 .v.pins = (const struct hda_pintbl[]) {
9071 { 0x19, 0x03a11020 }, /* headset mic with jack detect */
9072 { }
9073 },
9074 },
f50a121d
JHP
9075 [ALC256_FIXUP_ACER_MIC_NO_PRESENCE] = {
9076 .type = HDA_FIXUP_PINS,
9077 .v.pins = (const struct hda_pintbl[]) {
9078 { 0x19, 0x02a11120 }, /* use as headset mic, without its own jack detect */
9079 { }
9080 },
9081 .chained = true,
9082 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
9083 },
56496253
KY
9084 [ALC285_FIXUP_HP_GPIO_AMP_INIT] = {
9085 .type = HDA_FIXUP_FUNC,
9086 .v.func = alc285_fixup_hp_gpio_amp_init,
9087 .chained = true,
9088 .chain_id = ALC285_FIXUP_HP_GPIO_LED
9089 },
f1ec5be1
HC
9090 [ALC269_FIXUP_CZC_B20] = {
9091 .type = HDA_FIXUP_PINS,
9092 .v.pins = (const struct hda_pintbl[]) {
9093 { 0x12, 0x411111f0 },
9094 { 0x14, 0x90170110 }, /* speaker */
9095 { 0x15, 0x032f1020 }, /* HP out */
9096 { 0x17, 0x411111f0 },
9097 { 0x18, 0x03ab1040 }, /* mic */
9098 { 0x19, 0xb7a7013f },
9099 { 0x1a, 0x0181305f },
9100 { 0x1b, 0x411111f0 },
9101 { 0x1d, 0x411111f0 },
9102 { 0x1e, 0x411111f0 },
9103 { }
9104 },
9105 .chain_id = ALC269_FIXUP_DMIC,
9106 },
9107 [ALC269_FIXUP_CZC_TMI] = {
9108 .type = HDA_FIXUP_PINS,
9109 .v.pins = (const struct hda_pintbl[]) {
9110 { 0x12, 0x4000c000 },
9111 { 0x14, 0x90170110 }, /* speaker */
9112 { 0x15, 0x0421401f }, /* HP out */
9113 { 0x17, 0x411111f0 },
9114 { 0x18, 0x04a19020 }, /* mic */
9115 { 0x19, 0x411111f0 },
9116 { 0x1a, 0x411111f0 },
9117 { 0x1b, 0x411111f0 },
9118 { 0x1d, 0x40448505 },
9119 { 0x1e, 0x411111f0 },
9120 { 0x20, 0x8000ffff },
9121 { }
9122 },
9123 .chain_id = ALC269_FIXUP_DMIC,
9124 },
9125 [ALC269_FIXUP_CZC_L101] = {
9126 .type = HDA_FIXUP_PINS,
9127 .v.pins = (const struct hda_pintbl[]) {
9128 { 0x12, 0x40000000 },
9129 { 0x14, 0x01014010 }, /* speaker */
9130 { 0x15, 0x411111f0 }, /* HP out */
9131 { 0x16, 0x411111f0 },
9132 { 0x18, 0x01a19020 }, /* mic */
9133 { 0x19, 0x02a19021 },
9134 { 0x1a, 0x0181302f },
9135 { 0x1b, 0x0221401f },
9136 { 0x1c, 0x411111f0 },
9137 { 0x1d, 0x4044c601 },
9138 { 0x1e, 0x411111f0 },
9139 { }
9140 },
9141 .chain_id = ALC269_FIXUP_DMIC,
9142 },
9143 [ALC269_FIXUP_LEMOTE_A1802] = {
9144 .type = HDA_FIXUP_PINS,
9145 .v.pins = (const struct hda_pintbl[]) {
9146 { 0x12, 0x40000000 },
9147 { 0x14, 0x90170110 }, /* speaker */
9148 { 0x17, 0x411111f0 },
9149 { 0x18, 0x03a19040 }, /* mic1 */
9150 { 0x19, 0x90a70130 }, /* mic2 */
9151 { 0x1a, 0x411111f0 },
9152 { 0x1b, 0x411111f0 },
9153 { 0x1d, 0x40489d2d },
9154 { 0x1e, 0x411111f0 },
9155 { 0x20, 0x0003ffff },
9156 { 0x21, 0x03214020 },
9157 { }
9158 },
9159 .chain_id = ALC269_FIXUP_DMIC,
9160 },
9161 [ALC269_FIXUP_LEMOTE_A190X] = {
9162 .type = HDA_FIXUP_PINS,
9163 .v.pins = (const struct hda_pintbl[]) {
9164 { 0x14, 0x99130110 }, /* speaker */
9165 { 0x15, 0x0121401f }, /* HP out */
9166 { 0x18, 0x01a19c20 }, /* rear mic */
9167 { 0x19, 0x99a3092f }, /* front mic */
9168 { 0x1b, 0x0201401f }, /* front lineout */
9169 { }
9170 },
9171 .chain_id = ALC269_FIXUP_DMIC,
9172 },
e2d2fded
KHF
9173 [ALC256_FIXUP_INTEL_NUC8_RUGGED] = {
9174 .type = HDA_FIXUP_PINS,
9175 .v.pins = (const struct hda_pintbl[]) {
9176 { 0x1b, 0x01a1913c }, /* use as headset mic, without its own jack detect */
9177 { }
9178 },
9179 .chained = true,
9180 .chain_id = ALC269_FIXUP_HEADSET_MODE
9181 },
73e7161e
WS
9182 [ALC256_FIXUP_INTEL_NUC10] = {
9183 .type = HDA_FIXUP_PINS,
9184 .v.pins = (const struct hda_pintbl[]) {
9185 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
9186 { }
9187 },
9188 .chained = true,
9189 .chain_id = ALC269_FIXUP_HEADSET_MODE
9190 },
fc19d559
HW
9191 [ALC255_FIXUP_XIAOMI_HEADSET_MIC] = {
9192 .type = HDA_FIXUP_VERBS,
9193 .v.verbs = (const struct hda_verb[]) {
9194 { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
9195 { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
9196 { }
9197 },
9198 .chained = true,
c84bfedc 9199 .chain_id = ALC289_FIXUP_ASUS_GA502
fc19d559 9200 },
13468bfa
HW
9201 [ALC274_FIXUP_HP_MIC] = {
9202 .type = HDA_FIXUP_VERBS,
9203 .v.verbs = (const struct hda_verb[]) {
9204 { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
9205 { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
9206 { }
9207 },
9208 },
8a8de09c
KY
9209 [ALC274_FIXUP_HP_HEADSET_MIC] = {
9210 .type = HDA_FIXUP_FUNC,
9211 .v.func = alc274_fixup_hp_headset_mic,
9212 .chained = true,
9213 .chain_id = ALC274_FIXUP_HP_MIC
9214 },
622464c8
TI
9215 [ALC274_FIXUP_HP_ENVY_GPIO] = {
9216 .type = HDA_FIXUP_FUNC,
9217 .v.func = alc274_fixup_hp_envy_gpio,
9218 },
ef9ce66f
KY
9219 [ALC256_FIXUP_ASUS_HPE] = {
9220 .type = HDA_FIXUP_VERBS,
9221 .v.verbs = (const struct hda_verb[]) {
9222 /* Set EAPD high */
9223 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
9224 { 0x20, AC_VERB_SET_PROC_COEF, 0x7778 },
9225 { }
9226 },
9227 .chained = true,
9228 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
9229 },
446b8185
KY
9230 [ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK] = {
9231 .type = HDA_FIXUP_FUNC,
9232 .v.func = alc_fixup_headset_jack,
9233 .chained = true,
9234 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
9235 },
a0ccbc53
KY
9236 [ALC287_FIXUP_HP_GPIO_LED] = {
9237 .type = HDA_FIXUP_FUNC,
9238 .v.func = alc287_fixup_hp_gpio_led,
9239 },
9e885770
KY
9240 [ALC256_FIXUP_HP_HEADSET_MIC] = {
9241 .type = HDA_FIXUP_FUNC,
9242 .v.func = alc274_fixup_hp_headset_mic,
9243 },
92666d45
KY
9244 [ALC236_FIXUP_DELL_AIO_HEADSET_MIC] = {
9245 .type = HDA_FIXUP_FUNC,
9246 .v.func = alc_fixup_no_int_mic,
9247 .chained = true,
9248 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
9249 },
34cdf405
CC
9250 [ALC282_FIXUP_ACER_DISABLE_LINEOUT] = {
9251 .type = HDA_FIXUP_PINS,
9252 .v.pins = (const struct hda_pintbl[]) {
9253 { 0x1b, 0x411111f0 },
9254 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
9255 { },
9256 },
9257 .chained = true,
9258 .chain_id = ALC269_FIXUP_HEADSET_MODE
9259 },
495dc763
CC
9260 [ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST] = {
9261 .type = HDA_FIXUP_FUNC,
9262 .v.func = alc269_fixup_limit_int_mic_boost,
9263 .chained = true,
9264 .chain_id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
9265 },
d0e18561
CC
9266 [ALC256_FIXUP_ACER_HEADSET_MIC] = {
9267 .type = HDA_FIXUP_PINS,
9268 .v.pins = (const struct hda_pintbl[]) {
9269 { 0x19, 0x02a1113c }, /* use as headset mic, without its own jack detect */
9270 { 0x1a, 0x90a1092f }, /* use as internal mic */
9271 { }
9272 },
9273 .chained = true,
9274 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
9275 },
26928ca1
TI
9276 [ALC285_FIXUP_IDEAPAD_S740_COEF] = {
9277 .type = HDA_FIXUP_FUNC,
9278 .v.func = alc285_fixup_ideapad_s740_coef,
9279 .chained = true,
9280 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
9281 },
bd15b155
KHF
9282 [ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST] = {
9283 .type = HDA_FIXUP_FUNC,
9284 .v.func = alc269_fixup_limit_int_mic_boost,
9285 .chained = true,
9286 .chain_id = ALC285_FIXUP_HP_MUTE_LED,
9287 },
8eedd3a7
TI
9288 [ALC295_FIXUP_ASUS_DACS] = {
9289 .type = HDA_FIXUP_FUNC,
9290 .v.func = alc295_fixup_asus_dacs,
9291 },
5d84b531
TI
9292 [ALC295_FIXUP_HP_OMEN] = {
9293 .type = HDA_FIXUP_PINS,
9294 .v.pins = (const struct hda_pintbl[]) {
9295 { 0x12, 0xb7a60130 },
9296 { 0x13, 0x40000000 },
9297 { 0x14, 0x411111f0 },
9298 { 0x16, 0x411111f0 },
9299 { 0x17, 0x90170110 },
9300 { 0x18, 0x411111f0 },
9301 { 0x19, 0x02a11030 },
9302 { 0x1a, 0x411111f0 },
9303 { 0x1b, 0x04a19030 },
9304 { 0x1d, 0x40600001 },
9305 { 0x1e, 0x411111f0 },
9306 { 0x21, 0x03211020 },
9307 {}
9308 },
9309 .chained = true,
9310 .chain_id = ALC269_FIXUP_HP_LINE1_MIC1_LED,
9311 },
f2be77fe 9312 [ALC285_FIXUP_HP_SPECTRE_X360] = {
434591b2
ED
9313 .type = HDA_FIXUP_FUNC,
9314 .v.func = alc285_fixup_hp_spectre_x360,
f2be77fe 9315 },
d94befbb
DB
9316 [ALC285_FIXUP_HP_SPECTRE_X360_EB1] = {
9317 .type = HDA_FIXUP_FUNC,
9318 .v.func = alc285_fixup_hp_spectre_x360_eb1
9319 },
c0621669
AA
9320 [ALC285_FIXUP_HP_ENVY_X360] = {
9321 .type = HDA_FIXUP_FUNC,
9322 .v.func = alc285_fixup_hp_envy_x360,
9323 .chained = true,
9324 .chain_id = ALC285_FIXUP_HP_GPIO_AMP_INIT,
9325 },
9ebaef05
HW
9326 [ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP] = {
9327 .type = HDA_FIXUP_FUNC,
9328 .v.func = alc285_fixup_ideapad_s740_coef,
9329 .chained = true,
9330 .chain_id = ALC285_FIXUP_THINKPAD_HEADSET_JACK,
9331 },
29c8f40b
PU
9332 [ALC623_FIXUP_LENOVO_THINKSTATION_P340] = {
9333 .type = HDA_FIXUP_FUNC,
9334 .v.func = alc_fixup_no_shutup,
9335 .chained = true,
9336 .chain_id = ALC283_FIXUP_HEADSET_MIC,
9337 },
57c9e21a
HW
9338 [ALC255_FIXUP_ACER_HEADPHONE_AND_MIC] = {
9339 .type = HDA_FIXUP_PINS,
9340 .v.pins = (const struct hda_pintbl[]) {
9341 { 0x21, 0x03211030 }, /* Change the Headphone location to Left */
9342 { }
9343 },
9344 .chained = true,
9345 .chain_id = ALC255_FIXUP_XIAOMI_HEADSET_MIC
9346 },
8903376d
KHF
9347 [ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST] = {
9348 .type = HDA_FIXUP_FUNC,
9349 .v.func = alc269_fixup_limit_int_mic_boost,
9350 .chained = true,
9351 .chain_id = ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,
9352 },
8f4c9042
BF
9353 [ALC285_FIXUP_LEGION_Y9000X_SPEAKERS] = {
9354 .type = HDA_FIXUP_FUNC,
9355 .v.func = alc285_fixup_ideapad_s740_coef,
9356 .chained = true,
9357 .chain_id = ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,
9358 },
9359 [ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE] = {
9360 .type = HDA_FIXUP_FUNC,
9361 .v.func = alc287_fixup_legion_15imhg05_speakers,
9362 .chained = true,
9363 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
9364 },
ad7cc2d4
CB
9365 [ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS] = {
9366 .type = HDA_FIXUP_VERBS,
9367 //.v.verbs = legion_15imhg05_coefs,
9368 .v.verbs = (const struct hda_verb[]) {
9369 // set left speaker Legion 7i.
9370 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9371 { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
9372
9373 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9374 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9375 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9376 { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
9377 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9378
9379 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9380 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9381 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9382 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9383 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9384
9385 // set right speaker Legion 7i.
9386 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9387 { 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
9388
9389 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9390 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9391 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9392 { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
9393 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9394
9395 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9396 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9397 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9398 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9399 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9400 {}
9401 },
9402 .chained = true,
9403 .chain_id = ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,
9404 },
9405 [ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE] = {
9406 .type = HDA_FIXUP_FUNC,
9407 .v.func = alc287_fixup_legion_15imhg05_speakers,
9408 .chained = true,
9409 .chain_id = ALC269_FIXUP_HEADSET_MODE,
9410 },
9411 [ALC287_FIXUP_YOGA7_14ITL_SPEAKERS] = {
9412 .type = HDA_FIXUP_VERBS,
9413 .v.verbs = (const struct hda_verb[]) {
9414 // set left speaker Yoga 7i.
9415 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9416 { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
9417
9418 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9419 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9420 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9421 { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
9422 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9423
9424 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9425 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9426 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9427 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9428 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9429
9430 // set right speaker Yoga 7i.
9431 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9432 { 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
9433
9434 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9435 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9436 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9437 { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
9438 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9439
9440 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9441 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9442 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9443 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9444 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9445 {}
9446 },
9447 .chained = true,
9448 .chain_id = ALC269_FIXUP_HEADSET_MODE,
9449 },
56ec3e75
TI
9450 [ALC298_FIXUP_LENOVO_C940_DUET7] = {
9451 .type = HDA_FIXUP_FUNC,
9452 .v.func = alc298_fixup_lenovo_c940_duet7,
9453 },
0ac32a39
WW
9454 [ALC287_FIXUP_LENOVO_14IRP8_DUETITL] = {
9455 .type = HDA_FIXUP_FUNC,
9456 .v.func = alc287_fixup_lenovo_14irp8_duetitl,
9457 },
39815cdf
TI
9458 [ALC287_FIXUP_LENOVO_LEGION_7] = {
9459 .type = HDA_FIXUP_FUNC,
9460 .v.func = alc287_fixup_lenovo_legion_7,
9461 },
ad7cc2d4
CB
9462 [ALC287_FIXUP_13S_GEN2_SPEAKERS] = {
9463 .type = HDA_FIXUP_VERBS,
9464 .v.verbs = (const struct hda_verb[]) {
9465 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9466 { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
023a062f 9467 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
ad7cc2d4
CB
9468 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9469 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9470 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9471 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9472 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9473 { 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
9474 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9475 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9476 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9477 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9478 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9479 {}
9480 },
9481 .chained = true,
9482 .chain_id = ALC269_FIXUP_HEADSET_MODE,
9483 },
619764cc 9484 [ALC256_FIXUP_SET_COEF_DEFAULTS] = {
dd6dd6e3 9485 .type = HDA_FIXUP_FUNC,
619764cc 9486 .v.func = alc256_fixup_set_coef_defaults,
dd6dd6e3 9487 },
5fc462c3
JC
9488 [ALC245_FIXUP_HP_GPIO_LED] = {
9489 .type = HDA_FIXUP_FUNC,
9490 .v.func = alc245_fixup_hp_gpio_led,
9491 },
1278cc5a
JS
9492 [ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
9493 .type = HDA_FIXUP_PINS,
9494 .v.pins = (const struct hda_pintbl[]) {
9495 { 0x19, 0x03a11120 }, /* use as headset mic, without its own jack detect */
9496 { }
9497 },
9498 .chained = true,
9499 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
9500 },
174a7fb3
WS
9501 [ALC233_FIXUP_NO_AUDIO_JACK] = {
9502 .type = HDA_FIXUP_FUNC,
9503 .v.func = alc233_fixup_no_audio_jack,
9504 },
edca7cc4
WS
9505 [ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME] = {
9506 .type = HDA_FIXUP_FUNC,
9507 .v.func = alc256_fixup_mic_no_presence_and_resume,
9508 .chained = true,
9509 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
9510 },
d3dca026
LT
9511 [ALC287_FIXUP_LEGION_16ACHG6] = {
9512 .type = HDA_FIXUP_FUNC,
9513 .v.func = alc287_fixup_legion_16achg6_speakers,
9514 },
ae7abe36
SB
9515 [ALC287_FIXUP_CS35L41_I2C_2] = {
9516 .type = HDA_FIXUP_FUNC,
9517 .v.func = cs35l41_fixup_i2c_two,
9518 },
b3fbe536
AC
9519 [ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED] = {
9520 .type = HDA_FIXUP_FUNC,
9521 .v.func = cs35l41_fixup_i2c_two,
9522 .chained = true,
9523 .chain_id = ALC285_FIXUP_HP_MUTE_LED,
ae7abe36 9524 },
42320660
SB
9525 [ALC287_FIXUP_CS35L41_I2C_4] = {
9526 .type = HDA_FIXUP_FUNC,
9527 .v.func = cs35l41_fixup_i2c_four,
9528 },
07bcab93
LT
9529 [ALC245_FIXUP_CS35L41_SPI_2] = {
9530 .type = HDA_FIXUP_FUNC,
9531 .v.func = cs35l41_fixup_spi_two,
9532 },
ce18f905
KHF
9533 [ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED] = {
9534 .type = HDA_FIXUP_FUNC,
9535 .v.func = cs35l41_fixup_spi_two,
9536 .chained = true,
9537 .chain_id = ALC285_FIXUP_HP_GPIO_LED,
9538 },
07bcab93
LT
9539 [ALC245_FIXUP_CS35L41_SPI_4] = {
9540 .type = HDA_FIXUP_FUNC,
9541 .v.func = cs35l41_fixup_spi_four,
9542 },
9543 [ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED] = {
9544 .type = HDA_FIXUP_FUNC,
864cb14c 9545 .v.func = cs35l41_fixup_spi_four,
07bcab93 9546 .chained = true,
864cb14c 9547 .chain_id = ALC285_FIXUP_HP_GPIO_LED,
07bcab93 9548 },
91502a9a
AS
9549 [ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED] = {
9550 .type = HDA_FIXUP_VERBS,
9551 .v.verbs = (const struct hda_verb[]) {
9552 { 0x20, AC_VERB_SET_COEF_INDEX, 0x19 },
9553 { 0x20, AC_VERB_SET_PROC_COEF, 0x8e11 },
9554 { }
9555 },
9556 .chained = true,
9557 .chain_id = ALC285_FIXUP_HP_MUTE_LED,
9558 },
1efcdd9c
GM
9559 [ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET] = {
9560 .type = HDA_FIXUP_FUNC,
9561 .v.func = alc_fixup_dell4_mic_no_presence_quiet,
9562 .chained = true,
9563 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
9564 },
309d7363
DH
9565 [ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE] = {
9566 .type = HDA_FIXUP_PINS,
9567 .v.pins = (const struct hda_pintbl[]) {
9568 { 0x19, 0x02a1112c }, /* use as headset mic, without its own jack detect */
9569 { }
9570 },
9571 .chained = true,
9572 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
9573 },
1e24881d
LT
9574 [ALC287_FIXUP_LEGION_16ITHG6] = {
9575 .type = HDA_FIXUP_FUNC,
9576 .v.func = alc287_fixup_legion_16ithg6_speakers,
9577 },
3790a3d6
PJ
9578 [ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK] = {
9579 .type = HDA_FIXUP_VERBS,
9580 .v.verbs = (const struct hda_verb[]) {
9581 // enable left speaker
9582 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9583 { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
9584
9585 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9586 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9587 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9588 { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
9589 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9590
9591 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9592 { 0x20, AC_VERB_SET_PROC_COEF, 0xf },
9593 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9594 { 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
9595 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9596
9597 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9598 { 0x20, AC_VERB_SET_PROC_COEF, 0x10 },
9599 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9600 { 0x20, AC_VERB_SET_PROC_COEF, 0x40 },
9601 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9602
9603 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9604 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9605 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9606 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9607 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9608
9609 // enable right speaker
9610 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9611 { 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
9612
9613 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9614 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9615 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9616 { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
9617 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9618
9619 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9620 { 0x20, AC_VERB_SET_PROC_COEF, 0xf },
9621 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9622 { 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
9623 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9624
9625 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9626 { 0x20, AC_VERB_SET_PROC_COEF, 0x10 },
9627 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9628 { 0x20, AC_VERB_SET_PROC_COEF, 0x44 },
9629 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9630
9631 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9632 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9633 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9634 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9635 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9636
9637 { },
9638 },
9639 },
9640 [ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN] = {
9641 .type = HDA_FIXUP_FUNC,
9642 .v.func = alc287_fixup_yoga9_14iap7_bass_spk_pin,
9643 .chained = true,
9644 .chain_id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK,
9645 },
9b714a59
JZ
9646 [ALC287_FIXUP_YOGA9_14IMH9_BASS_SPK_PIN] = {
9647 .type = HDA_FIXUP_FUNC,
9648 .v.func = alc287_fixup_yoga9_14iap7_bass_spk_pin,
9649 .chained = true,
9650 .chain_id = ALC287_FIXUP_CS35L41_I2C_2,
9651 },
2912cdda
PJ
9652 [ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS] = {
9653 .type = HDA_FIXUP_FUNC,
9654 .v.func = alc295_fixup_dell_inspiron_top_speakers,
9655 .chained = true,
9656 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
9657 },
a4517c4f
CC
9658 [ALC236_FIXUP_DELL_DUAL_CODECS] = {
9659 .type = HDA_FIXUP_PINS,
9660 .v.func = alc1220_fixup_gb_dual_codecs,
9661 .chained = true,
9662 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9663 },
f7b069cf
VR
9664 [ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI] = {
9665 .type = HDA_FIXUP_FUNC,
9666 .v.func = cs35l41_fixup_i2c_two,
9667 .chained = true,
2468e892 9668 .chain_id = ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
f7b069cf 9669 },
3babae91
SD
9670 [ALC287_FIXUP_TAS2781_I2C] = {
9671 .type = HDA_FIXUP_FUNC,
9672 .v.func = tas2781_fixup_i2c,
9673 .chained = true,
c1947ce6 9674 .chain_id = ALC285_FIXUP_THINKPAD_HEADSET_JACK,
3babae91 9675 },
b5cb53fd
GK
9676 [ALC287_FIXUP_YOGA7_14ARB7_I2C] = {
9677 .type = HDA_FIXUP_FUNC,
9678 .v.func = yoga7_14arb7_fixup_i2c,
9679 .chained = true,
9680 .chain_id = ALC285_FIXUP_THINKPAD_HEADSET_JACK,
9681 },
93dc18e1
SJ
9682 [ALC245_FIXUP_HP_MUTE_LED_COEFBIT] = {
9683 .type = HDA_FIXUP_FUNC,
9684 .v.func = alc245_fixup_hp_mute_led_coefbit,
9685 },
c99c26b1
FV
9686 [ALC245_FIXUP_HP_X360_MUTE_LEDS] = {
9687 .type = HDA_FIXUP_FUNC,
9688 .v.func = alc245_fixup_hp_mute_led_coefbit,
9689 .chained = true,
9690 .chain_id = ALC245_FIXUP_HP_GPIO_LED
9691 },
e43252db
KY
9692 [ALC287_FIXUP_THINKPAD_I2S_SPK] = {
9693 .type = HDA_FIXUP_FUNC,
9694 .v.func = alc287_fixup_bind_dacs,
2468e892
JR
9695 .chained = true,
9696 .chain_id = ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
e43252db 9697 },
d93eeca6
KY
9698 [ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD] = {
9699 .type = HDA_FIXUP_FUNC,
9700 .v.func = alc287_fixup_bind_dacs,
9701 .chained = true,
9702 .chain_id = ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI,
9703 },
c8c0a03e
KY
9704 [ALC2XX_FIXUP_HEADSET_MIC] = {
9705 .type = HDA_FIXUP_FUNC,
9706 .v.func = alc_fixup_headset_mic,
9707 },
f0d9da19
KY
9708 [ALC289_FIXUP_DELL_CS35L41_SPI_2] = {
9709 .type = HDA_FIXUP_FUNC,
9710 .v.func = cs35l41_fixup_spi_two,
9711 .chained = true,
9712 .chain_id = ALC289_FIXUP_DUAL_SPK
9713 },
6ae90e90
VT
9714 [ALC294_FIXUP_CS35L41_I2C_2] = {
9715 .type = HDA_FIXUP_FUNC,
9716 .v.func = cs35l41_fixup_i2c_two,
9717 },
b2d6a1fd
ST
9718 [ALC245_FIXUP_CS35L56_SPI_4_HP_GPIO_LED] = {
9719 .type = HDA_FIXUP_FUNC,
9720 .v.func = cs35l56_fixup_spi_four,
9721 .chained = true,
9722 .chain_id = ALC285_FIXUP_HP_GPIO_LED,
9723 },
bd2d8305
IM
9724 [ALC256_FIXUP_ACER_SFG16_MICMUTE_LED] = {
9725 .type = HDA_FIXUP_FUNC,
9726 .v.func = alc256_fixup_acer_sfg16_micmute_led,
9727 },
1e5dc398
HW
9728 [ALC256_FIXUP_HEADPHONE_AMP_VOL] = {
9729 .type = HDA_FIXUP_FUNC,
9730 .v.func = alc256_decrease_headphone_amp_val,
9731 },
61456da0
AG
9732 [ALC245_FIXUP_HP_SPECTRE_X360_EU0XXX] = {
9733 .type = HDA_FIXUP_FUNC,
9734 .v.func = alc245_fixup_hp_spectre_x360_eu0xxx,
9735 },
c33f0d4f
ST
9736 [ALC285_FIXUP_CS35L56_SPI_2] = {
9737 .type = HDA_FIXUP_FUNC,
9738 .v.func = cs35l56_fixup_spi_two,
9739 },
9740 [ALC285_FIXUP_CS35L56_I2C_2] = {
9741 .type = HDA_FIXUP_FUNC,
9742 .v.func = cs35l56_fixup_i2c_two,
9743 },
9744 [ALC285_FIXUP_CS35L56_I2C_4] = {
9745 .type = HDA_FIXUP_FUNC,
9746 .v.func = cs35l56_fixup_i2c_four,
9747 },
9748 [ALC285_FIXUP_ASUS_GA403U] = {
9749 .type = HDA_FIXUP_FUNC,
9750 .v.func = alc285_fixup_asus_ga403u,
9751 },
0672b017
VT
9752 [ALC285_FIXUP_ASUS_GA403U_HEADSET_MIC] = {
9753 .type = HDA_FIXUP_PINS,
9754 .v.pins = (const struct hda_pintbl[]) {
9755 { 0x19, 0x03a11050 },
9756 { 0x1b, 0x03a11c30 },
9757 { }
9758 },
9759 .chained = true,
9760 .chain_id = ALC285_FIXUP_ASUS_GA403U_I2C_SPEAKER2_TO_DAC1
9761 },
9762 [ALC285_FIXUP_ASUS_GU605_SPI_SPEAKER2_TO_DAC1] = {
9763 .type = HDA_FIXUP_FUNC,
9764 .v.func = alc285_fixup_speaker2_to_dac1,
9765 .chained = true,
9766 .chain_id = ALC285_FIXUP_ASUS_GU605_SPI_2_HEADSET_MIC,
9767 },
9768 [ALC285_FIXUP_ASUS_GU605_SPI_2_HEADSET_MIC] = {
9769 .type = HDA_FIXUP_PINS,
9770 .v.pins = (const struct hda_pintbl[]) {
9771 { 0x19, 0x03a11050 },
9772 { 0x1b, 0x03a11c30 },
9773 { }
9774 },
9775 .chained = true,
9776 .chain_id = ALC285_FIXUP_CS35L56_SPI_2
9777 },
9778 [ALC285_FIXUP_ASUS_GA403U_I2C_SPEAKER2_TO_DAC1] = {
9779 .type = HDA_FIXUP_FUNC,
9780 .v.func = alc285_fixup_speaker2_to_dac1,
9781 .chained = true,
9782 .chain_id = ALC285_FIXUP_ASUS_GA403U,
9783 },
1e707769
KY
9784 [ALC287_FIXUP_LENOVO_THKPAD_WH_ALC1318] = {
9785 .type = HDA_FIXUP_FUNC,
9786 .v.func = alc287_fixup_lenovo_thinkpad_with_alc1318,
9787 .chained = true,
9788 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
9789 },
f1d4e28b
KY
9790};
9791
1d045db9 9792static const struct snd_pci_quirk alc269_fixup_tbl[] = {
a6b92b66 9793 SND_PCI_QUIRK(0x1025, 0x0283, "Acer TravelMate 8371", ALC269_FIXUP_INV_DMIC),
693b613d
DH
9794 SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC),
9795 SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC),
aaedfb47 9796 SND_PCI_QUIRK(0x1025, 0x047c, "Acer AC700", ALC269_FIXUP_ACER_AC700),
7819717b 9797 SND_PCI_QUIRK(0x1025, 0x072d, "Acer Aspire V5-571G", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
aaedfb47
DH
9798 SND_PCI_QUIRK(0x1025, 0x0740, "Acer AO725", ALC271_FIXUP_HP_GATE_MIC_JACK),
9799 SND_PCI_QUIRK(0x1025, 0x0742, "Acer AO756", ALC271_FIXUP_HP_GATE_MIC_JACK),
02322ac9 9800 SND_PCI_QUIRK(0x1025, 0x0762, "Acer Aspire E1-472", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
b1e8972e 9801 SND_PCI_QUIRK(0x1025, 0x0775, "Acer Aspire E1-572", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
1a22e775 9802 SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS),
433f894e 9803 SND_PCI_QUIRK(0x1025, 0x080d, "Acer Aspire V5-122P", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
c8426b27 9804 SND_PCI_QUIRK(0x1025, 0x0840, "Acer Aspire E1", ALC269VB_FIXUP_ASPIRE_E1_COEF),
13be30f1 9805 SND_PCI_QUIRK(0x1025, 0x101c, "Acer Veriton N2510G", ALC269_FIXUP_LIFEBOOK),
705b65f1 9806 SND_PCI_QUIRK(0x1025, 0x102b, "Acer Aspire C24-860", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE),
6e15d126 9807 SND_PCI_QUIRK(0x1025, 0x1065, "Acer Aspire C20-820", ALC269VC_FIXUP_ACER_HEADSET_MIC),
b9c2fa52 9808 SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK),
495dc763 9809 SND_PCI_QUIRK(0x1025, 0x1094, "Acer Aspire E5-575T", ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST),
c7531e31
CC
9810 SND_PCI_QUIRK(0x1025, 0x1099, "Acer Aspire E5-523G", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9811 SND_PCI_QUIRK(0x1025, 0x110e, "Acer Aspire ES1-432", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
13be30f1
CC
9812 SND_PCI_QUIRK(0x1025, 0x1166, "Acer Veriton N4640G", ALC269_FIXUP_LIFEBOOK),
9813 SND_PCI_QUIRK(0x1025, 0x1167, "Acer Veriton N6640G", ALC269_FIXUP_LIFEBOOK),
e2a829b3 9814 SND_PCI_QUIRK(0x1025, 0x1246, "Acer Predator Helios 500", ALC299_FIXUP_PREDATOR_SPK),
8eae7e9b 9815 SND_PCI_QUIRK(0x1025, 0x1247, "Acer vCopperbox", ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS),
781c90c0 9816 SND_PCI_QUIRK(0x1025, 0x1248, "Acer Veriton N4660G", ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE),
d0e18561 9817 SND_PCI_QUIRK(0x1025, 0x1269, "Acer SWIFT SF314-54", ALC256_FIXUP_ACER_HEADSET_MIC),
efb56d84 9818 SND_PCI_QUIRK(0x1025, 0x126a, "Acer Swift SF114-32", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
667a8f73
JHP
9819 SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
9820 SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
9821 SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
d0e18561 9822 SND_PCI_QUIRK(0x1025, 0x129c, "Acer SWIFT SF314-55", ALC256_FIXUP_ACER_HEADSET_MIC),
5f3fe25e 9823 SND_PCI_QUIRK(0x1025, 0x129d, "Acer SWIFT SF313-51", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
35171fbf 9824 SND_PCI_QUIRK(0x1025, 0x1300, "Acer SWIFT SF314-56", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
2733cceb 9825 SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
ea5c7eba 9826 SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", ALC233_FIXUP_ACER_HEADSET_MIC),
cbc05fd6 9827 SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC),
2a5bb694 9828 SND_PCI_QUIRK(0x1025, 0x141f, "Acer Spin SP513-54N", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
0d4867a1 9829 SND_PCI_QUIRK(0x1025, 0x142b, "Acer Swift SF314-42", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
f50a121d 9830 SND_PCI_QUIRK(0x1025, 0x1430, "Acer TravelMate B311R-31", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
57c9e21a 9831 SND_PCI_QUIRK(0x1025, 0x1466, "Acer Aspire A515-56", ALC255_FIXUP_ACER_HEADPHONE_AND_MIC),
6a28a25d 9832 SND_PCI_QUIRK(0x1025, 0x1534, "Acer Predator PH315-54", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
bd2d8305 9833 SND_PCI_QUIRK(0x1025, 0x169a, "Acer Swift SFG16", ALC256_FIXUP_ACER_SFG16_MICMUTE_LED),
aaedfb47 9834 SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
841bdf85 9835 SND_PCI_QUIRK(0x1028, 0x053c, "Dell Latitude E5430", ALC292_FIXUP_DELL_E7X),
6ed1131f 9836 SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS),
86f799b8 9837 SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X),
cf52103a 9838 SND_PCI_QUIRK(0x1028, 0x05be, "Dell Latitude E6540", ALC292_FIXUP_DELL_E7X),
8b99aba7
TI
9839 SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X),
9840 SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X),
0f4881dc 9841 SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER),
73bdd597
DH
9842 SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
9843 SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
9844 SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
0f4881dc
DH
9845 SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
9846 SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
98070576 9847 SND_PCI_QUIRK(0x1028, 0x062c, "Dell Latitude E5550", ALC292_FIXUP_DELL_E7X),
4275554d 9848 SND_PCI_QUIRK(0x1028, 0x062e, "Dell Latitude E7450", ALC292_FIXUP_DELL_E7X),
0f4881dc 9849 SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),
a22aa26f
KY
9850 SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9851 SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
831bfdf9 9852 SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13),
afecb146 9853 SND_PCI_QUIRK(0x1028, 0x0669, "Dell Optiplex 9020m", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
3a05d12f 9854 SND_PCI_QUIRK(0x1028, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK),
8b72415d 9855 SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
b734304f
KY
9856 SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9857 SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
c04017ea
DH
9858 SND_PCI_QUIRK(0x1028, 0x06db, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9859 SND_PCI_QUIRK(0x1028, 0x06dd, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9860 SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9861 SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9862 SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
fd06c77e 9863 SND_PCI_QUIRK(0x1028, 0x0706, "Dell Inspiron 7559", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
3b43b71f 9864 SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE),
c0ca5ece 9865 SND_PCI_QUIRK(0x1028, 0x0738, "Dell Precision 5820", ALC269_FIXUP_NO_SHUTUP),
709ae62e 9866 SND_PCI_QUIRK(0x1028, 0x075c, "Dell XPS 27 7760", ALC298_FIXUP_SPK_VOLUME),
dd9aa335 9867 SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME),
493de342 9868 SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
aa143ad3 9869 SND_PCI_QUIRK(0x1028, 0x07b0, "Dell Precision 7520", ALC295_FIXUP_DISABLE_DAC3),
5f364135 9870 SND_PCI_QUIRK(0x1028, 0x080c, "Dell WYSE", ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE),
40e2c4e5
KY
9871 SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
9872 SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
f0ba9d69
KY
9873 SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
9874 SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
ae104a21 9875 SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB),
136824ef 9876 SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE),
da484d00 9877 SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE),
c2a7c55a 9878 SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
e79c2269 9879 SND_PCI_QUIRK(0x1028, 0x097d, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
aa143ad3 9880 SND_PCI_QUIRK(0x1028, 0x097e, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
78def224
KY
9881 SND_PCI_QUIRK(0x1028, 0x098d, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
9882 SND_PCI_QUIRK(0x1028, 0x09bf, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
92666d45
KY
9883 SND_PCI_QUIRK(0x1028, 0x0a2e, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
9884 SND_PCI_QUIRK(0x1028, 0x0a30, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
1efcdd9c 9885 SND_PCI_QUIRK(0x1028, 0x0a38, "Dell Latitude 7520", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET),
c1e89523 9886 SND_PCI_QUIRK(0x1028, 0x0a58, "Dell", ALC255_FIXUP_DELL_HEADSET_MIC),
da946920 9887 SND_PCI_QUIRK(0x1028, 0x0a61, "Dell XPS 15 9510", ALC289_FIXUP_DUAL_SPK),
eb676622 9888 SND_PCI_QUIRK(0x1028, 0x0a62, "Dell Precision 5560", ALC289_FIXUP_DUAL_SPK),
2b987fe8
CC
9889 SND_PCI_QUIRK(0x1028, 0x0a9d, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
9890 SND_PCI_QUIRK(0x1028, 0x0a9e, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
15dad62f 9891 SND_PCI_QUIRK(0x1028, 0x0b19, "Dell XPS 15 9520", ALC289_FIXUP_DUAL_SPK),
bdc9b739 9892 SND_PCI_QUIRK(0x1028, 0x0b1a, "Dell Precision 5570", ALC289_FIXUP_DUAL_SPK),
42320660
SB
9893 SND_PCI_QUIRK(0x1028, 0x0b27, "Dell", ALC245_FIXUP_CS35L41_SPI_2),
9894 SND_PCI_QUIRK(0x1028, 0x0b28, "Dell", ALC245_FIXUP_CS35L41_SPI_2),
2912cdda
PJ
9895 SND_PCI_QUIRK(0x1028, 0x0b37, "Dell Inspiron 16 Plus 7620 2-in-1", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS),
9896 SND_PCI_QUIRK(0x1028, 0x0b71, "Dell Inspiron 16 Plus 7620", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS),
cd14dedf 9897 SND_PCI_QUIRK(0x1028, 0x0beb, "Dell XPS 15 9530 (2023)", ALC289_FIXUP_DELL_CS35L41_SPI_2),
a5751933 9898 SND_PCI_QUIRK(0x1028, 0x0c03, "Dell Precision 5340", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
fddab35f 9899 SND_PCI_QUIRK(0x1028, 0x0c0b, "Dell Oasis 14 RPL-P", ALC289_FIXUP_RTK_AMP_DUAL_SPK),
fcfc9f71 9900 SND_PCI_QUIRK(0x1028, 0x0c0d, "Dell Oasis", ALC289_FIXUP_RTK_AMP_DUAL_SPK),
fddab35f 9901 SND_PCI_QUIRK(0x1028, 0x0c0e, "Dell Oasis 16", ALC289_FIXUP_RTK_AMP_DUAL_SPK),
a4517c4f
CC
9902 SND_PCI_QUIRK(0x1028, 0x0c19, "Dell Precision 3340", ALC236_FIXUP_DELL_DUAL_CODECS),
9903 SND_PCI_QUIRK(0x1028, 0x0c1a, "Dell Precision 3340", ALC236_FIXUP_DELL_DUAL_CODECS),
9904 SND_PCI_QUIRK(0x1028, 0x0c1b, "Dell Precision 3440", ALC236_FIXUP_DELL_DUAL_CODECS),
9905 SND_PCI_QUIRK(0x1028, 0x0c1c, "Dell Precision 3540", ALC236_FIXUP_DELL_DUAL_CODECS),
9906 SND_PCI_QUIRK(0x1028, 0x0c1d, "Dell Precision 3440", ALC236_FIXUP_DELL_DUAL_CODECS),
9907 SND_PCI_QUIRK(0x1028, 0x0c1e, "Dell Precision 3540", ALC236_FIXUP_DELL_DUAL_CODECS),
89a0dff6 9908 SND_PCI_QUIRK(0x1028, 0x0c28, "Dell Inspiron 16 Plus 7630", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS),
42320660 9909 SND_PCI_QUIRK(0x1028, 0x0c4d, "Dell", ALC287_FIXUP_CS35L41_I2C_4),
f0d9da19
KY
9910 SND_PCI_QUIRK(0x1028, 0x0cbd, "Dell Oasis 13 CS MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9911 SND_PCI_QUIRK(0x1028, 0x0cbe, "Dell Oasis 13 2-IN-1 MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9912 SND_PCI_QUIRK(0x1028, 0x0cbf, "Dell Oasis 13 Low Weight MTU-L", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9913 SND_PCI_QUIRK(0x1028, 0x0cc0, "Dell Oasis 13", ALC289_FIXUP_RTK_AMP_DUAL_SPK),
9914 SND_PCI_QUIRK(0x1028, 0x0cc1, "Dell Oasis 14 MTL-H/U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9915 SND_PCI_QUIRK(0x1028, 0x0cc2, "Dell Oasis 14 2-in-1 MTL-H/U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9916 SND_PCI_QUIRK(0x1028, 0x0cc3, "Dell Oasis 14 Low Weight MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9917 SND_PCI_QUIRK(0x1028, 0x0cc4, "Dell Oasis 16 MTL-H/U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9918 SND_PCI_QUIRK(0x1028, 0x0cc5, "Dell Oasis 14", ALC289_FIXUP_RTK_AMP_DUAL_SPK),
a22aa26f
KY
9919 SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9920 SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
08fb0d0e 9921 SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
9f5c6faf 9922 SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),
8e35cd4a 9923 SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED),
7976eb49 9924 SND_PCI_QUIRK(0x103c, 0x21f9, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8a02b164 9925 SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8a02b164 9926 SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
45461e3b
TI
9927 SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9928 SND_PCI_QUIRK(0x103c, 0x221c, "HP EliteBook 755 G2", ALC280_FIXUP_HP_HEADSET_MIC),
9929 SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9930 SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9c5dc3bf
KY
9931 SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9932 SND_PCI_QUIRK(0x103c, 0x2237, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9933 SND_PCI_QUIRK(0x103c, 0x2238, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9934 SND_PCI_QUIRK(0x103c, 0x2239, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9c5dc3bf 9935 SND_PCI_QUIRK(0x103c, 0x224b, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9c5dc3bf
KY
9936 SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9937 SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9938 SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9939 SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9940 SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9c5dc3bf 9941 SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
04d5466a 9942 SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED),
45461e3b 9943 SND_PCI_QUIRK(0x103c, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY),
c60666bd 9944 SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
c60666bd
KY
9945 SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9946 SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9947 SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
45461e3b
TI
9948 SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9949 SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9950 SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9951 SND_PCI_QUIRK(0x103c, 0x226e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9952 SND_PCI_QUIRK(0x103c, 0x2271, "HP", ALC286_FIXUP_HP_GPIO_LED),
9c5dc3bf 9953 SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
45461e3b 9954 SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC280_FIXUP_HP_DOCK_PINS),
9c5dc3bf 9955 SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
45461e3b 9956 SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC280_FIXUP_HP_DOCK_PINS),
9c5dc3bf 9957 SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
c60666bd 9958 SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
c60666bd 9959 SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
c60666bd 9960 SND_PCI_QUIRK(0x103c, 0x228b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
c60666bd 9961 SND_PCI_QUIRK(0x103c, 0x228e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
45461e3b
TI
9962 SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9963 SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9964 SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9965 SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9966 SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
c60666bd 9967 SND_PCI_QUIRK(0x103c, 0x22c5, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
c60666bd
KY
9968 SND_PCI_QUIRK(0x103c, 0x22c7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9969 SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
45461e3b
TI
9970 SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9971 SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC280_FIXUP_HP_9480M),
9972 SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9973 SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8a02b164
KY
9974 SND_PCI_QUIRK(0x103c, 0x2334, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9975 SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9976 SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9977 SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
4ba5c853 9978 SND_PCI_QUIRK(0x103c, 0x2b5e, "HP 288 Pro G2 MT", ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE),
167897f4
JK
9979 SND_PCI_QUIRK(0x103c, 0x802e, "HP Z240 SFF", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9980 SND_PCI_QUIRK(0x103c, 0x802f, "HP Z240", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
1c9d9dfd
KY
9981 SND_PCI_QUIRK(0x103c, 0x8077, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
9982 SND_PCI_QUIRK(0x103c, 0x8158, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
92553ee0 9983 SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC295_FIXUP_HP_X360),
e549d190 9984 SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC),
bbf8ff6b 9985 SND_PCI_QUIRK(0x103c, 0x827e, "HP x360", ALC295_FIXUP_HP_X360),
aeedad25 9986 SND_PCI_QUIRK(0x103c, 0x827f, "HP x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
167897f4
JK
9987 SND_PCI_QUIRK(0x103c, 0x82bf, "HP G3 mini", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9988 SND_PCI_QUIRK(0x103c, 0x82c0, "HP G3 mini premium", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
56e40eb6 9989 SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
901be145 9990 SND_PCI_QUIRK(0x103c, 0x841c, "HP Pavilion 15-CK0xx", ALC269_FIXUP_HP_MUTE_LED_MIC3),
190d0381 9991 SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9b726bf6 9992 SND_PCI_QUIRK(0x103c, 0x84ae, "HP 15-db0403ng", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
5d84b531 9993 SND_PCI_QUIRK(0x103c, 0x84da, "HP OMEN dc0019-ur", ALC295_FIXUP_HP_OMEN),
d33cd42d 9994 SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
f2be77fe 9995 SND_PCI_QUIRK(0x103c, 0x8519, "HP Spectre x360 15-df0xxx", ALC285_FIXUP_HP_SPECTRE_X360),
b6ce6e6c 9996 SND_PCI_QUIRK(0x103c, 0x8537, "HP ProBook 440 G6", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
c0621669 9997 SND_PCI_QUIRK(0x103c, 0x85de, "HP Envy x360 13-ar0xxx", ALC285_FIXUP_HP_ENVY_X360),
d296a74b 9998 SND_PCI_QUIRK(0x103c, 0x860f, "HP ZBook 15 G6", ALC285_FIXUP_HP_GPIO_AMP_INIT),
0ac05b25 9999 SND_PCI_QUIRK(0x103c, 0x861f, "HP Elite Dragonfly G1", ALC285_FIXUP_HP_GPIO_AMP_INIT),
b2c22910 10000 SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED),
2d5af3ab 10001 SND_PCI_QUIRK(0x103c, 0x86c1, "HP Laptop 15-da3001TU", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
622464c8 10002 SND_PCI_QUIRK(0x103c, 0x86c7, "HP Envy AiO 32", ALC274_FIXUP_HP_ENVY_GPIO),
24df5428
IH
10003 SND_PCI_QUIRK(0x103c, 0x86e7, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
10004 SND_PCI_QUIRK(0x103c, 0x86e8, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
ca88eeb3 10005 SND_PCI_QUIRK(0x103c, 0x86f9, "HP Spectre x360 13-aw0xxx", ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED),
15d295b5 10006 SND_PCI_QUIRK(0x103c, 0x8716, "HP Elite Dragonfly G2 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
61d3e874 10007 SND_PCI_QUIRK(0x103c, 0x8720, "HP EliteBook x360 1040 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
a598098c 10008 SND_PCI_QUIRK(0x103c, 0x8724, "HP EliteBook 850 G7", ALC285_FIXUP_HP_GPIO_LED),
c058493d 10009 SND_PCI_QUIRK(0x103c, 0x8728, "HP EliteBook 840 G7", ALC285_FIXUP_HP_GPIO_LED),
b2c22910 10010 SND_PCI_QUIRK(0x103c, 0x8729, "HP", ALC285_FIXUP_HP_GPIO_LED),
75b62ab6 10011 SND_PCI_QUIRK(0x103c, 0x8730, "HP ProBook 445 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
05ec7161 10012 SND_PCI_QUIRK(0x103c, 0x8735, "HP ProBook 435 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
56496253 10013 SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_AMP_INIT),
08befca4 10014 SND_PCI_QUIRK(0x103c, 0x8760, "HP", ALC285_FIXUP_HP_MUTE_LED),
6b3d14b7 10015 SND_PCI_QUIRK(0x103c, 0x876e, "HP ENVY x360 Convertible 13-ay0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS),
431e76c3 10016 SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED),
24164f43 10017 SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED),
91bc1568
JS
10018 SND_PCI_QUIRK(0x103c, 0x8780, "HP ZBook Fury 17 G7 Mobile Workstation",
10019 ALC285_FIXUP_HP_GPIO_AMP_INIT),
10020 SND_PCI_QUIRK(0x103c, 0x8783, "HP ZBook Fury 15 G7 Mobile Workstation",
10021 ALC285_FIXUP_HP_GPIO_AMP_INIT),
30267718 10022 SND_PCI_QUIRK(0x103c, 0x8786, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
b2e6b3d9 10023 SND_PCI_QUIRK(0x103c, 0x8787, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
375f8426 10024 SND_PCI_QUIRK(0x103c, 0x8788, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
f0d78972 10025 SND_PCI_QUIRK(0x103c, 0x87b7, "HP Laptop 14-fq0xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
48422958 10026 SND_PCI_QUIRK(0x103c, 0x87c8, "HP", ALC287_FIXUP_HP_GPIO_LED),
e7d66cf7 10027 SND_PCI_QUIRK(0x103c, 0x87e5, "HP ProBook 440 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
2b70b264 10028 SND_PCI_QUIRK(0x103c, 0x87e7, "HP ProBook 450 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
fb3acdb2 10029 SND_PCI_QUIRK(0x103c, 0x87f1, "HP ProBook 630 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
417eadfd 10030 SND_PCI_QUIRK(0x103c, 0x87f2, "HP ProBook 640 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
a0ccbc53
KY
10031 SND_PCI_QUIRK(0x103c, 0x87f4, "HP", ALC287_FIXUP_HP_GPIO_LED),
10032 SND_PCI_QUIRK(0x103c, 0x87f5, "HP", ALC287_FIXUP_HP_GPIO_LED),
93ab3eaf 10033 SND_PCI_QUIRK(0x103c, 0x87f6, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
c3bb2b52 10034 SND_PCI_QUIRK(0x103c, 0x87f7, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
bc7863d1 10035 SND_PCI_QUIRK(0x103c, 0x87fe, "HP Laptop 15s-fq2xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
d07149ab 10036 SND_PCI_QUIRK(0x103c, 0x8805, "HP ProBook 650 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
dfc2e8ae 10037 SND_PCI_QUIRK(0x103c, 0x880d, "HP EliteBook 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
d94befbb
DB
10038 SND_PCI_QUIRK(0x103c, 0x8811, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
10039 SND_PCI_QUIRK(0x103c, 0x8812, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
d510acb6 10040 SND_PCI_QUIRK(0x103c, 0x881d, "HP 250 G8 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
53b861be 10041 SND_PCI_QUIRK(0x103c, 0x8846, "HP EliteBook 850 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
c3d2c882 10042 SND_PCI_QUIRK(0x103c, 0x8847, "HP EliteBook x360 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
dfb06401 10043 SND_PCI_QUIRK(0x103c, 0x884b, "HP EliteBook 840 Aero G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
ca688339 10044 SND_PCI_QUIRK(0x103c, 0x884c, "HP EliteBook 840 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
8903376d
KHF
10045 SND_PCI_QUIRK(0x103c, 0x8862, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST),
10046 SND_PCI_QUIRK(0x103c, 0x8863, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST),
50dbfae9 10047 SND_PCI_QUIRK(0x103c, 0x886d, "HP ZBook Fury 17.3 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
e650c1a9 10048 SND_PCI_QUIRK(0x103c, 0x8870, "HP ZBook Fury 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
bbe183e0 10049 SND_PCI_QUIRK(0x103c, 0x8873, "HP ZBook Studio 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
0659400f 10050 SND_PCI_QUIRK(0x103c, 0x887a, "HP Laptop 15s-eq2xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
c99c26b1 10051 SND_PCI_QUIRK(0x103c, 0x888a, "HP ENVY x360 Convertible 15-eu0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS),
600dd2a7 10052 SND_PCI_QUIRK(0x103c, 0x888d, "HP ZBook Power 15.6 inch G8 Mobile Workstation PC", ALC236_FIXUP_HP_GPIO_LED),
91502a9a 10053 SND_PCI_QUIRK(0x103c, 0x8895, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED),
0e68c4b1 10054 SND_PCI_QUIRK(0x103c, 0x8896, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_MUTE_LED),
bd15b155 10055 SND_PCI_QUIRK(0x103c, 0x8898, "HP EliteBook 845 G8 Notebook PC", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),
42334fbc 10056 SND_PCI_QUIRK(0x103c, 0x88d0, "HP Pavilion 15-eh1xxx (mainboard 88D0)", ALC287_FIXUP_HP_GPIO_LED),
49632230 10057 SND_PCI_QUIRK(0x103c, 0x8902, "HP OMEN 16", ALC285_FIXUP_HP_MUTE_LED),
8384c0ba 10058 SND_PCI_QUIRK(0x103c, 0x890e, "HP 255 G8 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
e7477cb9 10059 SND_PCI_QUIRK(0x103c, 0x8919, "HP Pavilion Aero Laptop 13-be0xxx", ALC287_FIXUP_HP_GPIO_LED),
f86bfeb6 10060 SND_PCI_QUIRK(0x103c, 0x896d, "HP ZBook Firefly 16 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
5f5d8890
AC
10061 SND_PCI_QUIRK(0x103c, 0x896e, "HP EliteBook x360 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10062 SND_PCI_QUIRK(0x103c, 0x8971, "HP EliteBook 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10063 SND_PCI_QUIRK(0x103c, 0x8972, "HP EliteBook 840 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10064 SND_PCI_QUIRK(0x103c, 0x8973, "HP EliteBook 860 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10065 SND_PCI_QUIRK(0x103c, 0x8974, "HP EliteBook 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10066 SND_PCI_QUIRK(0x103c, 0x8975, "HP EliteBook x360 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
67c3d771 10067 SND_PCI_QUIRK(0x103c, 0x897d, "HP mt440 Mobile Thin Client U74", ALC236_FIXUP_HP_GPIO_LED),
07bcab93
LT
10068 SND_PCI_QUIRK(0x103c, 0x8981, "HP Elite Dragonfly G3", ALC245_FIXUP_CS35L41_SPI_4),
10069 SND_PCI_QUIRK(0x103c, 0x898e, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2),
10070 SND_PCI_QUIRK(0x103c, 0x898f, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2),
b3fbe536 10071 SND_PCI_QUIRK(0x103c, 0x8991, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
07bcab93 10072 SND_PCI_QUIRK(0x103c, 0x8992, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2),
b3fbe536 10073 SND_PCI_QUIRK(0x103c, 0x8994, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
07bcab93 10074 SND_PCI_QUIRK(0x103c, 0x8995, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2),
e6194c8d
AC
10075 SND_PCI_QUIRK(0x103c, 0x89a4, "HP ProBook 440 G9", ALC236_FIXUP_HP_GPIO_LED),
10076 SND_PCI_QUIRK(0x103c, 0x89a6, "HP ProBook 450 G9", ALC236_FIXUP_HP_GPIO_LED),
024a7ad9 10077 SND_PCI_QUIRK(0x103c, 0x89aa, "HP EliteBook 630 G9", ALC236_FIXUP_HP_GPIO_LED),
e6194c8d
AC
10078 SND_PCI_QUIRK(0x103c, 0x89ac, "HP EliteBook 640 G9", ALC236_FIXUP_HP_GPIO_LED),
10079 SND_PCI_QUIRK(0x103c, 0x89ae, "HP EliteBook 650 G9", ALC236_FIXUP_HP_GPIO_LED),
f86bfeb6 10080 SND_PCI_QUIRK(0x103c, 0x89c0, "HP ZBook Power 15.6 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
07bcab93 10081 SND_PCI_QUIRK(0x103c, 0x89c3, "Zbook Studio G9", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
ce18f905 10082 SND_PCI_QUIRK(0x103c, 0x89c6, "Zbook Fury 17 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
f7ac570d 10083 SND_PCI_QUIRK(0x103c, 0x89ca, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9a6804aa 10084 SND_PCI_QUIRK(0x103c, 0x89d3, "HP EliteBook 645 G9 (MB 89D2)", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
aa8e3ef4 10085 SND_PCI_QUIRK(0x103c, 0x89e7, "HP Elite x2 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
13a5b211 10086 SND_PCI_QUIRK(0x103c, 0x8a0f, "HP Pavilion 14-ec1xxx", ALC287_FIXUP_HP_GPIO_LED),
56e85993 10087 SND_PCI_QUIRK(0x103c, 0x8a20, "HP Laptop 15s-fq5xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
93dc18e1 10088 SND_PCI_QUIRK(0x103c, 0x8a25, "HP Victus 16-d1xxx (MB 8A25)", ALC245_FIXUP_HP_MUTE_LED_COEFBIT),
aa8e3ef4
SB
10089 SND_PCI_QUIRK(0x103c, 0x8a28, "HP Envy 13", ALC287_FIXUP_CS35L41_I2C_2),
10090 SND_PCI_QUIRK(0x103c, 0x8a29, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
10091 SND_PCI_QUIRK(0x103c, 0x8a2a, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
10092 SND_PCI_QUIRK(0x103c, 0x8a2b, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
10093 SND_PCI_QUIRK(0x103c, 0x8a2c, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),
10094 SND_PCI_QUIRK(0x103c, 0x8a2d, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),
10095 SND_PCI_QUIRK(0x103c, 0x8a2e, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),
10096 SND_PCI_QUIRK(0x103c, 0x8a2e, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
10097 SND_PCI_QUIRK(0x103c, 0x8a30, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
10098 SND_PCI_QUIRK(0x103c, 0x8a31, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
10099 SND_PCI_QUIRK(0x103c, 0x8a6e, "HP EDNA 360", ALC287_FIXUP_CS35L41_I2C_4),
300ab0df 10100 SND_PCI_QUIRK(0x103c, 0x8a74, "HP ProBook 440 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
5f3d696e 10101 SND_PCI_QUIRK(0x103c, 0x8a78, "HP Dev One", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),
61d30785
JS
10102 SND_PCI_QUIRK(0x103c, 0x8aa0, "HP ProBook 440 G9 (MB 8A9E)", ALC236_FIXUP_HP_GPIO_LED),
10103 SND_PCI_QUIRK(0x103c, 0x8aa3, "HP ProBook 450 G9 (MB 8AA1)", ALC236_FIXUP_HP_GPIO_LED),
10104 SND_PCI_QUIRK(0x103c, 0x8aa8, "HP EliteBook 640 G9 (MB 8AA6)", ALC236_FIXUP_HP_GPIO_LED),
10105 SND_PCI_QUIRK(0x103c, 0x8aab, "HP EliteBook 650 G9 (MB 8AA9)", ALC236_FIXUP_HP_GPIO_LED),
1fdf4e8b 10106 SND_PCI_QUIRK(0x103c, 0x8ab9, "HP EliteBook 840 G8 (MB 8AB8)", ALC285_FIXUP_HP_GPIO_LED),
3e10f6ca 10107 SND_PCI_QUIRK(0x103c, 0x8abb, "HP ZBook Firefly 14 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
c578d5da
KHF
10108 SND_PCI_QUIRK(0x103c, 0x8ad1, "HP EliteBook 840 14 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10109 SND_PCI_QUIRK(0x103c, 0x8ad2, "HP EliteBook 860 16 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
aa8e3ef4 10110 SND_PCI_QUIRK(0x103c, 0x8ad8, "HP 800 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
32f03f40 10111 SND_PCI_QUIRK(0x103c, 0x8b0f, "HP Elite mt645 G7 Mobile Thin Client U81", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
b944aa9d 10112 SND_PCI_QUIRK(0x103c, 0x8b2f, "HP 255 15.6 inch G10 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
aa8e3ef4 10113 SND_PCI_QUIRK(0x103c, 0x8b3a, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
67c3d771 10114 SND_PCI_QUIRK(0x103c, 0x8b3f, "HP mt440 Mobile Thin Client U91", ALC236_FIXUP_HP_GPIO_LED),
9251584a
AC
10115 SND_PCI_QUIRK(0x103c, 0x8b42, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10116 SND_PCI_QUIRK(0x103c, 0x8b43, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10117 SND_PCI_QUIRK(0x103c, 0x8b44, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10118 SND_PCI_QUIRK(0x103c, 0x8b45, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10119 SND_PCI_QUIRK(0x103c, 0x8b46, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10120 SND_PCI_QUIRK(0x103c, 0x8b47, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
32f03f40 10121 SND_PCI_QUIRK(0x103c, 0x8b59, "HP Elite mt645 G7 Mobile Thin Client U89", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
1d8025ec
AC
10122 SND_PCI_QUIRK(0x103c, 0x8b5d, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
10123 SND_PCI_QUIRK(0x103c, 0x8b5e, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
3e10f6ca 10124 SND_PCI_QUIRK(0x103c, 0x8b63, "HP Elite Dragonfly 13.5 inch G4", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
2ae147d6 10125 SND_PCI_QUIRK(0x103c, 0x8b65, "HP ProBook 455 15.6 inch G10 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9fdc1605 10126 SND_PCI_QUIRK(0x103c, 0x8b66, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
e94f1f96
AC
10127 SND_PCI_QUIRK(0x103c, 0x8b70, "HP EliteBook 835 G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
10128 SND_PCI_QUIRK(0x103c, 0x8b72, "HP EliteBook 845 G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
10129 SND_PCI_QUIRK(0x103c, 0x8b74, "HP EliteBook 845W G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
3e10f6ca 10130 SND_PCI_QUIRK(0x103c, 0x8b77, "HP ElieBook 865 G10", ALC287_FIXUP_CS35L41_I2C_2),
6c4715aa
AC
10131 SND_PCI_QUIRK(0x103c, 0x8b7a, "HP", ALC236_FIXUP_HP_GPIO_LED),
10132 SND_PCI_QUIRK(0x103c, 0x8b7d, "HP", ALC236_FIXUP_HP_GPIO_LED),
5007b848 10133 SND_PCI_QUIRK(0x103c, 0x8b87, "HP", ALC236_FIXUP_HP_GPIO_LED),
6c4715aa
AC
10134 SND_PCI_QUIRK(0x103c, 0x8b8a, "HP", ALC236_FIXUP_HP_GPIO_LED),
10135 SND_PCI_QUIRK(0x103c, 0x8b8b, "HP", ALC236_FIXUP_HP_GPIO_LED),
10136 SND_PCI_QUIRK(0x103c, 0x8b8d, "HP", ALC236_FIXUP_HP_GPIO_LED),
b752a385 10137 SND_PCI_QUIRK(0x103c, 0x8b8f, "HP", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
858c5415 10138 SND_PCI_QUIRK(0x103c, 0x8b92, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
56fc217f 10139 SND_PCI_QUIRK(0x103c, 0x8b96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9dc68a4f 10140 SND_PCI_QUIRK(0x103c, 0x8b97, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
875e0cd5
SB
10141 SND_PCI_QUIRK(0x103c, 0x8bb3, "HP Slim OMEN", ALC287_FIXUP_CS35L41_I2C_2),
10142 SND_PCI_QUIRK(0x103c, 0x8bb4, "HP Slim OMEN", ALC287_FIXUP_CS35L41_I2C_2),
aa8e3ef4
SB
10143 SND_PCI_QUIRK(0x103c, 0x8bdd, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
10144 SND_PCI_QUIRK(0x103c, 0x8bde, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
10145 SND_PCI_QUIRK(0x103c, 0x8bdf, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
10146 SND_PCI_QUIRK(0x103c, 0x8be0, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
10147 SND_PCI_QUIRK(0x103c, 0x8be1, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
10148 SND_PCI_QUIRK(0x103c, 0x8be2, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
10149 SND_PCI_QUIRK(0x103c, 0x8be3, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
10150 SND_PCI_QUIRK(0x103c, 0x8be5, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),
10151 SND_PCI_QUIRK(0x103c, 0x8be6, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),
10152 SND_PCI_QUIRK(0x103c, 0x8be7, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
10153 SND_PCI_QUIRK(0x103c, 0x8be8, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
10154 SND_PCI_QUIRK(0x103c, 0x8be9, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
9c694fbf 10155 SND_PCI_QUIRK(0x103c, 0x8bf0, "HP", ALC236_FIXUP_HP_GPIO_LED),
61456da0 10156 SND_PCI_QUIRK(0x103c, 0x8c15, "HP Spectre x360 2-in-1 Laptop 14-eu0xxx", ALC245_FIXUP_HP_SPECTRE_X360_EU0XXX),
aa8e3ef4
SB
10157 SND_PCI_QUIRK(0x103c, 0x8c16, "HP Spectre 16", ALC287_FIXUP_CS35L41_I2C_2),
10158 SND_PCI_QUIRK(0x103c, 0x8c17, "HP Spectre 16", ALC287_FIXUP_CS35L41_I2C_2),
fb8cce69
SB
10159 SND_PCI_QUIRK(0x103c, 0x8c46, "HP EliteBook 830 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10160 SND_PCI_QUIRK(0x103c, 0x8c47, "HP EliteBook 840 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10161 SND_PCI_QUIRK(0x103c, 0x8c48, "HP EliteBook 860 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10162 SND_PCI_QUIRK(0x103c, 0x8c49, "HP Elite x360 830 2-in-1 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
875e0cd5
SB
10163 SND_PCI_QUIRK(0x103c, 0x8c4d, "HP Omen", ALC287_FIXUP_CS35L41_I2C_2),
10164 SND_PCI_QUIRK(0x103c, 0x8c4e, "HP Omen", ALC287_FIXUP_CS35L41_I2C_2),
aa8e3ef4
SB
10165 SND_PCI_QUIRK(0x103c, 0x8c4f, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
10166 SND_PCI_QUIRK(0x103c, 0x8c50, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
10167 SND_PCI_QUIRK(0x103c, 0x8c51, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
b2d6a1fd
ST
10168 SND_PCI_QUIRK(0x103c, 0x8c52, "HP EliteBook 1040 G11", ALC245_FIXUP_CS35L56_SPI_4_HP_GPIO_LED),
10169 SND_PCI_QUIRK(0x103c, 0x8c53, "HP Elite x360 1040 2-in-1 G11", ALC245_FIXUP_CS35L56_SPI_4_HP_GPIO_LED),
aa8e3ef4
SB
10170 SND_PCI_QUIRK(0x103c, 0x8c66, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),
10171 SND_PCI_QUIRK(0x103c, 0x8c67, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
10172 SND_PCI_QUIRK(0x103c, 0x8c68, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
10173 SND_PCI_QUIRK(0x103c, 0x8c6a, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),
fb8cce69
SB
10174 SND_PCI_QUIRK(0x103c, 0x8c70, "HP EliteBook 835 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
10175 SND_PCI_QUIRK(0x103c, 0x8c71, "HP EliteBook 845 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
10176 SND_PCI_QUIRK(0x103c, 0x8c72, "HP EliteBook 865 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
a17bd44c
AC
10177 SND_PCI_QUIRK(0x103c, 0x8c8a, "HP EliteBook 630", ALC236_FIXUP_HP_GPIO_LED),
10178 SND_PCI_QUIRK(0x103c, 0x8c8c, "HP EliteBook 660", ALC236_FIXUP_HP_GPIO_LED),
10179 SND_PCI_QUIRK(0x103c, 0x8c90, "HP EliteBook 640", ALC236_FIXUP_HP_GPIO_LED),
10180 SND_PCI_QUIRK(0x103c, 0x8c91, "HP EliteBook 660", ALC236_FIXUP_HP_GPIO_LED),
18a434f3 10181 SND_PCI_QUIRK(0x103c, 0x8c96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
b018cee7 10182 SND_PCI_QUIRK(0x103c, 0x8c97, "HP ZBook", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
1513664f
AC
10183 SND_PCI_QUIRK(0x103c, 0x8ca1, "HP ZBook Power", ALC236_FIXUP_HP_GPIO_LED),
10184 SND_PCI_QUIRK(0x103c, 0x8ca2, "HP ZBook Power", ALC236_FIXUP_HP_GPIO_LED),
5d639b60
SB
10185 SND_PCI_QUIRK(0x103c, 0x8ca4, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10186 SND_PCI_QUIRK(0x103c, 0x8ca7, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
aa8e3ef4
SB
10187 SND_PCI_QUIRK(0x103c, 0x8cdd, "HP Spectre", ALC287_FIXUP_CS35L41_I2C_2),
10188 SND_PCI_QUIRK(0x103c, 0x8cde, "HP Spectre", ALC287_FIXUP_CS35L41_I2C_2),
84471d01
VR
10189 SND_PCI_QUIRK(0x103c, 0x8cdf, "HP SnowWhite", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
10190 SND_PCI_QUIRK(0x103c, 0x8ce0, "HP SnowWhite", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
5d639b60 10191 SND_PCI_QUIRK(0x103c, 0x8cf5, "HP ZBook Studio 16", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
c1732ede 10192 SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
7bba2157 10193 SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
3e0d611b 10194 SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9cf6533e 10195 SND_PCI_QUIRK(0x1043, 0x10a1, "ASUS UX391UA", ALC294_FIXUP_ASUS_SPK),
c1732ede 10196 SND_PCI_QUIRK(0x1043, 0x10c0, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
4eab0ea1 10197 SND_PCI_QUIRK(0x1043, 0x10d0, "ASUS X540LA/X540LJ", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
713f040c 10198 SND_PCI_QUIRK(0x1043, 0x10d3, "ASUS K6500ZC", ALC294_FIXUP_ASUS_SPK),
3e0d611b 10199 SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
4eab0ea1 10200 SND_PCI_QUIRK(0x1043, 0x11c0, "ASUS X556UR", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
3cd0ed63 10201 SND_PCI_QUIRK(0x1043, 0x125e, "ASUS Q524UQK", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
5cfca596 10202 SND_PCI_QUIRK(0x1043, 0x1271, "ASUS X430UN", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
4eab0ea1
TI
10203 SND_PCI_QUIRK(0x1043, 0x1290, "ASUS X441SA", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
10204 SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
e959f2be 10205 SND_PCI_QUIRK(0x1043, 0x12a3, "Asus N7691ZM", ALC269_FIXUP_ASUS_N7601ZM),
461122b9 10206 SND_PCI_QUIRK(0x1043, 0x12af, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2),
c1732ede 10207 SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),
3cd0ed63 10208 SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC),
f882c4be 10209 SND_PCI_QUIRK(0x1043, 0x1313, "Asus K42JZ", ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE),
c1732ede 10210 SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
2cede303 10211 SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
a40ce9f4
SB
10212 SND_PCI_QUIRK(0x1043, 0x1433, "ASUS GX650PY/PZ/PV/PU/PYV/PZV/PIV/PVV", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
10213 SND_PCI_QUIRK(0x1043, 0x1463, "Asus GA402X/GA402N", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
10214 SND_PCI_QUIRK(0x1043, 0x1473, "ASUS GU604VI/VC/VE/VG/VJ/VQ/VU/VV/VY/VZ", ALC285_FIXUP_ASUS_HEADSET_MIC),
10215 SND_PCI_QUIRK(0x1043, 0x1483, "ASUS GU603VQ/VU/VV/VJ/VI", ALC285_FIXUP_ASUS_HEADSET_MIC),
10216 SND_PCI_QUIRK(0x1043, 0x1493, "ASUS GV601VV/VU/VJ/VQ/VI", ALC285_FIXUP_ASUS_HEADSET_MIC),
10217 SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G614JY/JZ/JG", ALC245_FIXUP_CS35L41_SPI_2),
10218 SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS G513PI/PU/PV", ALC287_FIXUP_CS35L41_I2C_2),
10219 SND_PCI_QUIRK(0x1043, 0x1503, "ASUS G733PY/PZ/PZV/PYV", ALC287_FIXUP_CS35L41_I2C_2),
23870831 10220 SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
a40ce9f4
SB
10221 SND_PCI_QUIRK(0x1043, 0x1533, "ASUS GV302XA/XJ/XQ/XU/XV/XI", ALC287_FIXUP_CS35L41_I2C_2),
10222 SND_PCI_QUIRK(0x1043, 0x1573, "ASUS GZ301VV/VQ/VU/VJ/VA/VC/VE/VVC/VQC/VUC/VJC/VEC/VCC", ALC285_FIXUP_ASUS_HEADSET_MIC),
b16c8f22 10223 SND_PCI_QUIRK(0x1043, 0x1662, "ASUS GV301QH", ALC294_FIXUP_ASUS_DUAL_SPK),
a40ce9f4 10224 SND_PCI_QUIRK(0x1043, 0x1663, "ASUS GU603ZI/ZJ/ZQ/ZU/ZV", ALC285_FIXUP_ASUS_HEADSET_MIC),
7e2d0662 10225 SND_PCI_QUIRK(0x1043, 0x1683, "ASUS UM3402YAR", ALC287_FIXUP_CS35L41_I2C_2),
852d432a 10226 SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS UX3402VA", ALC245_FIXUP_CS35L41_SPI_2),
b16c8f22 10227 SND_PCI_QUIRK(0x1043, 0x16b2, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),
ae53e219 10228 SND_PCI_QUIRK(0x1043, 0x16d3, "ASUS UX5304VA", ALC245_FIXUP_CS35L41_SPI_2),
3e0d611b 10229 SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
ae53e219 10230 SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS UX7602VI/BZ", ALC245_FIXUP_CS35L41_SPI_2),
8eedd3a7 10231 SND_PCI_QUIRK(0x1043, 0x1740, "ASUS UX430UA", ALC295_FIXUP_ASUS_DACS),
48e01504 10232 SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_DUAL_SPK),
a40ce9f4 10233 SND_PCI_QUIRK(0x1043, 0x17f3, "ROG Ally NR2301L/X", ALC294_FIXUP_ASUS_ALLY),
ae53e219 10234 SND_PCI_QUIRK(0x1043, 0x1863, "ASUS UX6404VI/VV", ALC245_FIXUP_CS35L41_SPI_2),
3cd0ed63 10235 SND_PCI_QUIRK(0x1043, 0x1881, "ASUS Zephyrus S/M", ALC294_FIXUP_ASUS_GX502_PINS),
8c8967a7 10236 SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC),
c5c325bb 10237 SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS UM3504DA", ALC294_FIXUP_CS35L41_I2C_2),
4963d66b 10238 SND_PCI_QUIRK(0x1043, 0x18f1, "Asus FX505DT", ALC256_FIXUP_ASUS_HEADSET_MIC),
158ae2f5 10239 SND_PCI_QUIRK(0x1043, 0x194e, "ASUS UX563FD", ALC294_FIXUP_ASUS_HPE),
4fad4fb9 10240 SND_PCI_QUIRK(0x1043, 0x1970, "ASUS UX550VE", ALC289_FIXUP_ASUS_GA401),
5de3b943 10241 SND_PCI_QUIRK(0x1043, 0x1982, "ASUS B1400CEPE", ALC256_FIXUP_ASUS_HPE),
8b33a134 10242 SND_PCI_QUIRK(0x1043, 0x19ce, "ASUS B9450FA", ALC294_FIXUP_ASUS_HPE),
7900e817 10243 SND_PCI_QUIRK(0x1043, 0x19e1, "ASUS UX581LV", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE),
017f2a10 10244 SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
28e8af8a 10245 SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC),
61cbc08f 10246 SND_PCI_QUIRK(0x1043, 0x1a63, "ASUS UX3405MA", ALC245_FIXUP_CS35L41_SPI_2),
6ae90e90 10247 SND_PCI_QUIRK(0x1043, 0x1a83, "ASUS UM5302LA", ALC294_FIXUP_CS35L41_I2C_2),
461122b9 10248 SND_PCI_QUIRK(0x1043, 0x1a8f, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2),
1b94e59d 10249 SND_PCI_QUIRK(0x1043, 0x1b11, "ASUS UX431DA", ALC294_FIXUP_ASUS_COEF_1B),
0672b017 10250 SND_PCI_QUIRK(0x1043, 0x1b13, "ASUS U41SV/GA403U", ALC285_FIXUP_ASUS_GA403U_HEADSET_MIC),
811dd426 10251 SND_PCI_QUIRK(0x1043, 0x1b93, "ASUS G614JVR/JIR", ALC245_FIXUP_CS35L41_SPI_2),
615966ad 10252 SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
61cbc08f 10253 SND_PCI_QUIRK(0x1043, 0x1c03, "ASUS UM3406HA", ALC287_FIXUP_CS35L41_I2C_2),
4eab0ea1 10254 SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
61cbc08f
SB
10255 SND_PCI_QUIRK(0x1043, 0x1c33, "ASUS UX5304MA", ALC245_FIXUP_CS35L41_SPI_2),
10256 SND_PCI_QUIRK(0x1043, 0x1c43, "ASUS UX8406MA", ALC245_FIXUP_CS35L41_SPI_2),
a4671b7f 10257 SND_PCI_QUIRK(0x1043, 0x1c62, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),
0672b017 10258 SND_PCI_QUIRK(0x1043, 0x1c63, "ASUS GU605M", ALC285_FIXUP_ASUS_GU605_SPI_SPEAKER2_TO_DAC1),
bc2c2354 10259 SND_PCI_QUIRK(0x1043, 0x1c92, "ASUS ROG Strix G15", ALC285_FIXUP_ASUS_G533Z_PINS),
a40ce9f4
SB
10260 SND_PCI_QUIRK(0x1043, 0x1c9f, "ASUS G614JU/JV/JI", ALC285_FIXUP_ASUS_HEADSET_MIC),
10261 SND_PCI_QUIRK(0x1043, 0x1caf, "ASUS G634JY/JZ/JI/JG", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
c1732ede 10262 SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
a40ce9f4
SB
10263 SND_PCI_QUIRK(0x1043, 0x1ccf, "ASUS G814JU/JV/JI", ALC245_FIXUP_CS35L41_SPI_2),
10264 SND_PCI_QUIRK(0x1043, 0x1cdf, "ASUS G814JY/JZ/JG", ALC245_FIXUP_CS35L41_SPI_2),
10265 SND_PCI_QUIRK(0x1043, 0x1cef, "ASUS G834JY/JZ/JI/JG", ALC285_FIXUP_ASUS_HEADSET_MIC),
10266 SND_PCI_QUIRK(0x1043, 0x1d1f, "ASUS G713PI/PU/PV/PVN", ALC287_FIXUP_CS35L41_I2C_2),
b16c8f22 10267 SND_PCI_QUIRK(0x1043, 0x1d42, "ASUS Zephyrus G14 2022", ALC289_FIXUP_ASUS_GA401),
ef9ce66f 10268 SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE),
51d97607 10269 SND_PCI_QUIRK(0x1043, 0x1da2, "ASUS UP6502ZA/ZD", ALC245_FIXUP_CS35L41_SPI_2),
c33f0d4f 10270 SND_PCI_QUIRK(0x1043, 0x1df3, "ASUS UM5606", ALC285_FIXUP_CS35L56_I2C_4),
07058dce 10271 SND_PCI_QUIRK(0x1043, 0x1e02, "ASUS UX3402ZA", ALC245_FIXUP_CS35L41_SPI_2),
4b43d05a 10272 SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502),
b9105044 10273 SND_PCI_QUIRK(0x1043, 0x1e12, "ASUS UM3402", ALC287_FIXUP_CS35L41_I2C_2),
c1b55029 10274 SND_PCI_QUIRK(0x1043, 0x1e51, "ASUS Zephyrus M15", ALC294_FIXUP_ASUS_GU502_PINS),
c611e659 10275 SND_PCI_QUIRK(0x1043, 0x1e5e, "ASUS ROG Strix G513", ALC294_FIXUP_ASUS_G513_PINS),
c33f0d4f
ST
10276 SND_PCI_QUIRK(0x1043, 0x1e63, "ASUS H7606W", ALC285_FIXUP_CS35L56_I2C_2),
10277 SND_PCI_QUIRK(0x1043, 0x1e83, "ASUS GA605W", ALC285_FIXUP_CS35L56_I2C_2),
76fae618 10278 SND_PCI_QUIRK(0x1043, 0x1e8e, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA401),
b9105044 10279 SND_PCI_QUIRK(0x1043, 0x1ee2, "ASUS UM6702RA/RC", ALC287_FIXUP_CS35L41_I2C_2),
ba1f8180 10280 SND_PCI_QUIRK(0x1043, 0x1c52, "ASUS Zephyrus G15 2022", ALC289_FIXUP_ASUS_GA401),
293a92c1 10281 SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401),
8d06679b 10282 SND_PCI_QUIRK(0x1043, 0x1f12, "ASUS UM5302", ALC287_FIXUP_CS35L41_I2C_2),
ae53e219 10283 SND_PCI_QUIRK(0x1043, 0x1f1f, "ASUS H7604JI/JV/J3D", ALC245_FIXUP_CS35L41_SPI_2),
51d97607 10284 SND_PCI_QUIRK(0x1043, 0x1f62, "ASUS UX7602ZM", ALC245_FIXUP_CS35L41_SPI_2),
2ea8e129 10285 SND_PCI_QUIRK(0x1043, 0x1f92, "ASUS ROG Flow X16", ALC289_FIXUP_ASUS_GA401),
eeed4cd1 10286 SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
811dd426
SB
10287 SND_PCI_QUIRK(0x1043, 0x3a20, "ASUS G614JZR", ALC245_FIXUP_CS35L41_SPI_2),
10288 SND_PCI_QUIRK(0x1043, 0x3a30, "ASUS G814JVR/JIR", ALC245_FIXUP_CS35L41_SPI_2),
10289 SND_PCI_QUIRK(0x1043, 0x3a40, "ASUS G814JZR", ALC245_FIXUP_CS35L41_SPI_2),
10290 SND_PCI_QUIRK(0x1043, 0x3a50, "ASUS G834JYR/JZR", ALC245_FIXUP_CS35L41_SPI_2),
0bfe1050 10291 SND_PCI_QUIRK(0x1043, 0x3a60, "ASUS G634JYR/JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
adabb3ec
TI
10292 SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
10293 SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
10294 SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
10295 SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
d240d1dc 10296 SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
1d045db9
TI
10297 SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
10298 SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
10299 SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
e9bd7d5c 10300 SND_PCI_QUIRK(0x104d, 0x9099, "Sony VAIO S13", ALC275_FIXUP_SONY_DISABLE_AAMIX),
cab561f8
TI
10301 SND_PCI_QUIRK(0x104d, 0x90b5, "Sony VAIO Pro 11", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
10302 SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
24519911 10303 SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),
4df3fd17 10304 SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT),
cc7016ab 10305 SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN),
fdcc968a 10306 SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC),
c656f747 10307 SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN),
2041d564 10308 SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),
b84e8436 10309 SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE),
c656f747 10310 SND_PCI_QUIRK(0x10ec, 0x118c, "Medion EE4254 MD62100", ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE),
6fa38ef1 10311 SND_PCI_QUIRK(0x10ec, 0x1230, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
4f2e56a5 10312 SND_PCI_QUIRK(0x10ec, 0x124c, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
ce2e79b2
PH
10313 SND_PCI_QUIRK(0x10ec, 0x1252, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
10314 SND_PCI_QUIRK(0x10ec, 0x1254, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
ccbd88be 10315 SND_PCI_QUIRK(0x10ec, 0x12cc, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
a0978123 10316 SND_PCI_QUIRK(0x10ec, 0x12f6, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
1576f263 10317 SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-SZ6", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
a33cc48d 10318 SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
a2d57ebe
KM
10319 SND_PCI_QUIRK(0x144d, 0xc169, "Samsung Notebook 9 Pen (NP930SBE-K01US)", ALC298_FIXUP_SAMSUNG_AMP),
10320 SND_PCI_QUIRK(0x144d, 0xc176, "Samsung Notebook 9 Pro (NP930MBE-K04US)", ALC298_FIXUP_SAMSUNG_AMP),
10321 SND_PCI_QUIRK(0x144d, 0xc189, "Samsung Galaxy Flex Book (NT950QCG-X716)", ALC298_FIXUP_SAMSUNG_AMP),
10322 SND_PCI_QUIRK(0x144d, 0xc18a, "Samsung Galaxy Book Ion (NP930XCJ-K01US)", ALC298_FIXUP_SAMSUNG_AMP),
b18a4563 10323 SND_PCI_QUIRK(0x144d, 0xc1a3, "Samsung Galaxy Book Pro (NP935XDB-KC1SE)", ALC298_FIXUP_SAMSUNG_AMP),
1abfd71e 10324 SND_PCI_QUIRK(0x144d, 0xc1a6, "Samsung Galaxy Book Pro 360 (NP930QBD)", ALC298_FIXUP_SAMSUNG_AMP),
823ff161 10325 SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
a2d57ebe
KM
10326 SND_PCI_QUIRK(0x144d, 0xc812, "Samsung Notebook Pen S (NT950SBE-X58)", ALC298_FIXUP_SAMSUNG_AMP),
10327 SND_PCI_QUIRK(0x144d, 0xc830, "Samsung Galaxy Book Ion (NT950XCJ-X716A)", ALC298_FIXUP_SAMSUNG_AMP),
ef248d9b 10328 SND_PCI_QUIRK(0x144d, 0xc832, "Samsung Galaxy Book Flex Alpha (NP730QCJ)", ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
bd401fd7 10329 SND_PCI_QUIRK(0x144d, 0xca03, "Samsung Galaxy Book2 Pro 360 (NP930QED)", ALC298_FIXUP_SAMSUNG_AMP),
a86e79e3 10330 SND_PCI_QUIRK(0x144d, 0xc868, "Samsung Galaxy Book2 Pro (NP930XED)", ALC298_FIXUP_SAMSUNG_AMP),
abaa2274
AA
10331 SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
10332 SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),
8cd65271 10333 SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC),
6ca653e3 10334 SND_PCI_QUIRK(0x152d, 0x1082, "Quanta NL3", ALC269_FIXUP_LIFEBOOK),
7caf3daa 10335 SND_PCI_QUIRK(0x152d, 0x1262, "Huawei NBLB-WAX9N", ALC2XX_FIXUP_HEADSET_MIC),
33affa7f 10336 SND_PCI_QUIRK(0x1558, 0x0353, "Clevo V35[05]SN[CDE]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
b5acfe15 10337 SND_PCI_QUIRK(0x1558, 0x1323, "Clevo N130ZU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
745f260b 10338 SND_PCI_QUIRK(0x1558, 0x1325, "Clevo N15[01][CW]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
b5acfe15
PH
10339 SND_PCI_QUIRK(0x1558, 0x1401, "Clevo L140[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10340 SND_PCI_QUIRK(0x1558, 0x1403, "Clevo N140CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10341 SND_PCI_QUIRK(0x1558, 0x1404, "Clevo N150CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10342 SND_PCI_QUIRK(0x1558, 0x14a1, "Clevo L141MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
33affa7f 10343 SND_PCI_QUIRK(0x1558, 0x2624, "Clevo L240TU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
b5acfe15
PH
10344 SND_PCI_QUIRK(0x1558, 0x4018, "Clevo NV40M[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10345 SND_PCI_QUIRK(0x1558, 0x4019, "Clevo NV40MZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10346 SND_PCI_QUIRK(0x1558, 0x4020, "Clevo NV40MB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
be561ffa 10347 SND_PCI_QUIRK(0x1558, 0x4041, "Clevo NV4[15]PZ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
b5acfe15
PH
10348 SND_PCI_QUIRK(0x1558, 0x40a1, "Clevo NL40GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10349 SND_PCI_QUIRK(0x1558, 0x40c1, "Clevo NL40[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10350 SND_PCI_QUIRK(0x1558, 0x40d1, "Clevo NL41DU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1278cc5a
JS
10351 SND_PCI_QUIRK(0x1558, 0x5015, "Clevo NH5[58]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10352 SND_PCI_QUIRK(0x1558, 0x5017, "Clevo NH7[79]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
b5acfe15
PH
10353 SND_PCI_QUIRK(0x1558, 0x50a3, "Clevo NJ51GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10354 SND_PCI_QUIRK(0x1558, 0x50b3, "Clevo NK50S[BEZ]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10355 SND_PCI_QUIRK(0x1558, 0x50b6, "Clevo NK50S5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10356 SND_PCI_QUIRK(0x1558, 0x50b8, "Clevo NK50SZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10357 SND_PCI_QUIRK(0x1558, 0x50d5, "Clevo NP50D5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1278cc5a
JS
10358 SND_PCI_QUIRK(0x1558, 0x50e1, "Clevo NH5[58]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10359 SND_PCI_QUIRK(0x1558, 0x50e2, "Clevo NH7[79]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
b5acfe15 10360 SND_PCI_QUIRK(0x1558, 0x50f0, "Clevo NH50A[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1d5cfca2 10361 SND_PCI_QUIRK(0x1558, 0x50f2, "Clevo NH50E[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
b5acfe15 10362 SND_PCI_QUIRK(0x1558, 0x50f3, "Clevo NH58DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1d5cfca2
PH
10363 SND_PCI_QUIRK(0x1558, 0x50f5, "Clevo NH55EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10364 SND_PCI_QUIRK(0x1558, 0x50f6, "Clevo NH55DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
b5acfe15
PH
10365 SND_PCI_QUIRK(0x1558, 0x5101, "Clevo S510WU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10366 SND_PCI_QUIRK(0x1558, 0x5157, "Clevo W517GU1", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10367 SND_PCI_QUIRK(0x1558, 0x51a1, "Clevo NS50MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
da209f7a 10368 SND_PCI_QUIRK(0x1558, 0x51b1, "Clevo NS50AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
c250ef89 10369 SND_PCI_QUIRK(0x1558, 0x51b3, "Clevo NS70AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
b7a58228 10370 SND_PCI_QUIRK(0x1558, 0x5630, "Clevo NP50RNJS", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
b5acfe15
PH
10371 SND_PCI_QUIRK(0x1558, 0x70a1, "Clevo NB70T[HJK]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10372 SND_PCI_QUIRK(0x1558, 0x70b3, "Clevo NK70SB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1d5cfca2
PH
10373 SND_PCI_QUIRK(0x1558, 0x70f2, "Clevo NH79EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10374 SND_PCI_QUIRK(0x1558, 0x70f3, "Clevo NH77DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10375 SND_PCI_QUIRK(0x1558, 0x70f4, "Clevo NH77EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10376 SND_PCI_QUIRK(0x1558, 0x70f6, "Clevo NH77DPQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
627ce0d6 10377 SND_PCI_QUIRK(0x1558, 0x7716, "Clevo NS50PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
90d74fdb 10378 SND_PCI_QUIRK(0x1558, 0x7717, "Clevo NS70PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
11bea269 10379 SND_PCI_QUIRK(0x1558, 0x7718, "Clevo L140PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
0a6b36c5 10380 SND_PCI_QUIRK(0x1558, 0x7724, "Clevo L140AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
b5acfe15
PH
10381 SND_PCI_QUIRK(0x1558, 0x8228, "Clevo NR40BU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10382 SND_PCI_QUIRK(0x1558, 0x8520, "Clevo NH50D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10383 SND_PCI_QUIRK(0x1558, 0x8521, "Clevo NH77D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10384 SND_PCI_QUIRK(0x1558, 0x8535, "Clevo NH50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10385 SND_PCI_QUIRK(0x1558, 0x8536, "Clevo NH79D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
745f260b
WS
10386 SND_PCI_QUIRK(0x1558, 0x8550, "Clevo NH[57][0-9][ER][ACDH]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10387 SND_PCI_QUIRK(0x1558, 0x8551, "Clevo NH[57][0-9][ER][ACDH]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10388 SND_PCI_QUIRK(0x1558, 0x8560, "Clevo NH[57][0-9][ER][ACDH]Q", ALC269_FIXUP_HEADSET_MIC),
10389 SND_PCI_QUIRK(0x1558, 0x8561, "Clevo NH[57][0-9][ER][ACDH]Q", ALC269_FIXUP_HEADSET_MIC),
10390 SND_PCI_QUIRK(0x1558, 0x8562, "Clevo NH[57][0-9]RZ[Q]", ALC269_FIXUP_DMIC),
b5acfe15 10391 SND_PCI_QUIRK(0x1558, 0x8668, "Clevo NP50B[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9cb72750 10392 SND_PCI_QUIRK(0x1558, 0x866d, "Clevo NP5[05]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
86222af0 10393 SND_PCI_QUIRK(0x1558, 0x867c, "Clevo NP7[01]PNP", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
0c20fce1 10394 SND_PCI_QUIRK(0x1558, 0x867d, "Clevo NP7[01]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
b5acfe15 10395 SND_PCI_QUIRK(0x1558, 0x8680, "Clevo NJ50LU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
edca7cc4 10396 SND_PCI_QUIRK(0x1558, 0x8686, "Clevo NH50[CZ]U", ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME),
b5acfe15
PH
10397 SND_PCI_QUIRK(0x1558, 0x8a20, "Clevo NH55DCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10398 SND_PCI_QUIRK(0x1558, 0x8a51, "Clevo NH70RCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10399 SND_PCI_QUIRK(0x1558, 0x8d50, "Clevo NH55RCQ-M", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10400 SND_PCI_QUIRK(0x1558, 0x951d, "Clevo N950T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1d5cfca2 10401 SND_PCI_QUIRK(0x1558, 0x9600, "Clevo N960K[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
b5acfe15
PH
10402 SND_PCI_QUIRK(0x1558, 0x961d, "Clevo N960S[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10403 SND_PCI_QUIRK(0x1558, 0x971d, "Clevo N970T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
745f260b
WS
10404 SND_PCI_QUIRK(0x1558, 0xa500, "Clevo NL5[03]RU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10405 SND_PCI_QUIRK(0x1558, 0xa600, "Clevo NL50NU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
22065e42 10406 SND_PCI_QUIRK(0x1558, 0xa650, "Clevo NP[567]0SN[CD]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
b7a58228 10407 SND_PCI_QUIRK(0x1558, 0xa671, "Clevo NP70SN[CDE]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
1d5cfca2
PH
10408 SND_PCI_QUIRK(0x1558, 0xb018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10409 SND_PCI_QUIRK(0x1558, 0xb019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10410 SND_PCI_QUIRK(0x1558, 0xb022, "Clevo NH77D[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10411 SND_PCI_QUIRK(0x1558, 0xc018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10412 SND_PCI_QUIRK(0x1558, 0xc019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10413 SND_PCI_QUIRK(0x1558, 0xc022, "Clevo NH77[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
ca169cc2 10414 SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
29c8f40b 10415 SND_PCI_QUIRK(0x17aa, 0x1048, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),
1d045db9
TI
10416 SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
10417 SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
10418 SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
10419 SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
10420 SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
f552ff54 10421 SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),
b590b38c 10422 SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST),
c8415a48 10423 SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK),
4407be6b 10424 SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),
108cc108 10425 SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK),
aaedfb47 10426 SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK),
9a811230 10427 SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440),
1c37c223 10428 SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK),
a12137e7 10429 SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK),
59a51a6b 10430 SND_PCI_QUIRK(0x17aa, 0x2211, "Thinkpad W541", ALC292_FIXUP_TPT440_DOCK),
6d16941a 10431 SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK),
7c21539c 10432 SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK),
a4a9e082 10433 SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
b6903c0e 10434 SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK),
d05ea7da 10435 SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK),
c0278669 10436 SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK),
61fcf8ec
KY
10437 SND_PCI_QUIRK(0x17aa, 0x222d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10438 SND_PCI_QUIRK(0x17aa, 0x222e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
dab38e43 10439 SND_PCI_QUIRK(0x17aa, 0x2231, "Thinkpad T560", ALC292_FIXUP_TPT460),
c636b95e 10440 SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460),
f74ab0c5 10441 SND_PCI_QUIRK(0x17aa, 0x2234, "Thinkpad ICE-1", ALC287_FIXUP_TAS2781_I2C),
61fcf8ec
KY
10442 SND_PCI_QUIRK(0x17aa, 0x2245, "Thinkpad T470", ALC298_FIXUP_TPT470_DOCK),
10443 SND_PCI_QUIRK(0x17aa, 0x2246, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10444 SND_PCI_QUIRK(0x17aa, 0x2247, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
e4c07b3b 10445 SND_PCI_QUIRK(0x17aa, 0x2249, "Thinkpad", ALC292_FIXUP_TPT460),
61fcf8ec
KY
10446 SND_PCI_QUIRK(0x17aa, 0x224b, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10447 SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10448 SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
85981dfd 10449 SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9774dc21 10450 SND_PCI_QUIRK(0x17aa, 0x2292, "Thinkpad X1 Carbon 7th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
ca707b3f 10451 SND_PCI_QUIRK(0x17aa, 0x22be, "Thinkpad X1 Carbon 8th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
446b8185
KY
10452 SND_PCI_QUIRK(0x17aa, 0x22c1, "Thinkpad P1 Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
10453 SND_PCI_QUIRK(0x17aa, 0x22c2, "Thinkpad X1 Extreme Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
d93eeca6
KY
10454 SND_PCI_QUIRK(0x17aa, 0x22f1, "Thinkpad", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10455 SND_PCI_QUIRK(0x17aa, 0x22f2, "Thinkpad", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10456 SND_PCI_QUIRK(0x17aa, 0x22f3, "Thinkpad", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10457 SND_PCI_QUIRK(0x17aa, 0x2316, "Thinkpad P1 Gen 6", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10458 SND_PCI_QUIRK(0x17aa, 0x2317, "Thinkpad P1 Gen 6", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10459 SND_PCI_QUIRK(0x17aa, 0x2318, "Thinkpad Z13 Gen2", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10460 SND_PCI_QUIRK(0x17aa, 0x2319, "Thinkpad Z16 Gen2", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10461 SND_PCI_QUIRK(0x17aa, 0x231a, "Thinkpad Z16 Gen2", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
1e707769
KY
10462 SND_PCI_QUIRK(0x17aa, 0x231e, "Thinkpad", ALC287_FIXUP_LENOVO_THKPAD_WH_ALC1318),
10463 SND_PCI_QUIRK(0x17aa, 0x231f, "Thinkpad", ALC287_FIXUP_LENOVO_THKPAD_WH_ALC1318),
3694cb29 10464 SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
6ef2f68f 10465 SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
f33f79f3 10466 SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
bef33e19 10467 SND_PCI_QUIRK(0x17aa, 0x3111, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
e41fc8c5 10468 SND_PCI_QUIRK(0x17aa, 0x312a, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
65811834 10469 SND_PCI_QUIRK(0x17aa, 0x312f, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
8da5bbfc 10470 SND_PCI_QUIRK(0x17aa, 0x313c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
2a36c16e 10471 SND_PCI_QUIRK(0x17aa, 0x3151, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
8a6c55d0
AM
10472 SND_PCI_QUIRK(0x17aa, 0x3176, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
10473 SND_PCI_QUIRK(0x17aa, 0x3178, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
e4efa826 10474 SND_PCI_QUIRK(0x17aa, 0x31af, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),
fb3c007f 10475 SND_PCI_QUIRK(0x17aa, 0x334b, "Lenovo ThinkCentre M70 Gen5", ALC283_FIXUP_HEADSET_MIC),
3790a3d6 10476 SND_PCI_QUIRK(0x17aa, 0x3801, "Lenovo Yoga9 14IAP7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
0ac32a39 10477 SND_PCI_QUIRK(0x17aa, 0x3802, "Lenovo Yoga Pro 9 14IRP8 / DuetITL 2021", ALC287_FIXUP_LENOVO_14IRP8_DUETITL),
2aac550d 10478 SND_PCI_QUIRK(0x17aa, 0x3813, "Legion 7i 15IMHG05", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
56ec3e75 10479 SND_PCI_QUIRK(0x17aa, 0x3818, "Lenovo C940 / Yoga Duet 7", ALC298_FIXUP_LENOVO_C940_DUET7),
2aac550d 10480 SND_PCI_QUIRK(0x17aa, 0x3819, "Lenovo 13s Gen2 ITL", ALC287_FIXUP_13S_GEN2_SPEAKERS),
3b79954f 10481 SND_PCI_QUIRK(0x17aa, 0x3820, "Yoga Duet 7 13ITL6", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
8f4c9042 10482 SND_PCI_QUIRK(0x17aa, 0x3824, "Legion Y9000X 2020", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),
2aac550d 10483 SND_PCI_QUIRK(0x17aa, 0x3827, "Ideapad S740", ALC285_FIXUP_IDEAPAD_S740_COEF),
b81e9e5c 10484 SND_PCI_QUIRK(0x17aa, 0x3834, "Lenovo IdeaPad Slim 9i 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
c07f2c7b 10485 SND_PCI_QUIRK(0x17aa, 0x383d, "Legion Y9000X 2019", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),
9ebaef05 10486 SND_PCI_QUIRK(0x17aa, 0x3843, "Yoga 9i", ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP),
d3dca026 10487 SND_PCI_QUIRK(0x17aa, 0x3847, "Legion 7 16ACHG6", ALC287_FIXUP_LEGION_16ACHG6),
2aac550d 10488 SND_PCI_QUIRK(0x17aa, 0x384a, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
ad7cc2d4
CB
10489 SND_PCI_QUIRK(0x17aa, 0x3852, "Lenovo Yoga 7 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
10490 SND_PCI_QUIRK(0x17aa, 0x3853, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
1e24881d 10491 SND_PCI_QUIRK(0x17aa, 0x3855, "Legion 7 16ITHG6", ALC287_FIXUP_LEGION_16ITHG6),
25f46354
SB
10492 SND_PCI_QUIRK(0x17aa, 0x3865, "Lenovo 13X", ALC287_FIXUP_CS35L41_I2C_2),
10493 SND_PCI_QUIRK(0x17aa, 0x3866, "Lenovo 13X", ALC287_FIXUP_CS35L41_I2C_2),
70cfdd03 10494 SND_PCI_QUIRK(0x17aa, 0x3869, "Lenovo Yoga7 14IAL7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
39815cdf 10495 SND_PCI_QUIRK(0x17aa, 0x386f, "Legion Pro 7/7i", ALC287_FIXUP_LENOVO_LEGION_7),
b5cb53fd 10496 SND_PCI_QUIRK(0x17aa, 0x3870, "Lenovo Yoga 7 14ARB7", ALC287_FIXUP_YOGA7_14ARB7_I2C),
b67a7dc4
CB
10497 SND_PCI_QUIRK(0x17aa, 0x3877, "Lenovo Legion 7 Slim 16ARHA7", ALC287_FIXUP_CS35L41_I2C_2),
10498 SND_PCI_QUIRK(0x17aa, 0x3878, "Lenovo Legion 7 Slim 16ARHA7", ALC287_FIXUP_CS35L41_I2C_2),
3babae91
SD
10499 SND_PCI_QUIRK(0x17aa, 0x387d, "Yoga S780-16 pro Quad AAC", ALC287_FIXUP_TAS2781_I2C),
10500 SND_PCI_QUIRK(0x17aa, 0x387e, "Yoga S780-16 pro Quad YC", ALC287_FIXUP_TAS2781_I2C),
f286620b 10501 SND_PCI_QUIRK(0x17aa, 0x3881, "YB9 dual power mode2 YC", ALC287_FIXUP_TAS2781_I2C),
634e5e1e 10502 SND_PCI_QUIRK(0x17aa, 0x3882, "Lenovo Yoga Pro 7 14APH8", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
3babae91
SD
10503 SND_PCI_QUIRK(0x17aa, 0x3884, "Y780 YG DUAL", ALC287_FIXUP_TAS2781_I2C),
10504 SND_PCI_QUIRK(0x17aa, 0x3886, "Y780 VECO DUAL", ALC287_FIXUP_TAS2781_I2C),
10505 SND_PCI_QUIRK(0x17aa, 0x38a7, "Y780P AMD YG dual", ALC287_FIXUP_TAS2781_I2C),
10506 SND_PCI_QUIRK(0x17aa, 0x38a8, "Y780P AMD VECO dual", ALC287_FIXUP_TAS2781_I2C),
dca5f4df
HZ
10507 SND_PCI_QUIRK(0x17aa, 0x38a9, "Thinkbook 16P", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10508 SND_PCI_QUIRK(0x17aa, 0x38ab, "Thinkbook 16P", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
99af5b11
DC
10509 SND_PCI_QUIRK(0x17aa, 0x38b4, "Legion Slim 7 16IRH8", ALC287_FIXUP_CS35L41_I2C_2),
10510 SND_PCI_QUIRK(0x17aa, 0x38b5, "Legion Slim 7 16IRH8", ALC287_FIXUP_CS35L41_I2C_2),
10511 SND_PCI_QUIRK(0x17aa, 0x38b6, "Legion Slim 7 16APH8", ALC287_FIXUP_CS35L41_I2C_2),
10512 SND_PCI_QUIRK(0x17aa, 0x38b7, "Legion Slim 7 16APH8", ALC287_FIXUP_CS35L41_I2C_2),
3babae91
SD
10513 SND_PCI_QUIRK(0x17aa, 0x38ba, "Yoga S780-14.5 Air AMD quad YC", ALC287_FIXUP_TAS2781_I2C),
10514 SND_PCI_QUIRK(0x17aa, 0x38bb, "Yoga S780-14.5 Air AMD quad AAC", ALC287_FIXUP_TAS2781_I2C),
10515 SND_PCI_QUIRK(0x17aa, 0x38be, "Yoga S980-14.5 proX YC Dual", ALC287_FIXUP_TAS2781_I2C),
10516 SND_PCI_QUIRK(0x17aa, 0x38bf, "Yoga S980-14.5 proX LX Dual", ALC287_FIXUP_TAS2781_I2C),
10517 SND_PCI_QUIRK(0x17aa, 0x38c3, "Y980 DUAL", ALC287_FIXUP_TAS2781_I2C),
10518 SND_PCI_QUIRK(0x17aa, 0x38cb, "Y790 YG DUAL", ALC287_FIXUP_TAS2781_I2C),
10519 SND_PCI_QUIRK(0x17aa, 0x38cd, "Y790 VECO DUAL", ALC287_FIXUP_TAS2781_I2C),
9b714a59
JZ
10520 SND_PCI_QUIRK(0x17aa, 0x38d2, "Lenovo Yoga 9 14IMH9", ALC287_FIXUP_YOGA9_14IMH9_BASS_SPK_PIN),
10521 SND_PCI_QUIRK(0x17aa, 0x38d7, "Lenovo Yoga 9 14IMH9", ALC287_FIXUP_YOGA9_14IMH9_BASS_SPK_PIN),
56f27013 10522 SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
fedb2245 10523 SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
56df90b6 10524 SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
f552ff54 10525 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
a4a9e082 10526 SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
1bb3e062 10527 SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC),
c497d9f9 10528 SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK),
cd5302c0 10529 SND_PCI_QUIRK(0x17aa, 0x5026, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
f2aa1110 10530 SND_PCI_QUIRK(0x17aa, 0x5034, "Thinkpad T450", ALC292_FIXUP_TPT440_DOCK),
80b311d3 10531 SND_PCI_QUIRK(0x17aa, 0x5036, "Thinkpad T450s", ALC292_FIXUP_TPT440_DOCK),
09ea9976 10532 SND_PCI_QUIRK(0x17aa, 0x503c, "Thinkpad L450", ALC292_FIXUP_TPT440_DOCK),
037e1197 10533 SND_PCI_QUIRK(0x17aa, 0x504a, "ThinkPad X260", ALC292_FIXUP_TPT440_DOCK),
23adc192 10534 SND_PCI_QUIRK(0x17aa, 0x504b, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
0f087ee3 10535 SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460),
9cd25743 10536 SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460),
0f087ee3 10537 SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460),
61fcf8ec
KY
10538 SND_PCI_QUIRK(0x17aa, 0x505d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10539 SND_PCI_QUIRK(0x17aa, 0x505f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10540 SND_PCI_QUIRK(0x17aa, 0x5062, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
264fb034 10541 SND_PCI_QUIRK(0x17aa, 0x508b, "Thinkpad X12 Gen 1", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
cd5302c0 10542 SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
61fcf8ec
KY
10543 SND_PCI_QUIRK(0x17aa, 0x511e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10544 SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
1d045db9 10545 SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
52aad393 10546 SND_PCI_QUIRK(0x17aa, 0x9e56, "Lenovo ZhaoYang CF4620Z", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
174a7fb3 10547 SND_PCI_QUIRK(0x1849, 0x1233, "ASRock NUC Box 1100", ALC233_FIXUP_NO_AUDIO_JACK),
79e28f2a 10548 SND_PCI_QUIRK(0x1849, 0xa233, "Positivo Master C6300", ALC269_FIXUP_HEADSET_MIC),
1e5dc398
HW
10549 SND_PCI_QUIRK(0x1854, 0x0440, "LG CQ6", ALC256_FIXUP_HEADPHONE_AMP_VOL),
10550 SND_PCI_QUIRK(0x1854, 0x0441, "LG CQ6 AIO", ALC256_FIXUP_HEADPHONE_AMP_VOL),
0fbf21c3 10551 SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS),
cbcdf8c4 10552 SND_PCI_QUIRK(0x19e5, 0x320f, "Huawei WRT-WX9 ", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
f1ec5be1
HC
10553 SND_PCI_QUIRK(0x1b35, 0x1235, "CZC B20", ALC269_FIXUP_CZC_B20),
10554 SND_PCI_QUIRK(0x1b35, 0x1236, "CZC TMI", ALC269_FIXUP_CZC_TMI),
10555 SND_PCI_QUIRK(0x1b35, 0x1237, "CZC L101", ALC269_FIXUP_CZC_L101),
02b504d9 10556 SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */
c656f747
TI
10557 SND_PCI_QUIRK(0x1c06, 0x2013, "Lemote A1802", ALC269_FIXUP_LEMOTE_A1802),
10558 SND_PCI_QUIRK(0x1c06, 0x2015, "Lemote A190X", ALC269_FIXUP_LEMOTE_A190X),
88d18b88 10559 SND_PCI_QUIRK(0x1c6c, 0x1251, "Positivo N14KP6-TG", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE),
619764cc 10560 SND_PCI_QUIRK(0x1d05, 0x1132, "TongFang PHxTxX1", ALC256_FIXUP_SET_COEF_DEFAULTS),
8b3b2392
WS
10561 SND_PCI_QUIRK(0x1d05, 0x1096, "TongFang GMxMRxx", ALC269_FIXUP_NO_SHUTUP),
10562 SND_PCI_QUIRK(0x1d05, 0x1100, "TongFang GKxNRxx", ALC269_FIXUP_NO_SHUTUP),
10563 SND_PCI_QUIRK(0x1d05, 0x1111, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
10564 SND_PCI_QUIRK(0x1d05, 0x1119, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
10565 SND_PCI_QUIRK(0x1d05, 0x1129, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
10566 SND_PCI_QUIRK(0x1d05, 0x1147, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP),
10567 SND_PCI_QUIRK(0x1d05, 0x115c, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP),
10568 SND_PCI_QUIRK(0x1d05, 0x121b, "TongFang GMxAGxx", ALC269_FIXUP_NO_SHUTUP),
daf6c468 10569 SND_PCI_QUIRK(0x1d05, 0x1387, "TongFang GMxIXxx", ALC2XX_FIXUP_HEADSET_MIC),
7ee5faad 10570 SND_PCI_QUIRK(0x1d17, 0x3288, "Haier Boyue G42", ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS),
fc19d559 10571 SND_PCI_QUIRK(0x1d72, 0x1602, "RedmiBook", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
b95bc12e 10572 SND_PCI_QUIRK(0x1d72, 0x1701, "XiaomiNotebook Pro", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE),
695d1ec3 10573 SND_PCI_QUIRK(0x1d72, 0x1901, "RedmiBook 14", ALC256_FIXUP_ASUS_HEADSET_MIC),
9b043a8f 10574 SND_PCI_QUIRK(0x1d72, 0x1945, "Redmi G", ALC256_FIXUP_ASUS_HEADSET_MIC),
e1c86210 10575 SND_PCI_QUIRK(0x1d72, 0x1947, "RedmiBook Air", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
7c9caa29 10576 SND_PCI_QUIRK(0x2782, 0x0232, "CHUWI CoreBook XPro", ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO),
c7de2d9b 10577 SND_PCI_QUIRK(0x2782, 0x1707, "Vaio VJFE-ADL", ALC298_FIXUP_SPK_VOLUME),
d1ee66c5 10578 SND_PCI_QUIRK(0x8086, 0x2074, "Intel NUC 8", ALC233_FIXUP_INTEL_NUC8_DMIC),
e2d2fded 10579 SND_PCI_QUIRK(0x8086, 0x2080, "Intel NUC 8 Rugged", ALC256_FIXUP_INTEL_NUC8_RUGGED),
73e7161e 10580 SND_PCI_QUIRK(0x8086, 0x2081, "Intel NUC 10", ALC256_FIXUP_INTEL_NUC10),
ccbd88be 10581 SND_PCI_QUIRK(0x8086, 0x3038, "Intel NUC 13", ALC295_FIXUP_CHROME_BOOK),
309d7363 10582 SND_PCI_QUIRK(0xf111, 0x0001, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
8804fa04 10583 SND_PCI_QUIRK(0xf111, 0x0005, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
33038efb 10584 SND_PCI_QUIRK(0xf111, 0x0006, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
a4297b5d 10585
a7f3eedc 10586#if 0
a4297b5d
TI
10587 /* Below is a quirk table taken from the old code.
10588 * Basically the device should work as is without the fixup table.
10589 * If BIOS doesn't give a proper info, enable the corresponding
10590 * fixup entry.
7d7eb9ea 10591 */
a4297b5d
TI
10592 SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
10593 ALC269_FIXUP_AMIC),
10594 SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC),
a4297b5d
TI
10595 SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC),
10596 SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC),
10597 SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC),
10598 SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269_FIXUP_AMIC),
10599 SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269_FIXUP_AMIC),
10600 SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269_FIXUP_AMIC),
10601 SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_FIXUP_AMIC),
10602 SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269_FIXUP_AMIC),
10603 SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_FIXUP_AMIC),
10604 SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_FIXUP_AMIC),
10605 SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_FIXUP_AMIC),
10606 SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_FIXUP_AMIC),
10607 SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_FIXUP_AMIC),
10608 SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_FIXUP_AMIC),
10609 SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_FIXUP_AMIC),
10610 SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_FIXUP_AMIC),
10611 SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_FIXUP_AMIC),
10612 SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_FIXUP_AMIC),
10613 SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_FIXUP_AMIC),
10614 SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_FIXUP_AMIC),
10615 SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_FIXUP_AMIC),
10616 SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_FIXUP_AMIC),
10617 SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_FIXUP_AMIC),
10618 SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_FIXUP_AMIC),
10619 SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_FIXUP_AMIC),
10620 SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_FIXUP_AMIC),
10621 SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_FIXUP_AMIC),
10622 SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_FIXUP_AMIC),
10623 SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_FIXUP_AMIC),
10624 SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_FIXUP_AMIC),
10625 SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_FIXUP_AMIC),
10626 SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_FIXUP_AMIC),
10627 SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_FIXUP_AMIC),
10628 SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_FIXUP_DMIC),
10629 SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_FIXUP_AMIC),
10630 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_AMIC),
10631 SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_FIXUP_DMIC),
10632 SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_FIXUP_DMIC),
10633#endif
10634 {}
10635};
10636
214eef76
DH
10637static const struct snd_pci_quirk alc269_fixup_vendor_tbl[] = {
10638 SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
10639 SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED),
10640 SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
10641 SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", ALC269_FIXUP_THINKPAD_ACPI),
0fbf21c3 10642 SND_PCI_QUIRK_VENDOR(0x19e5, "Huawei Matebook", ALC255_FIXUP_MIC_MUTE_LED),
214eef76
DH
10643 {}
10644};
10645
1727a771 10646static const struct hda_model_fixup alc269_fixup_models[] = {
a4297b5d
TI
10647 {.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"},
10648 {.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"},
6e72aa5f
TI
10649 {.id = ALC269_FIXUP_STEREO_DMIC, .name = "alc269-dmic"},
10650 {.id = ALC271_FIXUP_DMIC, .name = "alc271-dmic"},
10651 {.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"},
7c478f03 10652 {.id = ALC269_FIXUP_HEADSET_MIC, .name = "headset-mic"},
b016951e
TI
10653 {.id = ALC269_FIXUP_HEADSET_MODE, .name = "headset-mode"},
10654 {.id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, .name = "headset-mode-no-hp-mic"},
108cc108 10655 {.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
b590b38c 10656 {.id = ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST, .name = "lenovo-dock-limit-boost"},
9f5c6faf 10657 {.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
04d5466a 10658 {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic1-led"},
e32aa85a
DH
10659 {.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
10660 {.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
a26d96c7
TI
10661 {.id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, .name = "dell-headset3"},
10662 {.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, .name = "dell-headset4"},
be8ef16a 10663 {.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},
0202e99c 10664 {.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"},
1c37c223 10665 {.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
9a811230 10666 {.id = ALC292_FIXUP_TPT440, .name = "tpt440"},
c636b95e 10667 {.id = ALC292_FIXUP_TPT460, .name = "tpt460"},
399c01aa 10668 {.id = ALC298_FIXUP_TPT470_DOCK_FIX, .name = "tpt470-dock-fix"},
a26d96c7 10669 {.id = ALC298_FIXUP_TPT470_DOCK, .name = "tpt470-dock"},
ba90d6a6 10670 {.id = ALC233_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
28d1d6d2 10671 {.id = ALC700_FIXUP_INTEL_REFERENCE, .name = "alc700-ref"},
a26d96c7
TI
10672 {.id = ALC269_FIXUP_SONY_VAIO, .name = "vaio"},
10673 {.id = ALC269_FIXUP_DELL_M101Z, .name = "dell-m101z"},
10674 {.id = ALC269_FIXUP_ASUS_G73JW, .name = "asus-g73jw"},
10675 {.id = ALC269_FIXUP_LENOVO_EAPD, .name = "lenovo-eapd"},
10676 {.id = ALC275_FIXUP_SONY_HWEQ, .name = "sony-hweq"},
10677 {.id = ALC269_FIXUP_PCM_44K, .name = "pcm44k"},
10678 {.id = ALC269_FIXUP_LIFEBOOK, .name = "lifebook"},
10679 {.id = ALC269_FIXUP_LIFEBOOK_EXTMIC, .name = "lifebook-extmic"},
10680 {.id = ALC269_FIXUP_LIFEBOOK_HP_PIN, .name = "lifebook-hp-pin"},
10681 {.id = ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC, .name = "lifebook-u7x7"},
10682 {.id = ALC269VB_FIXUP_AMIC, .name = "alc269vb-amic"},
10683 {.id = ALC269VB_FIXUP_DMIC, .name = "alc269vb-dmic"},
10684 {.id = ALC269_FIXUP_HP_MUTE_LED_MIC1, .name = "hp-mute-led-mic1"},
10685 {.id = ALC269_FIXUP_HP_MUTE_LED_MIC2, .name = "hp-mute-led-mic2"},
10686 {.id = ALC269_FIXUP_HP_MUTE_LED_MIC3, .name = "hp-mute-led-mic3"},
10687 {.id = ALC269_FIXUP_HP_GPIO_MIC1_LED, .name = "hp-gpio-mic1"},
10688 {.id = ALC269_FIXUP_HP_LINE1_MIC1_LED, .name = "hp-line1-mic1"},
10689 {.id = ALC269_FIXUP_NO_SHUTUP, .name = "noshutup"},
10690 {.id = ALC286_FIXUP_SONY_MIC_NO_PRESENCE, .name = "sony-nomic"},
10691 {.id = ALC269_FIXUP_ASPIRE_HEADSET_MIC, .name = "aspire-headset-mic"},
10692 {.id = ALC269_FIXUP_ASUS_X101, .name = "asus-x101"},
10693 {.id = ALC271_FIXUP_HP_GATE_MIC_JACK, .name = "acer-ao7xx"},
10694 {.id = ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572, .name = "acer-aspire-e1"},
10695 {.id = ALC269_FIXUP_ACER_AC700, .name = "acer-ac700"},
10696 {.id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST, .name = "limit-mic-boost"},
10697 {.id = ALC269VB_FIXUP_ASUS_ZENBOOK, .name = "asus-zenbook"},
10698 {.id = ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A, .name = "asus-zenbook-ux31a"},
10699 {.id = ALC269VB_FIXUP_ORDISSIMO_EVE2, .name = "ordissimo"},
10700 {.id = ALC282_FIXUP_ASUS_TX300, .name = "asus-tx300"},
10701 {.id = ALC283_FIXUP_INT_MIC, .name = "alc283-int-mic"},
10702 {.id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK, .name = "mono-speakers"},
10703 {.id = ALC290_FIXUP_SUBWOOFER_HSJACK, .name = "alc290-subwoofer"},
10704 {.id = ALC269_FIXUP_THINKPAD_ACPI, .name = "thinkpad"},
10705 {.id = ALC269_FIXUP_DMIC_THINKPAD_ACPI, .name = "dmic-thinkpad"},
10706 {.id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE, .name = "alc255-acer"},
10707 {.id = ALC255_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc255-asus"},
10708 {.id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc255-dell1"},
10709 {.id = ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "alc255-dell2"},
10710 {.id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc293-dell1"},
10711 {.id = ALC283_FIXUP_HEADSET_MIC, .name = "alc283-headset"},
b3802783 10712 {.id = ALC255_FIXUP_MIC_MUTE_LED, .name = "alc255-dell-mute"},
a26d96c7 10713 {.id = ALC282_FIXUP_ASPIRE_V5_PINS, .name = "aspire-v5"},
c8426b27 10714 {.id = ALC269VB_FIXUP_ASPIRE_E1_COEF, .name = "aspire-e1-coef"},
a26d96c7
TI
10715 {.id = ALC280_FIXUP_HP_GPIO4, .name = "hp-gpio4"},
10716 {.id = ALC286_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
10717 {.id = ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY, .name = "hp-gpio2-hotkey"},
10718 {.id = ALC280_FIXUP_HP_DOCK_PINS, .name = "hp-dock-pins"},
10719 {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic"},
10720 {.id = ALC280_FIXUP_HP_9480M, .name = "hp-9480m"},
10721 {.id = ALC288_FIXUP_DELL_HEADSET_MODE, .name = "alc288-dell-headset"},
10722 {.id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc288-dell1"},
10723 {.id = ALC288_FIXUP_DELL_XPS_13, .name = "alc288-dell-xps13"},
10724 {.id = ALC292_FIXUP_DELL_E7X, .name = "dell-e7x"},
10725 {.id = ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK, .name = "alc293-dell"},
10726 {.id = ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc298-dell1"},
10727 {.id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, .name = "alc298-dell-aio"},
10728 {.id = ALC275_FIXUP_DELL_XPS, .name = "alc275-dell-xps"},
a26d96c7
TI
10729 {.id = ALC293_FIXUP_LENOVO_SPK_NOISE, .name = "lenovo-spk-noise"},
10730 {.id = ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, .name = "lenovo-hotkey"},
10731 {.id = ALC255_FIXUP_DELL_SPK_NOISE, .name = "dell-spk-noise"},
82aa0d7e 10732 {.id = ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc225-dell1"},
a26d96c7 10733 {.id = ALC295_FIXUP_DISABLE_DAC3, .name = "alc295-disable-dac3"},
d2cd795c 10734 {.id = ALC285_FIXUP_SPEAKER2_TO_DAC1, .name = "alc285-speaker2-to-dac1"},
a26d96c7
TI
10735 {.id = ALC280_FIXUP_HP_HEADSET_MIC, .name = "alc280-hp-headset"},
10736 {.id = ALC221_FIXUP_HP_FRONT_MIC, .name = "alc221-hp-mic"},
10737 {.id = ALC298_FIXUP_SPK_VOLUME, .name = "alc298-spk-volume"},
10738 {.id = ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER, .name = "dell-inspiron-7559"},
10739 {.id = ALC269_FIXUP_ATIV_BOOK_8, .name = "ativ-book"},
10740 {.id = ALC221_FIXUP_HP_MIC_NO_PRESENCE, .name = "alc221-hp-mic"},
10741 {.id = ALC256_FIXUP_ASUS_HEADSET_MODE, .name = "alc256-asus-headset"},
10742 {.id = ALC256_FIXUP_ASUS_MIC, .name = "alc256-asus-mic"},
10743 {.id = ALC256_FIXUP_ASUS_AIO_GPIO2, .name = "alc256-asus-aio"},
10744 {.id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc233-asus"},
10745 {.id = ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE, .name = "alc233-eapd"},
10746 {.id = ALC294_FIXUP_LENOVO_MIC_LOCATION, .name = "alc294-lenovo-mic"},
10747 {.id = ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE, .name = "alc225-wyse"},
10748 {.id = ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, .name = "alc274-dell-aio"},
10749 {.id = ALC255_FIXUP_DUMMY_LINEOUT_VERB, .name = "alc255-dummy-lineout"},
10750 {.id = ALC255_FIXUP_DELL_HEADSET_MIC, .name = "alc255-dell-headset"},
10751 {.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"},
8983eb60
KY
10752 {.id = ALC225_FIXUP_HEADSET_JACK, .name = "alc-headset-jack"},
10753 {.id = ALC295_FIXUP_CHROME_BOOK, .name = "alc-chrome-book"},
e2a829b3 10754 {.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"},
a2ef03fe 10755 {.id = ALC298_FIXUP_HUAWEI_MBX_STEREO, .name = "huawei-mbx-stereo"},
bd9c10bc 10756 {.id = ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, .name = "alc256-medion-headset"},
a2d57ebe 10757 {.id = ALC298_FIXUP_SAMSUNG_AMP, .name = "alc298-samsung-amp"},
ef248d9b 10758 {.id = ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET, .name = "alc256-samsung-headphone"},
fc19d559 10759 {.id = ALC255_FIXUP_XIAOMI_HEADSET_MIC, .name = "alc255-xiaomi-headset"},
13468bfa 10760 {.id = ALC274_FIXUP_HP_MIC, .name = "alc274-hp-mic-detect"},
c3bb2b52 10761 {.id = ALC245_FIXUP_HP_X360_AMP, .name = "alc245-hp-x360-amp"},
5d84b531 10762 {.id = ALC295_FIXUP_HP_OMEN, .name = "alc295-hp-omen"},
f2be77fe 10763 {.id = ALC285_FIXUP_HP_SPECTRE_X360, .name = "alc285-hp-spectre-x360"},
d94befbb 10764 {.id = ALC285_FIXUP_HP_SPECTRE_X360_EB1, .name = "alc285-hp-spectre-x360-eb1"},
c0621669 10765 {.id = ALC285_FIXUP_HP_ENVY_X360, .name = "alc285-hp-envy-x360"},
9ebaef05 10766 {.id = ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP, .name = "alc287-ideapad-bass-spk-amp"},
3790a3d6 10767 {.id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN, .name = "alc287-yoga9-bass-spk-pin"},
29c8f40b 10768 {.id = ALC623_FIXUP_LENOVO_THINKSTATION_P340, .name = "alc623-lenovo-thinkstation-p340"},
57c9e21a 10769 {.id = ALC255_FIXUP_ACER_HEADPHONE_AND_MIC, .name = "alc255-acer-headphone-and-mic"},
aa723946 10770 {.id = ALC285_FIXUP_HP_GPIO_AMP_INIT, .name = "alc285-hp-amp-init"},
1d045db9 10771 {}
6dda9f4a 10772};
cfc5a845 10773#define ALC225_STANDARD_PINS \
cfc5a845 10774 {0x21, 0x04211020}
6dda9f4a 10775
e8191a8e
HW
10776#define ALC256_STANDARD_PINS \
10777 {0x12, 0x90a60140}, \
10778 {0x14, 0x90170110}, \
e8191a8e
HW
10779 {0x21, 0x02211020}
10780
fea185e2 10781#define ALC282_STANDARD_PINS \
11580297 10782 {0x14, 0x90170110}
e1e62b98 10783
fea185e2 10784#define ALC290_STANDARD_PINS \
11580297 10785 {0x12, 0x99a30130}
fea185e2
DH
10786
10787#define ALC292_STANDARD_PINS \
10788 {0x14, 0x90170110}, \
11580297 10789 {0x15, 0x0221401f}
977e6276 10790
3f640970
HW
10791#define ALC295_STANDARD_PINS \
10792 {0x12, 0xb7a60130}, \
10793 {0x14, 0x90170110}, \
3f640970
HW
10794 {0x21, 0x04211020}
10795
703867e2
WS
10796#define ALC298_STANDARD_PINS \
10797 {0x12, 0x90a60130}, \
10798 {0x21, 0x03211020}
10799
e1918938 10800static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
8a328ac1
KY
10801 SND_HDA_PIN_QUIRK(0x10ec0221, 0x103c, "HP Workstation", ALC221_FIXUP_HP_HEADSET_MIC,
10802 {0x14, 0x01014020},
10803 {0x17, 0x90170110},
10804 {0x18, 0x02a11030},
10805 {0x19, 0x0181303F},
10806 {0x21, 0x0221102f}),
5824ce8d
CC
10807 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1025, "Acer", ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
10808 {0x12, 0x90a601c0},
10809 {0x14, 0x90171120},
10810 {0x21, 0x02211030}),
615966ad
CC
10811 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
10812 {0x14, 0x90170110},
10813 {0x1b, 0x90a70130},
10814 {0x21, 0x03211020}),
10815 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
10816 {0x1a, 0x90a70130},
10817 {0x1b, 0x90170110},
10818 {0x21, 0x03211020}),
2ae95577 10819 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
cfc5a845 10820 ALC225_STANDARD_PINS,
8a132099 10821 {0x12, 0xb7a60130},
cfc5a845 10822 {0x14, 0x901701a0}),
2ae95577 10823 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
cfc5a845 10824 ALC225_STANDARD_PINS,
8a132099 10825 {0x12, 0xb7a60130},
cfc5a845 10826 {0x14, 0x901701b0}),
8a132099
HW
10827 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10828 ALC225_STANDARD_PINS,
10829 {0x12, 0xb7a60150},
10830 {0x14, 0x901701a0}),
10831 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10832 ALC225_STANDARD_PINS,
10833 {0x12, 0xb7a60150},
10834 {0x14, 0x901701b0}),
10835 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10836 ALC225_STANDARD_PINS,
10837 {0x12, 0xb7a60130},
10838 {0x1b, 0x90170110}),
0ce48e17
KHF
10839 SND_HDA_PIN_QUIRK(0x10ec0233, 0x8086, "Intel NUC Skull Canyon", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10840 {0x1b, 0x01111010},
10841 {0x1e, 0x01451130},
10842 {0x21, 0x02211020}),
986376b6
HW
10843 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
10844 {0x12, 0x90a60140},
10845 {0x14, 0x90170110},
10846 {0x19, 0x02a11030},
10847 {0x21, 0x02211020}),
e41fc8c5
HW
10848 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
10849 {0x14, 0x90170110},
10850 {0x19, 0x02a11030},
10851 {0x1a, 0x02a11040},
10852 {0x1b, 0x01014020},
10853 {0x21, 0x0221101f}),
d06fb562
HW
10854 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
10855 {0x14, 0x90170110},
10856 {0x19, 0x02a11030},
10857 {0x1a, 0x02a11040},
10858 {0x1b, 0x01011020},
10859 {0x21, 0x0221101f}),
c6b17f10
HW
10860 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
10861 {0x14, 0x90170110},
10862 {0x19, 0x02a11020},
10863 {0x1a, 0x02a11030},
10864 {0x21, 0x0221101f}),
92666d45
KY
10865 SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
10866 {0x21, 0x02211010}),
9e885770
KY
10867 SND_HDA_PIN_QUIRK(0x10ec0236, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
10868 {0x14, 0x90170110},
10869 {0x19, 0x02a11020},
10870 {0x21, 0x02211030}),
c77900e6 10871 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
c77900e6 10872 {0x14, 0x90170110},
c77900e6 10873 {0x21, 0x02211020}),
86c72d1c
HW
10874 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10875 {0x14, 0x90170130},
10876 {0x21, 0x02211040}),
76c2132e
DH
10877 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10878 {0x12, 0x90a60140},
10879 {0x14, 0x90170110},
76c2132e
DH
10880 {0x21, 0x02211020}),
10881 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10882 {0x12, 0x90a60160},
10883 {0x14, 0x90170120},
76c2132e 10884 {0x21, 0x02211030}),
392c9da2
HW
10885 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10886 {0x14, 0x90170110},
10887 {0x1b, 0x02011020},
10888 {0x21, 0x0221101f}),
6aecd871
HW
10889 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10890 {0x14, 0x90170110},
10891 {0x1b, 0x01011020},
10892 {0x21, 0x0221101f}),
cba59972 10893 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
cba59972 10894 {0x14, 0x90170130},
cba59972 10895 {0x1b, 0x01014020},
cba59972 10896 {0x21, 0x0221103f}),
6aecd871
HW
10897 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10898 {0x14, 0x90170130},
10899 {0x1b, 0x01011020},
10900 {0x21, 0x0221103f}),
59ec4b57
HW
10901 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10902 {0x14, 0x90170130},
10903 {0x1b, 0x02011020},
10904 {0x21, 0x0221103f}),
e9c28e16 10905 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
e9c28e16 10906 {0x14, 0x90170150},
e9c28e16 10907 {0x1b, 0x02011020},
e9c28e16
WS
10908 {0x21, 0x0221105f}),
10909 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
e9c28e16 10910 {0x14, 0x90170110},
e9c28e16 10911 {0x1b, 0x01014020},
e9c28e16 10912 {0x21, 0x0221101f}),
76c2132e
DH
10913 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10914 {0x12, 0x90a60160},
10915 {0x14, 0x90170120},
10916 {0x17, 0x90170140},
76c2132e
DH
10917 {0x21, 0x0321102f}),
10918 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10919 {0x12, 0x90a60160},
10920 {0x14, 0x90170130},
76c2132e
DH
10921 {0x21, 0x02211040}),
10922 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10923 {0x12, 0x90a60160},
10924 {0x14, 0x90170140},
76c2132e
DH
10925 {0x21, 0x02211050}),
10926 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10927 {0x12, 0x90a60170},
10928 {0x14, 0x90170120},
76c2132e
DH
10929 {0x21, 0x02211030}),
10930 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10931 {0x12, 0x90a60170},
10932 {0x14, 0x90170130},
76c2132e 10933 {0x21, 0x02211040}),
0a1f90a9
HW
10934 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10935 {0x12, 0x90a60170},
10936 {0x14, 0x90171130},
10937 {0x21, 0x02211040}),
70658b99 10938 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
70658b99
HW
10939 {0x12, 0x90a60170},
10940 {0x14, 0x90170140},
70658b99 10941 {0x21, 0x02211050}),
9b5a4e39 10942 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5548", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9b5a4e39
DH
10943 {0x12, 0x90a60180},
10944 {0x14, 0x90170130},
9b5a4e39 10945 {0x21, 0x02211040}),
f90d83b3
AK
10946 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5565", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10947 {0x12, 0x90a60180},
10948 {0x14, 0x90170120},
10949 {0x21, 0x02211030}),
989dbe4a
HW
10950 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10951 {0x1b, 0x01011020},
10952 {0x21, 0x02211010}),
c1732ede
CC
10953 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
10954 {0x14, 0x90170110},
10955 {0x1b, 0x90a70130},
10956 {0x21, 0x04211020}),
10957 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
10958 {0x14, 0x90170110},
10959 {0x1b, 0x90a70130},
10960 {0x21, 0x03211020}),
a806ef1c
CC
10961 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
10962 {0x12, 0x90a60130},
10963 {0x14, 0x90170110},
10964 {0x21, 0x03211020}),
6ac371aa
JHP
10965 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
10966 {0x12, 0x90a60130},
10967 {0x14, 0x90170110},
10968 {0x21, 0x04211020}),
e1037354
JHP
10969 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
10970 {0x1a, 0x90a70130},
10971 {0x1b, 0x90170110},
10972 {0x21, 0x03211020}),
9e885770
KY
10973 SND_HDA_PIN_QUIRK(0x10ec0256, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
10974 {0x14, 0x90170110},
10975 {0x19, 0x02a11020},
10976 {0x21, 0x0221101f}),
8a8de09c
KY
10977 SND_HDA_PIN_QUIRK(0x10ec0274, 0x103c, "HP", ALC274_FIXUP_HP_HEADSET_MIC,
10978 {0x17, 0x90170110},
10979 {0x19, 0x03a11030},
10980 {0x21, 0x03211020}),
cf51eb9d
DH
10981 SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
10982 {0x12, 0x90a60130},
cf51eb9d
DH
10983 {0x14, 0x90170110},
10984 {0x15, 0x0421101f},
11580297 10985 {0x1a, 0x04a11020}),
0279661b
HW
10986 SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED,
10987 {0x12, 0x90a60140},
0279661b
HW
10988 {0x14, 0x90170110},
10989 {0x15, 0x0421101f},
0279661b 10990 {0x18, 0x02811030},
0279661b 10991 {0x1a, 0x04a1103f},
11580297 10992 {0x1b, 0x02011020}),
42304474 10993 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP 15 Touchsmart", ALC269_FIXUP_HP_MUTE_LED_MIC1,
aec856d0 10994 ALC282_STANDARD_PINS,
42304474 10995 {0x12, 0x99a30130},
42304474 10996 {0x19, 0x03a11020},
42304474 10997 {0x21, 0x0321101f}),
2c609999 10998 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
aec856d0 10999 ALC282_STANDARD_PINS,
2c609999 11000 {0x12, 0x99a30130},
2c609999 11001 {0x19, 0x03a11020},
2c609999
HW
11002 {0x21, 0x03211040}),
11003 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
aec856d0 11004 ALC282_STANDARD_PINS,
2c609999 11005 {0x12, 0x99a30130},
2c609999 11006 {0x19, 0x03a11030},
2c609999
HW
11007 {0x21, 0x03211020}),
11008 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
aec856d0 11009 ALC282_STANDARD_PINS,
2c609999 11010 {0x12, 0x99a30130},
2c609999 11011 {0x19, 0x04a11020},
2c609999 11012 {0x21, 0x0421101f}),
200afc09 11013 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED,
aec856d0 11014 ALC282_STANDARD_PINS,
200afc09 11015 {0x12, 0x90a60140},
200afc09 11016 {0x19, 0x04a11030},
200afc09 11017 {0x21, 0x04211020}),
34cdf405
CC
11018 SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
11019 ALC282_STANDARD_PINS,
11020 {0x12, 0x90a609c0},
11021 {0x18, 0x03a11830},
11022 {0x19, 0x04a19831},
11023 {0x1a, 0x0481303f},
11024 {0x1b, 0x04211020},
11025 {0x21, 0x0321101f}),
11026 SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
11027 ALC282_STANDARD_PINS,
11028 {0x12, 0x90a60940},
11029 {0x18, 0x03a11830},
11030 {0x19, 0x04a19831},
11031 {0x1a, 0x0481303f},
11032 {0x1b, 0x04211020},
11033 {0x21, 0x0321101f}),
76c2132e 11034 SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
aec856d0 11035 ALC282_STANDARD_PINS,
76c2132e 11036 {0x12, 0x90a60130},
76c2132e
DH
11037 {0x21, 0x0321101f}),
11038 SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
11039 {0x12, 0x90a60160},
11040 {0x14, 0x90170120},
76c2132e 11041 {0x21, 0x02211030}),
bc262179 11042 SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
aec856d0 11043 ALC282_STANDARD_PINS,
bc262179 11044 {0x12, 0x90a60130},
bc262179 11045 {0x19, 0x03a11020},
bc262179 11046 {0x21, 0x0321101f}),
c8c6ee61 11047 SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
266fd994
SL
11048 {0x12, 0x90a60130},
11049 {0x14, 0x90170110},
11050 {0x19, 0x04a11040},
11051 {0x21, 0x04211020}),
11052 SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
11053 {0x14, 0x90170110},
11054 {0x19, 0x04a11040},
11055 {0x1d, 0x40600001},
11056 {0x21, 0x04211020}),
11057 SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
c4cfcf6f
HW
11058 {0x14, 0x90170110},
11059 {0x19, 0x04a11040},
11060 {0x21, 0x04211020}),
c72b9bfe
HW
11061 SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_HEADSET_JACK,
11062 {0x14, 0x90170110},
11063 {0x17, 0x90170111},
11064 {0x19, 0x03a11030},
11065 {0x21, 0x03211020}),
e43252db
KY
11066 SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC287_FIXUP_THINKPAD_I2S_SPK,
11067 {0x17, 0x90170110},
11068 {0x19, 0x03a11030},
11069 {0x21, 0x03211020}),
41b07476
KY
11070 SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC287_FIXUP_THINKPAD_I2S_SPK,
11071 {0x17, 0x90170110}, /* 0x231f with RTK I2S AMP */
11072 {0x19, 0x04a11040},
11073 {0x21, 0x04211020}),
33aaebd4
CC
11074 SND_HDA_PIN_QUIRK(0x10ec0286, 0x1025, "Acer", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
11075 {0x12, 0x90a60130},
11076 {0x17, 0x90170110},
11077 {0x21, 0x02211020}),
d44a6864 11078 SND_HDA_PIN_QUIRK(0x10ec0288, 0x1028, "Dell", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
e1e62b98 11079 {0x12, 0x90a60120},
e1e62b98 11080 {0x14, 0x90170110},
e1e62b98 11081 {0x21, 0x0321101f}),
e4442bcf 11082 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
aec856d0 11083 ALC290_STANDARD_PINS,
e4442bcf 11084 {0x15, 0x04211040},
e4442bcf 11085 {0x18, 0x90170112},
11580297 11086 {0x1a, 0x04a11020}),
e4442bcf 11087 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
aec856d0 11088 ALC290_STANDARD_PINS,
e4442bcf 11089 {0x15, 0x04211040},
e4442bcf 11090 {0x18, 0x90170110},
11580297 11091 {0x1a, 0x04a11020}),
e4442bcf 11092 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
aec856d0 11093 ALC290_STANDARD_PINS,
e4442bcf 11094 {0x15, 0x0421101f},
11580297 11095 {0x1a, 0x04a11020}),
e4442bcf 11096 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
aec856d0 11097 ALC290_STANDARD_PINS,
e4442bcf 11098 {0x15, 0x04211020},
11580297 11099 {0x1a, 0x04a11040}),
e4442bcf 11100 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
aec856d0 11101 ALC290_STANDARD_PINS,
e4442bcf
HW
11102 {0x14, 0x90170110},
11103 {0x15, 0x04211020},
11580297 11104 {0x1a, 0x04a11040}),
e4442bcf 11105 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
aec856d0 11106 ALC290_STANDARD_PINS,
e4442bcf
HW
11107 {0x14, 0x90170110},
11108 {0x15, 0x04211020},
11580297 11109 {0x1a, 0x04a11020}),
e4442bcf 11110 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
aec856d0 11111 ALC290_STANDARD_PINS,
e4442bcf
HW
11112 {0x14, 0x90170110},
11113 {0x15, 0x0421101f},
11580297 11114 {0x1a, 0x04a11020}),
e8818fa8 11115 SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
aec856d0 11116 ALC292_STANDARD_PINS,
e8818fa8 11117 {0x12, 0x90a60140},
e8818fa8 11118 {0x16, 0x01014020},
11580297 11119 {0x19, 0x01a19030}),
e8818fa8 11120 SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
aec856d0 11121 ALC292_STANDARD_PINS,
e8818fa8 11122 {0x12, 0x90a60140},
e8818fa8
HW
11123 {0x16, 0x01014020},
11124 {0x18, 0x02a19031},
11580297 11125 {0x19, 0x01a1903e}),
76c2132e 11126 SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
aec856d0 11127 ALC292_STANDARD_PINS,
11580297 11128 {0x12, 0x90a60140}),
76c2132e 11129 SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
aec856d0 11130 ALC292_STANDARD_PINS,
76c2132e 11131 {0x13, 0x90a60140},
76c2132e 11132 {0x16, 0x21014020},
11580297 11133 {0x19, 0x21a19030}),
e03fdbde 11134 SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
aec856d0 11135 ALC292_STANDARD_PINS,
11580297 11136 {0x13, 0x90a60140}),
eeacd80f
JHP
11137 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_HPE,
11138 {0x17, 0x90170110},
11139 {0x21, 0x04211020}),
d8ae458e
CC
11140 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_MIC,
11141 {0x14, 0x90170110},
11142 {0x1b, 0x90a70130},
11143 {0x21, 0x04211020}),
8bb37a2a
JHP
11144 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
11145 {0x12, 0x90a60130},
11146 {0x17, 0x90170110},
11147 {0x21, 0x03211020}),
0bea4cc8
JHP
11148 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
11149 {0x12, 0x90a60130},
11150 {0x17, 0x90170110},
11151 {0x21, 0x04211020}),
3887c26c
TI
11152 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
11153 {0x12, 0x90a60130},
11154 {0x17, 0x90170110},
11155 {0x21, 0x03211020}),
9e43342b 11156 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
ad97d667
JHP
11157 {0x12, 0x90a60120},
11158 {0x17, 0x90170110},
11159 {0x21, 0x04211030}),
11160 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
9e43342b
CC
11161 {0x12, 0x90a60130},
11162 {0x17, 0x90170110},
11163 {0x21, 0x03211020}),
11164 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
11165 {0x12, 0x90a60130},
11166 {0x17, 0x90170110},
11167 {0x21, 0x03211020}),
9f502ff5
TI
11168 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
11169 ALC298_STANDARD_PINS,
11170 {0x17, 0x90170110}),
977e6276 11171 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
703867e2
WS
11172 ALC298_STANDARD_PINS,
11173 {0x17, 0x90170140}),
11174 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
11175 ALC298_STANDARD_PINS,
9f502ff5 11176 {0x17, 0x90170150}),
9f1bc2c4
KHF
11177 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_SPK_VOLUME,
11178 {0x12, 0xb7a60140},
11179 {0x13, 0xb7a60150},
11180 {0x17, 0x90170110},
11181 {0x1a, 0x03011020},
11182 {0x21, 0x03211030}),
54324221
JM
11183 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
11184 {0x12, 0xb7a60140},
11185 {0x17, 0x90170110},
11186 {0x1a, 0x03a11030},
11187 {0x21, 0x03211020}),
fcc6c877
KY
11188 SND_HDA_PIN_QUIRK(0x10ec0299, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
11189 ALC225_STANDARD_PINS,
11190 {0x12, 0xb7a60130},
fcc6c877 11191 {0x17, 0x90170110}),
573fcbfd
HW
11192 SND_HDA_PIN_QUIRK(0x10ec0623, 0x17aa, "Lenovo", ALC283_FIXUP_HEADSET_MIC,
11193 {0x14, 0x01014010},
11194 {0x17, 0x90170120},
11195 {0x18, 0x02a11030},
11196 {0x19, 0x02a1103f},
11197 {0x21, 0x0221101f}),
e1918938
HW
11198 {}
11199};
6dda9f4a 11200
7c0a6939
HW
11201/* This is the fallback pin_fixup_tbl for alc269 family, to make the tbl match
11202 * more machines, don't need to match all valid pins, just need to match
11203 * all the pins defined in the tbl. Just because of this reason, it is possible
11204 * that a single machine matches multiple tbls, so there is one limitation:
11205 * at most one tbl is allowed to define for the same vendor and same codec
11206 */
11207static const struct snd_hda_pin_quirk alc269_fallback_pin_fixup_tbl[] = {
34ab5bbc
KY
11208 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1025, "Acer", ALC2XX_FIXUP_HEADSET_MIC,
11209 {0x19, 0x40000000}),
7c0a6939
HW
11210 SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
11211 {0x19, 0x40000000},
11212 {0x1b, 0x40000000}),
4b21a669
KY
11213 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
11214 {0x19, 0x40000000},
11215 {0x1b, 0x40000000}),
aed8c7f4
HW
11216 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
11217 {0x19, 0x40000000},
11218 {0x1a, 0x40000000}),
d64ebdbf
HW
11219 SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
11220 {0x19, 0x40000000},
11221 {0x1a, 0x40000000}),
5815bdfd
HW
11222 SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
11223 {0x19, 0x40000000},
11224 {0x1a, 0x40000000}),
c8c0a03e
KY
11225 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC2XX_FIXUP_HEADSET_MIC,
11226 {0x19, 0x40000000}),
7c0a6939
HW
11227 {}
11228};
11229
546bb678 11230static void alc269_fill_coef(struct hda_codec *codec)
1d045db9 11231{
526af6eb 11232 struct alc_spec *spec = codec->spec;
1d045db9 11233 int val;
ebb83eeb 11234
526af6eb 11235 if (spec->codec_variant != ALC269_TYPE_ALC269VB)
546bb678 11236 return;
526af6eb 11237
1bb7e43e 11238 if ((alc_get_coef0(codec) & 0x00ff) < 0x015) {
1d045db9
TI
11239 alc_write_coef_idx(codec, 0xf, 0x960b);
11240 alc_write_coef_idx(codec, 0xe, 0x8817);
11241 }
ebb83eeb 11242
1bb7e43e 11243 if ((alc_get_coef0(codec) & 0x00ff) == 0x016) {
1d045db9
TI
11244 alc_write_coef_idx(codec, 0xf, 0x960b);
11245 alc_write_coef_idx(codec, 0xe, 0x8814);
11246 }
ebb83eeb 11247
1bb7e43e 11248 if ((alc_get_coef0(codec) & 0x00ff) == 0x017) {
1d045db9 11249 /* Power up output pin */
98b24883 11250 alc_update_coef_idx(codec, 0x04, 0, 1<<11);
1d045db9 11251 }
ebb83eeb 11252
1bb7e43e 11253 if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {
1d045db9 11254 val = alc_read_coef_idx(codec, 0xd);
f3ee07d8 11255 if (val != -1 && (val & 0x0c00) >> 10 != 0x1) {
1d045db9
TI
11256 /* Capless ramp up clock control */
11257 alc_write_coef_idx(codec, 0xd, val | (1<<10));
11258 }
11259 val = alc_read_coef_idx(codec, 0x17);
f3ee07d8 11260 if (val != -1 && (val & 0x01c0) >> 6 != 0x4) {
1d045db9
TI
11261 /* Class D power on reset */
11262 alc_write_coef_idx(codec, 0x17, val | (1<<7));
11263 }
11264 }
ebb83eeb 11265
98b24883
TI
11266 /* HP */
11267 alc_update_coef_idx(codec, 0x4, 0, 1<<11);
1d045db9 11268}
a7f2371f 11269
1d045db9
TI
11270/*
11271 */
1d045db9
TI
11272static int patch_alc269(struct hda_codec *codec)
11273{
11274 struct alc_spec *spec;
3de95173 11275 int err;
f1d4e28b 11276
3de95173 11277 err = alc_alloc_spec(codec, 0x0b);
e16fb6d1 11278 if (err < 0)
3de95173
TI
11279 return err;
11280
11281 spec = codec->spec;
08c189f2 11282 spec->gen.shared_mic_vref_pin = 0x18;
317d9313 11283 codec->power_save_node = 0;
46cdff23 11284 spec->en_3kpull_low = true;
e16fb6d1 11285
225068ab
TI
11286 codec->patch_ops.suspend = alc269_suspend;
11287 codec->patch_ops.resume = alc269_resume;
c2d6af53
KY
11288 spec->shutup = alc_default_shutup;
11289 spec->init_hook = alc_default_init;
225068ab 11290
7639a06c 11291 switch (codec->core.vendor_id) {
065380f0 11292 case 0x10ec0269:
1d045db9 11293 spec->codec_variant = ALC269_TYPE_ALC269VA;
1bb7e43e
TI
11294 switch (alc_get_coef0(codec) & 0x00f0) {
11295 case 0x0010:
5100cd07
TI
11296 if (codec->bus->pci &&
11297 codec->bus->pci->subsystem_vendor == 0x1025 &&
e16fb6d1 11298 spec->cdefine.platform_type == 1)
20ca0c35 11299 err = alc_codec_rename(codec, "ALC271X");
1d045db9 11300 spec->codec_variant = ALC269_TYPE_ALC269VB;
1bb7e43e
TI
11301 break;
11302 case 0x0020:
5100cd07
TI
11303 if (codec->bus->pci &&
11304 codec->bus->pci->subsystem_vendor == 0x17aa &&
e16fb6d1 11305 codec->bus->pci->subsystem_device == 0x21f3)
20ca0c35 11306 err = alc_codec_rename(codec, "ALC3202");
1d045db9 11307 spec->codec_variant = ALC269_TYPE_ALC269VC;
1bb7e43e 11308 break;
adcc70b2
KY
11309 case 0x0030:
11310 spec->codec_variant = ALC269_TYPE_ALC269VD;
11311 break;
1bb7e43e 11312 default:
1d045db9 11313 alc_fix_pll_init(codec, 0x20, 0x04, 15);
1bb7e43e 11314 }
e16fb6d1
TI
11315 if (err < 0)
11316 goto error;
c2d6af53 11317 spec->shutup = alc269_shutup;
546bb678 11318 spec->init_hook = alc269_fill_coef;
1d045db9 11319 alc269_fill_coef(codec);
065380f0
KY
11320 break;
11321
11322 case 0x10ec0280:
11323 case 0x10ec0290:
11324 spec->codec_variant = ALC269_TYPE_ALC280;
11325 break;
11326 case 0x10ec0282:
065380f0 11327 spec->codec_variant = ALC269_TYPE_ALC282;
7b5c7a02
KY
11328 spec->shutup = alc282_shutup;
11329 spec->init_hook = alc282_init;
065380f0 11330 break;
2af02be7
KY
11331 case 0x10ec0233:
11332 case 0x10ec0283:
11333 spec->codec_variant = ALC269_TYPE_ALC283;
11334 spec->shutup = alc283_shutup;
11335 spec->init_hook = alc283_init;
11336 break;
065380f0
KY
11337 case 0x10ec0284:
11338 case 0x10ec0292:
11339 spec->codec_variant = ALC269_TYPE_ALC284;
11340 break;
161ebf29 11341 case 0x10ec0293:
4731d5de 11342 spec->codec_variant = ALC269_TYPE_ALC293;
161ebf29 11343 break;
7fc7d047 11344 case 0x10ec0286:
7c665932 11345 case 0x10ec0288:
7fc7d047
KY
11346 spec->codec_variant = ALC269_TYPE_ALC286;
11347 break;
506b62c3
KY
11348 case 0x10ec0298:
11349 spec->codec_variant = ALC269_TYPE_ALC298;
11350 break;
ea04a1db 11351 case 0x10ec0235:
1d04c9de
KY
11352 case 0x10ec0255:
11353 spec->codec_variant = ALC269_TYPE_ALC255;
ab3b8e51
KY
11354 spec->shutup = alc256_shutup;
11355 spec->init_hook = alc256_init;
1d04c9de 11356 break;
1948fc06 11357 case 0x10ec0230:
736f20a7 11358 case 0x10ec0236:
4344aec8 11359 case 0x10ec0256:
527f4643 11360 case 0x19e58326:
4344aec8 11361 spec->codec_variant = ALC269_TYPE_ALC256;
4a219ef8
KY
11362 spec->shutup = alc256_shutup;
11363 spec->init_hook = alc256_init;
7d1b6e29 11364 spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */
46cdff23
KY
11365 if (codec->core.vendor_id == 0x10ec0236 &&
11366 codec->bus->pci->vendor != PCI_VENDOR_ID_AMD)
11367 spec->en_3kpull_low = false;
4344aec8 11368 break;
f429e7e4
KY
11369 case 0x10ec0257:
11370 spec->codec_variant = ALC269_TYPE_ALC257;
88d42b2b
KY
11371 spec->shutup = alc256_shutup;
11372 spec->init_hook = alc256_init;
f429e7e4 11373 spec->gen.mixer_nid = 0;
46cdff23 11374 spec->en_3kpull_low = false;
f429e7e4 11375 break;
0a6f0600 11376 case 0x10ec0215:
7fbdcd83 11377 case 0x10ec0245:
0a6f0600
KY
11378 case 0x10ec0285:
11379 case 0x10ec0289:
60571929
KY
11380 if (alc_get_coef0(codec) & 0x0010)
11381 spec->codec_variant = ALC269_TYPE_ALC245;
11382 else
11383 spec->codec_variant = ALC269_TYPE_ALC215;
1b6832be
KY
11384 spec->shutup = alc225_shutup;
11385 spec->init_hook = alc225_init;
0a6f0600
KY
11386 spec->gen.mixer_nid = 0;
11387 break;
4231430d 11388 case 0x10ec0225:
7d727869 11389 case 0x10ec0295:
28f1f9b2 11390 case 0x10ec0299:
4231430d 11391 spec->codec_variant = ALC269_TYPE_ALC225;
da911b1f
KY
11392 spec->shutup = alc225_shutup;
11393 spec->init_hook = alc225_init;
c1350bff 11394 spec->gen.mixer_nid = 0; /* no loopback on ALC225, ALC295 and ALC299 */
4231430d 11395 break;
99cee034
KY
11396 case 0x10ec0287:
11397 spec->codec_variant = ALC269_TYPE_ALC287;
11398 spec->shutup = alc225_shutup;
11399 spec->init_hook = alc225_init;
11400 spec->gen.mixer_nid = 0; /* no loopback on ALC287 */
11401 break;
dcd4f0db
KY
11402 case 0x10ec0234:
11403 case 0x10ec0274:
11404 case 0x10ec0294:
11405 spec->codec_variant = ALC269_TYPE_ALC294;
532a7784 11406 spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */
71683c32 11407 alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */
693abe11 11408 spec->init_hook = alc294_init;
dcd4f0db 11409 break;
1078bef0
KY
11410 case 0x10ec0300:
11411 spec->codec_variant = ALC269_TYPE_ALC300;
11412 spec->gen.mixer_nid = 0; /* no loopback on ALC300 */
dcd4f0db 11413 break;
f0778871
KY
11414 case 0x10ec0623:
11415 spec->codec_variant = ALC269_TYPE_ALC623;
11416 break;
6fbae35a
KY
11417 case 0x10ec0700:
11418 case 0x10ec0701:
11419 case 0x10ec0703:
83629532 11420 case 0x10ec0711:
6fbae35a
KY
11421 spec->codec_variant = ALC269_TYPE_ALC700;
11422 spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */
2d7fe618 11423 alc_update_coef_idx(codec, 0x4a, 1 << 15, 0); /* Combo jack auto trigger control */
693abe11 11424 spec->init_hook = alc294_init;
6fbae35a
KY
11425 break;
11426
1d045db9 11427 }
6dda9f4a 11428
ad60d502 11429 if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) {
97a26570 11430 spec->has_alc5505_dsp = 1;
ad60d502
KY
11431 spec->init_hook = alc5505_dsp_init;
11432 }
11433
c9af753f
TI
11434 alc_pre_init(codec);
11435
efe55732
TI
11436 snd_hda_pick_fixup(codec, alc269_fixup_models,
11437 alc269_fixup_tbl, alc269_fixups);
13d9c6b9
TI
11438 /* FIXME: both TX300 and ROG Strix G17 have the same SSID, and
11439 * the quirk breaks the latter (bko#214101).
11440 * Clear the wrong entry.
11441 */
11442 if (codec->fixup_id == ALC282_FIXUP_ASUS_TX300 &&
11443 codec->core.vendor_id == 0x10ec0294) {
11444 codec_dbg(codec, "Clear wrong fixup for ASUS ROG Strix G17\n");
11445 codec->fixup_id = HDA_FIXUP_ID_NOT_SET;
11446 }
11447
0fc1e447 11448 snd_hda_pick_pin_fixup(codec, alc269_pin_fixup_tbl, alc269_fixups, true);
7c0a6939 11449 snd_hda_pick_pin_fixup(codec, alc269_fallback_pin_fixup_tbl, alc269_fixups, false);
efe55732
TI
11450 snd_hda_pick_fixup(codec, NULL, alc269_fixup_vendor_tbl,
11451 alc269_fixups);
11452 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
11453
11454 alc_auto_parse_customize_define(codec);
11455
11456 if (has_cdefine_beep(codec))
11457 spec->gen.beep_nid = 0x01;
11458
a4297b5d
TI
11459 /* automatic parse from the BIOS config */
11460 err = alc269_parse_auto_config(codec);
e16fb6d1
TI
11461 if (err < 0)
11462 goto error;
6dda9f4a 11463
fea80fae
TI
11464 if (!spec->gen.no_analog && spec->gen.beep_nid && spec->gen.mixer_nid) {
11465 err = set_beep_amp(spec, spec->gen.mixer_nid, 0x04, HDA_INPUT);
11466 if (err < 0)
11467 goto error;
11468 }
f1d4e28b 11469
1727a771 11470 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
589876e2 11471
1d045db9 11472 return 0;
e16fb6d1
TI
11473
11474 error:
11475 alc_free(codec);
11476 return err;
1d045db9 11477}
f1d4e28b 11478
1d045db9
TI
11479/*
11480 * ALC861
11481 */
622e84cd 11482
1d045db9 11483static int alc861_parse_auto_config(struct hda_codec *codec)
6dda9f4a 11484{
1d045db9 11485 static const hda_nid_t alc861_ignore[] = { 0x1d, 0 };
3e6179b8
TI
11486 static const hda_nid_t alc861_ssids[] = { 0x0e, 0x0f, 0x0b, 0 };
11487 return alc_parse_auto_config(codec, alc861_ignore, alc861_ssids);
604401a9
TI
11488}
11489
1d045db9
TI
11490/* Pin config fixes */
11491enum {
e652f4c8
TI
11492 ALC861_FIXUP_FSC_AMILO_PI1505,
11493 ALC861_FIXUP_AMP_VREF_0F,
11494 ALC861_FIXUP_NO_JACK_DETECT,
11495 ALC861_FIXUP_ASUS_A6RP,
6ddf0fd1 11496 ALC660_FIXUP_ASUS_W7J,
1d045db9 11497};
7085ec12 11498
31150f23
TI
11499/* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */
11500static void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec,
1727a771 11501 const struct hda_fixup *fix, int action)
31150f23
TI
11502{
11503 struct alc_spec *spec = codec->spec;
11504 unsigned int val;
11505
1727a771 11506 if (action != HDA_FIXUP_ACT_INIT)
31150f23 11507 return;
d3f02d60 11508 val = snd_hda_codec_get_pin_target(codec, 0x0f);
31150f23
TI
11509 if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)))
11510 val |= AC_PINCTL_IN_EN;
11511 val |= AC_PINCTL_VREF_50;
cdd03ced 11512 snd_hda_set_pin_ctl(codec, 0x0f, val);
08c189f2 11513 spec->gen.keep_vref_in_automute = 1;
31150f23
TI
11514}
11515
e652f4c8
TI
11516/* suppress the jack-detection */
11517static void alc_fixup_no_jack_detect(struct hda_codec *codec,
1727a771 11518 const struct hda_fixup *fix, int action)
e652f4c8 11519{
1727a771 11520 if (action == HDA_FIXUP_ACT_PRE_PROBE)
e652f4c8 11521 codec->no_jack_detect = 1;
7d7eb9ea 11522}
e652f4c8 11523
1727a771 11524static const struct hda_fixup alc861_fixups[] = {
e652f4c8 11525 [ALC861_FIXUP_FSC_AMILO_PI1505] = {
1727a771
TI
11526 .type = HDA_FIXUP_PINS,
11527 .v.pins = (const struct hda_pintbl[]) {
1d045db9
TI
11528 { 0x0b, 0x0221101f }, /* HP */
11529 { 0x0f, 0x90170310 }, /* speaker */
11530 { }
11531 }
11532 },
e652f4c8 11533 [ALC861_FIXUP_AMP_VREF_0F] = {
1727a771 11534 .type = HDA_FIXUP_FUNC,
31150f23 11535 .v.func = alc861_fixup_asus_amp_vref_0f,
3b25eb69 11536 },
e652f4c8 11537 [ALC861_FIXUP_NO_JACK_DETECT] = {
1727a771 11538 .type = HDA_FIXUP_FUNC,
e652f4c8
TI
11539 .v.func = alc_fixup_no_jack_detect,
11540 },
11541 [ALC861_FIXUP_ASUS_A6RP] = {
1727a771 11542 .type = HDA_FIXUP_FUNC,
e652f4c8
TI
11543 .v.func = alc861_fixup_asus_amp_vref_0f,
11544 .chained = true,
11545 .chain_id = ALC861_FIXUP_NO_JACK_DETECT,
6ddf0fd1
TI
11546 },
11547 [ALC660_FIXUP_ASUS_W7J] = {
11548 .type = HDA_FIXUP_VERBS,
11549 .v.verbs = (const struct hda_verb[]) {
11550 /* ASUS W7J needs a magic pin setup on unused NID 0x10
11551 * for enabling outputs
11552 */
11553 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11554 { }
11555 },
e652f4c8 11556 }
1d045db9 11557};
7085ec12 11558
1d045db9 11559static const struct snd_pci_quirk alc861_fixup_tbl[] = {
6ddf0fd1 11560 SND_PCI_QUIRK(0x1043, 0x1253, "ASUS W7J", ALC660_FIXUP_ASUS_W7J),
e7ca237b 11561 SND_PCI_QUIRK(0x1043, 0x1263, "ASUS Z35HL", ALC660_FIXUP_ASUS_W7J),
e652f4c8
TI
11562 SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP),
11563 SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", ALC861_FIXUP_AMP_VREF_0F),
11564 SND_PCI_QUIRK(0x1462, 0x7254, "HP DX2200", ALC861_FIXUP_NO_JACK_DETECT),
defce244 11565 SND_PCI_QUIRK_VENDOR(0x1584, "Haier/Uniwill", ALC861_FIXUP_AMP_VREF_0F),
e652f4c8 11566 SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", ALC861_FIXUP_FSC_AMILO_PI1505),
1d045db9
TI
11567 {}
11568};
3af9ee6b 11569
1d045db9
TI
11570/*
11571 */
1d045db9 11572static int patch_alc861(struct hda_codec *codec)
7085ec12 11573{
1d045db9 11574 struct alc_spec *spec;
1d045db9 11575 int err;
7085ec12 11576
3de95173
TI
11577 err = alc_alloc_spec(codec, 0x15);
11578 if (err < 0)
11579 return err;
1d045db9 11580
3de95173 11581 spec = codec->spec;
2722b535
TI
11582 if (has_cdefine_beep(codec))
11583 spec->gen.beep_nid = 0x23;
1d045db9 11584
225068ab 11585 spec->power_hook = alc_power_eapd;
225068ab 11586
c9af753f
TI
11587 alc_pre_init(codec);
11588
1727a771
TI
11589 snd_hda_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);
11590 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
3af9ee6b 11591
cb4e4824
TI
11592 /* automatic parse from the BIOS config */
11593 err = alc861_parse_auto_config(codec);
e16fb6d1
TI
11594 if (err < 0)
11595 goto error;
3af9ee6b 11596
fea80fae
TI
11597 if (!spec->gen.no_analog) {
11598 err = set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
11599 if (err < 0)
11600 goto error;
11601 }
7085ec12 11602
1727a771 11603 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
589876e2 11604
1d045db9 11605 return 0;
e16fb6d1
TI
11606
11607 error:
11608 alc_free(codec);
11609 return err;
7085ec12
TI
11610}
11611
1d045db9
TI
11612/*
11613 * ALC861-VD support
11614 *
11615 * Based on ALC882
11616 *
11617 * In addition, an independent DAC
11618 */
1d045db9 11619static int alc861vd_parse_auto_config(struct hda_codec *codec)
bc9f98a9 11620{
1d045db9 11621 static const hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
3e6179b8
TI
11622 static const hda_nid_t alc861vd_ssids[] = { 0x15, 0x1b, 0x14, 0 };
11623 return alc_parse_auto_config(codec, alc861vd_ignore, alc861vd_ssids);
ce764ab2
TI
11624}
11625
1d045db9 11626enum {
8fdcb6fe
TI
11627 ALC660VD_FIX_ASUS_GPIO1,
11628 ALC861VD_FIX_DALLAS,
1d045db9 11629};
ce764ab2 11630
8fdcb6fe
TI
11631/* exclude VREF80 */
11632static void alc861vd_fixup_dallas(struct hda_codec *codec,
1727a771 11633 const struct hda_fixup *fix, int action)
8fdcb6fe 11634{
1727a771 11635 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
b78562b1
TI
11636 snd_hda_override_pin_caps(codec, 0x18, 0x00000734);
11637 snd_hda_override_pin_caps(codec, 0x19, 0x0000073c);
8fdcb6fe
TI
11638 }
11639}
11640
df73d83f
TI
11641/* reset GPIO1 */
11642static void alc660vd_fixup_asus_gpio1(struct hda_codec *codec,
11643 const struct hda_fixup *fix, int action)
11644{
11645 struct alc_spec *spec = codec->spec;
11646
11647 if (action == HDA_FIXUP_ACT_PRE_PROBE)
11648 spec->gpio_mask |= 0x02;
11649 alc_fixup_gpio(codec, action, 0x01);
11650}
11651
1727a771 11652static const struct hda_fixup alc861vd_fixups[] = {
1d045db9 11653 [ALC660VD_FIX_ASUS_GPIO1] = {
df73d83f
TI
11654 .type = HDA_FIXUP_FUNC,
11655 .v.func = alc660vd_fixup_asus_gpio1,
1d045db9 11656 },
8fdcb6fe 11657 [ALC861VD_FIX_DALLAS] = {
1727a771 11658 .type = HDA_FIXUP_FUNC,
8fdcb6fe
TI
11659 .v.func = alc861vd_fixup_dallas,
11660 },
1d045db9 11661};
ce764ab2 11662
1d045db9 11663static const struct snd_pci_quirk alc861vd_fixup_tbl[] = {
8fdcb6fe 11664 SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_FIX_DALLAS),
1d045db9 11665 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
8fdcb6fe 11666 SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_FIX_DALLAS),
1d045db9
TI
11667 {}
11668};
ce764ab2 11669
1d045db9
TI
11670/*
11671 */
1d045db9 11672static int patch_alc861vd(struct hda_codec *codec)
ce764ab2 11673{
1d045db9 11674 struct alc_spec *spec;
cb4e4824 11675 int err;
ce764ab2 11676
3de95173
TI
11677 err = alc_alloc_spec(codec, 0x0b);
11678 if (err < 0)
11679 return err;
1d045db9 11680
3de95173 11681 spec = codec->spec;
2722b535
TI
11682 if (has_cdefine_beep(codec))
11683 spec->gen.beep_nid = 0x23;
1d045db9 11684
225068ab
TI
11685 spec->shutup = alc_eapd_shutup;
11686
c9af753f
TI
11687 alc_pre_init(codec);
11688
1727a771
TI
11689 snd_hda_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);
11690 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1d045db9 11691
cb4e4824
TI
11692 /* automatic parse from the BIOS config */
11693 err = alc861vd_parse_auto_config(codec);
e16fb6d1
TI
11694 if (err < 0)
11695 goto error;
ce764ab2 11696
fea80fae
TI
11697 if (!spec->gen.no_analog) {
11698 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
11699 if (err < 0)
11700 goto error;
11701 }
1d045db9 11702
1727a771 11703 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
589876e2 11704
ce764ab2 11705 return 0;
e16fb6d1
TI
11706
11707 error:
11708 alc_free(codec);
11709 return err;
ce764ab2
TI
11710}
11711
1d045db9
TI
11712/*
11713 * ALC662 support
11714 *
11715 * ALC662 is almost identical with ALC880 but has cleaner and more flexible
11716 * configuration. Each pin widget can choose any input DACs and a mixer.
11717 * Each ADC is connected from a mixer of all inputs. This makes possible
11718 * 6-channel independent captures.
11719 *
11720 * In addition, an independent DAC for the multi-playback (not used in this
11721 * driver yet).
11722 */
1d045db9
TI
11723
11724/*
11725 * BIOS auto configuration
11726 */
11727
bc9f98a9
KY
11728static int alc662_parse_auto_config(struct hda_codec *codec)
11729{
4c6d72d1 11730 static const hda_nid_t alc662_ignore[] = { 0x1d, 0 };
3e6179b8
TI
11731 static const hda_nid_t alc663_ssids[] = { 0x15, 0x1b, 0x14, 0x21 };
11732 static const hda_nid_t alc662_ssids[] = { 0x15, 0x1b, 0x14, 0 };
11733 const hda_nid_t *ssids;
ee979a14 11734
7639a06c
TI
11735 if (codec->core.vendor_id == 0x10ec0272 || codec->core.vendor_id == 0x10ec0663 ||
11736 codec->core.vendor_id == 0x10ec0665 || codec->core.vendor_id == 0x10ec0670 ||
11737 codec->core.vendor_id == 0x10ec0671)
3e6179b8 11738 ssids = alc663_ssids;
6227cdce 11739 else
3e6179b8
TI
11740 ssids = alc662_ssids;
11741 return alc_parse_auto_config(codec, alc662_ignore, ssids);
bc9f98a9
KY
11742}
11743
6be7948f 11744static void alc272_fixup_mario(struct hda_codec *codec,
1727a771 11745 const struct hda_fixup *fix, int action)
6fc398cb 11746{
9bb1f06f 11747 if (action != HDA_FIXUP_ACT_PRE_PROBE)
6fc398cb 11748 return;
6be7948f
TB
11749 if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
11750 (0x3b << AC_AMPCAP_OFFSET_SHIFT) |
11751 (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |
11752 (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |
11753 (0 << AC_AMPCAP_MUTE_SHIFT)))
4e76a883 11754 codec_warn(codec, "failed to override amp caps for NID 0x2\n");
6be7948f
TB
11755}
11756
8e383953
TI
11757static const struct snd_pcm_chmap_elem asus_pcm_2_1_chmaps[] = {
11758 { .channels = 2,
11759 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
11760 { .channels = 4,
11761 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
11762 SNDRV_CHMAP_NA, SNDRV_CHMAP_LFE } }, /* LFE only on right */
11763 { }
11764};
11765
11766/* override the 2.1 chmap */
eb9ca3ab 11767static void alc_fixup_bass_chmap(struct hda_codec *codec,
8e383953
TI
11768 const struct hda_fixup *fix, int action)
11769{
11770 if (action == HDA_FIXUP_ACT_BUILD) {
11771 struct alc_spec *spec = codec->spec;
bbbc7e85 11772 spec->gen.pcm_rec[0]->stream[0].chmap = asus_pcm_2_1_chmaps;
8e383953
TI
11773 }
11774}
11775
bf68665d
TI
11776/* avoid D3 for keeping GPIO up */
11777static unsigned int gpio_led_power_filter(struct hda_codec *codec,
11778 hda_nid_t nid,
11779 unsigned int power_state)
11780{
11781 struct alc_spec *spec = codec->spec;
d261eec8 11782 if (nid == codec->core.afg && power_state == AC_PWRST_D3 && spec->gpio_data)
bf68665d
TI
11783 return AC_PWRST_D0;
11784 return power_state;
11785}
11786
3e887f37
TI
11787static void alc662_fixup_led_gpio1(struct hda_codec *codec,
11788 const struct hda_fixup *fix, int action)
11789{
11790 struct alc_spec *spec = codec->spec;
3e887f37 11791
01e4a275 11792 alc_fixup_hp_gpio_led(codec, action, 0x01, 0);
3e887f37 11793 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
0f32fd19 11794 spec->mute_led_polarity = 1;
bf68665d 11795 codec->power_filter = gpio_led_power_filter;
3e887f37
TI
11796 }
11797}
11798
c6790c8e
KY
11799static void alc662_usi_automute_hook(struct hda_codec *codec,
11800 struct hda_jack_callback *jack)
11801{
11802 struct alc_spec *spec = codec->spec;
11803 int vref;
11804 msleep(200);
11805 snd_hda_gen_hp_automute(codec, jack);
11806
11807 vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
11808 msleep(100);
11809 snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
11810 vref);
11811}
11812
11813static void alc662_fixup_usi_headset_mic(struct hda_codec *codec,
11814 const struct hda_fixup *fix, int action)
11815{
11816 struct alc_spec *spec = codec->spec;
11817 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
11818 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
11819 spec->gen.hp_automute_hook = alc662_usi_automute_hook;
11820 }
11821}
11822
00066e97
SB
11823static void alc662_aspire_ethos_mute_speakers(struct hda_codec *codec,
11824 struct hda_jack_callback *cb)
11825{
11826 /* surround speakers at 0x1b already get muted automatically when
11827 * headphones are plugged in, but we have to mute/unmute the remaining
11828 * channels manually:
11829 * 0x15 - front left/front right
11830 * 0x18 - front center/ LFE
11831 */
11832 if (snd_hda_jack_detect_state(codec, 0x1b) == HDA_JACK_PRESENT) {
11833 snd_hda_set_pin_ctl_cache(codec, 0x15, 0);
11834 snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
11835 } else {
11836 snd_hda_set_pin_ctl_cache(codec, 0x15, PIN_OUT);
11837 snd_hda_set_pin_ctl_cache(codec, 0x18, PIN_OUT);
11838 }
11839}
11840
11841static void alc662_fixup_aspire_ethos_hp(struct hda_codec *codec,
11842 const struct hda_fixup *fix, int action)
11843{
11844 /* Pin 0x1b: shared headphones jack and surround speakers */
11845 if (!is_jack_detectable(codec, 0x1b))
11846 return;
11847
11848 switch (action) {
11849 case HDA_FIXUP_ACT_PRE_PROBE:
11850 snd_hda_jack_detect_enable_callback(codec, 0x1b,
11851 alc662_aspire_ethos_mute_speakers);
336820c4
TI
11852 /* subwoofer needs an extra GPIO setting to become audible */
11853 alc_setup_gpio(codec, 0x02);
00066e97
SB
11854 break;
11855 case HDA_FIXUP_ACT_INIT:
11856 /* Make sure to start in a correct state, i.e. if
11857 * headphones have been plugged in before powering up the system
11858 */
11859 alc662_aspire_ethos_mute_speakers(codec, NULL);
11860 break;
11861 }
11862}
11863
5af29028
KY
11864static void alc671_fixup_hp_headset_mic2(struct hda_codec *codec,
11865 const struct hda_fixup *fix, int action)
11866{
11867 struct alc_spec *spec = codec->spec;
11868
11869 static const struct hda_pintbl pincfgs[] = {
11870 { 0x19, 0x02a11040 }, /* use as headset mic, with its own jack detect */
11871 { 0x1b, 0x0181304f },
11872 { }
11873 };
11874
11875 switch (action) {
11876 case HDA_FIXUP_ACT_PRE_PROBE:
11877 spec->gen.mixer_nid = 0;
11878 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
11879 snd_hda_apply_pincfgs(codec, pincfgs);
11880 break;
11881 case HDA_FIXUP_ACT_INIT:
11882 alc_write_coef_idx(codec, 0x19, 0xa054);
11883 break;
11884 }
11885}
11886
d7f32791
KY
11887static void alc897_hp_automute_hook(struct hda_codec *codec,
11888 struct hda_jack_callback *jack)
11889{
11890 struct alc_spec *spec = codec->spec;
11891 int vref;
11892
11893 snd_hda_gen_hp_automute(codec, jack);
11894 vref = spec->gen.hp_jack_present ? (PIN_HP | AC_PINCTL_VREF_100) : PIN_HP;
d397b6e5 11895 snd_hda_set_pin_ctl(codec, 0x1b, vref);
d7f32791
KY
11896}
11897
11898static void alc897_fixup_lenovo_headset_mic(struct hda_codec *codec,
11899 const struct hda_fixup *fix, int action)
11900{
11901 struct alc_spec *spec = codec->spec;
11902 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
11903 spec->gen.hp_automute_hook = alc897_hp_automute_hook;
d397b6e5
KY
11904 spec->no_shutup_pins = 1;
11905 }
11906 if (action == HDA_FIXUP_ACT_PROBE) {
11907 snd_hda_set_pin_ctl_cache(codec, 0x1a, PIN_IN | AC_PINCTL_VREF_100);
d7f32791
KY
11908 }
11909}
11910
4bf5bf54
EP
11911static void alc897_fixup_lenovo_headset_mode(struct hda_codec *codec,
11912 const struct hda_fixup *fix, int action)
11913{
11914 struct alc_spec *spec = codec->spec;
11915
11916 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
11917 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
11918 spec->gen.hp_automute_hook = alc897_hp_automute_hook;
11919 }
11920}
11921
6b0f95c4 11922static const struct coef_fw alc668_coefs[] = {
f3f9185f
KY
11923 WRITE_COEF(0x01, 0xbebe), WRITE_COEF(0x02, 0xaaaa), WRITE_COEF(0x03, 0x0),
11924 WRITE_COEF(0x04, 0x0180), WRITE_COEF(0x06, 0x0), WRITE_COEF(0x07, 0x0f80),
11925 WRITE_COEF(0x08, 0x0031), WRITE_COEF(0x0a, 0x0060), WRITE_COEF(0x0b, 0x0),
11926 WRITE_COEF(0x0c, 0x7cf7), WRITE_COEF(0x0d, 0x1080), WRITE_COEF(0x0e, 0x7f7f),
11927 WRITE_COEF(0x0f, 0xcccc), WRITE_COEF(0x10, 0xddcc), WRITE_COEF(0x11, 0x0001),
11928 WRITE_COEF(0x13, 0x0), WRITE_COEF(0x14, 0x2aa0), WRITE_COEF(0x17, 0xa940),
11929 WRITE_COEF(0x19, 0x0), WRITE_COEF(0x1a, 0x0), WRITE_COEF(0x1b, 0x0),
11930 WRITE_COEF(0x1c, 0x0), WRITE_COEF(0x1d, 0x0), WRITE_COEF(0x1e, 0x7418),
11931 WRITE_COEF(0x1f, 0x0804), WRITE_COEF(0x20, 0x4200), WRITE_COEF(0x21, 0x0468),
11932 WRITE_COEF(0x22, 0x8ccc), WRITE_COEF(0x23, 0x0250), WRITE_COEF(0x24, 0x7418),
11933 WRITE_COEF(0x27, 0x0), WRITE_COEF(0x28, 0x8ccc), WRITE_COEF(0x2a, 0xff00),
11934 WRITE_COEF(0x2b, 0x8000), WRITE_COEF(0xa7, 0xff00), WRITE_COEF(0xa8, 0x8000),
11935 WRITE_COEF(0xaa, 0x2e17), WRITE_COEF(0xab, 0xa0c0), WRITE_COEF(0xac, 0x0),
11936 WRITE_COEF(0xad, 0x0), WRITE_COEF(0xae, 0x2ac6), WRITE_COEF(0xaf, 0xa480),
11937 WRITE_COEF(0xb0, 0x0), WRITE_COEF(0xb1, 0x0), WRITE_COEF(0xb2, 0x0),
11938 WRITE_COEF(0xb3, 0x0), WRITE_COEF(0xb4, 0x0), WRITE_COEF(0xb5, 0x1040),
11939 WRITE_COEF(0xb6, 0xd697), WRITE_COEF(0xb7, 0x902b), WRITE_COEF(0xb8, 0xd697),
11940 WRITE_COEF(0xb9, 0x902b), WRITE_COEF(0xba, 0xb8ba), WRITE_COEF(0xbb, 0xaaab),
11941 WRITE_COEF(0xbc, 0xaaaf), WRITE_COEF(0xbd, 0x6aaa), WRITE_COEF(0xbe, 0x1c02),
11942 WRITE_COEF(0xc0, 0x00ff), WRITE_COEF(0xc1, 0x0fa6),
11943 {}
11944};
11945
11946static void alc668_restore_default_value(struct hda_codec *codec)
11947{
11948 alc_process_coef_fw(codec, alc668_coefs);
11949}
11950
6cb3b707 11951enum {
2df03514 11952 ALC662_FIXUP_ASPIRE,
3e887f37 11953 ALC662_FIXUP_LED_GPIO1,
6cb3b707 11954 ALC662_FIXUP_IDEAPAD,
6be7948f 11955 ALC272_FIXUP_MARIO,
f1ec5be1 11956 ALC662_FIXUP_CZC_ET26,
d2ebd479 11957 ALC662_FIXUP_CZC_P10T,
94024cd1 11958 ALC662_FIXUP_SKU_IGNORE,
e59ea3ed 11959 ALC662_FIXUP_HP_RP5800,
53c334ad
TI
11960 ALC662_FIXUP_ASUS_MODE1,
11961 ALC662_FIXUP_ASUS_MODE2,
11962 ALC662_FIXUP_ASUS_MODE3,
11963 ALC662_FIXUP_ASUS_MODE4,
11964 ALC662_FIXUP_ASUS_MODE5,
11965 ALC662_FIXUP_ASUS_MODE6,
11966 ALC662_FIXUP_ASUS_MODE7,
11967 ALC662_FIXUP_ASUS_MODE8,
1565cc35 11968 ALC662_FIXUP_NO_JACK_DETECT,
edfe3bfc 11969 ALC662_FIXUP_ZOTAC_Z68,
125821ae 11970 ALC662_FIXUP_INV_DMIC,
1f8b46cd 11971 ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
73bdd597 11972 ALC668_FIXUP_DELL_MIC_NO_PRESENCE,
1f8b46cd 11973 ALC662_FIXUP_HEADSET_MODE,
73bdd597 11974 ALC668_FIXUP_HEADSET_MODE,
8e54b4ac 11975 ALC662_FIXUP_BASS_MODE4_CHMAP,
61a75f13 11976 ALC662_FIXUP_BASS_16,
a30c9aaa 11977 ALC662_FIXUP_BASS_1A,
8e54b4ac 11978 ALC662_FIXUP_BASS_CHMAP,
493a52a9 11979 ALC668_FIXUP_AUTO_MUTE,
5e6db669 11980 ALC668_FIXUP_DELL_DISABLE_AAMIX,
033b0a7c 11981 ALC668_FIXUP_DELL_XPS13,
9d4dc584 11982 ALC662_FIXUP_ASUS_Nx50,
fc7438b1 11983 ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
3231e205 11984 ALC668_FIXUP_ASUS_Nx51,
5b7c5e1f 11985 ALC668_FIXUP_MIC_COEF,
11ba6111 11986 ALC668_FIXUP_ASUS_G751,
78f4f7c2
KY
11987 ALC891_FIXUP_HEADSET_MODE,
11988 ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
9b51fe3e 11989 ALC662_FIXUP_ACER_VERITON,
1a3f0991 11990 ALC892_FIXUP_ASROCK_MOBO,
c6790c8e
KY
11991 ALC662_FIXUP_USI_FUNC,
11992 ALC662_FIXUP_USI_HEADSET_MODE,
ca169cc2 11993 ALC662_FIXUP_LENOVO_MULTI_CODECS,
00066e97 11994 ALC669_FIXUP_ACER_ASPIRE_ETHOS,
00066e97 11995 ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET,
5af29028 11996 ALC671_FIXUP_HP_HEADSET_MIC2,
d858c706 11997 ALC662_FIXUP_ACER_X2660G_HEADSET_MODE,
a124458a 11998 ALC662_FIXUP_ACER_NITRO_HEADSET_MODE,
a3fd1a98
HW
11999 ALC668_FIXUP_ASUS_NO_HEADSET_MIC,
12000 ALC668_FIXUP_HEADSET_MIC,
12001 ALC668_FIXUP_MIC_DET_COEF,
d7f32791
KY
12002 ALC897_FIXUP_LENOVO_HEADSET_MIC,
12003 ALC897_FIXUP_HEADSET_MIC_PIN,
fe6900bd 12004 ALC897_FIXUP_HP_HSMIC_VERB,
4bf5bf54
EP
12005 ALC897_FIXUP_LENOVO_HEADSET_MODE,
12006 ALC897_FIXUP_HEADSET_MIC_PIN2,
73f1c75d 12007 ALC897_FIXUP_UNIS_H3C_X500S,
6cb3b707
DH
12008};
12009
1727a771 12010static const struct hda_fixup alc662_fixups[] = {
2df03514 12011 [ALC662_FIXUP_ASPIRE] = {
1727a771
TI
12012 .type = HDA_FIXUP_PINS,
12013 .v.pins = (const struct hda_pintbl[]) {
2df03514
DC
12014 { 0x15, 0x99130112 }, /* subwoofer */
12015 { }
12016 }
12017 },
3e887f37
TI
12018 [ALC662_FIXUP_LED_GPIO1] = {
12019 .type = HDA_FIXUP_FUNC,
12020 .v.func = alc662_fixup_led_gpio1,
12021 },
6cb3b707 12022 [ALC662_FIXUP_IDEAPAD] = {
1727a771
TI
12023 .type = HDA_FIXUP_PINS,
12024 .v.pins = (const struct hda_pintbl[]) {
6cb3b707
DH
12025 { 0x17, 0x99130112 }, /* subwoofer */
12026 { }
3e887f37
TI
12027 },
12028 .chained = true,
12029 .chain_id = ALC662_FIXUP_LED_GPIO1,
6cb3b707 12030 },
6be7948f 12031 [ALC272_FIXUP_MARIO] = {
1727a771 12032 .type = HDA_FIXUP_FUNC,
b5bfbc67 12033 .v.func = alc272_fixup_mario,
d2ebd479 12034 },
f1ec5be1
HC
12035 [ALC662_FIXUP_CZC_ET26] = {
12036 .type = HDA_FIXUP_PINS,
12037 .v.pins = (const struct hda_pintbl[]) {
12038 {0x12, 0x403cc000},
12039 {0x14, 0x90170110}, /* speaker */
12040 {0x15, 0x411111f0},
12041 {0x16, 0x411111f0},
12042 {0x18, 0x01a19030}, /* mic */
12043 {0x19, 0x90a7013f}, /* int-mic */
12044 {0x1a, 0x01014020},
12045 {0x1b, 0x0121401f},
12046 {0x1c, 0x411111f0},
12047 {0x1d, 0x411111f0},
12048 {0x1e, 0x40478e35},
12049 {}
12050 },
12051 .chained = true,
12052 .chain_id = ALC662_FIXUP_SKU_IGNORE
12053 },
d2ebd479 12054 [ALC662_FIXUP_CZC_P10T] = {
1727a771 12055 .type = HDA_FIXUP_VERBS,
d2ebd479
AA
12056 .v.verbs = (const struct hda_verb[]) {
12057 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
12058 {}
12059 }
12060 },
94024cd1 12061 [ALC662_FIXUP_SKU_IGNORE] = {
1727a771 12062 .type = HDA_FIXUP_FUNC,
23d30f28 12063 .v.func = alc_fixup_sku_ignore,
c6b35874 12064 },
e59ea3ed 12065 [ALC662_FIXUP_HP_RP5800] = {
1727a771
TI
12066 .type = HDA_FIXUP_PINS,
12067 .v.pins = (const struct hda_pintbl[]) {
e59ea3ed
TI
12068 { 0x14, 0x0221201f }, /* HP out */
12069 { }
12070 },
12071 .chained = true,
12072 .chain_id = ALC662_FIXUP_SKU_IGNORE
12073 },
53c334ad 12074 [ALC662_FIXUP_ASUS_MODE1] = {
1727a771
TI
12075 .type = HDA_FIXUP_PINS,
12076 .v.pins = (const struct hda_pintbl[]) {
53c334ad
TI
12077 { 0x14, 0x99130110 }, /* speaker */
12078 { 0x18, 0x01a19c20 }, /* mic */
12079 { 0x19, 0x99a3092f }, /* int-mic */
12080 { 0x21, 0x0121401f }, /* HP out */
12081 { }
12082 },
12083 .chained = true,
12084 .chain_id = ALC662_FIXUP_SKU_IGNORE
12085 },
12086 [ALC662_FIXUP_ASUS_MODE2] = {
1727a771
TI
12087 .type = HDA_FIXUP_PINS,
12088 .v.pins = (const struct hda_pintbl[]) {
2996bdba
TI
12089 { 0x14, 0x99130110 }, /* speaker */
12090 { 0x18, 0x01a19820 }, /* mic */
12091 { 0x19, 0x99a3092f }, /* int-mic */
12092 { 0x1b, 0x0121401f }, /* HP out */
12093 { }
12094 },
53c334ad
TI
12095 .chained = true,
12096 .chain_id = ALC662_FIXUP_SKU_IGNORE
12097 },
12098 [ALC662_FIXUP_ASUS_MODE3] = {
1727a771
TI
12099 .type = HDA_FIXUP_PINS,
12100 .v.pins = (const struct hda_pintbl[]) {
53c334ad
TI
12101 { 0x14, 0x99130110 }, /* speaker */
12102 { 0x15, 0x0121441f }, /* HP */
12103 { 0x18, 0x01a19840 }, /* mic */
12104 { 0x19, 0x99a3094f }, /* int-mic */
12105 { 0x21, 0x01211420 }, /* HP2 */
12106 { }
12107 },
12108 .chained = true,
12109 .chain_id = ALC662_FIXUP_SKU_IGNORE
12110 },
12111 [ALC662_FIXUP_ASUS_MODE4] = {
1727a771
TI
12112 .type = HDA_FIXUP_PINS,
12113 .v.pins = (const struct hda_pintbl[]) {
53c334ad
TI
12114 { 0x14, 0x99130110 }, /* speaker */
12115 { 0x16, 0x99130111 }, /* speaker */
12116 { 0x18, 0x01a19840 }, /* mic */
12117 { 0x19, 0x99a3094f }, /* int-mic */
12118 { 0x21, 0x0121441f }, /* HP */
12119 { }
12120 },
12121 .chained = true,
12122 .chain_id = ALC662_FIXUP_SKU_IGNORE
12123 },
12124 [ALC662_FIXUP_ASUS_MODE5] = {
1727a771
TI
12125 .type = HDA_FIXUP_PINS,
12126 .v.pins = (const struct hda_pintbl[]) {
53c334ad
TI
12127 { 0x14, 0x99130110 }, /* speaker */
12128 { 0x15, 0x0121441f }, /* HP */
12129 { 0x16, 0x99130111 }, /* speaker */
12130 { 0x18, 0x01a19840 }, /* mic */
12131 { 0x19, 0x99a3094f }, /* int-mic */
12132 { }
12133 },
12134 .chained = true,
12135 .chain_id = ALC662_FIXUP_SKU_IGNORE
12136 },
12137 [ALC662_FIXUP_ASUS_MODE6] = {
1727a771
TI
12138 .type = HDA_FIXUP_PINS,
12139 .v.pins = (const struct hda_pintbl[]) {
53c334ad
TI
12140 { 0x14, 0x99130110 }, /* speaker */
12141 { 0x15, 0x01211420 }, /* HP2 */
12142 { 0x18, 0x01a19840 }, /* mic */
12143 { 0x19, 0x99a3094f }, /* int-mic */
12144 { 0x1b, 0x0121441f }, /* HP */
12145 { }
12146 },
12147 .chained = true,
12148 .chain_id = ALC662_FIXUP_SKU_IGNORE
12149 },
12150 [ALC662_FIXUP_ASUS_MODE7] = {
1727a771
TI
12151 .type = HDA_FIXUP_PINS,
12152 .v.pins = (const struct hda_pintbl[]) {
53c334ad
TI
12153 { 0x14, 0x99130110 }, /* speaker */
12154 { 0x17, 0x99130111 }, /* speaker */
12155 { 0x18, 0x01a19840 }, /* mic */
12156 { 0x19, 0x99a3094f }, /* int-mic */
12157 { 0x1b, 0x01214020 }, /* HP */
12158 { 0x21, 0x0121401f }, /* HP */
12159 { }
12160 },
12161 .chained = true,
12162 .chain_id = ALC662_FIXUP_SKU_IGNORE
12163 },
12164 [ALC662_FIXUP_ASUS_MODE8] = {
1727a771
TI
12165 .type = HDA_FIXUP_PINS,
12166 .v.pins = (const struct hda_pintbl[]) {
53c334ad
TI
12167 { 0x14, 0x99130110 }, /* speaker */
12168 { 0x12, 0x99a30970 }, /* int-mic */
12169 { 0x15, 0x01214020 }, /* HP */
12170 { 0x17, 0x99130111 }, /* speaker */
12171 { 0x18, 0x01a19840 }, /* mic */
12172 { 0x21, 0x0121401f }, /* HP */
12173 { }
12174 },
12175 .chained = true,
12176 .chain_id = ALC662_FIXUP_SKU_IGNORE
2996bdba 12177 },
1565cc35 12178 [ALC662_FIXUP_NO_JACK_DETECT] = {
1727a771 12179 .type = HDA_FIXUP_FUNC,
1565cc35
TI
12180 .v.func = alc_fixup_no_jack_detect,
12181 },
edfe3bfc 12182 [ALC662_FIXUP_ZOTAC_Z68] = {
1727a771
TI
12183 .type = HDA_FIXUP_PINS,
12184 .v.pins = (const struct hda_pintbl[]) {
edfe3bfc
DH
12185 { 0x1b, 0x02214020 }, /* Front HP */
12186 { }
12187 }
12188 },
125821ae 12189 [ALC662_FIXUP_INV_DMIC] = {
1727a771 12190 .type = HDA_FIXUP_FUNC,
9d36a7dc 12191 .v.func = alc_fixup_inv_dmic,
125821ae 12192 },
033b0a7c
GM
12193 [ALC668_FIXUP_DELL_XPS13] = {
12194 .type = HDA_FIXUP_FUNC,
12195 .v.func = alc_fixup_dell_xps13,
12196 .chained = true,
12197 .chain_id = ALC668_FIXUP_DELL_DISABLE_AAMIX
12198 },
5e6db669
GM
12199 [ALC668_FIXUP_DELL_DISABLE_AAMIX] = {
12200 .type = HDA_FIXUP_FUNC,
12201 .v.func = alc_fixup_disable_aamix,
12202 .chained = true,
12203 .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
12204 },
493a52a9
HW
12205 [ALC668_FIXUP_AUTO_MUTE] = {
12206 .type = HDA_FIXUP_FUNC,
12207 .v.func = alc_fixup_auto_mute_via_amp,
12208 .chained = true,
12209 .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
12210 },
1f8b46cd
DH
12211 [ALC662_FIXUP_DELL_MIC_NO_PRESENCE] = {
12212 .type = HDA_FIXUP_PINS,
12213 .v.pins = (const struct hda_pintbl[]) {
12214 { 0x19, 0x03a1113c }, /* use as headset mic, without its own jack detect */
12215 /* headphone mic by setting pin control of 0x1b (headphone out) to in + vref_50 */
12216 { }
12217 },
12218 .chained = true,
12219 .chain_id = ALC662_FIXUP_HEADSET_MODE
12220 },
12221 [ALC662_FIXUP_HEADSET_MODE] = {
12222 .type = HDA_FIXUP_FUNC,
12223 .v.func = alc_fixup_headset_mode_alc662,
12224 },
73bdd597
DH
12225 [ALC668_FIXUP_DELL_MIC_NO_PRESENCE] = {
12226 .type = HDA_FIXUP_PINS,
12227 .v.pins = (const struct hda_pintbl[]) {
12228 { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
12229 { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
12230 { }
12231 },
12232 .chained = true,
12233 .chain_id = ALC668_FIXUP_HEADSET_MODE
12234 },
12235 [ALC668_FIXUP_HEADSET_MODE] = {
12236 .type = HDA_FIXUP_FUNC,
12237 .v.func = alc_fixup_headset_mode_alc668,
12238 },
8e54b4ac 12239 [ALC662_FIXUP_BASS_MODE4_CHMAP] = {
8e383953 12240 .type = HDA_FIXUP_FUNC,
eb9ca3ab 12241 .v.func = alc_fixup_bass_chmap,
8e383953
TI
12242 .chained = true,
12243 .chain_id = ALC662_FIXUP_ASUS_MODE4
12244 },
61a75f13
DH
12245 [ALC662_FIXUP_BASS_16] = {
12246 .type = HDA_FIXUP_PINS,
12247 .v.pins = (const struct hda_pintbl[]) {
12248 {0x16, 0x80106111}, /* bass speaker */
12249 {}
12250 },
12251 .chained = true,
12252 .chain_id = ALC662_FIXUP_BASS_CHMAP,
12253 },
a30c9aaa
TI
12254 [ALC662_FIXUP_BASS_1A] = {
12255 .type = HDA_FIXUP_PINS,
12256 .v.pins = (const struct hda_pintbl[]) {
12257 {0x1a, 0x80106111}, /* bass speaker */
12258 {}
12259 },
8e54b4ac
DH
12260 .chained = true,
12261 .chain_id = ALC662_FIXUP_BASS_CHMAP,
a30c9aaa 12262 },
8e54b4ac 12263 [ALC662_FIXUP_BASS_CHMAP] = {
a30c9aaa 12264 .type = HDA_FIXUP_FUNC,
eb9ca3ab 12265 .v.func = alc_fixup_bass_chmap,
a30c9aaa 12266 },
9d4dc584
BM
12267 [ALC662_FIXUP_ASUS_Nx50] = {
12268 .type = HDA_FIXUP_FUNC,
12269 .v.func = alc_fixup_auto_mute_via_amp,
12270 .chained = true,
12271 .chain_id = ALC662_FIXUP_BASS_1A
12272 },
fc7438b1
MP
12273 [ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE] = {
12274 .type = HDA_FIXUP_FUNC,
12275 .v.func = alc_fixup_headset_mode_alc668,
12276 .chain_id = ALC662_FIXUP_BASS_CHMAP
12277 },
3231e205
YP
12278 [ALC668_FIXUP_ASUS_Nx51] = {
12279 .type = HDA_FIXUP_PINS,
12280 .v.pins = (const struct hda_pintbl[]) {
fc7438b1
MP
12281 { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
12282 { 0x1a, 0x90170151 }, /* bass speaker */
12283 { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
3231e205
YP
12284 {}
12285 },
12286 .chained = true,
fc7438b1 12287 .chain_id = ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
3231e205 12288 },
5b7c5e1f 12289 [ALC668_FIXUP_MIC_COEF] = {
11ba6111
TI
12290 .type = HDA_FIXUP_VERBS,
12291 .v.verbs = (const struct hda_verb[]) {
12292 { 0x20, AC_VERB_SET_COEF_INDEX, 0xc3 },
12293 { 0x20, AC_VERB_SET_PROC_COEF, 0x4000 },
12294 {}
12295 },
12296 },
5b7c5e1f
TI
12297 [ALC668_FIXUP_ASUS_G751] = {
12298 .type = HDA_FIXUP_PINS,
12299 .v.pins = (const struct hda_pintbl[]) {
12300 { 0x16, 0x0421101f }, /* HP */
12301 {}
12302 },
12303 .chained = true,
12304 .chain_id = ALC668_FIXUP_MIC_COEF
12305 },
78f4f7c2
KY
12306 [ALC891_FIXUP_HEADSET_MODE] = {
12307 .type = HDA_FIXUP_FUNC,
12308 .v.func = alc_fixup_headset_mode,
12309 },
12310 [ALC891_FIXUP_DELL_MIC_NO_PRESENCE] = {
12311 .type = HDA_FIXUP_PINS,
12312 .v.pins = (const struct hda_pintbl[]) {
12313 { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
12314 { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
12315 { }
12316 },
12317 .chained = true,
12318 .chain_id = ALC891_FIXUP_HEADSET_MODE
12319 },
9b51fe3e
SB
12320 [ALC662_FIXUP_ACER_VERITON] = {
12321 .type = HDA_FIXUP_PINS,
12322 .v.pins = (const struct hda_pintbl[]) {
12323 { 0x15, 0x50170120 }, /* no internal speaker */
12324 { }
12325 }
12326 },
1a3f0991
TI
12327 [ALC892_FIXUP_ASROCK_MOBO] = {
12328 .type = HDA_FIXUP_PINS,
12329 .v.pins = (const struct hda_pintbl[]) {
12330 { 0x15, 0x40f000f0 }, /* disabled */
12331 { 0x16, 0x40f000f0 }, /* disabled */
1a3f0991
TI
12332 { }
12333 }
12334 },
c6790c8e
KY
12335 [ALC662_FIXUP_USI_FUNC] = {
12336 .type = HDA_FIXUP_FUNC,
12337 .v.func = alc662_fixup_usi_headset_mic,
12338 },
12339 [ALC662_FIXUP_USI_HEADSET_MODE] = {
12340 .type = HDA_FIXUP_PINS,
12341 .v.pins = (const struct hda_pintbl[]) {
12342 { 0x19, 0x02a1913c }, /* use as headset mic, without its own jack detect */
12343 { 0x18, 0x01a1903d },
12344 { }
12345 },
12346 .chained = true,
12347 .chain_id = ALC662_FIXUP_USI_FUNC
12348 },
ca169cc2
KY
12349 [ALC662_FIXUP_LENOVO_MULTI_CODECS] = {
12350 .type = HDA_FIXUP_FUNC,
12351 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
12352 },
00066e97
SB
12353 [ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET] = {
12354 .type = HDA_FIXUP_FUNC,
12355 .v.func = alc662_fixup_aspire_ethos_hp,
12356 },
00066e97
SB
12357 [ALC669_FIXUP_ACER_ASPIRE_ETHOS] = {
12358 .type = HDA_FIXUP_PINS,
12359 .v.pins = (const struct hda_pintbl[]) {
12360 { 0x15, 0x92130110 }, /* front speakers */
12361 { 0x18, 0x99130111 }, /* center/subwoofer */
12362 { 0x1b, 0x11130012 }, /* surround plus jack for HP */
12363 { }
12364 },
12365 .chained = true,
336820c4 12366 .chain_id = ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET
00066e97 12367 },
5af29028
KY
12368 [ALC671_FIXUP_HP_HEADSET_MIC2] = {
12369 .type = HDA_FIXUP_FUNC,
12370 .v.func = alc671_fixup_hp_headset_mic2,
12371 },
d858c706
JHP
12372 [ALC662_FIXUP_ACER_X2660G_HEADSET_MODE] = {
12373 .type = HDA_FIXUP_PINS,
12374 .v.pins = (const struct hda_pintbl[]) {
12375 { 0x1a, 0x02a1113c }, /* use as headset mic, without its own jack detect */
12376 { }
12377 },
12378 .chained = true,
12379 .chain_id = ALC662_FIXUP_USI_FUNC
12380 },
a124458a
JHP
12381 [ALC662_FIXUP_ACER_NITRO_HEADSET_MODE] = {
12382 .type = HDA_FIXUP_PINS,
12383 .v.pins = (const struct hda_pintbl[]) {
12384 { 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */
12385 { 0x1b, 0x0221144f },
12386 { }
12387 },
12388 .chained = true,
12389 .chain_id = ALC662_FIXUP_USI_FUNC
12390 },
a3fd1a98
HW
12391 [ALC668_FIXUP_ASUS_NO_HEADSET_MIC] = {
12392 .type = HDA_FIXUP_PINS,
12393 .v.pins = (const struct hda_pintbl[]) {
12394 { 0x1b, 0x04a1112c },
12395 { }
12396 },
12397 .chained = true,
12398 .chain_id = ALC668_FIXUP_HEADSET_MIC
12399 },
12400 [ALC668_FIXUP_HEADSET_MIC] = {
12401 .type = HDA_FIXUP_FUNC,
12402 .v.func = alc269_fixup_headset_mic,
12403 .chained = true,
12404 .chain_id = ALC668_FIXUP_MIC_DET_COEF
12405 },
12406 [ALC668_FIXUP_MIC_DET_COEF] = {
12407 .type = HDA_FIXUP_VERBS,
12408 .v.verbs = (const struct hda_verb[]) {
12409 { 0x20, AC_VERB_SET_COEF_INDEX, 0x15 },
12410 { 0x20, AC_VERB_SET_PROC_COEF, 0x0d60 },
12411 {}
12412 },
12413 },
d7f32791
KY
12414 [ALC897_FIXUP_LENOVO_HEADSET_MIC] = {
12415 .type = HDA_FIXUP_FUNC,
12416 .v.func = alc897_fixup_lenovo_headset_mic,
12417 },
12418 [ALC897_FIXUP_HEADSET_MIC_PIN] = {
12419 .type = HDA_FIXUP_PINS,
12420 .v.pins = (const struct hda_pintbl[]) {
12421 { 0x1a, 0x03a11050 },
12422 { }
12423 },
12424 .chained = true,
12425 .chain_id = ALC897_FIXUP_LENOVO_HEADSET_MIC
12426 },
fe6900bd
KY
12427 [ALC897_FIXUP_HP_HSMIC_VERB] = {
12428 .type = HDA_FIXUP_PINS,
12429 .v.pins = (const struct hda_pintbl[]) {
12430 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
12431 { }
12432 },
12433 },
4bf5bf54
EP
12434 [ALC897_FIXUP_LENOVO_HEADSET_MODE] = {
12435 .type = HDA_FIXUP_FUNC,
12436 .v.func = alc897_fixup_lenovo_headset_mode,
12437 },
12438 [ALC897_FIXUP_HEADSET_MIC_PIN2] = {
12439 .type = HDA_FIXUP_PINS,
12440 .v.pins = (const struct hda_pintbl[]) {
12441 { 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */
12442 { }
12443 },
12444 .chained = true,
12445 .chain_id = ALC897_FIXUP_LENOVO_HEADSET_MODE
12446 },
73f1c75d 12447 [ALC897_FIXUP_UNIS_H3C_X500S] = {
12448 .type = HDA_FIXUP_VERBS,
12449 .v.verbs = (const struct hda_verb[]) {
12450 { 0x14, AC_VERB_SET_EAPD_BTLENABLE, 0 },
12451 {}
12452 },
12453 },
6cb3b707
DH
12454};
12455
a9111321 12456static const struct snd_pci_quirk alc662_fixup_tbl[] = {
53c334ad 12457 SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2),
d3d3835c 12458 SND_PCI_QUIRK(0x1025, 0x022f, "Acer Aspire One", ALC662_FIXUP_INV_DMIC),
02f6ff90 12459 SND_PCI_QUIRK(0x1025, 0x0241, "Packard Bell DOTS", ALC662_FIXUP_INV_DMIC),
a6c47a85 12460 SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
94024cd1 12461 SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),
125821ae 12462 SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC),
1801928e 12463 SND_PCI_QUIRK(0x1025, 0x034a, "Gateway LT27", ALC662_FIXUP_INV_DMIC),
2df03514 12464 SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
9edeb110 12465 SND_PCI_QUIRK(0x1025, 0x0566, "Acer Aspire Ethos 8951G", ALC669_FIXUP_ACER_ASPIRE_ETHOS),
a124458a 12466 SND_PCI_QUIRK(0x1025, 0x123c, "Acer Nitro N50-600", ALC662_FIXUP_ACER_NITRO_HEADSET_MODE),
d858c706 12467 SND_PCI_QUIRK(0x1025, 0x124e, "Acer 2660G", ALC662_FIXUP_ACER_X2660G_HEADSET_MODE),
73bdd597
DH
12468 SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
12469 SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
c5d019c3 12470 SND_PCI_QUIRK(0x1028, 0x05fe, "Dell XPS 15", ALC668_FIXUP_DELL_XPS13),
033b0a7c 12471 SND_PCI_QUIRK(0x1028, 0x060a, "Dell XPS 13", ALC668_FIXUP_DELL_XPS13),
467e1436 12472 SND_PCI_QUIRK(0x1028, 0x060d, "Dell M3800", ALC668_FIXUP_DELL_XPS13),
09d2014f 12473 SND_PCI_QUIRK(0x1028, 0x0625, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
ad8ff99e 12474 SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
8dc9abb9
KY
12475 SND_PCI_QUIRK(0x1028, 0x0696, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
12476 SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
6a98e34b 12477 SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
e59ea3ed 12478 SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
ea24b995 12479 SND_PCI_QUIRK(0x103c, 0x870c, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
fe6900bd 12480 SND_PCI_QUIRK(0x103c, 0x8719, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
90670ef7 12481 SND_PCI_QUIRK(0x103c, 0x872b, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
148ebf54 12482 SND_PCI_QUIRK(0x103c, 0x873e, "HP", ALC671_FIXUP_HP_HEADSET_MIC2),
527c356b 12483 SND_PCI_QUIRK(0x103c, 0x8768, "HP Slim Desktop S01", ALC671_FIXUP_HP_HEADSET_MIC2),
dbe75d31 12484 SND_PCI_QUIRK(0x103c, 0x877e, "HP 288 Pro G6", ALC671_FIXUP_HP_HEADSET_MIC2),
882bd07f 12485 SND_PCI_QUIRK(0x103c, 0x885f, "HP 288 Pro G8", ALC671_FIXUP_HP_HEADSET_MIC2),
2da2dc9e 12486 SND_PCI_QUIRK(0x1043, 0x1080, "Asus UX501VW", ALC668_FIXUP_HEADSET_MODE),
83a9efb5 12487 SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_ASUS_Nx50),
9d4dc584 12488 SND_PCI_QUIRK(0x1043, 0x129d, "Asus N750", ALC662_FIXUP_ASUS_Nx50),
11ba6111 12489 SND_PCI_QUIRK(0x1043, 0x12ff, "ASUS G751", ALC668_FIXUP_ASUS_G751),
9edeb110 12490 SND_PCI_QUIRK(0x1043, 0x13df, "Asus N550JX", ALC662_FIXUP_BASS_1A),
8e54b4ac 12491 SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
61a75f13 12492 SND_PCI_QUIRK(0x1043, 0x15a7, "ASUS UX51VZH", ALC662_FIXUP_BASS_16),
3231e205
YP
12493 SND_PCI_QUIRK(0x1043, 0x177d, "ASUS N551", ALC668_FIXUP_ASUS_Nx51),
12494 SND_PCI_QUIRK(0x1043, 0x17bd, "ASUS N751", ALC668_FIXUP_ASUS_Nx51),
a3fd1a98 12495 SND_PCI_QUIRK(0x1043, 0x185d, "ASUS G551JW", ALC668_FIXUP_ASUS_NO_HEADSET_MIC),
c7efff92 12496 SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71SL", ALC662_FIXUP_ASUS_MODE8),
61a75f13 12497 SND_PCI_QUIRK(0x1043, 0x1b73, "ASUS N55SF", ALC662_FIXUP_BASS_16),
8e54b4ac 12498 SND_PCI_QUIRK(0x1043, 0x1bf3, "ASUS N76VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
1565cc35 12499 SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),
53c334ad 12500 SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
a0e90acc 12501 SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
c6790c8e 12502 SND_PCI_QUIRK(0x14cd, 0x5003, "USI", ALC662_FIXUP_USI_HEADSET_MODE),
ca169cc2 12503 SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC662_FIXUP_LENOVO_MULTI_CODECS),
5a873857 12504 SND_PCI_QUIRK(0x17aa, 0x1057, "Lenovo P360", ALC897_FIXUP_HEADSET_MIC_PIN),
7ca4c8d4 12505 SND_PCI_QUIRK(0x17aa, 0x1064, "Lenovo P3 Tower", ALC897_FIXUP_HEADSET_MIC_PIN),
d7f32791
KY
12506 SND_PCI_QUIRK(0x17aa, 0x32ca, "Lenovo ThinkCentre M80", ALC897_FIXUP_HEADSET_MIC_PIN),
12507 SND_PCI_QUIRK(0x17aa, 0x32cb, "Lenovo ThinkCentre M70", ALC897_FIXUP_HEADSET_MIC_PIN),
12508 SND_PCI_QUIRK(0x17aa, 0x32cf, "Lenovo ThinkCentre M950", ALC897_FIXUP_HEADSET_MIC_PIN),
12509 SND_PCI_QUIRK(0x17aa, 0x32f7, "Lenovo ThinkCentre M90", ALC897_FIXUP_HEADSET_MIC_PIN),
4ca110ca
BL
12510 SND_PCI_QUIRK(0x17aa, 0x3321, "Lenovo ThinkCentre M70 Gen4", ALC897_FIXUP_HEADSET_MIC_PIN),
12511 SND_PCI_QUIRK(0x17aa, 0x331b, "Lenovo ThinkCentre M90 Gen4", ALC897_FIXUP_HEADSET_MIC_PIN),
6f7e4664 12512 SND_PCI_QUIRK(0x17aa, 0x3364, "Lenovo ThinkCentre M90 Gen5", ALC897_FIXUP_HEADSET_MIC_PIN),
4bf5bf54 12513 SND_PCI_QUIRK(0x17aa, 0x3742, "Lenovo TianYi510Pro-14IOB", ALC897_FIXUP_HEADSET_MIC_PIN2),
d4118588 12514 SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
6cb3b707 12515 SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
1a3f0991 12516 SND_PCI_QUIRK(0x1849, 0x5892, "ASRock B150M", ALC892_FIXUP_ASROCK_MOBO),
edfe3bfc 12517 SND_PCI_QUIRK(0x19da, 0xa130, "Zotac Z68", ALC662_FIXUP_ZOTAC_Z68),
9b51fe3e 12518 SND_PCI_QUIRK(0x1b0a, 0x01b8, "ACER Veriton", ALC662_FIXUP_ACER_VERITON),
f1ec5be1 12519 SND_PCI_QUIRK(0x1b35, 0x1234, "CZC ET26", ALC662_FIXUP_CZC_ET26),
d2ebd479 12520 SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
a2a87148 12521 SND_PCI_QUIRK(0x1c6c, 0x1239, "Compaq N14JP6-V2", ALC897_FIXUP_HP_HSMIC_VERB),
53c334ad
TI
12522
12523#if 0
12524 /* Below is a quirk table taken from the old code.
12525 * Basically the device should work as is without the fixup table.
12526 * If BIOS doesn't give a proper info, enable the corresponding
12527 * fixup entry.
7d7eb9ea 12528 */
53c334ad
TI
12529 SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1),
12530 SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3),
12531 SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1),
12532 SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC662_FIXUP_ASUS_MODE3),
12533 SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
12534 SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12535 SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
12536 SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC662_FIXUP_ASUS_MODE1),
12537 SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC662_FIXUP_ASUS_MODE1),
12538 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12539 SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC662_FIXUP_ASUS_MODE7),
12540 SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC662_FIXUP_ASUS_MODE7),
12541 SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC662_FIXUP_ASUS_MODE8),
12542 SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC662_FIXUP_ASUS_MODE3),
12543 SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC662_FIXUP_ASUS_MODE1),
12544 SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12545 SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_FIXUP_ASUS_MODE2),
12546 SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC662_FIXUP_ASUS_MODE1),
12547 SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12548 SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
12549 SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
12550 SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12551 SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC662_FIXUP_ASUS_MODE1),
12552 SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC662_FIXUP_ASUS_MODE3),
12553 SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_FIXUP_ASUS_MODE2),
12554 SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12555 SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC662_FIXUP_ASUS_MODE5),
12556 SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
12557 SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12558 SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC662_FIXUP_ASUS_MODE1),
12559 SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12560 SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12561 SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC662_FIXUP_ASUS_MODE3),
12562 SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC662_FIXUP_ASUS_MODE3),
12563 SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC662_FIXUP_ASUS_MODE1),
12564 SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC662_FIXUP_ASUS_MODE1),
12565 SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC662_FIXUP_ASUS_MODE1),
12566 SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC662_FIXUP_ASUS_MODE1),
12567 SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC662_FIXUP_ASUS_MODE1),
12568 SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12569 SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_FIXUP_ASUS_MODE2),
12570 SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC662_FIXUP_ASUS_MODE1),
12571 SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
12572 SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC662_FIXUP_ASUS_MODE3),
12573 SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC662_FIXUP_ASUS_MODE1),
12574 SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC662_FIXUP_ASUS_MODE1),
12575 SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC662_FIXUP_ASUS_MODE1),
12576 SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_FIXUP_ASUS_MODE2),
12577 SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
12578 SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE4),
12579#endif
6cb3b707
DH
12580 {}
12581};
12582
1727a771 12583static const struct hda_model_fixup alc662_fixup_models[] = {
aa3841b5
TI
12584 {.id = ALC662_FIXUP_ASPIRE, .name = "aspire"},
12585 {.id = ALC662_FIXUP_IDEAPAD, .name = "ideapad"},
6be7948f 12586 {.id = ALC272_FIXUP_MARIO, .name = "mario"},
aa3841b5 12587 {.id = ALC662_FIXUP_HP_RP5800, .name = "hp-rp5800"},
53c334ad
TI
12588 {.id = ALC662_FIXUP_ASUS_MODE1, .name = "asus-mode1"},
12589 {.id = ALC662_FIXUP_ASUS_MODE2, .name = "asus-mode2"},
12590 {.id = ALC662_FIXUP_ASUS_MODE3, .name = "asus-mode3"},
12591 {.id = ALC662_FIXUP_ASUS_MODE4, .name = "asus-mode4"},
12592 {.id = ALC662_FIXUP_ASUS_MODE5, .name = "asus-mode5"},
12593 {.id = ALC662_FIXUP_ASUS_MODE6, .name = "asus-mode6"},
12594 {.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},
12595 {.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},
aa3841b5 12596 {.id = ALC662_FIXUP_ZOTAC_Z68, .name = "zotac-z68"},
6e72aa5f 12597 {.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"},
aa3841b5 12598 {.id = ALC662_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc662-headset-multi"},
e32aa85a 12599 {.id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
aa3841b5
TI
12600 {.id = ALC662_FIXUP_HEADSET_MODE, .name = "alc662-headset"},
12601 {.id = ALC668_FIXUP_HEADSET_MODE, .name = "alc668-headset"},
12602 {.id = ALC662_FIXUP_BASS_16, .name = "bass16"},
12603 {.id = ALC662_FIXUP_BASS_1A, .name = "bass1a"},
12604 {.id = ALC668_FIXUP_AUTO_MUTE, .name = "automute"},
12605 {.id = ALC668_FIXUP_DELL_XPS13, .name = "dell-xps13"},
12606 {.id = ALC662_FIXUP_ASUS_Nx50, .name = "asus-nx50"},
12607 {.id = ALC668_FIXUP_ASUS_Nx51, .name = "asus-nx51"},
40c51675 12608 {.id = ALC668_FIXUP_ASUS_G751, .name = "asus-g751"},
aa3841b5
TI
12609 {.id = ALC891_FIXUP_HEADSET_MODE, .name = "alc891-headset"},
12610 {.id = ALC891_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc891-headset-multi"},
12611 {.id = ALC662_FIXUP_ACER_VERITON, .name = "acer-veriton"},
12612 {.id = ALC892_FIXUP_ASROCK_MOBO, .name = "asrock-mobo"},
12613 {.id = ALC662_FIXUP_USI_HEADSET_MODE, .name = "usi-headset"},
ba90d6a6 12614 {.id = ALC662_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
00066e97 12615 {.id = ALC669_FIXUP_ACER_ASPIRE_ETHOS, .name = "aspire-ethos"},
73f1c75d 12616 {.id = ALC897_FIXUP_UNIS_H3C_X500S, .name = "unis-h3c-x500s"},
6be7948f
TB
12617 {}
12618};
6cb3b707 12619
532895c5 12620static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = {
78f4f7c2
KY
12621 SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
12622 {0x17, 0x02211010},
12623 {0x18, 0x01a19030},
12624 {0x1a, 0x01813040},
12625 {0x21, 0x01014020}),
4b4e0e32
HW
12626 SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
12627 {0x16, 0x01813030},
12628 {0x17, 0x02211010},
12629 {0x18, 0x01a19040},
12630 {0x21, 0x01014020}),
1f8b46cd 12631 SND_HDA_PIN_QUIRK(0x10ec0662, 0x1028, "Dell", ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
1f8b46cd 12632 {0x14, 0x01014010},
1f8b46cd 12633 {0x18, 0x01a19020},
1f8b46cd 12634 {0x1a, 0x0181302f},
11580297 12635 {0x1b, 0x0221401f}),
76c2132e
DH
12636 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
12637 {0x12, 0x99a30130},
12638 {0x14, 0x90170110},
12639 {0x15, 0x0321101f},
11580297 12640 {0x16, 0x03011020}),
76c2132e
DH
12641 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
12642 {0x12, 0x99a30140},
12643 {0x14, 0x90170110},
12644 {0x15, 0x0321101f},
11580297 12645 {0x16, 0x03011020}),
76c2132e
DH
12646 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
12647 {0x12, 0x99a30150},
12648 {0x14, 0x90170110},
12649 {0x15, 0x0321101f},
11580297 12650 {0x16, 0x03011020}),
76c2132e 12651 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
76c2132e
DH
12652 {0x14, 0x90170110},
12653 {0x15, 0x0321101f},
11580297 12654 {0x16, 0x03011020}),
76c2132e
DH
12655 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell XPS 15", ALC668_FIXUP_AUTO_MUTE,
12656 {0x12, 0x90a60130},
12657 {0x14, 0x90170110},
11580297 12658 {0x15, 0x0321101f}),
5af29028
KY
12659 SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
12660 {0x14, 0x01014010},
12661 {0x17, 0x90170150},
f2adbae0 12662 {0x19, 0x02a11060},
5af29028
KY
12663 {0x1b, 0x01813030},
12664 {0x21, 0x02211020}),
12665 SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
12666 {0x14, 0x01014010},
12667 {0x18, 0x01a19040},
12668 {0x1b, 0x01813030},
12669 {0x21, 0x02211020}),
12670 SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
12671 {0x14, 0x01014020},
12672 {0x17, 0x90170110},
12673 {0x18, 0x01a19050},
12674 {0x1b, 0x01813040},
12675 {0x21, 0x02211030}),
532895c5
HW
12676 {}
12677};
12678
1d045db9
TI
12679/*
12680 */
bc9f98a9
KY
12681static int patch_alc662(struct hda_codec *codec)
12682{
12683 struct alc_spec *spec;
3de95173 12684 int err;
bc9f98a9 12685
3de95173
TI
12686 err = alc_alloc_spec(codec, 0x0b);
12687 if (err < 0)
12688 return err;
bc9f98a9 12689
3de95173 12690 spec = codec->spec;
1f0f4b80 12691
225068ab
TI
12692 spec->shutup = alc_eapd_shutup;
12693
53c334ad
TI
12694 /* handle multiple HPs as is */
12695 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
12696
2c3bf9ab
TI
12697 alc_fix_pll_init(codec, 0x20, 0x04, 15);
12698
7639a06c 12699 switch (codec->core.vendor_id) {
f3f9185f
KY
12700 case 0x10ec0668:
12701 spec->init_hook = alc668_restore_default_value;
12702 break;
f3f9185f 12703 }
8663ff75 12704
c9af753f
TI
12705 alc_pre_init(codec);
12706
1727a771 12707 snd_hda_pick_fixup(codec, alc662_fixup_models,
8e5a0509 12708 alc662_fixup_tbl, alc662_fixups);
0fc1e447 12709 snd_hda_pick_pin_fixup(codec, alc662_pin_fixup_tbl, alc662_fixups, true);
1727a771 12710 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
8e5a0509
TI
12711
12712 alc_auto_parse_customize_define(codec);
12713
7504b6cd
TI
12714 if (has_cdefine_beep(codec))
12715 spec->gen.beep_nid = 0x01;
12716
1bb7e43e 12717 if ((alc_get_coef0(codec) & (1 << 14)) &&
5100cd07 12718 codec->bus->pci && codec->bus->pci->subsystem_vendor == 0x1025 &&
e16fb6d1 12719 spec->cdefine.platform_type == 1) {
6134b1a2
WY
12720 err = alc_codec_rename(codec, "ALC272X");
12721 if (err < 0)
e16fb6d1 12722 goto error;
20ca0c35 12723 }
274693f3 12724
b9c5106c
TI
12725 /* automatic parse from the BIOS config */
12726 err = alc662_parse_auto_config(codec);
e16fb6d1
TI
12727 if (err < 0)
12728 goto error;
bc9f98a9 12729
7504b6cd 12730 if (!spec->gen.no_analog && spec->gen.beep_nid) {
7639a06c 12731 switch (codec->core.vendor_id) {
da00c244 12732 case 0x10ec0662:
fea80fae 12733 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
da00c244
KY
12734 break;
12735 case 0x10ec0272:
12736 case 0x10ec0663:
12737 case 0x10ec0665:
9ad54547 12738 case 0x10ec0668:
fea80fae 12739 err = set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
da00c244
KY
12740 break;
12741 case 0x10ec0273:
fea80fae 12742 err = set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
da00c244
KY
12743 break;
12744 }
fea80fae
TI
12745 if (err < 0)
12746 goto error;
cec27c89 12747 }
2134ea4f 12748
1727a771 12749 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
589876e2 12750
bc9f98a9 12751 return 0;
801f49d3 12752
e16fb6d1
TI
12753 error:
12754 alc_free(codec);
12755 return err;
b478b998
KY
12756}
12757
d1eb57f4
KY
12758/*
12759 * ALC680 support
12760 */
d1eb57f4 12761
d1eb57f4
KY
12762static int alc680_parse_auto_config(struct hda_codec *codec)
12763{
3e6179b8 12764 return alc_parse_auto_config(codec, NULL, NULL);
d1eb57f4
KY
12765}
12766
d1eb57f4 12767/*
d1eb57f4 12768 */
d1eb57f4
KY
12769static int patch_alc680(struct hda_codec *codec)
12770{
d1eb57f4
KY
12771 int err;
12772
1f0f4b80 12773 /* ALC680 has no aa-loopback mixer */
3de95173
TI
12774 err = alc_alloc_spec(codec, 0);
12775 if (err < 0)
12776 return err;
1f0f4b80 12777
1ebec5f2
TI
12778 /* automatic parse from the BIOS config */
12779 err = alc680_parse_auto_config(codec);
12780 if (err < 0) {
12781 alc_free(codec);
12782 return err;
d1eb57f4
KY
12783 }
12784
d1eb57f4
KY
12785 return 0;
12786}
12787
1da177e4
LT
12788/*
12789 * patch entries
12790 */
b9a94a9c 12791static const struct hda_device_id snd_hda_id_realtek[] = {
0a6f0600 12792 HDA_CODEC_ENTRY(0x10ec0215, "ALC215", patch_alc269),
b9a94a9c 12793 HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269),
2a36c16e 12794 HDA_CODEC_ENTRY(0x10ec0222, "ALC222", patch_alc269),
4231430d 12795 HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269),
1948fc06 12796 HDA_CODEC_ENTRY(0x10ec0230, "ALC236", patch_alc269),
b9a94a9c
TI
12797 HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269),
12798 HDA_CODEC_ENTRY(0x10ec0233, "ALC233", patch_alc269),
dcd4f0db 12799 HDA_CODEC_ENTRY(0x10ec0234, "ALC234", patch_alc269),
b9a94a9c 12800 HDA_CODEC_ENTRY(0x10ec0235, "ALC233", patch_alc269),
736f20a7 12801 HDA_CODEC_ENTRY(0x10ec0236, "ALC236", patch_alc269),
7fbdcd83 12802 HDA_CODEC_ENTRY(0x10ec0245, "ALC245", patch_alc269),
b9a94a9c
TI
12803 HDA_CODEC_ENTRY(0x10ec0255, "ALC255", patch_alc269),
12804 HDA_CODEC_ENTRY(0x10ec0256, "ALC256", patch_alc269),
f429e7e4 12805 HDA_CODEC_ENTRY(0x10ec0257, "ALC257", patch_alc269),
b9a94a9c
TI
12806 HDA_CODEC_ENTRY(0x10ec0260, "ALC260", patch_alc260),
12807 HDA_CODEC_ENTRY(0x10ec0262, "ALC262", patch_alc262),
12808 HDA_CODEC_ENTRY(0x10ec0267, "ALC267", patch_alc268),
12809 HDA_CODEC_ENTRY(0x10ec0268, "ALC268", patch_alc268),
12810 HDA_CODEC_ENTRY(0x10ec0269, "ALC269", patch_alc269),
12811 HDA_CODEC_ENTRY(0x10ec0270, "ALC270", patch_alc269),
12812 HDA_CODEC_ENTRY(0x10ec0272, "ALC272", patch_alc662),
dcd4f0db 12813 HDA_CODEC_ENTRY(0x10ec0274, "ALC274", patch_alc269),
b9a94a9c
TI
12814 HDA_CODEC_ENTRY(0x10ec0275, "ALC275", patch_alc269),
12815 HDA_CODEC_ENTRY(0x10ec0276, "ALC276", patch_alc269),
12816 HDA_CODEC_ENTRY(0x10ec0280, "ALC280", patch_alc269),
12817 HDA_CODEC_ENTRY(0x10ec0282, "ALC282", patch_alc269),
12818 HDA_CODEC_ENTRY(0x10ec0283, "ALC283", patch_alc269),
12819 HDA_CODEC_ENTRY(0x10ec0284, "ALC284", patch_alc269),
0a6f0600 12820 HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269),
b9a94a9c 12821 HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269),
630e3612 12822 HDA_CODEC_ENTRY(0x10ec0287, "ALC287", patch_alc269),
b9a94a9c 12823 HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269),
0a6f0600 12824 HDA_CODEC_ENTRY(0x10ec0289, "ALC289", patch_alc269),
b9a94a9c
TI
12825 HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269),
12826 HDA_CODEC_ENTRY(0x10ec0292, "ALC292", patch_alc269),
12827 HDA_CODEC_ENTRY(0x10ec0293, "ALC293", patch_alc269),
dcd4f0db 12828 HDA_CODEC_ENTRY(0x10ec0294, "ALC294", patch_alc269),
7d727869 12829 HDA_CODEC_ENTRY(0x10ec0295, "ALC295", patch_alc269),
b9a94a9c 12830 HDA_CODEC_ENTRY(0x10ec0298, "ALC298", patch_alc269),
28f1f9b2 12831 HDA_CODEC_ENTRY(0x10ec0299, "ALC299", patch_alc269),
1078bef0 12832 HDA_CODEC_ENTRY(0x10ec0300, "ALC300", patch_alc269),
f0778871 12833 HDA_CODEC_ENTRY(0x10ec0623, "ALC623", patch_alc269),
b9a94a9c
TI
12834 HDA_CODEC_REV_ENTRY(0x10ec0861, 0x100340, "ALC660", patch_alc861),
12835 HDA_CODEC_ENTRY(0x10ec0660, "ALC660-VD", patch_alc861vd),
12836 HDA_CODEC_ENTRY(0x10ec0861, "ALC861", patch_alc861),
12837 HDA_CODEC_ENTRY(0x10ec0862, "ALC861-VD", patch_alc861vd),
12838 HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100002, "ALC662 rev2", patch_alc882),
12839 HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100101, "ALC662 rev1", patch_alc662),
12840 HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100300, "ALC662 rev3", patch_alc662),
12841 HDA_CODEC_ENTRY(0x10ec0663, "ALC663", patch_alc662),
12842 HDA_CODEC_ENTRY(0x10ec0665, "ALC665", patch_alc662),
12843 HDA_CODEC_ENTRY(0x10ec0667, "ALC667", patch_alc662),
12844 HDA_CODEC_ENTRY(0x10ec0668, "ALC668", patch_alc662),
12845 HDA_CODEC_ENTRY(0x10ec0670, "ALC670", patch_alc662),
12846 HDA_CODEC_ENTRY(0x10ec0671, "ALC671", patch_alc662),
12847 HDA_CODEC_ENTRY(0x10ec0680, "ALC680", patch_alc680),
6fbae35a
KY
12848 HDA_CODEC_ENTRY(0x10ec0700, "ALC700", patch_alc269),
12849 HDA_CODEC_ENTRY(0x10ec0701, "ALC701", patch_alc269),
12850 HDA_CODEC_ENTRY(0x10ec0703, "ALC703", patch_alc269),
83629532 12851 HDA_CODEC_ENTRY(0x10ec0711, "ALC711", patch_alc269),
78f4f7c2 12852 HDA_CODEC_ENTRY(0x10ec0867, "ALC891", patch_alc662),
b9a94a9c
TI
12853 HDA_CODEC_ENTRY(0x10ec0880, "ALC880", patch_alc880),
12854 HDA_CODEC_ENTRY(0x10ec0882, "ALC882", patch_alc882),
12855 HDA_CODEC_ENTRY(0x10ec0883, "ALC883", patch_alc882),
12856 HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100101, "ALC889A", patch_alc882),
12857 HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100103, "ALC889A", patch_alc882),
12858 HDA_CODEC_ENTRY(0x10ec0885, "ALC885", patch_alc882),
12859 HDA_CODEC_ENTRY(0x10ec0887, "ALC887", patch_alc882),
12860 HDA_CODEC_REV_ENTRY(0x10ec0888, 0x100101, "ALC1200", patch_alc882),
12861 HDA_CODEC_ENTRY(0x10ec0888, "ALC888", patch_alc882),
12862 HDA_CODEC_ENTRY(0x10ec0889, "ALC889", patch_alc882),
12863 HDA_CODEC_ENTRY(0x10ec0892, "ALC892", patch_alc662),
e5782a5d 12864 HDA_CODEC_ENTRY(0x10ec0897, "ALC897", patch_alc662),
b9a94a9c
TI
12865 HDA_CODEC_ENTRY(0x10ec0899, "ALC898", patch_alc882),
12866 HDA_CODEC_ENTRY(0x10ec0900, "ALC1150", patch_alc882),
6d9ffcff 12867 HDA_CODEC_ENTRY(0x10ec0b00, "ALCS1200A", patch_alc882),
65553b12 12868 HDA_CODEC_ENTRY(0x10ec1168, "ALC1220", patch_alc882),
a535ad57 12869 HDA_CODEC_ENTRY(0x10ec1220, "ALC1220", patch_alc882),
527f4643 12870 HDA_CODEC_ENTRY(0x19e58326, "HW8326", patch_alc269),
1da177e4
LT
12871 {} /* terminator */
12872};
b9a94a9c 12873MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_realtek);
1289e9e8
TI
12874
12875MODULE_LICENSE("GPL");
12876MODULE_DESCRIPTION("Realtek HD-audio codec");
fd895a74 12877MODULE_IMPORT_NS(SND_HDA_SCODEC_COMPONENT);
1289e9e8 12878
d8a766a1 12879static struct hda_codec_driver realtek_driver = {
b9a94a9c 12880 .id = snd_hda_id_realtek,
1289e9e8
TI
12881};
12882
d8a766a1 12883module_hda_codec_driver(realtek_driver);