]> git.ipfire.org Git - thirdparty/linux.git/blame - sound/pci/hda/patch_realtek.c
ALSA: hda - Apply AMD controller workaround for Raven platform
[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
3e0d611b
DH
5361static void alc269_fixup_limit_int_mic_boost(struct hda_codec *codec,
5362 const struct hda_fixup *fix,
5363 int action)
5364{
5365 struct alc_spec *spec = codec->spec;
5366 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5367 int i;
5368
5369 /* The mic boosts on level 2 and 3 are too noisy
5370 on the internal mic input.
5371 Therefore limit the boost to 0 or 1. */
5372
5373 if (action != HDA_FIXUP_ACT_PROBE)
5374 return;
5375
5376 for (i = 0; i < cfg->num_inputs; i++) {
5377 hda_nid_t nid = cfg->inputs[i].pin;
5378 unsigned int defcfg;
5379 if (cfg->inputs[i].type != AUTO_PIN_MIC)
5380 continue;
5381 defcfg = snd_hda_codec_get_pincfg(codec, nid);
5382 if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
5383 continue;
5384
5385 snd_hda_override_amp_caps(codec, nid, HDA_INPUT,
5386 (0x00 << AC_AMPCAP_OFFSET_SHIFT) |
5387 (0x01 << AC_AMPCAP_NUM_STEPS_SHIFT) |
5388 (0x2f << AC_AMPCAP_STEP_SIZE_SHIFT) |
5389 (0 << AC_AMPCAP_MUTE_SHIFT));
5390 }
5391}
5392
cd217a63 5393static void alc283_hp_automute_hook(struct hda_codec *codec,
1a4f69d5 5394 struct hda_jack_callback *jack)
cd217a63
KY
5395{
5396 struct alc_spec *spec = codec->spec;
5397 int vref;
5398
5399 msleep(200);
5400 snd_hda_gen_hp_automute(codec, jack);
5401
5402 vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
5403
5404 msleep(600);
5405 snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5406 vref);
5407}
5408
cd217a63
KY
5409static void alc283_fixup_chromebook(struct hda_codec *codec,
5410 const struct hda_fixup *fix, int action)
5411{
5412 struct alc_spec *spec = codec->spec;
cd217a63
KY
5413
5414 switch (action) {
5415 case HDA_FIXUP_ACT_PRE_PROBE:
0202e99c 5416 snd_hda_override_wcaps(codec, 0x03, 0);
d2e92709
TI
5417 /* Disable AA-loopback as it causes white noise */
5418 spec->gen.mixer_nid = 0;
38070219 5419 break;
0202e99c 5420 case HDA_FIXUP_ACT_INIT:
de9481cb
KY
5421 /* MIC2-VREF control */
5422 /* Set to manual mode */
98b24883 5423 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
0202e99c 5424 /* Enable Line1 input control by verb */
98b24883 5425 alc_update_coef_idx(codec, 0x1a, 0, 1 << 4);
0202e99c
KY
5426 break;
5427 }
5428}
5429
5430static void alc283_fixup_sense_combo_jack(struct hda_codec *codec,
5431 const struct hda_fixup *fix, int action)
5432{
5433 struct alc_spec *spec = codec->spec;
0202e99c
KY
5434
5435 switch (action) {
5436 case HDA_FIXUP_ACT_PRE_PROBE:
cd217a63 5437 spec->gen.hp_automute_hook = alc283_hp_automute_hook;
38070219
KY
5438 break;
5439 case HDA_FIXUP_ACT_INIT:
cd217a63
KY
5440 /* MIC2-VREF control */
5441 /* Set to manual mode */
98b24883 5442 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
cd217a63
KY
5443 break;
5444 }
5445}
5446
7bba2157
TI
5447/* mute tablet speaker pin (0x14) via dock plugging in addition */
5448static void asus_tx300_automute(struct hda_codec *codec)
5449{
5450 struct alc_spec *spec = codec->spec;
5451 snd_hda_gen_update_outputs(codec);
5452 if (snd_hda_jack_detect(codec, 0x1b))
5453 spec->gen.mute_bits |= (1ULL << 0x14);
5454}
5455
5456static void alc282_fixup_asus_tx300(struct hda_codec *codec,
5457 const struct hda_fixup *fix, int action)
5458{
5459 struct alc_spec *spec = codec->spec;
7bba2157
TI
5460 static const struct hda_pintbl dock_pins[] = {
5461 { 0x1b, 0x21114000 }, /* dock speaker pin */
5462 {}
5463 };
7bba2157
TI
5464
5465 switch (action) {
5466 case HDA_FIXUP_ACT_PRE_PROBE:
1c76aa5f 5467 spec->init_amp = ALC_INIT_DEFAULT;
ae065f1c
TI
5468 /* TX300 needs to set up GPIO2 for the speaker amp */
5469 alc_setup_gpio(codec, 0x04);
7bba2157
TI
5470 snd_hda_apply_pincfgs(codec, dock_pins);
5471 spec->gen.auto_mute_via_amp = 1;
5472 spec->gen.automute_hook = asus_tx300_automute;
5473 snd_hda_jack_detect_enable_callback(codec, 0x1b,
7bba2157
TI
5474 snd_hda_gen_hp_automute);
5475 break;
5579cd6f
TI
5476 case HDA_FIXUP_ACT_PROBE:
5477 spec->init_amp = ALC_INIT_DEFAULT;
5478 break;
7bba2157
TI
5479 case HDA_FIXUP_ACT_BUILD:
5480 /* this is a bit tricky; give more sane names for the main
5481 * (tablet) speaker and the dock speaker, respectively
5482 */
56798e6b
TI
5483 rename_ctl(codec, "Speaker Playback Switch",
5484 "Dock Speaker Playback Switch");
5485 rename_ctl(codec, "Bass Speaker Playback Switch",
5486 "Speaker Playback Switch");
7bba2157
TI
5487 break;
5488 }
5489}
5490
338cae56
DH
5491static void alc290_fixup_mono_speakers(struct hda_codec *codec,
5492 const struct hda_fixup *fix, int action)
5493{
0f4881dc
DH
5494 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5495 /* DAC node 0x03 is giving mono output. We therefore want to
5496 make sure 0x14 (front speaker) and 0x15 (headphones) use the
5497 stereo DAC, while leaving 0x17 (bass speaker) for node 0x03. */
5498 hda_nid_t conn1[2] = { 0x0c };
5499 snd_hda_override_conn_list(codec, 0x14, 1, conn1);
5500 snd_hda_override_conn_list(codec, 0x15, 1, conn1);
5501 }
338cae56
DH
5502}
5503
dd9aa335
HW
5504static void alc298_fixup_speaker_volume(struct hda_codec *codec,
5505 const struct hda_fixup *fix, int action)
5506{
5507 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5508 /* The speaker is routed to the Node 0x06 by a mistake, as a result
5509 we can't adjust the speaker's volume since this node does not has
5510 Amp-out capability. we change the speaker's route to:
5511 Node 0x02 (Audio Output) -> Node 0x0c (Audio Mixer) -> Node 0x17 (
5512 Pin Complex), since Node 0x02 has Amp-out caps, we can adjust
5513 speaker's volume now. */
5514
5515 hda_nid_t conn1[1] = { 0x0c };
5516 snd_hda_override_conn_list(codec, 0x17, 1, conn1);
5517 }
5518}
5519
e312a869
TI
5520/* disable DAC3 (0x06) selection on NID 0x17 as it has no volume amp control */
5521static void alc295_fixup_disable_dac3(struct hda_codec *codec,
5522 const struct hda_fixup *fix, int action)
5523{
5524 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5525 hda_nid_t conn[2] = { 0x02, 0x03 };
5526 snd_hda_override_conn_list(codec, 0x17, 2, conn);
5527 }
5528}
5529
98973f2f
KP
5530/* Hook to update amp GPIO4 for automute */
5531static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec,
5532 struct hda_jack_callback *jack)
5533{
5534 struct alc_spec *spec = codec->spec;
5535
5536 snd_hda_gen_hp_automute(codec, jack);
5537 /* mute_led_polarity is set to 0, so we pass inverted value here */
5538 alc_update_gpio_led(codec, 0x10, !spec->gen.hp_jack_present);
5539}
5540
5541/* Manage GPIOs for HP EliteBook Folio 9480m.
5542 *
5543 * GPIO4 is the headphone amplifier power control
5544 * GPIO3 is the audio output mute indicator LED
5545 */
5546
5547static void alc280_fixup_hp_9480m(struct hda_codec *codec,
5548 const struct hda_fixup *fix,
5549 int action)
5550{
5551 struct alc_spec *spec = codec->spec;
98973f2f 5552
01e4a275 5553 alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
98973f2f 5554 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
01e4a275
TI
5555 /* amp at GPIO4; toggled via alc280_hp_gpio4_automute_hook() */
5556 spec->gpio_mask |= 0x10;
5557 spec->gpio_dir |= 0x10;
98973f2f 5558 spec->gen.hp_automute_hook = alc280_hp_gpio4_automute_hook;
98973f2f
KP
5559 }
5560}
5561
ae065f1c
TI
5562static void alc275_fixup_gpio4_off(struct hda_codec *codec,
5563 const struct hda_fixup *fix,
5564 int action)
5565{
5566 struct alc_spec *spec = codec->spec;
5567
5568 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5569 spec->gpio_mask |= 0x04;
5570 spec->gpio_dir |= 0x04;
5571 /* set data bit low */
5572 }
5573}
5574
ca169cc2
KY
5575static void alc233_alc662_fixup_lenovo_dual_codecs(struct hda_codec *codec,
5576 const struct hda_fixup *fix,
5577 int action)
5578{
5579 alc_fixup_dual_codecs(codec, fix, action);
5580 switch (action) {
5581 case HDA_FIXUP_ACT_PRE_PROBE:
5582 /* override card longname to provide a unique UCM profile */
5583 strcpy(codec->card->longname, "HDAudio-Lenovo-DualCodecs");
5584 break;
5585 case HDA_FIXUP_ACT_BUILD:
5586 /* rename Capture controls depending on the codec */
5587 rename_ctl(codec, "Capture Volume",
5588 codec->addr == 0 ?
5589 "Rear-Panel Capture Volume" :
5590 "Front-Panel Capture Volume");
5591 rename_ctl(codec, "Capture Switch",
5592 codec->addr == 0 ?
5593 "Rear-Panel Capture Switch" :
5594 "Front-Panel Capture Switch");
5595 break;
5596 }
5597}
5598
92266651
KY
5599/* Forcibly assign NID 0x03 to HP/LO while NID 0x02 to SPK for EQ */
5600static void alc274_fixup_bind_dacs(struct hda_codec *codec,
5601 const struct hda_fixup *fix, int action)
5602{
5603 struct alc_spec *spec = codec->spec;
5604 static hda_nid_t preferred_pairs[] = {
5605 0x21, 0x03, 0x1b, 0x03, 0x16, 0x02,
5606 0
5607 };
5608
5609 if (action != HDA_FIXUP_ACT_PRE_PROBE)
5610 return;
5611
5612 spec->gen.preferred_dacs = preferred_pairs;
0700d3d1
KY
5613 spec->gen.auto_mute_via_amp = 1;
5614 codec->power_save_node = 0;
92266651
KY
5615}
5616
c4cfcf6f
HW
5617/* The DAC of NID 0x3 will introduce click/pop noise on headphones, so invalidate it */
5618static void alc285_fixup_invalidate_dacs(struct hda_codec *codec,
5619 const struct hda_fixup *fix, int action)
5620{
5621 if (action != HDA_FIXUP_ACT_PRE_PROBE)
5622 return;
5623
5624 snd_hda_override_wcaps(codec, 0x03, 0);
5625}
5626
e854747d
KY
5627static const struct hda_jack_keymap alc_headset_btn_keymap[] = {
5628 { SND_JACK_BTN_0, KEY_PLAYPAUSE },
5629 { SND_JACK_BTN_1, KEY_VOICECOMMAND },
5630 { SND_JACK_BTN_2, KEY_VOLUMEUP },
5631 { SND_JACK_BTN_3, KEY_VOLUMEDOWN },
5632 {}
5633};
5634
5635static void alc_headset_btn_callback(struct hda_codec *codec,
5636 struct hda_jack_callback *jack)
5637{
5638 int report = 0;
5639
5640 if (jack->unsol_res & (7 << 13))
5641 report |= SND_JACK_BTN_0;
5642
5643 if (jack->unsol_res & (1 << 16 | 3 << 8))
5644 report |= SND_JACK_BTN_1;
5645
5646 /* Volume up key */
5647 if (jack->unsol_res & (7 << 23))
5648 report |= SND_JACK_BTN_2;
5649
5650 /* Volume down key */
5651 if (jack->unsol_res & (7 << 10))
5652 report |= SND_JACK_BTN_3;
5653
5654 jack->jack->button_state = report;
5655}
5656
8983eb60 5657static void alc_fixup_headset_jack(struct hda_codec *codec,
e854747d
KY
5658 const struct hda_fixup *fix, int action)
5659{
5660
5661 switch (action) {
5662 case HDA_FIXUP_ACT_PRE_PROBE:
5663 snd_hda_jack_detect_enable_callback(codec, 0x55,
5664 alc_headset_btn_callback);
5665 snd_hda_jack_add_kctl(codec, 0x55, "Headset Jack", false,
5666 SND_JACK_HEADSET, alc_headset_btn_keymap);
5667 break;
5668 case HDA_FIXUP_ACT_INIT:
5669 switch (codec->core.vendor_id) {
5670 case 0x10ec0225:
5671 case 0x10ec0295:
5672 case 0x10ec0299:
5673 alc_write_coef_idx(codec, 0x48, 0xd011);
5674 alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
5675 alc_update_coef_idx(codec, 0x44, 0x007f << 8, 0x0045 << 8);
5676 break;
5677 case 0x10ec0236:
5678 case 0x10ec0256:
5679 alc_write_coef_idx(codec, 0x48, 0xd011);
5680 alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
5681 break;
5682 }
5683 break;
5684 }
5685}
5686
8983eb60
KY
5687static void alc295_fixup_chromebook(struct hda_codec *codec,
5688 const struct hda_fixup *fix, int action)
5689{
d3ba58bb
KY
5690 struct alc_spec *spec = codec->spec;
5691
8983eb60 5692 switch (action) {
d3ba58bb
KY
5693 case HDA_FIXUP_ACT_PRE_PROBE:
5694 spec->ultra_low_power = true;
5695 break;
8983eb60
KY
5696 case HDA_FIXUP_ACT_INIT:
5697 switch (codec->core.vendor_id) {
5698 case 0x10ec0295:
5699 alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15); /* Reset HP JD */
5700 alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15);
5701 break;
5702 case 0x10ec0236:
5703 alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15); /* Reset HP JD */
5704 alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15);
5705 break;
5706 }
5707 break;
5708 }
5709}
5710
d1dd4211
KY
5711static void alc_fixup_disable_mic_vref(struct hda_codec *codec,
5712 const struct hda_fixup *fix, int action)
5713{
5714 if (action == HDA_FIXUP_ACT_PRE_PROBE)
5715 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
5716}
5717
b317b032
TI
5718/* for hda_fixup_thinkpad_acpi() */
5719#include "thinkpad_helper.c"
b67ae3f1 5720
d5a6cabf
TI
5721static void alc_fixup_thinkpad_acpi(struct hda_codec *codec,
5722 const struct hda_fixup *fix, int action)
5723{
5724 alc_fixup_no_shutup(codec, fix, action); /* reduce click noise */
5725 hda_fixup_thinkpad_acpi(codec, fix, action);
5726}
5727
bbf8ff6b
TB
5728/* for alc295_fixup_hp_top_speakers */
5729#include "hp_x360_helper.c"
5730
1d045db9
TI
5731enum {
5732 ALC269_FIXUP_SONY_VAIO,
5733 ALC275_FIXUP_SONY_VAIO_GPIO2,
5734 ALC269_FIXUP_DELL_M101Z,
5735 ALC269_FIXUP_SKU_IGNORE,
5736 ALC269_FIXUP_ASUS_G73JW,
5737 ALC269_FIXUP_LENOVO_EAPD,
5738 ALC275_FIXUP_SONY_HWEQ,
e9bd7d5c 5739 ALC275_FIXUP_SONY_DISABLE_AAMIX,
1d045db9 5740 ALC271_FIXUP_DMIC,
017f2a10 5741 ALC269_FIXUP_PCM_44K,
adabb3ec 5742 ALC269_FIXUP_STEREO_DMIC,
7c478f03 5743 ALC269_FIXUP_HEADSET_MIC,
24519911
TI
5744 ALC269_FIXUP_QUANTA_MUTE,
5745 ALC269_FIXUP_LIFEBOOK,
2041d564 5746 ALC269_FIXUP_LIFEBOOK_EXTMIC,
cc7016ab 5747 ALC269_FIXUP_LIFEBOOK_HP_PIN,
4df3fd17 5748 ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT,
fdcc968a 5749 ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC,
a4297b5d
TI
5750 ALC269_FIXUP_AMIC,
5751 ALC269_FIXUP_DMIC,
5752 ALC269VB_FIXUP_AMIC,
5753 ALC269VB_FIXUP_DMIC,
08fb0d0e 5754 ALC269_FIXUP_HP_MUTE_LED,
d06ac143 5755 ALC269_FIXUP_HP_MUTE_LED_MIC1,
08fb0d0e 5756 ALC269_FIXUP_HP_MUTE_LED_MIC2,
7f783bd5 5757 ALC269_FIXUP_HP_MUTE_LED_MIC3,
9f5c6faf 5758 ALC269_FIXUP_HP_GPIO_LED,
9c5dc3bf
KY
5759 ALC269_FIXUP_HP_GPIO_MIC1_LED,
5760 ALC269_FIXUP_HP_LINE1_MIC1_LED,
693b613d 5761 ALC269_FIXUP_INV_DMIC,
108cc108 5762 ALC269_FIXUP_LENOVO_DOCK,
9b745ab8 5763 ALC269_FIXUP_NO_SHUTUP,
88cfcf86 5764 ALC286_FIXUP_SONY_MIC_NO_PRESENCE,
108cc108 5765 ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
73bdd597
DH
5766 ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
5767 ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
338cae56 5768 ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
fcc6c877 5769 ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
73bdd597
DH
5770 ALC269_FIXUP_HEADSET_MODE,
5771 ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
7819717b 5772 ALC269_FIXUP_ASPIRE_HEADSET_MIC,
d240d1dc
DH
5773 ALC269_FIXUP_ASUS_X101_FUNC,
5774 ALC269_FIXUP_ASUS_X101_VERB,
5775 ALC269_FIXUP_ASUS_X101,
08a978db
DR
5776 ALC271_FIXUP_AMIC_MIC2,
5777 ALC271_FIXUP_HP_GATE_MIC_JACK,
b1e8972e 5778 ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572,
42397004 5779 ALC269_FIXUP_ACER_AC700,
3e0d611b 5780 ALC269_FIXUP_LIMIT_INT_MIC_BOOST,
2cede303 5781 ALC269VB_FIXUP_ASUS_ZENBOOK,
23870831 5782 ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A,
8e35cd4a 5783 ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED,
02b504d9 5784 ALC269VB_FIXUP_ORDISSIMO_EVE2,
cd217a63 5785 ALC283_FIXUP_CHROME_BOOK,
0202e99c 5786 ALC283_FIXUP_SENSE_COMBO_JACK,
7bba2157 5787 ALC282_FIXUP_ASUS_TX300,
1bb3e062 5788 ALC283_FIXUP_INT_MIC,
338cae56 5789 ALC290_FIXUP_MONO_SPEAKERS,
0f4881dc
DH
5790 ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
5791 ALC290_FIXUP_SUBWOOFER,
5792 ALC290_FIXUP_SUBWOOFER_HSJACK,
b67ae3f1 5793 ALC269_FIXUP_THINKPAD_ACPI,
56f27013 5794 ALC269_FIXUP_DMIC_THINKPAD_ACPI,
5824ce8d 5795 ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
615966ad 5796 ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
9a22a8f5 5797 ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
31278997 5798 ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
9a22a8f5 5799 ALC255_FIXUP_HEADSET_MODE,
31278997 5800 ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,
a22aa26f 5801 ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
1c37c223 5802 ALC292_FIXUP_TPT440_DOCK,
9a811230 5803 ALC292_FIXUP_TPT440,
abaa2274 5804 ALC283_FIXUP_HEADSET_MIC,
b3802783 5805 ALC255_FIXUP_MIC_MUTE_LED,
1a22e775 5806 ALC282_FIXUP_ASPIRE_V5_PINS,
7a5255f1 5807 ALC280_FIXUP_HP_GPIO4,
eaa8e5ef 5808 ALC286_FIXUP_HP_GPIO_LED,
33f4acd3 5809 ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY,
b4b33f9d 5810 ALC280_FIXUP_HP_DOCK_PINS,
04d5466a 5811 ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED,
98973f2f 5812 ALC280_FIXUP_HP_9480M,
e1e62b98
KY
5813 ALC288_FIXUP_DELL_HEADSET_MODE,
5814 ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
831bfdf9
HW
5815 ALC288_FIXUP_DELL_XPS_13,
5816 ALC288_FIXUP_DISABLE_AAMIX,
8b99aba7
TI
5817 ALC292_FIXUP_DELL_E7X,
5818 ALC292_FIXUP_DISABLE_AAMIX,
c04017ea 5819 ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK,
54324221 5820 ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
977e6276 5821 ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
2f726aec 5822 ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
6ed1131f 5823 ALC275_FIXUP_DELL_XPS,
8c69729b 5824 ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE,
23adc192 5825 ALC293_FIXUP_LENOVO_SPK_NOISE,
3694cb29 5826 ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
3b43b71f 5827 ALC255_FIXUP_DELL_SPK_NOISE,
d1dd4211 5828 ALC225_FIXUP_DISABLE_MIC_VREF,
2ae95577 5829 ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
e312a869 5830 ALC295_FIXUP_DISABLE_DAC3,
f883982d 5831 ALC280_FIXUP_HP_HEADSET_MIC,
e549d190 5832 ALC221_FIXUP_HP_FRONT_MIC,
c636b95e 5833 ALC292_FIXUP_TPT460,
dd9aa335 5834 ALC298_FIXUP_SPK_VOLUME,
fd06c77e 5835 ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER,
823ff161 5836 ALC269_FIXUP_ATIV_BOOK_8,
9eb5d0e6 5837 ALC221_FIXUP_HP_MIC_NO_PRESENCE,
c1732ede
CC
5838 ALC256_FIXUP_ASUS_HEADSET_MODE,
5839 ALC256_FIXUP_ASUS_MIC,
eeed4cd1 5840 ALC256_FIXUP_ASUS_AIO_GPIO2,
216d7aeb
CC
5841 ALC233_FIXUP_ASUS_MIC_NO_PRESENCE,
5842 ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE,
ca169cc2 5843 ALC233_FIXUP_LENOVO_MULTI_CODECS,
ea5c7eba 5844 ALC233_FIXUP_ACER_HEADSET_MIC,
f33f79f3 5845 ALC294_FIXUP_LENOVO_MIC_LOCATION,
5f364135 5846 ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE,
b84e8436 5847 ALC700_FIXUP_INTEL_REFERENCE,
92266651
KY
5848 ALC274_FIXUP_DELL_BIND_DACS,
5849 ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
61fcf8ec 5850 ALC298_FIXUP_TPT470_DOCK,
ae104a21 5851 ALC255_FIXUP_DUMMY_LINEOUT_VERB,
f0ba9d69 5852 ALC255_FIXUP_DELL_HEADSET_MIC,
0fbf21c3 5853 ALC256_FIXUP_HUAWEI_MACH_WX9_PINS,
a2ef03fe 5854 ALC298_FIXUP_HUAWEI_MBX_STEREO,
bbf8ff6b 5855 ALC295_FIXUP_HP_X360,
8a328ac1 5856 ALC221_FIXUP_HP_HEADSET_MIC,
c4cfcf6f 5857 ALC285_FIXUP_LENOVO_HEADPHONE_NOISE,
e8ed64b0 5858 ALC295_FIXUP_HP_AUTO_MUTE,
33aaebd4 5859 ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
d8ae458e 5860 ALC294_FIXUP_ASUS_MIC,
4e051106
JHP
5861 ALC294_FIXUP_ASUS_HEADSET_MIC,
5862 ALC294_FIXUP_ASUS_SPK,
89e3a568 5863 ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
c8c6ee61 5864 ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
cbc05fd6 5865 ALC255_FIXUP_ACER_HEADSET_MIC,
10f5b1b8 5866 ALC295_FIXUP_CHROME_BOOK,
8983eb60 5867 ALC225_FIXUP_HEADSET_JACK,
136824ef
KY
5868 ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE,
5869 ALC225_FIXUP_WYSE_AUTO_MUTE,
5870 ALC225_FIXUP_WYSE_DISABLE_MIC_VREF,
667a8f73 5871 ALC286_FIXUP_ACER_AIO_HEADSET_MIC,
e1037354 5872 ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
e2a829b3 5873 ALC299_FIXUP_PREDATOR_SPK,
60083f9e 5874 ALC294_FIXUP_ASUS_INTSPK_HEADSET_MIC,
f1d4e28b
KY
5875};
5876
1727a771 5877static const struct hda_fixup alc269_fixups[] = {
1d045db9 5878 [ALC269_FIXUP_SONY_VAIO] = {
fd108215
TI
5879 .type = HDA_FIXUP_PINCTLS,
5880 .v.pins = (const struct hda_pintbl[]) {
5881 {0x19, PIN_VREFGRD},
1d045db9
TI
5882 {}
5883 }
f1d4e28b 5884 },
1d045db9 5885 [ALC275_FIXUP_SONY_VAIO_GPIO2] = {
ae065f1c
TI
5886 .type = HDA_FIXUP_FUNC,
5887 .v.func = alc275_fixup_gpio4_off,
1d045db9
TI
5888 .chained = true,
5889 .chain_id = ALC269_FIXUP_SONY_VAIO
5890 },
5891 [ALC269_FIXUP_DELL_M101Z] = {
1727a771 5892 .type = HDA_FIXUP_VERBS,
1d045db9
TI
5893 .v.verbs = (const struct hda_verb[]) {
5894 /* Enables internal speaker */
5895 {0x20, AC_VERB_SET_COEF_INDEX, 13},
5896 {0x20, AC_VERB_SET_PROC_COEF, 0x4040},
5897 {}
5898 }
5899 },
5900 [ALC269_FIXUP_SKU_IGNORE] = {
1727a771 5901 .type = HDA_FIXUP_FUNC,
23d30f28 5902 .v.func = alc_fixup_sku_ignore,
1d045db9
TI
5903 },
5904 [ALC269_FIXUP_ASUS_G73JW] = {
1727a771
TI
5905 .type = HDA_FIXUP_PINS,
5906 .v.pins = (const struct hda_pintbl[]) {
1d045db9
TI
5907 { 0x17, 0x99130111 }, /* subwoofer */
5908 { }
5909 }
5910 },
5911 [ALC269_FIXUP_LENOVO_EAPD] = {
1727a771 5912 .type = HDA_FIXUP_VERBS,
1d045db9
TI
5913 .v.verbs = (const struct hda_verb[]) {
5914 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
5915 {}
5916 }
5917 },
5918 [ALC275_FIXUP_SONY_HWEQ] = {
1727a771 5919 .type = HDA_FIXUP_FUNC,
1d045db9
TI
5920 .v.func = alc269_fixup_hweq,
5921 .chained = true,
5922 .chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
5923 },
e9bd7d5c
TI
5924 [ALC275_FIXUP_SONY_DISABLE_AAMIX] = {
5925 .type = HDA_FIXUP_FUNC,
5926 .v.func = alc_fixup_disable_aamix,
5927 .chained = true,
5928 .chain_id = ALC269_FIXUP_SONY_VAIO
5929 },
1d045db9 5930 [ALC271_FIXUP_DMIC] = {
1727a771 5931 .type = HDA_FIXUP_FUNC,
1d045db9 5932 .v.func = alc271_fixup_dmic,
f1d4e28b 5933 },
017f2a10 5934 [ALC269_FIXUP_PCM_44K] = {
1727a771 5935 .type = HDA_FIXUP_FUNC,
017f2a10 5936 .v.func = alc269_fixup_pcm_44k,
012e7eb1
DH
5937 .chained = true,
5938 .chain_id = ALC269_FIXUP_QUANTA_MUTE
017f2a10 5939 },
adabb3ec 5940 [ALC269_FIXUP_STEREO_DMIC] = {
1727a771 5941 .type = HDA_FIXUP_FUNC,
adabb3ec
TI
5942 .v.func = alc269_fixup_stereo_dmic,
5943 },
7c478f03
DH
5944 [ALC269_FIXUP_HEADSET_MIC] = {
5945 .type = HDA_FIXUP_FUNC,
5946 .v.func = alc269_fixup_headset_mic,
5947 },
24519911 5948 [ALC269_FIXUP_QUANTA_MUTE] = {
1727a771 5949 .type = HDA_FIXUP_FUNC,
24519911
TI
5950 .v.func = alc269_fixup_quanta_mute,
5951 },
5952 [ALC269_FIXUP_LIFEBOOK] = {
1727a771
TI
5953 .type = HDA_FIXUP_PINS,
5954 .v.pins = (const struct hda_pintbl[]) {
24519911
TI
5955 { 0x1a, 0x2101103f }, /* dock line-out */
5956 { 0x1b, 0x23a11040 }, /* dock mic-in */
5957 { }
5958 },
5959 .chained = true,
5960 .chain_id = ALC269_FIXUP_QUANTA_MUTE
5961 },
2041d564
DH
5962 [ALC269_FIXUP_LIFEBOOK_EXTMIC] = {
5963 .type = HDA_FIXUP_PINS,
5964 .v.pins = (const struct hda_pintbl[]) {
5965 { 0x19, 0x01a1903c }, /* headset mic, with jack detect */
5966 { }
5967 },
5968 },
cc7016ab
TI
5969 [ALC269_FIXUP_LIFEBOOK_HP_PIN] = {
5970 .type = HDA_FIXUP_PINS,
5971 .v.pins = (const struct hda_pintbl[]) {
5972 { 0x21, 0x0221102f }, /* HP out */
5973 { }
5974 },
5975 },
4df3fd17
TI
5976 [ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT] = {
5977 .type = HDA_FIXUP_FUNC,
5978 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
5979 },
fdcc968a
JMG
5980 [ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC] = {
5981 .type = HDA_FIXUP_FUNC,
5982 .v.func = alc269_fixup_pincfg_U7x7_headset_mic,
5983 },
a4297b5d 5984 [ALC269_FIXUP_AMIC] = {
1727a771
TI
5985 .type = HDA_FIXUP_PINS,
5986 .v.pins = (const struct hda_pintbl[]) {
a4297b5d
TI
5987 { 0x14, 0x99130110 }, /* speaker */
5988 { 0x15, 0x0121401f }, /* HP out */
5989 { 0x18, 0x01a19c20 }, /* mic */
5990 { 0x19, 0x99a3092f }, /* int-mic */
5991 { }
5992 },
5993 },
5994 [ALC269_FIXUP_DMIC] = {
1727a771
TI
5995 .type = HDA_FIXUP_PINS,
5996 .v.pins = (const struct hda_pintbl[]) {
a4297b5d
TI
5997 { 0x12, 0x99a3092f }, /* int-mic */
5998 { 0x14, 0x99130110 }, /* speaker */
5999 { 0x15, 0x0121401f }, /* HP out */
6000 { 0x18, 0x01a19c20 }, /* mic */
6001 { }
6002 },
6003 },
6004 [ALC269VB_FIXUP_AMIC] = {
1727a771
TI
6005 .type = HDA_FIXUP_PINS,
6006 .v.pins = (const struct hda_pintbl[]) {
a4297b5d
TI
6007 { 0x14, 0x99130110 }, /* speaker */
6008 { 0x18, 0x01a19c20 }, /* mic */
6009 { 0x19, 0x99a3092f }, /* int-mic */
6010 { 0x21, 0x0121401f }, /* HP out */
6011 { }
6012 },
6013 },
2267ea97 6014 [ALC269VB_FIXUP_DMIC] = {
1727a771
TI
6015 .type = HDA_FIXUP_PINS,
6016 .v.pins = (const struct hda_pintbl[]) {
a4297b5d
TI
6017 { 0x12, 0x99a3092f }, /* int-mic */
6018 { 0x14, 0x99130110 }, /* speaker */
6019 { 0x18, 0x01a19c20 }, /* mic */
6020 { 0x21, 0x0121401f }, /* HP out */
6021 { }
6022 },
6023 },
08fb0d0e 6024 [ALC269_FIXUP_HP_MUTE_LED] = {
1727a771 6025 .type = HDA_FIXUP_FUNC,
08fb0d0e 6026 .v.func = alc269_fixup_hp_mute_led,
6d3cd5d4 6027 },
d06ac143
DH
6028 [ALC269_FIXUP_HP_MUTE_LED_MIC1] = {
6029 .type = HDA_FIXUP_FUNC,
6030 .v.func = alc269_fixup_hp_mute_led_mic1,
6031 },
08fb0d0e 6032 [ALC269_FIXUP_HP_MUTE_LED_MIC2] = {
1727a771 6033 .type = HDA_FIXUP_FUNC,
08fb0d0e 6034 .v.func = alc269_fixup_hp_mute_led_mic2,
420b0feb 6035 },
7f783bd5
TB
6036 [ALC269_FIXUP_HP_MUTE_LED_MIC3] = {
6037 .type = HDA_FIXUP_FUNC,
6038 .v.func = alc269_fixup_hp_mute_led_mic3,
e8ed64b0
GKK
6039 .chained = true,
6040 .chain_id = ALC295_FIXUP_HP_AUTO_MUTE
7f783bd5 6041 },
9f5c6faf
TI
6042 [ALC269_FIXUP_HP_GPIO_LED] = {
6043 .type = HDA_FIXUP_FUNC,
6044 .v.func = alc269_fixup_hp_gpio_led,
6045 },
9c5dc3bf
KY
6046 [ALC269_FIXUP_HP_GPIO_MIC1_LED] = {
6047 .type = HDA_FIXUP_FUNC,
6048 .v.func = alc269_fixup_hp_gpio_mic1_led,
6049 },
6050 [ALC269_FIXUP_HP_LINE1_MIC1_LED] = {
6051 .type = HDA_FIXUP_FUNC,
6052 .v.func = alc269_fixup_hp_line1_mic1_led,
6053 },
693b613d 6054 [ALC269_FIXUP_INV_DMIC] = {
1727a771 6055 .type = HDA_FIXUP_FUNC,
9d36a7dc 6056 .v.func = alc_fixup_inv_dmic,
693b613d 6057 },
9b745ab8
TI
6058 [ALC269_FIXUP_NO_SHUTUP] = {
6059 .type = HDA_FIXUP_FUNC,
6060 .v.func = alc_fixup_no_shutup,
6061 },
108cc108 6062 [ALC269_FIXUP_LENOVO_DOCK] = {
1727a771
TI
6063 .type = HDA_FIXUP_PINS,
6064 .v.pins = (const struct hda_pintbl[]) {
108cc108
DH
6065 { 0x19, 0x23a11040 }, /* dock mic */
6066 { 0x1b, 0x2121103f }, /* dock headphone */
6067 { }
6068 },
6069 .chained = true,
6070 .chain_id = ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT
6071 },
6072 [ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT] = {
1727a771 6073 .type = HDA_FIXUP_FUNC,
108cc108 6074 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
52129000
DH
6075 .chained = true,
6076 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
108cc108 6077 },
73bdd597
DH
6078 [ALC269_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6079 .type = HDA_FIXUP_PINS,
6080 .v.pins = (const struct hda_pintbl[]) {
6081 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6082 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6083 { }
6084 },
6085 .chained = true,
6086 .chain_id = ALC269_FIXUP_HEADSET_MODE
6087 },
6088 [ALC269_FIXUP_DELL2_MIC_NO_PRESENCE] = {
6089 .type = HDA_FIXUP_PINS,
6090 .v.pins = (const struct hda_pintbl[]) {
6091 { 0x16, 0x21014020 }, /* dock line out */
6092 { 0x19, 0x21a19030 }, /* dock mic */
6093 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6094 { }
6095 },
6096 .chained = true,
6097 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
6098 },
338cae56
DH
6099 [ALC269_FIXUP_DELL3_MIC_NO_PRESENCE] = {
6100 .type = HDA_FIXUP_PINS,
6101 .v.pins = (const struct hda_pintbl[]) {
6102 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6103 { }
6104 },
6105 .chained = true,
6106 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
6107 },
fcc6c877
KY
6108 [ALC269_FIXUP_DELL4_MIC_NO_PRESENCE] = {
6109 .type = HDA_FIXUP_PINS,
6110 .v.pins = (const struct hda_pintbl[]) {
6111 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6112 { 0x1b, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6113 { }
6114 },
6115 .chained = true,
6116 .chain_id = ALC269_FIXUP_HEADSET_MODE
6117 },
73bdd597
DH
6118 [ALC269_FIXUP_HEADSET_MODE] = {
6119 .type = HDA_FIXUP_FUNC,
6120 .v.func = alc_fixup_headset_mode,
6676f308 6121 .chained = true,
b3802783 6122 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
73bdd597
DH
6123 },
6124 [ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
6125 .type = HDA_FIXUP_FUNC,
6126 .v.func = alc_fixup_headset_mode_no_hp_mic,
6127 },
7819717b
TI
6128 [ALC269_FIXUP_ASPIRE_HEADSET_MIC] = {
6129 .type = HDA_FIXUP_PINS,
6130 .v.pins = (const struct hda_pintbl[]) {
6131 { 0x19, 0x01a1913c }, /* headset mic w/o jack detect */
6132 { }
6133 },
6134 .chained = true,
6135 .chain_id = ALC269_FIXUP_HEADSET_MODE,
6136 },
88cfcf86
DH
6137 [ALC286_FIXUP_SONY_MIC_NO_PRESENCE] = {
6138 .type = HDA_FIXUP_PINS,
6139 .v.pins = (const struct hda_pintbl[]) {
6140 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6141 { }
6142 },
fbc78ad6
DH
6143 .chained = true,
6144 .chain_id = ALC269_FIXUP_HEADSET_MIC
88cfcf86 6145 },
0fbf21c3 6146 [ALC256_FIXUP_HUAWEI_MACH_WX9_PINS] = {
8ac51bbc
AB
6147 .type = HDA_FIXUP_PINS,
6148 .v.pins = (const struct hda_pintbl[]) {
6149 {0x12, 0x90a60130},
6150 {0x13, 0x40000000},
6151 {0x14, 0x90170110},
6152 {0x18, 0x411111f0},
6153 {0x19, 0x04a11040},
6154 {0x1a, 0x411111f0},
6155 {0x1b, 0x90170112},
6156 {0x1d, 0x40759a05},
6157 {0x1e, 0x411111f0},
6158 {0x21, 0x04211020},
6159 { }
6160 },
e2744fd7
AB
6161 .chained = true,
6162 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
8ac51bbc 6163 },
a2ef03fe
TE
6164 [ALC298_FIXUP_HUAWEI_MBX_STEREO] = {
6165 .type = HDA_FIXUP_FUNC,
6166 .v.func = alc298_fixup_huawei_mbx_stereo,
6167 .chained = true,
6168 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
6169 },
d240d1dc
DH
6170 [ALC269_FIXUP_ASUS_X101_FUNC] = {
6171 .type = HDA_FIXUP_FUNC,
6172 .v.func = alc269_fixup_x101_headset_mic,
6173 },
6174 [ALC269_FIXUP_ASUS_X101_VERB] = {
6175 .type = HDA_FIXUP_VERBS,
6176 .v.verbs = (const struct hda_verb[]) {
6177 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6178 {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
6179 {0x20, AC_VERB_SET_PROC_COEF, 0x0310},
6180 { }
6181 },
6182 .chained = true,
6183 .chain_id = ALC269_FIXUP_ASUS_X101_FUNC
6184 },
6185 [ALC269_FIXUP_ASUS_X101] = {
6186 .type = HDA_FIXUP_PINS,
6187 .v.pins = (const struct hda_pintbl[]) {
6188 { 0x18, 0x04a1182c }, /* Headset mic */
6189 { }
6190 },
6191 .chained = true,
6192 .chain_id = ALC269_FIXUP_ASUS_X101_VERB
6193 },
08a978db 6194 [ALC271_FIXUP_AMIC_MIC2] = {
1727a771
TI
6195 .type = HDA_FIXUP_PINS,
6196 .v.pins = (const struct hda_pintbl[]) {
08a978db
DR
6197 { 0x14, 0x99130110 }, /* speaker */
6198 { 0x19, 0x01a19c20 }, /* mic */
6199 { 0x1b, 0x99a7012f }, /* int-mic */
6200 { 0x21, 0x0121401f }, /* HP out */
6201 { }
6202 },
6203 },
6204 [ALC271_FIXUP_HP_GATE_MIC_JACK] = {
1727a771 6205 .type = HDA_FIXUP_FUNC,
08a978db
DR
6206 .v.func = alc271_hp_gate_mic_jack,
6207 .chained = true,
6208 .chain_id = ALC271_FIXUP_AMIC_MIC2,
6209 },
b1e8972e
OR
6210 [ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572] = {
6211 .type = HDA_FIXUP_FUNC,
6212 .v.func = alc269_fixup_limit_int_mic_boost,
6213 .chained = true,
6214 .chain_id = ALC271_FIXUP_HP_GATE_MIC_JACK,
6215 },
42397004
DR
6216 [ALC269_FIXUP_ACER_AC700] = {
6217 .type = HDA_FIXUP_PINS,
6218 .v.pins = (const struct hda_pintbl[]) {
6219 { 0x12, 0x99a3092f }, /* int-mic */
6220 { 0x14, 0x99130110 }, /* speaker */
6221 { 0x18, 0x03a11c20 }, /* mic */
6222 { 0x1e, 0x0346101e }, /* SPDIF1 */
6223 { 0x21, 0x0321101f }, /* HP out */
6224 { }
6225 },
6226 .chained = true,
6227 .chain_id = ALC271_FIXUP_DMIC,
6228 },
3e0d611b
DH
6229 [ALC269_FIXUP_LIMIT_INT_MIC_BOOST] = {
6230 .type = HDA_FIXUP_FUNC,
6231 .v.func = alc269_fixup_limit_int_mic_boost,
2793769f
DH
6232 .chained = true,
6233 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
3e0d611b 6234 },
2cede303
OR
6235 [ALC269VB_FIXUP_ASUS_ZENBOOK] = {
6236 .type = HDA_FIXUP_FUNC,
6237 .v.func = alc269_fixup_limit_int_mic_boost,
6238 .chained = true,
6239 .chain_id = ALC269VB_FIXUP_DMIC,
6240 },
23870831
TI
6241 [ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A] = {
6242 .type = HDA_FIXUP_VERBS,
6243 .v.verbs = (const struct hda_verb[]) {
6244 /* class-D output amp +5dB */
6245 { 0x20, AC_VERB_SET_COEF_INDEX, 0x12 },
6246 { 0x20, AC_VERB_SET_PROC_COEF, 0x2800 },
6247 {}
6248 },
6249 .chained = true,
6250 .chain_id = ALC269VB_FIXUP_ASUS_ZENBOOK,
6251 },
8e35cd4a
DH
6252 [ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED] = {
6253 .type = HDA_FIXUP_FUNC,
6254 .v.func = alc269_fixup_limit_int_mic_boost,
6255 .chained = true,
6256 .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC1,
6257 },
02b504d9
AA
6258 [ALC269VB_FIXUP_ORDISSIMO_EVE2] = {
6259 .type = HDA_FIXUP_PINS,
6260 .v.pins = (const struct hda_pintbl[]) {
6261 { 0x12, 0x99a3092f }, /* int-mic */
6262 { 0x18, 0x03a11d20 }, /* mic */
6263 { 0x19, 0x411111f0 }, /* Unused bogus pin */
6264 { }
6265 },
6266 },
cd217a63
KY
6267 [ALC283_FIXUP_CHROME_BOOK] = {
6268 .type = HDA_FIXUP_FUNC,
6269 .v.func = alc283_fixup_chromebook,
6270 },
0202e99c
KY
6271 [ALC283_FIXUP_SENSE_COMBO_JACK] = {
6272 .type = HDA_FIXUP_FUNC,
6273 .v.func = alc283_fixup_sense_combo_jack,
6274 .chained = true,
6275 .chain_id = ALC283_FIXUP_CHROME_BOOK,
6276 },
7bba2157
TI
6277 [ALC282_FIXUP_ASUS_TX300] = {
6278 .type = HDA_FIXUP_FUNC,
6279 .v.func = alc282_fixup_asus_tx300,
6280 },
1bb3e062
KY
6281 [ALC283_FIXUP_INT_MIC] = {
6282 .type = HDA_FIXUP_VERBS,
6283 .v.verbs = (const struct hda_verb[]) {
6284 {0x20, AC_VERB_SET_COEF_INDEX, 0x1a},
6285 {0x20, AC_VERB_SET_PROC_COEF, 0x0011},
6286 { }
6287 },
6288 .chained = true,
6289 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
6290 },
0f4881dc
DH
6291 [ALC290_FIXUP_SUBWOOFER_HSJACK] = {
6292 .type = HDA_FIXUP_PINS,
6293 .v.pins = (const struct hda_pintbl[]) {
6294 { 0x17, 0x90170112 }, /* subwoofer */
6295 { }
6296 },
6297 .chained = true,
6298 .chain_id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
6299 },
6300 [ALC290_FIXUP_SUBWOOFER] = {
6301 .type = HDA_FIXUP_PINS,
6302 .v.pins = (const struct hda_pintbl[]) {
6303 { 0x17, 0x90170112 }, /* subwoofer */
6304 { }
6305 },
6306 .chained = true,
6307 .chain_id = ALC290_FIXUP_MONO_SPEAKERS,
6308 },
338cae56
DH
6309 [ALC290_FIXUP_MONO_SPEAKERS] = {
6310 .type = HDA_FIXUP_FUNC,
6311 .v.func = alc290_fixup_mono_speakers,
0f4881dc
DH
6312 },
6313 [ALC290_FIXUP_MONO_SPEAKERS_HSJACK] = {
6314 .type = HDA_FIXUP_FUNC,
6315 .v.func = alc290_fixup_mono_speakers,
338cae56
DH
6316 .chained = true,
6317 .chain_id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
6318 },
b67ae3f1
DH
6319 [ALC269_FIXUP_THINKPAD_ACPI] = {
6320 .type = HDA_FIXUP_FUNC,
d5a6cabf 6321 .v.func = alc_fixup_thinkpad_acpi,
09da111a
TI
6322 .chained = true,
6323 .chain_id = ALC269_FIXUP_SKU_IGNORE,
b67ae3f1 6324 },
56f27013
DH
6325 [ALC269_FIXUP_DMIC_THINKPAD_ACPI] = {
6326 .type = HDA_FIXUP_FUNC,
6327 .v.func = alc_fixup_inv_dmic,
6328 .chained = true,
6329 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
6330 },
5824ce8d 6331 [ALC255_FIXUP_ACER_MIC_NO_PRESENCE] = {
17d30460
HW
6332 .type = HDA_FIXUP_PINS,
6333 .v.pins = (const struct hda_pintbl[]) {
6334 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6335 { }
5824ce8d
CC
6336 },
6337 .chained = true,
17d30460 6338 .chain_id = ALC255_FIXUP_HEADSET_MODE
5824ce8d 6339 },
615966ad
CC
6340 [ALC255_FIXUP_ASUS_MIC_NO_PRESENCE] = {
6341 .type = HDA_FIXUP_PINS,
6342 .v.pins = (const struct hda_pintbl[]) {
6343 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6344 { }
6345 },
6346 .chained = true,
6347 .chain_id = ALC255_FIXUP_HEADSET_MODE
6348 },
9a22a8f5
KY
6349 [ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6350 .type = HDA_FIXUP_PINS,
6351 .v.pins = (const struct hda_pintbl[]) {
6352 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6353 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6354 { }
6355 },
6356 .chained = true,
6357 .chain_id = ALC255_FIXUP_HEADSET_MODE
6358 },
31278997
KY
6359 [ALC255_FIXUP_DELL2_MIC_NO_PRESENCE] = {
6360 .type = HDA_FIXUP_PINS,
6361 .v.pins = (const struct hda_pintbl[]) {
6362 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6363 { }
6364 },
6365 .chained = true,
6366 .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
6367 },
9a22a8f5
KY
6368 [ALC255_FIXUP_HEADSET_MODE] = {
6369 .type = HDA_FIXUP_FUNC,
6370 .v.func = alc_fixup_headset_mode_alc255,
4a83d42a 6371 .chained = true,
b3802783 6372 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
9a22a8f5 6373 },
31278997
KY
6374 [ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
6375 .type = HDA_FIXUP_FUNC,
6376 .v.func = alc_fixup_headset_mode_alc255_no_hp_mic,
6377 },
a22aa26f
KY
6378 [ALC293_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6379 .type = HDA_FIXUP_PINS,
6380 .v.pins = (const struct hda_pintbl[]) {
6381 { 0x18, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6382 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6383 { }
6384 },
6385 .chained = true,
6386 .chain_id = ALC269_FIXUP_HEADSET_MODE
6387 },
1c37c223 6388 [ALC292_FIXUP_TPT440_DOCK] = {
ec56af67 6389 .type = HDA_FIXUP_FUNC,
7f57d803 6390 .v.func = alc_fixup_tpt440_dock,
1c37c223
TI
6391 .chained = true,
6392 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
6393 },
9a811230
TI
6394 [ALC292_FIXUP_TPT440] = {
6395 .type = HDA_FIXUP_FUNC,
157f0b7f 6396 .v.func = alc_fixup_disable_aamix,
9a811230
TI
6397 .chained = true,
6398 .chain_id = ALC292_FIXUP_TPT440_DOCK,
6399 },
abaa2274 6400 [ALC283_FIXUP_HEADSET_MIC] = {
9dc12862
DD
6401 .type = HDA_FIXUP_PINS,
6402 .v.pins = (const struct hda_pintbl[]) {
6403 { 0x19, 0x04a110f0 },
6404 { },
6405 },
6406 },
b3802783 6407 [ALC255_FIXUP_MIC_MUTE_LED] = {
00ef9940 6408 .type = HDA_FIXUP_FUNC,
b3802783 6409 .v.func = snd_hda_gen_fixup_micmute_led,
00ef9940 6410 },
1a22e775
TI
6411 [ALC282_FIXUP_ASPIRE_V5_PINS] = {
6412 .type = HDA_FIXUP_PINS,
6413 .v.pins = (const struct hda_pintbl[]) {
6414 { 0x12, 0x90a60130 },
6415 { 0x14, 0x90170110 },
6416 { 0x17, 0x40000008 },
6417 { 0x18, 0x411111f0 },
0420694d 6418 { 0x19, 0x01a1913c },
1a22e775
TI
6419 { 0x1a, 0x411111f0 },
6420 { 0x1b, 0x411111f0 },
6421 { 0x1d, 0x40f89b2d },
6422 { 0x1e, 0x411111f0 },
6423 { 0x21, 0x0321101f },
6424 { },
6425 },
6426 },
7a5255f1
DH
6427 [ALC280_FIXUP_HP_GPIO4] = {
6428 .type = HDA_FIXUP_FUNC,
6429 .v.func = alc280_fixup_hp_gpio4,
6430 },
eaa8e5ef
KY
6431 [ALC286_FIXUP_HP_GPIO_LED] = {
6432 .type = HDA_FIXUP_FUNC,
6433 .v.func = alc286_fixup_hp_gpio_led,
6434 },
33f4acd3
DH
6435 [ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY] = {
6436 .type = HDA_FIXUP_FUNC,
6437 .v.func = alc280_fixup_hp_gpio2_mic_hotkey,
6438 },
b4b33f9d
TC
6439 [ALC280_FIXUP_HP_DOCK_PINS] = {
6440 .type = HDA_FIXUP_PINS,
6441 .v.pins = (const struct hda_pintbl[]) {
6442 { 0x1b, 0x21011020 }, /* line-out */
6443 { 0x1a, 0x01a1903c }, /* headset mic */
6444 { 0x18, 0x2181103f }, /* line-in */
6445 { },
6446 },
6447 .chained = true,
6448 .chain_id = ALC280_FIXUP_HP_GPIO4
6449 },
04d5466a
JK
6450 [ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED] = {
6451 .type = HDA_FIXUP_PINS,
6452 .v.pins = (const struct hda_pintbl[]) {
6453 { 0x1b, 0x21011020 }, /* line-out */
6454 { 0x18, 0x2181103f }, /* line-in */
6455 { },
6456 },
6457 .chained = true,
6458 .chain_id = ALC269_FIXUP_HP_GPIO_MIC1_LED
6459 },
98973f2f
KP
6460 [ALC280_FIXUP_HP_9480M] = {
6461 .type = HDA_FIXUP_FUNC,
6462 .v.func = alc280_fixup_hp_9480m,
6463 },
e1e62b98
KY
6464 [ALC288_FIXUP_DELL_HEADSET_MODE] = {
6465 .type = HDA_FIXUP_FUNC,
6466 .v.func = alc_fixup_headset_mode_dell_alc288,
6467 .chained = true,
b3802783 6468 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
e1e62b98
KY
6469 },
6470 [ALC288_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6471 .type = HDA_FIXUP_PINS,
6472 .v.pins = (const struct hda_pintbl[]) {
6473 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6474 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6475 { }
6476 },
6477 .chained = true,
6478 .chain_id = ALC288_FIXUP_DELL_HEADSET_MODE
6479 },
831bfdf9
HW
6480 [ALC288_FIXUP_DISABLE_AAMIX] = {
6481 .type = HDA_FIXUP_FUNC,
6482 .v.func = alc_fixup_disable_aamix,
6483 .chained = true,
d44a6864 6484 .chain_id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE
831bfdf9
HW
6485 },
6486 [ALC288_FIXUP_DELL_XPS_13] = {
6487 .type = HDA_FIXUP_FUNC,
6488 .v.func = alc_fixup_dell_xps13,
6489 .chained = true,
6490 .chain_id = ALC288_FIXUP_DISABLE_AAMIX
6491 },
8b99aba7
TI
6492 [ALC292_FIXUP_DISABLE_AAMIX] = {
6493 .type = HDA_FIXUP_FUNC,
6494 .v.func = alc_fixup_disable_aamix,
831bfdf9
HW
6495 .chained = true,
6496 .chain_id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE
8b99aba7 6497 },
c04017ea
DH
6498 [ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK] = {
6499 .type = HDA_FIXUP_FUNC,
6500 .v.func = alc_fixup_disable_aamix,
6501 .chained = true,
6502 .chain_id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE
6503 },
8b99aba7
TI
6504 [ALC292_FIXUP_DELL_E7X] = {
6505 .type = HDA_FIXUP_FUNC,
6506 .v.func = alc_fixup_dell_xps13,
6507 .chained = true,
6508 .chain_id = ALC292_FIXUP_DISABLE_AAMIX
6509 },
54324221
JM
6510 [ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE] = {
6511 .type = HDA_FIXUP_PINS,
6512 .v.pins = (const struct hda_pintbl[]) {
6513 { 0x18, 0x01a1913c }, /* headset mic w/o jack detect */
6514 { }
6515 },
6516 .chained_before = true,
6517 .chain_id = ALC269_FIXUP_HEADSET_MODE,
6518 },
977e6276
KY
6519 [ALC298_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6520 .type = HDA_FIXUP_PINS,
6521 .v.pins = (const struct hda_pintbl[]) {
6522 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6523 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6524 { }
6525 },
6526 .chained = true,
6527 .chain_id = ALC269_FIXUP_HEADSET_MODE
6528 },
2f726aec
HW
6529 [ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE] = {
6530 .type = HDA_FIXUP_PINS,
6531 .v.pins = (const struct hda_pintbl[]) {
6532 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6533 { }
6534 },
6535 .chained = true,
6536 .chain_id = ALC269_FIXUP_HEADSET_MODE
6537 },
6ed1131f
KY
6538 [ALC275_FIXUP_DELL_XPS] = {
6539 .type = HDA_FIXUP_VERBS,
6540 .v.verbs = (const struct hda_verb[]) {
6541 /* Enables internal speaker */
6542 {0x20, AC_VERB_SET_COEF_INDEX, 0x1f},
6543 {0x20, AC_VERB_SET_PROC_COEF, 0x00c0},
6544 {0x20, AC_VERB_SET_COEF_INDEX, 0x30},
6545 {0x20, AC_VERB_SET_PROC_COEF, 0x00b1},
6546 {}
6547 }
6548 },
8c69729b
HW
6549 [ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE] = {
6550 .type = HDA_FIXUP_VERBS,
6551 .v.verbs = (const struct hda_verb[]) {
6552 /* Disable pass-through path for FRONT 14h */
6553 {0x20, AC_VERB_SET_COEF_INDEX, 0x36},
6554 {0x20, AC_VERB_SET_PROC_COEF, 0x1737},
6555 {}
6556 },
6557 .chained = true,
6558 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
6559 },
23adc192
HW
6560 [ALC293_FIXUP_LENOVO_SPK_NOISE] = {
6561 .type = HDA_FIXUP_FUNC,
6562 .v.func = alc_fixup_disable_aamix,
6563 .chained = true,
6564 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
6565 },
3694cb29
K
6566 [ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY] = {
6567 .type = HDA_FIXUP_FUNC,
6568 .v.func = alc233_fixup_lenovo_line2_mic_hotkey,
6569 },
3b43b71f
KHF
6570 [ALC255_FIXUP_DELL_SPK_NOISE] = {
6571 .type = HDA_FIXUP_FUNC,
6572 .v.func = alc_fixup_disable_aamix,
6573 .chained = true,
6574 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
6575 },
d1dd4211
KY
6576 [ALC225_FIXUP_DISABLE_MIC_VREF] = {
6577 .type = HDA_FIXUP_FUNC,
6578 .v.func = alc_fixup_disable_mic_vref,
6579 .chained = true,
6580 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
6581 },
2ae95577
DH
6582 [ALC225_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6583 .type = HDA_FIXUP_VERBS,
6584 .v.verbs = (const struct hda_verb[]) {
6585 /* Disable pass-through path for FRONT 14h */
6586 { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
6587 { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
6588 {}
6589 },
6590 .chained = true,
d1dd4211 6591 .chain_id = ALC225_FIXUP_DISABLE_MIC_VREF
2ae95577 6592 },
f883982d
TI
6593 [ALC280_FIXUP_HP_HEADSET_MIC] = {
6594 .type = HDA_FIXUP_FUNC,
6595 .v.func = alc_fixup_disable_aamix,
6596 .chained = true,
6597 .chain_id = ALC269_FIXUP_HEADSET_MIC,
6598 },
e549d190
HW
6599 [ALC221_FIXUP_HP_FRONT_MIC] = {
6600 .type = HDA_FIXUP_PINS,
6601 .v.pins = (const struct hda_pintbl[]) {
6602 { 0x19, 0x02a19020 }, /* Front Mic */
6603 { }
6604 },
6605 },
c636b95e
SE
6606 [ALC292_FIXUP_TPT460] = {
6607 .type = HDA_FIXUP_FUNC,
6608 .v.func = alc_fixup_tpt440_dock,
6609 .chained = true,
6610 .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE,
6611 },
dd9aa335
HW
6612 [ALC298_FIXUP_SPK_VOLUME] = {
6613 .type = HDA_FIXUP_FUNC,
6614 .v.func = alc298_fixup_speaker_volume,
59ec4b57 6615 .chained = true,
2f726aec 6616 .chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
dd9aa335 6617 },
e312a869
TI
6618 [ALC295_FIXUP_DISABLE_DAC3] = {
6619 .type = HDA_FIXUP_FUNC,
6620 .v.func = alc295_fixup_disable_dac3,
6621 },
fd06c77e
KHF
6622 [ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {
6623 .type = HDA_FIXUP_PINS,
6624 .v.pins = (const struct hda_pintbl[]) {
6625 { 0x1b, 0x90170151 },
6626 { }
6627 },
6628 .chained = true,
6629 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
6630 },
823ff161
GM
6631 [ALC269_FIXUP_ATIV_BOOK_8] = {
6632 .type = HDA_FIXUP_FUNC,
6633 .v.func = alc_fixup_auto_mute_via_amp,
6634 .chained = true,
6635 .chain_id = ALC269_FIXUP_NO_SHUTUP
6636 },
9eb5d0e6
KY
6637 [ALC221_FIXUP_HP_MIC_NO_PRESENCE] = {
6638 .type = HDA_FIXUP_PINS,
6639 .v.pins = (const struct hda_pintbl[]) {
6640 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6641 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6642 { }
6643 },
6644 .chained = true,
6645 .chain_id = ALC269_FIXUP_HEADSET_MODE
6646 },
c1732ede
CC
6647 [ALC256_FIXUP_ASUS_HEADSET_MODE] = {
6648 .type = HDA_FIXUP_FUNC,
6649 .v.func = alc_fixup_headset_mode,
6650 },
6651 [ALC256_FIXUP_ASUS_MIC] = {
6652 .type = HDA_FIXUP_PINS,
6653 .v.pins = (const struct hda_pintbl[]) {
6654 { 0x13, 0x90a60160 }, /* use as internal mic */
6655 { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
6656 { }
6657 },
6658 .chained = true,
6659 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
6660 },
eeed4cd1 6661 [ALC256_FIXUP_ASUS_AIO_GPIO2] = {
ae065f1c
TI
6662 .type = HDA_FIXUP_FUNC,
6663 /* Set up GPIO2 for the speaker amp */
6664 .v.func = alc_fixup_gpio4,
eeed4cd1 6665 },
216d7aeb
CC
6666 [ALC233_FIXUP_ASUS_MIC_NO_PRESENCE] = {
6667 .type = HDA_FIXUP_PINS,
6668 .v.pins = (const struct hda_pintbl[]) {
6669 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6670 { }
6671 },
6672 .chained = true,
6673 .chain_id = ALC269_FIXUP_HEADSET_MIC
6674 },
6675 [ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE] = {
6676 .type = HDA_FIXUP_VERBS,
6677 .v.verbs = (const struct hda_verb[]) {
6678 /* Enables internal speaker */
6679 {0x20, AC_VERB_SET_COEF_INDEX, 0x40},
6680 {0x20, AC_VERB_SET_PROC_COEF, 0x8800},
6681 {}
6682 },
6683 .chained = true,
6684 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
6685 },
ca169cc2
KY
6686 [ALC233_FIXUP_LENOVO_MULTI_CODECS] = {
6687 .type = HDA_FIXUP_FUNC,
6688 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
6689 },
ea5c7eba
JHP
6690 [ALC233_FIXUP_ACER_HEADSET_MIC] = {
6691 .type = HDA_FIXUP_VERBS,
6692 .v.verbs = (const struct hda_verb[]) {
6693 { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
6694 { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
6695 { }
6696 },
6697 .chained = true,
6698 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
6699 },
f33f79f3
HW
6700 [ALC294_FIXUP_LENOVO_MIC_LOCATION] = {
6701 .type = HDA_FIXUP_PINS,
6702 .v.pins = (const struct hda_pintbl[]) {
6703 /* Change the mic location from front to right, otherwise there are
6704 two front mics with the same name, pulseaudio can't handle them.
6705 This is just a temporary workaround, after applying this fixup,
6706 there will be one "Front Mic" and one "Mic" in this machine.
6707 */
6708 { 0x1a, 0x04a19040 },
6709 { }
6710 },
6711 },
5f364135
KY
6712 [ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE] = {
6713 .type = HDA_FIXUP_PINS,
6714 .v.pins = (const struct hda_pintbl[]) {
6715 { 0x16, 0x0101102f }, /* Rear Headset HP */
6716 { 0x19, 0x02a1913c }, /* use as Front headset mic, without its own jack detect */
6717 { 0x1a, 0x01a19030 }, /* Rear Headset MIC */
6718 { 0x1b, 0x02011020 },
6719 { }
6720 },
6721 .chained = true,
6722 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
6723 },
b84e8436
PH
6724 [ALC700_FIXUP_INTEL_REFERENCE] = {
6725 .type = HDA_FIXUP_VERBS,
6726 .v.verbs = (const struct hda_verb[]) {
6727 /* Enables internal speaker */
6728 {0x20, AC_VERB_SET_COEF_INDEX, 0x45},
6729 {0x20, AC_VERB_SET_PROC_COEF, 0x5289},
6730 {0x20, AC_VERB_SET_COEF_INDEX, 0x4A},
6731 {0x20, AC_VERB_SET_PROC_COEF, 0x001b},
6732 {0x58, AC_VERB_SET_COEF_INDEX, 0x00},
6733 {0x58, AC_VERB_SET_PROC_COEF, 0x3888},
6734 {0x20, AC_VERB_SET_COEF_INDEX, 0x6f},
6735 {0x20, AC_VERB_SET_PROC_COEF, 0x2c0b},
6736 {}
6737 }
6738 },
92266651
KY
6739 [ALC274_FIXUP_DELL_BIND_DACS] = {
6740 .type = HDA_FIXUP_FUNC,
6741 .v.func = alc274_fixup_bind_dacs,
6742 .chained = true,
6743 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
6744 },
6745 [ALC274_FIXUP_DELL_AIO_LINEOUT_VERB] = {
6746 .type = HDA_FIXUP_PINS,
6747 .v.pins = (const struct hda_pintbl[]) {
6748 { 0x1b, 0x0401102f },
6749 { }
6750 },
6751 .chained = true,
6752 .chain_id = ALC274_FIXUP_DELL_BIND_DACS
6753 },
61fcf8ec
KY
6754 [ALC298_FIXUP_TPT470_DOCK] = {
6755 .type = HDA_FIXUP_FUNC,
6756 .v.func = alc_fixup_tpt470_dock,
6757 .chained = true,
6758 .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE
6759 },
ae104a21
KY
6760 [ALC255_FIXUP_DUMMY_LINEOUT_VERB] = {
6761 .type = HDA_FIXUP_PINS,
6762 .v.pins = (const struct hda_pintbl[]) {
6763 { 0x14, 0x0201101f },
6764 { }
6765 },
6766 .chained = true,
6767 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
6768 },
f0ba9d69
KY
6769 [ALC255_FIXUP_DELL_HEADSET_MIC] = {
6770 .type = HDA_FIXUP_PINS,
6771 .v.pins = (const struct hda_pintbl[]) {
6772 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6773 { }
6774 },
3ce0d5aa
HW
6775 .chained = true,
6776 .chain_id = ALC269_FIXUP_HEADSET_MIC
f0ba9d69 6777 },
bbf8ff6b
TB
6778 [ALC295_FIXUP_HP_X360] = {
6779 .type = HDA_FIXUP_FUNC,
6780 .v.func = alc295_fixup_hp_top_speakers,
6781 .chained = true,
6782 .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC3
8a328ac1
KY
6783 },
6784 [ALC221_FIXUP_HP_HEADSET_MIC] = {
6785 .type = HDA_FIXUP_PINS,
6786 .v.pins = (const struct hda_pintbl[]) {
6787 { 0x19, 0x0181313f},
6788 { }
6789 },
6790 .chained = true,
6791 .chain_id = ALC269_FIXUP_HEADSET_MIC
6792 },
c4cfcf6f
HW
6793 [ALC285_FIXUP_LENOVO_HEADPHONE_NOISE] = {
6794 .type = HDA_FIXUP_FUNC,
6795 .v.func = alc285_fixup_invalidate_dacs,
6ba189c5
HW
6796 .chained = true,
6797 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
c4cfcf6f 6798 },
e8ed64b0
GKK
6799 [ALC295_FIXUP_HP_AUTO_MUTE] = {
6800 .type = HDA_FIXUP_FUNC,
6801 .v.func = alc_fixup_auto_mute_via_amp,
6802 },
33aaebd4
CC
6803 [ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE] = {
6804 .type = HDA_FIXUP_PINS,
6805 .v.pins = (const struct hda_pintbl[]) {
6806 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6807 { }
6808 },
6809 .chained = true,
6810 .chain_id = ALC269_FIXUP_HEADSET_MIC
6811 },
d8ae458e
CC
6812 [ALC294_FIXUP_ASUS_MIC] = {
6813 .type = HDA_FIXUP_PINS,
6814 .v.pins = (const struct hda_pintbl[]) {
6815 { 0x13, 0x90a60160 }, /* use as internal mic */
6816 { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
6817 { }
6818 },
6819 .chained = true,
6820 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
6821 },
4e051106
JHP
6822 [ALC294_FIXUP_ASUS_HEADSET_MIC] = {
6823 .type = HDA_FIXUP_PINS,
6824 .v.pins = (const struct hda_pintbl[]) {
82b01149 6825 { 0x19, 0x01a1103c }, /* use as headset mic */
4e051106
JHP
6826 { }
6827 },
6828 .chained = true,
6829 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
6830 },
6831 [ALC294_FIXUP_ASUS_SPK] = {
6832 .type = HDA_FIXUP_VERBS,
6833 .v.verbs = (const struct hda_verb[]) {
6834 /* Set EAPD high */
6835 { 0x20, AC_VERB_SET_COEF_INDEX, 0x40 },
6836 { 0x20, AC_VERB_SET_PROC_COEF, 0x8800 },
6837 { }
6838 },
6839 .chained = true,
6840 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
6841 },
c8a9afa6 6842 [ALC295_FIXUP_CHROME_BOOK] = {
e854747d 6843 .type = HDA_FIXUP_FUNC,
c8a9afa6 6844 .v.func = alc295_fixup_chromebook,
8983eb60
KY
6845 .chained = true,
6846 .chain_id = ALC225_FIXUP_HEADSET_JACK
6847 },
6848 [ALC225_FIXUP_HEADSET_JACK] = {
6849 .type = HDA_FIXUP_FUNC,
6850 .v.func = alc_fixup_headset_jack,
e854747d 6851 },
89e3a568
JS
6852 [ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
6853 .type = HDA_FIXUP_PINS,
6854 .v.pins = (const struct hda_pintbl[]) {
6855 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6856 { }
6857 },
6858 .chained = true,
6859 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
6860 },
c8c6ee61
HW
6861 [ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE] = {
6862 .type = HDA_FIXUP_VERBS,
6863 .v.verbs = (const struct hda_verb[]) {
6864 /* Disable PCBEEP-IN passthrough */
6865 { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
6866 { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
6867 { }
6868 },
6869 .chained = true,
6870 .chain_id = ALC285_FIXUP_LENOVO_HEADPHONE_NOISE
6871 },
cbc05fd6
JHP
6872 [ALC255_FIXUP_ACER_HEADSET_MIC] = {
6873 .type = HDA_FIXUP_PINS,
6874 .v.pins = (const struct hda_pintbl[]) {
6875 { 0x19, 0x03a11130 },
6876 { 0x1a, 0x90a60140 }, /* use as internal mic */
6877 { }
6878 },
6879 .chained = true,
6880 .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
6881 },
136824ef
KY
6882 [ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE] = {
6883 .type = HDA_FIXUP_PINS,
6884 .v.pins = (const struct hda_pintbl[]) {
6885 { 0x16, 0x01011020 }, /* Rear Line out */
6886 { 0x19, 0x01a1913c }, /* use as Front headset mic, without its own jack detect */
6887 { }
6888 },
6889 .chained = true,
6890 .chain_id = ALC225_FIXUP_WYSE_AUTO_MUTE
6891 },
6892 [ALC225_FIXUP_WYSE_AUTO_MUTE] = {
6893 .type = HDA_FIXUP_FUNC,
6894 .v.func = alc_fixup_auto_mute_via_amp,
6895 .chained = true,
6896 .chain_id = ALC225_FIXUP_WYSE_DISABLE_MIC_VREF
6897 },
6898 [ALC225_FIXUP_WYSE_DISABLE_MIC_VREF] = {
6899 .type = HDA_FIXUP_FUNC,
6900 .v.func = alc_fixup_disable_mic_vref,
6901 .chained = true,
6902 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
6903 },
667a8f73
JHP
6904 [ALC286_FIXUP_ACER_AIO_HEADSET_MIC] = {
6905 .type = HDA_FIXUP_VERBS,
6906 .v.verbs = (const struct hda_verb[]) {
6907 { 0x20, AC_VERB_SET_COEF_INDEX, 0x4f },
6908 { 0x20, AC_VERB_SET_PROC_COEF, 0x5029 },
6909 { }
6910 },
6911 .chained = true,
6912 .chain_id = ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE
6913 },
e1037354
JHP
6914 [ALC256_FIXUP_ASUS_MIC_NO_PRESENCE] = {
6915 .type = HDA_FIXUP_PINS,
6916 .v.pins = (const struct hda_pintbl[]) {
6917 { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
6918 { }
6919 },
6920 .chained = true,
6921 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
6922 },
e2a829b3
BR
6923 [ALC299_FIXUP_PREDATOR_SPK] = {
6924 .type = HDA_FIXUP_PINS,
6925 .v.pins = (const struct hda_pintbl[]) {
6926 { 0x21, 0x90170150 }, /* use as headset mic, without its own jack detect */
6927 { }
6928 }
6929 },
60083f9e
JHP
6930 [ALC294_FIXUP_ASUS_INTSPK_HEADSET_MIC] = {
6931 .type = HDA_FIXUP_PINS,
6932 .v.pins = (const struct hda_pintbl[]) {
6933 { 0x14, 0x411111f0 }, /* disable confusing internal speaker */
6934 { 0x19, 0x04a11150 }, /* use as headset mic, without its own jack detect */
6935 { }
6936 },
6937 .chained = true,
6938 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
6939 },
f1d4e28b
KY
6940};
6941
1d045db9 6942static const struct snd_pci_quirk alc269_fixup_tbl[] = {
a6b92b66 6943 SND_PCI_QUIRK(0x1025, 0x0283, "Acer TravelMate 8371", ALC269_FIXUP_INV_DMIC),
693b613d
DH
6944 SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC),
6945 SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC),
aaedfb47 6946 SND_PCI_QUIRK(0x1025, 0x047c, "Acer AC700", ALC269_FIXUP_ACER_AC700),
7819717b
TI
6947 SND_PCI_QUIRK(0x1025, 0x072d, "Acer Aspire V5-571G", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
6948 SND_PCI_QUIRK(0x1025, 0x080d, "Acer Aspire V5-122P", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
aaedfb47
DH
6949 SND_PCI_QUIRK(0x1025, 0x0740, "Acer AO725", ALC271_FIXUP_HP_GATE_MIC_JACK),
6950 SND_PCI_QUIRK(0x1025, 0x0742, "Acer AO756", ALC271_FIXUP_HP_GATE_MIC_JACK),
02322ac9 6951 SND_PCI_QUIRK(0x1025, 0x0762, "Acer Aspire E1-472", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
b1e8972e 6952 SND_PCI_QUIRK(0x1025, 0x0775, "Acer Aspire E1-572", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
1a22e775 6953 SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS),
705b65f1 6954 SND_PCI_QUIRK(0x1025, 0x102b, "Acer Aspire C24-860", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE),
b9c2fa52 6955 SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK),
c7531e31
CC
6956 SND_PCI_QUIRK(0x1025, 0x1099, "Acer Aspire E5-523G", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
6957 SND_PCI_QUIRK(0x1025, 0x110e, "Acer Aspire ES1-432", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
e2a829b3 6958 SND_PCI_QUIRK(0x1025, 0x1246, "Acer Predator Helios 500", ALC299_FIXUP_PREDATOR_SPK),
667a8f73
JHP
6959 SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
6960 SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
6961 SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
2733cceb 6962 SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
ea5c7eba 6963 SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", ALC233_FIXUP_ACER_HEADSET_MIC),
cbc05fd6 6964 SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC),
aaedfb47 6965 SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
6ed1131f 6966 SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS),
86f799b8 6967 SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X),
cf52103a 6968 SND_PCI_QUIRK(0x1028, 0x05be, "Dell Latitude E6540", ALC292_FIXUP_DELL_E7X),
8b99aba7
TI
6969 SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X),
6970 SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X),
0f4881dc 6971 SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER),
73bdd597
DH
6972 SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
6973 SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
6974 SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
0f4881dc
DH
6975 SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
6976 SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
98070576 6977 SND_PCI_QUIRK(0x1028, 0x062c, "Dell Latitude E5550", ALC292_FIXUP_DELL_E7X),
4275554d 6978 SND_PCI_QUIRK(0x1028, 0x062e, "Dell Latitude E7450", ALC292_FIXUP_DELL_E7X),
0f4881dc 6979 SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),
a22aa26f
KY
6980 SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
6981 SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
831bfdf9 6982 SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13),
afecb146 6983 SND_PCI_QUIRK(0x1028, 0x0669, "Dell Optiplex 9020m", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
3a05d12f 6984 SND_PCI_QUIRK(0x1028, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK),
8b72415d 6985 SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
b734304f
KY
6986 SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
6987 SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
c04017ea
DH
6988 SND_PCI_QUIRK(0x1028, 0x06db, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
6989 SND_PCI_QUIRK(0x1028, 0x06dd, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
6990 SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
6991 SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
6992 SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
423cd785 6993 SND_PCI_QUIRK(0x1028, 0x0704, "Dell XPS 13 9350", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE),
fd06c77e 6994 SND_PCI_QUIRK(0x1028, 0x0706, "Dell Inspiron 7559", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
3b43b71f 6995 SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE),
c0ca5ece 6996 SND_PCI_QUIRK(0x1028, 0x0738, "Dell Precision 5820", ALC269_FIXUP_NO_SHUTUP),
423cd785 6997 SND_PCI_QUIRK(0x1028, 0x075b, "Dell XPS 13 9360", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE),
709ae62e 6998 SND_PCI_QUIRK(0x1028, 0x075c, "Dell XPS 27 7760", ALC298_FIXUP_SPK_VOLUME),
dd9aa335 6999 SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME),
e312a869 7000 SND_PCI_QUIRK(0x1028, 0x07b0, "Dell Precision 7520", ALC295_FIXUP_DISABLE_DAC3),
493de342 7001 SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
5f364135 7002 SND_PCI_QUIRK(0x1028, 0x080c, "Dell WYSE", ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE),
e4c9fd10 7003 SND_PCI_QUIRK(0x1028, 0x082a, "Dell XPS 13 9360", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE),
40e2c4e5
KY
7004 SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
7005 SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
f0ba9d69
KY
7006 SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
7007 SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
ae104a21 7008 SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB),
136824ef 7009 SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE),
da484d00 7010 SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE),
c2a7c55a 7011 SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
a22aa26f
KY
7012 SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
7013 SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
08fb0d0e 7014 SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
9f5c6faf 7015 SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),
8e35cd4a 7016 SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED),
33f4acd3 7017 SND_PCI_QUIRK(0x103c, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY),
c60666bd 7018 /* ALC282 */
7976eb49 7019 SND_PCI_QUIRK(0x103c, 0x21f9, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8a02b164 7020 SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8a02b164 7021 SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9c5dc3bf
KY
7022 SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
7023 SND_PCI_QUIRK(0x103c, 0x2237, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
7024 SND_PCI_QUIRK(0x103c, 0x2238, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
7025 SND_PCI_QUIRK(0x103c, 0x2239, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9c5dc3bf 7026 SND_PCI_QUIRK(0x103c, 0x224b, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
c60666bd 7027 SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
c60666bd
KY
7028 SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7029 SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8a02b164 7030 SND_PCI_QUIRK(0x103c, 0x226e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
eaa8e5ef 7031 SND_PCI_QUIRK(0x103c, 0x2271, "HP", ALC286_FIXUP_HP_GPIO_LED),
b4b33f9d 7032 SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC280_FIXUP_HP_DOCK_PINS),
3271cb22 7033 SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC280_FIXUP_HP_DOCK_PINS),
c60666bd 7034 SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
c60666bd
KY
7035 SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7036 SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7037 SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
c60666bd 7038 SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
98973f2f 7039 SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC280_FIXUP_HP_9480M),
9c5dc3bf
KY
7040 SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7041 SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
c60666bd 7042 /* ALC290 */
9c5dc3bf 7043 SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9c5dc3bf 7044 SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9c5dc3bf 7045 SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9c5dc3bf
KY
7046 SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7047 SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7048 SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7049 SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7050 SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9c5dc3bf 7051 SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
04d5466a 7052 SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED),
c60666bd 7053 SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
c60666bd
KY
7054 SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7055 SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7056 SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9c5dc3bf
KY
7057 SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7058 SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9c5dc3bf 7059 SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
c60666bd 7060 SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
c60666bd 7061 SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
c60666bd 7062 SND_PCI_QUIRK(0x103c, 0x228b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
c60666bd
KY
7063 SND_PCI_QUIRK(0x103c, 0x228e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7064 SND_PCI_QUIRK(0x103c, 0x22c5, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
c60666bd
KY
7065 SND_PCI_QUIRK(0x103c, 0x22c7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7066 SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
c60666bd 7067 SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8a02b164
KY
7068 SND_PCI_QUIRK(0x103c, 0x2334, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7069 SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7070 SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7071 SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
f883982d 7072 SND_PCI_QUIRK(0x103c, 0x221c, "HP EliteBook 755 G2", ALC280_FIXUP_HP_HEADSET_MIC),
167897f4
JK
7073 SND_PCI_QUIRK(0x103c, 0x802e, "HP Z240 SFF", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
7074 SND_PCI_QUIRK(0x103c, 0x802f, "HP Z240", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
563785ed 7075 SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
e549d190 7076 SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC),
bbf8ff6b 7077 SND_PCI_QUIRK(0x103c, 0x827e, "HP x360", ALC295_FIXUP_HP_X360),
167897f4
JK
7078 SND_PCI_QUIRK(0x103c, 0x82bf, "HP G3 mini", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
7079 SND_PCI_QUIRK(0x103c, 0x82c0, "HP G3 mini premium", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
56e40eb6 7080 SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
190d0381 7081 SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
d33cd42d 7082 SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
c1732ede 7083 SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
7bba2157 7084 SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
3e0d611b 7085 SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9cf6533e 7086 SND_PCI_QUIRK(0x1043, 0x10a1, "ASUS UX391UA", ALC294_FIXUP_ASUS_SPK),
c1732ede 7087 SND_PCI_QUIRK(0x1043, 0x10c0, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
4eab0ea1 7088 SND_PCI_QUIRK(0x1043, 0x10d0, "ASUS X540LA/X540LJ", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
3e0d611b 7089 SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
4eab0ea1
TI
7090 SND_PCI_QUIRK(0x1043, 0x11c0, "ASUS X556UR", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
7091 SND_PCI_QUIRK(0x1043, 0x1290, "ASUS X441SA", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
7092 SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
c1732ede
CC
7093 SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC),
7094 SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),
7095 SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
2cede303 7096 SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
23870831 7097 SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
3e0d611b 7098 SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
60083f9e 7099 SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_INTSPK_HEADSET_MIC),
017f2a10 7100 SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
28e8af8a 7101 SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC),
693b613d 7102 SND_PCI_QUIRK(0x1043, 0x1b13, "Asus U41SV", ALC269_FIXUP_INV_DMIC),
615966ad 7103 SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
4eab0ea1 7104 SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
c1732ede 7105 SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
eeed4cd1 7106 SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
adabb3ec
TI
7107 SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
7108 SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
7109 SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
7110 SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
d240d1dc 7111 SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
f88abaa0 7112 SND_PCI_QUIRK(0x104d, 0x90b5, "Sony VAIO Pro 11", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
88cfcf86 7113 SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
1d045db9
TI
7114 SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
7115 SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
7116 SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
e9bd7d5c 7117 SND_PCI_QUIRK(0x104d, 0x9099, "Sony VAIO S13", ALC275_FIXUP_SONY_DISABLE_AAMIX),
24519911 7118 SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),
4df3fd17 7119 SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT),
cc7016ab 7120 SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN),
88776f36 7121 SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN),
fdcc968a 7122 SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC),
2041d564 7123 SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),
b84e8436 7124 SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE),
0fca97a2 7125 SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-SZ6", ALC269_FIXUP_HEADSET_MODE),
a33cc48d 7126 SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
823ff161 7127 SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
abaa2274
AA
7128 SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
7129 SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),
8cd65271 7130 SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC),
89e3a568 7131 SND_PCI_QUIRK(0x1558, 0x1325, "System76 Darter Pro (darp5)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
80a5052d 7132 SND_PCI_QUIRK(0x1558, 0x8550, "System76 Gazelle (gaze14)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
891afcf2
JS
7133 SND_PCI_QUIRK(0x1558, 0x8551, "System76 Gazelle (gaze14)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
7134 SND_PCI_QUIRK(0x1558, 0x8560, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
7135 SND_PCI_QUIRK(0x1558, 0x8561, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
ca169cc2 7136 SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
1d045db9
TI
7137 SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
7138 SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
7139 SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
7140 SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
7141 SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
707fba3f 7142 SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK),
c8415a48 7143 SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK),
84f98fdf 7144 SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),
4407be6b 7145 SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),
108cc108 7146 SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK),
aaedfb47 7147 SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK),
9a811230 7148 SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440),
1c37c223 7149 SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK),
a12137e7 7150 SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK),
59a51a6b 7151 SND_PCI_QUIRK(0x17aa, 0x2211, "Thinkpad W541", ALC292_FIXUP_TPT440_DOCK),
6d16941a 7152 SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK),
7c21539c 7153 SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK),
a4a9e082 7154 SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
b6903c0e 7155 SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK),
d05ea7da 7156 SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK),
c0278669 7157 SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK),
61fcf8ec
KY
7158 SND_PCI_QUIRK(0x17aa, 0x222d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7159 SND_PCI_QUIRK(0x17aa, 0x222e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
dab38e43 7160 SND_PCI_QUIRK(0x17aa, 0x2231, "Thinkpad T560", ALC292_FIXUP_TPT460),
c636b95e 7161 SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460),
61fcf8ec
KY
7162 SND_PCI_QUIRK(0x17aa, 0x2245, "Thinkpad T470", ALC298_FIXUP_TPT470_DOCK),
7163 SND_PCI_QUIRK(0x17aa, 0x2246, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7164 SND_PCI_QUIRK(0x17aa, 0x2247, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
e4c07b3b 7165 SND_PCI_QUIRK(0x17aa, 0x2249, "Thinkpad", ALC292_FIXUP_TPT460),
61fcf8ec
KY
7166 SND_PCI_QUIRK(0x17aa, 0x224b, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7167 SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7168 SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
85981dfd 7169 SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
3694cb29 7170 SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
6ef2f68f 7171 SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
f33f79f3 7172 SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
bef33e19 7173 SND_PCI_QUIRK(0x17aa, 0x3111, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
e41fc8c5 7174 SND_PCI_QUIRK(0x17aa, 0x312a, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
65811834 7175 SND_PCI_QUIRK(0x17aa, 0x312f, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
8da5bbfc 7176 SND_PCI_QUIRK(0x17aa, 0x313c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
2a36c16e 7177 SND_PCI_QUIRK(0x17aa, 0x3151, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
56f27013 7178 SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
fedb2245 7179 SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
56df90b6 7180 SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
a4a9e082 7181 SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
1bb3e062 7182 SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC),
c497d9f9 7183 SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK),
cd5302c0 7184 SND_PCI_QUIRK(0x17aa, 0x5026, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
f2aa1110 7185 SND_PCI_QUIRK(0x17aa, 0x5034, "Thinkpad T450", ALC292_FIXUP_TPT440_DOCK),
80b311d3 7186 SND_PCI_QUIRK(0x17aa, 0x5036, "Thinkpad T450s", ALC292_FIXUP_TPT440_DOCK),
09ea9976 7187 SND_PCI_QUIRK(0x17aa, 0x503c, "Thinkpad L450", ALC292_FIXUP_TPT440_DOCK),
037e1197 7188 SND_PCI_QUIRK(0x17aa, 0x504a, "ThinkPad X260", ALC292_FIXUP_TPT440_DOCK),
23adc192 7189 SND_PCI_QUIRK(0x17aa, 0x504b, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
0f087ee3 7190 SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460),
9cd25743 7191 SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460),
0f087ee3 7192 SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460),
61fcf8ec
KY
7193 SND_PCI_QUIRK(0x17aa, 0x505d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7194 SND_PCI_QUIRK(0x17aa, 0x505f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7195 SND_PCI_QUIRK(0x17aa, 0x5062, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
cd5302c0 7196 SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
61fcf8ec
KY
7197 SND_PCI_QUIRK(0x17aa, 0x511e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7198 SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
012e7eb1 7199 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
1d045db9 7200 SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
0fbf21c3 7201 SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS),
02b504d9 7202 SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */
a4297b5d 7203
a7f3eedc 7204#if 0
a4297b5d
TI
7205 /* Below is a quirk table taken from the old code.
7206 * Basically the device should work as is without the fixup table.
7207 * If BIOS doesn't give a proper info, enable the corresponding
7208 * fixup entry.
7d7eb9ea 7209 */
a4297b5d
TI
7210 SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
7211 ALC269_FIXUP_AMIC),
7212 SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC),
a4297b5d
TI
7213 SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC),
7214 SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC),
7215 SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC),
7216 SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269_FIXUP_AMIC),
7217 SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269_FIXUP_AMIC),
7218 SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269_FIXUP_AMIC),
7219 SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_FIXUP_AMIC),
7220 SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269_FIXUP_AMIC),
7221 SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_FIXUP_AMIC),
7222 SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_FIXUP_AMIC),
7223 SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_FIXUP_AMIC),
7224 SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_FIXUP_AMIC),
7225 SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_FIXUP_AMIC),
7226 SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_FIXUP_AMIC),
7227 SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_FIXUP_AMIC),
7228 SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_FIXUP_AMIC),
7229 SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_FIXUP_AMIC),
7230 SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_FIXUP_AMIC),
7231 SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_FIXUP_AMIC),
7232 SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_FIXUP_AMIC),
7233 SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_FIXUP_AMIC),
7234 SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_FIXUP_AMIC),
7235 SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_FIXUP_AMIC),
7236 SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_FIXUP_AMIC),
7237 SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_FIXUP_AMIC),
7238 SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_FIXUP_AMIC),
7239 SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_FIXUP_AMIC),
7240 SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_FIXUP_AMIC),
7241 SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_FIXUP_AMIC),
7242 SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_FIXUP_AMIC),
7243 SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_FIXUP_AMIC),
7244 SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_FIXUP_AMIC),
7245 SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_FIXUP_AMIC),
7246 SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_FIXUP_DMIC),
7247 SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_FIXUP_AMIC),
7248 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_AMIC),
7249 SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_FIXUP_DMIC),
7250 SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_FIXUP_DMIC),
7251#endif
7252 {}
7253};
7254
214eef76
DH
7255static const struct snd_pci_quirk alc269_fixup_vendor_tbl[] = {
7256 SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
7257 SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED),
7258 SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
7259 SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", ALC269_FIXUP_THINKPAD_ACPI),
0fbf21c3 7260 SND_PCI_QUIRK_VENDOR(0x19e5, "Huawei Matebook", ALC255_FIXUP_MIC_MUTE_LED),
214eef76
DH
7261 {}
7262};
7263
1727a771 7264static const struct hda_model_fixup alc269_fixup_models[] = {
a4297b5d
TI
7265 {.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"},
7266 {.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"},
6e72aa5f
TI
7267 {.id = ALC269_FIXUP_STEREO_DMIC, .name = "alc269-dmic"},
7268 {.id = ALC271_FIXUP_DMIC, .name = "alc271-dmic"},
7269 {.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"},
7c478f03 7270 {.id = ALC269_FIXUP_HEADSET_MIC, .name = "headset-mic"},
b016951e
TI
7271 {.id = ALC269_FIXUP_HEADSET_MODE, .name = "headset-mode"},
7272 {.id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, .name = "headset-mode-no-hp-mic"},
108cc108 7273 {.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
9f5c6faf 7274 {.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
04d5466a 7275 {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic1-led"},
e32aa85a
DH
7276 {.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
7277 {.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
a26d96c7
TI
7278 {.id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, .name = "dell-headset3"},
7279 {.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, .name = "dell-headset4"},
be8ef16a 7280 {.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},
0202e99c 7281 {.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"},
1c37c223 7282 {.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
9a811230 7283 {.id = ALC292_FIXUP_TPT440, .name = "tpt440"},
c636b95e 7284 {.id = ALC292_FIXUP_TPT460, .name = "tpt460"},
a26d96c7 7285 {.id = ALC298_FIXUP_TPT470_DOCK, .name = "tpt470-dock"},
ba90d6a6 7286 {.id = ALC233_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
28d1d6d2 7287 {.id = ALC700_FIXUP_INTEL_REFERENCE, .name = "alc700-ref"},
a26d96c7
TI
7288 {.id = ALC269_FIXUP_SONY_VAIO, .name = "vaio"},
7289 {.id = ALC269_FIXUP_DELL_M101Z, .name = "dell-m101z"},
7290 {.id = ALC269_FIXUP_ASUS_G73JW, .name = "asus-g73jw"},
7291 {.id = ALC269_FIXUP_LENOVO_EAPD, .name = "lenovo-eapd"},
7292 {.id = ALC275_FIXUP_SONY_HWEQ, .name = "sony-hweq"},
7293 {.id = ALC269_FIXUP_PCM_44K, .name = "pcm44k"},
7294 {.id = ALC269_FIXUP_LIFEBOOK, .name = "lifebook"},
7295 {.id = ALC269_FIXUP_LIFEBOOK_EXTMIC, .name = "lifebook-extmic"},
7296 {.id = ALC269_FIXUP_LIFEBOOK_HP_PIN, .name = "lifebook-hp-pin"},
7297 {.id = ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC, .name = "lifebook-u7x7"},
7298 {.id = ALC269VB_FIXUP_AMIC, .name = "alc269vb-amic"},
7299 {.id = ALC269VB_FIXUP_DMIC, .name = "alc269vb-dmic"},
7300 {.id = ALC269_FIXUP_HP_MUTE_LED_MIC1, .name = "hp-mute-led-mic1"},
7301 {.id = ALC269_FIXUP_HP_MUTE_LED_MIC2, .name = "hp-mute-led-mic2"},
7302 {.id = ALC269_FIXUP_HP_MUTE_LED_MIC3, .name = "hp-mute-led-mic3"},
7303 {.id = ALC269_FIXUP_HP_GPIO_MIC1_LED, .name = "hp-gpio-mic1"},
7304 {.id = ALC269_FIXUP_HP_LINE1_MIC1_LED, .name = "hp-line1-mic1"},
7305 {.id = ALC269_FIXUP_NO_SHUTUP, .name = "noshutup"},
7306 {.id = ALC286_FIXUP_SONY_MIC_NO_PRESENCE, .name = "sony-nomic"},
7307 {.id = ALC269_FIXUP_ASPIRE_HEADSET_MIC, .name = "aspire-headset-mic"},
7308 {.id = ALC269_FIXUP_ASUS_X101, .name = "asus-x101"},
7309 {.id = ALC271_FIXUP_HP_GATE_MIC_JACK, .name = "acer-ao7xx"},
7310 {.id = ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572, .name = "acer-aspire-e1"},
7311 {.id = ALC269_FIXUP_ACER_AC700, .name = "acer-ac700"},
7312 {.id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST, .name = "limit-mic-boost"},
7313 {.id = ALC269VB_FIXUP_ASUS_ZENBOOK, .name = "asus-zenbook"},
7314 {.id = ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A, .name = "asus-zenbook-ux31a"},
7315 {.id = ALC269VB_FIXUP_ORDISSIMO_EVE2, .name = "ordissimo"},
7316 {.id = ALC282_FIXUP_ASUS_TX300, .name = "asus-tx300"},
7317 {.id = ALC283_FIXUP_INT_MIC, .name = "alc283-int-mic"},
7318 {.id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK, .name = "mono-speakers"},
7319 {.id = ALC290_FIXUP_SUBWOOFER_HSJACK, .name = "alc290-subwoofer"},
7320 {.id = ALC269_FIXUP_THINKPAD_ACPI, .name = "thinkpad"},
7321 {.id = ALC269_FIXUP_DMIC_THINKPAD_ACPI, .name = "dmic-thinkpad"},
7322 {.id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE, .name = "alc255-acer"},
7323 {.id = ALC255_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc255-asus"},
7324 {.id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc255-dell1"},
7325 {.id = ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "alc255-dell2"},
7326 {.id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc293-dell1"},
7327 {.id = ALC283_FIXUP_HEADSET_MIC, .name = "alc283-headset"},
b3802783 7328 {.id = ALC255_FIXUP_MIC_MUTE_LED, .name = "alc255-dell-mute"},
a26d96c7
TI
7329 {.id = ALC282_FIXUP_ASPIRE_V5_PINS, .name = "aspire-v5"},
7330 {.id = ALC280_FIXUP_HP_GPIO4, .name = "hp-gpio4"},
7331 {.id = ALC286_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
7332 {.id = ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY, .name = "hp-gpio2-hotkey"},
7333 {.id = ALC280_FIXUP_HP_DOCK_PINS, .name = "hp-dock-pins"},
7334 {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic"},
7335 {.id = ALC280_FIXUP_HP_9480M, .name = "hp-9480m"},
7336 {.id = ALC288_FIXUP_DELL_HEADSET_MODE, .name = "alc288-dell-headset"},
7337 {.id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc288-dell1"},
7338 {.id = ALC288_FIXUP_DELL_XPS_13, .name = "alc288-dell-xps13"},
7339 {.id = ALC292_FIXUP_DELL_E7X, .name = "dell-e7x"},
7340 {.id = ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK, .name = "alc293-dell"},
7341 {.id = ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc298-dell1"},
7342 {.id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, .name = "alc298-dell-aio"},
7343 {.id = ALC275_FIXUP_DELL_XPS, .name = "alc275-dell-xps"},
7344 {.id = ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE, .name = "alc256-dell-xps13"},
7345 {.id = ALC293_FIXUP_LENOVO_SPK_NOISE, .name = "lenovo-spk-noise"},
7346 {.id = ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, .name = "lenovo-hotkey"},
7347 {.id = ALC255_FIXUP_DELL_SPK_NOISE, .name = "dell-spk-noise"},
82aa0d7e 7348 {.id = ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc225-dell1"},
a26d96c7
TI
7349 {.id = ALC295_FIXUP_DISABLE_DAC3, .name = "alc295-disable-dac3"},
7350 {.id = ALC280_FIXUP_HP_HEADSET_MIC, .name = "alc280-hp-headset"},
7351 {.id = ALC221_FIXUP_HP_FRONT_MIC, .name = "alc221-hp-mic"},
7352 {.id = ALC298_FIXUP_SPK_VOLUME, .name = "alc298-spk-volume"},
7353 {.id = ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER, .name = "dell-inspiron-7559"},
7354 {.id = ALC269_FIXUP_ATIV_BOOK_8, .name = "ativ-book"},
7355 {.id = ALC221_FIXUP_HP_MIC_NO_PRESENCE, .name = "alc221-hp-mic"},
7356 {.id = ALC256_FIXUP_ASUS_HEADSET_MODE, .name = "alc256-asus-headset"},
7357 {.id = ALC256_FIXUP_ASUS_MIC, .name = "alc256-asus-mic"},
7358 {.id = ALC256_FIXUP_ASUS_AIO_GPIO2, .name = "alc256-asus-aio"},
7359 {.id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc233-asus"},
7360 {.id = ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE, .name = "alc233-eapd"},
7361 {.id = ALC294_FIXUP_LENOVO_MIC_LOCATION, .name = "alc294-lenovo-mic"},
7362 {.id = ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE, .name = "alc225-wyse"},
7363 {.id = ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, .name = "alc274-dell-aio"},
7364 {.id = ALC255_FIXUP_DUMMY_LINEOUT_VERB, .name = "alc255-dummy-lineout"},
7365 {.id = ALC255_FIXUP_DELL_HEADSET_MIC, .name = "alc255-dell-headset"},
7366 {.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"},
8983eb60
KY
7367 {.id = ALC225_FIXUP_HEADSET_JACK, .name = "alc-headset-jack"},
7368 {.id = ALC295_FIXUP_CHROME_BOOK, .name = "alc-chrome-book"},
e2a829b3 7369 {.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"},
a2ef03fe 7370 {.id = ALC298_FIXUP_HUAWEI_MBX_STEREO, .name = "huawei-mbx-stereo"},
1d045db9 7371 {}
6dda9f4a 7372};
cfc5a845 7373#define ALC225_STANDARD_PINS \
cfc5a845 7374 {0x21, 0x04211020}
6dda9f4a 7375
e8191a8e
HW
7376#define ALC256_STANDARD_PINS \
7377 {0x12, 0x90a60140}, \
7378 {0x14, 0x90170110}, \
e8191a8e
HW
7379 {0x21, 0x02211020}
7380
fea185e2 7381#define ALC282_STANDARD_PINS \
11580297 7382 {0x14, 0x90170110}
e1e62b98 7383
fea185e2 7384#define ALC290_STANDARD_PINS \
11580297 7385 {0x12, 0x99a30130}
fea185e2
DH
7386
7387#define ALC292_STANDARD_PINS \
7388 {0x14, 0x90170110}, \
11580297 7389 {0x15, 0x0221401f}
977e6276 7390
3f640970
HW
7391#define ALC295_STANDARD_PINS \
7392 {0x12, 0xb7a60130}, \
7393 {0x14, 0x90170110}, \
3f640970
HW
7394 {0x21, 0x04211020}
7395
703867e2
WS
7396#define ALC298_STANDARD_PINS \
7397 {0x12, 0x90a60130}, \
7398 {0x21, 0x03211020}
7399
e1918938 7400static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
8a328ac1
KY
7401 SND_HDA_PIN_QUIRK(0x10ec0221, 0x103c, "HP Workstation", ALC221_FIXUP_HP_HEADSET_MIC,
7402 {0x14, 0x01014020},
7403 {0x17, 0x90170110},
7404 {0x18, 0x02a11030},
7405 {0x19, 0x0181303F},
7406 {0x21, 0x0221102f}),
5824ce8d
CC
7407 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1025, "Acer", ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
7408 {0x12, 0x90a601c0},
7409 {0x14, 0x90171120},
7410 {0x21, 0x02211030}),
615966ad
CC
7411 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
7412 {0x14, 0x90170110},
7413 {0x1b, 0x90a70130},
7414 {0x21, 0x03211020}),
7415 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
7416 {0x1a, 0x90a70130},
7417 {0x1b, 0x90170110},
7418 {0x21, 0x03211020}),
2ae95577 7419 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
cfc5a845 7420 ALC225_STANDARD_PINS,
8a132099 7421 {0x12, 0xb7a60130},
cfc5a845 7422 {0x14, 0x901701a0}),
2ae95577 7423 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
cfc5a845 7424 ALC225_STANDARD_PINS,
8a132099 7425 {0x12, 0xb7a60130},
cfc5a845 7426 {0x14, 0x901701b0}),
8a132099
HW
7427 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
7428 ALC225_STANDARD_PINS,
7429 {0x12, 0xb7a60150},
7430 {0x14, 0x901701a0}),
7431 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
7432 ALC225_STANDARD_PINS,
7433 {0x12, 0xb7a60150},
7434 {0x14, 0x901701b0}),
7435 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
7436 ALC225_STANDARD_PINS,
7437 {0x12, 0xb7a60130},
7438 {0x1b, 0x90170110}),
0ce48e17
KHF
7439 SND_HDA_PIN_QUIRK(0x10ec0233, 0x8086, "Intel NUC Skull Canyon", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
7440 {0x1b, 0x01111010},
7441 {0x1e, 0x01451130},
7442 {0x21, 0x02211020}),
986376b6
HW
7443 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
7444 {0x12, 0x90a60140},
7445 {0x14, 0x90170110},
7446 {0x19, 0x02a11030},
7447 {0x21, 0x02211020}),
e41fc8c5
HW
7448 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
7449 {0x14, 0x90170110},
7450 {0x19, 0x02a11030},
7451 {0x1a, 0x02a11040},
7452 {0x1b, 0x01014020},
7453 {0x21, 0x0221101f}),
d06fb562
HW
7454 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
7455 {0x14, 0x90170110},
7456 {0x19, 0x02a11030},
7457 {0x1a, 0x02a11040},
7458 {0x1b, 0x01011020},
7459 {0x21, 0x0221101f}),
c6b17f10
HW
7460 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
7461 {0x14, 0x90170110},
7462 {0x19, 0x02a11020},
7463 {0x1a, 0x02a11030},
7464 {0x21, 0x0221101f}),
f265788c
HW
7465 SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7466 {0x12, 0x90a60140},
7467 {0x14, 0x90170110},
7468 {0x21, 0x02211020}),
7469 SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7470 {0x12, 0x90a60140},
7471 {0x14, 0x90170150},
7472 {0x21, 0x02211020}),
b26e36b7
HW
7473 SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7474 {0x21, 0x02211020}),
0a29c57b
KY
7475 SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7476 {0x12, 0x40000000},
7477 {0x14, 0x90170110},
7478 {0x21, 0x02211020}),
c77900e6 7479 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
c77900e6 7480 {0x14, 0x90170110},
c77900e6 7481 {0x21, 0x02211020}),
86c72d1c
HW
7482 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7483 {0x14, 0x90170130},
7484 {0x21, 0x02211040}),
76c2132e
DH
7485 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7486 {0x12, 0x90a60140},
7487 {0x14, 0x90170110},
76c2132e
DH
7488 {0x21, 0x02211020}),
7489 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7490 {0x12, 0x90a60160},
7491 {0x14, 0x90170120},
76c2132e 7492 {0x21, 0x02211030}),
392c9da2
HW
7493 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7494 {0x14, 0x90170110},
7495 {0x1b, 0x02011020},
7496 {0x21, 0x0221101f}),
6aecd871
HW
7497 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7498 {0x14, 0x90170110},
7499 {0x1b, 0x01011020},
7500 {0x21, 0x0221101f}),
cba59972 7501 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
cba59972 7502 {0x14, 0x90170130},
cba59972 7503 {0x1b, 0x01014020},
cba59972 7504 {0x21, 0x0221103f}),
6aecd871
HW
7505 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7506 {0x14, 0x90170130},
7507 {0x1b, 0x01011020},
7508 {0x21, 0x0221103f}),
59ec4b57
HW
7509 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7510 {0x14, 0x90170130},
7511 {0x1b, 0x02011020},
7512 {0x21, 0x0221103f}),
e9c28e16 7513 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
e9c28e16 7514 {0x14, 0x90170150},
e9c28e16 7515 {0x1b, 0x02011020},
e9c28e16
WS
7516 {0x21, 0x0221105f}),
7517 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
e9c28e16 7518 {0x14, 0x90170110},
e9c28e16 7519 {0x1b, 0x01014020},
e9c28e16 7520 {0x21, 0x0221101f}),
76c2132e
DH
7521 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7522 {0x12, 0x90a60160},
7523 {0x14, 0x90170120},
7524 {0x17, 0x90170140},
76c2132e
DH
7525 {0x21, 0x0321102f}),
7526 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7527 {0x12, 0x90a60160},
7528 {0x14, 0x90170130},
76c2132e
DH
7529 {0x21, 0x02211040}),
7530 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7531 {0x12, 0x90a60160},
7532 {0x14, 0x90170140},
76c2132e
DH
7533 {0x21, 0x02211050}),
7534 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7535 {0x12, 0x90a60170},
7536 {0x14, 0x90170120},
76c2132e
DH
7537 {0x21, 0x02211030}),
7538 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7539 {0x12, 0x90a60170},
7540 {0x14, 0x90170130},
76c2132e 7541 {0x21, 0x02211040}),
0a1f90a9
HW
7542 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7543 {0x12, 0x90a60170},
7544 {0x14, 0x90171130},
7545 {0x21, 0x02211040}),
70658b99 7546 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
70658b99
HW
7547 {0x12, 0x90a60170},
7548 {0x14, 0x90170140},
70658b99 7549 {0x21, 0x02211050}),
9b5a4e39 7550 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5548", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9b5a4e39
DH
7551 {0x12, 0x90a60180},
7552 {0x14, 0x90170130},
9b5a4e39 7553 {0x21, 0x02211040}),
f90d83b3
AK
7554 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5565", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7555 {0x12, 0x90a60180},
7556 {0x14, 0x90170120},
7557 {0x21, 0x02211030}),
989dbe4a
HW
7558 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7559 {0x1b, 0x01011020},
7560 {0x21, 0x02211010}),
285d5ddc
HW
7561 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7562 {0x12, 0x90a60130},
7563 {0x14, 0x90170110},
7564 {0x1b, 0x01011020},
7565 {0x21, 0x0221101f}),
81a1231b 7566 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
81a1231b
KY
7567 {0x12, 0x90a60160},
7568 {0x14, 0x90170120},
81a1231b 7569 {0x21, 0x02211030}),
f83c3292
WS
7570 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7571 {0x12, 0x90a60170},
7572 {0x14, 0x90170120},
7573 {0x21, 0x02211030}),
311042d1
SB
7574 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell Inspiron 5468", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7575 {0x12, 0x90a60180},
7576 {0x14, 0x90170120},
7577 {0x21, 0x02211030}),
3f640970
HW
7578 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7579 {0x12, 0xb7a60130},
7580 {0x14, 0x90170110},
7581 {0x21, 0x02211020}),
3f2f7c55
HW
7582 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7583 {0x12, 0x90a60130},
7584 {0x14, 0x90170110},
7585 {0x14, 0x01011020},
7586 {0x21, 0x0221101f}),
7081adf3 7587 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
11580297 7588 ALC256_STANDARD_PINS),
b26e36b7
HW
7589 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7590 {0x14, 0x90170110},
7591 {0x1b, 0x01011020},
7592 {0x21, 0x0221101f}),
c1732ede
CC
7593 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
7594 {0x14, 0x90170110},
7595 {0x1b, 0x90a70130},
7596 {0x21, 0x04211020}),
7597 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
7598 {0x14, 0x90170110},
7599 {0x1b, 0x90a70130},
7600 {0x21, 0x03211020}),
a806ef1c
CC
7601 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
7602 {0x12, 0x90a60130},
7603 {0x14, 0x90170110},
7604 {0x21, 0x03211020}),
6ac371aa
JHP
7605 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
7606 {0x12, 0x90a60130},
7607 {0x14, 0x90170110},
7608 {0x21, 0x04211020}),
e1037354
JHP
7609 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
7610 {0x1a, 0x90a70130},
7611 {0x1b, 0x90170110},
7612 {0x21, 0x03211020}),
92266651 7613 SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
75ee94b2
HW
7614 {0x12, 0xb7a60130},
7615 {0x13, 0xb8a61140},
7616 {0x16, 0x90170110},
7617 {0x21, 0x04211020}),
cf51eb9d
DH
7618 SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
7619 {0x12, 0x90a60130},
cf51eb9d
DH
7620 {0x14, 0x90170110},
7621 {0x15, 0x0421101f},
11580297 7622 {0x1a, 0x04a11020}),
0279661b
HW
7623 SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED,
7624 {0x12, 0x90a60140},
0279661b
HW
7625 {0x14, 0x90170110},
7626 {0x15, 0x0421101f},
0279661b 7627 {0x18, 0x02811030},
0279661b 7628 {0x1a, 0x04a1103f},
11580297 7629 {0x1b, 0x02011020}),
42304474 7630 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP 15 Touchsmart", ALC269_FIXUP_HP_MUTE_LED_MIC1,
aec856d0 7631 ALC282_STANDARD_PINS,
42304474 7632 {0x12, 0x99a30130},
42304474 7633 {0x19, 0x03a11020},
42304474 7634 {0x21, 0x0321101f}),
2c609999 7635 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
aec856d0 7636 ALC282_STANDARD_PINS,
2c609999 7637 {0x12, 0x99a30130},
2c609999 7638 {0x19, 0x03a11020},
2c609999
HW
7639 {0x21, 0x03211040}),
7640 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
aec856d0 7641 ALC282_STANDARD_PINS,
2c609999 7642 {0x12, 0x99a30130},
2c609999 7643 {0x19, 0x03a11030},
2c609999
HW
7644 {0x21, 0x03211020}),
7645 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
aec856d0 7646 ALC282_STANDARD_PINS,
2c609999 7647 {0x12, 0x99a30130},
2c609999 7648 {0x19, 0x04a11020},
2c609999 7649 {0x21, 0x0421101f}),
200afc09 7650 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED,
aec856d0 7651 ALC282_STANDARD_PINS,
200afc09 7652 {0x12, 0x90a60140},
200afc09 7653 {0x19, 0x04a11030},
200afc09 7654 {0x21, 0x04211020}),
76c2132e 7655 SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
aec856d0 7656 ALC282_STANDARD_PINS,
76c2132e 7657 {0x12, 0x90a60130},
76c2132e
DH
7658 {0x21, 0x0321101f}),
7659 SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
7660 {0x12, 0x90a60160},
7661 {0x14, 0x90170120},
76c2132e 7662 {0x21, 0x02211030}),
bc262179 7663 SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
aec856d0 7664 ALC282_STANDARD_PINS,
bc262179 7665 {0x12, 0x90a60130},
bc262179 7666 {0x19, 0x03a11020},
bc262179 7667 {0x21, 0x0321101f}),
c8c6ee61 7668 SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
c4cfcf6f
HW
7669 {0x12, 0x90a60130},
7670 {0x14, 0x90170110},
7671 {0x19, 0x04a11040},
7672 {0x21, 0x04211020}),
33aaebd4
CC
7673 SND_HDA_PIN_QUIRK(0x10ec0286, 0x1025, "Acer", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
7674 {0x12, 0x90a60130},
7675 {0x17, 0x90170110},
7676 {0x21, 0x02211020}),
d44a6864 7677 SND_HDA_PIN_QUIRK(0x10ec0288, 0x1028, "Dell", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
e1e62b98 7678 {0x12, 0x90a60120},
e1e62b98 7679 {0x14, 0x90170110},
e1e62b98 7680 {0x21, 0x0321101f}),
e4442bcf 7681 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
aec856d0 7682 ALC290_STANDARD_PINS,
e4442bcf 7683 {0x15, 0x04211040},
e4442bcf 7684 {0x18, 0x90170112},
11580297 7685 {0x1a, 0x04a11020}),
e4442bcf 7686 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
aec856d0 7687 ALC290_STANDARD_PINS,
e4442bcf 7688 {0x15, 0x04211040},
e4442bcf 7689 {0x18, 0x90170110},
11580297 7690 {0x1a, 0x04a11020}),
e4442bcf 7691 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
aec856d0 7692 ALC290_STANDARD_PINS,
e4442bcf 7693 {0x15, 0x0421101f},
11580297 7694 {0x1a, 0x04a11020}),
e4442bcf 7695 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
aec856d0 7696 ALC290_STANDARD_PINS,
e4442bcf 7697 {0x15, 0x04211020},
11580297 7698 {0x1a, 0x04a11040}),
e4442bcf 7699 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
aec856d0 7700 ALC290_STANDARD_PINS,
e4442bcf
HW
7701 {0x14, 0x90170110},
7702 {0x15, 0x04211020},
11580297 7703 {0x1a, 0x04a11040}),
e4442bcf 7704 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
aec856d0 7705 ALC290_STANDARD_PINS,
e4442bcf
HW
7706 {0x14, 0x90170110},
7707 {0x15, 0x04211020},
11580297 7708 {0x1a, 0x04a11020}),
e4442bcf 7709 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
aec856d0 7710 ALC290_STANDARD_PINS,
e4442bcf
HW
7711 {0x14, 0x90170110},
7712 {0x15, 0x0421101f},
11580297 7713 {0x1a, 0x04a11020}),
e8818fa8 7714 SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
aec856d0 7715 ALC292_STANDARD_PINS,
e8818fa8 7716 {0x12, 0x90a60140},
e8818fa8 7717 {0x16, 0x01014020},
11580297 7718 {0x19, 0x01a19030}),
e8818fa8 7719 SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
aec856d0 7720 ALC292_STANDARD_PINS,
e8818fa8 7721 {0x12, 0x90a60140},
e8818fa8
HW
7722 {0x16, 0x01014020},
7723 {0x18, 0x02a19031},
11580297 7724 {0x19, 0x01a1903e}),
76c2132e 7725 SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
aec856d0 7726 ALC292_STANDARD_PINS,
11580297 7727 {0x12, 0x90a60140}),
76c2132e 7728 SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
aec856d0 7729 ALC292_STANDARD_PINS,
76c2132e 7730 {0x13, 0x90a60140},
76c2132e 7731 {0x16, 0x21014020},
11580297 7732 {0x19, 0x21a19030}),
e03fdbde 7733 SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
aec856d0 7734 ALC292_STANDARD_PINS,
11580297 7735 {0x13, 0x90a60140}),
d8ae458e
CC
7736 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_MIC,
7737 {0x14, 0x90170110},
7738 {0x1b, 0x90a70130},
7739 {0x21, 0x04211020}),
8bb37a2a
JHP
7740 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
7741 {0x12, 0x90a60130},
7742 {0x17, 0x90170110},
7743 {0x21, 0x03211020}),
0bea4cc8
JHP
7744 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
7745 {0x12, 0x90a60130},
7746 {0x17, 0x90170110},
7747 {0x21, 0x04211020}),
3887c26c
TI
7748 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
7749 {0x12, 0x90a60130},
7750 {0x17, 0x90170110},
7751 {0x21, 0x03211020}),
fbc57129 7752 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
0a29c57b
KY
7753 {0x14, 0x90170110},
7754 {0x21, 0x04211020}),
fbc57129
KY
7755 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
7756 {0x14, 0x90170110},
7757 {0x21, 0x04211030}),
3f640970 7758 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
f771d5bb
HW
7759 ALC295_STANDARD_PINS,
7760 {0x17, 0x21014020},
7761 {0x18, 0x21a19030}),
7762 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
7763 ALC295_STANDARD_PINS,
7764 {0x17, 0x21014040},
7765 {0x18, 0x21a19050}),
3f307834
HW
7766 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
7767 ALC295_STANDARD_PINS),
9f502ff5
TI
7768 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
7769 ALC298_STANDARD_PINS,
7770 {0x17, 0x90170110}),
977e6276 7771 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
703867e2
WS
7772 ALC298_STANDARD_PINS,
7773 {0x17, 0x90170140}),
7774 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
7775 ALC298_STANDARD_PINS,
9f502ff5 7776 {0x17, 0x90170150}),
9f1bc2c4
KHF
7777 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_SPK_VOLUME,
7778 {0x12, 0xb7a60140},
7779 {0x13, 0xb7a60150},
7780 {0x17, 0x90170110},
7781 {0x1a, 0x03011020},
7782 {0x21, 0x03211030}),
54324221
JM
7783 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
7784 {0x12, 0xb7a60140},
7785 {0x17, 0x90170110},
7786 {0x1a, 0x03a11030},
7787 {0x21, 0x03211020}),
fcc6c877
KY
7788 SND_HDA_PIN_QUIRK(0x10ec0299, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
7789 ALC225_STANDARD_PINS,
7790 {0x12, 0xb7a60130},
fcc6c877 7791 {0x17, 0x90170110}),
e1918938
HW
7792 {}
7793};
6dda9f4a 7794
7c0a6939
HW
7795/* This is the fallback pin_fixup_tbl for alc269 family, to make the tbl match
7796 * more machines, don't need to match all valid pins, just need to match
7797 * all the pins defined in the tbl. Just because of this reason, it is possible
7798 * that a single machine matches multiple tbls, so there is one limitation:
7799 * at most one tbl is allowed to define for the same vendor and same codec
7800 */
7801static const struct snd_hda_pin_quirk alc269_fallback_pin_fixup_tbl[] = {
7802 SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
7803 {0x19, 0x40000000},
7804 {0x1b, 0x40000000}),
7805 {}
7806};
7807
546bb678 7808static void alc269_fill_coef(struct hda_codec *codec)
1d045db9 7809{
526af6eb 7810 struct alc_spec *spec = codec->spec;
1d045db9 7811 int val;
ebb83eeb 7812
526af6eb 7813 if (spec->codec_variant != ALC269_TYPE_ALC269VB)
546bb678 7814 return;
526af6eb 7815
1bb7e43e 7816 if ((alc_get_coef0(codec) & 0x00ff) < 0x015) {
1d045db9
TI
7817 alc_write_coef_idx(codec, 0xf, 0x960b);
7818 alc_write_coef_idx(codec, 0xe, 0x8817);
7819 }
ebb83eeb 7820
1bb7e43e 7821 if ((alc_get_coef0(codec) & 0x00ff) == 0x016) {
1d045db9
TI
7822 alc_write_coef_idx(codec, 0xf, 0x960b);
7823 alc_write_coef_idx(codec, 0xe, 0x8814);
7824 }
ebb83eeb 7825
1bb7e43e 7826 if ((alc_get_coef0(codec) & 0x00ff) == 0x017) {
1d045db9 7827 /* Power up output pin */
98b24883 7828 alc_update_coef_idx(codec, 0x04, 0, 1<<11);
1d045db9 7829 }
ebb83eeb 7830
1bb7e43e 7831 if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {
1d045db9 7832 val = alc_read_coef_idx(codec, 0xd);
f3ee07d8 7833 if (val != -1 && (val & 0x0c00) >> 10 != 0x1) {
1d045db9
TI
7834 /* Capless ramp up clock control */
7835 alc_write_coef_idx(codec, 0xd, val | (1<<10));
7836 }
7837 val = alc_read_coef_idx(codec, 0x17);
f3ee07d8 7838 if (val != -1 && (val & 0x01c0) >> 6 != 0x4) {
1d045db9
TI
7839 /* Class D power on reset */
7840 alc_write_coef_idx(codec, 0x17, val | (1<<7));
7841 }
7842 }
ebb83eeb 7843
98b24883
TI
7844 /* HP */
7845 alc_update_coef_idx(codec, 0x4, 0, 1<<11);
1d045db9 7846}
a7f2371f 7847
1d045db9
TI
7848/*
7849 */
1d045db9
TI
7850static int patch_alc269(struct hda_codec *codec)
7851{
7852 struct alc_spec *spec;
3de95173 7853 int err;
f1d4e28b 7854
3de95173 7855 err = alc_alloc_spec(codec, 0x0b);
e16fb6d1 7856 if (err < 0)
3de95173
TI
7857 return err;
7858
7859 spec = codec->spec;
08c189f2 7860 spec->gen.shared_mic_vref_pin = 0x18;
317d9313 7861 codec->power_save_node = 0;
e16fb6d1 7862
225068ab
TI
7863#ifdef CONFIG_PM
7864 codec->patch_ops.suspend = alc269_suspend;
7865 codec->patch_ops.resume = alc269_resume;
7866#endif
c2d6af53
KY
7867 spec->shutup = alc_default_shutup;
7868 spec->init_hook = alc_default_init;
225068ab 7869
7639a06c 7870 switch (codec->core.vendor_id) {
065380f0 7871 case 0x10ec0269:
1d045db9 7872 spec->codec_variant = ALC269_TYPE_ALC269VA;
1bb7e43e
TI
7873 switch (alc_get_coef0(codec) & 0x00f0) {
7874 case 0x0010:
5100cd07
TI
7875 if (codec->bus->pci &&
7876 codec->bus->pci->subsystem_vendor == 0x1025 &&
e16fb6d1 7877 spec->cdefine.platform_type == 1)
20ca0c35 7878 err = alc_codec_rename(codec, "ALC271X");
1d045db9 7879 spec->codec_variant = ALC269_TYPE_ALC269VB;
1bb7e43e
TI
7880 break;
7881 case 0x0020:
5100cd07
TI
7882 if (codec->bus->pci &&
7883 codec->bus->pci->subsystem_vendor == 0x17aa &&
e16fb6d1 7884 codec->bus->pci->subsystem_device == 0x21f3)
20ca0c35 7885 err = alc_codec_rename(codec, "ALC3202");
1d045db9 7886 spec->codec_variant = ALC269_TYPE_ALC269VC;
1bb7e43e 7887 break;
adcc70b2
KY
7888 case 0x0030:
7889 spec->codec_variant = ALC269_TYPE_ALC269VD;
7890 break;
1bb7e43e 7891 default:
1d045db9 7892 alc_fix_pll_init(codec, 0x20, 0x04, 15);
1bb7e43e 7893 }
e16fb6d1
TI
7894 if (err < 0)
7895 goto error;
c2d6af53 7896 spec->shutup = alc269_shutup;
546bb678 7897 spec->init_hook = alc269_fill_coef;
1d045db9 7898 alc269_fill_coef(codec);
065380f0
KY
7899 break;
7900
7901 case 0x10ec0280:
7902 case 0x10ec0290:
7903 spec->codec_variant = ALC269_TYPE_ALC280;
7904 break;
7905 case 0x10ec0282:
065380f0 7906 spec->codec_variant = ALC269_TYPE_ALC282;
7b5c7a02
KY
7907 spec->shutup = alc282_shutup;
7908 spec->init_hook = alc282_init;
065380f0 7909 break;
2af02be7
KY
7910 case 0x10ec0233:
7911 case 0x10ec0283:
7912 spec->codec_variant = ALC269_TYPE_ALC283;
7913 spec->shutup = alc283_shutup;
7914 spec->init_hook = alc283_init;
7915 break;
065380f0
KY
7916 case 0x10ec0284:
7917 case 0x10ec0292:
7918 spec->codec_variant = ALC269_TYPE_ALC284;
7919 break;
161ebf29 7920 case 0x10ec0293:
4731d5de 7921 spec->codec_variant = ALC269_TYPE_ALC293;
161ebf29 7922 break;
7fc7d047 7923 case 0x10ec0286:
7c665932 7924 case 0x10ec0288:
7fc7d047
KY
7925 spec->codec_variant = ALC269_TYPE_ALC286;
7926 break;
506b62c3
KY
7927 case 0x10ec0298:
7928 spec->codec_variant = ALC269_TYPE_ALC298;
7929 break;
ea04a1db 7930 case 0x10ec0235:
1d04c9de
KY
7931 case 0x10ec0255:
7932 spec->codec_variant = ALC269_TYPE_ALC255;
ab3b8e51
KY
7933 spec->shutup = alc256_shutup;
7934 spec->init_hook = alc256_init;
1d04c9de 7935 break;
736f20a7 7936 case 0x10ec0236:
4344aec8
KY
7937 case 0x10ec0256:
7938 spec->codec_variant = ALC269_TYPE_ALC256;
4a219ef8
KY
7939 spec->shutup = alc256_shutup;
7940 spec->init_hook = alc256_init;
7d1b6e29 7941 spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */
4344aec8 7942 break;
f429e7e4
KY
7943 case 0x10ec0257:
7944 spec->codec_variant = ALC269_TYPE_ALC257;
88d42b2b
KY
7945 spec->shutup = alc256_shutup;
7946 spec->init_hook = alc256_init;
f429e7e4
KY
7947 spec->gen.mixer_nid = 0;
7948 break;
0a6f0600
KY
7949 case 0x10ec0215:
7950 case 0x10ec0285:
7951 case 0x10ec0289:
7952 spec->codec_variant = ALC269_TYPE_ALC215;
1b6832be
KY
7953 spec->shutup = alc225_shutup;
7954 spec->init_hook = alc225_init;
0a6f0600
KY
7955 spec->gen.mixer_nid = 0;
7956 break;
4231430d 7957 case 0x10ec0225:
7d727869 7958 case 0x10ec0295:
28f1f9b2 7959 case 0x10ec0299:
4231430d 7960 spec->codec_variant = ALC269_TYPE_ALC225;
da911b1f
KY
7961 spec->shutup = alc225_shutup;
7962 spec->init_hook = alc225_init;
c1350bff 7963 spec->gen.mixer_nid = 0; /* no loopback on ALC225, ALC295 and ALC299 */
4231430d 7964 break;
dcd4f0db
KY
7965 case 0x10ec0234:
7966 case 0x10ec0274:
7967 case 0x10ec0294:
7968 spec->codec_variant = ALC269_TYPE_ALC294;
532a7784 7969 spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */
71683c32 7970 alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */
693abe11 7971 spec->init_hook = alc294_init;
dcd4f0db 7972 break;
1078bef0
KY
7973 case 0x10ec0300:
7974 spec->codec_variant = ALC269_TYPE_ALC300;
7975 spec->gen.mixer_nid = 0; /* no loopback on ALC300 */
dcd4f0db 7976 break;
6fbae35a
KY
7977 case 0x10ec0700:
7978 case 0x10ec0701:
7979 case 0x10ec0703:
7980 spec->codec_variant = ALC269_TYPE_ALC700;
7981 spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */
2d7fe618 7982 alc_update_coef_idx(codec, 0x4a, 1 << 15, 0); /* Combo jack auto trigger control */
693abe11 7983 spec->init_hook = alc294_init;
6fbae35a
KY
7984 break;
7985
1d045db9 7986 }
6dda9f4a 7987
ad60d502 7988 if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) {
97a26570 7989 spec->has_alc5505_dsp = 1;
ad60d502
KY
7990 spec->init_hook = alc5505_dsp_init;
7991 }
7992
c9af753f
TI
7993 alc_pre_init(codec);
7994
efe55732
TI
7995 snd_hda_pick_fixup(codec, alc269_fixup_models,
7996 alc269_fixup_tbl, alc269_fixups);
0fc1e447 7997 snd_hda_pick_pin_fixup(codec, alc269_pin_fixup_tbl, alc269_fixups, true);
7c0a6939 7998 snd_hda_pick_pin_fixup(codec, alc269_fallback_pin_fixup_tbl, alc269_fixups, false);
efe55732
TI
7999 snd_hda_pick_fixup(codec, NULL, alc269_fixup_vendor_tbl,
8000 alc269_fixups);
8001 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
8002
8003 alc_auto_parse_customize_define(codec);
8004
8005 if (has_cdefine_beep(codec))
8006 spec->gen.beep_nid = 0x01;
8007
a4297b5d
TI
8008 /* automatic parse from the BIOS config */
8009 err = alc269_parse_auto_config(codec);
e16fb6d1
TI
8010 if (err < 0)
8011 goto error;
6dda9f4a 8012
fea80fae
TI
8013 if (!spec->gen.no_analog && spec->gen.beep_nid && spec->gen.mixer_nid) {
8014 err = set_beep_amp(spec, spec->gen.mixer_nid, 0x04, HDA_INPUT);
8015 if (err < 0)
8016 goto error;
8017 }
f1d4e28b 8018
1727a771 8019 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
589876e2 8020
1d045db9 8021 return 0;
e16fb6d1
TI
8022
8023 error:
8024 alc_free(codec);
8025 return err;
1d045db9 8026}
f1d4e28b 8027
1d045db9
TI
8028/*
8029 * ALC861
8030 */
622e84cd 8031
1d045db9 8032static int alc861_parse_auto_config(struct hda_codec *codec)
6dda9f4a 8033{
1d045db9 8034 static const hda_nid_t alc861_ignore[] = { 0x1d, 0 };
3e6179b8
TI
8035 static const hda_nid_t alc861_ssids[] = { 0x0e, 0x0f, 0x0b, 0 };
8036 return alc_parse_auto_config(codec, alc861_ignore, alc861_ssids);
604401a9
TI
8037}
8038
1d045db9
TI
8039/* Pin config fixes */
8040enum {
e652f4c8
TI
8041 ALC861_FIXUP_FSC_AMILO_PI1505,
8042 ALC861_FIXUP_AMP_VREF_0F,
8043 ALC861_FIXUP_NO_JACK_DETECT,
8044 ALC861_FIXUP_ASUS_A6RP,
6ddf0fd1 8045 ALC660_FIXUP_ASUS_W7J,
1d045db9 8046};
7085ec12 8047
31150f23
TI
8048/* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */
8049static void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec,
1727a771 8050 const struct hda_fixup *fix, int action)
31150f23
TI
8051{
8052 struct alc_spec *spec = codec->spec;
8053 unsigned int val;
8054
1727a771 8055 if (action != HDA_FIXUP_ACT_INIT)
31150f23 8056 return;
d3f02d60 8057 val = snd_hda_codec_get_pin_target(codec, 0x0f);
31150f23
TI
8058 if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)))
8059 val |= AC_PINCTL_IN_EN;
8060 val |= AC_PINCTL_VREF_50;
cdd03ced 8061 snd_hda_set_pin_ctl(codec, 0x0f, val);
08c189f2 8062 spec->gen.keep_vref_in_automute = 1;
31150f23
TI
8063}
8064
e652f4c8
TI
8065/* suppress the jack-detection */
8066static void alc_fixup_no_jack_detect(struct hda_codec *codec,
1727a771 8067 const struct hda_fixup *fix, int action)
e652f4c8 8068{
1727a771 8069 if (action == HDA_FIXUP_ACT_PRE_PROBE)
e652f4c8 8070 codec->no_jack_detect = 1;
7d7eb9ea 8071}
e652f4c8 8072
1727a771 8073static const struct hda_fixup alc861_fixups[] = {
e652f4c8 8074 [ALC861_FIXUP_FSC_AMILO_PI1505] = {
1727a771
TI
8075 .type = HDA_FIXUP_PINS,
8076 .v.pins = (const struct hda_pintbl[]) {
1d045db9
TI
8077 { 0x0b, 0x0221101f }, /* HP */
8078 { 0x0f, 0x90170310 }, /* speaker */
8079 { }
8080 }
8081 },
e652f4c8 8082 [ALC861_FIXUP_AMP_VREF_0F] = {
1727a771 8083 .type = HDA_FIXUP_FUNC,
31150f23 8084 .v.func = alc861_fixup_asus_amp_vref_0f,
3b25eb69 8085 },
e652f4c8 8086 [ALC861_FIXUP_NO_JACK_DETECT] = {
1727a771 8087 .type = HDA_FIXUP_FUNC,
e652f4c8
TI
8088 .v.func = alc_fixup_no_jack_detect,
8089 },
8090 [ALC861_FIXUP_ASUS_A6RP] = {
1727a771 8091 .type = HDA_FIXUP_FUNC,
e652f4c8
TI
8092 .v.func = alc861_fixup_asus_amp_vref_0f,
8093 .chained = true,
8094 .chain_id = ALC861_FIXUP_NO_JACK_DETECT,
6ddf0fd1
TI
8095 },
8096 [ALC660_FIXUP_ASUS_W7J] = {
8097 .type = HDA_FIXUP_VERBS,
8098 .v.verbs = (const struct hda_verb[]) {
8099 /* ASUS W7J needs a magic pin setup on unused NID 0x10
8100 * for enabling outputs
8101 */
8102 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
8103 { }
8104 },
e652f4c8 8105 }
1d045db9 8106};
7085ec12 8107
1d045db9 8108static const struct snd_pci_quirk alc861_fixup_tbl[] = {
6ddf0fd1 8109 SND_PCI_QUIRK(0x1043, 0x1253, "ASUS W7J", ALC660_FIXUP_ASUS_W7J),
e7ca237b 8110 SND_PCI_QUIRK(0x1043, 0x1263, "ASUS Z35HL", ALC660_FIXUP_ASUS_W7J),
e652f4c8
TI
8111 SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP),
8112 SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", ALC861_FIXUP_AMP_VREF_0F),
8113 SND_PCI_QUIRK(0x1462, 0x7254, "HP DX2200", ALC861_FIXUP_NO_JACK_DETECT),
8114 SND_PCI_QUIRK(0x1584, 0x2b01, "Haier W18", ALC861_FIXUP_AMP_VREF_0F),
8115 SND_PCI_QUIRK(0x1584, 0x0000, "Uniwill ECS M31EI", ALC861_FIXUP_AMP_VREF_0F),
8116 SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", ALC861_FIXUP_FSC_AMILO_PI1505),
1d045db9
TI
8117 {}
8118};
3af9ee6b 8119
1d045db9
TI
8120/*
8121 */
1d045db9 8122static int patch_alc861(struct hda_codec *codec)
7085ec12 8123{
1d045db9 8124 struct alc_spec *spec;
1d045db9 8125 int err;
7085ec12 8126
3de95173
TI
8127 err = alc_alloc_spec(codec, 0x15);
8128 if (err < 0)
8129 return err;
1d045db9 8130
3de95173 8131 spec = codec->spec;
2722b535
TI
8132 if (has_cdefine_beep(codec))
8133 spec->gen.beep_nid = 0x23;
1d045db9 8134
225068ab
TI
8135#ifdef CONFIG_PM
8136 spec->power_hook = alc_power_eapd;
8137#endif
8138
c9af753f
TI
8139 alc_pre_init(codec);
8140
1727a771
TI
8141 snd_hda_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);
8142 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
3af9ee6b 8143
cb4e4824
TI
8144 /* automatic parse from the BIOS config */
8145 err = alc861_parse_auto_config(codec);
e16fb6d1
TI
8146 if (err < 0)
8147 goto error;
3af9ee6b 8148
fea80fae
TI
8149 if (!spec->gen.no_analog) {
8150 err = set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
8151 if (err < 0)
8152 goto error;
8153 }
7085ec12 8154
1727a771 8155 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
589876e2 8156
1d045db9 8157 return 0;
e16fb6d1
TI
8158
8159 error:
8160 alc_free(codec);
8161 return err;
7085ec12
TI
8162}
8163
1d045db9
TI
8164/*
8165 * ALC861-VD support
8166 *
8167 * Based on ALC882
8168 *
8169 * In addition, an independent DAC
8170 */
1d045db9 8171static int alc861vd_parse_auto_config(struct hda_codec *codec)
bc9f98a9 8172{
1d045db9 8173 static const hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
3e6179b8
TI
8174 static const hda_nid_t alc861vd_ssids[] = { 0x15, 0x1b, 0x14, 0 };
8175 return alc_parse_auto_config(codec, alc861vd_ignore, alc861vd_ssids);
ce764ab2
TI
8176}
8177
1d045db9 8178enum {
8fdcb6fe
TI
8179 ALC660VD_FIX_ASUS_GPIO1,
8180 ALC861VD_FIX_DALLAS,
1d045db9 8181};
ce764ab2 8182
8fdcb6fe
TI
8183/* exclude VREF80 */
8184static void alc861vd_fixup_dallas(struct hda_codec *codec,
1727a771 8185 const struct hda_fixup *fix, int action)
8fdcb6fe 8186{
1727a771 8187 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
b78562b1
TI
8188 snd_hda_override_pin_caps(codec, 0x18, 0x00000734);
8189 snd_hda_override_pin_caps(codec, 0x19, 0x0000073c);
8fdcb6fe
TI
8190 }
8191}
8192
df73d83f
TI
8193/* reset GPIO1 */
8194static void alc660vd_fixup_asus_gpio1(struct hda_codec *codec,
8195 const struct hda_fixup *fix, int action)
8196{
8197 struct alc_spec *spec = codec->spec;
8198
8199 if (action == HDA_FIXUP_ACT_PRE_PROBE)
8200 spec->gpio_mask |= 0x02;
8201 alc_fixup_gpio(codec, action, 0x01);
8202}
8203
1727a771 8204static const struct hda_fixup alc861vd_fixups[] = {
1d045db9 8205 [ALC660VD_FIX_ASUS_GPIO1] = {
df73d83f
TI
8206 .type = HDA_FIXUP_FUNC,
8207 .v.func = alc660vd_fixup_asus_gpio1,
1d045db9 8208 },
8fdcb6fe 8209 [ALC861VD_FIX_DALLAS] = {
1727a771 8210 .type = HDA_FIXUP_FUNC,
8fdcb6fe
TI
8211 .v.func = alc861vd_fixup_dallas,
8212 },
1d045db9 8213};
ce764ab2 8214
1d045db9 8215static const struct snd_pci_quirk alc861vd_fixup_tbl[] = {
8fdcb6fe 8216 SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_FIX_DALLAS),
1d045db9 8217 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
8fdcb6fe 8218 SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_FIX_DALLAS),
1d045db9
TI
8219 {}
8220};
ce764ab2 8221
1d045db9
TI
8222/*
8223 */
1d045db9 8224static int patch_alc861vd(struct hda_codec *codec)
ce764ab2 8225{
1d045db9 8226 struct alc_spec *spec;
cb4e4824 8227 int err;
ce764ab2 8228
3de95173
TI
8229 err = alc_alloc_spec(codec, 0x0b);
8230 if (err < 0)
8231 return err;
1d045db9 8232
3de95173 8233 spec = codec->spec;
2722b535
TI
8234 if (has_cdefine_beep(codec))
8235 spec->gen.beep_nid = 0x23;
1d045db9 8236
225068ab
TI
8237 spec->shutup = alc_eapd_shutup;
8238
c9af753f
TI
8239 alc_pre_init(codec);
8240
1727a771
TI
8241 snd_hda_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);
8242 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1d045db9 8243
cb4e4824
TI
8244 /* automatic parse from the BIOS config */
8245 err = alc861vd_parse_auto_config(codec);
e16fb6d1
TI
8246 if (err < 0)
8247 goto error;
ce764ab2 8248
fea80fae
TI
8249 if (!spec->gen.no_analog) {
8250 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
8251 if (err < 0)
8252 goto error;
8253 }
1d045db9 8254
1727a771 8255 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
589876e2 8256
ce764ab2 8257 return 0;
e16fb6d1
TI
8258
8259 error:
8260 alc_free(codec);
8261 return err;
ce764ab2
TI
8262}
8263
1d045db9
TI
8264/*
8265 * ALC662 support
8266 *
8267 * ALC662 is almost identical with ALC880 but has cleaner and more flexible
8268 * configuration. Each pin widget can choose any input DACs and a mixer.
8269 * Each ADC is connected from a mixer of all inputs. This makes possible
8270 * 6-channel independent captures.
8271 *
8272 * In addition, an independent DAC for the multi-playback (not used in this
8273 * driver yet).
8274 */
1d045db9
TI
8275
8276/*
8277 * BIOS auto configuration
8278 */
8279
bc9f98a9
KY
8280static int alc662_parse_auto_config(struct hda_codec *codec)
8281{
4c6d72d1 8282 static const hda_nid_t alc662_ignore[] = { 0x1d, 0 };
3e6179b8
TI
8283 static const hda_nid_t alc663_ssids[] = { 0x15, 0x1b, 0x14, 0x21 };
8284 static const hda_nid_t alc662_ssids[] = { 0x15, 0x1b, 0x14, 0 };
8285 const hda_nid_t *ssids;
ee979a14 8286
7639a06c
TI
8287 if (codec->core.vendor_id == 0x10ec0272 || codec->core.vendor_id == 0x10ec0663 ||
8288 codec->core.vendor_id == 0x10ec0665 || codec->core.vendor_id == 0x10ec0670 ||
8289 codec->core.vendor_id == 0x10ec0671)
3e6179b8 8290 ssids = alc663_ssids;
6227cdce 8291 else
3e6179b8
TI
8292 ssids = alc662_ssids;
8293 return alc_parse_auto_config(codec, alc662_ignore, ssids);
bc9f98a9
KY
8294}
8295
6be7948f 8296static void alc272_fixup_mario(struct hda_codec *codec,
1727a771 8297 const struct hda_fixup *fix, int action)
6fc398cb 8298{
9bb1f06f 8299 if (action != HDA_FIXUP_ACT_PRE_PROBE)
6fc398cb 8300 return;
6be7948f
TB
8301 if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
8302 (0x3b << AC_AMPCAP_OFFSET_SHIFT) |
8303 (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |
8304 (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |
8305 (0 << AC_AMPCAP_MUTE_SHIFT)))
4e76a883 8306 codec_warn(codec, "failed to override amp caps for NID 0x2\n");
6be7948f
TB
8307}
8308
8e383953
TI
8309static const struct snd_pcm_chmap_elem asus_pcm_2_1_chmaps[] = {
8310 { .channels = 2,
8311 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
8312 { .channels = 4,
8313 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
8314 SNDRV_CHMAP_NA, SNDRV_CHMAP_LFE } }, /* LFE only on right */
8315 { }
8316};
8317
8318/* override the 2.1 chmap */
eb9ca3ab 8319static void alc_fixup_bass_chmap(struct hda_codec *codec,
8e383953
TI
8320 const struct hda_fixup *fix, int action)
8321{
8322 if (action == HDA_FIXUP_ACT_BUILD) {
8323 struct alc_spec *spec = codec->spec;
bbbc7e85 8324 spec->gen.pcm_rec[0]->stream[0].chmap = asus_pcm_2_1_chmaps;
8e383953
TI
8325 }
8326}
8327
bf68665d
TI
8328/* avoid D3 for keeping GPIO up */
8329static unsigned int gpio_led_power_filter(struct hda_codec *codec,
8330 hda_nid_t nid,
8331 unsigned int power_state)
8332{
8333 struct alc_spec *spec = codec->spec;
d261eec8 8334 if (nid == codec->core.afg && power_state == AC_PWRST_D3 && spec->gpio_data)
bf68665d
TI
8335 return AC_PWRST_D0;
8336 return power_state;
8337}
8338
3e887f37
TI
8339static void alc662_fixup_led_gpio1(struct hda_codec *codec,
8340 const struct hda_fixup *fix, int action)
8341{
8342 struct alc_spec *spec = codec->spec;
3e887f37 8343
01e4a275 8344 alc_fixup_hp_gpio_led(codec, action, 0x01, 0);
3e887f37 8345 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
0f32fd19 8346 spec->mute_led_polarity = 1;
bf68665d 8347 codec->power_filter = gpio_led_power_filter;
3e887f37
TI
8348 }
8349}
8350
c6790c8e
KY
8351static void alc662_usi_automute_hook(struct hda_codec *codec,
8352 struct hda_jack_callback *jack)
8353{
8354 struct alc_spec *spec = codec->spec;
8355 int vref;
8356 msleep(200);
8357 snd_hda_gen_hp_automute(codec, jack);
8358
8359 vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
8360 msleep(100);
8361 snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
8362 vref);
8363}
8364
8365static void alc662_fixup_usi_headset_mic(struct hda_codec *codec,
8366 const struct hda_fixup *fix, int action)
8367{
8368 struct alc_spec *spec = codec->spec;
8369 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
8370 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
8371 spec->gen.hp_automute_hook = alc662_usi_automute_hook;
8372 }
8373}
8374
00066e97
SB
8375static void alc662_aspire_ethos_mute_speakers(struct hda_codec *codec,
8376 struct hda_jack_callback *cb)
8377{
8378 /* surround speakers at 0x1b already get muted automatically when
8379 * headphones are plugged in, but we have to mute/unmute the remaining
8380 * channels manually:
8381 * 0x15 - front left/front right
8382 * 0x18 - front center/ LFE
8383 */
8384 if (snd_hda_jack_detect_state(codec, 0x1b) == HDA_JACK_PRESENT) {
8385 snd_hda_set_pin_ctl_cache(codec, 0x15, 0);
8386 snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
8387 } else {
8388 snd_hda_set_pin_ctl_cache(codec, 0x15, PIN_OUT);
8389 snd_hda_set_pin_ctl_cache(codec, 0x18, PIN_OUT);
8390 }
8391}
8392
8393static void alc662_fixup_aspire_ethos_hp(struct hda_codec *codec,
8394 const struct hda_fixup *fix, int action)
8395{
8396 /* Pin 0x1b: shared headphones jack and surround speakers */
8397 if (!is_jack_detectable(codec, 0x1b))
8398 return;
8399
8400 switch (action) {
8401 case HDA_FIXUP_ACT_PRE_PROBE:
8402 snd_hda_jack_detect_enable_callback(codec, 0x1b,
8403 alc662_aspire_ethos_mute_speakers);
8404 break;
8405 case HDA_FIXUP_ACT_INIT:
8406 /* Make sure to start in a correct state, i.e. if
8407 * headphones have been plugged in before powering up the system
8408 */
8409 alc662_aspire_ethos_mute_speakers(codec, NULL);
8410 break;
8411 }
8412}
8413
f3f9185f
KY
8414static struct coef_fw alc668_coefs[] = {
8415 WRITE_COEF(0x01, 0xbebe), WRITE_COEF(0x02, 0xaaaa), WRITE_COEF(0x03, 0x0),
8416 WRITE_COEF(0x04, 0x0180), WRITE_COEF(0x06, 0x0), WRITE_COEF(0x07, 0x0f80),
8417 WRITE_COEF(0x08, 0x0031), WRITE_COEF(0x0a, 0x0060), WRITE_COEF(0x0b, 0x0),
8418 WRITE_COEF(0x0c, 0x7cf7), WRITE_COEF(0x0d, 0x1080), WRITE_COEF(0x0e, 0x7f7f),
8419 WRITE_COEF(0x0f, 0xcccc), WRITE_COEF(0x10, 0xddcc), WRITE_COEF(0x11, 0x0001),
8420 WRITE_COEF(0x13, 0x0), WRITE_COEF(0x14, 0x2aa0), WRITE_COEF(0x17, 0xa940),
8421 WRITE_COEF(0x19, 0x0), WRITE_COEF(0x1a, 0x0), WRITE_COEF(0x1b, 0x0),
8422 WRITE_COEF(0x1c, 0x0), WRITE_COEF(0x1d, 0x0), WRITE_COEF(0x1e, 0x7418),
8423 WRITE_COEF(0x1f, 0x0804), WRITE_COEF(0x20, 0x4200), WRITE_COEF(0x21, 0x0468),
8424 WRITE_COEF(0x22, 0x8ccc), WRITE_COEF(0x23, 0x0250), WRITE_COEF(0x24, 0x7418),
8425 WRITE_COEF(0x27, 0x0), WRITE_COEF(0x28, 0x8ccc), WRITE_COEF(0x2a, 0xff00),
8426 WRITE_COEF(0x2b, 0x8000), WRITE_COEF(0xa7, 0xff00), WRITE_COEF(0xa8, 0x8000),
8427 WRITE_COEF(0xaa, 0x2e17), WRITE_COEF(0xab, 0xa0c0), WRITE_COEF(0xac, 0x0),
8428 WRITE_COEF(0xad, 0x0), WRITE_COEF(0xae, 0x2ac6), WRITE_COEF(0xaf, 0xa480),
8429 WRITE_COEF(0xb0, 0x0), WRITE_COEF(0xb1, 0x0), WRITE_COEF(0xb2, 0x0),
8430 WRITE_COEF(0xb3, 0x0), WRITE_COEF(0xb4, 0x0), WRITE_COEF(0xb5, 0x1040),
8431 WRITE_COEF(0xb6, 0xd697), WRITE_COEF(0xb7, 0x902b), WRITE_COEF(0xb8, 0xd697),
8432 WRITE_COEF(0xb9, 0x902b), WRITE_COEF(0xba, 0xb8ba), WRITE_COEF(0xbb, 0xaaab),
8433 WRITE_COEF(0xbc, 0xaaaf), WRITE_COEF(0xbd, 0x6aaa), WRITE_COEF(0xbe, 0x1c02),
8434 WRITE_COEF(0xc0, 0x00ff), WRITE_COEF(0xc1, 0x0fa6),
8435 {}
8436};
8437
8438static void alc668_restore_default_value(struct hda_codec *codec)
8439{
8440 alc_process_coef_fw(codec, alc668_coefs);
8441}
8442
6cb3b707 8443enum {
2df03514 8444 ALC662_FIXUP_ASPIRE,
3e887f37 8445 ALC662_FIXUP_LED_GPIO1,
6cb3b707 8446 ALC662_FIXUP_IDEAPAD,
6be7948f 8447 ALC272_FIXUP_MARIO,
d2ebd479 8448 ALC662_FIXUP_CZC_P10T,
94024cd1 8449 ALC662_FIXUP_SKU_IGNORE,
e59ea3ed 8450 ALC662_FIXUP_HP_RP5800,
53c334ad
TI
8451 ALC662_FIXUP_ASUS_MODE1,
8452 ALC662_FIXUP_ASUS_MODE2,
8453 ALC662_FIXUP_ASUS_MODE3,
8454 ALC662_FIXUP_ASUS_MODE4,
8455 ALC662_FIXUP_ASUS_MODE5,
8456 ALC662_FIXUP_ASUS_MODE6,
8457 ALC662_FIXUP_ASUS_MODE7,
8458 ALC662_FIXUP_ASUS_MODE8,
1565cc35 8459 ALC662_FIXUP_NO_JACK_DETECT,
edfe3bfc 8460 ALC662_FIXUP_ZOTAC_Z68,
125821ae 8461 ALC662_FIXUP_INV_DMIC,
1f8b46cd 8462 ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
73bdd597 8463 ALC668_FIXUP_DELL_MIC_NO_PRESENCE,
1f8b46cd 8464 ALC662_FIXUP_HEADSET_MODE,
73bdd597 8465 ALC668_FIXUP_HEADSET_MODE,
8e54b4ac 8466 ALC662_FIXUP_BASS_MODE4_CHMAP,
61a75f13 8467 ALC662_FIXUP_BASS_16,
a30c9aaa 8468 ALC662_FIXUP_BASS_1A,
8e54b4ac 8469 ALC662_FIXUP_BASS_CHMAP,
493a52a9 8470 ALC668_FIXUP_AUTO_MUTE,
5e6db669 8471 ALC668_FIXUP_DELL_DISABLE_AAMIX,
033b0a7c 8472 ALC668_FIXUP_DELL_XPS13,
9d4dc584 8473 ALC662_FIXUP_ASUS_Nx50,
fc7438b1 8474 ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
3231e205 8475 ALC668_FIXUP_ASUS_Nx51,
5b7c5e1f 8476 ALC668_FIXUP_MIC_COEF,
11ba6111 8477 ALC668_FIXUP_ASUS_G751,
78f4f7c2
KY
8478 ALC891_FIXUP_HEADSET_MODE,
8479 ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
9b51fe3e 8480 ALC662_FIXUP_ACER_VERITON,
1a3f0991 8481 ALC892_FIXUP_ASROCK_MOBO,
c6790c8e
KY
8482 ALC662_FIXUP_USI_FUNC,
8483 ALC662_FIXUP_USI_HEADSET_MODE,
ca169cc2 8484 ALC662_FIXUP_LENOVO_MULTI_CODECS,
00066e97
SB
8485 ALC669_FIXUP_ACER_ASPIRE_ETHOS,
8486 ALC669_FIXUP_ACER_ASPIRE_ETHOS_SUBWOOFER,
8487 ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET,
6cb3b707
DH
8488};
8489
1727a771 8490static const struct hda_fixup alc662_fixups[] = {
2df03514 8491 [ALC662_FIXUP_ASPIRE] = {
1727a771
TI
8492 .type = HDA_FIXUP_PINS,
8493 .v.pins = (const struct hda_pintbl[]) {
2df03514
DC
8494 { 0x15, 0x99130112 }, /* subwoofer */
8495 { }
8496 }
8497 },
3e887f37
TI
8498 [ALC662_FIXUP_LED_GPIO1] = {
8499 .type = HDA_FIXUP_FUNC,
8500 .v.func = alc662_fixup_led_gpio1,
8501 },
6cb3b707 8502 [ALC662_FIXUP_IDEAPAD] = {
1727a771
TI
8503 .type = HDA_FIXUP_PINS,
8504 .v.pins = (const struct hda_pintbl[]) {
6cb3b707
DH
8505 { 0x17, 0x99130112 }, /* subwoofer */
8506 { }
3e887f37
TI
8507 },
8508 .chained = true,
8509 .chain_id = ALC662_FIXUP_LED_GPIO1,
6cb3b707 8510 },
6be7948f 8511 [ALC272_FIXUP_MARIO] = {
1727a771 8512 .type = HDA_FIXUP_FUNC,
b5bfbc67 8513 .v.func = alc272_fixup_mario,
d2ebd479
AA
8514 },
8515 [ALC662_FIXUP_CZC_P10T] = {
1727a771 8516 .type = HDA_FIXUP_VERBS,
d2ebd479
AA
8517 .v.verbs = (const struct hda_verb[]) {
8518 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
8519 {}
8520 }
8521 },
94024cd1 8522 [ALC662_FIXUP_SKU_IGNORE] = {
1727a771 8523 .type = HDA_FIXUP_FUNC,
23d30f28 8524 .v.func = alc_fixup_sku_ignore,
c6b35874 8525 },
e59ea3ed 8526 [ALC662_FIXUP_HP_RP5800] = {
1727a771
TI
8527 .type = HDA_FIXUP_PINS,
8528 .v.pins = (const struct hda_pintbl[]) {
e59ea3ed
TI
8529 { 0x14, 0x0221201f }, /* HP out */
8530 { }
8531 },
8532 .chained = true,
8533 .chain_id = ALC662_FIXUP_SKU_IGNORE
8534 },
53c334ad 8535 [ALC662_FIXUP_ASUS_MODE1] = {
1727a771
TI
8536 .type = HDA_FIXUP_PINS,
8537 .v.pins = (const struct hda_pintbl[]) {
53c334ad
TI
8538 { 0x14, 0x99130110 }, /* speaker */
8539 { 0x18, 0x01a19c20 }, /* mic */
8540 { 0x19, 0x99a3092f }, /* int-mic */
8541 { 0x21, 0x0121401f }, /* HP out */
8542 { }
8543 },
8544 .chained = true,
8545 .chain_id = ALC662_FIXUP_SKU_IGNORE
8546 },
8547 [ALC662_FIXUP_ASUS_MODE2] = {
1727a771
TI
8548 .type = HDA_FIXUP_PINS,
8549 .v.pins = (const struct hda_pintbl[]) {
2996bdba
TI
8550 { 0x14, 0x99130110 }, /* speaker */
8551 { 0x18, 0x01a19820 }, /* mic */
8552 { 0x19, 0x99a3092f }, /* int-mic */
8553 { 0x1b, 0x0121401f }, /* HP out */
8554 { }
8555 },
53c334ad
TI
8556 .chained = true,
8557 .chain_id = ALC662_FIXUP_SKU_IGNORE
8558 },
8559 [ALC662_FIXUP_ASUS_MODE3] = {
1727a771
TI
8560 .type = HDA_FIXUP_PINS,
8561 .v.pins = (const struct hda_pintbl[]) {
53c334ad
TI
8562 { 0x14, 0x99130110 }, /* speaker */
8563 { 0x15, 0x0121441f }, /* HP */
8564 { 0x18, 0x01a19840 }, /* mic */
8565 { 0x19, 0x99a3094f }, /* int-mic */
8566 { 0x21, 0x01211420 }, /* HP2 */
8567 { }
8568 },
8569 .chained = true,
8570 .chain_id = ALC662_FIXUP_SKU_IGNORE
8571 },
8572 [ALC662_FIXUP_ASUS_MODE4] = {
1727a771
TI
8573 .type = HDA_FIXUP_PINS,
8574 .v.pins = (const struct hda_pintbl[]) {
53c334ad
TI
8575 { 0x14, 0x99130110 }, /* speaker */
8576 { 0x16, 0x99130111 }, /* speaker */
8577 { 0x18, 0x01a19840 }, /* mic */
8578 { 0x19, 0x99a3094f }, /* int-mic */
8579 { 0x21, 0x0121441f }, /* HP */
8580 { }
8581 },
8582 .chained = true,
8583 .chain_id = ALC662_FIXUP_SKU_IGNORE
8584 },
8585 [ALC662_FIXUP_ASUS_MODE5] = {
1727a771
TI
8586 .type = HDA_FIXUP_PINS,
8587 .v.pins = (const struct hda_pintbl[]) {
53c334ad
TI
8588 { 0x14, 0x99130110 }, /* speaker */
8589 { 0x15, 0x0121441f }, /* HP */
8590 { 0x16, 0x99130111 }, /* speaker */
8591 { 0x18, 0x01a19840 }, /* mic */
8592 { 0x19, 0x99a3094f }, /* int-mic */
8593 { }
8594 },
8595 .chained = true,
8596 .chain_id = ALC662_FIXUP_SKU_IGNORE
8597 },
8598 [ALC662_FIXUP_ASUS_MODE6] = {
1727a771
TI
8599 .type = HDA_FIXUP_PINS,
8600 .v.pins = (const struct hda_pintbl[]) {
53c334ad
TI
8601 { 0x14, 0x99130110 }, /* speaker */
8602 { 0x15, 0x01211420 }, /* HP2 */
8603 { 0x18, 0x01a19840 }, /* mic */
8604 { 0x19, 0x99a3094f }, /* int-mic */
8605 { 0x1b, 0x0121441f }, /* HP */
8606 { }
8607 },
8608 .chained = true,
8609 .chain_id = ALC662_FIXUP_SKU_IGNORE
8610 },
8611 [ALC662_FIXUP_ASUS_MODE7] = {
1727a771
TI
8612 .type = HDA_FIXUP_PINS,
8613 .v.pins = (const struct hda_pintbl[]) {
53c334ad
TI
8614 { 0x14, 0x99130110 }, /* speaker */
8615 { 0x17, 0x99130111 }, /* speaker */
8616 { 0x18, 0x01a19840 }, /* mic */
8617 { 0x19, 0x99a3094f }, /* int-mic */
8618 { 0x1b, 0x01214020 }, /* HP */
8619 { 0x21, 0x0121401f }, /* HP */
8620 { }
8621 },
8622 .chained = true,
8623 .chain_id = ALC662_FIXUP_SKU_IGNORE
8624 },
8625 [ALC662_FIXUP_ASUS_MODE8] = {
1727a771
TI
8626 .type = HDA_FIXUP_PINS,
8627 .v.pins = (const struct hda_pintbl[]) {
53c334ad
TI
8628 { 0x14, 0x99130110 }, /* speaker */
8629 { 0x12, 0x99a30970 }, /* int-mic */
8630 { 0x15, 0x01214020 }, /* HP */
8631 { 0x17, 0x99130111 }, /* speaker */
8632 { 0x18, 0x01a19840 }, /* mic */
8633 { 0x21, 0x0121401f }, /* HP */
8634 { }
8635 },
8636 .chained = true,
8637 .chain_id = ALC662_FIXUP_SKU_IGNORE
2996bdba 8638 },
1565cc35 8639 [ALC662_FIXUP_NO_JACK_DETECT] = {
1727a771 8640 .type = HDA_FIXUP_FUNC,
1565cc35
TI
8641 .v.func = alc_fixup_no_jack_detect,
8642 },
edfe3bfc 8643 [ALC662_FIXUP_ZOTAC_Z68] = {
1727a771
TI
8644 .type = HDA_FIXUP_PINS,
8645 .v.pins = (const struct hda_pintbl[]) {
edfe3bfc
DH
8646 { 0x1b, 0x02214020 }, /* Front HP */
8647 { }
8648 }
8649 },
125821ae 8650 [ALC662_FIXUP_INV_DMIC] = {
1727a771 8651 .type = HDA_FIXUP_FUNC,
9d36a7dc 8652 .v.func = alc_fixup_inv_dmic,
125821ae 8653 },
033b0a7c
GM
8654 [ALC668_FIXUP_DELL_XPS13] = {
8655 .type = HDA_FIXUP_FUNC,
8656 .v.func = alc_fixup_dell_xps13,
8657 .chained = true,
8658 .chain_id = ALC668_FIXUP_DELL_DISABLE_AAMIX
8659 },
5e6db669
GM
8660 [ALC668_FIXUP_DELL_DISABLE_AAMIX] = {
8661 .type = HDA_FIXUP_FUNC,
8662 .v.func = alc_fixup_disable_aamix,
8663 .chained = true,
8664 .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
8665 },
493a52a9
HW
8666 [ALC668_FIXUP_AUTO_MUTE] = {
8667 .type = HDA_FIXUP_FUNC,
8668 .v.func = alc_fixup_auto_mute_via_amp,
8669 .chained = true,
8670 .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
8671 },
1f8b46cd
DH
8672 [ALC662_FIXUP_DELL_MIC_NO_PRESENCE] = {
8673 .type = HDA_FIXUP_PINS,
8674 .v.pins = (const struct hda_pintbl[]) {
8675 { 0x19, 0x03a1113c }, /* use as headset mic, without its own jack detect */
8676 /* headphone mic by setting pin control of 0x1b (headphone out) to in + vref_50 */
8677 { }
8678 },
8679 .chained = true,
8680 .chain_id = ALC662_FIXUP_HEADSET_MODE
8681 },
8682 [ALC662_FIXUP_HEADSET_MODE] = {
8683 .type = HDA_FIXUP_FUNC,
8684 .v.func = alc_fixup_headset_mode_alc662,
8685 },
73bdd597
DH
8686 [ALC668_FIXUP_DELL_MIC_NO_PRESENCE] = {
8687 .type = HDA_FIXUP_PINS,
8688 .v.pins = (const struct hda_pintbl[]) {
8689 { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
8690 { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
8691 { }
8692 },
8693 .chained = true,
8694 .chain_id = ALC668_FIXUP_HEADSET_MODE
8695 },
8696 [ALC668_FIXUP_HEADSET_MODE] = {
8697 .type = HDA_FIXUP_FUNC,
8698 .v.func = alc_fixup_headset_mode_alc668,
8699 },
8e54b4ac 8700 [ALC662_FIXUP_BASS_MODE4_CHMAP] = {
8e383953 8701 .type = HDA_FIXUP_FUNC,
eb9ca3ab 8702 .v.func = alc_fixup_bass_chmap,
8e383953
TI
8703 .chained = true,
8704 .chain_id = ALC662_FIXUP_ASUS_MODE4
8705 },
61a75f13
DH
8706 [ALC662_FIXUP_BASS_16] = {
8707 .type = HDA_FIXUP_PINS,
8708 .v.pins = (const struct hda_pintbl[]) {
8709 {0x16, 0x80106111}, /* bass speaker */
8710 {}
8711 },
8712 .chained = true,
8713 .chain_id = ALC662_FIXUP_BASS_CHMAP,
8714 },
a30c9aaa
TI
8715 [ALC662_FIXUP_BASS_1A] = {
8716 .type = HDA_FIXUP_PINS,
8717 .v.pins = (const struct hda_pintbl[]) {
8718 {0x1a, 0x80106111}, /* bass speaker */
8719 {}
8720 },
8e54b4ac
DH
8721 .chained = true,
8722 .chain_id = ALC662_FIXUP_BASS_CHMAP,
a30c9aaa 8723 },
8e54b4ac 8724 [ALC662_FIXUP_BASS_CHMAP] = {
a30c9aaa 8725 .type = HDA_FIXUP_FUNC,
eb9ca3ab 8726 .v.func = alc_fixup_bass_chmap,
a30c9aaa 8727 },
9d4dc584
BM
8728 [ALC662_FIXUP_ASUS_Nx50] = {
8729 .type = HDA_FIXUP_FUNC,
8730 .v.func = alc_fixup_auto_mute_via_amp,
8731 .chained = true,
8732 .chain_id = ALC662_FIXUP_BASS_1A
8733 },
fc7438b1
MP
8734 [ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE] = {
8735 .type = HDA_FIXUP_FUNC,
8736 .v.func = alc_fixup_headset_mode_alc668,
8737 .chain_id = ALC662_FIXUP_BASS_CHMAP
8738 },
3231e205
YP
8739 [ALC668_FIXUP_ASUS_Nx51] = {
8740 .type = HDA_FIXUP_PINS,
8741 .v.pins = (const struct hda_pintbl[]) {
fc7438b1
MP
8742 { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
8743 { 0x1a, 0x90170151 }, /* bass speaker */
8744 { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
3231e205
YP
8745 {}
8746 },
8747 .chained = true,
fc7438b1 8748 .chain_id = ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
3231e205 8749 },
5b7c5e1f 8750 [ALC668_FIXUP_MIC_COEF] = {
11ba6111
TI
8751 .type = HDA_FIXUP_VERBS,
8752 .v.verbs = (const struct hda_verb[]) {
8753 { 0x20, AC_VERB_SET_COEF_INDEX, 0xc3 },
8754 { 0x20, AC_VERB_SET_PROC_COEF, 0x4000 },
8755 {}
8756 },
8757 },
5b7c5e1f
TI
8758 [ALC668_FIXUP_ASUS_G751] = {
8759 .type = HDA_FIXUP_PINS,
8760 .v.pins = (const struct hda_pintbl[]) {
8761 { 0x16, 0x0421101f }, /* HP */
8762 {}
8763 },
8764 .chained = true,
8765 .chain_id = ALC668_FIXUP_MIC_COEF
8766 },
78f4f7c2
KY
8767 [ALC891_FIXUP_HEADSET_MODE] = {
8768 .type = HDA_FIXUP_FUNC,
8769 .v.func = alc_fixup_headset_mode,
8770 },
8771 [ALC891_FIXUP_DELL_MIC_NO_PRESENCE] = {
8772 .type = HDA_FIXUP_PINS,
8773 .v.pins = (const struct hda_pintbl[]) {
8774 { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
8775 { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
8776 { }
8777 },
8778 .chained = true,
8779 .chain_id = ALC891_FIXUP_HEADSET_MODE
8780 },
9b51fe3e
SB
8781 [ALC662_FIXUP_ACER_VERITON] = {
8782 .type = HDA_FIXUP_PINS,
8783 .v.pins = (const struct hda_pintbl[]) {
8784 { 0x15, 0x50170120 }, /* no internal speaker */
8785 { }
8786 }
8787 },
1a3f0991
TI
8788 [ALC892_FIXUP_ASROCK_MOBO] = {
8789 .type = HDA_FIXUP_PINS,
8790 .v.pins = (const struct hda_pintbl[]) {
8791 { 0x15, 0x40f000f0 }, /* disabled */
8792 { 0x16, 0x40f000f0 }, /* disabled */
1a3f0991
TI
8793 { }
8794 }
8795 },
c6790c8e
KY
8796 [ALC662_FIXUP_USI_FUNC] = {
8797 .type = HDA_FIXUP_FUNC,
8798 .v.func = alc662_fixup_usi_headset_mic,
8799 },
8800 [ALC662_FIXUP_USI_HEADSET_MODE] = {
8801 .type = HDA_FIXUP_PINS,
8802 .v.pins = (const struct hda_pintbl[]) {
8803 { 0x19, 0x02a1913c }, /* use as headset mic, without its own jack detect */
8804 { 0x18, 0x01a1903d },
8805 { }
8806 },
8807 .chained = true,
8808 .chain_id = ALC662_FIXUP_USI_FUNC
8809 },
ca169cc2
KY
8810 [ALC662_FIXUP_LENOVO_MULTI_CODECS] = {
8811 .type = HDA_FIXUP_FUNC,
8812 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
8813 },
00066e97
SB
8814 [ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET] = {
8815 .type = HDA_FIXUP_FUNC,
8816 .v.func = alc662_fixup_aspire_ethos_hp,
8817 },
8818 [ALC669_FIXUP_ACER_ASPIRE_ETHOS_SUBWOOFER] = {
8819 .type = HDA_FIXUP_VERBS,
8820 /* subwoofer needs an extra GPIO setting to become audible */
8821 .v.verbs = (const struct hda_verb[]) {
8822 {0x01, AC_VERB_SET_GPIO_MASK, 0x02},
8823 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
8824 {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
8825 { }
8826 },
8827 .chained = true,
8828 .chain_id = ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET
8829 },
8830 [ALC669_FIXUP_ACER_ASPIRE_ETHOS] = {
8831 .type = HDA_FIXUP_PINS,
8832 .v.pins = (const struct hda_pintbl[]) {
8833 { 0x15, 0x92130110 }, /* front speakers */
8834 { 0x18, 0x99130111 }, /* center/subwoofer */
8835 { 0x1b, 0x11130012 }, /* surround plus jack for HP */
8836 { }
8837 },
8838 .chained = true,
8839 .chain_id = ALC669_FIXUP_ACER_ASPIRE_ETHOS_SUBWOOFER
8840 },
6cb3b707
DH
8841};
8842
a9111321 8843static const struct snd_pci_quirk alc662_fixup_tbl[] = {
53c334ad 8844 SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2),
d3d3835c 8845 SND_PCI_QUIRK(0x1025, 0x022f, "Acer Aspire One", ALC662_FIXUP_INV_DMIC),
02f6ff90 8846 SND_PCI_QUIRK(0x1025, 0x0241, "Packard Bell DOTS", ALC662_FIXUP_INV_DMIC),
a6c47a85 8847 SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
94024cd1 8848 SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),
125821ae 8849 SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC),
1801928e 8850 SND_PCI_QUIRK(0x1025, 0x034a, "Gateway LT27", ALC662_FIXUP_INV_DMIC),
2df03514 8851 SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
73bdd597
DH
8852 SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
8853 SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
c5d019c3 8854 SND_PCI_QUIRK(0x1028, 0x05fe, "Dell XPS 15", ALC668_FIXUP_DELL_XPS13),
033b0a7c 8855 SND_PCI_QUIRK(0x1028, 0x060a, "Dell XPS 13", ALC668_FIXUP_DELL_XPS13),
467e1436 8856 SND_PCI_QUIRK(0x1028, 0x060d, "Dell M3800", ALC668_FIXUP_DELL_XPS13),
09d2014f 8857 SND_PCI_QUIRK(0x1028, 0x0625, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
ad8ff99e 8858 SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
8dc9abb9
KY
8859 SND_PCI_QUIRK(0x1028, 0x0696, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
8860 SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
6a98e34b 8861 SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
e59ea3ed 8862 SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
2da2dc9e 8863 SND_PCI_QUIRK(0x1043, 0x1080, "Asus UX501VW", ALC668_FIXUP_HEADSET_MODE),
83a9efb5 8864 SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_ASUS_Nx50),
db8948e6 8865 SND_PCI_QUIRK(0x1043, 0x13df, "Asus N550JX", ALC662_FIXUP_BASS_1A),
9d4dc584 8866 SND_PCI_QUIRK(0x1043, 0x129d, "Asus N750", ALC662_FIXUP_ASUS_Nx50),
11ba6111 8867 SND_PCI_QUIRK(0x1043, 0x12ff, "ASUS G751", ALC668_FIXUP_ASUS_G751),
8e54b4ac 8868 SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
61a75f13 8869 SND_PCI_QUIRK(0x1043, 0x15a7, "ASUS UX51VZH", ALC662_FIXUP_BASS_16),
3231e205
YP
8870 SND_PCI_QUIRK(0x1043, 0x177d, "ASUS N551", ALC668_FIXUP_ASUS_Nx51),
8871 SND_PCI_QUIRK(0x1043, 0x17bd, "ASUS N751", ALC668_FIXUP_ASUS_Nx51),
c7efff92 8872 SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71SL", ALC662_FIXUP_ASUS_MODE8),
61a75f13 8873 SND_PCI_QUIRK(0x1043, 0x1b73, "ASUS N55SF", ALC662_FIXUP_BASS_16),
8e54b4ac 8874 SND_PCI_QUIRK(0x1043, 0x1bf3, "ASUS N76VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
1565cc35 8875 SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),
53c334ad 8876 SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
a0e90acc 8877 SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
c6790c8e 8878 SND_PCI_QUIRK(0x14cd, 0x5003, "USI", ALC662_FIXUP_USI_HEADSET_MODE),
ca169cc2 8879 SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC662_FIXUP_LENOVO_MULTI_CODECS),
d4118588 8880 SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
6cb3b707 8881 SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
1a3f0991 8882 SND_PCI_QUIRK(0x1849, 0x5892, "ASRock B150M", ALC892_FIXUP_ASROCK_MOBO),
edfe3bfc 8883 SND_PCI_QUIRK(0x19da, 0xa130, "Zotac Z68", ALC662_FIXUP_ZOTAC_Z68),
9b51fe3e 8884 SND_PCI_QUIRK(0x1b0a, 0x01b8, "ACER Veriton", ALC662_FIXUP_ACER_VERITON),
d2ebd479 8885 SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
00066e97 8886 SND_PCI_QUIRK(0x1025, 0x0566, "Acer Aspire Ethos 8951G", ALC669_FIXUP_ACER_ASPIRE_ETHOS),
53c334ad
TI
8887
8888#if 0
8889 /* Below is a quirk table taken from the old code.
8890 * Basically the device should work as is without the fixup table.
8891 * If BIOS doesn't give a proper info, enable the corresponding
8892 * fixup entry.
7d7eb9ea 8893 */
53c334ad
TI
8894 SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1),
8895 SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3),
8896 SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1),
8897 SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC662_FIXUP_ASUS_MODE3),
8898 SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
8899 SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
8900 SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
8901 SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC662_FIXUP_ASUS_MODE1),
8902 SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC662_FIXUP_ASUS_MODE1),
8903 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
8904 SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC662_FIXUP_ASUS_MODE7),
8905 SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC662_FIXUP_ASUS_MODE7),
8906 SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC662_FIXUP_ASUS_MODE8),
8907 SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC662_FIXUP_ASUS_MODE3),
8908 SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC662_FIXUP_ASUS_MODE1),
8909 SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
8910 SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_FIXUP_ASUS_MODE2),
8911 SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC662_FIXUP_ASUS_MODE1),
8912 SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
8913 SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
8914 SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
8915 SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
8916 SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC662_FIXUP_ASUS_MODE1),
8917 SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC662_FIXUP_ASUS_MODE3),
8918 SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_FIXUP_ASUS_MODE2),
8919 SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
8920 SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC662_FIXUP_ASUS_MODE5),
8921 SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
8922 SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
8923 SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC662_FIXUP_ASUS_MODE1),
8924 SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
8925 SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
8926 SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC662_FIXUP_ASUS_MODE3),
8927 SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC662_FIXUP_ASUS_MODE3),
8928 SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC662_FIXUP_ASUS_MODE1),
8929 SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC662_FIXUP_ASUS_MODE1),
8930 SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC662_FIXUP_ASUS_MODE1),
8931 SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC662_FIXUP_ASUS_MODE1),
8932 SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC662_FIXUP_ASUS_MODE1),
8933 SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
8934 SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_FIXUP_ASUS_MODE2),
8935 SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC662_FIXUP_ASUS_MODE1),
8936 SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
8937 SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC662_FIXUP_ASUS_MODE3),
8938 SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC662_FIXUP_ASUS_MODE1),
8939 SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC662_FIXUP_ASUS_MODE1),
8940 SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC662_FIXUP_ASUS_MODE1),
8941 SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_FIXUP_ASUS_MODE2),
8942 SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
8943 SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE4),
8944#endif
6cb3b707
DH
8945 {}
8946};
8947
1727a771 8948static const struct hda_model_fixup alc662_fixup_models[] = {
aa3841b5
TI
8949 {.id = ALC662_FIXUP_ASPIRE, .name = "aspire"},
8950 {.id = ALC662_FIXUP_IDEAPAD, .name = "ideapad"},
6be7948f 8951 {.id = ALC272_FIXUP_MARIO, .name = "mario"},
aa3841b5 8952 {.id = ALC662_FIXUP_HP_RP5800, .name = "hp-rp5800"},
53c334ad
TI
8953 {.id = ALC662_FIXUP_ASUS_MODE1, .name = "asus-mode1"},
8954 {.id = ALC662_FIXUP_ASUS_MODE2, .name = "asus-mode2"},
8955 {.id = ALC662_FIXUP_ASUS_MODE3, .name = "asus-mode3"},
8956 {.id = ALC662_FIXUP_ASUS_MODE4, .name = "asus-mode4"},
8957 {.id = ALC662_FIXUP_ASUS_MODE5, .name = "asus-mode5"},
8958 {.id = ALC662_FIXUP_ASUS_MODE6, .name = "asus-mode6"},
8959 {.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},
8960 {.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},
aa3841b5 8961 {.id = ALC662_FIXUP_ZOTAC_Z68, .name = "zotac-z68"},
6e72aa5f 8962 {.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"},
aa3841b5 8963 {.id = ALC662_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc662-headset-multi"},
e32aa85a 8964 {.id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
aa3841b5
TI
8965 {.id = ALC662_FIXUP_HEADSET_MODE, .name = "alc662-headset"},
8966 {.id = ALC668_FIXUP_HEADSET_MODE, .name = "alc668-headset"},
8967 {.id = ALC662_FIXUP_BASS_16, .name = "bass16"},
8968 {.id = ALC662_FIXUP_BASS_1A, .name = "bass1a"},
8969 {.id = ALC668_FIXUP_AUTO_MUTE, .name = "automute"},
8970 {.id = ALC668_FIXUP_DELL_XPS13, .name = "dell-xps13"},
8971 {.id = ALC662_FIXUP_ASUS_Nx50, .name = "asus-nx50"},
8972 {.id = ALC668_FIXUP_ASUS_Nx51, .name = "asus-nx51"},
40c51675 8973 {.id = ALC668_FIXUP_ASUS_G751, .name = "asus-g751"},
aa3841b5
TI
8974 {.id = ALC891_FIXUP_HEADSET_MODE, .name = "alc891-headset"},
8975 {.id = ALC891_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc891-headset-multi"},
8976 {.id = ALC662_FIXUP_ACER_VERITON, .name = "acer-veriton"},
8977 {.id = ALC892_FIXUP_ASROCK_MOBO, .name = "asrock-mobo"},
8978 {.id = ALC662_FIXUP_USI_HEADSET_MODE, .name = "usi-headset"},
ba90d6a6 8979 {.id = ALC662_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
00066e97 8980 {.id = ALC669_FIXUP_ACER_ASPIRE_ETHOS, .name = "aspire-ethos"},
6be7948f
TB
8981 {}
8982};
6cb3b707 8983
532895c5 8984static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = {
78f4f7c2
KY
8985 SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
8986 {0x17, 0x02211010},
8987 {0x18, 0x01a19030},
8988 {0x1a, 0x01813040},
8989 {0x21, 0x01014020}),
4b4e0e32
HW
8990 SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
8991 {0x16, 0x01813030},
8992 {0x17, 0x02211010},
8993 {0x18, 0x01a19040},
8994 {0x21, 0x01014020}),
1f8b46cd 8995 SND_HDA_PIN_QUIRK(0x10ec0662, 0x1028, "Dell", ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
1f8b46cd 8996 {0x14, 0x01014010},
1f8b46cd 8997 {0x18, 0x01a19020},
1f8b46cd 8998 {0x1a, 0x0181302f},
11580297 8999 {0x1b, 0x0221401f}),
76c2132e
DH
9000 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
9001 {0x12, 0x99a30130},
9002 {0x14, 0x90170110},
9003 {0x15, 0x0321101f},
11580297 9004 {0x16, 0x03011020}),
76c2132e
DH
9005 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
9006 {0x12, 0x99a30140},
9007 {0x14, 0x90170110},
9008 {0x15, 0x0321101f},
11580297 9009 {0x16, 0x03011020}),
76c2132e
DH
9010 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
9011 {0x12, 0x99a30150},
9012 {0x14, 0x90170110},
9013 {0x15, 0x0321101f},
11580297 9014 {0x16, 0x03011020}),
76c2132e 9015 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
76c2132e
DH
9016 {0x14, 0x90170110},
9017 {0x15, 0x0321101f},
11580297 9018 {0x16, 0x03011020}),
76c2132e
DH
9019 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell XPS 15", ALC668_FIXUP_AUTO_MUTE,
9020 {0x12, 0x90a60130},
9021 {0x14, 0x90170110},
11580297 9022 {0x15, 0x0321101f}),
532895c5
HW
9023 {}
9024};
9025
1d045db9
TI
9026/*
9027 */
bc9f98a9
KY
9028static int patch_alc662(struct hda_codec *codec)
9029{
9030 struct alc_spec *spec;
3de95173 9031 int err;
bc9f98a9 9032
3de95173
TI
9033 err = alc_alloc_spec(codec, 0x0b);
9034 if (err < 0)
9035 return err;
bc9f98a9 9036
3de95173 9037 spec = codec->spec;
1f0f4b80 9038
225068ab
TI
9039 spec->shutup = alc_eapd_shutup;
9040
53c334ad
TI
9041 /* handle multiple HPs as is */
9042 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
9043
2c3bf9ab
TI
9044 alc_fix_pll_init(codec, 0x20, 0x04, 15);
9045
7639a06c 9046 switch (codec->core.vendor_id) {
f3f9185f
KY
9047 case 0x10ec0668:
9048 spec->init_hook = alc668_restore_default_value;
9049 break;
f3f9185f 9050 }
8663ff75 9051
c9af753f
TI
9052 alc_pre_init(codec);
9053
1727a771 9054 snd_hda_pick_fixup(codec, alc662_fixup_models,
8e5a0509 9055 alc662_fixup_tbl, alc662_fixups);
0fc1e447 9056 snd_hda_pick_pin_fixup(codec, alc662_pin_fixup_tbl, alc662_fixups, true);
1727a771 9057 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
8e5a0509
TI
9058
9059 alc_auto_parse_customize_define(codec);
9060
7504b6cd
TI
9061 if (has_cdefine_beep(codec))
9062 spec->gen.beep_nid = 0x01;
9063
1bb7e43e 9064 if ((alc_get_coef0(codec) & (1 << 14)) &&
5100cd07 9065 codec->bus->pci && codec->bus->pci->subsystem_vendor == 0x1025 &&
e16fb6d1 9066 spec->cdefine.platform_type == 1) {
6134b1a2
WY
9067 err = alc_codec_rename(codec, "ALC272X");
9068 if (err < 0)
e16fb6d1 9069 goto error;
20ca0c35 9070 }
274693f3 9071
b9c5106c
TI
9072 /* automatic parse from the BIOS config */
9073 err = alc662_parse_auto_config(codec);
e16fb6d1
TI
9074 if (err < 0)
9075 goto error;
bc9f98a9 9076
7504b6cd 9077 if (!spec->gen.no_analog && spec->gen.beep_nid) {
7639a06c 9078 switch (codec->core.vendor_id) {
da00c244 9079 case 0x10ec0662:
fea80fae 9080 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
da00c244
KY
9081 break;
9082 case 0x10ec0272:
9083 case 0x10ec0663:
9084 case 0x10ec0665:
9ad54547 9085 case 0x10ec0668:
fea80fae 9086 err = set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
da00c244
KY
9087 break;
9088 case 0x10ec0273:
fea80fae 9089 err = set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
da00c244
KY
9090 break;
9091 }
fea80fae
TI
9092 if (err < 0)
9093 goto error;
cec27c89 9094 }
2134ea4f 9095
1727a771 9096 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
589876e2 9097
bc9f98a9 9098 return 0;
801f49d3 9099
e16fb6d1
TI
9100 error:
9101 alc_free(codec);
9102 return err;
b478b998
KY
9103}
9104
d1eb57f4
KY
9105/*
9106 * ALC680 support
9107 */
d1eb57f4 9108
d1eb57f4
KY
9109static int alc680_parse_auto_config(struct hda_codec *codec)
9110{
3e6179b8 9111 return alc_parse_auto_config(codec, NULL, NULL);
d1eb57f4
KY
9112}
9113
d1eb57f4 9114/*
d1eb57f4 9115 */
d1eb57f4
KY
9116static int patch_alc680(struct hda_codec *codec)
9117{
d1eb57f4
KY
9118 int err;
9119
1f0f4b80 9120 /* ALC680 has no aa-loopback mixer */
3de95173
TI
9121 err = alc_alloc_spec(codec, 0);
9122 if (err < 0)
9123 return err;
1f0f4b80 9124
1ebec5f2
TI
9125 /* automatic parse from the BIOS config */
9126 err = alc680_parse_auto_config(codec);
9127 if (err < 0) {
9128 alc_free(codec);
9129 return err;
d1eb57f4
KY
9130 }
9131
d1eb57f4
KY
9132 return 0;
9133}
9134
1da177e4
LT
9135/*
9136 * patch entries
9137 */
b9a94a9c 9138static const struct hda_device_id snd_hda_id_realtek[] = {
0a6f0600 9139 HDA_CODEC_ENTRY(0x10ec0215, "ALC215", patch_alc269),
b9a94a9c 9140 HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269),
2a36c16e 9141 HDA_CODEC_ENTRY(0x10ec0222, "ALC222", patch_alc269),
4231430d 9142 HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269),
b9a94a9c
TI
9143 HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269),
9144 HDA_CODEC_ENTRY(0x10ec0233, "ALC233", patch_alc269),
dcd4f0db 9145 HDA_CODEC_ENTRY(0x10ec0234, "ALC234", patch_alc269),
b9a94a9c 9146 HDA_CODEC_ENTRY(0x10ec0235, "ALC233", patch_alc269),
736f20a7 9147 HDA_CODEC_ENTRY(0x10ec0236, "ALC236", patch_alc269),
b9a94a9c
TI
9148 HDA_CODEC_ENTRY(0x10ec0255, "ALC255", patch_alc269),
9149 HDA_CODEC_ENTRY(0x10ec0256, "ALC256", patch_alc269),
f429e7e4 9150 HDA_CODEC_ENTRY(0x10ec0257, "ALC257", patch_alc269),
b9a94a9c
TI
9151 HDA_CODEC_ENTRY(0x10ec0260, "ALC260", patch_alc260),
9152 HDA_CODEC_ENTRY(0x10ec0262, "ALC262", patch_alc262),
9153 HDA_CODEC_ENTRY(0x10ec0267, "ALC267", patch_alc268),
9154 HDA_CODEC_ENTRY(0x10ec0268, "ALC268", patch_alc268),
9155 HDA_CODEC_ENTRY(0x10ec0269, "ALC269", patch_alc269),
9156 HDA_CODEC_ENTRY(0x10ec0270, "ALC270", patch_alc269),
9157 HDA_CODEC_ENTRY(0x10ec0272, "ALC272", patch_alc662),
dcd4f0db 9158 HDA_CODEC_ENTRY(0x10ec0274, "ALC274", patch_alc269),
b9a94a9c
TI
9159 HDA_CODEC_ENTRY(0x10ec0275, "ALC275", patch_alc269),
9160 HDA_CODEC_ENTRY(0x10ec0276, "ALC276", patch_alc269),
9161 HDA_CODEC_ENTRY(0x10ec0280, "ALC280", patch_alc269),
9162 HDA_CODEC_ENTRY(0x10ec0282, "ALC282", patch_alc269),
9163 HDA_CODEC_ENTRY(0x10ec0283, "ALC283", patch_alc269),
9164 HDA_CODEC_ENTRY(0x10ec0284, "ALC284", patch_alc269),
0a6f0600 9165 HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269),
b9a94a9c
TI
9166 HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269),
9167 HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269),
0a6f0600 9168 HDA_CODEC_ENTRY(0x10ec0289, "ALC289", patch_alc269),
b9a94a9c
TI
9169 HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269),
9170 HDA_CODEC_ENTRY(0x10ec0292, "ALC292", patch_alc269),
9171 HDA_CODEC_ENTRY(0x10ec0293, "ALC293", patch_alc269),
dcd4f0db 9172 HDA_CODEC_ENTRY(0x10ec0294, "ALC294", patch_alc269),
7d727869 9173 HDA_CODEC_ENTRY(0x10ec0295, "ALC295", patch_alc269),
b9a94a9c 9174 HDA_CODEC_ENTRY(0x10ec0298, "ALC298", patch_alc269),
28f1f9b2 9175 HDA_CODEC_ENTRY(0x10ec0299, "ALC299", patch_alc269),
1078bef0 9176 HDA_CODEC_ENTRY(0x10ec0300, "ALC300", patch_alc269),
b9a94a9c
TI
9177 HDA_CODEC_REV_ENTRY(0x10ec0861, 0x100340, "ALC660", patch_alc861),
9178 HDA_CODEC_ENTRY(0x10ec0660, "ALC660-VD", patch_alc861vd),
9179 HDA_CODEC_ENTRY(0x10ec0861, "ALC861", patch_alc861),
9180 HDA_CODEC_ENTRY(0x10ec0862, "ALC861-VD", patch_alc861vd),
9181 HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100002, "ALC662 rev2", patch_alc882),
9182 HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100101, "ALC662 rev1", patch_alc662),
9183 HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100300, "ALC662 rev3", patch_alc662),
9184 HDA_CODEC_ENTRY(0x10ec0663, "ALC663", patch_alc662),
9185 HDA_CODEC_ENTRY(0x10ec0665, "ALC665", patch_alc662),
9186 HDA_CODEC_ENTRY(0x10ec0667, "ALC667", patch_alc662),
9187 HDA_CODEC_ENTRY(0x10ec0668, "ALC668", patch_alc662),
9188 HDA_CODEC_ENTRY(0x10ec0670, "ALC670", patch_alc662),
9189 HDA_CODEC_ENTRY(0x10ec0671, "ALC671", patch_alc662),
9190 HDA_CODEC_ENTRY(0x10ec0680, "ALC680", patch_alc680),
6fbae35a
KY
9191 HDA_CODEC_ENTRY(0x10ec0700, "ALC700", patch_alc269),
9192 HDA_CODEC_ENTRY(0x10ec0701, "ALC701", patch_alc269),
9193 HDA_CODEC_ENTRY(0x10ec0703, "ALC703", patch_alc269),
78f4f7c2 9194 HDA_CODEC_ENTRY(0x10ec0867, "ALC891", patch_alc662),
b9a94a9c
TI
9195 HDA_CODEC_ENTRY(0x10ec0880, "ALC880", patch_alc880),
9196 HDA_CODEC_ENTRY(0x10ec0882, "ALC882", patch_alc882),
9197 HDA_CODEC_ENTRY(0x10ec0883, "ALC883", patch_alc882),
9198 HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100101, "ALC889A", patch_alc882),
9199 HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100103, "ALC889A", patch_alc882),
9200 HDA_CODEC_ENTRY(0x10ec0885, "ALC885", patch_alc882),
9201 HDA_CODEC_ENTRY(0x10ec0887, "ALC887", patch_alc882),
9202 HDA_CODEC_REV_ENTRY(0x10ec0888, 0x100101, "ALC1200", patch_alc882),
9203 HDA_CODEC_ENTRY(0x10ec0888, "ALC888", patch_alc882),
9204 HDA_CODEC_ENTRY(0x10ec0889, "ALC889", patch_alc882),
9205 HDA_CODEC_ENTRY(0x10ec0892, "ALC892", patch_alc662),
9206 HDA_CODEC_ENTRY(0x10ec0899, "ALC898", patch_alc882),
9207 HDA_CODEC_ENTRY(0x10ec0900, "ALC1150", patch_alc882),
65553b12 9208 HDA_CODEC_ENTRY(0x10ec1168, "ALC1220", patch_alc882),
a535ad57 9209 HDA_CODEC_ENTRY(0x10ec1220, "ALC1220", patch_alc882),
1da177e4
LT
9210 {} /* terminator */
9211};
b9a94a9c 9212MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_realtek);
1289e9e8
TI
9213
9214MODULE_LICENSE("GPL");
9215MODULE_DESCRIPTION("Realtek HD-audio codec");
9216
d8a766a1 9217static struct hda_codec_driver realtek_driver = {
b9a94a9c 9218 .id = snd_hda_id_realtek,
1289e9e8
TI
9219};
9220
d8a766a1 9221module_hda_codec_driver(realtek_driver);