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