blob: 1ad8c2e2d1aff254b7f9b53904e06ffbbc09bfc5 [file] [log] [blame]
Thomas Gleixnerd0fa1172019-05-20 19:07:57 +02001// SPDX-License-Identifier: GPL-2.0-or-later
Linus Torvalds1da177e2005-04-16 15:20:36 -07002/*
3 * Universal Interface for Intel High Definition Audio Codec
4 *
Takashi Iwai1d045db2011-07-07 18:23:21 +02005 * HD audio interface patch for Realtek ALC codecs
Linus Torvalds1da177e2005-04-16 15:20:36 -07006 *
Kailang Yangdf694da2005-12-05 19:42:22 +01007 * Copyright (c) 2004 Kailang Yang <kailang@realtek.com.tw>
8 * PeiSen Hou <pshou@realtek.com.tw>
Linus Torvalds1da177e2005-04-16 15:20:36 -07009 * Takashi Iwai <tiwai@suse.de>
Jonathan Woithe409a3e92012-03-27 13:01:01 +103010 * Jonathan Woithe <jwoithe@just42.net>
Linus Torvalds1da177e2005-04-16 15:20:36 -070011 */
12
Linus Torvalds1da177e2005-04-16 15:20:36 -070013#include <linux/init.h>
14#include <linux/delay.h>
15#include <linux/slab.h>
16#include <linux/pci.h>
Takashi Iwai08fb0d02013-01-10 17:33:58 +010017#include <linux/dmi.h>
Paul Gortmakerda155d52011-07-15 12:38:28 -040018#include <linux/module.h>
David Henningsson33f4acd2015-01-07 15:50:13 +010019#include <linux/input.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070020#include <sound/core.h>
Kailang Yang9ad0e492010-09-14 23:22:00 +020021#include <sound/jack.h>
Pierre-Louis Bossartbe57bff2018-08-22 15:24:57 -050022#include <sound/hda_codec.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070023#include "hda_local.h"
Takashi Iwai23d30f22012-05-07 17:17:32 +020024#include "hda_auto_parser.h"
Takashi Iwai1835a0f2011-10-27 22:12:46 +020025#include "hda_jack.h"
Takashi Iwai08c189f2012-12-19 15:22:24 +010026#include "hda_generic.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070027
Takashi Iwaicd63a5f2013-07-05 12:13:59 +020028/* keep halting ALC5505 DSP, for power saving */
29#define HALT_REALTEK_ALC5505
30
Takashi Iwai4a79ba32009-04-22 16:31:35 +020031/* extra amp-initialization sequence types */
32enum {
Takashi Iwai1c76aa52018-06-21 16:37:54 +020033 ALC_INIT_UNDEFINED,
Takashi Iwai4a79ba32009-04-22 16:31:35 +020034 ALC_INIT_NONE,
35 ALC_INIT_DEFAULT,
Takashi Iwai4a79ba32009-04-22 16:31:35 +020036};
37
David Henningsson73bdd592013-04-15 15:44:14 +020038enum {
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
Hui Wangc7b60a82015-12-28 11:35:25 +080052enum {
53 ALC_KEY_MICMUTE_INDEX,
54};
55
Kailang Yangda00c242010-03-19 11:23:45 +010056struct 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;
David Henningsson90622912010-10-14 14:50:18 +020066 unsigned int fixup:1; /* Means that this sku is set by driver, not read from hw */
Kailang Yangda00c242010-03-19 11:23:45 +010067};
68
Linus Torvalds1da177e2005-04-16 15:20:36 -070069struct alc_spec {
Takashi Iwai08c189f2012-12-19 15:22:24 +010070 struct hda_gen_spec gen; /* must be at head */
Takashi Iwai23d30f22012-05-07 17:17:32 +020071
Linus Torvalds1da177e2005-04-16 15:20:36 -070072 /* codec parameterization */
Kailang Yangda00c242010-03-19 11:23:45 +010073 struct alc_customize_define cdefine;
Takashi Iwai08c189f2012-12-19 15:22:24 +010074 unsigned int parse_flags; /* flag for snd_hda_parse_pin_defcfg() */
75
Takashi Iwai5579cd62018-06-19 22:22:41 +020076 /* GPIO bits */
77 unsigned int gpio_mask;
78 unsigned int gpio_dir;
79 unsigned int gpio_data;
Takashi Iwai215c8502018-06-19 22:34:26 +020080 bool gpio_write_delay; /* add a delay before writing gpio_data */
Takashi Iwai5579cd62018-06-19 22:22:41 +020081
Takashi Iwai08fb0d02013-01-10 17:33:58 +010082 /* mute LED for HP laptops, see alc269_fixup_mic_mute_hook() */
83 int mute_led_polarity;
84 hda_nid_t mute_led_nid;
Kailang Yang9c5dc3b2014-06-19 16:11:36 +080085 hda_nid_t cap_mute_led_nid;
Takashi Iwai08fb0d02013-01-10 17:33:58 +010086
Takashi Iwai0f32fd192014-11-19 12:16:14 +010087 unsigned int gpio_mute_led_mask;
88 unsigned int gpio_mic_led_mask;
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +010089
David Henningsson73bdd592013-04-15 15:44:14 +020090 hda_nid_t headset_mic_pin;
91 hda_nid_t headphone_mic_pin;
92 int current_headset_mode;
93 int current_headset_type;
94
Takashi Iwaiae6b8132006-03-03 16:47:17 +010095 /* hooks */
96 void (*init_hook)(struct hda_codec *codec);
Takashi Iwai83012a72012-08-24 18:38:08 +020097#ifdef CONFIG_PM
Daniel T Chenc97259d2009-12-27 18:52:08 -050098 void (*power_hook)(struct hda_codec *codec);
Hector Martinf5de24b2009-12-20 22:51:31 +010099#endif
Takashi Iwai1c7161532011-04-07 10:37:16 +0200100 void (*shutup)(struct hda_codec *codec);
Takashi Iwai70a09762015-12-15 14:59:58 +0100101 void (*reboot_notify)(struct hda_codec *codec);
Takashi Iwaid922b512011-04-28 12:18:53 +0200102
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200103 int init_amp;
Takashi Iwaid433a672010-09-20 15:11:54 +0200104 int codec_variant; /* flag for other variants */
Kailang Yang97a26572013-11-29 00:35:26 -0500105 unsigned int has_alc5505_dsp:1;
106 unsigned int no_depop_delay:1;
Kailang Yang693abe12019-01-29 15:38:21 +0800107 unsigned int done_hp_init:1;
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +0100108 unsigned int no_shutup_pins:1;
Kailang Yangd3ba58b2019-05-06 15:09:42 +0800109 unsigned int ultra_low_power:1;
Takashi Iwaie64f14f2009-01-20 18:32:55 +0100110
Takashi Iwai2c3bf9a2008-06-04 12:39:38 +0200111 /* for PLL fix */
112 hda_nid_t pll_nid;
113 unsigned int pll_coef_idx, pll_coef_bit;
Takashi Iwai1bb7e432011-10-17 16:50:59 +0200114 unsigned int coef0;
David Henningsson33f4acd2015-01-07 15:50:13 +0100115 struct input_dev *kb_dev;
Hui Wangc7b60a82015-12-28 11:35:25 +0800116 u8 alc_mute_keycode_map[1];
Kailang Yangdf694da2005-12-05 19:42:22 +0100117};
118
Takashi Iwai23f0c042009-02-26 13:03:58 +0100119/*
Takashi Iwaif2a227c2014-08-18 13:35:22 +0200120 * 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
Takashi Iwai98b24882014-08-18 13:47:50 +0200146static 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
Takashi Iwaif2a227c2014-08-18 13:35:22 +0200160/* 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
Takashi Iwai54db6c32014-08-18 15:11:19 +0200170/* 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
Takashi Iwaif2a227c2014-08-18 13:35:22 +0200196/*
Takashi Iwai1d045db2011-07-07 18:23:21 +0200197 * GPIO setup tables, used in initialization
Kailang Yangdf694da2005-12-05 19:42:22 +0100198 */
Takashi Iwai5579cd62018-06-19 22:22:41 +0200199
Kailang Yangbc9f98a2007-04-12 13:06:07 +0200200/* Enable GPIO mask and set output */
Takashi Iwai5579cd62018-06-19 22:22:41 +0200201static void alc_setup_gpio(struct hda_codec *codec, unsigned int mask)
202{
203 struct alc_spec *spec = codec->spec;
Kailang Yangbc9f98a2007-04-12 13:06:07 +0200204
Takashi Iwai5579cd62018-06-19 22:22:41 +0200205 spec->gpio_mask |= mask;
206 spec->gpio_dir |= mask;
207 spec->gpio_data |= mask;
208}
Kailang Yangbc9f98a2007-04-12 13:06:07 +0200209
Takashi Iwai5579cd62018-06-19 22:22:41 +0200210static 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
Takashi Iwaiaaf312d2018-06-19 22:28:22 +0200218static 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
Takashi Iwai5579cd62018-06-19 22:22:41 +0200232static 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);
Takashi Iwai215c8502018-06-19 22:34:26 +0200243 if (spec->gpio_write_delay)
244 msleep(1);
Takashi Iwai5579cd62018-06-19 22:22:41 +0200245 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}
Kailang Yangbdd148a2007-05-08 15:19:08 +0200272
Takashi Iwaiae065f12018-06-19 23:00:03 +0200273static 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
Takashi Iwai2c3bf9a2008-06-04 12:39:38 +0200279/*
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;
Takashi Iwai2c3bf9a2008-06-04 12:39:38 +0200287
Takashi Iwai98b24882014-08-18 13:47:50 +0200288 if (spec->pll_nid)
289 alc_update_coefex_idx(codec, spec->pll_nid, spec->pll_coef_idx,
290 1 << spec->pll_coef_bit, 0);
Takashi Iwai2c3bf9a2008-06-04 12:39:38 +0200291}
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
Takashi Iwaicf5a2272012-02-20 16:31:07 +0100303/* update the master volume per volume-knob's unsol event */
Takashi Iwai1a4f69d2014-09-11 15:22:46 +0200304static void alc_update_knob_master(struct hda_codec *codec,
305 struct hda_jack_callback *jack)
Takashi Iwaicf5a2272012-02-20 16:31:07 +0100306{
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;
Takashi Iwai2ebab402016-02-09 10:23:52 +0100317 val = snd_hda_codec_read(codec, jack->nid, 0,
Takashi Iwaicf5a2272012-02-20 16:31:07 +0100318 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
David Henningsson29adc4b2012-09-25 11:31:00 +0200326static void alc880_unsol_event(struct hda_codec *codec, unsigned int res)
Takashi Iwaif21d78e2012-01-19 12:10:29 +0100327{
David Henningsson29adc4b2012-09-25 11:31:00 +0200328 /* 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);
Takashi Iwaif21d78e2012-01-19 12:10:29 +0100331}
332
Kailang Yang394c97f2014-11-12 17:38:08 +0800333/* 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
Takashi Iwai7639a062015-03-03 10:07:24 +0100340 switch (codec->core.vendor_id) {
Kailang Yang394c97f2014-11-12 17:38:08 +0800341 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;
Kailang Yang42314302016-02-03 15:03:50 +0800362 case 0x10ec0225:
Takashi Iwai44be77c2017-12-27 08:53:59 +0100363 case 0x10ec0295:
364 case 0x10ec0299:
365 alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
366 /* fallthrough */
367 case 0x10ec0215:
Kailang Yang394c97f2014-11-12 17:38:08 +0800368 case 0x10ec0233:
Kailang Yangea04a1d2018-04-25 15:31:52 +0800369 case 0x10ec0235:
Kailang Yang394c97f2014-11-12 17:38:08 +0800370 case 0x10ec0255:
Kailang Yangf429e7e2017-12-05 15:38:24 +0800371 case 0x10ec0257:
Kailang Yang394c97f2014-11-12 17:38:08 +0800372 case 0x10ec0282:
373 case 0x10ec0283:
374 case 0x10ec0286:
375 case 0x10ec0288:
Kailang Yang0a6f0602017-06-30 16:00:48 +0800376 case 0x10ec0285:
Kailang Yang506b62c2014-12-18 17:07:44 +0800377 case 0x10ec0298:
Kailang Yang0a6f0602017-06-30 16:00:48 +0800378 case 0x10ec0289:
Kailang Yang1078bef2018-11-08 16:36:15 +0800379 case 0x10ec0300:
Kailang Yang394c97f2014-11-12 17:38:08 +0800380 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
381 break;
Kailang Yange1e8c1f2019-11-26 17:04:23 +0800382 case 0x10ec0236:
383 case 0x10ec0256:
384 alc_write_coef_idx(codec, 0x36, 0x5757);
385 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
386 break;
Kailang Yang3aabf942017-11-08 15:28:33 +0800387 case 0x10ec0275:
388 alc_update_coef_idx(codec, 0xe, 0, 1<<0);
389 break;
Kailang Yang394c97f2014-11-12 17:38:08 +0800390 case 0x10ec0293:
391 alc_update_coef_idx(codec, 0xa, 1<<13, 0);
392 break;
Kailang Yangdcd4f0d2016-05-04 15:50:18 +0800393 case 0x10ec0234:
394 case 0x10ec0274:
395 case 0x10ec0294:
Kailang Yang6fbae352016-05-30 16:44:20 +0800396 case 0x10ec0700:
397 case 0x10ec0701:
398 case 0x10ec0703:
Kailang Yang83629532019-05-02 16:03:26 +0800399 case 0x10ec0711:
Kailang Yangdcd4f0d2016-05-04 15:50:18 +0800400 alc_update_coef_idx(codec, 0x10, 1<<15, 0);
401 break;
Kailang Yang394c97f2014-11-12 17:38:08 +0800402 case 0x10ec0662:
403 if ((coef & 0x00f0) == 0x0030)
404 alc_update_coef_idx(codec, 0x4, 1<<10, 0); /* EAPD Ctrl */
405 break;
406 case 0x10ec0272:
407 case 0x10ec0273:
408 case 0x10ec0663:
409 case 0x10ec0665:
410 case 0x10ec0670:
411 case 0x10ec0671:
412 case 0x10ec0672:
413 alc_update_coef_idx(codec, 0xd, 0, 1<<14); /* EAPD Ctrl */
414 break;
Kailang Yang9194a1e2020-01-07 17:22:19 +0800415 case 0x10ec0222:
Kailang Yangf0778872019-10-24 15:13:32 +0800416 case 0x10ec0623:
417 alc_update_coef_idx(codec, 0x19, 1<<13, 0);
418 break;
Kailang Yang394c97f2014-11-12 17:38:08 +0800419 case 0x10ec0668:
420 alc_update_coef_idx(codec, 0x7, 3<<13, 0);
421 break;
422 case 0x10ec0867:
423 alc_update_coef_idx(codec, 0x4, 1<<10, 0);
424 break;
425 case 0x10ec0888:
426 if ((coef & 0x00f0) == 0x0020 || (coef & 0x00f0) == 0x0030)
427 alc_update_coef_idx(codec, 0x7, 1<<5, 0);
428 break;
429 case 0x10ec0892:
430 alc_update_coef_idx(codec, 0x7, 1<<5, 0);
431 break;
432 case 0x10ec0899:
433 case 0x10ec0900:
Kailang Yang6d9ffcf2020-01-03 16:24:06 +0800434 case 0x10ec0b00:
Kailang Yang65553b12017-07-11 15:15:47 +0800435 case 0x10ec1168:
Kailang Yanga535ad52017-01-16 16:59:26 +0800436 case 0x10ec1220:
Kailang Yang394c97f2014-11-12 17:38:08 +0800437 alc_update_coef_idx(codec, 0x7, 1<<1, 0);
438 break;
439 }
440}
441
Kailang Yangf9423e72008-05-27 12:32:25 +0200442/* additional initialization for ALC888 variants */
443static void alc888_coef_init(struct hda_codec *codec)
444{
Kailang Yang1df88742014-10-29 16:10:13 +0800445 switch (alc_get_coef0(codec) & 0x00f0) {
446 /* alc888-VA */
447 case 0x00:
448 /* alc888-VB */
449 case 0x10:
450 alc_update_coef_idx(codec, 7, 0, 0x2030); /* Turn EAPD to High */
451 break;
452 }
Jaroslav Kysela87a8c372009-07-23 10:58:29 +0200453}
454
Takashi Iwai3fb4a502010-01-19 15:46:37 +0100455/* turn on/off EAPD control (only if available) */
456static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
457{
458 if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
459 return;
460 if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
461 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
462 on ? 2 : 0);
463}
464
Takashi Iwai691f1fc2011-04-07 10:31:43 +0200465/* turn on/off EAPD controls of the codec */
466static void alc_auto_setup_eapd(struct hda_codec *codec, bool on)
467{
468 /* We currently only handle front, HP */
Michał Mirosławcaf3c042020-01-03 10:23:48 +0100469 static const hda_nid_t pins[] = {
Hui Wangaf95b412015-03-26 17:14:55 +0800470 0x0f, 0x10, 0x14, 0x15, 0x17, 0
Takashi Iwai39fa84e2011-06-27 15:28:57 +0200471 };
Michał Mirosławcaf3c042020-01-03 10:23:48 +0100472 const hda_nid_t *p;
Takashi Iwai39fa84e2011-06-27 15:28:57 +0200473 for (p = pins; *p; p++)
474 set_eapd(codec, *p, on);
Takashi Iwai691f1fc2011-04-07 10:31:43 +0200475}
476
Kailang Yangdad31972019-05-10 16:28:57 +0800477static int find_ext_mic_pin(struct hda_codec *codec);
478
479static void alc_headset_mic_no_shutup(struct hda_codec *codec)
480{
481 const struct hda_pincfg *pin;
482 int mic_pin = find_ext_mic_pin(codec);
483 int i;
484
485 /* don't shut up pins when unloading the driver; otherwise it breaks
486 * the default pin setup at the next load of the driver
487 */
488 if (codec->bus->shutdown)
489 return;
490
491 snd_array_for_each(&codec->init_pins, i, pin) {
492 /* use read here for syncing after issuing each verb */
493 if (pin->nid != mic_pin)
494 snd_hda_codec_read(codec, pin->nid, 0,
495 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
496 }
497
498 codec->pins_shutup = 1;
499}
500
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +0100501static void alc_shutup_pins(struct hda_codec *codec)
502{
503 struct alc_spec *spec = codec->spec;
504
Kailang Yangdad31972019-05-10 16:28:57 +0800505 switch (codec->core.vendor_id) {
Kailang Yang66c5d712019-12-09 15:56:15 +0800506 case 0x10ec0283:
Kailang Yangdad31972019-05-10 16:28:57 +0800507 case 0x10ec0286:
508 case 0x10ec0288:
509 case 0x10ec0298:
510 alc_headset_mic_no_shutup(codec);
511 break;
512 default:
513 if (!spec->no_shutup_pins)
514 snd_hda_shutup_pins(codec);
515 break;
516 }
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +0100517}
518
Takashi Iwai1c7161532011-04-07 10:37:16 +0200519/* generic shutup callback;
Lars-Peter Clausen4ce8e6a2016-11-08 15:48:06 +0100520 * just turning off EAPD and a little pause for avoiding pop-noise
Takashi Iwai1c7161532011-04-07 10:37:16 +0200521 */
522static void alc_eapd_shutup(struct hda_codec *codec)
523{
Kailang Yang97a26572013-11-29 00:35:26 -0500524 struct alc_spec *spec = codec->spec;
525
Takashi Iwai1c7161532011-04-07 10:37:16 +0200526 alc_auto_setup_eapd(codec, false);
Kailang Yang97a26572013-11-29 00:35:26 -0500527 if (!spec->no_depop_delay)
528 msleep(200);
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +0100529 alc_shutup_pins(codec);
Takashi Iwai1c7161532011-04-07 10:37:16 +0200530}
531
Takashi Iwai1d045db2011-07-07 18:23:21 +0200532/* generic EAPD initialization */
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200533static void alc_auto_init_amp(struct hda_codec *codec, int type)
Kailang Yangbc9f98a2007-04-12 13:06:07 +0200534{
Takashi Iwai39fa84e2011-06-27 15:28:57 +0200535 alc_auto_setup_eapd(codec, true);
Takashi Iwai5579cd62018-06-19 22:22:41 +0200536 alc_write_gpio(codec);
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200537 switch (type) {
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200538 case ALC_INIT_DEFAULT:
Takashi Iwai7639a062015-03-03 10:07:24 +0100539 switch (codec->core.vendor_id) {
Kailang Yangc9b58002007-10-16 14:30:01 +0200540 case 0x10ec0260:
Takashi Iwai98b24882014-08-18 13:47:50 +0200541 alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x2010);
Kailang Yangc9b58002007-10-16 14:30:01 +0200542 break;
Kailang Yangc9b58002007-10-16 14:30:01 +0200543 case 0x10ec0880:
544 case 0x10ec0882:
545 case 0x10ec0883:
546 case 0x10ec0885:
Kailang Yang1df88742014-10-29 16:10:13 +0800547 alc_update_coef_idx(codec, 7, 0, 0x2030);
Kailang Yangc9b58002007-10-16 14:30:01 +0200548 break;
Kailang Yangf9423e72008-05-27 12:32:25 +0200549 case 0x10ec0888:
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200550 alc888_coef_init(codec);
Kailang Yangf9423e72008-05-27 12:32:25 +0200551 break;
Kailang Yangbc9f98a2007-04-12 13:06:07 +0200552 }
Kailang Yangbc9f98a2007-04-12 13:06:07 +0200553 break;
554 }
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200555}
Kailang Yangea1fb292008-08-26 12:58:38 +0200556
Takashi Iwai35a39f92019-02-01 11:19:50 +0100557/* get a primary headphone pin if available */
558static hda_nid_t alc_get_hp_pin(struct alc_spec *spec)
559{
560 if (spec->gen.autocfg.hp_pins[0])
561 return spec->gen.autocfg.hp_pins[0];
562 if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
563 return spec->gen.autocfg.line_out_pins[0];
564 return 0;
565}
Takashi Iwai1d045db2011-07-07 18:23:21 +0200566
567/*
568 * Realtek SSID verification
569 */
570
David Henningsson90622912010-10-14 14:50:18 +0200571/* Could be any non-zero and even value. When used as fixup, tells
572 * the driver to ignore any present sku defines.
573 */
574#define ALC_FIXUP_SKU_IGNORE (2)
575
Takashi Iwai23d30f22012-05-07 17:17:32 +0200576static void alc_fixup_sku_ignore(struct hda_codec *codec,
577 const struct hda_fixup *fix, int action)
578{
579 struct alc_spec *spec = codec->spec;
580 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
581 spec->cdefine.fixup = 1;
582 spec->cdefine.sku_cfg = ALC_FIXUP_SKU_IGNORE;
583 }
584}
585
Mengdong Linb5c66112013-11-29 00:35:35 -0500586static void alc_fixup_no_depop_delay(struct hda_codec *codec,
587 const struct hda_fixup *fix, int action)
588{
589 struct alc_spec *spec = codec->spec;
590
Mengdong Lin84d2dc32013-12-02 22:26:03 -0500591 if (action == HDA_FIXUP_ACT_PROBE) {
Mengdong Linb5c66112013-11-29 00:35:35 -0500592 spec->no_depop_delay = 1;
Mengdong Lin84d2dc32013-12-02 22:26:03 -0500593 codec->depop_delay = 0;
594 }
Mengdong Linb5c66112013-11-29 00:35:35 -0500595}
596
Kailang Yangda00c242010-03-19 11:23:45 +0100597static int alc_auto_parse_customize_define(struct hda_codec *codec)
598{
599 unsigned int ass, tmp, i;
Takashi Iwai7fb56222010-03-22 17:09:47 +0100600 unsigned nid = 0;
Kailang Yangda00c242010-03-19 11:23:45 +0100601 struct alc_spec *spec = codec->spec;
602
Takashi Iwaib6cbe512010-07-28 17:43:36 +0200603 spec->cdefine.enable_pcbeep = 1; /* assume always enabled */
604
David Henningsson90622912010-10-14 14:50:18 +0200605 if (spec->cdefine.fixup) {
606 ass = spec->cdefine.sku_cfg;
607 if (ass == ALC_FIXUP_SKU_IGNORE)
608 return -1;
609 goto do_sku;
610 }
611
Takashi Iwai5100cd02014-02-15 10:03:19 +0100612 if (!codec->bus->pci)
613 return -1;
Takashi Iwai7639a062015-03-03 10:07:24 +0100614 ass = codec->core.subsystem_id & 0xffff;
Takashi Iwaib6cbe512010-07-28 17:43:36 +0200615 if (ass != codec->bus->pci->subsystem_device && (ass & 1))
Kailang Yangda00c242010-03-19 11:23:45 +0100616 goto do_sku;
617
618 nid = 0x1d;
Takashi Iwai7639a062015-03-03 10:07:24 +0100619 if (codec->core.vendor_id == 0x10ec0260)
Kailang Yangda00c242010-03-19 11:23:45 +0100620 nid = 0x17;
621 ass = snd_hda_codec_get_pincfg(codec, nid);
622
623 if (!(ass & 1)) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100624 codec_info(codec, "%s: SKU not ready 0x%08x\n",
Takashi Iwai7639a062015-03-03 10:07:24 +0100625 codec->core.chip_name, ass);
Kailang Yangda00c242010-03-19 11:23:45 +0100626 return -1;
627 }
628
629 /* check sum */
630 tmp = 0;
631 for (i = 1; i < 16; i++) {
632 if ((ass >> i) & 1)
633 tmp++;
634 }
635 if (((ass >> 16) & 0xf) != tmp)
636 return -1;
637
638 spec->cdefine.port_connectivity = ass >> 30;
639 spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
640 spec->cdefine.check_sum = (ass >> 16) & 0xf;
641 spec->cdefine.customization = ass >> 8;
642do_sku:
643 spec->cdefine.sku_cfg = ass;
644 spec->cdefine.external_amp = (ass & 0x38) >> 3;
645 spec->cdefine.platform_type = (ass & 0x4) >> 2;
646 spec->cdefine.swap = (ass & 0x2) >> 1;
647 spec->cdefine.override = ass & 0x1;
648
Takashi Iwai4e76a882014-02-25 12:21:03 +0100649 codec_dbg(codec, "SKU: Nid=0x%x sku_cfg=0x%08x\n",
Kailang Yangda00c242010-03-19 11:23:45 +0100650 nid, spec->cdefine.sku_cfg);
Takashi Iwai4e76a882014-02-25 12:21:03 +0100651 codec_dbg(codec, "SKU: port_connectivity=0x%x\n",
Kailang Yangda00c242010-03-19 11:23:45 +0100652 spec->cdefine.port_connectivity);
Takashi Iwai4e76a882014-02-25 12:21:03 +0100653 codec_dbg(codec, "SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
654 codec_dbg(codec, "SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
655 codec_dbg(codec, "SKU: customization=0x%08x\n", spec->cdefine.customization);
656 codec_dbg(codec, "SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
657 codec_dbg(codec, "SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
658 codec_dbg(codec, "SKU: swap=0x%x\n", spec->cdefine.swap);
659 codec_dbg(codec, "SKU: override=0x%x\n", spec->cdefine.override);
Kailang Yangda00c242010-03-19 11:23:45 +0100660
661 return 0;
662}
663
Takashi Iwai08c189f2012-12-19 15:22:24 +0100664/* return the position of NID in the list, or -1 if not found */
665static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
666{
667 int i;
668 for (i = 0; i < nums; i++)
669 if (list[i] == nid)
670 return i;
671 return -1;
672}
Takashi Iwai1d045db2011-07-07 18:23:21 +0200673/* return true if the given NID is found in the list */
Takashi Iwai3af9ee62011-06-27 12:34:01 +0200674static bool found_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
675{
Takashi Iwai21268962011-07-07 15:01:13 +0200676 return find_idx_in_nid_list(nid, list, nums) >= 0;
Takashi Iwai3af9ee62011-06-27 12:34:01 +0200677}
678
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200679/* check subsystem ID and set up device-specific initialization;
680 * return 1 if initialized, 0 if invalid SSID
681 */
682/* 32-bit subsystem ID for BIOS loading in HD Audio codec.
683 * 31 ~ 16 : Manufacture ID
684 * 15 ~ 8 : SKU ID
685 * 7 ~ 0 : Assembly ID
686 * port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
687 */
Takashi Iwai58c57cf2014-01-07 18:22:49 +0100688static int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports)
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200689{
690 unsigned int ass, tmp, i;
691 unsigned nid;
692 struct alc_spec *spec = codec->spec;
693
David Henningsson90622912010-10-14 14:50:18 +0200694 if (spec->cdefine.fixup) {
695 ass = spec->cdefine.sku_cfg;
696 if (ass == ALC_FIXUP_SKU_IGNORE)
697 return 0;
698 goto do_sku;
699 }
700
Takashi Iwai7639a062015-03-03 10:07:24 +0100701 ass = codec->core.subsystem_id & 0xffff;
Takashi Iwai5100cd02014-02-15 10:03:19 +0100702 if (codec->bus->pci &&
703 ass != codec->bus->pci->subsystem_device && (ass & 1))
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200704 goto do_sku;
705
706 /* invalid SSID, check the special NID pin defcfg instead */
707 /*
Sasha Alexandrdef319f2009-06-16 16:00:15 -0400708 * 31~30 : port connectivity
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200709 * 29~21 : reserve
710 * 20 : PCBEEP input
711 * 19~16 : Check sum (15:1)
712 * 15~1 : Custom
713 * 0 : override
714 */
715 nid = 0x1d;
Takashi Iwai7639a062015-03-03 10:07:24 +0100716 if (codec->core.vendor_id == 0x10ec0260)
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200717 nid = 0x17;
718 ass = snd_hda_codec_get_pincfg(codec, nid);
Takashi Iwai4e76a882014-02-25 12:21:03 +0100719 codec_dbg(codec,
720 "realtek: No valid SSID, checking pincfg 0x%08x for NID 0x%x\n",
Takashi Iwaicb6605c2009-04-28 13:03:19 +0200721 ass, nid);
Kailang Yang6227cdc2010-02-25 08:36:52 +0100722 if (!(ass & 1))
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200723 return 0;
724 if ((ass >> 30) != 1) /* no physical connection */
725 return 0;
726
727 /* check sum */
728 tmp = 0;
729 for (i = 1; i < 16; i++) {
730 if ((ass >> i) & 1)
731 tmp++;
732 }
733 if (((ass >> 16) & 0xf) != tmp)
734 return 0;
735do_sku:
Takashi Iwai4e76a882014-02-25 12:21:03 +0100736 codec_dbg(codec, "realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
Takashi Iwai7639a062015-03-03 10:07:24 +0100737 ass & 0xffff, codec->core.vendor_id);
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200738 /*
739 * 0 : override
740 * 1 : Swap Jack
741 * 2 : 0 --> Desktop, 1 --> Laptop
742 * 3~5 : External Amplifier control
743 * 7~6 : Reserved
744 */
745 tmp = (ass & 0x38) >> 3; /* external Amp control */
Takashi Iwai1c76aa52018-06-21 16:37:54 +0200746 if (spec->init_amp == ALC_INIT_UNDEFINED) {
747 switch (tmp) {
748 case 1:
Takashi Iwai5579cd62018-06-19 22:22:41 +0200749 alc_setup_gpio(codec, 0x01);
Takashi Iwai1c76aa52018-06-21 16:37:54 +0200750 break;
751 case 3:
Takashi Iwai5579cd62018-06-19 22:22:41 +0200752 alc_setup_gpio(codec, 0x02);
Takashi Iwai1c76aa52018-06-21 16:37:54 +0200753 break;
754 case 7:
Takashi Iwai5579cd62018-06-19 22:22:41 +0200755 alc_setup_gpio(codec, 0x03);
Takashi Iwai1c76aa52018-06-21 16:37:54 +0200756 break;
757 case 5:
758 default:
759 spec->init_amp = ALC_INIT_DEFAULT;
760 break;
761 }
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200762 }
763
764 /* is laptop or Desktop and enable the function "Mute internal speaker
765 * when the external headphone out jack is plugged"
766 */
767 if (!(ass & 0x8000))
768 return 1;
769 /*
770 * 10~8 : Jack location
771 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
772 * 14~13: Resvered
773 * 15 : 1 --> enable the function "Mute internal speaker
774 * when the external headphone out jack is plugged"
775 */
Takashi Iwai35a39f92019-02-01 11:19:50 +0100776 if (!alc_get_hp_pin(spec)) {
Takashi Iwai01d48252009-10-06 13:21:54 +0200777 hda_nid_t nid;
Kailang Yangc9b58002007-10-16 14:30:01 +0200778 tmp = (ass >> 11) & 0x3; /* HP to chassis */
Takashi Iwai58c57cf2014-01-07 18:22:49 +0100779 nid = ports[tmp];
Takashi Iwai08c189f2012-12-19 15:22:24 +0100780 if (found_in_nid_list(nid, spec->gen.autocfg.line_out_pins,
781 spec->gen.autocfg.line_outs))
Takashi Iwai3af9ee62011-06-27 12:34:01 +0200782 return 1;
Takashi Iwai08c189f2012-12-19 15:22:24 +0100783 spec->gen.autocfg.hp_pins[0] = nid;
Kailang Yangc9b58002007-10-16 14:30:01 +0200784 }
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200785 return 1;
786}
Kailang Yangea1fb292008-08-26 12:58:38 +0200787
Takashi Iwai3e6179b2011-07-08 16:55:13 +0200788/* Check the validity of ALC subsystem-id
789 * ports contains an array of 4 pin NIDs for port-A, E, D and I */
790static void alc_ssid_check(struct hda_codec *codec, const hda_nid_t *ports)
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200791{
Takashi Iwai58c57cf2014-01-07 18:22:49 +0100792 if (!alc_subsystem_id(codec, ports)) {
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200793 struct alc_spec *spec = codec->spec;
Takashi Iwai4e76a882014-02-25 12:21:03 +0100794 codec_dbg(codec,
795 "realtek: Enable default setup for auto mode as fallback\n");
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200796 spec->init_amp = ALC_INIT_DEFAULT;
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200797 }
Takashi Iwai21268962011-07-07 15:01:13 +0200798}
Takashi Iwai1a1455d2011-04-28 17:36:18 +0200799
Takashi Iwai41e41f12005-06-08 14:48:49 +0200800/*
Takashi Iwai1d045db2011-07-07 18:23:21 +0200801 */
802
David Henningsson9d36a7d2014-10-07 10:18:42 +0200803static void alc_fixup_inv_dmic(struct hda_codec *codec,
804 const struct hda_fixup *fix, int action)
Takashi Iwai125821a2012-06-22 14:30:29 +0200805{
806 struct alc_spec *spec = codec->spec;
Takashi Iwai668d1e92012-11-29 14:10:17 +0100807
David Henningsson9d36a7d2014-10-07 10:18:42 +0200808 spec->gen.inv_dmic_split = 1;
Takashi Iwai6e72aa52012-06-25 10:52:25 +0200809}
810
Takashi Iwai603c4012008-07-30 15:01:44 +0200811
Takashi Iwai2eab6942012-12-18 15:30:41 +0100812static int alc_build_controls(struct hda_codec *codec)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700813{
Takashi Iwaia5cb4632018-06-20 12:50:11 +0200814 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700815
Takashi Iwai08c189f2012-12-19 15:22:24 +0100816 err = snd_hda_gen_build_controls(codec);
817 if (err < 0)
818 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700819
Takashi Iwai1727a772013-01-10 09:52:52 +0100820 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_BUILD);
Takashi Iwai420b0fe2012-03-12 12:35:27 +0100821 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700822}
823
Takashi Iwaie9edcee2005-06-13 14:16:38 +0200824
Linus Torvalds1da177e2005-04-16 15:20:36 -0700825/*
Takashi Iwaiae6b8132006-03-03 16:47:17 +0100826 * Common callbacks
Takashi Iwaie9edcee2005-06-13 14:16:38 +0200827 */
Takashi Iwai16ded522005-06-10 19:58:24 +0200828
Takashi Iwaic9af7532019-05-10 11:01:43 +0200829static void alc_pre_init(struct hda_codec *codec)
830{
831 alc_fill_eapd_coef(codec);
832}
833
Kailang Yangaeac1a02019-05-16 16:10:44 +0800834#define is_s3_resume(codec) \
835 ((codec)->core.dev.power.power_state.event == PM_EVENT_RESUME)
Takashi Iwaic9af7532019-05-10 11:01:43 +0200836#define is_s4_resume(codec) \
837 ((codec)->core.dev.power.power_state.event == PM_EVENT_RESTORE)
838
Linus Torvalds1da177e2005-04-16 15:20:36 -0700839static int alc_init(struct hda_codec *codec)
840{
841 struct alc_spec *spec = codec->spec;
Takashi Iwaie9edcee2005-06-13 14:16:38 +0200842
Takashi Iwaic9af7532019-05-10 11:01:43 +0200843 /* hibernation resume needs the full chip initialization */
844 if (is_s4_resume(codec))
845 alc_pre_init(codec);
846
Takashi Iwai546bb672012-03-07 08:37:19 +0100847 if (spec->init_hook)
848 spec->init_hook(codec);
Kailang Yang526af6e2012-03-07 08:25:20 +0100849
Takashi Iwai89781d02019-08-30 12:03:38 +0200850 spec->gen.skip_verbs = 1; /* applied in below */
Kailang Yang607ca3b2019-04-26 16:35:41 +0800851 snd_hda_gen_init(codec);
Takashi Iwai2c3bf9a2008-06-04 12:39:38 +0200852 alc_fix_pll(codec);
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200853 alc_auto_init_amp(codec, spec->init_amp);
Takashi Iwai89781d02019-08-30 12:03:38 +0200854 snd_hda_apply_verbs(codec); /* apply verbs here after own init */
Takashi Iwai2c3bf9a2008-06-04 12:39:38 +0200855
Takashi Iwai1727a772013-01-10 09:52:52 +0100856 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT);
Takashi Iwaie08a0072006-09-07 17:52:14 +0200857
Linus Torvalds1da177e2005-04-16 15:20:36 -0700858 return 0;
859}
860
Takashi Iwaia4e09aa2009-12-27 11:22:24 +0100861static inline void alc_shutup(struct hda_codec *codec)
862{
Takashi Iwai1c7161532011-04-07 10:37:16 +0200863 struct alc_spec *spec = codec->spec;
864
Takashi Iwaic7273bd2018-06-12 16:09:57 +0200865 if (!snd_hda_get_bool_hint(codec, "shutup"))
866 return; /* disabled explicitly by hints */
867
Takashi Iwai1c7161532011-04-07 10:37:16 +0200868 if (spec && spec->shutup)
869 spec->shutup(codec);
Takashi Iwai9bfb2842013-07-24 14:31:50 +0200870 else
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +0100871 alc_shutup_pins(codec);
Takashi Iwaia4e09aa2009-12-27 11:22:24 +0100872}
873
Takashi Iwai70a09762015-12-15 14:59:58 +0100874static void alc_reboot_notify(struct hda_codec *codec)
875{
876 struct alc_spec *spec = codec->spec;
877
878 if (spec && spec->reboot_notify)
879 spec->reboot_notify(codec);
880 else
881 alc_shutup(codec);
882}
883
Takashi Iwai8a02c0c2014-02-10 18:09:45 +0100884#define alc_free snd_hda_gen_free
Linus Torvalds1da177e2005-04-16 15:20:36 -0700885
Takashi Iwai83012a72012-08-24 18:38:08 +0200886#ifdef CONFIG_PM
Daniel T Chenc97259d2009-12-27 18:52:08 -0500887static void alc_power_eapd(struct hda_codec *codec)
888{
Takashi Iwai691f1fc2011-04-07 10:31:43 +0200889 alc_auto_setup_eapd(codec, false);
Daniel T Chenc97259d2009-12-27 18:52:08 -0500890}
891
Takashi Iwai68cb2b52012-07-02 15:20:37 +0200892static int alc_suspend(struct hda_codec *codec)
Hector Martinf5de24b2009-12-20 22:51:31 +0100893{
894 struct alc_spec *spec = codec->spec;
Takashi Iwaia4e09aa2009-12-27 11:22:24 +0100895 alc_shutup(codec);
Hector Martinf5de24b2009-12-20 22:51:31 +0100896 if (spec && spec->power_hook)
Daniel T Chenc97259d2009-12-27 18:52:08 -0500897 spec->power_hook(codec);
Hector Martinf5de24b2009-12-20 22:51:31 +0100898 return 0;
899}
900#endif
901
Takashi Iwai2a439522011-07-26 09:52:50 +0200902#ifdef CONFIG_PM
Takashi Iwaie044c392008-10-27 16:56:24 +0100903static int alc_resume(struct hda_codec *codec)
904{
Kailang Yang97a26572013-11-29 00:35:26 -0500905 struct alc_spec *spec = codec->spec;
906
907 if (!spec->no_depop_delay)
908 msleep(150); /* to avoid pop noise */
Takashi Iwaie044c392008-10-27 16:56:24 +0100909 codec->patch_ops.init(codec);
Takashi Iwai1a462be2020-01-09 10:01:04 +0100910 snd_hda_regmap_sync(codec);
Takashi Iwai9e5341b2010-09-21 09:57:06 +0200911 hda_call_check_power_status(codec, 0x01);
Takashi Iwaie044c392008-10-27 16:56:24 +0100912 return 0;
913}
Takashi Iwaie044c392008-10-27 16:56:24 +0100914#endif
915
Linus Torvalds1da177e2005-04-16 15:20:36 -0700916/*
917 */
Takashi Iwaia9111322011-05-02 11:30:18 +0200918static const struct hda_codec_ops alc_patch_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700919 .build_controls = alc_build_controls,
Takashi Iwai08c189f2012-12-19 15:22:24 +0100920 .build_pcms = snd_hda_gen_build_pcms,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700921 .init = alc_init,
922 .free = alc_free,
David Henningsson29adc4b2012-09-25 11:31:00 +0200923 .unsol_event = snd_hda_jack_unsol_event,
Takashi Iwai2a439522011-07-26 09:52:50 +0200924#ifdef CONFIG_PM
Takashi Iwaie044c392008-10-27 16:56:24 +0100925 .resume = alc_resume,
Hector Martinf5de24b2009-12-20 22:51:31 +0100926 .suspend = alc_suspend,
Takashi Iwaifce52a32013-01-07 12:42:48 +0100927 .check_power_status = snd_hda_gen_check_power_status,
Takashi Iwaicb53c622007-08-10 17:21:45 +0200928#endif
Takashi Iwai70a09762015-12-15 14:59:58 +0100929 .reboot_notify = alc_reboot_notify,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700930};
931
David Henningsson29adc4b2012-09-25 11:31:00 +0200932
Takashi Iwaided255b2015-10-01 17:59:43 +0200933#define alc_codec_rename(codec, name) snd_hda_codec_set_name(codec, name)
Kailang Yangc027ddc2010-03-19 11:33:06 +0100934
Takashi Iwai2fa522b2005-05-12 14:51:12 +0200935/*
Kailang Yang4b016932013-11-28 11:55:09 +0100936 * Rename codecs appropriately from COEF value or subvendor id
Takashi Iwaie16fb6d2011-10-17 16:39:09 +0200937 */
938struct alc_codec_rename_table {
939 unsigned int vendor_id;
940 unsigned short coef_mask;
941 unsigned short coef_bits;
942 const char *name;
943};
944
Kailang Yang4b016932013-11-28 11:55:09 +0100945struct alc_codec_rename_pci_table {
946 unsigned int codec_vendor_id;
947 unsigned short pci_subvendor;
948 unsigned short pci_subdevice;
949 const char *name;
950};
951
Takashi Iwai6b0f95c2020-01-05 15:47:18 +0100952static const struct alc_codec_rename_table rename_tbl[] = {
Kailang Yange6e5f7a2014-06-06 16:46:43 +0800953 { 0x10ec0221, 0xf00f, 0x1003, "ALC231" },
Takashi Iwaie16fb6d2011-10-17 16:39:09 +0200954 { 0x10ec0269, 0xfff0, 0x3010, "ALC277" },
955 { 0x10ec0269, 0xf0f0, 0x2010, "ALC259" },
956 { 0x10ec0269, 0xf0f0, 0x3010, "ALC258" },
957 { 0x10ec0269, 0x00f0, 0x0010, "ALC269VB" },
958 { 0x10ec0269, 0xffff, 0xa023, "ALC259" },
959 { 0x10ec0269, 0xffff, 0x6023, "ALC281X" },
960 { 0x10ec0269, 0x00f0, 0x0020, "ALC269VC" },
Kailang Yangadcc70b2012-05-25 08:08:38 +0200961 { 0x10ec0269, 0x00f0, 0x0030, "ALC269VD" },
Kailang Yange6e5f7a2014-06-06 16:46:43 +0800962 { 0x10ec0662, 0xffff, 0x4020, "ALC656" },
Takashi Iwaie16fb6d2011-10-17 16:39:09 +0200963 { 0x10ec0887, 0x00f0, 0x0030, "ALC887-VD" },
964 { 0x10ec0888, 0x00f0, 0x0030, "ALC888-VD" },
965 { 0x10ec0888, 0xf0f0, 0x3020, "ALC886" },
966 { 0x10ec0899, 0x2000, 0x2000, "ALC899" },
967 { 0x10ec0892, 0xffff, 0x8020, "ALC661" },
968 { 0x10ec0892, 0xffff, 0x8011, "ALC661" },
969 { 0x10ec0892, 0xffff, 0x4011, "ALC656" },
970 { } /* terminator */
971};
972
Takashi Iwai6b0f95c2020-01-05 15:47:18 +0100973static const struct alc_codec_rename_pci_table rename_pci_tbl[] = {
Kailang Yang4b016932013-11-28 11:55:09 +0100974 { 0x10ec0280, 0x1028, 0, "ALC3220" },
975 { 0x10ec0282, 0x1028, 0, "ALC3221" },
976 { 0x10ec0283, 0x1028, 0, "ALC3223" },
Kailang Yang193177d2014-04-23 16:06:13 +0800977 { 0x10ec0288, 0x1028, 0, "ALC3263" },
Kailang Yang4b016932013-11-28 11:55:09 +0100978 { 0x10ec0292, 0x1028, 0, "ALC3226" },
Kailang Yang193177d2014-04-23 16:06:13 +0800979 { 0x10ec0293, 0x1028, 0, "ALC3235" },
Kailang Yang4b016932013-11-28 11:55:09 +0100980 { 0x10ec0255, 0x1028, 0, "ALC3234" },
981 { 0x10ec0668, 0x1028, 0, "ALC3661" },
Kailang Yange6e5f7a2014-06-06 16:46:43 +0800982 { 0x10ec0275, 0x1028, 0, "ALC3260" },
983 { 0x10ec0899, 0x1028, 0, "ALC3861" },
Kailang Yang2c674fa2015-05-05 15:02:42 +0800984 { 0x10ec0298, 0x1028, 0, "ALC3266" },
Kailang Yang736f20a2017-10-20 15:06:34 +0800985 { 0x10ec0236, 0x1028, 0, "ALC3204" },
Kailang Yang82324502015-05-25 17:16:49 +0800986 { 0x10ec0256, 0x1028, 0, "ALC3246" },
Kailang Yang42314302016-02-03 15:03:50 +0800987 { 0x10ec0225, 0x1028, 0, "ALC3253" },
Kailang Yang7d727862016-05-24 16:46:07 +0800988 { 0x10ec0295, 0x1028, 0, "ALC3254" },
Kailang Yang28f1f9b2017-01-04 14:49:07 +0800989 { 0x10ec0299, 0x1028, 0, "ALC3271" },
Kailang Yange6e5f7a2014-06-06 16:46:43 +0800990 { 0x10ec0670, 0x1025, 0, "ALC669X" },
991 { 0x10ec0676, 0x1025, 0, "ALC679X" },
992 { 0x10ec0282, 0x1043, 0, "ALC3229" },
993 { 0x10ec0233, 0x1043, 0, "ALC3236" },
994 { 0x10ec0280, 0x103c, 0, "ALC3228" },
995 { 0x10ec0282, 0x103c, 0, "ALC3227" },
996 { 0x10ec0286, 0x103c, 0, "ALC3242" },
997 { 0x10ec0290, 0x103c, 0, "ALC3241" },
998 { 0x10ec0668, 0x103c, 0, "ALC3662" },
999 { 0x10ec0283, 0x17aa, 0, "ALC3239" },
1000 { 0x10ec0292, 0x17aa, 0, "ALC3232" },
Kailang Yang4b016932013-11-28 11:55:09 +01001001 { } /* terminator */
1002};
1003
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02001004static int alc_codec_rename_from_preset(struct hda_codec *codec)
1005{
1006 const struct alc_codec_rename_table *p;
Kailang Yang4b016932013-11-28 11:55:09 +01001007 const struct alc_codec_rename_pci_table *q;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02001008
1009 for (p = rename_tbl; p->vendor_id; p++) {
Takashi Iwai7639a062015-03-03 10:07:24 +01001010 if (p->vendor_id != codec->core.vendor_id)
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02001011 continue;
Takashi Iwai1bb7e432011-10-17 16:50:59 +02001012 if ((alc_get_coef0(codec) & p->coef_mask) == p->coef_bits)
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02001013 return alc_codec_rename(codec, p->name);
1014 }
Kailang Yang4b016932013-11-28 11:55:09 +01001015
Takashi Iwai5100cd02014-02-15 10:03:19 +01001016 if (!codec->bus->pci)
1017 return 0;
Kailang Yang4b016932013-11-28 11:55:09 +01001018 for (q = rename_pci_tbl; q->codec_vendor_id; q++) {
Takashi Iwai7639a062015-03-03 10:07:24 +01001019 if (q->codec_vendor_id != codec->core.vendor_id)
Kailang Yang4b016932013-11-28 11:55:09 +01001020 continue;
1021 if (q->pci_subvendor != codec->bus->pci->subsystem_vendor)
1022 continue;
1023 if (!q->pci_subdevice ||
1024 q->pci_subdevice == codec->bus->pci->subsystem_device)
1025 return alc_codec_rename(codec, q->name);
1026 }
1027
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02001028 return 0;
1029}
1030
Takashi Iwaie4770622011-07-08 11:11:35 +02001031
1032/*
Takashi Iwai1d045db2011-07-07 18:23:21 +02001033 * Digital-beep handlers
1034 */
1035#ifdef CONFIG_SND_HDA_INPUT_BEEP
Takashi Iwaifea80fa2018-06-20 12:52:46 +02001036
1037/* additional beep mixers; private_value will be overwritten */
1038static const struct snd_kcontrol_new alc_beep_mixer[] = {
1039 HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
1040 HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
1041};
1042
1043/* set up and create beep controls */
1044static int set_beep_amp(struct alc_spec *spec, hda_nid_t nid,
1045 int idx, int dir)
1046{
1047 struct snd_kcontrol_new *knew;
1048 unsigned int beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir);
1049 int i;
1050
1051 for (i = 0; i < ARRAY_SIZE(alc_beep_mixer); i++) {
1052 knew = snd_hda_gen_add_kctl(&spec->gen, NULL,
1053 &alc_beep_mixer[i]);
1054 if (!knew)
1055 return -ENOMEM;
1056 knew->private_value = beep_amp;
1057 }
1058 return 0;
1059}
Takashi Iwai1d045db2011-07-07 18:23:21 +02001060
1061static const struct snd_pci_quirk beep_white_list[] = {
Duncan Roe71100052012-10-10 14:19:50 +02001062 SND_PCI_QUIRK(0x1043, 0x103c, "ASUS", 1),
W. Trevor Kinga4b7f21d2014-03-29 17:47:24 -07001063 SND_PCI_QUIRK(0x1043, 0x115d, "ASUS", 1),
Takashi Iwai1d045db2011-07-07 18:23:21 +02001064 SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),
Takashi Iwai8554ee42013-02-25 09:54:43 +01001065 SND_PCI_QUIRK(0x1043, 0x8376, "EeePC", 1),
Takashi Iwai1d045db2011-07-07 18:23:21 +02001066 SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1),
1067 SND_PCI_QUIRK(0x1043, 0x831a, "EeePC", 1),
1068 SND_PCI_QUIRK(0x1043, 0x834a, "EeePC", 1),
Takashi Iwai78f8baf2012-03-06 14:02:32 +01001069 SND_PCI_QUIRK(0x1458, 0xa002, "GA-MA790X", 1),
Takashi Iwai1d045db2011-07-07 18:23:21 +02001070 SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),
Takashi Iwai051c78a2019-08-22 09:58:07 +02001071 /* blacklist -- no beep available */
1072 SND_PCI_QUIRK(0x17aa, 0x309e, "Lenovo ThinkCentre M73", 0),
1073 SND_PCI_QUIRK(0x17aa, 0x30a3, "Lenovo ThinkCentre M93", 0),
Takashi Iwai1d045db2011-07-07 18:23:21 +02001074 {}
1075};
1076
1077static inline int has_cdefine_beep(struct hda_codec *codec)
1078{
1079 struct alc_spec *spec = codec->spec;
1080 const struct snd_pci_quirk *q;
1081 q = snd_pci_quirk_lookup(codec->bus->pci, beep_white_list);
1082 if (q)
1083 return q->value;
1084 return spec->cdefine.enable_pcbeep;
1085}
1086#else
Takashi Iwaifea80fa2018-06-20 12:52:46 +02001087#define set_beep_amp(spec, nid, idx, dir) 0
Takashi Iwai1d045db2011-07-07 18:23:21 +02001088#define has_cdefine_beep(codec) 0
1089#endif
1090
1091/* parse the BIOS configuration and set up the alc_spec */
1092/* return 1 if successful, 0 if the proper config is not found,
1093 * or a negative error code
1094 */
Takashi Iwai3e6179b2011-07-08 16:55:13 +02001095static int alc_parse_auto_config(struct hda_codec *codec,
1096 const hda_nid_t *ignore_nids,
1097 const hda_nid_t *ssid_nids)
Takashi Iwai1d045db2011-07-07 18:23:21 +02001098{
1099 struct alc_spec *spec = codec->spec;
Takashi Iwai08c189f2012-12-19 15:22:24 +01001100 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001101 int err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001102
Takashi Iwai53c334a2011-08-23 18:27:14 +02001103 err = snd_hda_parse_pin_defcfg(codec, cfg, ignore_nids,
1104 spec->parse_flags);
Takashi Iwai1d045db2011-07-07 18:23:21 +02001105 if (err < 0)
1106 return err;
Takashi Iwai3e6179b2011-07-08 16:55:13 +02001107
1108 if (ssid_nids)
1109 alc_ssid_check(codec, ssid_nids);
1110
Takashi Iwai08c189f2012-12-19 15:22:24 +01001111 err = snd_hda_gen_parse_auto_config(codec, cfg);
1112 if (err < 0)
1113 return err;
Takashi Iwai070cff42012-02-21 12:54:17 +01001114
Takashi Iwai1d045db2011-07-07 18:23:21 +02001115 return 1;
1116}
1117
Takashi Iwai3de95172012-05-07 18:03:15 +02001118/* common preparation job for alc_spec */
1119static int alc_alloc_spec(struct hda_codec *codec, hda_nid_t mixer_nid)
1120{
1121 struct alc_spec *spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1122 int err;
1123
1124 if (!spec)
1125 return -ENOMEM;
1126 codec->spec = spec;
Takashi Iwai08c189f2012-12-19 15:22:24 +01001127 snd_hda_gen_spec_init(&spec->gen);
1128 spec->gen.mixer_nid = mixer_nid;
1129 spec->gen.own_eapd_ctl = 1;
Takashi Iwai1098b7c2012-12-17 20:03:15 +01001130 codec->single_adc_amp = 1;
Takashi Iwai08c189f2012-12-19 15:22:24 +01001131 /* FIXME: do we need this for all Realtek codec models? */
1132 codec->spdif_status_reset = 1;
Takashi Iwai225068a2015-05-29 10:42:14 +02001133 codec->patch_ops = alc_patch_ops;
Takashi Iwai3de95172012-05-07 18:03:15 +02001134
1135 err = alc_codec_rename_from_preset(codec);
1136 if (err < 0) {
1137 kfree(spec);
1138 return err;
1139 }
1140 return 0;
1141}
1142
Takashi Iwai3e6179b2011-07-08 16:55:13 +02001143static int alc880_parse_auto_config(struct hda_codec *codec)
1144{
1145 static const hda_nid_t alc880_ignore[] = { 0x1d, 0 };
Jesper Juhl7d7eb9e2012-04-12 22:11:25 +02001146 static const hda_nid_t alc880_ssids[] = { 0x15, 0x1b, 0x14, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02001147 return alc_parse_auto_config(codec, alc880_ignore, alc880_ssids);
1148}
1149
Takashi Iwai1d045db2011-07-07 18:23:21 +02001150/*
Takashi Iwaiee3b2962011-11-15 14:26:54 +01001151 * ALC880 fix-ups
1152 */
1153enum {
Takashi Iwai411225a2012-02-20 17:48:19 +01001154 ALC880_FIXUP_GPIO1,
Takashi Iwaiee3b2962011-11-15 14:26:54 +01001155 ALC880_FIXUP_GPIO2,
1156 ALC880_FIXUP_MEDION_RIM,
Takashi Iwaidc6af522012-02-17 16:18:59 +01001157 ALC880_FIXUP_LG,
Takashi Iwaidb8a38e2013-08-09 12:34:42 +02001158 ALC880_FIXUP_LG_LW25,
Takashi Iwaif02aab52012-02-17 16:33:56 +01001159 ALC880_FIXUP_W810,
Takashi Iwai27e917f2012-02-17 17:49:54 +01001160 ALC880_FIXUP_EAPD_COEF,
Takashi Iwaib9368f52012-02-17 17:54:44 +01001161 ALC880_FIXUP_TCL_S700,
Takashi Iwaicf5a2272012-02-20 16:31:07 +01001162 ALC880_FIXUP_VOL_KNOB,
1163 ALC880_FIXUP_FUJITSU,
Takashi Iwaiba533812012-02-20 16:36:52 +01001164 ALC880_FIXUP_F1734,
Takashi Iwai817de922012-02-20 17:20:48 +01001165 ALC880_FIXUP_UNIWILL,
Takashi Iwai967b88c2012-02-20 17:31:02 +01001166 ALC880_FIXUP_UNIWILL_DIG,
Takashi Iwai96e225f2012-02-20 17:41:51 +01001167 ALC880_FIXUP_Z71V,
Takashi Iwai487a5882013-11-07 07:29:30 +01001168 ALC880_FIXUP_ASUS_W5A,
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001169 ALC880_FIXUP_3ST_BASE,
1170 ALC880_FIXUP_3ST,
1171 ALC880_FIXUP_3ST_DIG,
1172 ALC880_FIXUP_5ST_BASE,
1173 ALC880_FIXUP_5ST,
1174 ALC880_FIXUP_5ST_DIG,
1175 ALC880_FIXUP_6ST_BASE,
1176 ALC880_FIXUP_6ST,
1177 ALC880_FIXUP_6ST_DIG,
Takashi Iwai53971452013-01-23 18:21:37 +01001178 ALC880_FIXUP_6ST_AUTOMUTE,
Takashi Iwaiee3b2962011-11-15 14:26:54 +01001179};
1180
Takashi Iwaicf5a2272012-02-20 16:31:07 +01001181/* enable the volume-knob widget support on NID 0x21 */
1182static void alc880_fixup_vol_knob(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01001183 const struct hda_fixup *fix, int action)
Takashi Iwaicf5a2272012-02-20 16:31:07 +01001184{
Takashi Iwai1727a772013-01-10 09:52:52 +01001185 if (action == HDA_FIXUP_ACT_PROBE)
Takashi Iwai62f949b2014-09-11 14:06:53 +02001186 snd_hda_jack_detect_enable_callback(codec, 0x21,
1187 alc_update_knob_master);
Takashi Iwaicf5a2272012-02-20 16:31:07 +01001188}
1189
Takashi Iwai1727a772013-01-10 09:52:52 +01001190static const struct hda_fixup alc880_fixups[] = {
Takashi Iwai411225a2012-02-20 17:48:19 +01001191 [ALC880_FIXUP_GPIO1] = {
Takashi Iwai5579cd62018-06-19 22:22:41 +02001192 .type = HDA_FIXUP_FUNC,
1193 .v.func = alc_fixup_gpio1,
Takashi Iwai411225a2012-02-20 17:48:19 +01001194 },
Takashi Iwaiee3b2962011-11-15 14:26:54 +01001195 [ALC880_FIXUP_GPIO2] = {
Takashi Iwai5579cd62018-06-19 22:22:41 +02001196 .type = HDA_FIXUP_FUNC,
1197 .v.func = alc_fixup_gpio2,
Takashi Iwaiee3b2962011-11-15 14:26:54 +01001198 },
1199 [ALC880_FIXUP_MEDION_RIM] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001200 .type = HDA_FIXUP_VERBS,
Takashi Iwaiee3b2962011-11-15 14:26:54 +01001201 .v.verbs = (const struct hda_verb[]) {
1202 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1203 { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
1204 { }
1205 },
1206 .chained = true,
1207 .chain_id = ALC880_FIXUP_GPIO2,
1208 },
Takashi Iwaidc6af522012-02-17 16:18:59 +01001209 [ALC880_FIXUP_LG] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001210 .type = HDA_FIXUP_PINS,
1211 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaidc6af522012-02-17 16:18:59 +01001212 /* disable bogus unused pins */
1213 { 0x16, 0x411111f0 },
1214 { 0x18, 0x411111f0 },
1215 { 0x1a, 0x411111f0 },
1216 { }
1217 }
1218 },
Takashi Iwaidb8a38e2013-08-09 12:34:42 +02001219 [ALC880_FIXUP_LG_LW25] = {
1220 .type = HDA_FIXUP_PINS,
1221 .v.pins = (const struct hda_pintbl[]) {
1222 { 0x1a, 0x0181344f }, /* line-in */
1223 { 0x1b, 0x0321403f }, /* headphone */
1224 { }
1225 }
1226 },
Takashi Iwaif02aab52012-02-17 16:33:56 +01001227 [ALC880_FIXUP_W810] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001228 .type = HDA_FIXUP_PINS,
1229 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaif02aab52012-02-17 16:33:56 +01001230 /* disable bogus unused pins */
1231 { 0x17, 0x411111f0 },
1232 { }
1233 },
1234 .chained = true,
1235 .chain_id = ALC880_FIXUP_GPIO2,
1236 },
Takashi Iwai27e917f2012-02-17 17:49:54 +01001237 [ALC880_FIXUP_EAPD_COEF] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001238 .type = HDA_FIXUP_VERBS,
Takashi Iwai27e917f2012-02-17 17:49:54 +01001239 .v.verbs = (const struct hda_verb[]) {
1240 /* change to EAPD mode */
1241 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1242 { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
1243 {}
1244 },
1245 },
Takashi Iwaib9368f52012-02-17 17:54:44 +01001246 [ALC880_FIXUP_TCL_S700] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001247 .type = HDA_FIXUP_VERBS,
Takashi Iwaib9368f52012-02-17 17:54:44 +01001248 .v.verbs = (const struct hda_verb[]) {
1249 /* change to EAPD mode */
1250 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1251 { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
1252 {}
1253 },
1254 .chained = true,
1255 .chain_id = ALC880_FIXUP_GPIO2,
1256 },
Takashi Iwaicf5a2272012-02-20 16:31:07 +01001257 [ALC880_FIXUP_VOL_KNOB] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001258 .type = HDA_FIXUP_FUNC,
Takashi Iwaicf5a2272012-02-20 16:31:07 +01001259 .v.func = alc880_fixup_vol_knob,
1260 },
1261 [ALC880_FIXUP_FUJITSU] = {
1262 /* override all pins as BIOS on old Amilo is broken */
Takashi Iwai1727a772013-01-10 09:52:52 +01001263 .type = HDA_FIXUP_PINS,
1264 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaibb148bd2015-08-13 18:02:39 +02001265 { 0x14, 0x0121401f }, /* HP */
Takashi Iwaicf5a2272012-02-20 16:31:07 +01001266 { 0x15, 0x99030120 }, /* speaker */
1267 { 0x16, 0x99030130 }, /* bass speaker */
1268 { 0x17, 0x411111f0 }, /* N/A */
1269 { 0x18, 0x411111f0 }, /* N/A */
1270 { 0x19, 0x01a19950 }, /* mic-in */
1271 { 0x1a, 0x411111f0 }, /* N/A */
1272 { 0x1b, 0x411111f0 }, /* N/A */
1273 { 0x1c, 0x411111f0 }, /* N/A */
1274 { 0x1d, 0x411111f0 }, /* N/A */
1275 { 0x1e, 0x01454140 }, /* SPDIF out */
1276 { }
1277 },
1278 .chained = true,
1279 .chain_id = ALC880_FIXUP_VOL_KNOB,
1280 },
Takashi Iwaiba533812012-02-20 16:36:52 +01001281 [ALC880_FIXUP_F1734] = {
1282 /* almost compatible with FUJITSU, but no bass and SPDIF */
Takashi Iwai1727a772013-01-10 09:52:52 +01001283 .type = HDA_FIXUP_PINS,
1284 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaibb148bd2015-08-13 18:02:39 +02001285 { 0x14, 0x0121401f }, /* HP */
Takashi Iwaiba533812012-02-20 16:36:52 +01001286 { 0x15, 0x99030120 }, /* speaker */
1287 { 0x16, 0x411111f0 }, /* N/A */
1288 { 0x17, 0x411111f0 }, /* N/A */
1289 { 0x18, 0x411111f0 }, /* N/A */
1290 { 0x19, 0x01a19950 }, /* mic-in */
1291 { 0x1a, 0x411111f0 }, /* N/A */
1292 { 0x1b, 0x411111f0 }, /* N/A */
1293 { 0x1c, 0x411111f0 }, /* N/A */
1294 { 0x1d, 0x411111f0 }, /* N/A */
1295 { 0x1e, 0x411111f0 }, /* N/A */
1296 { }
1297 },
1298 .chained = true,
1299 .chain_id = ALC880_FIXUP_VOL_KNOB,
1300 },
Takashi Iwai817de922012-02-20 17:20:48 +01001301 [ALC880_FIXUP_UNIWILL] = {
1302 /* need to fix HP and speaker pins to be parsed correctly */
Takashi Iwai1727a772013-01-10 09:52:52 +01001303 .type = HDA_FIXUP_PINS,
1304 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai817de922012-02-20 17:20:48 +01001305 { 0x14, 0x0121411f }, /* HP */
1306 { 0x15, 0x99030120 }, /* speaker */
1307 { 0x16, 0x99030130 }, /* bass speaker */
1308 { }
1309 },
1310 },
Takashi Iwai967b88c2012-02-20 17:31:02 +01001311 [ALC880_FIXUP_UNIWILL_DIG] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001312 .type = HDA_FIXUP_PINS,
1313 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai967b88c2012-02-20 17:31:02 +01001314 /* disable bogus unused pins */
1315 { 0x17, 0x411111f0 },
1316 { 0x19, 0x411111f0 },
1317 { 0x1b, 0x411111f0 },
1318 { 0x1f, 0x411111f0 },
1319 { }
1320 }
1321 },
Takashi Iwai96e225f2012-02-20 17:41:51 +01001322 [ALC880_FIXUP_Z71V] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001323 .type = HDA_FIXUP_PINS,
1324 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai96e225f2012-02-20 17:41:51 +01001325 /* set up the whole pins as BIOS is utterly broken */
1326 { 0x14, 0x99030120 }, /* speaker */
1327 { 0x15, 0x0121411f }, /* HP */
1328 { 0x16, 0x411111f0 }, /* N/A */
1329 { 0x17, 0x411111f0 }, /* N/A */
1330 { 0x18, 0x01a19950 }, /* mic-in */
1331 { 0x19, 0x411111f0 }, /* N/A */
1332 { 0x1a, 0x01813031 }, /* line-in */
1333 { 0x1b, 0x411111f0 }, /* N/A */
1334 { 0x1c, 0x411111f0 }, /* N/A */
1335 { 0x1d, 0x411111f0 }, /* N/A */
1336 { 0x1e, 0x0144111e }, /* SPDIF */
1337 { }
1338 }
1339 },
Takashi Iwai487a5882013-11-07 07:29:30 +01001340 [ALC880_FIXUP_ASUS_W5A] = {
1341 .type = HDA_FIXUP_PINS,
1342 .v.pins = (const struct hda_pintbl[]) {
1343 /* set up the whole pins as BIOS is utterly broken */
1344 { 0x14, 0x0121411f }, /* HP */
1345 { 0x15, 0x411111f0 }, /* N/A */
1346 { 0x16, 0x411111f0 }, /* N/A */
1347 { 0x17, 0x411111f0 }, /* N/A */
1348 { 0x18, 0x90a60160 }, /* mic */
1349 { 0x19, 0x411111f0 }, /* N/A */
1350 { 0x1a, 0x411111f0 }, /* N/A */
1351 { 0x1b, 0x411111f0 }, /* N/A */
1352 { 0x1c, 0x411111f0 }, /* N/A */
1353 { 0x1d, 0x411111f0 }, /* N/A */
1354 { 0x1e, 0xb743111e }, /* SPDIF out */
1355 { }
1356 },
1357 .chained = true,
1358 .chain_id = ALC880_FIXUP_GPIO1,
1359 },
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001360 [ALC880_FIXUP_3ST_BASE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001361 .type = HDA_FIXUP_PINS,
1362 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001363 { 0x14, 0x01014010 }, /* line-out */
1364 { 0x15, 0x411111f0 }, /* N/A */
1365 { 0x16, 0x411111f0 }, /* N/A */
1366 { 0x17, 0x411111f0 }, /* N/A */
1367 { 0x18, 0x01a19c30 }, /* mic-in */
1368 { 0x19, 0x0121411f }, /* HP */
1369 { 0x1a, 0x01813031 }, /* line-in */
1370 { 0x1b, 0x02a19c40 }, /* front-mic */
1371 { 0x1c, 0x411111f0 }, /* N/A */
1372 { 0x1d, 0x411111f0 }, /* N/A */
1373 /* 0x1e is filled in below */
1374 { 0x1f, 0x411111f0 }, /* N/A */
1375 { }
1376 }
1377 },
1378 [ALC880_FIXUP_3ST] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001379 .type = HDA_FIXUP_PINS,
1380 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001381 { 0x1e, 0x411111f0 }, /* N/A */
1382 { }
1383 },
1384 .chained = true,
1385 .chain_id = ALC880_FIXUP_3ST_BASE,
1386 },
1387 [ALC880_FIXUP_3ST_DIG] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001388 .type = HDA_FIXUP_PINS,
1389 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001390 { 0x1e, 0x0144111e }, /* SPDIF */
1391 { }
1392 },
1393 .chained = true,
1394 .chain_id = ALC880_FIXUP_3ST_BASE,
1395 },
1396 [ALC880_FIXUP_5ST_BASE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001397 .type = HDA_FIXUP_PINS,
1398 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001399 { 0x14, 0x01014010 }, /* front */
1400 { 0x15, 0x411111f0 }, /* N/A */
1401 { 0x16, 0x01011411 }, /* CLFE */
1402 { 0x17, 0x01016412 }, /* surr */
1403 { 0x18, 0x01a19c30 }, /* mic-in */
1404 { 0x19, 0x0121411f }, /* HP */
1405 { 0x1a, 0x01813031 }, /* line-in */
1406 { 0x1b, 0x02a19c40 }, /* front-mic */
1407 { 0x1c, 0x411111f0 }, /* N/A */
1408 { 0x1d, 0x411111f0 }, /* N/A */
1409 /* 0x1e is filled in below */
1410 { 0x1f, 0x411111f0 }, /* N/A */
1411 { }
1412 }
1413 },
1414 [ALC880_FIXUP_5ST] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001415 .type = HDA_FIXUP_PINS,
1416 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001417 { 0x1e, 0x411111f0 }, /* N/A */
1418 { }
1419 },
1420 .chained = true,
1421 .chain_id = ALC880_FIXUP_5ST_BASE,
1422 },
1423 [ALC880_FIXUP_5ST_DIG] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001424 .type = HDA_FIXUP_PINS,
1425 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001426 { 0x1e, 0x0144111e }, /* SPDIF */
1427 { }
1428 },
1429 .chained = true,
1430 .chain_id = ALC880_FIXUP_5ST_BASE,
1431 },
1432 [ALC880_FIXUP_6ST_BASE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001433 .type = HDA_FIXUP_PINS,
1434 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001435 { 0x14, 0x01014010 }, /* front */
1436 { 0x15, 0x01016412 }, /* surr */
1437 { 0x16, 0x01011411 }, /* CLFE */
1438 { 0x17, 0x01012414 }, /* side */
1439 { 0x18, 0x01a19c30 }, /* mic-in */
1440 { 0x19, 0x02a19c40 }, /* front-mic */
1441 { 0x1a, 0x01813031 }, /* line-in */
1442 { 0x1b, 0x0121411f }, /* HP */
1443 { 0x1c, 0x411111f0 }, /* N/A */
1444 { 0x1d, 0x411111f0 }, /* N/A */
1445 /* 0x1e is filled in below */
1446 { 0x1f, 0x411111f0 }, /* N/A */
1447 { }
1448 }
1449 },
1450 [ALC880_FIXUP_6ST] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001451 .type = HDA_FIXUP_PINS,
1452 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001453 { 0x1e, 0x411111f0 }, /* N/A */
1454 { }
1455 },
1456 .chained = true,
1457 .chain_id = ALC880_FIXUP_6ST_BASE,
1458 },
1459 [ALC880_FIXUP_6ST_DIG] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001460 .type = HDA_FIXUP_PINS,
1461 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001462 { 0x1e, 0x0144111e }, /* SPDIF */
1463 { }
1464 },
1465 .chained = true,
1466 .chain_id = ALC880_FIXUP_6ST_BASE,
1467 },
Takashi Iwai53971452013-01-23 18:21:37 +01001468 [ALC880_FIXUP_6ST_AUTOMUTE] = {
1469 .type = HDA_FIXUP_PINS,
1470 .v.pins = (const struct hda_pintbl[]) {
1471 { 0x1b, 0x0121401f }, /* HP with jack detect */
1472 { }
1473 },
1474 .chained_before = true,
1475 .chain_id = ALC880_FIXUP_6ST_BASE,
1476 },
Takashi Iwaiee3b2962011-11-15 14:26:54 +01001477};
1478
1479static const struct snd_pci_quirk alc880_fixup_tbl[] = {
Takashi Iwaif02aab52012-02-17 16:33:56 +01001480 SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_FIXUP_W810),
Takashi Iwai487a5882013-11-07 07:29:30 +01001481 SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS W5A", ALC880_FIXUP_ASUS_W5A),
Takashi Iwai96e225f2012-02-20 17:41:51 +01001482 SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_FIXUP_Z71V),
Takashi Iwai29e3fdc2012-02-20 17:56:57 +01001483 SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_FIXUP_GPIO1),
David Henningsson6538de02014-06-10 10:52:50 +02001484 SND_PCI_QUIRK(0x147b, 0x1045, "ABit AA8XE", ALC880_FIXUP_6ST_AUTOMUTE),
Takashi Iwai29e3fdc2012-02-20 17:56:57 +01001485 SND_PCI_QUIRK(0x1558, 0x5401, "Clevo GPIO2", ALC880_FIXUP_GPIO2),
Takashi Iwai27e917f2012-02-17 17:49:54 +01001486 SND_PCI_QUIRK_VENDOR(0x1558, "Clevo", ALC880_FIXUP_EAPD_COEF),
Takashi Iwai967b88c2012-02-20 17:31:02 +01001487 SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_FIXUP_UNIWILL_DIG),
Takashi Iwaiba533812012-02-20 16:36:52 +01001488 SND_PCI_QUIRK(0x1584, 0x9054, "Uniwill", ALC880_FIXUP_F1734),
Takashi Iwai817de922012-02-20 17:20:48 +01001489 SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_FIXUP_UNIWILL),
Takashi Iwai7833c7e2012-02-20 17:11:38 +01001490 SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_FIXUP_VOL_KNOB),
Takashi Iwaif02aab52012-02-17 16:33:56 +01001491 SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_FIXUP_W810),
Takashi Iwaiee3b2962011-11-15 14:26:54 +01001492 SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_FIXUP_MEDION_RIM),
Takashi Iwai53971452013-01-23 18:21:37 +01001493 SND_PCI_QUIRK(0x1631, 0xe011, "PB 13201056", ALC880_FIXUP_6ST_AUTOMUTE),
Takashi Iwaia1615742015-08-13 18:05:06 +02001494 SND_PCI_QUIRK(0x1734, 0x107c, "FSC Amilo M1437", ALC880_FIXUP_FUJITSU),
Takashi Iwaicf5a2272012-02-20 16:31:07 +01001495 SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FIXUP_FUJITSU),
Takashi Iwaiba533812012-02-20 16:36:52 +01001496 SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_FIXUP_F1734),
Takashi Iwaicf5a2272012-02-20 16:31:07 +01001497 SND_PCI_QUIRK(0x1734, 0x10b0, "FSC Amilo Pi1556", ALC880_FIXUP_FUJITSU),
Takashi Iwaidc6af522012-02-17 16:18:59 +01001498 SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_FIXUP_LG),
1499 SND_PCI_QUIRK(0x1854, 0x005f, "LG P1 Express", ALC880_FIXUP_LG),
1500 SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_FIXUP_LG),
Takashi Iwaidb8a38e2013-08-09 12:34:42 +02001501 SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_FIXUP_LG_LW25),
Takashi Iwaib9368f52012-02-17 17:54:44 +01001502 SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_FIXUP_TCL_S700),
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001503
1504 /* Below is the copied entries from alc880_quirks.c.
1505 * It's not quite sure whether BIOS sets the correct pin-config table
1506 * on these machines, thus they are kept to be compatible with
1507 * the old static quirks. Once when it's confirmed to work without
1508 * these overrides, it'd be better to remove.
1509 */
1510 SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_FIXUP_5ST_DIG),
1511 SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_FIXUP_6ST),
1512 SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_FIXUP_3ST_DIG),
1513 SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_FIXUP_6ST_DIG),
1514 SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_FIXUP_6ST_DIG),
1515 SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_FIXUP_6ST_DIG),
1516 SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_FIXUP_3ST_DIG),
1517 SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_FIXUP_3ST),
1518 SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_FIXUP_6ST_DIG),
1519 SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_FIXUP_3ST),
1520 SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_FIXUP_3ST),
1521 SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_FIXUP_5ST),
1522 SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_FIXUP_5ST),
1523 SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_FIXUP_5ST),
1524 SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_FIXUP_6ST_DIG),
1525 SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_FIXUP_6ST_DIG),
1526 SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_FIXUP_6ST_DIG),
1527 SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_FIXUP_6ST_DIG),
1528 SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_FIXUP_5ST_DIG),
1529 SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_FIXUP_5ST_DIG),
1530 SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_FIXUP_5ST_DIG),
1531 SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_FIXUP_6ST_DIG), /* broken BIOS */
1532 SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_FIXUP_6ST_DIG),
1533 SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1534 SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1535 SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1536 SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1537 SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1538 SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1539 SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1540 SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1541 SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1542 SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1543 /* default Intel */
1544 SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_FIXUP_3ST),
1545 SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_FIXUP_5ST_DIG),
1546 SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_FIXUP_6ST_DIG),
1547 {}
1548};
1549
Takashi Iwai1727a772013-01-10 09:52:52 +01001550static const struct hda_model_fixup alc880_fixup_models[] = {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001551 {.id = ALC880_FIXUP_3ST, .name = "3stack"},
1552 {.id = ALC880_FIXUP_3ST_DIG, .name = "3stack-digout"},
1553 {.id = ALC880_FIXUP_5ST, .name = "5stack"},
1554 {.id = ALC880_FIXUP_5ST_DIG, .name = "5stack-digout"},
1555 {.id = ALC880_FIXUP_6ST, .name = "6stack"},
1556 {.id = ALC880_FIXUP_6ST_DIG, .name = "6stack-digout"},
Takashi Iwai53971452013-01-23 18:21:37 +01001557 {.id = ALC880_FIXUP_6ST_AUTOMUTE, .name = "6stack-automute"},
Takashi Iwaiee3b2962011-11-15 14:26:54 +01001558 {}
1559};
1560
1561
1562/*
Takashi Iwai1d045db2011-07-07 18:23:21 +02001563 * OK, here we have finally the patch for ALC880
1564 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02001565static int patch_alc880(struct hda_codec *codec)
1566{
1567 struct alc_spec *spec;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001568 int err;
1569
Takashi Iwai3de95172012-05-07 18:03:15 +02001570 err = alc_alloc_spec(codec, 0x0b);
1571 if (err < 0)
1572 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001573
Takashi Iwai3de95172012-05-07 18:03:15 +02001574 spec = codec->spec;
Takashi Iwai08c189f2012-12-19 15:22:24 +01001575 spec->gen.need_dac_fix = 1;
Takashi Iwai7504b6c2013-03-18 11:25:51 +01001576 spec->gen.beep_nid = 0x01;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001577
Takashi Iwai225068a2015-05-29 10:42:14 +02001578 codec->patch_ops.unsol_event = alc880_unsol_event;
1579
Takashi Iwaic9af7532019-05-10 11:01:43 +02001580 alc_pre_init(codec);
1581
Takashi Iwai1727a772013-01-10 09:52:52 +01001582 snd_hda_pick_fixup(codec, alc880_fixup_models, alc880_fixup_tbl,
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001583 alc880_fixups);
Takashi Iwai1727a772013-01-10 09:52:52 +01001584 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai1d045db2011-07-07 18:23:21 +02001585
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001586 /* automatic parse from the BIOS config */
1587 err = alc880_parse_auto_config(codec);
1588 if (err < 0)
1589 goto error;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001590
Takashi Iwaifea80fa2018-06-20 12:52:46 +02001591 if (!spec->gen.no_analog) {
1592 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
1593 if (err < 0)
1594 goto error;
1595 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02001596
Takashi Iwai1727a772013-01-10 09:52:52 +01001597 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01001598
Takashi Iwai1d045db2011-07-07 18:23:21 +02001599 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02001600
1601 error:
1602 alc_free(codec);
1603 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001604}
1605
1606
1607/*
1608 * ALC260 support
1609 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02001610static int alc260_parse_auto_config(struct hda_codec *codec)
1611{
Takashi Iwai1d045db2011-07-07 18:23:21 +02001612 static const hda_nid_t alc260_ignore[] = { 0x17, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02001613 static const hda_nid_t alc260_ssids[] = { 0x10, 0x15, 0x0f, 0 };
1614 return alc_parse_auto_config(codec, alc260_ignore, alc260_ssids);
Takashi Iwai1d045db2011-07-07 18:23:21 +02001615}
1616
Takashi Iwai1d045db2011-07-07 18:23:21 +02001617/*
1618 * Pin config fixes
1619 */
1620enum {
Takashi Iwaica8f0422012-02-16 11:51:19 +01001621 ALC260_FIXUP_HP_DC5750,
1622 ALC260_FIXUP_HP_PIN_0F,
1623 ALC260_FIXUP_COEF,
Takashi Iwai15317ab2012-02-16 12:02:53 +01001624 ALC260_FIXUP_GPIO1,
Takashi Iwai20f7d922012-02-16 12:35:16 +01001625 ALC260_FIXUP_GPIO1_TOGGLE,
1626 ALC260_FIXUP_REPLACER,
Takashi Iwai0a1c4fa2012-02-16 12:42:30 +01001627 ALC260_FIXUP_HP_B1900,
Takashi Iwai118cb4a2012-04-19 07:33:27 +02001628 ALC260_FIXUP_KN1,
Takashi Iwai39aedee2013-01-10 17:10:40 +01001629 ALC260_FIXUP_FSC_S7020,
Takashi Iwai5ebd3bb2013-02-19 18:23:31 +01001630 ALC260_FIXUP_FSC_S7020_JWSE,
Takashi Iwaid08c5ef2013-11-22 08:06:36 +01001631 ALC260_FIXUP_VAIO_PINS,
Takashi Iwai1d045db2011-07-07 18:23:21 +02001632};
1633
Takashi Iwai20f7d922012-02-16 12:35:16 +01001634static void alc260_gpio1_automute(struct hda_codec *codec)
1635{
1636 struct alc_spec *spec = codec->spec;
Takashi Iwaiaaf312d2018-06-19 22:28:22 +02001637
1638 alc_update_gpio_data(codec, 0x01, spec->gen.hp_jack_present);
Takashi Iwai20f7d922012-02-16 12:35:16 +01001639}
1640
1641static void alc260_fixup_gpio1_toggle(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01001642 const struct hda_fixup *fix, int action)
Takashi Iwai20f7d922012-02-16 12:35:16 +01001643{
1644 struct alc_spec *spec = codec->spec;
Takashi Iwai1727a772013-01-10 09:52:52 +01001645 if (action == HDA_FIXUP_ACT_PROBE) {
Takashi Iwai20f7d922012-02-16 12:35:16 +01001646 /* although the machine has only one output pin, we need to
1647 * toggle GPIO1 according to the jack state
1648 */
Takashi Iwai08c189f2012-12-19 15:22:24 +01001649 spec->gen.automute_hook = alc260_gpio1_automute;
1650 spec->gen.detect_hp = 1;
1651 spec->gen.automute_speaker = 1;
1652 spec->gen.autocfg.hp_pins[0] = 0x0f; /* copy it for automute */
Takashi Iwai62f949b2014-09-11 14:06:53 +02001653 snd_hda_jack_detect_enable_callback(codec, 0x0f,
Takashi Iwai08c189f2012-12-19 15:22:24 +01001654 snd_hda_gen_hp_automute);
Takashi Iwai5579cd62018-06-19 22:22:41 +02001655 alc_setup_gpio(codec, 0x01);
Takashi Iwai20f7d922012-02-16 12:35:16 +01001656 }
1657}
1658
Takashi Iwai118cb4a2012-04-19 07:33:27 +02001659static void alc260_fixup_kn1(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01001660 const struct hda_fixup *fix, int action)
Takashi Iwai118cb4a2012-04-19 07:33:27 +02001661{
1662 struct alc_spec *spec = codec->spec;
Takashi Iwai1727a772013-01-10 09:52:52 +01001663 static const struct hda_pintbl pincfgs[] = {
Takashi Iwai118cb4a2012-04-19 07:33:27 +02001664 { 0x0f, 0x02214000 }, /* HP/speaker */
1665 { 0x12, 0x90a60160 }, /* int mic */
1666 { 0x13, 0x02a19000 }, /* ext mic */
1667 { 0x18, 0x01446000 }, /* SPDIF out */
1668 /* disable bogus I/O pins */
1669 { 0x10, 0x411111f0 },
1670 { 0x11, 0x411111f0 },
1671 { 0x14, 0x411111f0 },
1672 { 0x15, 0x411111f0 },
1673 { 0x16, 0x411111f0 },
1674 { 0x17, 0x411111f0 },
1675 { 0x19, 0x411111f0 },
1676 { }
1677 };
1678
1679 switch (action) {
Takashi Iwai1727a772013-01-10 09:52:52 +01001680 case HDA_FIXUP_ACT_PRE_PROBE:
1681 snd_hda_apply_pincfgs(codec, pincfgs);
Takashi Iwai118cb4a2012-04-19 07:33:27 +02001682 spec->init_amp = ALC_INIT_NONE;
1683 break;
1684 }
1685}
1686
Takashi Iwai39aedee2013-01-10 17:10:40 +01001687static void alc260_fixup_fsc_s7020(struct hda_codec *codec,
1688 const struct hda_fixup *fix, int action)
1689{
1690 struct alc_spec *spec = codec->spec;
Takashi Iwai1c76aa52018-06-21 16:37:54 +02001691 if (action == HDA_FIXUP_ACT_PRE_PROBE)
Takashi Iwaie6e0ee52013-02-18 17:04:20 +01001692 spec->init_amp = ALC_INIT_NONE;
Takashi Iwai5ebd3bb2013-02-19 18:23:31 +01001693}
1694
1695static void alc260_fixup_fsc_s7020_jwse(struct hda_codec *codec,
1696 const struct hda_fixup *fix, int action)
1697{
1698 struct alc_spec *spec = codec->spec;
1699 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwaif811c3c2013-03-07 18:32:59 +01001700 spec->gen.add_jack_modes = 1;
Takashi Iwai5ebd3bb2013-02-19 18:23:31 +01001701 spec->gen.hp_mic = 1;
Takashi Iwaie6e0ee52013-02-18 17:04:20 +01001702 }
Takashi Iwai39aedee2013-01-10 17:10:40 +01001703}
1704
Takashi Iwai1727a772013-01-10 09:52:52 +01001705static const struct hda_fixup alc260_fixups[] = {
Takashi Iwaica8f0422012-02-16 11:51:19 +01001706 [ALC260_FIXUP_HP_DC5750] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001707 .type = HDA_FIXUP_PINS,
1708 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02001709 { 0x11, 0x90130110 }, /* speaker */
1710 { }
1711 }
1712 },
Takashi Iwaica8f0422012-02-16 11:51:19 +01001713 [ALC260_FIXUP_HP_PIN_0F] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001714 .type = HDA_FIXUP_PINS,
1715 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaica8f0422012-02-16 11:51:19 +01001716 { 0x0f, 0x01214000 }, /* HP */
1717 { }
1718 }
1719 },
1720 [ALC260_FIXUP_COEF] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001721 .type = HDA_FIXUP_VERBS,
Takashi Iwaica8f0422012-02-16 11:51:19 +01001722 .v.verbs = (const struct hda_verb[]) {
Ronan Marquete30cf2d2014-06-01 18:38:53 +02001723 { 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1724 { 0x1a, AC_VERB_SET_PROC_COEF, 0x3040 },
Takashi Iwaica8f0422012-02-16 11:51:19 +01001725 { }
1726 },
Takashi Iwaica8f0422012-02-16 11:51:19 +01001727 },
Takashi Iwai15317ab2012-02-16 12:02:53 +01001728 [ALC260_FIXUP_GPIO1] = {
Takashi Iwai5579cd62018-06-19 22:22:41 +02001729 .type = HDA_FIXUP_FUNC,
1730 .v.func = alc_fixup_gpio1,
Takashi Iwai15317ab2012-02-16 12:02:53 +01001731 },
Takashi Iwai20f7d922012-02-16 12:35:16 +01001732 [ALC260_FIXUP_GPIO1_TOGGLE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001733 .type = HDA_FIXUP_FUNC,
Takashi Iwai20f7d922012-02-16 12:35:16 +01001734 .v.func = alc260_fixup_gpio1_toggle,
1735 .chained = true,
1736 .chain_id = ALC260_FIXUP_HP_PIN_0F,
1737 },
1738 [ALC260_FIXUP_REPLACER] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001739 .type = HDA_FIXUP_VERBS,
Takashi Iwai20f7d922012-02-16 12:35:16 +01001740 .v.verbs = (const struct hda_verb[]) {
Takashi Iwai192a98e2014-06-02 15:16:07 +02001741 { 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1742 { 0x1a, AC_VERB_SET_PROC_COEF, 0x3050 },
Takashi Iwai20f7d922012-02-16 12:35:16 +01001743 { }
1744 },
1745 .chained = true,
1746 .chain_id = ALC260_FIXUP_GPIO1_TOGGLE,
1747 },
Takashi Iwai0a1c4fa2012-02-16 12:42:30 +01001748 [ALC260_FIXUP_HP_B1900] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001749 .type = HDA_FIXUP_FUNC,
Takashi Iwai0a1c4fa2012-02-16 12:42:30 +01001750 .v.func = alc260_fixup_gpio1_toggle,
1751 .chained = true,
1752 .chain_id = ALC260_FIXUP_COEF,
Takashi Iwai118cb4a2012-04-19 07:33:27 +02001753 },
1754 [ALC260_FIXUP_KN1] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001755 .type = HDA_FIXUP_FUNC,
Takashi Iwai118cb4a2012-04-19 07:33:27 +02001756 .v.func = alc260_fixup_kn1,
1757 },
Takashi Iwai39aedee2013-01-10 17:10:40 +01001758 [ALC260_FIXUP_FSC_S7020] = {
1759 .type = HDA_FIXUP_FUNC,
1760 .v.func = alc260_fixup_fsc_s7020,
1761 },
Takashi Iwai5ebd3bb2013-02-19 18:23:31 +01001762 [ALC260_FIXUP_FSC_S7020_JWSE] = {
1763 .type = HDA_FIXUP_FUNC,
1764 .v.func = alc260_fixup_fsc_s7020_jwse,
1765 .chained = true,
1766 .chain_id = ALC260_FIXUP_FSC_S7020,
1767 },
Takashi Iwaid08c5ef2013-11-22 08:06:36 +01001768 [ALC260_FIXUP_VAIO_PINS] = {
1769 .type = HDA_FIXUP_PINS,
1770 .v.pins = (const struct hda_pintbl[]) {
1771 /* Pin configs are missing completely on some VAIOs */
1772 { 0x0f, 0x01211020 },
1773 { 0x10, 0x0001003f },
1774 { 0x11, 0x411111f0 },
1775 { 0x12, 0x01a15930 },
1776 { 0x13, 0x411111f0 },
1777 { 0x14, 0x411111f0 },
1778 { 0x15, 0x411111f0 },
1779 { 0x16, 0x411111f0 },
1780 { 0x17, 0x411111f0 },
1781 { 0x18, 0x411111f0 },
1782 { 0x19, 0x411111f0 },
1783 { }
1784 }
1785 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02001786};
1787
1788static const struct snd_pci_quirk alc260_fixup_tbl[] = {
Takashi Iwai15317ab2012-02-16 12:02:53 +01001789 SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_FIXUP_GPIO1),
Takashi Iwaica8f0422012-02-16 11:51:19 +01001790 SND_PCI_QUIRK(0x1025, 0x007f, "Acer Aspire 9500", ALC260_FIXUP_COEF),
Takashi Iwai15317ab2012-02-16 12:02:53 +01001791 SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_FIXUP_GPIO1),
Takashi Iwaica8f0422012-02-16 11:51:19 +01001792 SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", ALC260_FIXUP_HP_DC5750),
Takashi Iwai0a1c4fa2012-02-16 12:42:30 +01001793 SND_PCI_QUIRK(0x103c, 0x30ba, "HP Presario B1900", ALC260_FIXUP_HP_B1900),
Takashi Iwaid08c5ef2013-11-22 08:06:36 +01001794 SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_FIXUP_VAIO_PINS),
Takashi Iwai0f5a5b82013-11-21 09:12:52 +01001795 SND_PCI_QUIRK(0x104d, 0x81e2, "Sony VAIO TX", ALC260_FIXUP_HP_PIN_0F),
Takashi Iwai39aedee2013-01-10 17:10:40 +01001796 SND_PCI_QUIRK(0x10cf, 0x1326, "FSC LifeBook S7020", ALC260_FIXUP_FSC_S7020),
Takashi Iwaib1f58082012-02-16 12:45:03 +01001797 SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FIXUP_GPIO1),
Takashi Iwai118cb4a2012-04-19 07:33:27 +02001798 SND_PCI_QUIRK(0x152d, 0x0729, "Quanta KN1", ALC260_FIXUP_KN1),
Takashi Iwai20f7d922012-02-16 12:35:16 +01001799 SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_FIXUP_REPLACER),
Takashi Iwaica8f0422012-02-16 11:51:19 +01001800 SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_FIXUP_COEF),
Takashi Iwai1d045db2011-07-07 18:23:21 +02001801 {}
1802};
1803
Takashi Iwai5ebd3bb2013-02-19 18:23:31 +01001804static const struct hda_model_fixup alc260_fixup_models[] = {
1805 {.id = ALC260_FIXUP_GPIO1, .name = "gpio1"},
1806 {.id = ALC260_FIXUP_COEF, .name = "coef"},
1807 {.id = ALC260_FIXUP_FSC_S7020, .name = "fujitsu"},
1808 {.id = ALC260_FIXUP_FSC_S7020_JWSE, .name = "fujitsu-jwse"},
1809 {}
1810};
1811
Takashi Iwai1d045db2011-07-07 18:23:21 +02001812/*
1813 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02001814static int patch_alc260(struct hda_codec *codec)
1815{
1816 struct alc_spec *spec;
Takashi Iwaic3c2c9e2012-02-16 12:59:55 +01001817 int err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001818
Takashi Iwai3de95172012-05-07 18:03:15 +02001819 err = alc_alloc_spec(codec, 0x07);
1820 if (err < 0)
1821 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001822
Takashi Iwai3de95172012-05-07 18:03:15 +02001823 spec = codec->spec;
Takashi Iwaiea46c3c2013-01-15 18:45:53 +01001824 /* as quite a few machines require HP amp for speaker outputs,
1825 * it's easier to enable it unconditionally; even if it's unneeded,
1826 * it's almost harmless.
1827 */
1828 spec->gen.prefer_hp_amp = 1;
Takashi Iwai7504b6c2013-03-18 11:25:51 +01001829 spec->gen.beep_nid = 0x01;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001830
Takashi Iwai225068a2015-05-29 10:42:14 +02001831 spec->shutup = alc_eapd_shutup;
1832
Takashi Iwaic9af7532019-05-10 11:01:43 +02001833 alc_pre_init(codec);
1834
Takashi Iwai5ebd3bb2013-02-19 18:23:31 +01001835 snd_hda_pick_fixup(codec, alc260_fixup_models, alc260_fixup_tbl,
1836 alc260_fixups);
Takashi Iwai1727a772013-01-10 09:52:52 +01001837 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai1d045db2011-07-07 18:23:21 +02001838
Takashi Iwaic3c2c9e2012-02-16 12:59:55 +01001839 /* automatic parse from the BIOS config */
1840 err = alc260_parse_auto_config(codec);
1841 if (err < 0)
1842 goto error;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001843
Takashi Iwaifea80fa2018-06-20 12:52:46 +02001844 if (!spec->gen.no_analog) {
1845 err = set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
1846 if (err < 0)
1847 goto error;
1848 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02001849
Takashi Iwai1727a772013-01-10 09:52:52 +01001850 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01001851
Takashi Iwai1d045db2011-07-07 18:23:21 +02001852 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02001853
1854 error:
1855 alc_free(codec);
1856 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001857}
1858
1859
1860/*
1861 * ALC882/883/885/888/889 support
1862 *
1863 * ALC882 is almost identical with ALC880 but has cleaner and more flexible
1864 * configuration. Each pin widget can choose any input DACs and a mixer.
1865 * Each ADC is connected from a mixer of all inputs. This makes possible
1866 * 6-channel independent captures.
1867 *
1868 * In addition, an independent DAC for the multi-playback (not used in this
1869 * driver yet).
1870 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02001871
1872/*
1873 * Pin config fixes
1874 */
1875enum {
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01001876 ALC882_FIXUP_ABIT_AW9D_MAX,
1877 ALC882_FIXUP_LENOVO_Y530,
1878 ALC882_FIXUP_PB_M5210,
1879 ALC882_FIXUP_ACER_ASPIRE_7736,
1880 ALC882_FIXUP_ASUS_W90V,
Marton Balint8f239212012-03-05 21:33:23 +01001881 ALC889_FIXUP_CD,
David Henningssonb2c53e22014-01-01 14:01:34 +01001882 ALC889_FIXUP_FRONT_HP_NO_PRESENCE,
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01001883 ALC889_FIXUP_VAIO_TT,
Takashi Iwai0e7cc2e2011-11-09 12:42:48 +01001884 ALC888_FIXUP_EEE1601,
Takashi Iwai177943a2011-11-09 12:55:18 +01001885 ALC882_FIXUP_EAPD,
Takashi Iwai7a6069b2011-11-09 15:22:01 +01001886 ALC883_FIXUP_EAPD,
Takashi Iwai8812c4f2011-11-09 17:39:15 +01001887 ALC883_FIXUP_ACER_EAPD,
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001888 ALC882_FIXUP_GPIO1,
1889 ALC882_FIXUP_GPIO2,
Takashi Iwaieb844d52011-11-09 18:03:07 +01001890 ALC882_FIXUP_GPIO3,
Takashi Iwai68ef0562011-11-09 18:24:44 +01001891 ALC889_FIXUP_COEF,
1892 ALC882_FIXUP_ASUS_W2JC,
Takashi Iwaic3e837b2011-11-10 16:01:47 +01001893 ALC882_FIXUP_ACER_ASPIRE_4930G,
1894 ALC882_FIXUP_ACER_ASPIRE_8930G,
1895 ALC882_FIXUP_ASPIRE_8930G_VERBS,
Takashi Iwai56710872011-11-14 17:42:11 +01001896 ALC885_FIXUP_MACPRO_GPIO,
Takashi Iwai02a237b2012-02-13 15:25:07 +01001897 ALC889_FIXUP_DAC_ROUTE,
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001898 ALC889_FIXUP_MBP_VREF,
1899 ALC889_FIXUP_IMAC91_VREF,
Adrien Vergée7729a42014-01-24 14:56:14 -05001900 ALC889_FIXUP_MBA11_VREF,
Takashi Iwai0756f092013-12-04 13:59:45 +01001901 ALC889_FIXUP_MBA21_VREF,
Takashi Iwaic20f31e2014-02-03 11:02:10 +01001902 ALC889_FIXUP_MP11_VREF,
Mario Kleiner9f660a12015-12-22 00:45:43 +01001903 ALC889_FIXUP_MP41_VREF,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02001904 ALC882_FIXUP_INV_DMIC,
Takashi Iwaie427c232012-07-29 10:04:08 +02001905 ALC882_FIXUP_NO_PRIMARY_HP,
Takashi Iwai1f0bbf02013-11-28 15:21:21 +01001906 ALC887_FIXUP_ASUS_BASS,
Takashi Iwaieb9ca3a2013-11-28 15:24:34 +01001907 ALC887_FIXUP_BASS_CHMAP,
Takashi Iwai7beb3a62017-04-10 18:05:52 +02001908 ALC1220_FIXUP_GB_DUAL_CODECS,
Peisen0202f5c2017-10-26 10:35:36 +08001909 ALC1220_FIXUP_CLEVO_P950,
Richard Sailer80690a22019-04-02 15:52:04 +02001910 ALC1220_FIXUP_CLEVO_PB51ED,
1911 ALC1220_FIXUP_CLEVO_PB51ED_PINS,
Takashi Iwai1d045db2011-07-07 18:23:21 +02001912};
1913
Takashi Iwai68ef0562011-11-09 18:24:44 +01001914static void alc889_fixup_coef(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01001915 const struct hda_fixup *fix, int action)
Takashi Iwai68ef0562011-11-09 18:24:44 +01001916{
Takashi Iwai1727a772013-01-10 09:52:52 +01001917 if (action != HDA_FIXUP_ACT_INIT)
Takashi Iwai68ef0562011-11-09 18:24:44 +01001918 return;
Kailang Yang1df88742014-10-29 16:10:13 +08001919 alc_update_coef_idx(codec, 7, 0, 0x2030);
Takashi Iwai68ef0562011-11-09 18:24:44 +01001920}
1921
Takashi Iwai56710872011-11-14 17:42:11 +01001922/* set up GPIO at initialization */
1923static void alc885_fixup_macpro_gpio(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01001924 const struct hda_fixup *fix, int action)
Takashi Iwai56710872011-11-14 17:42:11 +01001925{
Takashi Iwai215c8502018-06-19 22:34:26 +02001926 struct alc_spec *spec = codec->spec;
1927
1928 spec->gpio_write_delay = true;
1929 alc_fixup_gpio3(codec, fix, action);
Takashi Iwai56710872011-11-14 17:42:11 +01001930}
1931
Takashi Iwai02a237b2012-02-13 15:25:07 +01001932/* Fix the connection of some pins for ALC889:
1933 * At least, Acer Aspire 5935 shows the connections to DAC3/4 don't
1934 * work correctly (bko#42740)
1935 */
1936static void alc889_fixup_dac_route(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01001937 const struct hda_fixup *fix, int action)
Takashi Iwai02a237b2012-02-13 15:25:07 +01001938{
Takashi Iwai1727a772013-01-10 09:52:52 +01001939 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwaief8d60f2012-02-17 10:12:38 +01001940 /* fake the connections during parsing the tree */
Michał Mirosławcaf3c042020-01-03 10:23:48 +01001941 static const hda_nid_t conn1[] = { 0x0c, 0x0d };
1942 static const hda_nid_t conn2[] = { 0x0e, 0x0f };
1943 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
1944 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
1945 snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn2), conn2);
1946 snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn2), conn2);
Takashi Iwai1727a772013-01-10 09:52:52 +01001947 } else if (action == HDA_FIXUP_ACT_PROBE) {
Takashi Iwaief8d60f2012-02-17 10:12:38 +01001948 /* restore the connections */
Michał Mirosławcaf3c042020-01-03 10:23:48 +01001949 static const hda_nid_t conn[] = { 0x0c, 0x0d, 0x0e, 0x0f, 0x26 };
1950 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
1951 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn), conn);
1952 snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn), conn);
1953 snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn), conn);
Takashi Iwai02a237b2012-02-13 15:25:07 +01001954 }
1955}
1956
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001957/* Set VREF on HP pin */
1958static void alc889_fixup_mbp_vref(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01001959 const struct hda_fixup *fix, int action)
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001960{
Michał Mirosławcaf3c042020-01-03 10:23:48 +01001961 static const hda_nid_t nids[] = { 0x14, 0x15, 0x19 };
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001962 struct alc_spec *spec = codec->spec;
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001963 int i;
1964
Takashi Iwai1727a772013-01-10 09:52:52 +01001965 if (action != HDA_FIXUP_ACT_INIT)
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001966 return;
1967 for (i = 0; i < ARRAY_SIZE(nids); i++) {
1968 unsigned int val = snd_hda_codec_get_pincfg(codec, nids[i]);
1969 if (get_defcfg_device(val) != AC_JACK_HP_OUT)
1970 continue;
Takashi Iwaid3f02d62013-01-10 10:12:22 +01001971 val = snd_hda_codec_get_pin_target(codec, nids[i]);
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001972 val |= AC_PINCTL_VREF_80;
Takashi Iwaicdd03ce2012-04-20 12:34:50 +02001973 snd_hda_set_pin_ctl(codec, nids[i], val);
Takashi Iwai08c189f2012-12-19 15:22:24 +01001974 spec->gen.keep_vref_in_automute = 1;
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001975 break;
1976 }
1977}
1978
Takashi Iwai0756f092013-12-04 13:59:45 +01001979static void alc889_fixup_mac_pins(struct hda_codec *codec,
1980 const hda_nid_t *nids, int num_nids)
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001981{
1982 struct alc_spec *spec = codec->spec;
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001983 int i;
1984
Takashi Iwai0756f092013-12-04 13:59:45 +01001985 for (i = 0; i < num_nids; i++) {
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001986 unsigned int val;
Takashi Iwaid3f02d62013-01-10 10:12:22 +01001987 val = snd_hda_codec_get_pin_target(codec, nids[i]);
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001988 val |= AC_PINCTL_VREF_50;
Takashi Iwaicdd03ce2012-04-20 12:34:50 +02001989 snd_hda_set_pin_ctl(codec, nids[i], val);
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001990 }
Takashi Iwai08c189f2012-12-19 15:22:24 +01001991 spec->gen.keep_vref_in_automute = 1;
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001992}
1993
Takashi Iwai0756f092013-12-04 13:59:45 +01001994/* Set VREF on speaker pins on imac91 */
1995static void alc889_fixup_imac91_vref(struct hda_codec *codec,
1996 const struct hda_fixup *fix, int action)
1997{
Michał Mirosławcaf3c042020-01-03 10:23:48 +01001998 static const hda_nid_t nids[] = { 0x18, 0x1a };
Takashi Iwai0756f092013-12-04 13:59:45 +01001999
2000 if (action == HDA_FIXUP_ACT_INIT)
2001 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2002}
2003
Adrien Vergée7729a42014-01-24 14:56:14 -05002004/* Set VREF on speaker pins on mba11 */
2005static void alc889_fixup_mba11_vref(struct hda_codec *codec,
2006 const struct hda_fixup *fix, int action)
2007{
Michał Mirosławcaf3c042020-01-03 10:23:48 +01002008 static const hda_nid_t nids[] = { 0x18 };
Adrien Vergée7729a42014-01-24 14:56:14 -05002009
2010 if (action == HDA_FIXUP_ACT_INIT)
2011 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2012}
2013
Takashi Iwai0756f092013-12-04 13:59:45 +01002014/* Set VREF on speaker pins on mba21 */
2015static void alc889_fixup_mba21_vref(struct hda_codec *codec,
2016 const struct hda_fixup *fix, int action)
2017{
Michał Mirosławcaf3c042020-01-03 10:23:48 +01002018 static const hda_nid_t nids[] = { 0x18, 0x19 };
Takashi Iwai0756f092013-12-04 13:59:45 +01002019
2020 if (action == HDA_FIXUP_ACT_INIT)
2021 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2022}
2023
Takashi Iwaie427c232012-07-29 10:04:08 +02002024/* Don't take HP output as primary
Fernando Luis Vázquez Caod9111492013-02-12 16:49:46 +09002025 * Strangely, the speaker output doesn't work on Vaio Z and some Vaio
2026 * all-in-one desktop PCs (for example VGC-LN51JGB) through DAC 0x05
Takashi Iwaie427c232012-07-29 10:04:08 +02002027 */
2028static void alc882_fixup_no_primary_hp(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01002029 const struct hda_fixup *fix, int action)
Takashi Iwaie427c232012-07-29 10:04:08 +02002030{
2031 struct alc_spec *spec = codec->spec;
Takashi Iwaida96fb52013-07-29 16:54:36 +02002032 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai08c189f2012-12-19 15:22:24 +01002033 spec->gen.no_primary_hp = 1;
Takashi Iwaida96fb52013-07-29 16:54:36 +02002034 spec->gen.no_multi_io = 1;
2035 }
Takashi Iwaie427c232012-07-29 10:04:08 +02002036}
2037
Takashi Iwaieb9ca3a2013-11-28 15:24:34 +01002038static void alc_fixup_bass_chmap(struct hda_codec *codec,
2039 const struct hda_fixup *fix, int action);
2040
Takashi Iwai7beb3a62017-04-10 18:05:52 +02002041/* For dual-codec configuration, we need to disable some features to avoid
2042 * conflicts of kctls and PCM streams
2043 */
2044static void alc_fixup_dual_codecs(struct hda_codec *codec,
2045 const struct hda_fixup *fix, int action)
2046{
2047 struct alc_spec *spec = codec->spec;
2048
2049 if (action != HDA_FIXUP_ACT_PRE_PROBE)
2050 return;
2051 /* disable vmaster */
2052 spec->gen.suppress_vmaster = 1;
2053 /* auto-mute and auto-mic switch don't work with multiple codecs */
2054 spec->gen.suppress_auto_mute = 1;
2055 spec->gen.suppress_auto_mic = 1;
2056 /* disable aamix as well */
2057 spec->gen.mixer_nid = 0;
2058 /* add location prefix to avoid conflicts */
2059 codec->force_pin_prefix = 1;
2060}
2061
2062static void rename_ctl(struct hda_codec *codec, const char *oldname,
2063 const char *newname)
2064{
2065 struct snd_kcontrol *kctl;
2066
2067 kctl = snd_hda_find_mixer_ctl(codec, oldname);
2068 if (kctl)
2069 strcpy(kctl->id.name, newname);
2070}
2071
2072static void alc1220_fixup_gb_dual_codecs(struct hda_codec *codec,
2073 const struct hda_fixup *fix,
2074 int action)
2075{
2076 alc_fixup_dual_codecs(codec, fix, action);
2077 switch (action) {
2078 case HDA_FIXUP_ACT_PRE_PROBE:
2079 /* override card longname to provide a unique UCM profile */
2080 strcpy(codec->card->longname, "HDAudio-Gigabyte-ALC1220DualCodecs");
2081 break;
2082 case HDA_FIXUP_ACT_BUILD:
2083 /* rename Capture controls depending on the codec */
2084 rename_ctl(codec, "Capture Volume",
2085 codec->addr == 0 ?
2086 "Rear-Panel Capture Volume" :
2087 "Front-Panel Capture Volume");
2088 rename_ctl(codec, "Capture Switch",
2089 codec->addr == 0 ?
2090 "Rear-Panel Capture Switch" :
2091 "Front-Panel Capture Switch");
2092 break;
2093 }
2094}
2095
Peisen0202f5c2017-10-26 10:35:36 +08002096static void alc1220_fixup_clevo_p950(struct hda_codec *codec,
2097 const struct hda_fixup *fix,
2098 int action)
2099{
Michał Mirosławcaf3c042020-01-03 10:23:48 +01002100 static const hda_nid_t conn1[] = { 0x0c };
Peisen0202f5c2017-10-26 10:35:36 +08002101
2102 if (action != HDA_FIXUP_ACT_PRE_PROBE)
2103 return;
2104
2105 alc_update_coef_idx(codec, 0x7, 0, 0x3c3);
2106 /* We therefore want to make sure 0x14 (front headphone) and
2107 * 0x1b (speakers) use the stereo DAC 0x02
2108 */
Michał Mirosławcaf3c042020-01-03 10:23:48 +01002109 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2110 snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
Peisen0202f5c2017-10-26 10:35:36 +08002111}
2112
Jeremy Soller7f665b12019-02-13 10:56:19 -07002113static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
2114 const struct hda_fixup *fix, int action);
2115
Richard Sailer80690a22019-04-02 15:52:04 +02002116static void alc1220_fixup_clevo_pb51ed(struct hda_codec *codec,
Jeremy Soller7f665b12019-02-13 10:56:19 -07002117 const struct hda_fixup *fix,
2118 int action)
2119{
2120 alc1220_fixup_clevo_p950(codec, fix, action);
2121 alc_fixup_headset_mode_no_hp_mic(codec, fix, action);
2122}
2123
Takashi Iwai1727a772013-01-10 09:52:52 +01002124static const struct hda_fixup alc882_fixups[] = {
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002125 [ALC882_FIXUP_ABIT_AW9D_MAX] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002126 .type = HDA_FIXUP_PINS,
2127 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02002128 { 0x15, 0x01080104 }, /* side */
2129 { 0x16, 0x01011012 }, /* rear */
2130 { 0x17, 0x01016011 }, /* clfe */
2131 { }
2132 }
2133 },
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002134 [ALC882_FIXUP_LENOVO_Y530] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002135 .type = HDA_FIXUP_PINS,
2136 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02002137 { 0x15, 0x99130112 }, /* rear int speakers */
2138 { 0x16, 0x99130111 }, /* subwoofer */
2139 { }
2140 }
2141 },
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002142 [ALC882_FIXUP_PB_M5210] = {
Takashi Iwaifd108212013-01-10 10:18:14 +01002143 .type = HDA_FIXUP_PINCTLS,
2144 .v.pins = (const struct hda_pintbl[]) {
2145 { 0x19, PIN_VREF50 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02002146 {}
2147 }
2148 },
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002149 [ALC882_FIXUP_ACER_ASPIRE_7736] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002150 .type = HDA_FIXUP_FUNC,
Takashi Iwai23d30f22012-05-07 17:17:32 +02002151 .v.func = alc_fixup_sku_ignore,
Takashi Iwai1d045db2011-07-07 18:23:21 +02002152 },
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002153 [ALC882_FIXUP_ASUS_W90V] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002154 .type = HDA_FIXUP_PINS,
2155 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai5cdf7452011-10-26 23:04:08 +02002156 { 0x16, 0x99130110 }, /* fix sequence for CLFE */
2157 { }
2158 }
2159 },
Marton Balint8f239212012-03-05 21:33:23 +01002160 [ALC889_FIXUP_CD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002161 .type = HDA_FIXUP_PINS,
2162 .v.pins = (const struct hda_pintbl[]) {
Marton Balint8f239212012-03-05 21:33:23 +01002163 { 0x1c, 0x993301f0 }, /* CD */
2164 { }
2165 }
2166 },
David Henningssonb2c53e22014-01-01 14:01:34 +01002167 [ALC889_FIXUP_FRONT_HP_NO_PRESENCE] = {
2168 .type = HDA_FIXUP_PINS,
2169 .v.pins = (const struct hda_pintbl[]) {
2170 { 0x1b, 0x02214120 }, /* Front HP jack is flaky, disable jack detect */
2171 { }
2172 },
2173 .chained = true,
2174 .chain_id = ALC889_FIXUP_CD,
2175 },
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002176 [ALC889_FIXUP_VAIO_TT] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002177 .type = HDA_FIXUP_PINS,
2178 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002179 { 0x17, 0x90170111 }, /* hidden surround speaker */
2180 { }
2181 }
2182 },
Takashi Iwai0e7cc2e2011-11-09 12:42:48 +01002183 [ALC888_FIXUP_EEE1601] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002184 .type = HDA_FIXUP_VERBS,
Takashi Iwai0e7cc2e2011-11-09 12:42:48 +01002185 .v.verbs = (const struct hda_verb[]) {
2186 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2187 { 0x20, AC_VERB_SET_PROC_COEF, 0x0838 },
2188 { }
2189 }
Takashi Iwai177943a2011-11-09 12:55:18 +01002190 },
2191 [ALC882_FIXUP_EAPD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002192 .type = HDA_FIXUP_VERBS,
Takashi Iwai177943a2011-11-09 12:55:18 +01002193 .v.verbs = (const struct hda_verb[]) {
2194 /* change to EAPD mode */
2195 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2196 { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
2197 { }
2198 }
2199 },
Takashi Iwai7a6069b2011-11-09 15:22:01 +01002200 [ALC883_FIXUP_EAPD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002201 .type = HDA_FIXUP_VERBS,
Takashi Iwai7a6069b2011-11-09 15:22:01 +01002202 .v.verbs = (const struct hda_verb[]) {
2203 /* change to EAPD mode */
2204 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2205 { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2206 { }
2207 }
2208 },
Takashi Iwai8812c4f2011-11-09 17:39:15 +01002209 [ALC883_FIXUP_ACER_EAPD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002210 .type = HDA_FIXUP_VERBS,
Takashi Iwai8812c4f2011-11-09 17:39:15 +01002211 .v.verbs = (const struct hda_verb[]) {
2212 /* eanable EAPD on Acer laptops */
2213 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2214 { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2215 { }
2216 }
2217 },
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002218 [ALC882_FIXUP_GPIO1] = {
Takashi Iwai5579cd62018-06-19 22:22:41 +02002219 .type = HDA_FIXUP_FUNC,
2220 .v.func = alc_fixup_gpio1,
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002221 },
2222 [ALC882_FIXUP_GPIO2] = {
Takashi Iwai5579cd62018-06-19 22:22:41 +02002223 .type = HDA_FIXUP_FUNC,
2224 .v.func = alc_fixup_gpio2,
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002225 },
Takashi Iwaieb844d52011-11-09 18:03:07 +01002226 [ALC882_FIXUP_GPIO3] = {
Takashi Iwai5579cd62018-06-19 22:22:41 +02002227 .type = HDA_FIXUP_FUNC,
2228 .v.func = alc_fixup_gpio3,
Takashi Iwaieb844d52011-11-09 18:03:07 +01002229 },
Takashi Iwai68ef0562011-11-09 18:24:44 +01002230 [ALC882_FIXUP_ASUS_W2JC] = {
Takashi Iwai5579cd62018-06-19 22:22:41 +02002231 .type = HDA_FIXUP_FUNC,
2232 .v.func = alc_fixup_gpio1,
Takashi Iwai68ef0562011-11-09 18:24:44 +01002233 .chained = true,
2234 .chain_id = ALC882_FIXUP_EAPD,
2235 },
2236 [ALC889_FIXUP_COEF] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002237 .type = HDA_FIXUP_FUNC,
Takashi Iwai68ef0562011-11-09 18:24:44 +01002238 .v.func = alc889_fixup_coef,
2239 },
Takashi Iwaic3e837b2011-11-10 16:01:47 +01002240 [ALC882_FIXUP_ACER_ASPIRE_4930G] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002241 .type = HDA_FIXUP_PINS,
2242 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaic3e837b2011-11-10 16:01:47 +01002243 { 0x16, 0x99130111 }, /* CLFE speaker */
2244 { 0x17, 0x99130112 }, /* surround speaker */
2245 { }
Takashi Iwai038d4fe2012-04-11 17:18:12 +02002246 },
2247 .chained = true,
2248 .chain_id = ALC882_FIXUP_GPIO1,
Takashi Iwaic3e837b2011-11-10 16:01:47 +01002249 },
2250 [ALC882_FIXUP_ACER_ASPIRE_8930G] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002251 .type = HDA_FIXUP_PINS,
2252 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaic3e837b2011-11-10 16:01:47 +01002253 { 0x16, 0x99130111 }, /* CLFE speaker */
2254 { 0x1b, 0x99130112 }, /* surround speaker */
2255 { }
2256 },
2257 .chained = true,
2258 .chain_id = ALC882_FIXUP_ASPIRE_8930G_VERBS,
2259 },
2260 [ALC882_FIXUP_ASPIRE_8930G_VERBS] = {
2261 /* additional init verbs for Acer Aspire 8930G */
Takashi Iwai1727a772013-01-10 09:52:52 +01002262 .type = HDA_FIXUP_VERBS,
Takashi Iwaic3e837b2011-11-10 16:01:47 +01002263 .v.verbs = (const struct hda_verb[]) {
2264 /* Enable all DACs */
2265 /* DAC DISABLE/MUTE 1? */
2266 /* setting bits 1-5 disables DAC nids 0x02-0x06
2267 * apparently. Init=0x38 */
2268 { 0x20, AC_VERB_SET_COEF_INDEX, 0x03 },
2269 { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2270 /* DAC DISABLE/MUTE 2? */
2271 /* some bit here disables the other DACs.
2272 * Init=0x4900 */
2273 { 0x20, AC_VERB_SET_COEF_INDEX, 0x08 },
2274 { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2275 /* DMIC fix
2276 * This laptop has a stereo digital microphone.
2277 * The mics are only 1cm apart which makes the stereo
2278 * useless. However, either the mic or the ALC889
2279 * makes the signal become a difference/sum signal
2280 * instead of standard stereo, which is annoying.
2281 * So instead we flip this bit which makes the
2282 * codec replicate the sum signal to both channels,
2283 * turning it into a normal mono mic.
2284 */
2285 /* DMIC_CONTROL? Init value = 0x0001 */
2286 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2287 { 0x20, AC_VERB_SET_PROC_COEF, 0x0003 },
2288 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2289 { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2290 { }
Takashi Iwai038d4fe2012-04-11 17:18:12 +02002291 },
2292 .chained = true,
2293 .chain_id = ALC882_FIXUP_GPIO1,
Takashi Iwaic3e837b2011-11-10 16:01:47 +01002294 },
Takashi Iwai56710872011-11-14 17:42:11 +01002295 [ALC885_FIXUP_MACPRO_GPIO] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002296 .type = HDA_FIXUP_FUNC,
Takashi Iwai56710872011-11-14 17:42:11 +01002297 .v.func = alc885_fixup_macpro_gpio,
2298 },
Takashi Iwai02a237b2012-02-13 15:25:07 +01002299 [ALC889_FIXUP_DAC_ROUTE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002300 .type = HDA_FIXUP_FUNC,
Takashi Iwai02a237b2012-02-13 15:25:07 +01002301 .v.func = alc889_fixup_dac_route,
2302 },
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002303 [ALC889_FIXUP_MBP_VREF] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002304 .type = HDA_FIXUP_FUNC,
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002305 .v.func = alc889_fixup_mbp_vref,
2306 .chained = true,
2307 .chain_id = ALC882_FIXUP_GPIO1,
2308 },
2309 [ALC889_FIXUP_IMAC91_VREF] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002310 .type = HDA_FIXUP_FUNC,
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002311 .v.func = alc889_fixup_imac91_vref,
2312 .chained = true,
2313 .chain_id = ALC882_FIXUP_GPIO1,
2314 },
Adrien Vergée7729a42014-01-24 14:56:14 -05002315 [ALC889_FIXUP_MBA11_VREF] = {
2316 .type = HDA_FIXUP_FUNC,
2317 .v.func = alc889_fixup_mba11_vref,
2318 .chained = true,
2319 .chain_id = ALC889_FIXUP_MBP_VREF,
2320 },
Takashi Iwai0756f092013-12-04 13:59:45 +01002321 [ALC889_FIXUP_MBA21_VREF] = {
2322 .type = HDA_FIXUP_FUNC,
2323 .v.func = alc889_fixup_mba21_vref,
2324 .chained = true,
2325 .chain_id = ALC889_FIXUP_MBP_VREF,
2326 },
Takashi Iwaic20f31e2014-02-03 11:02:10 +01002327 [ALC889_FIXUP_MP11_VREF] = {
2328 .type = HDA_FIXUP_FUNC,
2329 .v.func = alc889_fixup_mba11_vref,
2330 .chained = true,
2331 .chain_id = ALC885_FIXUP_MACPRO_GPIO,
2332 },
Mario Kleiner9f660a12015-12-22 00:45:43 +01002333 [ALC889_FIXUP_MP41_VREF] = {
2334 .type = HDA_FIXUP_FUNC,
2335 .v.func = alc889_fixup_mbp_vref,
2336 .chained = true,
2337 .chain_id = ALC885_FIXUP_MACPRO_GPIO,
2338 },
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002339 [ALC882_FIXUP_INV_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002340 .type = HDA_FIXUP_FUNC,
David Henningsson9d36a7d2014-10-07 10:18:42 +02002341 .v.func = alc_fixup_inv_dmic,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002342 },
Takashi Iwaie427c232012-07-29 10:04:08 +02002343 [ALC882_FIXUP_NO_PRIMARY_HP] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002344 .type = HDA_FIXUP_FUNC,
Takashi Iwaie427c232012-07-29 10:04:08 +02002345 .v.func = alc882_fixup_no_primary_hp,
2346 },
Takashi Iwai1f0bbf02013-11-28 15:21:21 +01002347 [ALC887_FIXUP_ASUS_BASS] = {
2348 .type = HDA_FIXUP_PINS,
2349 .v.pins = (const struct hda_pintbl[]) {
2350 {0x16, 0x99130130}, /* bass speaker */
2351 {}
2352 },
Takashi Iwaieb9ca3a2013-11-28 15:24:34 +01002353 .chained = true,
2354 .chain_id = ALC887_FIXUP_BASS_CHMAP,
2355 },
2356 [ALC887_FIXUP_BASS_CHMAP] = {
2357 .type = HDA_FIXUP_FUNC,
2358 .v.func = alc_fixup_bass_chmap,
Takashi Iwai1f0bbf02013-11-28 15:21:21 +01002359 },
Takashi Iwai7beb3a62017-04-10 18:05:52 +02002360 [ALC1220_FIXUP_GB_DUAL_CODECS] = {
2361 .type = HDA_FIXUP_FUNC,
2362 .v.func = alc1220_fixup_gb_dual_codecs,
2363 },
Peisen0202f5c2017-10-26 10:35:36 +08002364 [ALC1220_FIXUP_CLEVO_P950] = {
2365 .type = HDA_FIXUP_FUNC,
2366 .v.func = alc1220_fixup_clevo_p950,
2367 },
Richard Sailer80690a22019-04-02 15:52:04 +02002368 [ALC1220_FIXUP_CLEVO_PB51ED] = {
Jeremy Soller7f665b12019-02-13 10:56:19 -07002369 .type = HDA_FIXUP_FUNC,
Richard Sailer80690a22019-04-02 15:52:04 +02002370 .v.func = alc1220_fixup_clevo_pb51ed,
Jeremy Soller7f665b12019-02-13 10:56:19 -07002371 },
Richard Sailer80690a22019-04-02 15:52:04 +02002372 [ALC1220_FIXUP_CLEVO_PB51ED_PINS] = {
Jeremy Soller7f665b12019-02-13 10:56:19 -07002373 .type = HDA_FIXUP_PINS,
2374 .v.pins = (const struct hda_pintbl[]) {
2375 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
2376 {}
2377 },
2378 .chained = true,
Richard Sailer80690a22019-04-02 15:52:04 +02002379 .chain_id = ALC1220_FIXUP_CLEVO_PB51ED,
Jeremy Soller7f665b12019-02-13 10:56:19 -07002380 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02002381};
2382
2383static const struct snd_pci_quirk alc882_fixup_tbl[] = {
Takashi Iwai8812c4f2011-11-09 17:39:15 +01002384 SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD),
2385 SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
Takashi Iwaib5d724b2015-06-02 19:57:08 +02002386 SND_PCI_QUIRK(0x1025, 0x0107, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
Takashi Iwai8812c4f2011-11-09 17:39:15 +01002387 SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD),
2388 SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2389 SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD),
2390 SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_FIXUP_ACER_EAPD),
Takashi Iwaic3e837b2011-11-10 16:01:47 +01002391 SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
2392 ALC882_FIXUP_ACER_ASPIRE_4930G),
2393 SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
2394 ALC882_FIXUP_ACER_ASPIRE_4930G),
2395 SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
2396 ALC882_FIXUP_ACER_ASPIRE_8930G),
2397 SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
2398 ALC882_FIXUP_ACER_ASPIRE_8930G),
2399 SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
2400 ALC882_FIXUP_ACER_ASPIRE_4930G),
2401 SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
2402 ALC882_FIXUP_ACER_ASPIRE_4930G),
2403 SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
2404 ALC882_FIXUP_ACER_ASPIRE_4930G),
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002405 SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
Takashi Iwaif5c53d82012-05-07 10:07:33 +02002406 SND_PCI_QUIRK(0x1025, 0x021e, "Acer Aspire 5739G",
2407 ALC882_FIXUP_ACER_ASPIRE_4930G),
Takashi Iwai02a237b2012-02-13 15:25:07 +01002408 SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),
Takashi Iwaife97da12012-04-12 08:00:19 +02002409 SND_PCI_QUIRK(0x1025, 0x026b, "Acer Aspire 8940G", ALC882_FIXUP_ACER_ASPIRE_8930G),
Takashi Iwaiac9b1cd2011-11-09 17:45:55 +01002410 SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736),
Takashi Iwai177943a2011-11-09 12:55:18 +01002411 SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD),
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002412 SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),
Takashi Iwai68ef0562011-11-09 18:24:44 +01002413 SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_FIXUP_ASUS_W2JC),
Takashi Iwai0e7cc2e2011-11-09 12:42:48 +01002414 SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601),
Takashi Iwai1f0bbf02013-11-28 15:21:21 +01002415 SND_PCI_QUIRK(0x1043, 0x84bc, "ASUS ET2700", ALC887_FIXUP_ASUS_BASS),
Takashi Iwai85bcf962016-12-06 16:20:36 +01002416 SND_PCI_QUIRK(0x1043, 0x8691, "ASUS ROG Ranger VIII", ALC882_FIXUP_GPIO3),
Takashi Iwaiac9b1cd2011-11-09 17:45:55 +01002417 SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT),
Takashi Iwaie427c232012-07-29 10:04:08 +02002418 SND_PCI_QUIRK(0x104d, 0x905a, "Sony Vaio Z", ALC882_FIXUP_NO_PRIMARY_HP),
Sergei A. Trusov3f3c3712017-08-02 20:23:48 +10002419 SND_PCI_QUIRK(0x104d, 0x9060, "Sony Vaio VPCL14M1R", ALC882_FIXUP_NO_PRIMARY_HP),
Fernando Luis Vázquez Cao12e31a72013-02-12 16:47:44 +09002420 SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP),
Takashi Iwaic44d9b12016-02-07 09:38:26 +01002421 SND_PCI_QUIRK(0x104d, 0x9044, "Sony VAIO AiO", ALC882_FIXUP_NO_PRIMARY_HP),
Takashi Iwai56710872011-11-14 17:42:11 +01002422
2423 /* All Apple entries are in codec SSIDs */
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002424 SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF),
2425 SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC889_FIXUP_MBP_VREF),
2426 SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
Takashi Iwaic20f31e2014-02-03 11:02:10 +01002427 SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC889_FIXUP_MP11_VREF),
Takashi Iwai56710872011-11-14 17:42:11 +01002428 SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_FIXUP_MACPRO_GPIO),
2429 SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_FIXUP_MACPRO_GPIO),
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002430 SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC889_FIXUP_MBP_VREF),
2431 SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889_FIXUP_MBP_VREF),
Takashi Iwai56710872011-11-14 17:42:11 +01002432 SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD),
Adrien Vergée7729a42014-01-24 14:56:14 -05002433 SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC889_FIXUP_MBA11_VREF),
Takashi Iwai0756f092013-12-04 13:59:45 +01002434 SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBA21_VREF),
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002435 SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889_FIXUP_MBP_VREF),
2436 SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
Takashi Iwai56710872011-11-14 17:42:11 +01002437 SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO),
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002438 SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF),
2439 SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF),
2440 SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF),
Mario Kleiner9f660a12015-12-22 00:45:43 +01002441 SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 4,1/5,1", ALC889_FIXUP_MP41_VREF),
Takashi Iwai05193632012-11-12 10:07:36 +01002442 SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF),
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002443 SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),
2444 SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),
Takashi Iwai649ccd02015-07-30 22:30:29 +02002445 SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_MBA11_VREF),
Takashi Iwai56710872011-11-14 17:42:11 +01002446
Takashi Iwai7a6069b2011-11-09 15:22:01 +01002447 SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),
David Henningssonb2c53e22014-01-01 14:01:34 +01002448 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE),
Takashi Iwai7beb3a62017-04-10 18:05:52 +02002449 SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
Christian Lachner0d45e862020-02-23 10:24:16 +01002450 SND_PCI_QUIRK(0x1458, 0xa0cd, "Gigabyte X570 Aorus Master", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwaia655e2b2020-02-17 16:19:47 +01002451 SND_PCI_QUIRK(0x1462, 0x1228, "MSI-GP63", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwai7dafba32020-02-12 09:10:47 +01002452 SND_PCI_QUIRK(0x1462, 0x1276, "MSI-GL73", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwaicc5049a2020-02-18 09:09:15 +01002453 SND_PCI_QUIRK(0x1462, 0x1293, "MSI-GP65", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwaid2c3b142017-06-01 09:35:30 +02002454 SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),
Takashi Iwai63691582017-05-22 16:32:46 +02002455 SND_PCI_QUIRK(0x1462, 0xda57, "MSI Z270-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
Takashi Iwaid2c3b142017-06-01 09:35:30 +02002456 SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002457 SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
Peisen0202f5c2017-10-26 10:35:36 +08002458 SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwaif3d737b2018-07-17 17:08:32 +02002459 SND_PCI_QUIRK(0x1558, 0x95e1, "Clevo P95xER", ALC1220_FIXUP_CLEVO_P950),
Jeremy Soller2f0d5202018-05-07 09:28:45 -06002460 SND_PCI_QUIRK(0x1558, 0x95e2, "Clevo P950ER", ALC1220_FIXUP_CLEVO_P950),
Richard Sailer503d90b2019-06-19 13:33:11 +02002461 SND_PCI_QUIRK(0x1558, 0x96e1, "Clevo P960[ER][CDFN]-K", ALC1220_FIXUP_CLEVO_P950),
2462 SND_PCI_QUIRK(0x1558, 0x97e1, "Clevo P970[ER][CDFN]", ALC1220_FIXUP_CLEVO_P950),
2463 SND_PCI_QUIRK(0x1558, 0x65d1, "Clevo PB51[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2464 SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
Takashi Iwai7a6069b2011-11-09 15:22:01 +01002465 SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
2466 SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),
Takashi Iwaiac9b1cd2011-11-09 17:45:55 +01002467 SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),
Takashi Iwai68ef0562011-11-09 18:24:44 +01002468 SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_FIXUP_COEF),
Takashi Iwai1d045db2011-07-07 18:23:21 +02002469 {}
2470};
2471
Takashi Iwai1727a772013-01-10 09:52:52 +01002472static const struct hda_model_fixup alc882_fixup_models[] = {
Takashi Iwai772c2912018-06-26 17:17:53 +02002473 {.id = ALC882_FIXUP_ABIT_AW9D_MAX, .name = "abit-aw9d"},
2474 {.id = ALC882_FIXUP_LENOVO_Y530, .name = "lenovo-y530"},
2475 {.id = ALC882_FIXUP_ACER_ASPIRE_7736, .name = "acer-aspire-7736"},
2476 {.id = ALC882_FIXUP_ASUS_W90V, .name = "asus-w90v"},
2477 {.id = ALC889_FIXUP_CD, .name = "cd"},
2478 {.id = ALC889_FIXUP_FRONT_HP_NO_PRESENCE, .name = "no-front-hp"},
2479 {.id = ALC889_FIXUP_VAIO_TT, .name = "vaio-tt"},
2480 {.id = ALC888_FIXUP_EEE1601, .name = "eee1601"},
2481 {.id = ALC882_FIXUP_EAPD, .name = "alc882-eapd"},
2482 {.id = ALC883_FIXUP_EAPD, .name = "alc883-eapd"},
2483 {.id = ALC882_FIXUP_GPIO1, .name = "gpio1"},
2484 {.id = ALC882_FIXUP_GPIO2, .name = "gpio2"},
2485 {.id = ALC882_FIXUP_GPIO3, .name = "gpio3"},
2486 {.id = ALC889_FIXUP_COEF, .name = "alc889-coef"},
2487 {.id = ALC882_FIXUP_ASUS_W2JC, .name = "asus-w2jc"},
Takashi Iwai912093b2012-04-11 14:03:41 +02002488 {.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name = "acer-aspire-4930g"},
2489 {.id = ALC882_FIXUP_ACER_ASPIRE_8930G, .name = "acer-aspire-8930g"},
2490 {.id = ALC883_FIXUP_ACER_EAPD, .name = "acer-aspire"},
Takashi Iwai772c2912018-06-26 17:17:53 +02002491 {.id = ALC885_FIXUP_MACPRO_GPIO, .name = "macpro-gpio"},
2492 {.id = ALC889_FIXUP_DAC_ROUTE, .name = "dac-route"},
2493 {.id = ALC889_FIXUP_MBP_VREF, .name = "mbp-vref"},
2494 {.id = ALC889_FIXUP_IMAC91_VREF, .name = "imac91-vref"},
2495 {.id = ALC889_FIXUP_MBA11_VREF, .name = "mba11-vref"},
2496 {.id = ALC889_FIXUP_MBA21_VREF, .name = "mba21-vref"},
2497 {.id = ALC889_FIXUP_MP11_VREF, .name = "mp11-vref"},
2498 {.id = ALC889_FIXUP_MP41_VREF, .name = "mp41-vref"},
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002499 {.id = ALC882_FIXUP_INV_DMIC, .name = "inv-dmic"},
Takashi Iwaie427c232012-07-29 10:04:08 +02002500 {.id = ALC882_FIXUP_NO_PRIMARY_HP, .name = "no-primary-hp"},
Takashi Iwai772c2912018-06-26 17:17:53 +02002501 {.id = ALC887_FIXUP_ASUS_BASS, .name = "asus-bass"},
Takashi Iwaiba90d6a2017-05-22 16:38:47 +02002502 {.id = ALC1220_FIXUP_GB_DUAL_CODECS, .name = "dual-codecs"},
Takashi Iwai772c2912018-06-26 17:17:53 +02002503 {.id = ALC1220_FIXUP_CLEVO_P950, .name = "clevo-p950"},
Takashi Iwai912093b2012-04-11 14:03:41 +02002504 {}
2505};
2506
Takashi Iwai1d045db2011-07-07 18:23:21 +02002507/*
2508 * BIOS auto configuration
2509 */
2510/* almost identical with ALC880 parser... */
2511static int alc882_parse_auto_config(struct hda_codec *codec)
2512{
Takashi Iwai1d045db2011-07-07 18:23:21 +02002513 static const hda_nid_t alc882_ignore[] = { 0x1d, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02002514 static const hda_nid_t alc882_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2515 return alc_parse_auto_config(codec, alc882_ignore, alc882_ssids);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002516}
2517
Takashi Iwai1d045db2011-07-07 18:23:21 +02002518/*
2519 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02002520static int patch_alc882(struct hda_codec *codec)
2521{
2522 struct alc_spec *spec;
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002523 int err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002524
Takashi Iwai3de95172012-05-07 18:03:15 +02002525 err = alc_alloc_spec(codec, 0x0b);
2526 if (err < 0)
2527 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002528
Takashi Iwai3de95172012-05-07 18:03:15 +02002529 spec = codec->spec;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002530
Takashi Iwai7639a062015-03-03 10:07:24 +01002531 switch (codec->core.vendor_id) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02002532 case 0x10ec0882:
2533 case 0x10ec0885:
Takashi Iwaiacf08082014-09-02 07:21:56 +02002534 case 0x10ec0900:
Kailang Yang6d9ffcf2020-01-03 16:24:06 +08002535 case 0x10ec0b00:
Kailang Yanga535ad52017-01-16 16:59:26 +08002536 case 0x10ec1220:
Takashi Iwai1d045db2011-07-07 18:23:21 +02002537 break;
2538 default:
2539 /* ALC883 and variants */
2540 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2541 break;
2542 }
2543
Takashi Iwaic9af7532019-05-10 11:01:43 +02002544 alc_pre_init(codec);
2545
Takashi Iwai1727a772013-01-10 09:52:52 +01002546 snd_hda_pick_fixup(codec, alc882_fixup_models, alc882_fixup_tbl,
Takashi Iwai912093b2012-04-11 14:03:41 +02002547 alc882_fixups);
Takashi Iwai1727a772013-01-10 09:52:52 +01002548 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002549
2550 alc_auto_parse_customize_define(codec);
2551
Takashi Iwai7504b6c2013-03-18 11:25:51 +01002552 if (has_cdefine_beep(codec))
2553 spec->gen.beep_nid = 0x01;
2554
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002555 /* automatic parse from the BIOS config */
2556 err = alc882_parse_auto_config(codec);
2557 if (err < 0)
2558 goto error;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002559
Takashi Iwaifea80fa2018-06-20 12:52:46 +02002560 if (!spec->gen.no_analog && spec->gen.beep_nid) {
2561 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2562 if (err < 0)
2563 goto error;
2564 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02002565
Takashi Iwai1727a772013-01-10 09:52:52 +01002566 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01002567
Takashi Iwai1d045db2011-07-07 18:23:21 +02002568 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02002569
2570 error:
2571 alc_free(codec);
2572 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002573}
2574
2575
2576/*
2577 * ALC262 support
2578 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02002579static int alc262_parse_auto_config(struct hda_codec *codec)
2580{
Takashi Iwai1d045db2011-07-07 18:23:21 +02002581 static const hda_nid_t alc262_ignore[] = { 0x1d, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02002582 static const hda_nid_t alc262_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2583 return alc_parse_auto_config(codec, alc262_ignore, alc262_ssids);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002584}
2585
2586/*
2587 * Pin config fixes
2588 */
2589enum {
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002590 ALC262_FIXUP_FSC_H270,
Takashi Iwai7513e6d2013-01-18 15:41:34 +01002591 ALC262_FIXUP_FSC_S7110,
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002592 ALC262_FIXUP_HP_Z200,
2593 ALC262_FIXUP_TYAN,
Takashi Iwaic4701502011-11-07 14:20:07 +01002594 ALC262_FIXUP_LENOVO_3000,
Takashi Iwaib42590b2011-11-07 14:41:01 +01002595 ALC262_FIXUP_BENQ,
2596 ALC262_FIXUP_BENQ_T31,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002597 ALC262_FIXUP_INV_DMIC,
Mengdong Linb5c66112013-11-29 00:35:35 -05002598 ALC262_FIXUP_INTEL_BAYLEYBAY,
Takashi Iwai1d045db2011-07-07 18:23:21 +02002599};
2600
Takashi Iwai1727a772013-01-10 09:52:52 +01002601static const struct hda_fixup alc262_fixups[] = {
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002602 [ALC262_FIXUP_FSC_H270] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002603 .type = HDA_FIXUP_PINS,
2604 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02002605 { 0x14, 0x99130110 }, /* speaker */
2606 { 0x15, 0x0221142f }, /* front HP */
2607 { 0x1b, 0x0121141f }, /* rear HP */
2608 { }
2609 }
2610 },
Takashi Iwai7513e6d2013-01-18 15:41:34 +01002611 [ALC262_FIXUP_FSC_S7110] = {
2612 .type = HDA_FIXUP_PINS,
2613 .v.pins = (const struct hda_pintbl[]) {
2614 { 0x15, 0x90170110 }, /* speaker */
2615 { }
2616 },
2617 .chained = true,
2618 .chain_id = ALC262_FIXUP_BENQ,
2619 },
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002620 [ALC262_FIXUP_HP_Z200] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002621 .type = HDA_FIXUP_PINS,
2622 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02002623 { 0x16, 0x99130120 }, /* internal speaker */
2624 { }
2625 }
2626 },
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002627 [ALC262_FIXUP_TYAN] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002628 .type = HDA_FIXUP_PINS,
2629 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002630 { 0x14, 0x1993e1f0 }, /* int AUX */
2631 { }
2632 }
2633 },
Takashi Iwaic4701502011-11-07 14:20:07 +01002634 [ALC262_FIXUP_LENOVO_3000] = {
Takashi Iwaifd108212013-01-10 10:18:14 +01002635 .type = HDA_FIXUP_PINCTLS,
2636 .v.pins = (const struct hda_pintbl[]) {
2637 { 0x19, PIN_VREF50 },
Takashi Iwaib42590b2011-11-07 14:41:01 +01002638 {}
2639 },
2640 .chained = true,
2641 .chain_id = ALC262_FIXUP_BENQ,
2642 },
2643 [ALC262_FIXUP_BENQ] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002644 .type = HDA_FIXUP_VERBS,
Takashi Iwaib42590b2011-11-07 14:41:01 +01002645 .v.verbs = (const struct hda_verb[]) {
Takashi Iwaic4701502011-11-07 14:20:07 +01002646 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2647 { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2648 {}
2649 }
2650 },
Takashi Iwaib42590b2011-11-07 14:41:01 +01002651 [ALC262_FIXUP_BENQ_T31] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002652 .type = HDA_FIXUP_VERBS,
Takashi Iwaib42590b2011-11-07 14:41:01 +01002653 .v.verbs = (const struct hda_verb[]) {
2654 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2655 { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2656 {}
2657 }
2658 },
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002659 [ALC262_FIXUP_INV_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002660 .type = HDA_FIXUP_FUNC,
David Henningsson9d36a7d2014-10-07 10:18:42 +02002661 .v.func = alc_fixup_inv_dmic,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002662 },
Mengdong Linb5c66112013-11-29 00:35:35 -05002663 [ALC262_FIXUP_INTEL_BAYLEYBAY] = {
2664 .type = HDA_FIXUP_FUNC,
2665 .v.func = alc_fixup_no_depop_delay,
2666 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02002667};
2668
2669static const struct snd_pci_quirk alc262_fixup_tbl[] = {
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002670 SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", ALC262_FIXUP_HP_Z200),
Takashi Iwai7513e6d2013-01-18 15:41:34 +01002671 SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu Lifebook S7110", ALC262_FIXUP_FSC_S7110),
Takashi Iwai3dcd3be2011-11-07 14:59:40 +01002672 SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ),
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002673 SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN),
Takashi Iwai275ec0c2018-06-22 12:17:45 +02002674 SND_PCI_QUIRK(0x1734, 0x1141, "FSC ESPRIMO U9210", ALC262_FIXUP_FSC_H270),
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002675 SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270),
Takashi Iwaic4701502011-11-07 14:20:07 +01002676 SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000),
Takashi Iwaib42590b2011-11-07 14:41:01 +01002677 SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ),
2678 SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_FIXUP_BENQ_T31),
Mengdong Linb5c66112013-11-29 00:35:35 -05002679 SND_PCI_QUIRK(0x8086, 0x7270, "BayleyBay", ALC262_FIXUP_INTEL_BAYLEYBAY),
Takashi Iwai1d045db2011-07-07 18:23:21 +02002680 {}
2681};
2682
Takashi Iwai1727a772013-01-10 09:52:52 +01002683static const struct hda_model_fixup alc262_fixup_models[] = {
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002684 {.id = ALC262_FIXUP_INV_DMIC, .name = "inv-dmic"},
Takashi Iwaie43c44d2018-06-26 17:02:08 +02002685 {.id = ALC262_FIXUP_FSC_H270, .name = "fsc-h270"},
2686 {.id = ALC262_FIXUP_FSC_S7110, .name = "fsc-s7110"},
2687 {.id = ALC262_FIXUP_HP_Z200, .name = "hp-z200"},
2688 {.id = ALC262_FIXUP_TYAN, .name = "tyan"},
2689 {.id = ALC262_FIXUP_LENOVO_3000, .name = "lenovo-3000"},
2690 {.id = ALC262_FIXUP_BENQ, .name = "benq"},
2691 {.id = ALC262_FIXUP_BENQ_T31, .name = "benq-t31"},
2692 {.id = ALC262_FIXUP_INTEL_BAYLEYBAY, .name = "bayleybay"},
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002693 {}
2694};
Takashi Iwai1d045db2011-07-07 18:23:21 +02002695
Takashi Iwai1d045db2011-07-07 18:23:21 +02002696/*
2697 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02002698static int patch_alc262(struct hda_codec *codec)
2699{
2700 struct alc_spec *spec;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002701 int err;
2702
Takashi Iwai3de95172012-05-07 18:03:15 +02002703 err = alc_alloc_spec(codec, 0x0b);
2704 if (err < 0)
2705 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002706
Takashi Iwai3de95172012-05-07 18:03:15 +02002707 spec = codec->spec;
Takashi Iwai08c189f2012-12-19 15:22:24 +01002708 spec->gen.shared_mic_vref_pin = 0x18;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002709
Takashi Iwai225068a2015-05-29 10:42:14 +02002710 spec->shutup = alc_eapd_shutup;
2711
Takashi Iwai1d045db2011-07-07 18:23:21 +02002712#if 0
2713 /* pshou 07/11/05 set a zero PCM sample to DAC when FIFO is
2714 * under-run
2715 */
Takashi Iwai98b24882014-08-18 13:47:50 +02002716 alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x80);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002717#endif
Takashi Iwai1d045db2011-07-07 18:23:21 +02002718 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2719
Takashi Iwaic9af7532019-05-10 11:01:43 +02002720 alc_pre_init(codec);
2721
Takashi Iwai1727a772013-01-10 09:52:52 +01002722 snd_hda_pick_fixup(codec, alc262_fixup_models, alc262_fixup_tbl,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002723 alc262_fixups);
Takashi Iwai1727a772013-01-10 09:52:52 +01002724 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002725
Takashi Iwaiaf741c12012-05-07 18:09:48 +02002726 alc_auto_parse_customize_define(codec);
2727
Takashi Iwai7504b6c2013-03-18 11:25:51 +01002728 if (has_cdefine_beep(codec))
2729 spec->gen.beep_nid = 0x01;
2730
Takashi Iwai42399f72011-11-07 17:18:44 +01002731 /* automatic parse from the BIOS config */
2732 err = alc262_parse_auto_config(codec);
2733 if (err < 0)
2734 goto error;
Takashi Iwai3e6179b2011-07-08 16:55:13 +02002735
Takashi Iwaifea80fa2018-06-20 12:52:46 +02002736 if (!spec->gen.no_analog && spec->gen.beep_nid) {
2737 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2738 if (err < 0)
2739 goto error;
2740 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02002741
Takashi Iwai1727a772013-01-10 09:52:52 +01002742 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01002743
Takashi Iwai1d045db2011-07-07 18:23:21 +02002744 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02002745
2746 error:
2747 alc_free(codec);
2748 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002749}
2750
2751/*
2752 * ALC268
2753 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02002754/* bind Beep switches of both NID 0x0f and 0x10 */
Takashi Iwaia7177772017-05-10 12:04:08 +02002755static int alc268_beep_switch_put(struct snd_kcontrol *kcontrol,
2756 struct snd_ctl_elem_value *ucontrol)
2757{
2758 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2759 unsigned long pval;
2760 int err;
2761
2762 mutex_lock(&codec->control_mutex);
2763 pval = kcontrol->private_value;
2764 kcontrol->private_value = (pval & ~0xff) | 0x0f;
2765 err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2766 if (err >= 0) {
2767 kcontrol->private_value = (pval & ~0xff) | 0x10;
2768 err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2769 }
2770 kcontrol->private_value = pval;
2771 mutex_unlock(&codec->control_mutex);
2772 return err;
2773}
Takashi Iwai1d045db2011-07-07 18:23:21 +02002774
2775static const struct snd_kcontrol_new alc268_beep_mixer[] = {
2776 HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
Takashi Iwaia7177772017-05-10 12:04:08 +02002777 {
2778 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2779 .name = "Beep Playback Switch",
2780 .subdevice = HDA_SUBDEV_AMP_FLAG,
2781 .info = snd_hda_mixer_amp_switch_info,
2782 .get = snd_hda_mixer_amp_switch_get,
2783 .put = alc268_beep_switch_put,
2784 .private_value = HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT)
2785 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02002786};
2787
2788/* set PCBEEP vol = 0, mute connections */
2789static const struct hda_verb alc268_beep_init_verbs[] = {
2790 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2791 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2792 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2793 { }
2794};
2795
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002796enum {
2797 ALC268_FIXUP_INV_DMIC,
Takashi Iwaicb766402012-10-20 10:55:21 +02002798 ALC268_FIXUP_HP_EAPD,
Takashi Iwai24eff322013-11-04 18:21:08 +01002799 ALC268_FIXUP_SPDIF,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002800};
2801
Takashi Iwai1727a772013-01-10 09:52:52 +01002802static const struct hda_fixup alc268_fixups[] = {
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002803 [ALC268_FIXUP_INV_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002804 .type = HDA_FIXUP_FUNC,
David Henningsson9d36a7d2014-10-07 10:18:42 +02002805 .v.func = alc_fixup_inv_dmic,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002806 },
Takashi Iwaicb766402012-10-20 10:55:21 +02002807 [ALC268_FIXUP_HP_EAPD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002808 .type = HDA_FIXUP_VERBS,
Takashi Iwaicb766402012-10-20 10:55:21 +02002809 .v.verbs = (const struct hda_verb[]) {
2810 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 0},
2811 {}
2812 }
2813 },
Takashi Iwai24eff322013-11-04 18:21:08 +01002814 [ALC268_FIXUP_SPDIF] = {
2815 .type = HDA_FIXUP_PINS,
2816 .v.pins = (const struct hda_pintbl[]) {
2817 { 0x1e, 0x014b1180 }, /* enable SPDIF out */
2818 {}
2819 }
2820 },
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002821};
2822
Takashi Iwai1727a772013-01-10 09:52:52 +01002823static const struct hda_model_fixup alc268_fixup_models[] = {
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002824 {.id = ALC268_FIXUP_INV_DMIC, .name = "inv-dmic"},
Takashi Iwaicb766402012-10-20 10:55:21 +02002825 {.id = ALC268_FIXUP_HP_EAPD, .name = "hp-eapd"},
Takashi Iwai03bf11c2018-06-26 16:56:41 +02002826 {.id = ALC268_FIXUP_SPDIF, .name = "spdif"},
Takashi Iwaicb766402012-10-20 10:55:21 +02002827 {}
2828};
2829
2830static const struct snd_pci_quirk alc268_fixup_tbl[] = {
Takashi Iwai24eff322013-11-04 18:21:08 +01002831 SND_PCI_QUIRK(0x1025, 0x0139, "Acer TravelMate 6293", ALC268_FIXUP_SPDIF),
David Henningssonfcd8f3b2013-01-28 05:45:47 +01002832 SND_PCI_QUIRK(0x1025, 0x015b, "Acer AOA 150 (ZG5)", ALC268_FIXUP_INV_DMIC),
Takashi Iwaicb766402012-10-20 10:55:21 +02002833 /* below is codec SSID since multiple Toshiba laptops have the
2834 * same PCI SSID 1179:ff00
2835 */
2836 SND_PCI_QUIRK(0x1179, 0xff06, "Toshiba P200", ALC268_FIXUP_HP_EAPD),
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002837 {}
2838};
2839
Takashi Iwai1d045db2011-07-07 18:23:21 +02002840/*
2841 * BIOS auto configuration
2842 */
2843static int alc268_parse_auto_config(struct hda_codec *codec)
2844{
Takashi Iwai3e6179b2011-07-08 16:55:13 +02002845 static const hda_nid_t alc268_ssids[] = { 0x15, 0x1b, 0x14, 0 };
Takashi Iwai7504b6c2013-03-18 11:25:51 +01002846 return alc_parse_auto_config(codec, NULL, alc268_ssids);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002847}
2848
Takashi Iwai1d045db2011-07-07 18:23:21 +02002849/*
2850 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02002851static int patch_alc268(struct hda_codec *codec)
2852{
2853 struct alc_spec *spec;
Takashi Iwaia5cb4632018-06-20 12:50:11 +02002854 int i, err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002855
Takashi Iwai1d045db2011-07-07 18:23:21 +02002856 /* ALC268 has no aa-loopback mixer */
Takashi Iwai3de95172012-05-07 18:03:15 +02002857 err = alc_alloc_spec(codec, 0);
2858 if (err < 0)
2859 return err;
2860
2861 spec = codec->spec;
Takashi Iwai2722b532019-08-22 09:55:37 +02002862 if (has_cdefine_beep(codec))
2863 spec->gen.beep_nid = 0x01;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002864
Takashi Iwai225068a2015-05-29 10:42:14 +02002865 spec->shutup = alc_eapd_shutup;
2866
Takashi Iwaic9af7532019-05-10 11:01:43 +02002867 alc_pre_init(codec);
2868
Takashi Iwai1727a772013-01-10 09:52:52 +01002869 snd_hda_pick_fixup(codec, alc268_fixup_models, alc268_fixup_tbl, alc268_fixups);
2870 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002871
Takashi Iwai6ebb8052011-08-16 15:15:40 +02002872 /* automatic parse from the BIOS config */
2873 err = alc268_parse_auto_config(codec);
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02002874 if (err < 0)
2875 goto error;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002876
Takashi Iwai7504b6c2013-03-18 11:25:51 +01002877 if (err > 0 && !spec->gen.no_analog &&
2878 spec->gen.autocfg.speaker_pins[0] != 0x1d) {
Takashi Iwaia5cb4632018-06-20 12:50:11 +02002879 for (i = 0; i < ARRAY_SIZE(alc268_beep_mixer); i++) {
2880 if (!snd_hda_gen_add_kctl(&spec->gen, NULL,
2881 &alc268_beep_mixer[i])) {
2882 err = -ENOMEM;
2883 goto error;
2884 }
2885 }
Takashi Iwai7504b6c2013-03-18 11:25:51 +01002886 snd_hda_add_verbs(codec, alc268_beep_init_verbs);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002887 if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
2888 /* override the amp caps for beep generator */
2889 snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
2890 (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
2891 (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
2892 (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
2893 (0 << AC_AMPCAP_MUTE_SHIFT));
2894 }
2895
Takashi Iwai1727a772013-01-10 09:52:52 +01002896 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002897
Takashi Iwai1d045db2011-07-07 18:23:21 +02002898 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02002899
2900 error:
2901 alc_free(codec);
2902 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002903}
2904
2905/*
2906 * ALC269
2907 */
Takashi Iwai08c189f2012-12-19 15:22:24 +01002908
Takashi Iwai1d045db2011-07-07 18:23:21 +02002909static const struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
Takashi Iwai1d045db2011-07-07 18:23:21 +02002910 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
Takashi Iwai1d045db2011-07-07 18:23:21 +02002911};
2912
2913static const struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
Takashi Iwai1d045db2011-07-07 18:23:21 +02002914 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
Takashi Iwai1d045db2011-07-07 18:23:21 +02002915};
2916
Takashi Iwai1d045db2011-07-07 18:23:21 +02002917/* different alc269-variants */
2918enum {
2919 ALC269_TYPE_ALC269VA,
2920 ALC269_TYPE_ALC269VB,
2921 ALC269_TYPE_ALC269VC,
Kailang Yangadcc70b2012-05-25 08:08:38 +02002922 ALC269_TYPE_ALC269VD,
Kailang Yang065380f2013-01-10 10:25:48 +01002923 ALC269_TYPE_ALC280,
2924 ALC269_TYPE_ALC282,
Kailang Yang2af02be2013-08-22 10:03:50 +02002925 ALC269_TYPE_ALC283,
Kailang Yang065380f2013-01-10 10:25:48 +01002926 ALC269_TYPE_ALC284,
Kailang Yang4731d5d2017-06-30 15:22:57 +08002927 ALC269_TYPE_ALC293,
Kailang Yang7fc7d042013-04-25 11:04:43 +02002928 ALC269_TYPE_ALC286,
Kailang Yang506b62c2014-12-18 17:07:44 +08002929 ALC269_TYPE_ALC298,
Kailang Yang1d04c9d2013-10-24 11:35:18 +02002930 ALC269_TYPE_ALC255,
Kailang Yang4344aec2014-12-17 17:39:05 +08002931 ALC269_TYPE_ALC256,
Kailang Yangf429e7e2017-12-05 15:38:24 +08002932 ALC269_TYPE_ALC257,
Kailang Yang0a6f0602017-06-30 16:00:48 +08002933 ALC269_TYPE_ALC215,
Kailang Yang42314302016-02-03 15:03:50 +08002934 ALC269_TYPE_ALC225,
Kailang Yangdcd4f0d2016-05-04 15:50:18 +08002935 ALC269_TYPE_ALC294,
Kailang Yang1078bef2018-11-08 16:36:15 +08002936 ALC269_TYPE_ALC300,
Kailang Yangf0778872019-10-24 15:13:32 +08002937 ALC269_TYPE_ALC623,
Kailang Yang6fbae352016-05-30 16:44:20 +08002938 ALC269_TYPE_ALC700,
Takashi Iwai1d045db2011-07-07 18:23:21 +02002939};
2940
2941/*
2942 * BIOS auto configuration
2943 */
2944static int alc269_parse_auto_config(struct hda_codec *codec)
2945{
Takashi Iwai1d045db2011-07-07 18:23:21 +02002946 static const hda_nid_t alc269_ignore[] = { 0x1d, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02002947 static const hda_nid_t alc269_ssids[] = { 0, 0x1b, 0x14, 0x21 };
2948 static const hda_nid_t alc269va_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2949 struct alc_spec *spec = codec->spec;
Kailang Yangadcc70b2012-05-25 08:08:38 +02002950 const hda_nid_t *ssids;
2951
2952 switch (spec->codec_variant) {
2953 case ALC269_TYPE_ALC269VA:
2954 case ALC269_TYPE_ALC269VC:
Kailang Yang065380f2013-01-10 10:25:48 +01002955 case ALC269_TYPE_ALC280:
2956 case ALC269_TYPE_ALC284:
Kailang Yang4731d5d2017-06-30 15:22:57 +08002957 case ALC269_TYPE_ALC293:
Kailang Yangadcc70b2012-05-25 08:08:38 +02002958 ssids = alc269va_ssids;
2959 break;
2960 case ALC269_TYPE_ALC269VB:
2961 case ALC269_TYPE_ALC269VD:
Kailang Yang065380f2013-01-10 10:25:48 +01002962 case ALC269_TYPE_ALC282:
Kailang Yang2af02be2013-08-22 10:03:50 +02002963 case ALC269_TYPE_ALC283:
Kailang Yang7fc7d042013-04-25 11:04:43 +02002964 case ALC269_TYPE_ALC286:
Kailang Yang506b62c2014-12-18 17:07:44 +08002965 case ALC269_TYPE_ALC298:
Kailang Yang1d04c9d2013-10-24 11:35:18 +02002966 case ALC269_TYPE_ALC255:
Kailang Yang4344aec2014-12-17 17:39:05 +08002967 case ALC269_TYPE_ALC256:
Kailang Yangf429e7e2017-12-05 15:38:24 +08002968 case ALC269_TYPE_ALC257:
Kailang Yang0a6f0602017-06-30 16:00:48 +08002969 case ALC269_TYPE_ALC215:
Kailang Yang42314302016-02-03 15:03:50 +08002970 case ALC269_TYPE_ALC225:
Kailang Yangdcd4f0d2016-05-04 15:50:18 +08002971 case ALC269_TYPE_ALC294:
Kailang Yang1078bef2018-11-08 16:36:15 +08002972 case ALC269_TYPE_ALC300:
Kailang Yangf0778872019-10-24 15:13:32 +08002973 case ALC269_TYPE_ALC623:
Kailang Yang6fbae352016-05-30 16:44:20 +08002974 case ALC269_TYPE_ALC700:
Kailang Yangadcc70b2012-05-25 08:08:38 +02002975 ssids = alc269_ssids;
2976 break;
2977 default:
2978 ssids = alc269_ssids;
2979 break;
2980 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02002981
Takashi Iwai3e6179b2011-07-08 16:55:13 +02002982 return alc_parse_auto_config(codec, alc269_ignore, ssids);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002983}
2984
Kailang Yang1387e2d2012-11-08 10:23:18 +01002985static void alc269vb_toggle_power_output(struct hda_codec *codec, int power_up)
Takashi Iwai1d045db2011-07-07 18:23:21 +02002986{
Takashi Iwai98b24882014-08-18 13:47:50 +02002987 alc_update_coef_idx(codec, 0x04, 1 << 11, power_up ? (1 << 11) : 0);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002988}
2989
2990static void alc269_shutup(struct hda_codec *codec)
2991{
Kailang Yangadcc70b2012-05-25 08:08:38 +02002992 struct alc_spec *spec = codec->spec;
2993
Kailang Yang1387e2d2012-11-08 10:23:18 +01002994 if (spec->codec_variant == ALC269_TYPE_ALC269VB)
2995 alc269vb_toggle_power_output(codec, 0);
2996 if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
2997 (alc_get_coef0(codec) & 0x00ff) == 0x018) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02002998 msleep(150);
2999 }
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003000 alc_shutup_pins(codec);
Takashi Iwai1d045db2011-07-07 18:23:21 +02003001}
3002
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01003003static const struct coef_fw alc282_coefs[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02003004 WRITE_COEF(0x03, 0x0002), /* Power Down Control */
Kailang Yang32fa7e42014-10-24 16:26:01 +08003005 UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
Takashi Iwai54db6c32014-08-18 15:11:19 +02003006 WRITE_COEF(0x07, 0x0200), /* DMIC control */
3007 UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
3008 UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
3009 WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
3010 WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
3011 WRITE_COEF(0x0e, 0x6e00), /* LDO1/2/3, DAC/ADC */
3012 UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
3013 UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
3014 WRITE_COEF(0x6f, 0x0), /* Class D test 4 */
3015 UPDATE_COEF(0x0c, 0xfe00, 0), /* IO power down directly */
3016 WRITE_COEF(0x34, 0xa0c0), /* ANC */
3017 UPDATE_COEF(0x16, 0x0008, 0), /* AGC MUX */
3018 UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
3019 UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
3020 WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
3021 WRITE_COEF(0x63, 0x2902), /* PLL */
3022 WRITE_COEF(0x68, 0xa080), /* capless control 2 */
3023 WRITE_COEF(0x69, 0x3400), /* capless control 3 */
3024 WRITE_COEF(0x6a, 0x2f3e), /* capless control 4 */
3025 WRITE_COEF(0x6b, 0x0), /* capless control 5 */
3026 UPDATE_COEF(0x6d, 0x0fff, 0x0900), /* class D test 2 */
3027 WRITE_COEF(0x6e, 0x110a), /* class D test 3 */
3028 UPDATE_COEF(0x70, 0x00f8, 0x00d8), /* class D test 5 */
3029 WRITE_COEF(0x71, 0x0014), /* class D test 6 */
3030 WRITE_COEF(0x72, 0xc2ba), /* classD OCP */
3031 UPDATE_COEF(0x77, 0x0f80, 0), /* classD pure DC test */
3032 WRITE_COEF(0x6c, 0xfc06), /* Class D amp control */
3033 {}
3034};
3035
Kailang Yangcb149cb2014-03-18 16:45:32 +08003036static void alc282_restore_default_value(struct hda_codec *codec)
3037{
Takashi Iwai54db6c32014-08-18 15:11:19 +02003038 alc_process_coef_fw(codec, alc282_coefs);
Kailang Yangcb149cb2014-03-18 16:45:32 +08003039}
3040
Kailang Yang7b5c7a02014-03-18 16:15:54 +08003041static void alc282_init(struct hda_codec *codec)
3042{
3043 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003044 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang7b5c7a02014-03-18 16:15:54 +08003045 bool hp_pin_sense;
3046 int coef78;
3047
Kailang Yangcb149cb2014-03-18 16:45:32 +08003048 alc282_restore_default_value(codec);
3049
Kailang Yang7b5c7a02014-03-18 16:15:54 +08003050 if (!hp_pin)
3051 return;
3052 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3053 coef78 = alc_read_coef_idx(codec, 0x78);
3054
3055 /* Index 0x78 Direct Drive HP AMP LPM Control 1 */
3056 /* Headphone capless set to high power mode */
3057 alc_write_coef_idx(codec, 0x78, 0x9004);
3058
3059 if (hp_pin_sense)
3060 msleep(2);
3061
3062 snd_hda_codec_write(codec, hp_pin, 0,
3063 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3064
3065 if (hp_pin_sense)
3066 msleep(85);
3067
3068 snd_hda_codec_write(codec, hp_pin, 0,
3069 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3070
3071 if (hp_pin_sense)
3072 msleep(100);
3073
3074 /* Headphone capless set to normal mode */
3075 alc_write_coef_idx(codec, 0x78, coef78);
3076}
3077
3078static void alc282_shutup(struct hda_codec *codec)
3079{
3080 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003081 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang7b5c7a02014-03-18 16:15:54 +08003082 bool hp_pin_sense;
3083 int coef78;
3084
3085 if (!hp_pin) {
3086 alc269_shutup(codec);
3087 return;
3088 }
3089
3090 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3091 coef78 = alc_read_coef_idx(codec, 0x78);
3092 alc_write_coef_idx(codec, 0x78, 0x9004);
3093
3094 if (hp_pin_sense)
3095 msleep(2);
3096
3097 snd_hda_codec_write(codec, hp_pin, 0,
3098 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3099
3100 if (hp_pin_sense)
3101 msleep(85);
3102
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003103 if (!spec->no_shutup_pins)
3104 snd_hda_codec_write(codec, hp_pin, 0,
3105 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
Kailang Yang7b5c7a02014-03-18 16:15:54 +08003106
3107 if (hp_pin_sense)
3108 msleep(100);
3109
3110 alc_auto_setup_eapd(codec, false);
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003111 alc_shutup_pins(codec);
Kailang Yang7b5c7a02014-03-18 16:15:54 +08003112 alc_write_coef_idx(codec, 0x78, coef78);
3113}
3114
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01003115static const struct coef_fw alc283_coefs[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02003116 WRITE_COEF(0x03, 0x0002), /* Power Down Control */
Kailang Yang56779862014-10-24 16:17:51 +08003117 UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
Takashi Iwai54db6c32014-08-18 15:11:19 +02003118 WRITE_COEF(0x07, 0x0200), /* DMIC control */
3119 UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
3120 UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
3121 WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
3122 WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
3123 WRITE_COEF(0x0e, 0x6fc0), /* LDO1/2/3, DAC/ADC */
3124 UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
3125 UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
3126 WRITE_COEF(0x3a, 0x0), /* Class D test 4 */
3127 UPDATE_COEF(0x0c, 0xfe00, 0x0), /* IO power down directly */
3128 WRITE_COEF(0x22, 0xa0c0), /* ANC */
3129 UPDATE_COEFEX(0x53, 0x01, 0x000f, 0x0008), /* AGC MUX */
3130 UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
3131 UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
3132 WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
3133 WRITE_COEF(0x2e, 0x2902), /* PLL */
3134 WRITE_COEF(0x33, 0xa080), /* capless control 2 */
3135 WRITE_COEF(0x34, 0x3400), /* capless control 3 */
3136 WRITE_COEF(0x35, 0x2f3e), /* capless control 4 */
3137 WRITE_COEF(0x36, 0x0), /* capless control 5 */
3138 UPDATE_COEF(0x38, 0x0fff, 0x0900), /* class D test 2 */
3139 WRITE_COEF(0x39, 0x110a), /* class D test 3 */
3140 UPDATE_COEF(0x3b, 0x00f8, 0x00d8), /* class D test 5 */
3141 WRITE_COEF(0x3c, 0x0014), /* class D test 6 */
3142 WRITE_COEF(0x3d, 0xc2ba), /* classD OCP */
3143 UPDATE_COEF(0x42, 0x0f80, 0x0), /* classD pure DC test */
3144 WRITE_COEF(0x49, 0x0), /* test mode */
3145 UPDATE_COEF(0x40, 0xf800, 0x9800), /* Class D DC enable */
3146 UPDATE_COEF(0x42, 0xf000, 0x2000), /* DC offset */
3147 WRITE_COEF(0x37, 0xfc06), /* Class D amp control */
Kailang Yang56779862014-10-24 16:17:51 +08003148 UPDATE_COEF(0x1b, 0x8000, 0), /* HP JD control */
Takashi Iwai54db6c32014-08-18 15:11:19 +02003149 {}
3150};
3151
Kailang Yang6bd55b02014-03-17 13:51:27 +08003152static void alc283_restore_default_value(struct hda_codec *codec)
3153{
Takashi Iwai54db6c32014-08-18 15:11:19 +02003154 alc_process_coef_fw(codec, alc283_coefs);
Kailang Yang6bd55b02014-03-17 13:51:27 +08003155}
3156
Kailang Yang2af02be2013-08-22 10:03:50 +02003157static void alc283_init(struct hda_codec *codec)
3158{
3159 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003160 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang2af02be2013-08-22 10:03:50 +02003161 bool hp_pin_sense;
Kailang Yang2af02be2013-08-22 10:03:50 +02003162
Kailang Yang6bd55b02014-03-17 13:51:27 +08003163 alc283_restore_default_value(codec);
3164
Kailang Yang2af02be2013-08-22 10:03:50 +02003165 if (!hp_pin)
3166 return;
Kailang Yanga59d7192015-04-08 16:34:00 +08003167
3168 msleep(30);
Kailang Yang2af02be2013-08-22 10:03:50 +02003169 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3170
3171 /* Index 0x43 Direct Drive HP AMP LPM Control 1 */
3172 /* Headphone capless set to high power mode */
3173 alc_write_coef_idx(codec, 0x43, 0x9004);
3174
3175 snd_hda_codec_write(codec, hp_pin, 0,
3176 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3177
3178 if (hp_pin_sense)
3179 msleep(85);
3180
3181 snd_hda_codec_write(codec, hp_pin, 0,
3182 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3183
3184 if (hp_pin_sense)
3185 msleep(85);
3186 /* Index 0x46 Combo jack auto switch control 2 */
3187 /* 3k pull low control for Headset jack. */
Takashi Iwai98b24882014-08-18 13:47:50 +02003188 alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
Kailang Yang2af02be2013-08-22 10:03:50 +02003189 /* Headphone capless set to normal mode */
3190 alc_write_coef_idx(codec, 0x43, 0x9614);
3191}
3192
3193static void alc283_shutup(struct hda_codec *codec)
3194{
3195 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003196 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang2af02be2013-08-22 10:03:50 +02003197 bool hp_pin_sense;
Kailang Yang2af02be2013-08-22 10:03:50 +02003198
3199 if (!hp_pin) {
3200 alc269_shutup(codec);
3201 return;
3202 }
3203
3204 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3205
3206 alc_write_coef_idx(codec, 0x43, 0x9004);
3207
Harsha Priyab450b172014-10-09 11:04:56 +00003208 /*depop hp during suspend*/
3209 alc_write_coef_idx(codec, 0x06, 0x2100);
3210
Kailang Yang2af02be2013-08-22 10:03:50 +02003211 snd_hda_codec_write(codec, hp_pin, 0,
3212 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3213
3214 if (hp_pin_sense)
Kailang Yang88011c092013-10-24 15:45:24 +02003215 msleep(100);
Kailang Yang2af02be2013-08-22 10:03:50 +02003216
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003217 if (!spec->no_shutup_pins)
3218 snd_hda_codec_write(codec, hp_pin, 0,
3219 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
Kailang Yang2af02be2013-08-22 10:03:50 +02003220
Takashi Iwai98b24882014-08-18 13:47:50 +02003221 alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
Kailang Yang2af02be2013-08-22 10:03:50 +02003222
3223 if (hp_pin_sense)
Kailang Yang88011c092013-10-24 15:45:24 +02003224 msleep(100);
Kailang Yang0435b3f2014-04-08 17:14:14 +08003225 alc_auto_setup_eapd(codec, false);
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003226 alc_shutup_pins(codec);
Kailang Yang2af02be2013-08-22 10:03:50 +02003227 alc_write_coef_idx(codec, 0x43, 0x9614);
3228}
3229
Kailang Yang4a219ef2017-06-16 16:54:35 +08003230static void alc256_init(struct hda_codec *codec)
3231{
3232 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003233 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang4a219ef2017-06-16 16:54:35 +08003234 bool hp_pin_sense;
3235
3236 if (!hp_pin)
Kailang Yang6447c962019-05-08 16:27:03 +08003237 hp_pin = 0x21;
Kailang Yang4a219ef2017-06-16 16:54:35 +08003238
3239 msleep(30);
3240
3241 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3242
3243 if (hp_pin_sense)
3244 msleep(2);
3245
3246 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
Kailang Yang6447c962019-05-08 16:27:03 +08003247 if (spec->ultra_low_power) {
3248 alc_update_coef_idx(codec, 0x03, 1<<1, 1<<1);
3249 alc_update_coef_idx(codec, 0x08, 3<<2, 3<<2);
3250 alc_update_coef_idx(codec, 0x08, 7<<4, 0);
3251 alc_update_coef_idx(codec, 0x3b, 1<<15, 0);
3252 alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3253 msleep(30);
3254 }
Kailang Yang4a219ef2017-06-16 16:54:35 +08003255
3256 snd_hda_codec_write(codec, hp_pin, 0,
3257 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3258
Kailang Yang6447c962019-05-08 16:27:03 +08003259 if (hp_pin_sense || spec->ultra_low_power)
Kailang Yang4a219ef2017-06-16 16:54:35 +08003260 msleep(85);
3261
3262 snd_hda_codec_write(codec, hp_pin, 0,
3263 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3264
Kailang Yang6447c962019-05-08 16:27:03 +08003265 if (hp_pin_sense || spec->ultra_low_power)
Kailang Yang4a219ef2017-06-16 16:54:35 +08003266 msleep(100);
3267
3268 alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
3269 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
Kailang Yang88d42b22018-03-14 16:08:57 +08003270 alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15); /* Clear bit */
3271 alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15);
Kailang Yangd07a9a42019-07-04 16:02:10 +08003272 alc_update_coef_idx(codec, 0x36, 1 << 13, 1 << 5); /* Switch pcbeep path to Line in path*/
Kailang Yang4a219ef2017-06-16 16:54:35 +08003273}
3274
3275static void alc256_shutup(struct hda_codec *codec)
3276{
3277 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003278 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang4a219ef2017-06-16 16:54:35 +08003279 bool hp_pin_sense;
3280
Kailang Yang6447c962019-05-08 16:27:03 +08003281 if (!hp_pin)
3282 hp_pin = 0x21;
Kailang Yang4a219ef2017-06-16 16:54:35 +08003283
3284 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3285
3286 if (hp_pin_sense)
3287 msleep(2);
3288
3289 snd_hda_codec_write(codec, hp_pin, 0,
3290 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3291
Kailang Yang6447c962019-05-08 16:27:03 +08003292 if (hp_pin_sense || spec->ultra_low_power)
Kailang Yang4a219ef2017-06-16 16:54:35 +08003293 msleep(85);
3294
Takashi Iwai1c9609e2018-01-19 14:18:34 +01003295 /* 3k pull low control for Headset jack. */
3296 /* NOTE: call this before clearing the pin, otherwise codec stalls */
3297 alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
3298
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003299 if (!spec->no_shutup_pins)
3300 snd_hda_codec_write(codec, hp_pin, 0,
3301 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
Kailang Yang4a219ef2017-06-16 16:54:35 +08003302
Kailang Yang6447c962019-05-08 16:27:03 +08003303 if (hp_pin_sense || spec->ultra_low_power)
Kailang Yang4a219ef2017-06-16 16:54:35 +08003304 msleep(100);
3305
3306 alc_auto_setup_eapd(codec, false);
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003307 alc_shutup_pins(codec);
Kailang Yang6447c962019-05-08 16:27:03 +08003308 if (spec->ultra_low_power) {
3309 msleep(50);
3310 alc_update_coef_idx(codec, 0x03, 1<<1, 0);
3311 alc_update_coef_idx(codec, 0x08, 7<<4, 7<<4);
3312 alc_update_coef_idx(codec, 0x08, 3<<2, 0);
3313 alc_update_coef_idx(codec, 0x3b, 1<<15, 1<<15);
3314 alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3315 msleep(30);
3316 }
Kailang Yang4a219ef2017-06-16 16:54:35 +08003317}
3318
Kailang Yangda911b12018-01-05 16:50:08 +08003319static void alc225_init(struct hda_codec *codec)
3320{
3321 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003322 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yangda911b12018-01-05 16:50:08 +08003323 bool hp1_pin_sense, hp2_pin_sense;
3324
3325 if (!hp_pin)
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003326 hp_pin = 0x21;
Kailang Yangda911b12018-01-05 16:50:08 +08003327 msleep(30);
3328
3329 hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3330 hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3331
3332 if (hp1_pin_sense || hp2_pin_sense)
3333 msleep(2);
3334
3335 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003336 if (spec->ultra_low_power) {
3337 alc_update_coef_idx(codec, 0x08, 0x0f << 2, 3<<2);
3338 alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3339 alc_update_coef_idx(codec, 0x33, 1<<11, 0);
3340 msleep(30);
3341 }
Kailang Yangda911b12018-01-05 16:50:08 +08003342
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003343 if (hp1_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003344 snd_hda_codec_write(codec, hp_pin, 0,
3345 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3346 if (hp2_pin_sense)
3347 snd_hda_codec_write(codec, 0x16, 0,
3348 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3349
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003350 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003351 msleep(85);
3352
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003353 if (hp1_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003354 snd_hda_codec_write(codec, hp_pin, 0,
3355 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3356 if (hp2_pin_sense)
3357 snd_hda_codec_write(codec, 0x16, 0,
3358 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3359
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003360 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003361 msleep(100);
3362
3363 alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3364 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
3365}
3366
3367static void alc225_shutup(struct hda_codec *codec)
3368{
3369 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003370 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yangda911b12018-01-05 16:50:08 +08003371 bool hp1_pin_sense, hp2_pin_sense;
3372
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003373 if (!hp_pin)
3374 hp_pin = 0x21;
Kailang Yangda911b12018-01-05 16:50:08 +08003375 /* 3k pull low control for Headset jack. */
3376 alc_update_coef_idx(codec, 0x4a, 0, 3 << 10);
3377
3378 hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3379 hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3380
3381 if (hp1_pin_sense || hp2_pin_sense)
3382 msleep(2);
3383
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003384 if (hp1_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003385 snd_hda_codec_write(codec, hp_pin, 0,
3386 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3387 if (hp2_pin_sense)
3388 snd_hda_codec_write(codec, 0x16, 0,
3389 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3390
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003391 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003392 msleep(85);
3393
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003394 if (hp1_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003395 snd_hda_codec_write(codec, hp_pin, 0,
3396 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3397 if (hp2_pin_sense)
3398 snd_hda_codec_write(codec, 0x16, 0,
3399 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3400
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003401 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003402 msleep(100);
3403
3404 alc_auto_setup_eapd(codec, false);
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003405 alc_shutup_pins(codec);
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003406 if (spec->ultra_low_power) {
3407 msleep(50);
3408 alc_update_coef_idx(codec, 0x08, 0x0f << 2, 0x0c << 2);
3409 alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3410 alc_update_coef_idx(codec, 0x33, 1<<11, 1<<11);
3411 alc_update_coef_idx(codec, 0x4a, 3<<4, 2<<4);
3412 msleep(30);
3413 }
Kailang Yangda911b12018-01-05 16:50:08 +08003414}
3415
Kailang Yangc2d6af52017-06-21 14:50:54 +08003416static void alc_default_init(struct hda_codec *codec)
3417{
3418 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003419 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yangc2d6af52017-06-21 14:50:54 +08003420 bool hp_pin_sense;
3421
3422 if (!hp_pin)
3423 return;
3424
3425 msleep(30);
3426
3427 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3428
3429 if (hp_pin_sense)
3430 msleep(2);
3431
3432 snd_hda_codec_write(codec, hp_pin, 0,
3433 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3434
3435 if (hp_pin_sense)
3436 msleep(85);
3437
3438 snd_hda_codec_write(codec, hp_pin, 0,
3439 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3440
3441 if (hp_pin_sense)
3442 msleep(100);
3443}
3444
3445static void alc_default_shutup(struct hda_codec *codec)
3446{
3447 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003448 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yangc2d6af52017-06-21 14:50:54 +08003449 bool hp_pin_sense;
3450
3451 if (!hp_pin) {
3452 alc269_shutup(codec);
3453 return;
3454 }
3455
3456 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3457
3458 if (hp_pin_sense)
3459 msleep(2);
3460
3461 snd_hda_codec_write(codec, hp_pin, 0,
3462 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3463
3464 if (hp_pin_sense)
3465 msleep(85);
3466
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003467 if (!spec->no_shutup_pins)
3468 snd_hda_codec_write(codec, hp_pin, 0,
3469 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
Kailang Yangc2d6af52017-06-21 14:50:54 +08003470
3471 if (hp_pin_sense)
3472 msleep(100);
3473
3474 alc_auto_setup_eapd(codec, false);
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003475 alc_shutup_pins(codec);
Kailang Yangc2d6af52017-06-21 14:50:54 +08003476}
3477
Kailang Yang693abe12019-01-29 15:38:21 +08003478static void alc294_hp_init(struct hda_codec *codec)
3479{
3480 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003481 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang693abe12019-01-29 15:38:21 +08003482 int i, val;
3483
3484 if (!hp_pin)
3485 return;
3486
3487 snd_hda_codec_write(codec, hp_pin, 0,
3488 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3489
3490 msleep(100);
3491
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003492 if (!spec->no_shutup_pins)
3493 snd_hda_codec_write(codec, hp_pin, 0,
3494 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
Kailang Yang693abe12019-01-29 15:38:21 +08003495
3496 alc_update_coef_idx(codec, 0x6f, 0x000f, 0);/* Set HP depop to manual mode */
3497 alc_update_coefex_idx(codec, 0x58, 0x00, 0x8000, 0x8000); /* HP depop procedure start */
3498
3499 /* Wait for depop procedure finish */
3500 val = alc_read_coefex_idx(codec, 0x58, 0x01);
3501 for (i = 0; i < 20 && val & 0x0080; i++) {
3502 msleep(50);
3503 val = alc_read_coefex_idx(codec, 0x58, 0x01);
3504 }
3505 /* Set HP depop to auto mode */
3506 alc_update_coef_idx(codec, 0x6f, 0x000f, 0x000b);
3507 msleep(50);
3508}
3509
3510static void alc294_init(struct hda_codec *codec)
3511{
3512 struct alc_spec *spec = codec->spec;
3513
Takashi Iwaif6ef4e02019-01-29 14:14:51 +01003514 /* required only at boot or S4 resume time */
3515 if (!spec->done_hp_init ||
3516 codec->core.dev.power.power_state.event == PM_EVENT_RESTORE) {
Kailang Yang693abe12019-01-29 15:38:21 +08003517 alc294_hp_init(codec);
3518 spec->done_hp_init = true;
3519 }
3520 alc_default_init(codec);
3521}
3522
Kailang Yangad60d502013-06-28 12:03:01 +02003523static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg,
3524 unsigned int val)
3525{
3526 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3527 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val & 0xffff); /* LSB */
3528 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val >> 16); /* MSB */
3529}
3530
3531static int alc5505_coef_get(struct hda_codec *codec, unsigned int index_reg)
3532{
3533 unsigned int val;
3534
3535 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3536 val = snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3537 & 0xffff;
3538 val |= snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3539 << 16;
3540 return val;
3541}
3542
3543static void alc5505_dsp_halt(struct hda_codec *codec)
3544{
3545 unsigned int val;
3546
3547 alc5505_coef_set(codec, 0x3000, 0x000c); /* DSP CPU stop */
3548 alc5505_coef_set(codec, 0x880c, 0x0008); /* DDR enter self refresh */
3549 alc5505_coef_set(codec, 0x61c0, 0x11110080); /* Clock control for PLL and CPU */
3550 alc5505_coef_set(codec, 0x6230, 0xfc0d4011); /* Disable Input OP */
3551 alc5505_coef_set(codec, 0x61b4, 0x040a2b03); /* Stop PLL2 */
3552 alc5505_coef_set(codec, 0x61b0, 0x00005b17); /* Stop PLL1 */
3553 alc5505_coef_set(codec, 0x61b8, 0x04133303); /* Stop PLL3 */
3554 val = alc5505_coef_get(codec, 0x6220);
3555 alc5505_coef_set(codec, 0x6220, (val | 0x3000)); /* switch Ringbuffer clock to DBUS clock */
3556}
3557
3558static void alc5505_dsp_back_from_halt(struct hda_codec *codec)
3559{
3560 alc5505_coef_set(codec, 0x61b8, 0x04133302);
3561 alc5505_coef_set(codec, 0x61b0, 0x00005b16);
3562 alc5505_coef_set(codec, 0x61b4, 0x040a2b02);
3563 alc5505_coef_set(codec, 0x6230, 0xf80d4011);
3564 alc5505_coef_set(codec, 0x6220, 0x2002010f);
3565 alc5505_coef_set(codec, 0x880c, 0x00000004);
3566}
3567
3568static void alc5505_dsp_init(struct hda_codec *codec)
3569{
3570 unsigned int val;
3571
3572 alc5505_dsp_halt(codec);
3573 alc5505_dsp_back_from_halt(codec);
3574 alc5505_coef_set(codec, 0x61b0, 0x5b14); /* PLL1 control */
3575 alc5505_coef_set(codec, 0x61b0, 0x5b16);
3576 alc5505_coef_set(codec, 0x61b4, 0x04132b00); /* PLL2 control */
3577 alc5505_coef_set(codec, 0x61b4, 0x04132b02);
3578 alc5505_coef_set(codec, 0x61b8, 0x041f3300); /* PLL3 control*/
3579 alc5505_coef_set(codec, 0x61b8, 0x041f3302);
3580 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_CODEC_RESET, 0); /* Function reset */
3581 alc5505_coef_set(codec, 0x61b8, 0x041b3302);
3582 alc5505_coef_set(codec, 0x61b8, 0x04173302);
3583 alc5505_coef_set(codec, 0x61b8, 0x04163302);
3584 alc5505_coef_set(codec, 0x8800, 0x348b328b); /* DRAM control */
3585 alc5505_coef_set(codec, 0x8808, 0x00020022); /* DRAM control */
3586 alc5505_coef_set(codec, 0x8818, 0x00000400); /* DRAM control */
3587
3588 val = alc5505_coef_get(codec, 0x6200) >> 16; /* Read revision ID */
3589 if (val <= 3)
3590 alc5505_coef_set(codec, 0x6220, 0x2002010f); /* I/O PAD Configuration */
3591 else
3592 alc5505_coef_set(codec, 0x6220, 0x6002018f);
3593
3594 alc5505_coef_set(codec, 0x61ac, 0x055525f0); /**/
3595 alc5505_coef_set(codec, 0x61c0, 0x12230080); /* Clock control */
3596 alc5505_coef_set(codec, 0x61b4, 0x040e2b02); /* PLL2 control */
3597 alc5505_coef_set(codec, 0x61bc, 0x010234f8); /* OSC Control */
3598 alc5505_coef_set(codec, 0x880c, 0x00000004); /* DRAM Function control */
3599 alc5505_coef_set(codec, 0x880c, 0x00000003);
3600 alc5505_coef_set(codec, 0x880c, 0x00000010);
Takashi Iwaicd63a5f2013-07-05 12:13:59 +02003601
3602#ifdef HALT_REALTEK_ALC5505
3603 alc5505_dsp_halt(codec);
3604#endif
Kailang Yangad60d502013-06-28 12:03:01 +02003605}
3606
Takashi Iwaicd63a5f2013-07-05 12:13:59 +02003607#ifdef HALT_REALTEK_ALC5505
Pierre-Louis Bossart8a718212020-01-11 15:47:35 -06003608#define alc5505_dsp_suspend(codec) do { } while (0) /* NOP */
3609#define alc5505_dsp_resume(codec) do { } while (0) /* NOP */
Takashi Iwaicd63a5f2013-07-05 12:13:59 +02003610#else
3611#define alc5505_dsp_suspend(codec) alc5505_dsp_halt(codec)
3612#define alc5505_dsp_resume(codec) alc5505_dsp_back_from_halt(codec)
3613#endif
3614
Takashi Iwai2a439522011-07-26 09:52:50 +02003615#ifdef CONFIG_PM
Kailang Yangad60d502013-06-28 12:03:01 +02003616static int alc269_suspend(struct hda_codec *codec)
3617{
3618 struct alc_spec *spec = codec->spec;
3619
3620 if (spec->has_alc5505_dsp)
Takashi Iwaicd63a5f2013-07-05 12:13:59 +02003621 alc5505_dsp_suspend(codec);
Kailang Yangad60d502013-06-28 12:03:01 +02003622 return alc_suspend(codec);
3623}
3624
Takashi Iwai1d045db2011-07-07 18:23:21 +02003625static int alc269_resume(struct hda_codec *codec)
3626{
Kailang Yangadcc70b2012-05-25 08:08:38 +02003627 struct alc_spec *spec = codec->spec;
3628
Kailang Yang1387e2d2012-11-08 10:23:18 +01003629 if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3630 alc269vb_toggle_power_output(codec, 0);
3631 if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
Kailang Yangadcc70b2012-05-25 08:08:38 +02003632 (alc_get_coef0(codec) & 0x00ff) == 0x018) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02003633 msleep(150);
3634 }
3635
3636 codec->patch_ops.init(codec);
3637
Kailang Yang1387e2d2012-11-08 10:23:18 +01003638 if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3639 alc269vb_toggle_power_output(codec, 1);
3640 if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
Kailang Yangadcc70b2012-05-25 08:08:38 +02003641 (alc_get_coef0(codec) & 0x00ff) == 0x017) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02003642 msleep(200);
3643 }
3644
Takashi Iwai1a462be2020-01-09 10:01:04 +01003645 snd_hda_regmap_sync(codec);
Takashi Iwai1d045db2011-07-07 18:23:21 +02003646 hda_call_check_power_status(codec, 0x01);
Hui Wangf4753712014-08-19 12:07:03 +08003647
3648 /* on some machine, the BIOS will clear the codec gpio data when enter
3649 * suspend, and won't restore the data after resume, so we restore it
3650 * in the driver.
3651 */
Takashi Iwaid261eec2018-06-19 22:32:29 +02003652 if (spec->gpio_data)
3653 alc_write_gpio_data(codec);
Hui Wangf4753712014-08-19 12:07:03 +08003654
Kailang Yangad60d502013-06-28 12:03:01 +02003655 if (spec->has_alc5505_dsp)
Takashi Iwaicd63a5f2013-07-05 12:13:59 +02003656 alc5505_dsp_resume(codec);
Kailang Yangc5177c82013-07-24 14:39:49 +02003657
Takashi Iwai1d045db2011-07-07 18:23:21 +02003658 return 0;
3659}
Takashi Iwai2a439522011-07-26 09:52:50 +02003660#endif /* CONFIG_PM */
Takashi Iwai1d045db2011-07-07 18:23:21 +02003661
David Henningsson108cc102012-07-20 10:37:25 +02003662static void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01003663 const struct hda_fixup *fix, int action)
David Henningsson108cc102012-07-20 10:37:25 +02003664{
3665 struct alc_spec *spec = codec->spec;
3666
Takashi Iwai1727a772013-01-10 09:52:52 +01003667 if (action == HDA_FIXUP_ACT_PRE_PROBE)
David Henningsson108cc102012-07-20 10:37:25 +02003668 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
3669}
3670
Jan-Marek Glogowskifdcc9682018-02-14 11:29:15 +01003671static void alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec *codec,
3672 const struct hda_fixup *fix,
3673 int action)
3674{
3675 unsigned int cfg_headphone = snd_hda_codec_get_pincfg(codec, 0x21);
3676 unsigned int cfg_headset_mic = snd_hda_codec_get_pincfg(codec, 0x19);
3677
3678 if (cfg_headphone && cfg_headset_mic == 0x411111f0)
3679 snd_hda_codec_set_pincfg(codec, 0x19,
3680 (cfg_headphone & ~AC_DEFCFG_DEVICE) |
3681 (AC_JACK_MIC_IN << AC_DEFCFG_DEVICE_SHIFT));
3682}
3683
Takashi Iwai1d045db2011-07-07 18:23:21 +02003684static void alc269_fixup_hweq(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01003685 const struct hda_fixup *fix, int action)
Takashi Iwai1d045db2011-07-07 18:23:21 +02003686{
Takashi Iwai98b24882014-08-18 13:47:50 +02003687 if (action == HDA_FIXUP_ACT_INIT)
3688 alc_update_coef_idx(codec, 0x1e, 0, 0x80);
Takashi Iwai1d045db2011-07-07 18:23:21 +02003689}
3690
David Henningsson7c478f02013-10-11 10:18:46 +02003691static void alc269_fixup_headset_mic(struct hda_codec *codec,
3692 const struct hda_fixup *fix, int action)
3693{
3694 struct alc_spec *spec = codec->spec;
3695
3696 if (action == HDA_FIXUP_ACT_PRE_PROBE)
3697 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
3698}
3699
Takashi Iwai1d045db2011-07-07 18:23:21 +02003700static void alc271_fixup_dmic(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01003701 const struct hda_fixup *fix, int action)
Takashi Iwai1d045db2011-07-07 18:23:21 +02003702{
3703 static const struct hda_verb verbs[] = {
3704 {0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
3705 {0x20, AC_VERB_SET_PROC_COEF, 0x4000},
3706 {}
3707 };
3708 unsigned int cfg;
3709
Takashi Iwai7639a062015-03-03 10:07:24 +01003710 if (strcmp(codec->core.chip_name, "ALC271X") &&
3711 strcmp(codec->core.chip_name, "ALC269VB"))
Takashi Iwai1d045db2011-07-07 18:23:21 +02003712 return;
3713 cfg = snd_hda_codec_get_pincfg(codec, 0x12);
3714 if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED)
3715 snd_hda_sequence_write(codec, verbs);
3716}
3717
Takashi Iwai017f2a12011-07-09 14:42:25 +02003718static void alc269_fixup_pcm_44k(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01003719 const struct hda_fixup *fix, int action)
Takashi Iwai017f2a12011-07-09 14:42:25 +02003720{
3721 struct alc_spec *spec = codec->spec;
3722
Takashi Iwai1727a772013-01-10 09:52:52 +01003723 if (action != HDA_FIXUP_ACT_PROBE)
Takashi Iwai017f2a12011-07-09 14:42:25 +02003724 return;
3725
3726 /* Due to a hardware problem on Lenovo Ideadpad, we need to
3727 * fix the sample rate of analog I/O to 44.1kHz
3728 */
Takashi Iwai08c189f2012-12-19 15:22:24 +01003729 spec->gen.stream_analog_playback = &alc269_44k_pcm_analog_playback;
3730 spec->gen.stream_analog_capture = &alc269_44k_pcm_analog_capture;
Takashi Iwai017f2a12011-07-09 14:42:25 +02003731}
3732
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02003733static void alc269_fixup_stereo_dmic(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01003734 const struct hda_fixup *fix, int action)
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02003735{
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02003736 /* The digital-mic unit sends PDM (differential signal) instead of
3737 * the standard PCM, thus you can't record a valid mono stream as is.
3738 * Below is a workaround specific to ALC269 to control the dmic
3739 * signal source as mono.
3740 */
Takashi Iwai98b24882014-08-18 13:47:50 +02003741 if (action == HDA_FIXUP_ACT_INIT)
3742 alc_update_coef_idx(codec, 0x07, 0, 0x80);
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02003743}
3744
Takashi Iwai24519912011-08-16 15:08:49 +02003745static void alc269_quanta_automute(struct hda_codec *codec)
3746{
Takashi Iwai08c189f2012-12-19 15:22:24 +01003747 snd_hda_gen_update_outputs(codec);
Takashi Iwai24519912011-08-16 15:08:49 +02003748
Takashi Iwai1687ccc2014-08-18 13:49:35 +02003749 alc_write_coef_idx(codec, 0x0c, 0x680);
3750 alc_write_coef_idx(codec, 0x0c, 0x480);
Takashi Iwai24519912011-08-16 15:08:49 +02003751}
3752
3753static void alc269_fixup_quanta_mute(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01003754 const struct hda_fixup *fix, int action)
Takashi Iwai24519912011-08-16 15:08:49 +02003755{
3756 struct alc_spec *spec = codec->spec;
Takashi Iwai1727a772013-01-10 09:52:52 +01003757 if (action != HDA_FIXUP_ACT_PROBE)
Takashi Iwai24519912011-08-16 15:08:49 +02003758 return;
Takashi Iwai08c189f2012-12-19 15:22:24 +01003759 spec->gen.automute_hook = alc269_quanta_automute;
Takashi Iwai24519912011-08-16 15:08:49 +02003760}
3761
David Henningssond240d1d2013-04-15 12:50:02 +02003762static void alc269_x101_hp_automute_hook(struct hda_codec *codec,
Takashi Iwai1a4f69d2014-09-11 15:22:46 +02003763 struct hda_jack_callback *jack)
David Henningssond240d1d2013-04-15 12:50:02 +02003764{
3765 struct alc_spec *spec = codec->spec;
3766 int vref;
3767 msleep(200);
3768 snd_hda_gen_hp_automute(codec, jack);
3769
3770 vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
3771 msleep(100);
3772 snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
3773 vref);
3774 msleep(500);
3775 snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
3776 vref);
3777}
3778
Tomas Espeletaa2ef03f2019-08-09 16:37:54 +02003779/*
3780 * Magic sequence to make Huawei Matebook X right speaker working (bko#197801)
3781 */
3782struct hda_alc298_mbxinit {
3783 unsigned char value_0x23;
3784 unsigned char value_0x25;
3785};
3786
3787static void alc298_huawei_mbx_stereo_seq(struct hda_codec *codec,
3788 const struct hda_alc298_mbxinit *initval,
3789 bool first)
3790{
3791 snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x0);
3792 alc_write_coef_idx(codec, 0x26, 0xb000);
3793
3794 if (first)
3795 snd_hda_codec_write(codec, 0x21, 0, AC_VERB_GET_PIN_SENSE, 0x0);
3796
3797 snd_hda_codec_write(codec, 0x6, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
3798 alc_write_coef_idx(codec, 0x26, 0xf000);
3799 alc_write_coef_idx(codec, 0x23, initval->value_0x23);
3800
3801 if (initval->value_0x23 != 0x1e)
3802 alc_write_coef_idx(codec, 0x25, initval->value_0x25);
3803
3804 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
3805 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
3806}
3807
3808static void alc298_fixup_huawei_mbx_stereo(struct hda_codec *codec,
3809 const struct hda_fixup *fix,
3810 int action)
3811{
3812 /* Initialization magic */
3813 static const struct hda_alc298_mbxinit dac_init[] = {
3814 {0x0c, 0x00}, {0x0d, 0x00}, {0x0e, 0x00}, {0x0f, 0x00},
3815 {0x10, 0x00}, {0x1a, 0x40}, {0x1b, 0x82}, {0x1c, 0x00},
3816 {0x1d, 0x00}, {0x1e, 0x00}, {0x1f, 0x00},
3817 {0x20, 0xc2}, {0x21, 0xc8}, {0x22, 0x26}, {0x23, 0x24},
3818 {0x27, 0xff}, {0x28, 0xff}, {0x29, 0xff}, {0x2a, 0x8f},
3819 {0x2b, 0x02}, {0x2c, 0x48}, {0x2d, 0x34}, {0x2e, 0x00},
3820 {0x2f, 0x00},
3821 {0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00},
3822 {0x34, 0x00}, {0x35, 0x01}, {0x36, 0x93}, {0x37, 0x0c},
3823 {0x38, 0x00}, {0x39, 0x00}, {0x3a, 0xf8}, {0x38, 0x80},
3824 {}
3825 };
3826 const struct hda_alc298_mbxinit *seq;
3827
3828 if (action != HDA_FIXUP_ACT_INIT)
3829 return;
3830
3831 /* Start */
3832 snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x00);
3833 snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
3834 alc_write_coef_idx(codec, 0x26, 0xf000);
3835 alc_write_coef_idx(codec, 0x22, 0x31);
3836 alc_write_coef_idx(codec, 0x23, 0x0b);
3837 alc_write_coef_idx(codec, 0x25, 0x00);
3838 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
3839 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
3840
3841 for (seq = dac_init; seq->value_0x23; seq++)
3842 alc298_huawei_mbx_stereo_seq(codec, seq, seq == dac_init);
3843}
3844
David Henningssond240d1d2013-04-15 12:50:02 +02003845static void alc269_fixup_x101_headset_mic(struct hda_codec *codec,
3846 const struct hda_fixup *fix, int action)
3847{
3848 struct alc_spec *spec = codec->spec;
3849 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3850 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
3851 spec->gen.hp_automute_hook = alc269_x101_hp_automute_hook;
3852 }
3853}
3854
3855
Takashi Iwai08fb0d02013-01-10 17:33:58 +01003856/* update mute-LED according to the speaker mute state via mic VREF pin */
3857static void alc269_fixup_mic_mute_hook(void *private_data, int enabled)
David Henningsson6d3cd5d2013-01-07 12:03:47 +01003858{
3859 struct hda_codec *codec = private_data;
Takashi Iwai08fb0d02013-01-10 17:33:58 +01003860 struct alc_spec *spec = codec->spec;
3861 unsigned int pinval;
3862
3863 if (spec->mute_led_polarity)
3864 enabled = !enabled;
Takashi Iwai415d5552014-04-03 11:51:21 +02003865 pinval = snd_hda_codec_get_pin_target(codec, spec->mute_led_nid);
3866 pinval &= ~AC_PINCTL_VREFEN;
3867 pinval |= enabled ? AC_PINCTL_VREF_HIZ : AC_PINCTL_VREF_80;
Takashi Iwaie40bdb02018-03-17 22:40:18 +01003868 if (spec->mute_led_nid) {
3869 /* temporarily power up/down for setting VREF */
3870 snd_hda_power_up_pm(codec);
Takashi Iwai08fb0d02013-01-10 17:33:58 +01003871 snd_hda_set_pin_ctl_cache(codec, spec->mute_led_nid, pinval);
Takashi Iwaie40bdb02018-03-17 22:40:18 +01003872 snd_hda_power_down_pm(codec);
3873 }
David Henningsson6d3cd5d2013-01-07 12:03:47 +01003874}
3875
David Henningssond5b6b652013-11-06 10:50:44 +01003876/* Make sure the led works even in runtime suspend */
3877static unsigned int led_power_filter(struct hda_codec *codec,
3878 hda_nid_t nid,
3879 unsigned int power_state)
3880{
3881 struct alc_spec *spec = codec->spec;
3882
Hui Wang50dd9052014-07-08 17:56:15 +08003883 if (power_state != AC_PWRST_D3 || nid == 0 ||
3884 (nid != spec->mute_led_nid && nid != spec->cap_mute_led_nid))
David Henningssond5b6b652013-11-06 10:50:44 +01003885 return power_state;
3886
3887 /* Set pin ctl again, it might have just been set to 0 */
3888 snd_hda_set_pin_ctl(codec, nid,
3889 snd_hda_codec_get_pin_target(codec, nid));
3890
Takashi Iwaicffd3962015-04-09 10:30:25 +02003891 return snd_hda_gen_path_power_filter(codec, nid, power_state);
David Henningssond5b6b652013-11-06 10:50:44 +01003892}
3893
Takashi Iwai08fb0d02013-01-10 17:33:58 +01003894static void alc269_fixup_hp_mute_led(struct hda_codec *codec,
3895 const struct hda_fixup *fix, int action)
David Henningsson6d3cd5d2013-01-07 12:03:47 +01003896{
3897 struct alc_spec *spec = codec->spec;
Takashi Iwai08fb0d02013-01-10 17:33:58 +01003898 const struct dmi_device *dev = NULL;
3899
3900 if (action != HDA_FIXUP_ACT_PRE_PROBE)
3901 return;
3902
3903 while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) {
3904 int pol, pin;
3905 if (sscanf(dev->name, "HP_Mute_LED_%d_%x", &pol, &pin) != 2)
3906 continue;
3907 if (pin < 0x0a || pin >= 0x10)
3908 break;
3909 spec->mute_led_polarity = pol;
3910 spec->mute_led_nid = pin - 0x0a + 0x18;
3911 spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook;
Takashi Iwaifd25a972012-12-20 14:57:18 +01003912 spec->gen.vmaster_mute_enum = 1;
David Henningssond5b6b652013-11-06 10:50:44 +01003913 codec->power_filter = led_power_filter;
Takashi Iwai4e76a882014-02-25 12:21:03 +01003914 codec_dbg(codec,
3915 "Detected mute LED for %x:%d\n", spec->mute_led_nid,
Takashi Iwai08fb0d02013-01-10 17:33:58 +01003916 spec->mute_led_polarity);
David Henningsson6d3cd5d2013-01-07 12:03:47 +01003917 break;
3918 }
3919}
3920
Takashi Iwai85c467d2018-05-29 11:38:38 +02003921static void alc269_fixup_hp_mute_led_micx(struct hda_codec *codec,
3922 const struct hda_fixup *fix,
3923 int action, hda_nid_t pin)
David Henningssond06ac142013-02-18 11:41:55 +01003924{
3925 struct alc_spec *spec = codec->spec;
Takashi Iwai85c467d2018-05-29 11:38:38 +02003926
David Henningssond06ac142013-02-18 11:41:55 +01003927 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3928 spec->mute_led_polarity = 0;
Takashi Iwai85c467d2018-05-29 11:38:38 +02003929 spec->mute_led_nid = pin;
David Henningssond06ac142013-02-18 11:41:55 +01003930 spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook;
3931 spec->gen.vmaster_mute_enum = 1;
David Henningssond5b6b652013-11-06 10:50:44 +01003932 codec->power_filter = led_power_filter;
David Henningssond06ac142013-02-18 11:41:55 +01003933 }
3934}
3935
Takashi Iwai85c467d2018-05-29 11:38:38 +02003936static void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec,
3937 const struct hda_fixup *fix, int action)
3938{
3939 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x18);
3940}
3941
Takashi Iwai08fb0d02013-01-10 17:33:58 +01003942static void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec,
3943 const struct hda_fixup *fix, int action)
Takashi Iwai420b0fe2012-03-12 12:35:27 +01003944{
Takashi Iwai85c467d2018-05-29 11:38:38 +02003945 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x19);
Takashi Iwai420b0fe2012-03-12 12:35:27 +01003946}
3947
Tom Briden7f783bd2017-03-25 10:12:01 +00003948static void alc269_fixup_hp_mute_led_mic3(struct hda_codec *codec,
3949 const struct hda_fixup *fix, int action)
3950{
Takashi Iwai85c467d2018-05-29 11:38:38 +02003951 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1b);
Tom Briden7f783bd2017-03-25 10:12:01 +00003952}
3953
Takashi Iwai0f32fd192014-11-19 12:16:14 +01003954/* update LED status via GPIO */
3955static void alc_update_gpio_led(struct hda_codec *codec, unsigned int mask,
3956 bool enabled)
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01003957{
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01003958 struct alc_spec *spec = codec->spec;
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01003959
Takashi Iwai0f32fd192014-11-19 12:16:14 +01003960 if (spec->mute_led_polarity)
3961 enabled = !enabled;
Takashi Iwaid261eec2018-06-19 22:32:29 +02003962 alc_update_gpio_data(codec, mask, !enabled); /* muted -> LED on */
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01003963}
3964
Takashi Iwai0f32fd192014-11-19 12:16:14 +01003965/* turn on/off mute LED via GPIO per vmaster hook */
3966static void alc_fixup_gpio_mute_hook(void *private_data, int enabled)
3967{
3968 struct hda_codec *codec = private_data;
3969 struct alc_spec *spec = codec->spec;
3970
3971 alc_update_gpio_led(codec, spec->gpio_mute_led_mask, enabled);
3972}
3973
3974/* turn on/off mic-mute LED via GPIO per capture hook */
Takashi Iwaid03abec2018-06-19 12:29:13 +02003975static void alc_gpio_micmute_update(struct hda_codec *codec)
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01003976{
3977 struct alc_spec *spec = codec->spec;
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01003978
Takashi Iwaid03abec2018-06-19 12:29:13 +02003979 alc_update_gpio_led(codec, spec->gpio_mic_led_mask,
3980 spec->gen.micmute_led.led_value);
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01003981}
3982
Takashi Iwai01e4a272018-06-19 22:47:30 +02003983/* setup mute and mic-mute GPIO bits, add hooks appropriately */
3984static void alc_fixup_hp_gpio_led(struct hda_codec *codec,
3985 int action,
3986 unsigned int mute_mask,
3987 unsigned int micmute_mask)
3988{
3989 struct alc_spec *spec = codec->spec;
3990
3991 alc_fixup_gpio(codec, action, mute_mask | micmute_mask);
3992
3993 if (action != HDA_FIXUP_ACT_PRE_PROBE)
3994 return;
3995 if (mute_mask) {
3996 spec->gpio_mute_led_mask = mute_mask;
3997 spec->gen.vmaster_mute.hook = alc_fixup_gpio_mute_hook;
3998 }
3999 if (micmute_mask) {
4000 spec->gpio_mic_led_mask = micmute_mask;
4001 snd_hda_gen_add_micmute_led(codec, alc_gpio_micmute_update);
4002 }
4003}
4004
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01004005static void alc269_fixup_hp_gpio_led(struct hda_codec *codec,
4006 const struct hda_fixup *fix, int action)
4007{
Takashi Iwai01e4a272018-06-19 22:47:30 +02004008 alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01004009}
4010
Kai-Heng Fengf5a88b02020-03-27 12:46:25 +08004011static void alc285_fixup_hp_gpio_led(struct hda_codec *codec,
4012 const struct hda_fixup *fix, int action)
4013{
4014 alc_fixup_hp_gpio_led(codec, action, 0x04, 0x00);
4015}
4016
Kailang Yangeaa8e5e2014-11-21 15:49:11 +08004017static void alc286_fixup_hp_gpio_led(struct hda_codec *codec,
4018 const struct hda_fixup *fix, int action)
4019{
Takashi Iwai01e4a272018-06-19 22:47:30 +02004020 alc_fixup_hp_gpio_led(codec, action, 0x02, 0x20);
Takashi Iwai1d045db2011-07-07 18:23:21 +02004021}
4022
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004023/* turn on/off mic-mute LED per capture hook */
Takashi Iwaid03abec2018-06-19 12:29:13 +02004024static void alc_cap_micmute_update(struct hda_codec *codec)
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004025{
4026 struct alc_spec *spec = codec->spec;
Takashi Iwaid03abec2018-06-19 12:29:13 +02004027 unsigned int pinval;
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004028
Takashi Iwaid03abec2018-06-19 12:29:13 +02004029 if (!spec->cap_mute_led_nid)
4030 return;
Hui Wangfc1fad92014-07-08 17:56:14 +08004031 pinval = snd_hda_codec_get_pin_target(codec, spec->cap_mute_led_nid);
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004032 pinval &= ~AC_PINCTL_VREFEN;
Takashi Iwaid03abec2018-06-19 12:29:13 +02004033 if (spec->gen.micmute_led.led_value)
4034 pinval |= AC_PINCTL_VREF_80;
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004035 else
Takashi Iwaid03abec2018-06-19 12:29:13 +02004036 pinval |= AC_PINCTL_VREF_HIZ;
4037 snd_hda_set_pin_ctl_cache(codec, spec->cap_mute_led_nid, pinval);
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004038}
4039
4040static void alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec,
4041 const struct hda_fixup *fix, int action)
4042{
4043 struct alc_spec *spec = codec->spec;
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004044
Takashi Iwai01e4a272018-06-19 22:47:30 +02004045 alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004046 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai01e4a272018-06-19 22:47:30 +02004047 /* Like hp_gpio_mic1_led, but also needs GPIO4 low to
4048 * enable headphone amp
4049 */
4050 spec->gpio_mask |= 0x10;
4051 spec->gpio_dir |= 0x10;
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004052 spec->cap_mute_led_nid = 0x18;
Takashi Iwaid03abec2018-06-19 12:29:13 +02004053 snd_hda_gen_add_micmute_led(codec, alc_cap_micmute_update);
Hui Wang50dd9052014-07-08 17:56:15 +08004054 codec->power_filter = led_power_filter;
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004055 }
4056}
4057
David Henningsson7a5255f2014-10-30 08:26:01 +01004058static void alc280_fixup_hp_gpio4(struct hda_codec *codec,
4059 const struct hda_fixup *fix, int action)
4060{
David Henningsson7a5255f2014-10-30 08:26:01 +01004061 struct alc_spec *spec = codec->spec;
David Henningsson7a5255f2014-10-30 08:26:01 +01004062
Takashi Iwai01e4a272018-06-19 22:47:30 +02004063 alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
David Henningsson7a5255f2014-10-30 08:26:01 +01004064 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
David Henningsson7a5255f2014-10-30 08:26:01 +01004065 spec->cap_mute_led_nid = 0x18;
Takashi Iwaid03abec2018-06-19 12:29:13 +02004066 snd_hda_gen_add_micmute_led(codec, alc_cap_micmute_update);
David Henningsson7a5255f2014-10-30 08:26:01 +01004067 codec->power_filter = led_power_filter;
4068 }
4069}
4070
Takashi Iwai6a30aba2018-04-27 17:17:35 +02004071#if IS_REACHABLE(CONFIG_INPUT)
David Henningsson33f4acd2015-01-07 15:50:13 +01004072static void gpio2_mic_hotkey_event(struct hda_codec *codec,
4073 struct hda_jack_callback *event)
4074{
4075 struct alc_spec *spec = codec->spec;
4076
4077 /* GPIO2 just toggles on a keypress/keyrelease cycle. Therefore
4078 send both key on and key off event for every interrupt. */
Hui Wangc7b60a82015-12-28 11:35:25 +08004079 input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 1);
David Henningsson33f4acd2015-01-07 15:50:13 +01004080 input_sync(spec->kb_dev);
Hui Wangc7b60a82015-12-28 11:35:25 +08004081 input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 0);
David Henningsson33f4acd2015-01-07 15:50:13 +01004082 input_sync(spec->kb_dev);
4083}
David Henningsson33f4acd2015-01-07 15:50:13 +01004084
Kailang3694cb22015-12-28 11:35:24 +08004085static int alc_register_micmute_input_device(struct hda_codec *codec)
4086{
4087 struct alc_spec *spec = codec->spec;
Hui Wangc7b60a82015-12-28 11:35:25 +08004088 int i;
Kailang3694cb22015-12-28 11:35:24 +08004089
4090 spec->kb_dev = input_allocate_device();
4091 if (!spec->kb_dev) {
4092 codec_err(codec, "Out of memory (input_allocate_device)\n");
4093 return -ENOMEM;
4094 }
Hui Wangc7b60a82015-12-28 11:35:25 +08004095
4096 spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX] = KEY_MICMUTE;
4097
Kailang3694cb22015-12-28 11:35:24 +08004098 spec->kb_dev->name = "Microphone Mute Button";
4099 spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY);
Hui Wangc7b60a82015-12-28 11:35:25 +08004100 spec->kb_dev->keycodesize = sizeof(spec->alc_mute_keycode_map[0]);
4101 spec->kb_dev->keycodemax = ARRAY_SIZE(spec->alc_mute_keycode_map);
4102 spec->kb_dev->keycode = spec->alc_mute_keycode_map;
4103 for (i = 0; i < ARRAY_SIZE(spec->alc_mute_keycode_map); i++)
4104 set_bit(spec->alc_mute_keycode_map[i], spec->kb_dev->keybit);
Kailang3694cb22015-12-28 11:35:24 +08004105
4106 if (input_register_device(spec->kb_dev)) {
4107 codec_err(codec, "input_register_device failed\n");
4108 input_free_device(spec->kb_dev);
4109 spec->kb_dev = NULL;
4110 return -ENOMEM;
4111 }
4112
4113 return 0;
4114}
4115
Takashi Iwai01e4a272018-06-19 22:47:30 +02004116/* GPIO1 = set according to SKU external amp
4117 * GPIO2 = mic mute hotkey
4118 * GPIO3 = mute LED
4119 * GPIO4 = mic mute LED
4120 */
David Henningsson33f4acd2015-01-07 15:50:13 +01004121static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec,
4122 const struct hda_fixup *fix, int action)
4123{
David Henningsson33f4acd2015-01-07 15:50:13 +01004124 struct alc_spec *spec = codec->spec;
4125
Takashi Iwai01e4a272018-06-19 22:47:30 +02004126 alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
David Henningsson33f4acd2015-01-07 15:50:13 +01004127 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai1c76aa52018-06-21 16:37:54 +02004128 spec->init_amp = ALC_INIT_DEFAULT;
Kailang3694cb22015-12-28 11:35:24 +08004129 if (alc_register_micmute_input_device(codec) != 0)
David Henningsson33f4acd2015-01-07 15:50:13 +01004130 return;
David Henningsson33f4acd2015-01-07 15:50:13 +01004131
Takashi Iwai01e4a272018-06-19 22:47:30 +02004132 spec->gpio_mask |= 0x06;
4133 spec->gpio_dir |= 0x02;
4134 spec->gpio_data |= 0x02;
Takashi Iwai7639a062015-03-03 10:07:24 +01004135 snd_hda_codec_write_cache(codec, codec->core.afg, 0,
David Henningsson33f4acd2015-01-07 15:50:13 +01004136 AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x04);
Takashi Iwai7639a062015-03-03 10:07:24 +01004137 snd_hda_jack_detect_enable_callback(codec, codec->core.afg,
David Henningsson33f4acd2015-01-07 15:50:13 +01004138 gpio2_mic_hotkey_event);
David Henningsson33f4acd2015-01-07 15:50:13 +01004139 return;
4140 }
4141
4142 if (!spec->kb_dev)
4143 return;
4144
4145 switch (action) {
David Henningsson33f4acd2015-01-07 15:50:13 +01004146 case HDA_FIXUP_ACT_FREE:
4147 input_unregister_device(spec->kb_dev);
David Henningsson33f4acd2015-01-07 15:50:13 +01004148 spec->kb_dev = NULL;
4149 }
David Henningsson33f4acd2015-01-07 15:50:13 +01004150}
4151
Takashi Iwai01e4a272018-06-19 22:47:30 +02004152/* Line2 = mic mute hotkey
4153 * GPIO2 = mic mute LED
4154 */
Kailang3694cb22015-12-28 11:35:24 +08004155static void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec,
4156 const struct hda_fixup *fix, int action)
4157{
Kailang3694cb22015-12-28 11:35:24 +08004158 struct alc_spec *spec = codec->spec;
4159
Takashi Iwai01e4a272018-06-19 22:47:30 +02004160 alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
Kailang3694cb22015-12-28 11:35:24 +08004161 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai1c76aa52018-06-21 16:37:54 +02004162 spec->init_amp = ALC_INIT_DEFAULT;
Kailang3694cb22015-12-28 11:35:24 +08004163 if (alc_register_micmute_input_device(codec) != 0)
4164 return;
4165
Kailang3694cb22015-12-28 11:35:24 +08004166 snd_hda_jack_detect_enable_callback(codec, 0x1b,
4167 gpio2_mic_hotkey_event);
Kailang3694cb22015-12-28 11:35:24 +08004168 return;
4169 }
4170
4171 if (!spec->kb_dev)
4172 return;
4173
4174 switch (action) {
Kailang3694cb22015-12-28 11:35:24 +08004175 case HDA_FIXUP_ACT_FREE:
4176 input_unregister_device(spec->kb_dev);
4177 spec->kb_dev = NULL;
4178 }
4179}
Takashi Iwaic4696522018-01-15 10:44:35 +01004180#else /* INPUT */
4181#define alc280_fixup_hp_gpio2_mic_hotkey NULL
4182#define alc233_fixup_lenovo_line2_mic_hotkey NULL
4183#endif /* INPUT */
Kailang3694cb22015-12-28 11:35:24 +08004184
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004185static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec,
4186 const struct hda_fixup *fix, int action)
4187{
4188 struct alc_spec *spec = codec->spec;
4189
Takashi Iwai1bce62a2018-06-19 23:15:59 +02004190 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1a);
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004191 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004192 spec->cap_mute_led_nid = 0x18;
Takashi Iwaid03abec2018-06-19 12:29:13 +02004193 snd_hda_gen_add_micmute_led(codec, alc_cap_micmute_update);
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004194 }
4195}
4196
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004197static const struct coef_fw alc225_pre_hsmode[] = {
Kailang Yang5a367672017-07-21 15:23:53 +08004198 UPDATE_COEF(0x4a, 1<<8, 0),
4199 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0),
4200 UPDATE_COEF(0x63, 3<<14, 3<<14),
4201 UPDATE_COEF(0x4a, 3<<4, 2<<4),
4202 UPDATE_COEF(0x4a, 3<<10, 3<<10),
4203 UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10),
4204 UPDATE_COEF(0x4a, 3<<10, 0),
4205 {}
4206};
4207
David Henningsson73bdd592013-04-15 15:44:14 +02004208static void alc_headset_mode_unplugged(struct hda_codec *codec)
4209{
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004210 static const struct coef_fw coef0255[] = {
Kailang Yang717f43d2019-05-31 17:16:53 +08004211 WRITE_COEF(0x1b, 0x0c0b), /* LDO and MISC control */
Takashi Iwai54db6c32014-08-18 15:11:19 +02004212 WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
4213 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
4214 WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
4215 WRITE_COEFEX(0x57, 0x03, 0x8aa6), /* Direct Drive HP Amp control */
4216 {}
4217 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004218 static const struct coef_fw coef0256[] = {
Kailang Yange69e7e02016-05-30 15:58:28 +08004219 WRITE_COEF(0x1b, 0x0c4b), /* LDO and MISC control */
Kailang Yang717f43d2019-05-31 17:16:53 +08004220 WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
4221 WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
4222 WRITE_COEFEX(0x57, 0x03, 0x09a3), /* Direct Drive HP Amp control */
4223 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
Kailang Yange69e7e02016-05-30 15:58:28 +08004224 {}
4225 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004226 static const struct coef_fw coef0233[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004227 WRITE_COEF(0x1b, 0x0c0b),
4228 WRITE_COEF(0x45, 0xc429),
4229 UPDATE_COEF(0x35, 0x4000, 0),
4230 WRITE_COEF(0x06, 0x2104),
4231 WRITE_COEF(0x1a, 0x0001),
4232 WRITE_COEF(0x26, 0x0004),
4233 WRITE_COEF(0x32, 0x42a3),
4234 {}
4235 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004236 static const struct coef_fw coef0288[] = {
Kailang Yangf3b70332015-04-08 15:01:17 +08004237 UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
4238 UPDATE_COEF(0x50, 0x2000, 0x2000),
4239 UPDATE_COEF(0x56, 0x0006, 0x0006),
4240 UPDATE_COEF(0x66, 0x0008, 0),
4241 UPDATE_COEF(0x67, 0x2000, 0),
4242 {}
4243 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004244 static const struct coef_fw coef0298[] = {
Kailang Yang89542932017-07-17 15:03:43 +08004245 UPDATE_COEF(0x19, 0x1300, 0x0300),
4246 {}
4247 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004248 static const struct coef_fw coef0292[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004249 WRITE_COEF(0x76, 0x000e),
4250 WRITE_COEF(0x6c, 0x2400),
4251 WRITE_COEF(0x18, 0x7308),
4252 WRITE_COEF(0x6b, 0xc429),
4253 {}
4254 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004255 static const struct coef_fw coef0293[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004256 UPDATE_COEF(0x10, 7<<8, 6<<8), /* SET Line1 JD to 0 */
4257 UPDATE_COEFEX(0x57, 0x05, 1<<15|1<<13, 0x0), /* SET charge pump by verb */
4258 UPDATE_COEFEX(0x57, 0x03, 1<<10, 1<<10), /* SET EN_OSW to 1 */
4259 UPDATE_COEF(0x1a, 1<<3, 1<<3), /* Combo JD gating with LINE1-VREFO */
4260 WRITE_COEF(0x45, 0xc429), /* Set to TRS type */
4261 UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
4262 {}
4263 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004264 static const struct coef_fw coef0668[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004265 WRITE_COEF(0x15, 0x0d40),
4266 WRITE_COEF(0xb7, 0x802b),
4267 {}
4268 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004269 static const struct coef_fw coef0225[] = {
Kailang Yang5a367672017-07-21 15:23:53 +08004270 UPDATE_COEF(0x63, 3<<14, 0),
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004271 {}
4272 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004273 static const struct coef_fw coef0274[] = {
Kailang Yang71683c32017-06-20 16:33:50 +08004274 UPDATE_COEF(0x4a, 0x0100, 0),
4275 UPDATE_COEFEX(0x57, 0x05, 0x4000, 0),
4276 UPDATE_COEF(0x6b, 0xf000, 0x5000),
4277 UPDATE_COEF(0x4a, 0x0010, 0),
4278 UPDATE_COEF(0x4a, 0x0c00, 0x0c00),
4279 WRITE_COEF(0x45, 0x5289),
4280 UPDATE_COEF(0x4a, 0x0c00, 0),
4281 {}
4282 };
Takashi Iwai54db6c32014-08-18 15:11:19 +02004283
Takashi Iwai7639a062015-03-03 10:07:24 +01004284 switch (codec->core.vendor_id) {
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004285 case 0x10ec0255:
Kailang Yange69e7e02016-05-30 15:58:28 +08004286 alc_process_coef_fw(codec, coef0255);
4287 break;
Kailang Yang736f20a2017-10-20 15:06:34 +08004288 case 0x10ec0236:
Kailang Yang7081adf2015-03-30 17:05:37 +08004289 case 0x10ec0256:
Kailang Yange69e7e02016-05-30 15:58:28 +08004290 alc_process_coef_fw(codec, coef0256);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004291 break;
Kailang Yang71683c32017-06-20 16:33:50 +08004292 case 0x10ec0234:
4293 case 0x10ec0274:
4294 case 0x10ec0294:
4295 alc_process_coef_fw(codec, coef0274);
4296 break;
Kailang Yang13fd08a2014-05-21 16:49:48 +08004297 case 0x10ec0233:
David Henningsson73bdd592013-04-15 15:44:14 +02004298 case 0x10ec0283:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004299 alc_process_coef_fw(codec, coef0233);
David Henningsson73bdd592013-04-15 15:44:14 +02004300 break;
Kailang Yangf3b70332015-04-08 15:01:17 +08004301 case 0x10ec0286:
4302 case 0x10ec0288:
Kailang Yang89542932017-07-17 15:03:43 +08004303 alc_process_coef_fw(codec, coef0288);
4304 break;
Kailang Yang1a5bc8d2015-05-12 17:11:10 +08004305 case 0x10ec0298:
Kailang Yang89542932017-07-17 15:03:43 +08004306 alc_process_coef_fw(codec, coef0298);
Kailang Yangf3b70332015-04-08 15:01:17 +08004307 alc_process_coef_fw(codec, coef0288);
4308 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004309 case 0x10ec0292:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004310 alc_process_coef_fw(codec, coef0292);
David Henningsson73bdd592013-04-15 15:44:14 +02004311 break;
Kailang Yanga22aa262014-04-23 17:34:28 +08004312 case 0x10ec0293:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004313 alc_process_coef_fw(codec, coef0293);
Kailang Yanga22aa262014-04-23 17:34:28 +08004314 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004315 case 0x10ec0668:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004316 alc_process_coef_fw(codec, coef0668);
David Henningsson73bdd592013-04-15 15:44:14 +02004317 break;
Kailang Yangc2b691e2018-01-17 15:22:55 +08004318 case 0x10ec0215:
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004319 case 0x10ec0225:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004320 case 0x10ec0285:
Kailang Yang7d727862016-05-24 16:46:07 +08004321 case 0x10ec0295:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004322 case 0x10ec0289:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08004323 case 0x10ec0299:
Kailang Yang4d4b0c52019-01-09 16:23:37 +08004324 alc_process_coef_fw(codec, alc225_pre_hsmode);
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004325 alc_process_coef_fw(codec, coef0225);
4326 break;
Kailang Yang78f4f7c2016-06-07 11:31:34 +08004327 case 0x10ec0867:
4328 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
4329 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004330 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01004331 codec_dbg(codec, "Headset jack set to unplugged mode.\n");
David Henningsson73bdd592013-04-15 15:44:14 +02004332}
4333
4334
4335static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
4336 hda_nid_t mic_pin)
4337{
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004338 static const struct coef_fw coef0255[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004339 WRITE_COEFEX(0x57, 0x03, 0x8aa6),
4340 WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
4341 {}
4342 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004343 static const struct coef_fw coef0256[] = {
Kailang Yang717f43d2019-05-31 17:16:53 +08004344 UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14), /* Direct Drive HP Amp control(Set to verb control)*/
4345 WRITE_COEFEX(0x57, 0x03, 0x09a3),
4346 WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
4347 {}
4348 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004349 static const struct coef_fw coef0233[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004350 UPDATE_COEF(0x35, 0, 1<<14),
4351 WRITE_COEF(0x06, 0x2100),
4352 WRITE_COEF(0x1a, 0x0021),
4353 WRITE_COEF(0x26, 0x008c),
4354 {}
4355 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004356 static const struct coef_fw coef0288[] = {
Kailang Yang89542932017-07-17 15:03:43 +08004357 UPDATE_COEF(0x4f, 0x00c0, 0),
Kailang Yangf3b70332015-04-08 15:01:17 +08004358 UPDATE_COEF(0x50, 0x2000, 0),
4359 UPDATE_COEF(0x56, 0x0006, 0),
4360 UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
4361 UPDATE_COEF(0x66, 0x0008, 0x0008),
4362 UPDATE_COEF(0x67, 0x2000, 0x2000),
4363 {}
4364 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004365 static const struct coef_fw coef0292[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004366 WRITE_COEF(0x19, 0xa208),
4367 WRITE_COEF(0x2e, 0xacf0),
4368 {}
4369 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004370 static const struct coef_fw coef0293[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004371 UPDATE_COEFEX(0x57, 0x05, 0, 1<<15|1<<13), /* SET charge pump by verb */
4372 UPDATE_COEFEX(0x57, 0x03, 1<<10, 0), /* SET EN_OSW to 0 */
4373 UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
4374 {}
4375 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004376 static const struct coef_fw coef0688[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004377 WRITE_COEF(0xb7, 0x802b),
4378 WRITE_COEF(0xb5, 0x1040),
4379 UPDATE_COEF(0xc3, 0, 1<<12),
4380 {}
4381 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004382 static const struct coef_fw coef0225[] = {
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004383 UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14),
4384 UPDATE_COEF(0x4a, 3<<4, 2<<4),
4385 UPDATE_COEF(0x63, 3<<14, 0),
4386 {}
4387 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004388 static const struct coef_fw coef0274[] = {
Kailang Yang71683c32017-06-20 16:33:50 +08004389 UPDATE_COEFEX(0x57, 0x05, 0x4000, 0x4000),
4390 UPDATE_COEF(0x4a, 0x0010, 0),
4391 UPDATE_COEF(0x6b, 0xf000, 0),
4392 {}
4393 };
Takashi Iwai54db6c32014-08-18 15:11:19 +02004394
Takashi Iwai7639a062015-03-03 10:07:24 +01004395 switch (codec->core.vendor_id) {
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004396 case 0x10ec0255:
4397 alc_write_coef_idx(codec, 0x45, 0xc489);
4398 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
Takashi Iwai54db6c32014-08-18 15:11:19 +02004399 alc_process_coef_fw(codec, coef0255);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004400 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4401 break;
Kailang Yang717f43d2019-05-31 17:16:53 +08004402 case 0x10ec0236:
4403 case 0x10ec0256:
4404 alc_write_coef_idx(codec, 0x45, 0xc489);
4405 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4406 alc_process_coef_fw(codec, coef0256);
4407 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4408 break;
Kailang Yang71683c32017-06-20 16:33:50 +08004409 case 0x10ec0234:
4410 case 0x10ec0274:
4411 case 0x10ec0294:
4412 alc_write_coef_idx(codec, 0x45, 0x4689);
4413 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4414 alc_process_coef_fw(codec, coef0274);
4415 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4416 break;
Kailang Yang13fd08a2014-05-21 16:49:48 +08004417 case 0x10ec0233:
David Henningsson73bdd592013-04-15 15:44:14 +02004418 case 0x10ec0283:
4419 alc_write_coef_idx(codec, 0x45, 0xc429);
4420 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
Takashi Iwai54db6c32014-08-18 15:11:19 +02004421 alc_process_coef_fw(codec, coef0233);
David Henningsson73bdd592013-04-15 15:44:14 +02004422 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4423 break;
Kailang Yangf3b70332015-04-08 15:01:17 +08004424 case 0x10ec0286:
4425 case 0x10ec0288:
Kailang Yang1a5bc8d2015-05-12 17:11:10 +08004426 case 0x10ec0298:
Kailang Yangf3b70332015-04-08 15:01:17 +08004427 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4428 alc_process_coef_fw(codec, coef0288);
4429 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4430 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004431 case 0x10ec0292:
4432 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
Takashi Iwai54db6c32014-08-18 15:11:19 +02004433 alc_process_coef_fw(codec, coef0292);
David Henningsson73bdd592013-04-15 15:44:14 +02004434 break;
Kailang Yanga22aa262014-04-23 17:34:28 +08004435 case 0x10ec0293:
4436 /* Set to TRS mode */
4437 alc_write_coef_idx(codec, 0x45, 0xc429);
4438 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
Takashi Iwai54db6c32014-08-18 15:11:19 +02004439 alc_process_coef_fw(codec, coef0293);
Kailang Yanga22aa262014-04-23 17:34:28 +08004440 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4441 break;
Kailang Yang78f4f7c2016-06-07 11:31:34 +08004442 case 0x10ec0867:
4443 alc_update_coefex_idx(codec, 0x57, 0x5, 0, 1<<14);
4444 /* fallthru */
Kailang Yang9eb5d0e2017-01-17 15:40:25 +08004445 case 0x10ec0221:
David Henningsson1f8b46c2015-05-12 14:38:15 +02004446 case 0x10ec0662:
4447 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4448 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4449 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004450 case 0x10ec0668:
4451 alc_write_coef_idx(codec, 0x11, 0x0001);
4452 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
Takashi Iwai54db6c32014-08-18 15:11:19 +02004453 alc_process_coef_fw(codec, coef0688);
David Henningsson73bdd592013-04-15 15:44:14 +02004454 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4455 break;
Kailang Yangc2b691e2018-01-17 15:22:55 +08004456 case 0x10ec0215:
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004457 case 0x10ec0225:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004458 case 0x10ec0285:
Kailang Yang7d727862016-05-24 16:46:07 +08004459 case 0x10ec0295:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004460 case 0x10ec0289:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08004461 case 0x10ec0299:
Kailang Yang5a367672017-07-21 15:23:53 +08004462 alc_process_coef_fw(codec, alc225_pre_hsmode);
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004463 alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x31<<10);
4464 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4465 alc_process_coef_fw(codec, coef0225);
4466 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4467 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004468 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01004469 codec_dbg(codec, "Headset jack set to mic-in mode.\n");
David Henningsson73bdd592013-04-15 15:44:14 +02004470}
4471
4472static void alc_headset_mode_default(struct hda_codec *codec)
4473{
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004474 static const struct coef_fw coef0225[] = {
Kailang Yang5a367672017-07-21 15:23:53 +08004475 UPDATE_COEF(0x45, 0x3f<<10, 0x30<<10),
4476 UPDATE_COEF(0x45, 0x3f<<10, 0x31<<10),
4477 UPDATE_COEF(0x49, 3<<8, 0<<8),
4478 UPDATE_COEF(0x4a, 3<<4, 3<<4),
4479 UPDATE_COEF(0x63, 3<<14, 0),
4480 UPDATE_COEF(0x67, 0xf000, 0x3000),
David Henningsson2ae95572016-02-25 09:37:05 +01004481 {}
4482 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004483 static const struct coef_fw coef0255[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004484 WRITE_COEF(0x45, 0xc089),
4485 WRITE_COEF(0x45, 0xc489),
4486 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
4487 WRITE_COEF(0x49, 0x0049),
4488 {}
4489 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004490 static const struct coef_fw coef0256[] = {
Kailang Yang717f43d2019-05-31 17:16:53 +08004491 WRITE_COEF(0x45, 0xc489),
4492 WRITE_COEFEX(0x57, 0x03, 0x0da3),
4493 WRITE_COEF(0x49, 0x0049),
4494 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
4495 WRITE_COEF(0x06, 0x6100),
4496 {}
4497 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004498 static const struct coef_fw coef0233[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004499 WRITE_COEF(0x06, 0x2100),
4500 WRITE_COEF(0x32, 0x4ea3),
4501 {}
4502 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004503 static const struct coef_fw coef0288[] = {
Kailang Yangf3b70332015-04-08 15:01:17 +08004504 UPDATE_COEF(0x4f, 0xfcc0, 0xc400), /* Set to TRS type */
4505 UPDATE_COEF(0x50, 0x2000, 0x2000),
4506 UPDATE_COEF(0x56, 0x0006, 0x0006),
4507 UPDATE_COEF(0x66, 0x0008, 0),
4508 UPDATE_COEF(0x67, 0x2000, 0),
4509 {}
4510 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004511 static const struct coef_fw coef0292[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004512 WRITE_COEF(0x76, 0x000e),
4513 WRITE_COEF(0x6c, 0x2400),
4514 WRITE_COEF(0x6b, 0xc429),
4515 WRITE_COEF(0x18, 0x7308),
4516 {}
4517 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004518 static const struct coef_fw coef0293[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004519 UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
4520 WRITE_COEF(0x45, 0xC429), /* Set to TRS type */
4521 UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
4522 {}
4523 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004524 static const struct coef_fw coef0688[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004525 WRITE_COEF(0x11, 0x0041),
4526 WRITE_COEF(0x15, 0x0d40),
4527 WRITE_COEF(0xb7, 0x802b),
4528 {}
4529 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004530 static const struct coef_fw coef0274[] = {
Kailang Yang71683c32017-06-20 16:33:50 +08004531 WRITE_COEF(0x45, 0x4289),
4532 UPDATE_COEF(0x4a, 0x0010, 0x0010),
4533 UPDATE_COEF(0x6b, 0x0f00, 0),
4534 UPDATE_COEF(0x49, 0x0300, 0x0300),
4535 {}
4536 };
Takashi Iwai54db6c32014-08-18 15:11:19 +02004537
Takashi Iwai7639a062015-03-03 10:07:24 +01004538 switch (codec->core.vendor_id) {
Kailang Yangc2b691e2018-01-17 15:22:55 +08004539 case 0x10ec0215:
David Henningsson2ae95572016-02-25 09:37:05 +01004540 case 0x10ec0225:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004541 case 0x10ec0285:
Kailang Yang7d727862016-05-24 16:46:07 +08004542 case 0x10ec0295:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004543 case 0x10ec0289:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08004544 case 0x10ec0299:
Kailang Yang5a367672017-07-21 15:23:53 +08004545 alc_process_coef_fw(codec, alc225_pre_hsmode);
David Henningsson2ae95572016-02-25 09:37:05 +01004546 alc_process_coef_fw(codec, coef0225);
4547 break;
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004548 case 0x10ec0255:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004549 alc_process_coef_fw(codec, coef0255);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004550 break;
Kailang Yang717f43d2019-05-31 17:16:53 +08004551 case 0x10ec0236:
4552 case 0x10ec0256:
4553 alc_write_coef_idx(codec, 0x1b, 0x0e4b);
4554 alc_write_coef_idx(codec, 0x45, 0xc089);
4555 msleep(50);
4556 alc_process_coef_fw(codec, coef0256);
4557 break;
Kailang Yang71683c32017-06-20 16:33:50 +08004558 case 0x10ec0234:
4559 case 0x10ec0274:
4560 case 0x10ec0294:
4561 alc_process_coef_fw(codec, coef0274);
4562 break;
Kailang Yang13fd08a2014-05-21 16:49:48 +08004563 case 0x10ec0233:
David Henningsson73bdd592013-04-15 15:44:14 +02004564 case 0x10ec0283:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004565 alc_process_coef_fw(codec, coef0233);
David Henningsson73bdd592013-04-15 15:44:14 +02004566 break;
Kailang Yangf3b70332015-04-08 15:01:17 +08004567 case 0x10ec0286:
4568 case 0x10ec0288:
Kailang Yang1a5bc8d2015-05-12 17:11:10 +08004569 case 0x10ec0298:
Kailang Yangf3b70332015-04-08 15:01:17 +08004570 alc_process_coef_fw(codec, coef0288);
4571 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004572 case 0x10ec0292:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004573 alc_process_coef_fw(codec, coef0292);
David Henningsson73bdd592013-04-15 15:44:14 +02004574 break;
Kailang Yanga22aa262014-04-23 17:34:28 +08004575 case 0x10ec0293:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004576 alc_process_coef_fw(codec, coef0293);
Kailang Yanga22aa262014-04-23 17:34:28 +08004577 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004578 case 0x10ec0668:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004579 alc_process_coef_fw(codec, coef0688);
David Henningsson73bdd592013-04-15 15:44:14 +02004580 break;
Kailang Yang78f4f7c2016-06-07 11:31:34 +08004581 case 0x10ec0867:
4582 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
4583 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004584 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01004585 codec_dbg(codec, "Headset jack set to headphone (default) mode.\n");
David Henningsson73bdd592013-04-15 15:44:14 +02004586}
4587
4588/* Iphone type */
4589static void alc_headset_mode_ctia(struct hda_codec *codec)
4590{
Kailang Yang89542932017-07-17 15:03:43 +08004591 int val;
4592
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004593 static const struct coef_fw coef0255[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004594 WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
4595 WRITE_COEF(0x1b, 0x0c2b),
4596 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
4597 {}
4598 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004599 static const struct coef_fw coef0256[] = {
Kailang Yange69e7e02016-05-30 15:58:28 +08004600 WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
Kailang Yang717f43d2019-05-31 17:16:53 +08004601 WRITE_COEF(0x1b, 0x0e6b),
Kailang Yange69e7e02016-05-30 15:58:28 +08004602 {}
4603 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004604 static const struct coef_fw coef0233[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004605 WRITE_COEF(0x45, 0xd429),
4606 WRITE_COEF(0x1b, 0x0c2b),
4607 WRITE_COEF(0x32, 0x4ea3),
4608 {}
4609 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004610 static const struct coef_fw coef0288[] = {
Kailang Yangf3b70332015-04-08 15:01:17 +08004611 UPDATE_COEF(0x50, 0x2000, 0x2000),
4612 UPDATE_COEF(0x56, 0x0006, 0x0006),
4613 UPDATE_COEF(0x66, 0x0008, 0),
4614 UPDATE_COEF(0x67, 0x2000, 0),
4615 {}
4616 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004617 static const struct coef_fw coef0292[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004618 WRITE_COEF(0x6b, 0xd429),
4619 WRITE_COEF(0x76, 0x0008),
4620 WRITE_COEF(0x18, 0x7388),
4621 {}
4622 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004623 static const struct coef_fw coef0293[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004624 WRITE_COEF(0x45, 0xd429), /* Set to ctia type */
4625 UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
4626 {}
4627 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004628 static const struct coef_fw coef0688[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004629 WRITE_COEF(0x11, 0x0001),
4630 WRITE_COEF(0x15, 0x0d60),
4631 WRITE_COEF(0xc3, 0x0000),
4632 {}
4633 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004634 static const struct coef_fw coef0225_1[] = {
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004635 UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
Kailang Yang5a367672017-07-21 15:23:53 +08004636 UPDATE_COEF(0x63, 3<<14, 2<<14),
4637 {}
4638 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004639 static const struct coef_fw coef0225_2[] = {
Kailang Yang5a367672017-07-21 15:23:53 +08004640 UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
4641 UPDATE_COEF(0x63, 3<<14, 1<<14),
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004642 {}
4643 };
Takashi Iwai54db6c32014-08-18 15:11:19 +02004644
Takashi Iwai7639a062015-03-03 10:07:24 +01004645 switch (codec->core.vendor_id) {
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004646 case 0x10ec0255:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004647 alc_process_coef_fw(codec, coef0255);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004648 break;
Kailang Yang736f20a2017-10-20 15:06:34 +08004649 case 0x10ec0236:
Kailang Yange69e7e02016-05-30 15:58:28 +08004650 case 0x10ec0256:
4651 alc_process_coef_fw(codec, coef0256);
4652 break;
Kailang Yang71683c32017-06-20 16:33:50 +08004653 case 0x10ec0234:
4654 case 0x10ec0274:
4655 case 0x10ec0294:
4656 alc_write_coef_idx(codec, 0x45, 0xd689);
4657 break;
Kailang Yang13fd08a2014-05-21 16:49:48 +08004658 case 0x10ec0233:
David Henningsson73bdd592013-04-15 15:44:14 +02004659 case 0x10ec0283:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004660 alc_process_coef_fw(codec, coef0233);
David Henningsson73bdd592013-04-15 15:44:14 +02004661 break;
Kailang Yang1a5bc8d2015-05-12 17:11:10 +08004662 case 0x10ec0298:
Kailang Yang89542932017-07-17 15:03:43 +08004663 val = alc_read_coef_idx(codec, 0x50);
4664 if (val & (1 << 12)) {
4665 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
4666 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
4667 msleep(300);
4668 } else {
4669 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
4670 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
4671 msleep(300);
4672 }
4673 break;
Kailang Yangf3b70332015-04-08 15:01:17 +08004674 case 0x10ec0286:
4675 case 0x10ec0288:
4676 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
4677 msleep(300);
4678 alc_process_coef_fw(codec, coef0288);
4679 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004680 case 0x10ec0292:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004681 alc_process_coef_fw(codec, coef0292);
David Henningsson73bdd592013-04-15 15:44:14 +02004682 break;
Kailang Yanga22aa262014-04-23 17:34:28 +08004683 case 0x10ec0293:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004684 alc_process_coef_fw(codec, coef0293);
Kailang Yanga22aa262014-04-23 17:34:28 +08004685 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004686 case 0x10ec0668:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004687 alc_process_coef_fw(codec, coef0688);
David Henningsson73bdd592013-04-15 15:44:14 +02004688 break;
Kailang Yangc2b691e2018-01-17 15:22:55 +08004689 case 0x10ec0215:
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004690 case 0x10ec0225:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004691 case 0x10ec0285:
Kailang Yang7d727862016-05-24 16:46:07 +08004692 case 0x10ec0295:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004693 case 0x10ec0289:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08004694 case 0x10ec0299:
Kailang Yang5a367672017-07-21 15:23:53 +08004695 val = alc_read_coef_idx(codec, 0x45);
4696 if (val & (1 << 9))
4697 alc_process_coef_fw(codec, coef0225_2);
4698 else
4699 alc_process_coef_fw(codec, coef0225_1);
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004700 break;
Kailang Yang78f4f7c2016-06-07 11:31:34 +08004701 case 0x10ec0867:
4702 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
4703 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004704 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01004705 codec_dbg(codec, "Headset jack set to iPhone-style headset mode.\n");
David Henningsson73bdd592013-04-15 15:44:14 +02004706}
4707
4708/* Nokia type */
4709static void alc_headset_mode_omtp(struct hda_codec *codec)
4710{
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004711 static const struct coef_fw coef0255[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004712 WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
4713 WRITE_COEF(0x1b, 0x0c2b),
4714 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
4715 {}
4716 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004717 static const struct coef_fw coef0256[] = {
Kailang Yange69e7e02016-05-30 15:58:28 +08004718 WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
Kailang Yang717f43d2019-05-31 17:16:53 +08004719 WRITE_COEF(0x1b, 0x0e6b),
Kailang Yange69e7e02016-05-30 15:58:28 +08004720 {}
4721 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004722 static const struct coef_fw coef0233[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004723 WRITE_COEF(0x45, 0xe429),
4724 WRITE_COEF(0x1b, 0x0c2b),
4725 WRITE_COEF(0x32, 0x4ea3),
4726 {}
4727 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004728 static const struct coef_fw coef0288[] = {
Kailang Yangf3b70332015-04-08 15:01:17 +08004729 UPDATE_COEF(0x50, 0x2000, 0x2000),
4730 UPDATE_COEF(0x56, 0x0006, 0x0006),
4731 UPDATE_COEF(0x66, 0x0008, 0),
4732 UPDATE_COEF(0x67, 0x2000, 0),
4733 {}
4734 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004735 static const struct coef_fw coef0292[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004736 WRITE_COEF(0x6b, 0xe429),
4737 WRITE_COEF(0x76, 0x0008),
4738 WRITE_COEF(0x18, 0x7388),
4739 {}
4740 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004741 static const struct coef_fw coef0293[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004742 WRITE_COEF(0x45, 0xe429), /* Set to omtp type */
4743 UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
4744 {}
4745 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004746 static const struct coef_fw coef0688[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004747 WRITE_COEF(0x11, 0x0001),
4748 WRITE_COEF(0x15, 0x0d50),
4749 WRITE_COEF(0xc3, 0x0000),
4750 {}
4751 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004752 static const struct coef_fw coef0225[] = {
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004753 UPDATE_COEF(0x45, 0x3f<<10, 0x39<<10),
Kailang Yang5a367672017-07-21 15:23:53 +08004754 UPDATE_COEF(0x63, 3<<14, 2<<14),
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004755 {}
4756 };
Takashi Iwai54db6c32014-08-18 15:11:19 +02004757
Takashi Iwai7639a062015-03-03 10:07:24 +01004758 switch (codec->core.vendor_id) {
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004759 case 0x10ec0255:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004760 alc_process_coef_fw(codec, coef0255);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004761 break;
Kailang Yang736f20a2017-10-20 15:06:34 +08004762 case 0x10ec0236:
Kailang Yange69e7e02016-05-30 15:58:28 +08004763 case 0x10ec0256:
4764 alc_process_coef_fw(codec, coef0256);
4765 break;
Kailang Yang71683c32017-06-20 16:33:50 +08004766 case 0x10ec0234:
4767 case 0x10ec0274:
4768 case 0x10ec0294:
4769 alc_write_coef_idx(codec, 0x45, 0xe689);
4770 break;
Kailang Yang13fd08a2014-05-21 16:49:48 +08004771 case 0x10ec0233:
David Henningsson73bdd592013-04-15 15:44:14 +02004772 case 0x10ec0283:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004773 alc_process_coef_fw(codec, coef0233);
David Henningsson73bdd592013-04-15 15:44:14 +02004774 break;
Kailang Yang1a5bc8d2015-05-12 17:11:10 +08004775 case 0x10ec0298:
4776 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);/* Headset output enable */
Kailang Yang89542932017-07-17 15:03:43 +08004777 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
4778 msleep(300);
4779 break;
Kailang Yangf3b70332015-04-08 15:01:17 +08004780 case 0x10ec0286:
4781 case 0x10ec0288:
4782 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
4783 msleep(300);
4784 alc_process_coef_fw(codec, coef0288);
4785 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004786 case 0x10ec0292:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004787 alc_process_coef_fw(codec, coef0292);
David Henningsson73bdd592013-04-15 15:44:14 +02004788 break;
Kailang Yanga22aa262014-04-23 17:34:28 +08004789 case 0x10ec0293:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004790 alc_process_coef_fw(codec, coef0293);
Kailang Yanga22aa262014-04-23 17:34:28 +08004791 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004792 case 0x10ec0668:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004793 alc_process_coef_fw(codec, coef0688);
David Henningsson73bdd592013-04-15 15:44:14 +02004794 break;
Kailang Yangc2b691e2018-01-17 15:22:55 +08004795 case 0x10ec0215:
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004796 case 0x10ec0225:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004797 case 0x10ec0285:
Kailang Yang7d727862016-05-24 16:46:07 +08004798 case 0x10ec0295:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004799 case 0x10ec0289:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08004800 case 0x10ec0299:
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004801 alc_process_coef_fw(codec, coef0225);
4802 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004803 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01004804 codec_dbg(codec, "Headset jack set to Nokia-style headset mode.\n");
David Henningsson73bdd592013-04-15 15:44:14 +02004805}
4806
4807static void alc_determine_headset_type(struct hda_codec *codec)
4808{
4809 int val;
4810 bool is_ctia = false;
4811 struct alc_spec *spec = codec->spec;
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004812 static const struct coef_fw coef0255[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004813 WRITE_COEF(0x45, 0xd089), /* combo jack auto switch control(Check type)*/
4814 WRITE_COEF(0x49, 0x0149), /* combo jack auto switch control(Vref
4815 conteol) */
4816 {}
4817 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004818 static const struct coef_fw coef0288[] = {
Kailang Yangf3b70332015-04-08 15:01:17 +08004819 UPDATE_COEF(0x4f, 0xfcc0, 0xd400), /* Check Type */
4820 {}
4821 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004822 static const struct coef_fw coef0298[] = {
Kailang Yang89542932017-07-17 15:03:43 +08004823 UPDATE_COEF(0x50, 0x2000, 0x2000),
4824 UPDATE_COEF(0x56, 0x0006, 0x0006),
4825 UPDATE_COEF(0x66, 0x0008, 0),
4826 UPDATE_COEF(0x67, 0x2000, 0),
4827 UPDATE_COEF(0x19, 0x1300, 0x1300),
4828 {}
4829 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004830 static const struct coef_fw coef0293[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004831 UPDATE_COEF(0x4a, 0x000f, 0x0008), /* Combo Jack auto detect */
4832 WRITE_COEF(0x45, 0xD429), /* Set to ctia type */
4833 {}
4834 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004835 static const struct coef_fw coef0688[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004836 WRITE_COEF(0x11, 0x0001),
4837 WRITE_COEF(0xb7, 0x802b),
4838 WRITE_COEF(0x15, 0x0d60),
4839 WRITE_COEF(0xc3, 0x0c00),
4840 {}
4841 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004842 static const struct coef_fw coef0274[] = {
Kailang Yang71683c32017-06-20 16:33:50 +08004843 UPDATE_COEF(0x4a, 0x0010, 0),
4844 UPDATE_COEF(0x4a, 0x8000, 0),
4845 WRITE_COEF(0x45, 0xd289),
4846 UPDATE_COEF(0x49, 0x0300, 0x0300),
4847 {}
4848 };
David Henningsson73bdd592013-04-15 15:44:14 +02004849
Takashi Iwai7639a062015-03-03 10:07:24 +01004850 switch (codec->core.vendor_id) {
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004851 case 0x10ec0255:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004852 alc_process_coef_fw(codec, coef0255);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004853 msleep(300);
4854 val = alc_read_coef_idx(codec, 0x46);
4855 is_ctia = (val & 0x0070) == 0x0070;
4856 break;
Kailang Yang717f43d2019-05-31 17:16:53 +08004857 case 0x10ec0236:
4858 case 0x10ec0256:
4859 alc_write_coef_idx(codec, 0x1b, 0x0e4b);
4860 alc_write_coef_idx(codec, 0x06, 0x6104);
4861 alc_write_coefex_idx(codec, 0x57, 0x3, 0x09a3);
4862
4863 snd_hda_codec_write(codec, 0x21, 0,
4864 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
4865 msleep(80);
4866 snd_hda_codec_write(codec, 0x21, 0,
4867 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
4868
4869 alc_process_coef_fw(codec, coef0255);
4870 msleep(300);
4871 val = alc_read_coef_idx(codec, 0x46);
4872 is_ctia = (val & 0x0070) == 0x0070;
4873
4874 alc_write_coefex_idx(codec, 0x57, 0x3, 0x0da3);
4875 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
4876
4877 snd_hda_codec_write(codec, 0x21, 0,
4878 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
4879 msleep(80);
4880 snd_hda_codec_write(codec, 0x21, 0,
4881 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
4882 break;
Kailang Yang71683c32017-06-20 16:33:50 +08004883 case 0x10ec0234:
4884 case 0x10ec0274:
4885 case 0x10ec0294:
4886 alc_process_coef_fw(codec, coef0274);
4887 msleep(80);
4888 val = alc_read_coef_idx(codec, 0x46);
4889 is_ctia = (val & 0x00f0) == 0x00f0;
4890 break;
Kailang Yang13fd08a2014-05-21 16:49:48 +08004891 case 0x10ec0233:
David Henningsson73bdd592013-04-15 15:44:14 +02004892 case 0x10ec0283:
4893 alc_write_coef_idx(codec, 0x45, 0xd029);
4894 msleep(300);
4895 val = alc_read_coef_idx(codec, 0x46);
4896 is_ctia = (val & 0x0070) == 0x0070;
4897 break;
Kailang Yang1a5bc8d2015-05-12 17:11:10 +08004898 case 0x10ec0298:
Kailang Yang89542932017-07-17 15:03:43 +08004899 snd_hda_codec_write(codec, 0x21, 0,
4900 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
4901 msleep(100);
4902 snd_hda_codec_write(codec, 0x21, 0,
4903 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
4904 msleep(200);
4905
4906 val = alc_read_coef_idx(codec, 0x50);
4907 if (val & (1 << 12)) {
4908 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
4909 alc_process_coef_fw(codec, coef0288);
4910 msleep(350);
4911 val = alc_read_coef_idx(codec, 0x50);
4912 is_ctia = (val & 0x0070) == 0x0070;
4913 } else {
4914 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
4915 alc_process_coef_fw(codec, coef0288);
4916 msleep(350);
4917 val = alc_read_coef_idx(codec, 0x50);
4918 is_ctia = (val & 0x0070) == 0x0070;
4919 }
4920 alc_process_coef_fw(codec, coef0298);
4921 snd_hda_codec_write(codec, 0x21, 0,
4922 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP);
4923 msleep(75);
4924 snd_hda_codec_write(codec, 0x21, 0,
4925 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
4926 break;
Kailang Yangf3b70332015-04-08 15:01:17 +08004927 case 0x10ec0286:
4928 case 0x10ec0288:
4929 alc_process_coef_fw(codec, coef0288);
4930 msleep(350);
4931 val = alc_read_coef_idx(codec, 0x50);
4932 is_ctia = (val & 0x0070) == 0x0070;
4933 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004934 case 0x10ec0292:
4935 alc_write_coef_idx(codec, 0x6b, 0xd429);
4936 msleep(300);
4937 val = alc_read_coef_idx(codec, 0x6c);
4938 is_ctia = (val & 0x001c) == 0x001c;
4939 break;
Kailang Yanga22aa262014-04-23 17:34:28 +08004940 case 0x10ec0293:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004941 alc_process_coef_fw(codec, coef0293);
Kailang Yanga22aa262014-04-23 17:34:28 +08004942 msleep(300);
4943 val = alc_read_coef_idx(codec, 0x46);
4944 is_ctia = (val & 0x0070) == 0x0070;
4945 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004946 case 0x10ec0668:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004947 alc_process_coef_fw(codec, coef0688);
David Henningsson73bdd592013-04-15 15:44:14 +02004948 msleep(300);
4949 val = alc_read_coef_idx(codec, 0xbe);
4950 is_ctia = (val & 0x1c02) == 0x1c02;
4951 break;
Kailang Yangc2b691e2018-01-17 15:22:55 +08004952 case 0x10ec0215:
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004953 case 0x10ec0225:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004954 case 0x10ec0285:
Kailang Yang7d727862016-05-24 16:46:07 +08004955 case 0x10ec0295:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004956 case 0x10ec0289:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08004957 case 0x10ec0299:
Kailang Yangda911b12018-01-05 16:50:08 +08004958 snd_hda_codec_write(codec, 0x21, 0,
4959 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
4960 msleep(80);
4961 snd_hda_codec_write(codec, 0x21, 0,
4962 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
4963
Kailang Yang5a367672017-07-21 15:23:53 +08004964 alc_process_coef_fw(codec, alc225_pre_hsmode);
4965 alc_update_coef_idx(codec, 0x67, 0xf000, 0x1000);
4966 val = alc_read_coef_idx(codec, 0x45);
4967 if (val & (1 << 9)) {
4968 alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
4969 alc_update_coef_idx(codec, 0x49, 3<<8, 2<<8);
4970 msleep(800);
4971 val = alc_read_coef_idx(codec, 0x46);
4972 is_ctia = (val & 0x00f0) == 0x00f0;
4973 } else {
4974 alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
4975 alc_update_coef_idx(codec, 0x49, 3<<8, 1<<8);
4976 msleep(800);
4977 val = alc_read_coef_idx(codec, 0x46);
4978 is_ctia = (val & 0x00f0) == 0x00f0;
4979 }
4980 alc_update_coef_idx(codec, 0x4a, 7<<6, 7<<6);
4981 alc_update_coef_idx(codec, 0x4a, 3<<4, 3<<4);
4982 alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
Kailang Yangda911b12018-01-05 16:50:08 +08004983
4984 snd_hda_codec_write(codec, 0x21, 0,
4985 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
4986 msleep(80);
4987 snd_hda_codec_write(codec, 0x21, 0,
4988 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004989 break;
Kailang Yang78f4f7c2016-06-07 11:31:34 +08004990 case 0x10ec0867:
4991 is_ctia = true;
4992 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004993 }
4994
Takashi Iwai4e76a882014-02-25 12:21:03 +01004995 codec_dbg(codec, "Headset jack detected iPhone-style headset: %s\n",
David Henningsson73bdd592013-04-15 15:44:14 +02004996 is_ctia ? "yes" : "no");
4997 spec->current_headset_type = is_ctia ? ALC_HEADSET_TYPE_CTIA : ALC_HEADSET_TYPE_OMTP;
4998}
4999
5000static void alc_update_headset_mode(struct hda_codec *codec)
5001{
5002 struct alc_spec *spec = codec->spec;
5003
5004 hda_nid_t mux_pin = spec->gen.imux_pins[spec->gen.cur_mux[0]];
Takashi Iwai35a39f92019-02-01 11:19:50 +01005005 hda_nid_t hp_pin = alc_get_hp_pin(spec);
David Henningsson73bdd592013-04-15 15:44:14 +02005006
5007 int new_headset_mode;
5008
5009 if (!snd_hda_jack_detect(codec, hp_pin))
5010 new_headset_mode = ALC_HEADSET_MODE_UNPLUGGED;
5011 else if (mux_pin == spec->headset_mic_pin)
5012 new_headset_mode = ALC_HEADSET_MODE_HEADSET;
5013 else if (mux_pin == spec->headphone_mic_pin)
5014 new_headset_mode = ALC_HEADSET_MODE_MIC;
5015 else
5016 new_headset_mode = ALC_HEADSET_MODE_HEADPHONE;
5017
David Henningsson5959a6b2013-11-12 11:10:57 +01005018 if (new_headset_mode == spec->current_headset_mode) {
5019 snd_hda_gen_update_outputs(codec);
David Henningsson73bdd592013-04-15 15:44:14 +02005020 return;
David Henningsson5959a6b2013-11-12 11:10:57 +01005021 }
David Henningsson73bdd592013-04-15 15:44:14 +02005022
5023 switch (new_headset_mode) {
5024 case ALC_HEADSET_MODE_UNPLUGGED:
5025 alc_headset_mode_unplugged(codec);
Kailang Yangaeac1a02019-05-16 16:10:44 +08005026 spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5027 spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
David Henningsson73bdd592013-04-15 15:44:14 +02005028 spec->gen.hp_jack_present = false;
5029 break;
5030 case ALC_HEADSET_MODE_HEADSET:
5031 if (spec->current_headset_type == ALC_HEADSET_TYPE_UNKNOWN)
5032 alc_determine_headset_type(codec);
5033 if (spec->current_headset_type == ALC_HEADSET_TYPE_CTIA)
5034 alc_headset_mode_ctia(codec);
5035 else if (spec->current_headset_type == ALC_HEADSET_TYPE_OMTP)
5036 alc_headset_mode_omtp(codec);
5037 spec->gen.hp_jack_present = true;
5038 break;
5039 case ALC_HEADSET_MODE_MIC:
5040 alc_headset_mode_mic_in(codec, hp_pin, spec->headphone_mic_pin);
5041 spec->gen.hp_jack_present = false;
5042 break;
5043 case ALC_HEADSET_MODE_HEADPHONE:
5044 alc_headset_mode_default(codec);
5045 spec->gen.hp_jack_present = true;
5046 break;
5047 }
5048 if (new_headset_mode != ALC_HEADSET_MODE_MIC) {
5049 snd_hda_set_pin_ctl_cache(codec, hp_pin,
5050 AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
David Henningsson1f8b46c2015-05-12 14:38:15 +02005051 if (spec->headphone_mic_pin && spec->headphone_mic_pin != hp_pin)
David Henningsson73bdd592013-04-15 15:44:14 +02005052 snd_hda_set_pin_ctl_cache(codec, spec->headphone_mic_pin,
5053 PIN_VREFHIZ);
5054 }
5055 spec->current_headset_mode = new_headset_mode;
5056
5057 snd_hda_gen_update_outputs(codec);
5058}
5059
5060static void alc_update_headset_mode_hook(struct hda_codec *codec,
Takashi Iwai7fe30712014-01-30 17:59:02 +01005061 struct snd_kcontrol *kcontrol,
5062 struct snd_ctl_elem_value *ucontrol)
David Henningsson73bdd592013-04-15 15:44:14 +02005063{
5064 alc_update_headset_mode(codec);
5065}
5066
Takashi Iwai1a4f69d2014-09-11 15:22:46 +02005067static void alc_update_headset_jack_cb(struct hda_codec *codec,
5068 struct hda_jack_callback *jack)
David Henningsson73bdd592013-04-15 15:44:14 +02005069{
David Henningsson73bdd592013-04-15 15:44:14 +02005070 snd_hda_gen_hp_automute(codec, jack);
5071}
5072
5073static void alc_probe_headset_mode(struct hda_codec *codec)
5074{
5075 int i;
5076 struct alc_spec *spec = codec->spec;
5077 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5078
5079 /* Find mic pins */
5080 for (i = 0; i < cfg->num_inputs; i++) {
5081 if (cfg->inputs[i].is_headset_mic && !spec->headset_mic_pin)
5082 spec->headset_mic_pin = cfg->inputs[i].pin;
5083 if (cfg->inputs[i].is_headphone_mic && !spec->headphone_mic_pin)
5084 spec->headphone_mic_pin = cfg->inputs[i].pin;
5085 }
5086
Takashi Iwai0bed2aa2018-06-19 12:45:53 +02005087 WARN_ON(spec->gen.cap_sync_hook);
David Henningsson73bdd592013-04-15 15:44:14 +02005088 spec->gen.cap_sync_hook = alc_update_headset_mode_hook;
5089 spec->gen.automute_hook = alc_update_headset_mode;
5090 spec->gen.hp_automute_hook = alc_update_headset_jack_cb;
5091}
5092
5093static void alc_fixup_headset_mode(struct hda_codec *codec,
5094 const struct hda_fixup *fix, int action)
5095{
5096 struct alc_spec *spec = codec->spec;
5097
5098 switch (action) {
5099 case HDA_FIXUP_ACT_PRE_PROBE:
5100 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC | HDA_PINCFG_HEADPHONE_MIC;
5101 break;
5102 case HDA_FIXUP_ACT_PROBE:
5103 alc_probe_headset_mode(codec);
5104 break;
5105 case HDA_FIXUP_ACT_INIT:
Kailang Yangaeac1a02019-05-16 16:10:44 +08005106 if (is_s3_resume(codec) || is_s4_resume(codec)) {
5107 spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5108 spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
5109 }
David Henningsson73bdd592013-04-15 15:44:14 +02005110 alc_update_headset_mode(codec);
5111 break;
5112 }
5113}
5114
5115static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
5116 const struct hda_fixup *fix, int action)
5117{
5118 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5119 struct alc_spec *spec = codec->spec;
5120 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5121 }
5122 else
5123 alc_fixup_headset_mode(codec, fix, action);
5124}
5125
Kailang Yang31278992014-03-03 15:27:22 +08005126static void alc255_set_default_jack_type(struct hda_codec *codec)
5127{
5128 /* Set to iphone type */
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005129 static const struct coef_fw alc255fw[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005130 WRITE_COEF(0x1b, 0x880b),
5131 WRITE_COEF(0x45, 0xd089),
5132 WRITE_COEF(0x1b, 0x080b),
5133 WRITE_COEF(0x46, 0x0004),
5134 WRITE_COEF(0x1b, 0x0c0b),
5135 {}
5136 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005137 static const struct coef_fw alc256fw[] = {
Kailang Yange69e7e02016-05-30 15:58:28 +08005138 WRITE_COEF(0x1b, 0x884b),
5139 WRITE_COEF(0x45, 0xd089),
5140 WRITE_COEF(0x1b, 0x084b),
5141 WRITE_COEF(0x46, 0x0004),
5142 WRITE_COEF(0x1b, 0x0c4b),
5143 {}
5144 };
5145 switch (codec->core.vendor_id) {
5146 case 0x10ec0255:
5147 alc_process_coef_fw(codec, alc255fw);
5148 break;
Kailang Yang736f20a2017-10-20 15:06:34 +08005149 case 0x10ec0236:
Kailang Yange69e7e02016-05-30 15:58:28 +08005150 case 0x10ec0256:
5151 alc_process_coef_fw(codec, alc256fw);
5152 break;
5153 }
Kailang Yang31278992014-03-03 15:27:22 +08005154 msleep(30);
5155}
5156
Kailang Yang9a22a8f52013-11-08 15:54:49 +08005157static void alc_fixup_headset_mode_alc255(struct hda_codec *codec,
5158 const struct hda_fixup *fix, int action)
5159{
5160 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Kailang Yang31278992014-03-03 15:27:22 +08005161 alc255_set_default_jack_type(codec);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08005162 }
5163 alc_fixup_headset_mode(codec, fix, action);
5164}
5165
Kailang Yang31278992014-03-03 15:27:22 +08005166static void alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec,
5167 const struct hda_fixup *fix, int action)
5168{
5169 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5170 struct alc_spec *spec = codec->spec;
5171 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5172 alc255_set_default_jack_type(codec);
5173 }
5174 else
5175 alc_fixup_headset_mode(codec, fix, action);
5176}
5177
Kailang Yange1e62b92015-04-08 16:01:22 +08005178static void alc288_update_headset_jack_cb(struct hda_codec *codec,
5179 struct hda_jack_callback *jack)
5180{
5181 struct alc_spec *spec = codec->spec;
Kailang Yange1e62b92015-04-08 16:01:22 +08005182
5183 alc_update_headset_jack_cb(codec, jack);
5184 /* Headset Mic enable or disable, only for Dell Dino */
Takashi Iwaid44a6862018-06-19 23:04:03 +02005185 alc_update_gpio_data(codec, 0x40, spec->gen.hp_jack_present);
Kailang Yange1e62b92015-04-08 16:01:22 +08005186}
5187
5188static void alc_fixup_headset_mode_dell_alc288(struct hda_codec *codec,
5189 const struct hda_fixup *fix, int action)
5190{
5191 alc_fixup_headset_mode(codec, fix, action);
5192 if (action == HDA_FIXUP_ACT_PROBE) {
5193 struct alc_spec *spec = codec->spec;
Takashi Iwaid44a6862018-06-19 23:04:03 +02005194 /* toggled via hp_automute_hook */
5195 spec->gpio_mask |= 0x40;
5196 spec->gpio_dir |= 0x40;
Kailang Yange1e62b92015-04-08 16:01:22 +08005197 spec->gen.hp_automute_hook = alc288_update_headset_jack_cb;
5198 }
5199}
5200
Hui Wang493a52a2014-01-14 14:07:36 +08005201static void alc_fixup_auto_mute_via_amp(struct hda_codec *codec,
5202 const struct hda_fixup *fix, int action)
5203{
5204 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5205 struct alc_spec *spec = codec->spec;
5206 spec->gen.auto_mute_via_amp = 1;
5207 }
5208}
5209
Takashi Iwai9b745ab2014-03-07 08:37:19 +01005210static void alc_fixup_no_shutup(struct hda_codec *codec,
5211 const struct hda_fixup *fix, int action)
5212{
Takashi Iwaiefe55732018-06-15 11:55:02 +02005213 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai9b745ab2014-03-07 08:37:19 +01005214 struct alc_spec *spec = codec->spec;
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01005215 spec->no_shutup_pins = 1;
Takashi Iwai9b745ab2014-03-07 08:37:19 +01005216 }
5217}
5218
Gabriele Mazzotta5e6db662014-05-20 18:58:26 +02005219static void alc_fixup_disable_aamix(struct hda_codec *codec,
5220 const struct hda_fixup *fix, int action)
5221{
5222 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5223 struct alc_spec *spec = codec->spec;
5224 /* Disable AA-loopback as it causes white noise */
5225 spec->gen.mixer_nid = 0;
5226 }
5227}
5228
Takashi Iwai7f57d802015-09-24 17:36:51 +02005229/* fixup for Thinkpad docks: add dock pins, avoid HP parser fixup */
5230static void alc_fixup_tpt440_dock(struct hda_codec *codec,
5231 const struct hda_fixup *fix, int action)
5232{
5233 static const struct hda_pintbl pincfgs[] = {
5234 { 0x16, 0x21211010 }, /* dock headphone */
5235 { 0x19, 0x21a11010 }, /* dock mic */
5236 { }
5237 };
5238 struct alc_spec *spec = codec->spec;
5239
5240 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Hui Wang871b9062019-08-14 12:09:08 +08005241 spec->reboot_notify = snd_hda_gen_reboot_notify; /* reduce noise */
Takashi Iwai7f57d802015-09-24 17:36:51 +02005242 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
5243 codec->power_save_node = 0; /* avoid click noises */
5244 snd_hda_apply_pincfgs(codec, pincfgs);
5245 }
5246}
5247
Kailang Yang61fcf8e2018-02-02 15:26:46 +08005248static void alc_fixup_tpt470_dock(struct hda_codec *codec,
5249 const struct hda_fixup *fix, int action)
5250{
5251 static const struct hda_pintbl pincfgs[] = {
5252 { 0x17, 0x21211010 }, /* dock headphone */
5253 { 0x19, 0x21a11010 }, /* dock mic */
5254 { }
5255 };
Takashi Iwai54947cd2018-12-03 10:44:15 +01005256 /* Assure the speaker pin to be coupled with DAC NID 0x03; otherwise
5257 * the speaker output becomes too low by some reason on Thinkpads with
5258 * ALC298 codec
5259 */
Michał Mirosławcaf3c042020-01-03 10:23:48 +01005260 static const hda_nid_t preferred_pairs[] = {
Takashi Iwai54947cd2018-12-03 10:44:15 +01005261 0x14, 0x03, 0x17, 0x02, 0x21, 0x02,
5262 0
5263 };
Kailang Yang61fcf8e2018-02-02 15:26:46 +08005264 struct alc_spec *spec = codec->spec;
5265
5266 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai54947cd2018-12-03 10:44:15 +01005267 spec->gen.preferred_dacs = preferred_pairs;
Kailang Yang61fcf8e2018-02-02 15:26:46 +08005268 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
Takashi Iwai71db96d2018-02-26 15:36:38 +01005269 snd_hda_apply_pincfgs(codec, pincfgs);
5270 } else if (action == HDA_FIXUP_ACT_INIT) {
Kailang Yang61fcf8e2018-02-02 15:26:46 +08005271 /* Enable DOCK device */
5272 snd_hda_codec_write(codec, 0x17, 0,
5273 AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
5274 /* Enable DOCK device */
5275 snd_hda_codec_write(codec, 0x19, 0,
5276 AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
Kailang Yang61fcf8e2018-02-02 15:26:46 +08005277 }
5278}
5279
Gabriele Mazzotta9476d3692015-04-19 19:00:40 +02005280static void alc_shutup_dell_xps13(struct hda_codec *codec)
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +02005281{
5282 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01005283 int hp_pin = alc_get_hp_pin(spec);
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +02005284
Gabriele Mazzotta9476d3692015-04-19 19:00:40 +02005285 /* Prevent pop noises when headphones are plugged in */
5286 snd_hda_codec_write(codec, hp_pin, 0,
5287 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5288 msleep(20);
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +02005289}
5290
5291static void alc_fixup_dell_xps13(struct hda_codec *codec,
5292 const struct hda_fixup *fix, int action)
5293{
Takashi Iwai3e1b0c42015-04-27 10:43:22 +02005294 struct alc_spec *spec = codec->spec;
5295 struct hda_input_mux *imux = &spec->gen.input_mux;
5296 int i;
Gabriele Mazzottaf38663a2014-08-08 19:34:40 +02005297
Takashi Iwai3e1b0c42015-04-27 10:43:22 +02005298 switch (action) {
5299 case HDA_FIXUP_ACT_PRE_PROBE:
5300 /* mic pin 0x19 must be initialized with Vref Hi-Z, otherwise
5301 * it causes a click noise at start up
5302 */
5303 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
Takashi Iwaiefe55732018-06-15 11:55:02 +02005304 spec->shutup = alc_shutup_dell_xps13;
Takashi Iwai3e1b0c42015-04-27 10:43:22 +02005305 break;
5306 case HDA_FIXUP_ACT_PROBE:
Gabriele Mazzottaf38663a2014-08-08 19:34:40 +02005307 /* Make the internal mic the default input source. */
5308 for (i = 0; i < imux->num_items; i++) {
5309 if (spec->gen.imux_pins[i] == 0x12) {
5310 spec->gen.cur_mux[0] = i;
5311 break;
5312 }
5313 }
Takashi Iwai3e1b0c42015-04-27 10:43:22 +02005314 break;
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +02005315 }
5316}
5317
David Henningsson1f8b46c2015-05-12 14:38:15 +02005318static void alc_fixup_headset_mode_alc662(struct hda_codec *codec,
5319 const struct hda_fixup *fix, int action)
5320{
5321 struct alc_spec *spec = codec->spec;
5322
5323 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5324 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5325 spec->gen.hp_mic = 1; /* Mic-in is same pin as headphone */
David Henningssonb40eda62015-05-28 09:40:23 +02005326
5327 /* Disable boost for mic-in permanently. (This code is only called
5328 from quirks that guarantee that the headphone is at NID 0x1b.) */
5329 snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000);
5330 snd_hda_override_wcaps(codec, 0x1b, get_wcaps(codec, 0x1b) & ~AC_WCAP_IN_AMP);
David Henningsson1f8b46c2015-05-12 14:38:15 +02005331 } else
5332 alc_fixup_headset_mode(codec, fix, action);
5333}
5334
David Henningsson73bdd592013-04-15 15:44:14 +02005335static void alc_fixup_headset_mode_alc668(struct hda_codec *codec,
5336 const struct hda_fixup *fix, int action)
5337{
5338 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
David Henningsson73bdd592013-04-15 15:44:14 +02005339 alc_write_coef_idx(codec, 0xc4, 0x8000);
Takashi Iwai98b24882014-08-18 13:47:50 +02005340 alc_update_coef_idx(codec, 0xc2, ~0xfe, 0);
David Henningsson73bdd592013-04-15 15:44:14 +02005341 snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
5342 }
5343 alc_fixup_headset_mode(codec, fix, action);
5344}
5345
Chih-Chung Changbde7bc62013-08-05 16:38:42 +08005346/* Returns the nid of the external mic input pin, or 0 if it cannot be found. */
5347static int find_ext_mic_pin(struct hda_codec *codec)
5348{
5349 struct alc_spec *spec = codec->spec;
5350 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5351 hda_nid_t nid;
5352 unsigned int defcfg;
5353 int i;
5354
5355 for (i = 0; i < cfg->num_inputs; i++) {
5356 if (cfg->inputs[i].type != AUTO_PIN_MIC)
5357 continue;
5358 nid = cfg->inputs[i].pin;
5359 defcfg = snd_hda_codec_get_pincfg(codec, nid);
5360 if (snd_hda_get_input_pin_attr(defcfg) == INPUT_PIN_ATTR_INT)
5361 continue;
5362 return nid;
5363 }
5364
5365 return 0;
5366}
5367
Dylan Reid08a978d2012-11-18 22:56:40 -08005368static void alc271_hp_gate_mic_jack(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01005369 const struct hda_fixup *fix,
Dylan Reid08a978d2012-11-18 22:56:40 -08005370 int action)
5371{
5372 struct alc_spec *spec = codec->spec;
5373
Takashi Iwai0db75792013-01-23 13:57:20 +01005374 if (action == HDA_FIXUP_ACT_PROBE) {
Chih-Chung Changbde7bc62013-08-05 16:38:42 +08005375 int mic_pin = find_ext_mic_pin(codec);
Takashi Iwai35a39f92019-02-01 11:19:50 +01005376 int hp_pin = alc_get_hp_pin(spec);
Chih-Chung Changbde7bc62013-08-05 16:38:42 +08005377
5378 if (snd_BUG_ON(!mic_pin || !hp_pin))
Takashi Iwai0db75792013-01-23 13:57:20 +01005379 return;
Chih-Chung Changbde7bc62013-08-05 16:38:42 +08005380 snd_hda_jack_set_gating_jack(codec, mic_pin, hp_pin);
Takashi Iwai0db75792013-01-23 13:57:20 +01005381 }
Dylan Reid08a978d2012-11-18 22:56:40 -08005382}
David Henningsson693b6132012-06-22 19:12:10 +02005383
Kai-Heng Feng1099f482019-10-03 12:39:19 +08005384static void alc256_fixup_dell_xps_13_headphone_noise2(struct hda_codec *codec,
5385 const struct hda_fixup *fix,
5386 int action)
5387{
5388 if (action != HDA_FIXUP_ACT_PRE_PROBE)
5389 return;
5390
5391 snd_hda_codec_amp_stereo(codec, 0x1a, HDA_INPUT, 0, HDA_AMP_VOLMASK, 1);
5392 snd_hda_override_wcaps(codec, 0x1a, get_wcaps(codec, 0x1a) & ~AC_WCAP_IN_AMP);
5393}
5394
David Henningsson3e0d6112013-04-22 14:30:14 +02005395static void alc269_fixup_limit_int_mic_boost(struct hda_codec *codec,
5396 const struct hda_fixup *fix,
5397 int action)
5398{
5399 struct alc_spec *spec = codec->spec;
5400 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5401 int i;
5402
5403 /* The mic boosts on level 2 and 3 are too noisy
5404 on the internal mic input.
5405 Therefore limit the boost to 0 or 1. */
5406
5407 if (action != HDA_FIXUP_ACT_PROBE)
5408 return;
5409
5410 for (i = 0; i < cfg->num_inputs; i++) {
5411 hda_nid_t nid = cfg->inputs[i].pin;
5412 unsigned int defcfg;
5413 if (cfg->inputs[i].type != AUTO_PIN_MIC)
5414 continue;
5415 defcfg = snd_hda_codec_get_pincfg(codec, nid);
5416 if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
5417 continue;
5418
5419 snd_hda_override_amp_caps(codec, nid, HDA_INPUT,
5420 (0x00 << AC_AMPCAP_OFFSET_SHIFT) |
5421 (0x01 << AC_AMPCAP_NUM_STEPS_SHIFT) |
5422 (0x2f << AC_AMPCAP_STEP_SIZE_SHIFT) |
5423 (0 << AC_AMPCAP_MUTE_SHIFT));
5424 }
5425}
5426
Kailang Yangcd217a62013-08-22 10:15:24 +02005427static void alc283_hp_automute_hook(struct hda_codec *codec,
Takashi Iwai1a4f69d2014-09-11 15:22:46 +02005428 struct hda_jack_callback *jack)
Kailang Yangcd217a62013-08-22 10:15:24 +02005429{
5430 struct alc_spec *spec = codec->spec;
5431 int vref;
5432
5433 msleep(200);
5434 snd_hda_gen_hp_automute(codec, jack);
5435
5436 vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
5437
5438 msleep(600);
5439 snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5440 vref);
5441}
5442
Kailang Yangcd217a62013-08-22 10:15:24 +02005443static void alc283_fixup_chromebook(struct hda_codec *codec,
5444 const struct hda_fixup *fix, int action)
5445{
5446 struct alc_spec *spec = codec->spec;
Kailang Yangcd217a62013-08-22 10:15:24 +02005447
5448 switch (action) {
5449 case HDA_FIXUP_ACT_PRE_PROBE:
Kailang Yang0202e992013-12-02 15:20:15 +08005450 snd_hda_override_wcaps(codec, 0x03, 0);
Takashi Iwaid2e92702013-10-30 07:50:53 +01005451 /* Disable AA-loopback as it causes white noise */
5452 spec->gen.mixer_nid = 0;
Kailang Yang38070212013-11-01 15:57:35 +08005453 break;
5454 case HDA_FIXUP_ACT_INIT:
Kailang Yangde9481c2014-04-07 16:41:52 +08005455 /* MIC2-VREF control */
5456 /* Set to manual mode */
Takashi Iwai98b24882014-08-18 13:47:50 +02005457 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
Kailang Yang0202e992013-12-02 15:20:15 +08005458 /* Enable Line1 input control by verb */
Takashi Iwai98b24882014-08-18 13:47:50 +02005459 alc_update_coef_idx(codec, 0x1a, 0, 1 << 4);
Kailang Yang0202e992013-12-02 15:20:15 +08005460 break;
5461 }
5462}
5463
5464static void alc283_fixup_sense_combo_jack(struct hda_codec *codec,
5465 const struct hda_fixup *fix, int action)
5466{
5467 struct alc_spec *spec = codec->spec;
Kailang Yang0202e992013-12-02 15:20:15 +08005468
5469 switch (action) {
5470 case HDA_FIXUP_ACT_PRE_PROBE:
Kailang Yangcd217a62013-08-22 10:15:24 +02005471 spec->gen.hp_automute_hook = alc283_hp_automute_hook;
5472 break;
5473 case HDA_FIXUP_ACT_INIT:
5474 /* MIC2-VREF control */
5475 /* Set to manual mode */
Takashi Iwai98b24882014-08-18 13:47:50 +02005476 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
Kailang Yangcd217a62013-08-22 10:15:24 +02005477 break;
5478 }
5479}
5480
Takashi Iwai7bba2152013-09-06 15:45:38 +02005481/* mute tablet speaker pin (0x14) via dock plugging in addition */
5482static void asus_tx300_automute(struct hda_codec *codec)
5483{
5484 struct alc_spec *spec = codec->spec;
5485 snd_hda_gen_update_outputs(codec);
5486 if (snd_hda_jack_detect(codec, 0x1b))
5487 spec->gen.mute_bits |= (1ULL << 0x14);
5488}
5489
5490static void alc282_fixup_asus_tx300(struct hda_codec *codec,
5491 const struct hda_fixup *fix, int action)
5492{
5493 struct alc_spec *spec = codec->spec;
Takashi Iwai7bba2152013-09-06 15:45:38 +02005494 static const struct hda_pintbl dock_pins[] = {
5495 { 0x1b, 0x21114000 }, /* dock speaker pin */
5496 {}
5497 };
Takashi Iwai7bba2152013-09-06 15:45:38 +02005498
5499 switch (action) {
5500 case HDA_FIXUP_ACT_PRE_PROBE:
Takashi Iwai1c76aa52018-06-21 16:37:54 +02005501 spec->init_amp = ALC_INIT_DEFAULT;
Takashi Iwaiae065f12018-06-19 23:00:03 +02005502 /* TX300 needs to set up GPIO2 for the speaker amp */
5503 alc_setup_gpio(codec, 0x04);
Takashi Iwai7bba2152013-09-06 15:45:38 +02005504 snd_hda_apply_pincfgs(codec, dock_pins);
5505 spec->gen.auto_mute_via_amp = 1;
5506 spec->gen.automute_hook = asus_tx300_automute;
5507 snd_hda_jack_detect_enable_callback(codec, 0x1b,
Takashi Iwai7bba2152013-09-06 15:45:38 +02005508 snd_hda_gen_hp_automute);
5509 break;
Takashi Iwai5579cd62018-06-19 22:22:41 +02005510 case HDA_FIXUP_ACT_PROBE:
5511 spec->init_amp = ALC_INIT_DEFAULT;
5512 break;
Takashi Iwai7bba2152013-09-06 15:45:38 +02005513 case HDA_FIXUP_ACT_BUILD:
5514 /* this is a bit tricky; give more sane names for the main
5515 * (tablet) speaker and the dock speaker, respectively
5516 */
Takashi Iwai56798e62017-04-11 08:10:52 +02005517 rename_ctl(codec, "Speaker Playback Switch",
5518 "Dock Speaker Playback Switch");
5519 rename_ctl(codec, "Bass Speaker Playback Switch",
5520 "Speaker Playback Switch");
Takashi Iwai7bba2152013-09-06 15:45:38 +02005521 break;
5522 }
5523}
5524
David Henningsson338cae52013-10-07 10:39:59 +02005525static void alc290_fixup_mono_speakers(struct hda_codec *codec,
5526 const struct hda_fixup *fix, int action)
5527{
David Henningsson0f4881d2013-12-20 16:08:13 +01005528 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5529 /* DAC node 0x03 is giving mono output. We therefore want to
5530 make sure 0x14 (front speaker) and 0x15 (headphones) use the
5531 stereo DAC, while leaving 0x17 (bass speaker) for node 0x03. */
Michał Mirosławcaf3c042020-01-03 10:23:48 +01005532 static const hda_nid_t conn1[] = { 0x0c };
5533 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
5534 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
David Henningsson0f4881d2013-12-20 16:08:13 +01005535 }
David Henningsson338cae52013-10-07 10:39:59 +02005536}
5537
Hui Wangdd9aa332016-08-01 10:20:32 +08005538static void alc298_fixup_speaker_volume(struct hda_codec *codec,
5539 const struct hda_fixup *fix, int action)
5540{
5541 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5542 /* The speaker is routed to the Node 0x06 by a mistake, as a result
5543 we can't adjust the speaker's volume since this node does not has
5544 Amp-out capability. we change the speaker's route to:
5545 Node 0x02 (Audio Output) -> Node 0x0c (Audio Mixer) -> Node 0x17 (
5546 Pin Complex), since Node 0x02 has Amp-out caps, we can adjust
5547 speaker's volume now. */
5548
Michał Mirosławcaf3c042020-01-03 10:23:48 +01005549 static const hda_nid_t conn1[] = { 0x0c };
5550 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn1), conn1);
Hui Wangdd9aa332016-08-01 10:20:32 +08005551 }
5552}
5553
Takashi Iwaie312a862018-03-06 12:14:17 +01005554/* disable DAC3 (0x06) selection on NID 0x17 as it has no volume amp control */
5555static void alc295_fixup_disable_dac3(struct hda_codec *codec,
5556 const struct hda_fixup *fix, int action)
5557{
5558 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Michał Mirosławcaf3c042020-01-03 10:23:48 +01005559 static const hda_nid_t conn[] = { 0x02, 0x03 };
5560 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
Takashi Iwaie312a862018-03-06 12:14:17 +01005561 }
5562}
5563
Jaroslav Kyselad2cd7952019-11-29 15:40:27 +01005564/* force NID 0x17 (Bass Speaker) to DAC1 to share it with the main speaker */
5565static void alc285_fixup_speaker2_to_dac1(struct hda_codec *codec,
5566 const struct hda_fixup *fix, int action)
5567{
5568 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Michał Mirosławcaf3c042020-01-03 10:23:48 +01005569 static const hda_nid_t conn[] = { 0x02 };
5570 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
Jaroslav Kyselad2cd7952019-11-29 15:40:27 +01005571 }
5572}
5573
Keith Packard98973f22015-07-15 12:14:39 -07005574/* Hook to update amp GPIO4 for automute */
5575static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec,
5576 struct hda_jack_callback *jack)
5577{
5578 struct alc_spec *spec = codec->spec;
5579
5580 snd_hda_gen_hp_automute(codec, jack);
5581 /* mute_led_polarity is set to 0, so we pass inverted value here */
5582 alc_update_gpio_led(codec, 0x10, !spec->gen.hp_jack_present);
5583}
5584
5585/* Manage GPIOs for HP EliteBook Folio 9480m.
5586 *
5587 * GPIO4 is the headphone amplifier power control
5588 * GPIO3 is the audio output mute indicator LED
5589 */
5590
5591static void alc280_fixup_hp_9480m(struct hda_codec *codec,
5592 const struct hda_fixup *fix,
5593 int action)
5594{
5595 struct alc_spec *spec = codec->spec;
Keith Packard98973f22015-07-15 12:14:39 -07005596
Takashi Iwai01e4a272018-06-19 22:47:30 +02005597 alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
Keith Packard98973f22015-07-15 12:14:39 -07005598 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai01e4a272018-06-19 22:47:30 +02005599 /* amp at GPIO4; toggled via alc280_hp_gpio4_automute_hook() */
5600 spec->gpio_mask |= 0x10;
5601 spec->gpio_dir |= 0x10;
Keith Packard98973f22015-07-15 12:14:39 -07005602 spec->gen.hp_automute_hook = alc280_hp_gpio4_automute_hook;
Keith Packard98973f22015-07-15 12:14:39 -07005603 }
5604}
5605
Takashi Iwaiae065f12018-06-19 23:00:03 +02005606static void alc275_fixup_gpio4_off(struct hda_codec *codec,
5607 const struct hda_fixup *fix,
5608 int action)
5609{
5610 struct alc_spec *spec = codec->spec;
5611
5612 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5613 spec->gpio_mask |= 0x04;
5614 spec->gpio_dir |= 0x04;
5615 /* set data bit low */
5616 }
5617}
5618
Kailang Yangca169cc2017-04-25 16:17:40 +08005619static void alc233_alc662_fixup_lenovo_dual_codecs(struct hda_codec *codec,
5620 const struct hda_fixup *fix,
5621 int action)
5622{
5623 alc_fixup_dual_codecs(codec, fix, action);
5624 switch (action) {
5625 case HDA_FIXUP_ACT_PRE_PROBE:
5626 /* override card longname to provide a unique UCM profile */
5627 strcpy(codec->card->longname, "HDAudio-Lenovo-DualCodecs");
5628 break;
5629 case HDA_FIXUP_ACT_BUILD:
5630 /* rename Capture controls depending on the codec */
5631 rename_ctl(codec, "Capture Volume",
5632 codec->addr == 0 ?
5633 "Rear-Panel Capture Volume" :
5634 "Front-Panel Capture Volume");
5635 rename_ctl(codec, "Capture Switch",
5636 codec->addr == 0 ?
5637 "Rear-Panel Capture Switch" :
5638 "Front-Panel Capture Switch");
5639 break;
5640 }
5641}
5642
Kailang Yang92266652017-12-14 15:28:58 +08005643/* Forcibly assign NID 0x03 to HP/LO while NID 0x02 to SPK for EQ */
5644static void alc274_fixup_bind_dacs(struct hda_codec *codec,
5645 const struct hda_fixup *fix, int action)
5646{
5647 struct alc_spec *spec = codec->spec;
Michał Mirosławcaf3c042020-01-03 10:23:48 +01005648 static const hda_nid_t preferred_pairs[] = {
Kailang Yang92266652017-12-14 15:28:58 +08005649 0x21, 0x03, 0x1b, 0x03, 0x16, 0x02,
5650 0
5651 };
5652
5653 if (action != HDA_FIXUP_ACT_PRE_PROBE)
5654 return;
5655
5656 spec->gen.preferred_dacs = preferred_pairs;
Kailang Yang0700d3d2019-04-26 16:13:54 +08005657 spec->gen.auto_mute_via_amp = 1;
5658 codec->power_save_node = 0;
Kailang Yang92266652017-12-14 15:28:58 +08005659}
5660
Hui Wangc4cfcf62018-11-26 14:17:16 +08005661/* The DAC of NID 0x3 will introduce click/pop noise on headphones, so invalidate it */
5662static void alc285_fixup_invalidate_dacs(struct hda_codec *codec,
5663 const struct hda_fixup *fix, int action)
5664{
5665 if (action != HDA_FIXUP_ACT_PRE_PROBE)
5666 return;
5667
5668 snd_hda_override_wcaps(codec, 0x03, 0);
5669}
5670
Kailang Yange8547472018-11-28 15:32:45 +08005671static const struct hda_jack_keymap alc_headset_btn_keymap[] = {
5672 { SND_JACK_BTN_0, KEY_PLAYPAUSE },
5673 { SND_JACK_BTN_1, KEY_VOICECOMMAND },
5674 { SND_JACK_BTN_2, KEY_VOLUMEUP },
5675 { SND_JACK_BTN_3, KEY_VOLUMEDOWN },
5676 {}
5677};
5678
5679static void alc_headset_btn_callback(struct hda_codec *codec,
5680 struct hda_jack_callback *jack)
5681{
5682 int report = 0;
5683
5684 if (jack->unsol_res & (7 << 13))
5685 report |= SND_JACK_BTN_0;
5686
5687 if (jack->unsol_res & (1 << 16 | 3 << 8))
5688 report |= SND_JACK_BTN_1;
5689
5690 /* Volume up key */
5691 if (jack->unsol_res & (7 << 23))
5692 report |= SND_JACK_BTN_2;
5693
5694 /* Volume down key */
5695 if (jack->unsol_res & (7 << 10))
5696 report |= SND_JACK_BTN_3;
5697
5698 jack->jack->button_state = report;
5699}
5700
Kailang Yang8983eb62019-04-03 15:31:49 +08005701static void alc_fixup_headset_jack(struct hda_codec *codec,
Kailang Yange8547472018-11-28 15:32:45 +08005702 const struct hda_fixup *fix, int action)
5703{
5704
5705 switch (action) {
5706 case HDA_FIXUP_ACT_PRE_PROBE:
5707 snd_hda_jack_detect_enable_callback(codec, 0x55,
5708 alc_headset_btn_callback);
5709 snd_hda_jack_add_kctl(codec, 0x55, "Headset Jack", false,
5710 SND_JACK_HEADSET, alc_headset_btn_keymap);
5711 break;
5712 case HDA_FIXUP_ACT_INIT:
5713 switch (codec->core.vendor_id) {
Kailang Yang2b3b6492020-02-10 16:15:14 +08005714 case 0x10ec0215:
Kailang Yange8547472018-11-28 15:32:45 +08005715 case 0x10ec0225:
Kailang Yang2b3b6492020-02-10 16:15:14 +08005716 case 0x10ec0285:
Kailang Yange8547472018-11-28 15:32:45 +08005717 case 0x10ec0295:
Kailang Yang2b3b6492020-02-10 16:15:14 +08005718 case 0x10ec0289:
Kailang Yange8547472018-11-28 15:32:45 +08005719 case 0x10ec0299:
5720 alc_write_coef_idx(codec, 0x48, 0xd011);
5721 alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
5722 alc_update_coef_idx(codec, 0x44, 0x007f << 8, 0x0045 << 8);
5723 break;
5724 case 0x10ec0236:
5725 case 0x10ec0256:
5726 alc_write_coef_idx(codec, 0x48, 0xd011);
5727 alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
5728 break;
5729 }
5730 break;
5731 }
5732}
5733
Kailang Yang8983eb62019-04-03 15:31:49 +08005734static void alc295_fixup_chromebook(struct hda_codec *codec,
5735 const struct hda_fixup *fix, int action)
5736{
Kailang Yangd3ba58b2019-05-06 15:09:42 +08005737 struct alc_spec *spec = codec->spec;
5738
Kailang Yang8983eb62019-04-03 15:31:49 +08005739 switch (action) {
Kailang Yangd3ba58b2019-05-06 15:09:42 +08005740 case HDA_FIXUP_ACT_PRE_PROBE:
5741 spec->ultra_low_power = true;
5742 break;
Kailang Yang8983eb62019-04-03 15:31:49 +08005743 case HDA_FIXUP_ACT_INIT:
5744 switch (codec->core.vendor_id) {
5745 case 0x10ec0295:
5746 alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15); /* Reset HP JD */
5747 alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15);
5748 break;
5749 case 0x10ec0236:
5750 alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15); /* Reset HP JD */
5751 alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15);
5752 break;
5753 }
5754 break;
5755 }
5756}
5757
Kailang Yangd1dd4212019-01-09 17:05:24 +08005758static void alc_fixup_disable_mic_vref(struct hda_codec *codec,
5759 const struct hda_fixup *fix, int action)
5760{
5761 if (action == HDA_FIXUP_ACT_PRE_PROBE)
5762 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
5763}
5764
Takashi Iwaib317b032014-01-08 11:44:21 +01005765/* for hda_fixup_thinkpad_acpi() */
5766#include "thinkpad_helper.c"
David Henningssonb67ae3f2013-11-05 13:11:37 +01005767
Takashi Iwaid5a6cab2018-06-13 12:43:10 +02005768static void alc_fixup_thinkpad_acpi(struct hda_codec *codec,
5769 const struct hda_fixup *fix, int action)
5770{
5771 alc_fixup_no_shutup(codec, fix, action); /* reduce click noise */
5772 hda_fixup_thinkpad_acpi(codec, fix, action);
5773}
5774
Tom Bridenbbf8ff62018-05-29 17:34:20 +01005775/* for alc295_fixup_hp_top_speakers */
5776#include "hp_x360_helper.c"
5777
Takashi Iwai1d045db2011-07-07 18:23:21 +02005778enum {
5779 ALC269_FIXUP_SONY_VAIO,
5780 ALC275_FIXUP_SONY_VAIO_GPIO2,
5781 ALC269_FIXUP_DELL_M101Z,
5782 ALC269_FIXUP_SKU_IGNORE,
5783 ALC269_FIXUP_ASUS_G73JW,
5784 ALC269_FIXUP_LENOVO_EAPD,
5785 ALC275_FIXUP_SONY_HWEQ,
Takashi Iwaie9bd7d52014-05-21 11:06:49 +02005786 ALC275_FIXUP_SONY_DISABLE_AAMIX,
Takashi Iwai1d045db2011-07-07 18:23:21 +02005787 ALC271_FIXUP_DMIC,
Takashi Iwai017f2a12011-07-09 14:42:25 +02005788 ALC269_FIXUP_PCM_44K,
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02005789 ALC269_FIXUP_STEREO_DMIC,
David Henningsson7c478f02013-10-11 10:18:46 +02005790 ALC269_FIXUP_HEADSET_MIC,
Takashi Iwai24519912011-08-16 15:08:49 +02005791 ALC269_FIXUP_QUANTA_MUTE,
5792 ALC269_FIXUP_LIFEBOOK,
David Henningsson2041d562014-06-13 11:15:44 +02005793 ALC269_FIXUP_LIFEBOOK_EXTMIC,
Takashi Iwaicc7016a2015-04-08 20:47:55 +02005794 ALC269_FIXUP_LIFEBOOK_HP_PIN,
Takashi Iwai4df3fd12015-06-29 08:38:02 +02005795 ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT,
Jan-Marek Glogowskifdcc9682018-02-14 11:29:15 +01005796 ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC,
Takashi Iwaia4297b52011-08-23 18:40:12 +02005797 ALC269_FIXUP_AMIC,
5798 ALC269_FIXUP_DMIC,
5799 ALC269VB_FIXUP_AMIC,
5800 ALC269VB_FIXUP_DMIC,
Takashi Iwai08fb0d02013-01-10 17:33:58 +01005801 ALC269_FIXUP_HP_MUTE_LED,
David Henningssond06ac142013-02-18 11:41:55 +01005802 ALC269_FIXUP_HP_MUTE_LED_MIC1,
Takashi Iwai08fb0d02013-01-10 17:33:58 +01005803 ALC269_FIXUP_HP_MUTE_LED_MIC2,
Tom Briden7f783bd2017-03-25 10:12:01 +00005804 ALC269_FIXUP_HP_MUTE_LED_MIC3,
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01005805 ALC269_FIXUP_HP_GPIO_LED,
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08005806 ALC269_FIXUP_HP_GPIO_MIC1_LED,
5807 ALC269_FIXUP_HP_LINE1_MIC1_LED,
David Henningsson693b6132012-06-22 19:12:10 +02005808 ALC269_FIXUP_INV_DMIC,
David Henningsson108cc102012-07-20 10:37:25 +02005809 ALC269_FIXUP_LENOVO_DOCK,
Takashi Iwai9b745ab2014-03-07 08:37:19 +01005810 ALC269_FIXUP_NO_SHUTUP,
David Henningsson88cfcf82013-10-11 10:18:45 +02005811 ALC286_FIXUP_SONY_MIC_NO_PRESENCE,
David Henningsson108cc102012-07-20 10:37:25 +02005812 ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
David Henningsson73bdd592013-04-15 15:44:14 +02005813 ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
5814 ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
David Henningsson338cae52013-10-07 10:39:59 +02005815 ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
Kailang Yangfcc6c872017-06-29 15:21:27 +08005816 ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
David Henningsson73bdd592013-04-15 15:44:14 +02005817 ALC269_FIXUP_HEADSET_MODE,
5818 ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
Takashi Iwai78197172015-06-27 10:21:13 +02005819 ALC269_FIXUP_ASPIRE_HEADSET_MIC,
David Henningssond240d1d2013-04-15 12:50:02 +02005820 ALC269_FIXUP_ASUS_X101_FUNC,
5821 ALC269_FIXUP_ASUS_X101_VERB,
5822 ALC269_FIXUP_ASUS_X101,
Dylan Reid08a978d2012-11-18 22:56:40 -08005823 ALC271_FIXUP_AMIC_MIC2,
5824 ALC271_FIXUP_HP_GATE_MIC_JACK,
Oleksij Rempelb1e89722013-12-04 20:50:53 +01005825 ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572,
Dylan Reid42397002013-04-05 14:58:22 -07005826 ALC269_FIXUP_ACER_AC700,
David Henningsson3e0d6112013-04-22 14:30:14 +02005827 ALC269_FIXUP_LIMIT_INT_MIC_BOOST,
Oleksij Rempel2cede302013-11-27 17:12:03 +01005828 ALC269VB_FIXUP_ASUS_ZENBOOK,
Takashi Iwai23870832013-11-29 14:13:12 +01005829 ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A,
David Henningsson8e35cd42013-11-06 11:20:01 +01005830 ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED,
Anisse Astier02b504d2013-06-03 11:53:10 +02005831 ALC269VB_FIXUP_ORDISSIMO_EVE2,
Kailang Yangcd217a62013-08-22 10:15:24 +02005832 ALC283_FIXUP_CHROME_BOOK,
Kailang Yang0202e992013-12-02 15:20:15 +08005833 ALC283_FIXUP_SENSE_COMBO_JACK,
Takashi Iwai7bba2152013-09-06 15:45:38 +02005834 ALC282_FIXUP_ASUS_TX300,
Kailang Yang1bb3e062013-09-27 13:10:25 +02005835 ALC283_FIXUP_INT_MIC,
David Henningsson338cae52013-10-07 10:39:59 +02005836 ALC290_FIXUP_MONO_SPEAKERS,
David Henningsson0f4881d2013-12-20 16:08:13 +01005837 ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
5838 ALC290_FIXUP_SUBWOOFER,
5839 ALC290_FIXUP_SUBWOOFER_HSJACK,
David Henningssonb67ae3f2013-11-05 13:11:37 +01005840 ALC269_FIXUP_THINKPAD_ACPI,
David Henningsson56f27012016-01-11 09:33:14 +01005841 ALC269_FIXUP_DMIC_THINKPAD_ACPI,
Chris Chiu5824ce82017-02-28 14:17:11 -06005842 ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
Chris Chiu615966a2017-02-28 14:17:12 -06005843 ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
Kailang Yang9a22a8f52013-11-08 15:54:49 +08005844 ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Kailang Yang31278992014-03-03 15:27:22 +08005845 ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
Kailang Yang9a22a8f52013-11-08 15:54:49 +08005846 ALC255_FIXUP_HEADSET_MODE,
Kailang Yang31278992014-03-03 15:27:22 +08005847 ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,
Kailang Yanga22aa262014-04-23 17:34:28 +08005848 ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
Takashi Iwai1c37c222014-05-06 17:34:42 +02005849 ALC292_FIXUP_TPT440_DOCK,
Takashi Iwai9a811232015-12-09 15:17:43 +01005850 ALC292_FIXUP_TPT440,
Anisse Astierabaa22742016-08-24 09:14:13 +02005851 ALC283_FIXUP_HEADSET_MIC,
Takashi Iwaib3802782018-11-26 17:47:46 +01005852 ALC255_FIXUP_MIC_MUTE_LED,
Takashi Iwai1a22e772014-08-27 08:19:05 +02005853 ALC282_FIXUP_ASPIRE_V5_PINS,
David Henningsson7a5255f2014-10-30 08:26:01 +01005854 ALC280_FIXUP_HP_GPIO4,
Kailang Yangeaa8e5e2014-11-21 15:49:11 +08005855 ALC286_FIXUP_HP_GPIO_LED,
David Henningsson33f4acd2015-01-07 15:50:13 +01005856 ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY,
TienFu Chenb4b33f92015-01-20 15:06:21 +01005857 ALC280_FIXUP_HP_DOCK_PINS,
Jaroslav Kysela04d54662017-03-09 13:29:13 +01005858 ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED,
Keith Packard98973f22015-07-15 12:14:39 -07005859 ALC280_FIXUP_HP_9480M,
Kailang Yange1e62b92015-04-08 16:01:22 +08005860 ALC288_FIXUP_DELL_HEADSET_MODE,
5861 ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang831bfdf92015-06-26 12:35:17 +08005862 ALC288_FIXUP_DELL_XPS_13,
5863 ALC288_FIXUP_DISABLE_AAMIX,
Takashi Iwai5fab5822020-01-05 09:11:19 +01005864 ALC292_FIXUP_DELL_E7X_AAMIX,
Takashi Iwai8b99aba2015-06-15 11:59:32 +02005865 ALC292_FIXUP_DELL_E7X,
5866 ALC292_FIXUP_DISABLE_AAMIX,
David Henningssonc04017e2015-12-15 14:44:03 +01005867 ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK,
James McDonnell54324222019-09-16 14:53:38 +00005868 ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
Kailang Yang977e6272015-05-18 15:31:20 +08005869 ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang2f726ae2017-03-31 10:31:40 +08005870 ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
Kailang Yang6ed11312015-10-26 15:37:39 +08005871 ALC275_FIXUP_DELL_XPS,
Hui Wang8c697292015-11-24 11:08:18 +08005872 ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE,
Kai-Heng Feng1099f482019-10-03 12:39:19 +08005873 ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE2,
Hui Wang23adc192015-12-08 12:27:18 +08005874 ALC293_FIXUP_LENOVO_SPK_NOISE,
Kailang3694cb22015-12-28 11:35:24 +08005875 ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
Kai-Heng Feng3b43b712016-02-25 15:19:38 +08005876 ALC255_FIXUP_DELL_SPK_NOISE,
Kailang Yangd1dd4212019-01-09 17:05:24 +08005877 ALC225_FIXUP_DISABLE_MIC_VREF,
David Henningsson2ae95572016-02-25 09:37:05 +01005878 ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
Takashi Iwaie312a862018-03-06 12:14:17 +01005879 ALC295_FIXUP_DISABLE_DAC3,
Jaroslav Kyselad2cd7952019-11-29 15:40:27 +01005880 ALC285_FIXUP_SPEAKER2_TO_DAC1,
Takashi Iwaif8839822016-02-25 14:31:59 +01005881 ALC280_FIXUP_HP_HEADSET_MIC,
Hui Wange549d192016-04-01 11:00:15 +08005882 ALC221_FIXUP_HP_FRONT_MIC,
Sven Eckelmannc636b952016-04-11 16:55:26 +02005883 ALC292_FIXUP_TPT460,
Hui Wangdd9aa332016-08-01 10:20:32 +08005884 ALC298_FIXUP_SPK_VOLUME,
Kai-Heng Fengfd06c772016-08-30 15:36:34 +08005885 ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER,
Gabriele Mazzotta823ff162016-12-24 19:50:01 +01005886 ALC269_FIXUP_ATIV_BOOK_8,
Kailang Yang9eb5d0e2017-01-17 15:40:25 +08005887 ALC221_FIXUP_HP_MIC_NO_PRESENCE,
Chris Chiuc1732ed2017-02-28 14:17:13 -06005888 ALC256_FIXUP_ASUS_HEADSET_MODE,
5889 ALC256_FIXUP_ASUS_MIC,
Chris Chiueeed4cd2017-02-28 14:17:15 -06005890 ALC256_FIXUP_ASUS_AIO_GPIO2,
Chris Chiu216d7ae2017-02-28 14:17:14 -06005891 ALC233_FIXUP_ASUS_MIC_NO_PRESENCE,
5892 ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE,
Kailang Yangca169cc2017-04-25 16:17:40 +08005893 ALC233_FIXUP_LENOVO_MULTI_CODECS,
Jian-Hong Panea5c7eb2019-04-01 11:25:05 +08005894 ALC233_FIXUP_ACER_HEADSET_MIC,
Hui Wangf33f79f2017-07-07 12:08:29 +08005895 ALC294_FIXUP_LENOVO_MIC_LOCATION,
Kailang Yang5f364132017-07-25 16:28:16 +08005896 ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE,
PeiSen Houb84e8432017-09-01 15:11:56 +08005897 ALC700_FIXUP_INTEL_REFERENCE,
Kailang Yang92266652017-12-14 15:28:58 +08005898 ALC274_FIXUP_DELL_BIND_DACS,
5899 ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
Kailang Yang61fcf8e2018-02-02 15:26:46 +08005900 ALC298_FIXUP_TPT470_DOCK,
Kailang Yangae104a22018-02-05 16:07:20 +08005901 ALC255_FIXUP_DUMMY_LINEOUT_VERB,
Kailang Yangf0ba9d62018-03-16 11:46:08 +08005902 ALC255_FIXUP_DELL_HEADSET_MIC,
Ayman Bagabas0fbf21c2019-05-23 05:30:11 -04005903 ALC256_FIXUP_HUAWEI_MACH_WX9_PINS,
Tomas Espeletaa2ef03f2019-08-09 16:37:54 +02005904 ALC298_FIXUP_HUAWEI_MBX_STEREO,
Tom Bridenbbf8ff62018-05-29 17:34:20 +01005905 ALC295_FIXUP_HP_X360,
Kailang Yang8a328ac2018-08-21 16:54:41 +08005906 ALC221_FIXUP_HP_HEADSET_MIC,
Hui Wangc4cfcf62018-11-26 14:17:16 +08005907 ALC285_FIXUP_LENOVO_HEADPHONE_NOISE,
Girija Kumar Kasinadhunie8ed64b2018-11-26 13:40:46 -05005908 ALC295_FIXUP_HP_AUTO_MUTE,
Chris Chiu33aaebd2018-12-05 14:48:53 +08005909 ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
Chris Chiud8ae4582018-12-07 17:17:11 +08005910 ALC294_FIXUP_ASUS_MIC,
Jian-Hong Pan4e051102018-12-07 17:17:12 +08005911 ALC294_FIXUP_ASUS_HEADSET_MIC,
5912 ALC294_FIXUP_ASUS_SPK,
Jeremy Soller89e3a562019-01-30 16:12:31 -07005913 ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
Hui Wangc8c6ee62019-02-14 11:41:33 +08005914 ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
Jian-Hong Pancbc05fd2019-03-13 17:33:24 +08005915 ALC255_FIXUP_ACER_HEADSET_MIC,
Kailang Yang10f5b1b2019-02-21 16:10:22 +08005916 ALC295_FIXUP_CHROME_BOOK,
Kailang Yang8983eb62019-04-03 15:31:49 +08005917 ALC225_FIXUP_HEADSET_JACK,
Kailang Yang136824e2019-03-14 16:22:45 +08005918 ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE,
5919 ALC225_FIXUP_WYSE_AUTO_MUTE,
5920 ALC225_FIXUP_WYSE_DISABLE_MIC_VREF,
Jian-Hong Pan667a8f72019-03-15 17:51:09 +08005921 ALC286_FIXUP_ACER_AIO_HEADSET_MIC,
Daniel Drake8c8967a2019-10-17 16:15:01 +08005922 ALC256_FIXUP_ASUS_HEADSET_MIC,
Jian-Hong Pane1037352019-03-22 11:37:18 +08005923 ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
Bernhard Rosenkraenzere2a829b2019-03-05 00:38:19 +01005924 ALC299_FIXUP_PREDATOR_SPK,
Jan-Marek Glogowskibd9c10b2019-09-15 16:57:28 +02005925 ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE,
Kailang Yange79c2262019-12-19 14:12:15 +08005926 ALC289_FIXUP_DELL_SPK2,
5927 ALC289_FIXUP_DUAL_SPK,
Chris Chiu48e01502019-12-30 11:11:18 +08005928 ALC294_FIXUP_SPK2_TO_DAC1,
5929 ALC294_FIXUP_ASUS_DUAL_SPK,
Kailang Yang76f7dec2020-02-10 16:30:26 +08005930 ALC285_FIXUP_THINKPAD_HEADSET_JACK,
Jian-Hong Pan8b33a132020-02-25 15:29:21 +08005931 ALC294_FIXUP_ASUS_HPE,
Kai-Heng Fengf5a88b02020-03-27 12:46:25 +08005932 ALC285_FIXUP_HP_GPIO_LED,
Takashi Iwai1d045db2011-07-07 18:23:21 +02005933};
5934
Takashi Iwai1727a772013-01-10 09:52:52 +01005935static const struct hda_fixup alc269_fixups[] = {
Takashi Iwai1d045db2011-07-07 18:23:21 +02005936 [ALC269_FIXUP_SONY_VAIO] = {
Takashi Iwaifd108212013-01-10 10:18:14 +01005937 .type = HDA_FIXUP_PINCTLS,
5938 .v.pins = (const struct hda_pintbl[]) {
5939 {0x19, PIN_VREFGRD},
Takashi Iwai1d045db2011-07-07 18:23:21 +02005940 {}
5941 }
5942 },
5943 [ALC275_FIXUP_SONY_VAIO_GPIO2] = {
Takashi Iwaiae065f12018-06-19 23:00:03 +02005944 .type = HDA_FIXUP_FUNC,
5945 .v.func = alc275_fixup_gpio4_off,
Takashi Iwai1d045db2011-07-07 18:23:21 +02005946 .chained = true,
5947 .chain_id = ALC269_FIXUP_SONY_VAIO
5948 },
5949 [ALC269_FIXUP_DELL_M101Z] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01005950 .type = HDA_FIXUP_VERBS,
Takashi Iwai1d045db2011-07-07 18:23:21 +02005951 .v.verbs = (const struct hda_verb[]) {
5952 /* Enables internal speaker */
5953 {0x20, AC_VERB_SET_COEF_INDEX, 13},
5954 {0x20, AC_VERB_SET_PROC_COEF, 0x4040},
5955 {}
5956 }
5957 },
5958 [ALC269_FIXUP_SKU_IGNORE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01005959 .type = HDA_FIXUP_FUNC,
Takashi Iwai23d30f22012-05-07 17:17:32 +02005960 .v.func = alc_fixup_sku_ignore,
Takashi Iwai1d045db2011-07-07 18:23:21 +02005961 },
5962 [ALC269_FIXUP_ASUS_G73JW] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01005963 .type = HDA_FIXUP_PINS,
5964 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02005965 { 0x17, 0x99130111 }, /* subwoofer */
5966 { }
5967 }
5968 },
5969 [ALC269_FIXUP_LENOVO_EAPD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01005970 .type = HDA_FIXUP_VERBS,
Takashi Iwai1d045db2011-07-07 18:23:21 +02005971 .v.verbs = (const struct hda_verb[]) {
5972 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
5973 {}
5974 }
5975 },
5976 [ALC275_FIXUP_SONY_HWEQ] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01005977 .type = HDA_FIXUP_FUNC,
Takashi Iwai1d045db2011-07-07 18:23:21 +02005978 .v.func = alc269_fixup_hweq,
5979 .chained = true,
5980 .chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
5981 },
Takashi Iwaie9bd7d52014-05-21 11:06:49 +02005982 [ALC275_FIXUP_SONY_DISABLE_AAMIX] = {
5983 .type = HDA_FIXUP_FUNC,
5984 .v.func = alc_fixup_disable_aamix,
5985 .chained = true,
5986 .chain_id = ALC269_FIXUP_SONY_VAIO
5987 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02005988 [ALC271_FIXUP_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01005989 .type = HDA_FIXUP_FUNC,
Takashi Iwai1d045db2011-07-07 18:23:21 +02005990 .v.func = alc271_fixup_dmic,
5991 },
Takashi Iwai017f2a12011-07-09 14:42:25 +02005992 [ALC269_FIXUP_PCM_44K] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01005993 .type = HDA_FIXUP_FUNC,
Takashi Iwai017f2a12011-07-09 14:42:25 +02005994 .v.func = alc269_fixup_pcm_44k,
David Henningsson012e7eb2012-08-08 08:43:37 +02005995 .chained = true,
5996 .chain_id = ALC269_FIXUP_QUANTA_MUTE
Takashi Iwai017f2a12011-07-09 14:42:25 +02005997 },
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02005998 [ALC269_FIXUP_STEREO_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01005999 .type = HDA_FIXUP_FUNC,
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02006000 .v.func = alc269_fixup_stereo_dmic,
6001 },
David Henningsson7c478f02013-10-11 10:18:46 +02006002 [ALC269_FIXUP_HEADSET_MIC] = {
6003 .type = HDA_FIXUP_FUNC,
6004 .v.func = alc269_fixup_headset_mic,
6005 },
Takashi Iwai24519912011-08-16 15:08:49 +02006006 [ALC269_FIXUP_QUANTA_MUTE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006007 .type = HDA_FIXUP_FUNC,
Takashi Iwai24519912011-08-16 15:08:49 +02006008 .v.func = alc269_fixup_quanta_mute,
6009 },
6010 [ALC269_FIXUP_LIFEBOOK] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006011 .type = HDA_FIXUP_PINS,
6012 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai24519912011-08-16 15:08:49 +02006013 { 0x1a, 0x2101103f }, /* dock line-out */
6014 { 0x1b, 0x23a11040 }, /* dock mic-in */
6015 { }
6016 },
6017 .chained = true,
6018 .chain_id = ALC269_FIXUP_QUANTA_MUTE
6019 },
David Henningsson2041d562014-06-13 11:15:44 +02006020 [ALC269_FIXUP_LIFEBOOK_EXTMIC] = {
6021 .type = HDA_FIXUP_PINS,
6022 .v.pins = (const struct hda_pintbl[]) {
6023 { 0x19, 0x01a1903c }, /* headset mic, with jack detect */
6024 { }
6025 },
6026 },
Takashi Iwaicc7016a2015-04-08 20:47:55 +02006027 [ALC269_FIXUP_LIFEBOOK_HP_PIN] = {
6028 .type = HDA_FIXUP_PINS,
6029 .v.pins = (const struct hda_pintbl[]) {
6030 { 0x21, 0x0221102f }, /* HP out */
6031 { }
6032 },
6033 },
Takashi Iwai4df3fd12015-06-29 08:38:02 +02006034 [ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT] = {
6035 .type = HDA_FIXUP_FUNC,
6036 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
6037 },
Jan-Marek Glogowskifdcc9682018-02-14 11:29:15 +01006038 [ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC] = {
6039 .type = HDA_FIXUP_FUNC,
6040 .v.func = alc269_fixup_pincfg_U7x7_headset_mic,
6041 },
Takashi Iwaia4297b52011-08-23 18:40:12 +02006042 [ALC269_FIXUP_AMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006043 .type = HDA_FIXUP_PINS,
6044 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaia4297b52011-08-23 18:40:12 +02006045 { 0x14, 0x99130110 }, /* speaker */
6046 { 0x15, 0x0121401f }, /* HP out */
6047 { 0x18, 0x01a19c20 }, /* mic */
6048 { 0x19, 0x99a3092f }, /* int-mic */
6049 { }
6050 },
6051 },
6052 [ALC269_FIXUP_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006053 .type = HDA_FIXUP_PINS,
6054 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaia4297b52011-08-23 18:40:12 +02006055 { 0x12, 0x99a3092f }, /* int-mic */
6056 { 0x14, 0x99130110 }, /* speaker */
6057 { 0x15, 0x0121401f }, /* HP out */
6058 { 0x18, 0x01a19c20 }, /* mic */
6059 { }
6060 },
6061 },
6062 [ALC269VB_FIXUP_AMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006063 .type = HDA_FIXUP_PINS,
6064 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaia4297b52011-08-23 18:40:12 +02006065 { 0x14, 0x99130110 }, /* speaker */
6066 { 0x18, 0x01a19c20 }, /* mic */
6067 { 0x19, 0x99a3092f }, /* int-mic */
6068 { 0x21, 0x0121401f }, /* HP out */
6069 { }
6070 },
6071 },
David Henningsson2267ea92012-01-03 08:45:56 +01006072 [ALC269VB_FIXUP_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006073 .type = HDA_FIXUP_PINS,
6074 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaia4297b52011-08-23 18:40:12 +02006075 { 0x12, 0x99a3092f }, /* int-mic */
6076 { 0x14, 0x99130110 }, /* speaker */
6077 { 0x18, 0x01a19c20 }, /* mic */
6078 { 0x21, 0x0121401f }, /* HP out */
6079 { }
6080 },
6081 },
Takashi Iwai08fb0d02013-01-10 17:33:58 +01006082 [ALC269_FIXUP_HP_MUTE_LED] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006083 .type = HDA_FIXUP_FUNC,
Takashi Iwai08fb0d02013-01-10 17:33:58 +01006084 .v.func = alc269_fixup_hp_mute_led,
David Henningsson6d3cd5d2013-01-07 12:03:47 +01006085 },
David Henningssond06ac142013-02-18 11:41:55 +01006086 [ALC269_FIXUP_HP_MUTE_LED_MIC1] = {
6087 .type = HDA_FIXUP_FUNC,
6088 .v.func = alc269_fixup_hp_mute_led_mic1,
6089 },
Takashi Iwai08fb0d02013-01-10 17:33:58 +01006090 [ALC269_FIXUP_HP_MUTE_LED_MIC2] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006091 .type = HDA_FIXUP_FUNC,
Takashi Iwai08fb0d02013-01-10 17:33:58 +01006092 .v.func = alc269_fixup_hp_mute_led_mic2,
Takashi Iwai420b0fe2012-03-12 12:35:27 +01006093 },
Tom Briden7f783bd2017-03-25 10:12:01 +00006094 [ALC269_FIXUP_HP_MUTE_LED_MIC3] = {
6095 .type = HDA_FIXUP_FUNC,
6096 .v.func = alc269_fixup_hp_mute_led_mic3,
Girija Kumar Kasinadhunie8ed64b2018-11-26 13:40:46 -05006097 .chained = true,
6098 .chain_id = ALC295_FIXUP_HP_AUTO_MUTE
Tom Briden7f783bd2017-03-25 10:12:01 +00006099 },
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01006100 [ALC269_FIXUP_HP_GPIO_LED] = {
6101 .type = HDA_FIXUP_FUNC,
6102 .v.func = alc269_fixup_hp_gpio_led,
6103 },
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08006104 [ALC269_FIXUP_HP_GPIO_MIC1_LED] = {
6105 .type = HDA_FIXUP_FUNC,
6106 .v.func = alc269_fixup_hp_gpio_mic1_led,
6107 },
6108 [ALC269_FIXUP_HP_LINE1_MIC1_LED] = {
6109 .type = HDA_FIXUP_FUNC,
6110 .v.func = alc269_fixup_hp_line1_mic1_led,
6111 },
David Henningsson693b6132012-06-22 19:12:10 +02006112 [ALC269_FIXUP_INV_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006113 .type = HDA_FIXUP_FUNC,
David Henningsson9d36a7d2014-10-07 10:18:42 +02006114 .v.func = alc_fixup_inv_dmic,
David Henningsson693b6132012-06-22 19:12:10 +02006115 },
Takashi Iwai9b745ab2014-03-07 08:37:19 +01006116 [ALC269_FIXUP_NO_SHUTUP] = {
6117 .type = HDA_FIXUP_FUNC,
6118 .v.func = alc_fixup_no_shutup,
6119 },
David Henningsson108cc102012-07-20 10:37:25 +02006120 [ALC269_FIXUP_LENOVO_DOCK] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006121 .type = HDA_FIXUP_PINS,
6122 .v.pins = (const struct hda_pintbl[]) {
David Henningsson108cc102012-07-20 10:37:25 +02006123 { 0x19, 0x23a11040 }, /* dock mic */
6124 { 0x1b, 0x2121103f }, /* dock headphone */
6125 { }
6126 },
6127 .chained = true,
6128 .chain_id = ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT
6129 },
6130 [ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006131 .type = HDA_FIXUP_FUNC,
David Henningsson108cc102012-07-20 10:37:25 +02006132 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
David Henningsson52129002013-11-19 10:25:53 +01006133 .chained = true,
6134 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
David Henningsson108cc102012-07-20 10:37:25 +02006135 },
David Henningsson73bdd592013-04-15 15:44:14 +02006136 [ALC269_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6137 .type = HDA_FIXUP_PINS,
6138 .v.pins = (const struct hda_pintbl[]) {
6139 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6140 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6141 { }
6142 },
6143 .chained = true,
6144 .chain_id = ALC269_FIXUP_HEADSET_MODE
6145 },
6146 [ALC269_FIXUP_DELL2_MIC_NO_PRESENCE] = {
6147 .type = HDA_FIXUP_PINS,
6148 .v.pins = (const struct hda_pintbl[]) {
6149 { 0x16, 0x21014020 }, /* dock line out */
6150 { 0x19, 0x21a19030 }, /* dock mic */
6151 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6152 { }
6153 },
6154 .chained = true,
6155 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
6156 },
David Henningsson338cae52013-10-07 10:39:59 +02006157 [ALC269_FIXUP_DELL3_MIC_NO_PRESENCE] = {
6158 .type = HDA_FIXUP_PINS,
6159 .v.pins = (const struct hda_pintbl[]) {
6160 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6161 { }
6162 },
6163 .chained = true,
6164 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
6165 },
Kailang Yangfcc6c872017-06-29 15:21:27 +08006166 [ALC269_FIXUP_DELL4_MIC_NO_PRESENCE] = {
6167 .type = HDA_FIXUP_PINS,
6168 .v.pins = (const struct hda_pintbl[]) {
6169 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6170 { 0x1b, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6171 { }
6172 },
6173 .chained = true,
6174 .chain_id = ALC269_FIXUP_HEADSET_MODE
6175 },
David Henningsson73bdd592013-04-15 15:44:14 +02006176 [ALC269_FIXUP_HEADSET_MODE] = {
6177 .type = HDA_FIXUP_FUNC,
6178 .v.func = alc_fixup_headset_mode,
Hui Wang6676f302014-11-18 17:57:41 +08006179 .chained = true,
Takashi Iwaib3802782018-11-26 17:47:46 +01006180 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
David Henningsson73bdd592013-04-15 15:44:14 +02006181 },
6182 [ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
6183 .type = HDA_FIXUP_FUNC,
6184 .v.func = alc_fixup_headset_mode_no_hp_mic,
6185 },
Takashi Iwai78197172015-06-27 10:21:13 +02006186 [ALC269_FIXUP_ASPIRE_HEADSET_MIC] = {
6187 .type = HDA_FIXUP_PINS,
6188 .v.pins = (const struct hda_pintbl[]) {
6189 { 0x19, 0x01a1913c }, /* headset mic w/o jack detect */
6190 { }
6191 },
6192 .chained = true,
6193 .chain_id = ALC269_FIXUP_HEADSET_MODE,
6194 },
David Henningsson88cfcf82013-10-11 10:18:45 +02006195 [ALC286_FIXUP_SONY_MIC_NO_PRESENCE] = {
6196 .type = HDA_FIXUP_PINS,
6197 .v.pins = (const struct hda_pintbl[]) {
6198 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6199 { }
6200 },
David Henningssonfbc78ad2013-10-11 13:46:04 +02006201 .chained = true,
6202 .chain_id = ALC269_FIXUP_HEADSET_MIC
David Henningsson88cfcf82013-10-11 10:18:45 +02006203 },
Ayman Bagabas0fbf21c2019-05-23 05:30:11 -04006204 [ALC256_FIXUP_HUAWEI_MACH_WX9_PINS] = {
Ayman Bagabas8ac51bb2018-12-12 18:07:57 -05006205 .type = HDA_FIXUP_PINS,
6206 .v.pins = (const struct hda_pintbl[]) {
6207 {0x12, 0x90a60130},
6208 {0x13, 0x40000000},
6209 {0x14, 0x90170110},
6210 {0x18, 0x411111f0},
6211 {0x19, 0x04a11040},
6212 {0x1a, 0x411111f0},
6213 {0x1b, 0x90170112},
6214 {0x1d, 0x40759a05},
6215 {0x1e, 0x411111f0},
6216 {0x21, 0x04211020},
6217 { }
6218 },
Ayman Bagabase2744fd2018-12-12 18:07:59 -05006219 .chained = true,
6220 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
Ayman Bagabas8ac51bb2018-12-12 18:07:57 -05006221 },
Tomas Espeletaa2ef03f2019-08-09 16:37:54 +02006222 [ALC298_FIXUP_HUAWEI_MBX_STEREO] = {
6223 .type = HDA_FIXUP_FUNC,
6224 .v.func = alc298_fixup_huawei_mbx_stereo,
6225 .chained = true,
6226 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
6227 },
David Henningssond240d1d2013-04-15 12:50:02 +02006228 [ALC269_FIXUP_ASUS_X101_FUNC] = {
6229 .type = HDA_FIXUP_FUNC,
6230 .v.func = alc269_fixup_x101_headset_mic,
6231 },
6232 [ALC269_FIXUP_ASUS_X101_VERB] = {
6233 .type = HDA_FIXUP_VERBS,
6234 .v.verbs = (const struct hda_verb[]) {
6235 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6236 {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
6237 {0x20, AC_VERB_SET_PROC_COEF, 0x0310},
6238 { }
6239 },
6240 .chained = true,
6241 .chain_id = ALC269_FIXUP_ASUS_X101_FUNC
6242 },
6243 [ALC269_FIXUP_ASUS_X101] = {
6244 .type = HDA_FIXUP_PINS,
6245 .v.pins = (const struct hda_pintbl[]) {
6246 { 0x18, 0x04a1182c }, /* Headset mic */
6247 { }
6248 },
6249 .chained = true,
6250 .chain_id = ALC269_FIXUP_ASUS_X101_VERB
6251 },
Dylan Reid08a978d2012-11-18 22:56:40 -08006252 [ALC271_FIXUP_AMIC_MIC2] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006253 .type = HDA_FIXUP_PINS,
6254 .v.pins = (const struct hda_pintbl[]) {
Dylan Reid08a978d2012-11-18 22:56:40 -08006255 { 0x14, 0x99130110 }, /* speaker */
6256 { 0x19, 0x01a19c20 }, /* mic */
6257 { 0x1b, 0x99a7012f }, /* int-mic */
6258 { 0x21, 0x0121401f }, /* HP out */
6259 { }
6260 },
6261 },
6262 [ALC271_FIXUP_HP_GATE_MIC_JACK] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006263 .type = HDA_FIXUP_FUNC,
Dylan Reid08a978d2012-11-18 22:56:40 -08006264 .v.func = alc271_hp_gate_mic_jack,
6265 .chained = true,
6266 .chain_id = ALC271_FIXUP_AMIC_MIC2,
6267 },
Oleksij Rempelb1e89722013-12-04 20:50:53 +01006268 [ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572] = {
6269 .type = HDA_FIXUP_FUNC,
6270 .v.func = alc269_fixup_limit_int_mic_boost,
6271 .chained = true,
6272 .chain_id = ALC271_FIXUP_HP_GATE_MIC_JACK,
6273 },
Dylan Reid42397002013-04-05 14:58:22 -07006274 [ALC269_FIXUP_ACER_AC700] = {
6275 .type = HDA_FIXUP_PINS,
6276 .v.pins = (const struct hda_pintbl[]) {
6277 { 0x12, 0x99a3092f }, /* int-mic */
6278 { 0x14, 0x99130110 }, /* speaker */
6279 { 0x18, 0x03a11c20 }, /* mic */
6280 { 0x1e, 0x0346101e }, /* SPDIF1 */
6281 { 0x21, 0x0321101f }, /* HP out */
6282 { }
6283 },
6284 .chained = true,
6285 .chain_id = ALC271_FIXUP_DMIC,
6286 },
David Henningsson3e0d6112013-04-22 14:30:14 +02006287 [ALC269_FIXUP_LIMIT_INT_MIC_BOOST] = {
6288 .type = HDA_FIXUP_FUNC,
6289 .v.func = alc269_fixup_limit_int_mic_boost,
David Henningsson27937692013-11-18 11:51:47 +01006290 .chained = true,
6291 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
David Henningsson3e0d6112013-04-22 14:30:14 +02006292 },
Oleksij Rempel2cede302013-11-27 17:12:03 +01006293 [ALC269VB_FIXUP_ASUS_ZENBOOK] = {
6294 .type = HDA_FIXUP_FUNC,
6295 .v.func = alc269_fixup_limit_int_mic_boost,
6296 .chained = true,
6297 .chain_id = ALC269VB_FIXUP_DMIC,
6298 },
Takashi Iwai23870832013-11-29 14:13:12 +01006299 [ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A] = {
6300 .type = HDA_FIXUP_VERBS,
6301 .v.verbs = (const struct hda_verb[]) {
6302 /* class-D output amp +5dB */
6303 { 0x20, AC_VERB_SET_COEF_INDEX, 0x12 },
6304 { 0x20, AC_VERB_SET_PROC_COEF, 0x2800 },
6305 {}
6306 },
6307 .chained = true,
6308 .chain_id = ALC269VB_FIXUP_ASUS_ZENBOOK,
6309 },
David Henningsson8e35cd42013-11-06 11:20:01 +01006310 [ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED] = {
6311 .type = HDA_FIXUP_FUNC,
6312 .v.func = alc269_fixup_limit_int_mic_boost,
6313 .chained = true,
6314 .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC1,
6315 },
Anisse Astier02b504d2013-06-03 11:53:10 +02006316 [ALC269VB_FIXUP_ORDISSIMO_EVE2] = {
6317 .type = HDA_FIXUP_PINS,
6318 .v.pins = (const struct hda_pintbl[]) {
6319 { 0x12, 0x99a3092f }, /* int-mic */
6320 { 0x18, 0x03a11d20 }, /* mic */
6321 { 0x19, 0x411111f0 }, /* Unused bogus pin */
6322 { }
6323 },
6324 },
Kailang Yangcd217a62013-08-22 10:15:24 +02006325 [ALC283_FIXUP_CHROME_BOOK] = {
6326 .type = HDA_FIXUP_FUNC,
6327 .v.func = alc283_fixup_chromebook,
6328 },
Kailang Yang0202e992013-12-02 15:20:15 +08006329 [ALC283_FIXUP_SENSE_COMBO_JACK] = {
6330 .type = HDA_FIXUP_FUNC,
6331 .v.func = alc283_fixup_sense_combo_jack,
6332 .chained = true,
6333 .chain_id = ALC283_FIXUP_CHROME_BOOK,
6334 },
Takashi Iwai7bba2152013-09-06 15:45:38 +02006335 [ALC282_FIXUP_ASUS_TX300] = {
6336 .type = HDA_FIXUP_FUNC,
6337 .v.func = alc282_fixup_asus_tx300,
6338 },
Kailang Yang1bb3e062013-09-27 13:10:25 +02006339 [ALC283_FIXUP_INT_MIC] = {
6340 .type = HDA_FIXUP_VERBS,
6341 .v.verbs = (const struct hda_verb[]) {
6342 {0x20, AC_VERB_SET_COEF_INDEX, 0x1a},
6343 {0x20, AC_VERB_SET_PROC_COEF, 0x0011},
6344 { }
6345 },
6346 .chained = true,
6347 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
6348 },
David Henningsson0f4881d2013-12-20 16:08:13 +01006349 [ALC290_FIXUP_SUBWOOFER_HSJACK] = {
6350 .type = HDA_FIXUP_PINS,
6351 .v.pins = (const struct hda_pintbl[]) {
6352 { 0x17, 0x90170112 }, /* subwoofer */
6353 { }
6354 },
6355 .chained = true,
6356 .chain_id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
6357 },
6358 [ALC290_FIXUP_SUBWOOFER] = {
6359 .type = HDA_FIXUP_PINS,
6360 .v.pins = (const struct hda_pintbl[]) {
6361 { 0x17, 0x90170112 }, /* subwoofer */
6362 { }
6363 },
6364 .chained = true,
6365 .chain_id = ALC290_FIXUP_MONO_SPEAKERS,
6366 },
David Henningsson338cae52013-10-07 10:39:59 +02006367 [ALC290_FIXUP_MONO_SPEAKERS] = {
6368 .type = HDA_FIXUP_FUNC,
6369 .v.func = alc290_fixup_mono_speakers,
David Henningsson0f4881d2013-12-20 16:08:13 +01006370 },
6371 [ALC290_FIXUP_MONO_SPEAKERS_HSJACK] = {
6372 .type = HDA_FIXUP_FUNC,
6373 .v.func = alc290_fixup_mono_speakers,
David Henningsson338cae52013-10-07 10:39:59 +02006374 .chained = true,
6375 .chain_id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
6376 },
David Henningssonb67ae3f2013-11-05 13:11:37 +01006377 [ALC269_FIXUP_THINKPAD_ACPI] = {
6378 .type = HDA_FIXUP_FUNC,
Takashi Iwaid5a6cab2018-06-13 12:43:10 +02006379 .v.func = alc_fixup_thinkpad_acpi,
Takashi Iwai09da1112016-09-08 12:15:02 +02006380 .chained = true,
6381 .chain_id = ALC269_FIXUP_SKU_IGNORE,
David Henningssonb67ae3f2013-11-05 13:11:37 +01006382 },
David Henningsson56f27012016-01-11 09:33:14 +01006383 [ALC269_FIXUP_DMIC_THINKPAD_ACPI] = {
6384 .type = HDA_FIXUP_FUNC,
6385 .v.func = alc_fixup_inv_dmic,
6386 .chained = true,
6387 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
6388 },
Chris Chiu5824ce82017-02-28 14:17:11 -06006389 [ALC255_FIXUP_ACER_MIC_NO_PRESENCE] = {
Hui Wang17d30462019-06-14 16:44:12 +08006390 .type = HDA_FIXUP_PINS,
6391 .v.pins = (const struct hda_pintbl[]) {
6392 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6393 { }
Chris Chiu5824ce82017-02-28 14:17:11 -06006394 },
6395 .chained = true,
Hui Wang17d30462019-06-14 16:44:12 +08006396 .chain_id = ALC255_FIXUP_HEADSET_MODE
Chris Chiu5824ce82017-02-28 14:17:11 -06006397 },
Chris Chiu615966a2017-02-28 14:17:12 -06006398 [ALC255_FIXUP_ASUS_MIC_NO_PRESENCE] = {
6399 .type = HDA_FIXUP_PINS,
6400 .v.pins = (const struct hda_pintbl[]) {
6401 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6402 { }
6403 },
6404 .chained = true,
6405 .chain_id = ALC255_FIXUP_HEADSET_MODE
6406 },
Kailang Yang9a22a8f52013-11-08 15:54:49 +08006407 [ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6408 .type = HDA_FIXUP_PINS,
6409 .v.pins = (const struct hda_pintbl[]) {
6410 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6411 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6412 { }
6413 },
6414 .chained = true,
6415 .chain_id = ALC255_FIXUP_HEADSET_MODE
6416 },
Kailang Yang31278992014-03-03 15:27:22 +08006417 [ALC255_FIXUP_DELL2_MIC_NO_PRESENCE] = {
6418 .type = HDA_FIXUP_PINS,
6419 .v.pins = (const struct hda_pintbl[]) {
6420 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6421 { }
6422 },
6423 .chained = true,
6424 .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
6425 },
Kailang Yang9a22a8f52013-11-08 15:54:49 +08006426 [ALC255_FIXUP_HEADSET_MODE] = {
6427 .type = HDA_FIXUP_FUNC,
6428 .v.func = alc_fixup_headset_mode_alc255,
Hui Wang4a83d422014-11-18 17:57:40 +08006429 .chained = true,
Takashi Iwaib3802782018-11-26 17:47:46 +01006430 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
Kailang Yang9a22a8f52013-11-08 15:54:49 +08006431 },
Kailang Yang31278992014-03-03 15:27:22 +08006432 [ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
6433 .type = HDA_FIXUP_FUNC,
6434 .v.func = alc_fixup_headset_mode_alc255_no_hp_mic,
6435 },
Kailang Yanga22aa262014-04-23 17:34:28 +08006436 [ALC293_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6437 .type = HDA_FIXUP_PINS,
6438 .v.pins = (const struct hda_pintbl[]) {
6439 { 0x18, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6440 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6441 { }
6442 },
6443 .chained = true,
6444 .chain_id = ALC269_FIXUP_HEADSET_MODE
6445 },
Takashi Iwai1c37c222014-05-06 17:34:42 +02006446 [ALC292_FIXUP_TPT440_DOCK] = {
David Henningssonec56af62015-06-24 10:46:33 +02006447 .type = HDA_FIXUP_FUNC,
Takashi Iwai7f57d802015-09-24 17:36:51 +02006448 .v.func = alc_fixup_tpt440_dock,
Takashi Iwai1c37c222014-05-06 17:34:42 +02006449 .chained = true,
6450 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
6451 },
Takashi Iwai9a811232015-12-09 15:17:43 +01006452 [ALC292_FIXUP_TPT440] = {
6453 .type = HDA_FIXUP_FUNC,
Takashi Iwai157f0b72015-12-10 23:30:43 +01006454 .v.func = alc_fixup_disable_aamix,
Takashi Iwai9a811232015-12-09 15:17:43 +01006455 .chained = true,
6456 .chain_id = ALC292_FIXUP_TPT440_DOCK,
6457 },
Anisse Astierabaa22742016-08-24 09:14:13 +02006458 [ALC283_FIXUP_HEADSET_MIC] = {
Daniel Drake9dc12862014-07-22 10:58:29 +01006459 .type = HDA_FIXUP_PINS,
6460 .v.pins = (const struct hda_pintbl[]) {
6461 { 0x19, 0x04a110f0 },
6462 { },
6463 },
6464 },
Takashi Iwaib3802782018-11-26 17:47:46 +01006465 [ALC255_FIXUP_MIC_MUTE_LED] = {
Hui Wang00ef9942014-07-31 11:52:38 +08006466 .type = HDA_FIXUP_FUNC,
Takashi Iwaib3802782018-11-26 17:47:46 +01006467 .v.func = snd_hda_gen_fixup_micmute_led,
Hui Wang00ef9942014-07-31 11:52:38 +08006468 },
Takashi Iwai1a22e772014-08-27 08:19:05 +02006469 [ALC282_FIXUP_ASPIRE_V5_PINS] = {
6470 .type = HDA_FIXUP_PINS,
6471 .v.pins = (const struct hda_pintbl[]) {
6472 { 0x12, 0x90a60130 },
6473 { 0x14, 0x90170110 },
6474 { 0x17, 0x40000008 },
6475 { 0x18, 0x411111f0 },
Mateusz Sylwestrzak04206942015-07-19 17:38:56 +02006476 { 0x19, 0x01a1913c },
Takashi Iwai1a22e772014-08-27 08:19:05 +02006477 { 0x1a, 0x411111f0 },
6478 { 0x1b, 0x411111f0 },
6479 { 0x1d, 0x40f89b2d },
6480 { 0x1e, 0x411111f0 },
6481 { 0x21, 0x0321101f },
6482 { },
6483 },
6484 },
David Henningsson7a5255f2014-10-30 08:26:01 +01006485 [ALC280_FIXUP_HP_GPIO4] = {
6486 .type = HDA_FIXUP_FUNC,
6487 .v.func = alc280_fixup_hp_gpio4,
6488 },
Kailang Yangeaa8e5e2014-11-21 15:49:11 +08006489 [ALC286_FIXUP_HP_GPIO_LED] = {
6490 .type = HDA_FIXUP_FUNC,
6491 .v.func = alc286_fixup_hp_gpio_led,
6492 },
David Henningsson33f4acd2015-01-07 15:50:13 +01006493 [ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY] = {
6494 .type = HDA_FIXUP_FUNC,
6495 .v.func = alc280_fixup_hp_gpio2_mic_hotkey,
6496 },
TienFu Chenb4b33f92015-01-20 15:06:21 +01006497 [ALC280_FIXUP_HP_DOCK_PINS] = {
6498 .type = HDA_FIXUP_PINS,
6499 .v.pins = (const struct hda_pintbl[]) {
6500 { 0x1b, 0x21011020 }, /* line-out */
6501 { 0x1a, 0x01a1903c }, /* headset mic */
6502 { 0x18, 0x2181103f }, /* line-in */
6503 { },
6504 },
6505 .chained = true,
6506 .chain_id = ALC280_FIXUP_HP_GPIO4
6507 },
Jaroslav Kysela04d54662017-03-09 13:29:13 +01006508 [ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED] = {
6509 .type = HDA_FIXUP_PINS,
6510 .v.pins = (const struct hda_pintbl[]) {
6511 { 0x1b, 0x21011020 }, /* line-out */
6512 { 0x18, 0x2181103f }, /* line-in */
6513 { },
6514 },
6515 .chained = true,
6516 .chain_id = ALC269_FIXUP_HP_GPIO_MIC1_LED
6517 },
Keith Packard98973f22015-07-15 12:14:39 -07006518 [ALC280_FIXUP_HP_9480M] = {
6519 .type = HDA_FIXUP_FUNC,
6520 .v.func = alc280_fixup_hp_9480m,
6521 },
Kailang Yange1e62b92015-04-08 16:01:22 +08006522 [ALC288_FIXUP_DELL_HEADSET_MODE] = {
6523 .type = HDA_FIXUP_FUNC,
6524 .v.func = alc_fixup_headset_mode_dell_alc288,
6525 .chained = true,
Takashi Iwaib3802782018-11-26 17:47:46 +01006526 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
Kailang Yange1e62b92015-04-08 16:01:22 +08006527 },
6528 [ALC288_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6529 .type = HDA_FIXUP_PINS,
6530 .v.pins = (const struct hda_pintbl[]) {
6531 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6532 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6533 { }
6534 },
6535 .chained = true,
6536 .chain_id = ALC288_FIXUP_DELL_HEADSET_MODE
6537 },
Hui Wang831bfdf92015-06-26 12:35:17 +08006538 [ALC288_FIXUP_DISABLE_AAMIX] = {
6539 .type = HDA_FIXUP_FUNC,
6540 .v.func = alc_fixup_disable_aamix,
6541 .chained = true,
Takashi Iwaid44a6862018-06-19 23:04:03 +02006542 .chain_id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE
Hui Wang831bfdf92015-06-26 12:35:17 +08006543 },
6544 [ALC288_FIXUP_DELL_XPS_13] = {
6545 .type = HDA_FIXUP_FUNC,
6546 .v.func = alc_fixup_dell_xps13,
6547 .chained = true,
6548 .chain_id = ALC288_FIXUP_DISABLE_AAMIX
6549 },
Takashi Iwai8b99aba2015-06-15 11:59:32 +02006550 [ALC292_FIXUP_DISABLE_AAMIX] = {
6551 .type = HDA_FIXUP_FUNC,
6552 .v.func = alc_fixup_disable_aamix,
Hui Wang831bfdf92015-06-26 12:35:17 +08006553 .chained = true,
6554 .chain_id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE
Takashi Iwai8b99aba2015-06-15 11:59:32 +02006555 },
David Henningssonc04017e2015-12-15 14:44:03 +01006556 [ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK] = {
6557 .type = HDA_FIXUP_FUNC,
6558 .v.func = alc_fixup_disable_aamix,
6559 .chained = true,
6560 .chain_id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE
6561 },
Takashi Iwai5fab5822020-01-05 09:11:19 +01006562 [ALC292_FIXUP_DELL_E7X_AAMIX] = {
Takashi Iwai8b99aba2015-06-15 11:59:32 +02006563 .type = HDA_FIXUP_FUNC,
6564 .v.func = alc_fixup_dell_xps13,
6565 .chained = true,
6566 .chain_id = ALC292_FIXUP_DISABLE_AAMIX
6567 },
Takashi Iwai5fab5822020-01-05 09:11:19 +01006568 [ALC292_FIXUP_DELL_E7X] = {
6569 .type = HDA_FIXUP_FUNC,
6570 .v.func = snd_hda_gen_fixup_micmute_led,
6571 /* micmute fixup must be applied at last */
6572 .chained_before = true,
6573 .chain_id = ALC292_FIXUP_DELL_E7X_AAMIX,
6574 },
James McDonnell54324222019-09-16 14:53:38 +00006575 [ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE] = {
6576 .type = HDA_FIXUP_PINS,
6577 .v.pins = (const struct hda_pintbl[]) {
6578 { 0x18, 0x01a1913c }, /* headset mic w/o jack detect */
6579 { }
6580 },
6581 .chained_before = true,
6582 .chain_id = ALC269_FIXUP_HEADSET_MODE,
6583 },
Kailang Yang977e6272015-05-18 15:31:20 +08006584 [ALC298_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6585 .type = HDA_FIXUP_PINS,
6586 .v.pins = (const struct hda_pintbl[]) {
6587 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6588 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6589 { }
6590 },
6591 .chained = true,
6592 .chain_id = ALC269_FIXUP_HEADSET_MODE
6593 },
Hui Wang2f726ae2017-03-31 10:31:40 +08006594 [ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE] = {
6595 .type = HDA_FIXUP_PINS,
6596 .v.pins = (const struct hda_pintbl[]) {
6597 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6598 { }
6599 },
6600 .chained = true,
6601 .chain_id = ALC269_FIXUP_HEADSET_MODE
6602 },
Kailang Yang6ed11312015-10-26 15:37:39 +08006603 [ALC275_FIXUP_DELL_XPS] = {
6604 .type = HDA_FIXUP_VERBS,
6605 .v.verbs = (const struct hda_verb[]) {
6606 /* Enables internal speaker */
6607 {0x20, AC_VERB_SET_COEF_INDEX, 0x1f},
6608 {0x20, AC_VERB_SET_PROC_COEF, 0x00c0},
6609 {0x20, AC_VERB_SET_COEF_INDEX, 0x30},
6610 {0x20, AC_VERB_SET_PROC_COEF, 0x00b1},
6611 {}
6612 }
6613 },
Hui Wang8c697292015-11-24 11:08:18 +08006614 [ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE] = {
6615 .type = HDA_FIXUP_VERBS,
6616 .v.verbs = (const struct hda_verb[]) {
6617 /* Disable pass-through path for FRONT 14h */
6618 {0x20, AC_VERB_SET_COEF_INDEX, 0x36},
6619 {0x20, AC_VERB_SET_PROC_COEF, 0x1737},
6620 {}
6621 },
6622 .chained = true,
6623 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
6624 },
Kai-Heng Feng1099f482019-10-03 12:39:19 +08006625 [ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE2] = {
6626 .type = HDA_FIXUP_FUNC,
6627 .v.func = alc256_fixup_dell_xps_13_headphone_noise2,
6628 .chained = true,
6629 .chain_id = ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE
6630 },
Hui Wang23adc192015-12-08 12:27:18 +08006631 [ALC293_FIXUP_LENOVO_SPK_NOISE] = {
6632 .type = HDA_FIXUP_FUNC,
6633 .v.func = alc_fixup_disable_aamix,
6634 .chained = true,
6635 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
6636 },
Kailang3694cb22015-12-28 11:35:24 +08006637 [ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY] = {
6638 .type = HDA_FIXUP_FUNC,
6639 .v.func = alc233_fixup_lenovo_line2_mic_hotkey,
6640 },
Kai-Heng Feng3b43b712016-02-25 15:19:38 +08006641 [ALC255_FIXUP_DELL_SPK_NOISE] = {
6642 .type = HDA_FIXUP_FUNC,
6643 .v.func = alc_fixup_disable_aamix,
6644 .chained = true,
6645 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
6646 },
Kailang Yangd1dd4212019-01-09 17:05:24 +08006647 [ALC225_FIXUP_DISABLE_MIC_VREF] = {
6648 .type = HDA_FIXUP_FUNC,
6649 .v.func = alc_fixup_disable_mic_vref,
6650 .chained = true,
6651 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
6652 },
David Henningsson2ae95572016-02-25 09:37:05 +01006653 [ALC225_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6654 .type = HDA_FIXUP_VERBS,
6655 .v.verbs = (const struct hda_verb[]) {
6656 /* Disable pass-through path for FRONT 14h */
6657 { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
6658 { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
6659 {}
6660 },
6661 .chained = true,
Kailang Yangd1dd4212019-01-09 17:05:24 +08006662 .chain_id = ALC225_FIXUP_DISABLE_MIC_VREF
David Henningsson2ae95572016-02-25 09:37:05 +01006663 },
Takashi Iwaif8839822016-02-25 14:31:59 +01006664 [ALC280_FIXUP_HP_HEADSET_MIC] = {
6665 .type = HDA_FIXUP_FUNC,
6666 .v.func = alc_fixup_disable_aamix,
6667 .chained = true,
6668 .chain_id = ALC269_FIXUP_HEADSET_MIC,
6669 },
Hui Wange549d192016-04-01 11:00:15 +08006670 [ALC221_FIXUP_HP_FRONT_MIC] = {
6671 .type = HDA_FIXUP_PINS,
6672 .v.pins = (const struct hda_pintbl[]) {
6673 { 0x19, 0x02a19020 }, /* Front Mic */
6674 { }
6675 },
6676 },
Sven Eckelmannc636b952016-04-11 16:55:26 +02006677 [ALC292_FIXUP_TPT460] = {
6678 .type = HDA_FIXUP_FUNC,
6679 .v.func = alc_fixup_tpt440_dock,
6680 .chained = true,
6681 .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE,
6682 },
Hui Wangdd9aa332016-08-01 10:20:32 +08006683 [ALC298_FIXUP_SPK_VOLUME] = {
6684 .type = HDA_FIXUP_FUNC,
6685 .v.func = alc298_fixup_speaker_volume,
Hui Wang59ec4b52016-08-04 15:28:04 +08006686 .chained = true,
Hui Wang2f726ae2017-03-31 10:31:40 +08006687 .chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
Hui Wangdd9aa332016-08-01 10:20:32 +08006688 },
Takashi Iwaie312a862018-03-06 12:14:17 +01006689 [ALC295_FIXUP_DISABLE_DAC3] = {
6690 .type = HDA_FIXUP_FUNC,
6691 .v.func = alc295_fixup_disable_dac3,
6692 },
Jaroslav Kyselad2cd7952019-11-29 15:40:27 +01006693 [ALC285_FIXUP_SPEAKER2_TO_DAC1] = {
6694 .type = HDA_FIXUP_FUNC,
6695 .v.func = alc285_fixup_speaker2_to_dac1,
Hui Wangc37c0ab2020-02-19 13:23:06 +08006696 .chained = true,
6697 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
Jaroslav Kyselad2cd7952019-11-29 15:40:27 +01006698 },
Kai-Heng Fengfd06c772016-08-30 15:36:34 +08006699 [ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {
6700 .type = HDA_FIXUP_PINS,
6701 .v.pins = (const struct hda_pintbl[]) {
6702 { 0x1b, 0x90170151 },
6703 { }
6704 },
6705 .chained = true,
6706 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
6707 },
Gabriele Mazzotta823ff162016-12-24 19:50:01 +01006708 [ALC269_FIXUP_ATIV_BOOK_8] = {
6709 .type = HDA_FIXUP_FUNC,
6710 .v.func = alc_fixup_auto_mute_via_amp,
6711 .chained = true,
6712 .chain_id = ALC269_FIXUP_NO_SHUTUP
6713 },
Kailang Yang9eb5d0e2017-01-17 15:40:25 +08006714 [ALC221_FIXUP_HP_MIC_NO_PRESENCE] = {
6715 .type = HDA_FIXUP_PINS,
6716 .v.pins = (const struct hda_pintbl[]) {
6717 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6718 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6719 { }
6720 },
6721 .chained = true,
6722 .chain_id = ALC269_FIXUP_HEADSET_MODE
6723 },
Chris Chiuc1732ed2017-02-28 14:17:13 -06006724 [ALC256_FIXUP_ASUS_HEADSET_MODE] = {
6725 .type = HDA_FIXUP_FUNC,
6726 .v.func = alc_fixup_headset_mode,
6727 },
6728 [ALC256_FIXUP_ASUS_MIC] = {
6729 .type = HDA_FIXUP_PINS,
6730 .v.pins = (const struct hda_pintbl[]) {
6731 { 0x13, 0x90a60160 }, /* use as internal mic */
6732 { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
6733 { }
6734 },
6735 .chained = true,
6736 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
6737 },
Chris Chiueeed4cd2017-02-28 14:17:15 -06006738 [ALC256_FIXUP_ASUS_AIO_GPIO2] = {
Takashi Iwaiae065f12018-06-19 23:00:03 +02006739 .type = HDA_FIXUP_FUNC,
6740 /* Set up GPIO2 for the speaker amp */
6741 .v.func = alc_fixup_gpio4,
Chris Chiueeed4cd2017-02-28 14:17:15 -06006742 },
Chris Chiu216d7ae2017-02-28 14:17:14 -06006743 [ALC233_FIXUP_ASUS_MIC_NO_PRESENCE] = {
6744 .type = HDA_FIXUP_PINS,
6745 .v.pins = (const struct hda_pintbl[]) {
6746 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6747 { }
6748 },
6749 .chained = true,
6750 .chain_id = ALC269_FIXUP_HEADSET_MIC
6751 },
6752 [ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE] = {
6753 .type = HDA_FIXUP_VERBS,
6754 .v.verbs = (const struct hda_verb[]) {
6755 /* Enables internal speaker */
6756 {0x20, AC_VERB_SET_COEF_INDEX, 0x40},
6757 {0x20, AC_VERB_SET_PROC_COEF, 0x8800},
6758 {}
6759 },
6760 .chained = true,
6761 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
6762 },
Kailang Yangca169cc2017-04-25 16:17:40 +08006763 [ALC233_FIXUP_LENOVO_MULTI_CODECS] = {
6764 .type = HDA_FIXUP_FUNC,
6765 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
6766 },
Jian-Hong Panea5c7eb2019-04-01 11:25:05 +08006767 [ALC233_FIXUP_ACER_HEADSET_MIC] = {
6768 .type = HDA_FIXUP_VERBS,
6769 .v.verbs = (const struct hda_verb[]) {
6770 { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
6771 { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
6772 { }
6773 },
6774 .chained = true,
6775 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
6776 },
Hui Wangf33f79f2017-07-07 12:08:29 +08006777 [ALC294_FIXUP_LENOVO_MIC_LOCATION] = {
6778 .type = HDA_FIXUP_PINS,
6779 .v.pins = (const struct hda_pintbl[]) {
6780 /* Change the mic location from front to right, otherwise there are
6781 two front mics with the same name, pulseaudio can't handle them.
6782 This is just a temporary workaround, after applying this fixup,
6783 there will be one "Front Mic" and one "Mic" in this machine.
6784 */
6785 { 0x1a, 0x04a19040 },
6786 { }
6787 },
6788 },
Kailang Yang5f364132017-07-25 16:28:16 +08006789 [ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE] = {
6790 .type = HDA_FIXUP_PINS,
6791 .v.pins = (const struct hda_pintbl[]) {
6792 { 0x16, 0x0101102f }, /* Rear Headset HP */
6793 { 0x19, 0x02a1913c }, /* use as Front headset mic, without its own jack detect */
6794 { 0x1a, 0x01a19030 }, /* Rear Headset MIC */
6795 { 0x1b, 0x02011020 },
6796 { }
6797 },
6798 .chained = true,
6799 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
6800 },
PeiSen Houb84e8432017-09-01 15:11:56 +08006801 [ALC700_FIXUP_INTEL_REFERENCE] = {
6802 .type = HDA_FIXUP_VERBS,
6803 .v.verbs = (const struct hda_verb[]) {
6804 /* Enables internal speaker */
6805 {0x20, AC_VERB_SET_COEF_INDEX, 0x45},
6806 {0x20, AC_VERB_SET_PROC_COEF, 0x5289},
6807 {0x20, AC_VERB_SET_COEF_INDEX, 0x4A},
6808 {0x20, AC_VERB_SET_PROC_COEF, 0x001b},
6809 {0x58, AC_VERB_SET_COEF_INDEX, 0x00},
6810 {0x58, AC_VERB_SET_PROC_COEF, 0x3888},
6811 {0x20, AC_VERB_SET_COEF_INDEX, 0x6f},
6812 {0x20, AC_VERB_SET_PROC_COEF, 0x2c0b},
6813 {}
6814 }
6815 },
Kailang Yang92266652017-12-14 15:28:58 +08006816 [ALC274_FIXUP_DELL_BIND_DACS] = {
6817 .type = HDA_FIXUP_FUNC,
6818 .v.func = alc274_fixup_bind_dacs,
6819 .chained = true,
6820 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
6821 },
6822 [ALC274_FIXUP_DELL_AIO_LINEOUT_VERB] = {
6823 .type = HDA_FIXUP_PINS,
6824 .v.pins = (const struct hda_pintbl[]) {
6825 { 0x1b, 0x0401102f },
6826 { }
6827 },
6828 .chained = true,
6829 .chain_id = ALC274_FIXUP_DELL_BIND_DACS
6830 },
Kailang Yang61fcf8e2018-02-02 15:26:46 +08006831 [ALC298_FIXUP_TPT470_DOCK] = {
6832 .type = HDA_FIXUP_FUNC,
6833 .v.func = alc_fixup_tpt470_dock,
6834 .chained = true,
6835 .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE
6836 },
Kailang Yangae104a22018-02-05 16:07:20 +08006837 [ALC255_FIXUP_DUMMY_LINEOUT_VERB] = {
6838 .type = HDA_FIXUP_PINS,
6839 .v.pins = (const struct hda_pintbl[]) {
6840 { 0x14, 0x0201101f },
6841 { }
6842 },
6843 .chained = true,
6844 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
6845 },
Kailang Yangf0ba9d62018-03-16 11:46:08 +08006846 [ALC255_FIXUP_DELL_HEADSET_MIC] = {
6847 .type = HDA_FIXUP_PINS,
6848 .v.pins = (const struct hda_pintbl[]) {
6849 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6850 { }
6851 },
Hui Wang3ce0d5a2018-04-19 13:29:04 +08006852 .chained = true,
6853 .chain_id = ALC269_FIXUP_HEADSET_MIC
Kailang Yangf0ba9d62018-03-16 11:46:08 +08006854 },
Tom Bridenbbf8ff62018-05-29 17:34:20 +01006855 [ALC295_FIXUP_HP_X360] = {
6856 .type = HDA_FIXUP_FUNC,
6857 .v.func = alc295_fixup_hp_top_speakers,
6858 .chained = true,
6859 .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC3
Kailang Yang8a328ac2018-08-21 16:54:41 +08006860 },
6861 [ALC221_FIXUP_HP_HEADSET_MIC] = {
6862 .type = HDA_FIXUP_PINS,
6863 .v.pins = (const struct hda_pintbl[]) {
6864 { 0x19, 0x0181313f},
6865 { }
6866 },
6867 .chained = true,
6868 .chain_id = ALC269_FIXUP_HEADSET_MIC
6869 },
Hui Wangc4cfcf62018-11-26 14:17:16 +08006870 [ALC285_FIXUP_LENOVO_HEADPHONE_NOISE] = {
6871 .type = HDA_FIXUP_FUNC,
6872 .v.func = alc285_fixup_invalidate_dacs,
Hui Wang6ba189c2018-12-09 09:16:43 +08006873 .chained = true,
6874 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
Hui Wangc4cfcf62018-11-26 14:17:16 +08006875 },
Girija Kumar Kasinadhunie8ed64b2018-11-26 13:40:46 -05006876 [ALC295_FIXUP_HP_AUTO_MUTE] = {
6877 .type = HDA_FIXUP_FUNC,
6878 .v.func = alc_fixup_auto_mute_via_amp,
6879 },
Chris Chiu33aaebd2018-12-05 14:48:53 +08006880 [ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE] = {
6881 .type = HDA_FIXUP_PINS,
6882 .v.pins = (const struct hda_pintbl[]) {
6883 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6884 { }
6885 },
6886 .chained = true,
6887 .chain_id = ALC269_FIXUP_HEADSET_MIC
6888 },
Chris Chiud8ae4582018-12-07 17:17:11 +08006889 [ALC294_FIXUP_ASUS_MIC] = {
6890 .type = HDA_FIXUP_PINS,
6891 .v.pins = (const struct hda_pintbl[]) {
6892 { 0x13, 0x90a60160 }, /* use as internal mic */
6893 { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
6894 { }
6895 },
6896 .chained = true,
6897 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
6898 },
Jian-Hong Pan4e051102018-12-07 17:17:12 +08006899 [ALC294_FIXUP_ASUS_HEADSET_MIC] = {
6900 .type = HDA_FIXUP_PINS,
6901 .v.pins = (const struct hda_pintbl[]) {
Jian-Hong Pan82b01142018-12-27 16:46:31 +08006902 { 0x19, 0x01a1103c }, /* use as headset mic */
Jian-Hong Pan4e051102018-12-07 17:17:12 +08006903 { }
6904 },
6905 .chained = true,
6906 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
6907 },
6908 [ALC294_FIXUP_ASUS_SPK] = {
6909 .type = HDA_FIXUP_VERBS,
6910 .v.verbs = (const struct hda_verb[]) {
6911 /* Set EAPD high */
6912 { 0x20, AC_VERB_SET_COEF_INDEX, 0x40 },
6913 { 0x20, AC_VERB_SET_PROC_COEF, 0x8800 },
6914 { }
6915 },
6916 .chained = true,
6917 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
6918 },
Jaroslav Kyselac8a9afa2019-03-14 09:21:08 +01006919 [ALC295_FIXUP_CHROME_BOOK] = {
Kailang Yange8547472018-11-28 15:32:45 +08006920 .type = HDA_FIXUP_FUNC,
Jaroslav Kyselac8a9afa2019-03-14 09:21:08 +01006921 .v.func = alc295_fixup_chromebook,
Kailang Yang8983eb62019-04-03 15:31:49 +08006922 .chained = true,
6923 .chain_id = ALC225_FIXUP_HEADSET_JACK
6924 },
6925 [ALC225_FIXUP_HEADSET_JACK] = {
6926 .type = HDA_FIXUP_FUNC,
6927 .v.func = alc_fixup_headset_jack,
Kailang Yange8547472018-11-28 15:32:45 +08006928 },
Jeremy Soller89e3a562019-01-30 16:12:31 -07006929 [ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
6930 .type = HDA_FIXUP_PINS,
6931 .v.pins = (const struct hda_pintbl[]) {
6932 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6933 { }
6934 },
6935 .chained = true,
6936 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
6937 },
Hui Wangc8c6ee62019-02-14 11:41:33 +08006938 [ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE] = {
6939 .type = HDA_FIXUP_VERBS,
6940 .v.verbs = (const struct hda_verb[]) {
6941 /* Disable PCBEEP-IN passthrough */
6942 { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
6943 { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
6944 { }
6945 },
6946 .chained = true,
6947 .chain_id = ALC285_FIXUP_LENOVO_HEADPHONE_NOISE
6948 },
Jian-Hong Pancbc05fd2019-03-13 17:33:24 +08006949 [ALC255_FIXUP_ACER_HEADSET_MIC] = {
6950 .type = HDA_FIXUP_PINS,
6951 .v.pins = (const struct hda_pintbl[]) {
6952 { 0x19, 0x03a11130 },
6953 { 0x1a, 0x90a60140 }, /* use as internal mic */
6954 { }
6955 },
6956 .chained = true,
6957 .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
6958 },
Kailang Yang136824e2019-03-14 16:22:45 +08006959 [ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE] = {
6960 .type = HDA_FIXUP_PINS,
6961 .v.pins = (const struct hda_pintbl[]) {
6962 { 0x16, 0x01011020 }, /* Rear Line out */
6963 { 0x19, 0x01a1913c }, /* use as Front headset mic, without its own jack detect */
6964 { }
6965 },
6966 .chained = true,
6967 .chain_id = ALC225_FIXUP_WYSE_AUTO_MUTE
6968 },
6969 [ALC225_FIXUP_WYSE_AUTO_MUTE] = {
6970 .type = HDA_FIXUP_FUNC,
6971 .v.func = alc_fixup_auto_mute_via_amp,
6972 .chained = true,
6973 .chain_id = ALC225_FIXUP_WYSE_DISABLE_MIC_VREF
6974 },
6975 [ALC225_FIXUP_WYSE_DISABLE_MIC_VREF] = {
6976 .type = HDA_FIXUP_FUNC,
6977 .v.func = alc_fixup_disable_mic_vref,
6978 .chained = true,
6979 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
6980 },
Jian-Hong Pan667a8f72019-03-15 17:51:09 +08006981 [ALC286_FIXUP_ACER_AIO_HEADSET_MIC] = {
6982 .type = HDA_FIXUP_VERBS,
6983 .v.verbs = (const struct hda_verb[]) {
6984 { 0x20, AC_VERB_SET_COEF_INDEX, 0x4f },
6985 { 0x20, AC_VERB_SET_PROC_COEF, 0x5029 },
6986 { }
6987 },
6988 .chained = true,
6989 .chain_id = ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE
6990 },
Daniel Drake8c8967a2019-10-17 16:15:01 +08006991 [ALC256_FIXUP_ASUS_HEADSET_MIC] = {
6992 .type = HDA_FIXUP_PINS,
6993 .v.pins = (const struct hda_pintbl[]) {
6994 { 0x19, 0x03a11020 }, /* headset mic with jack detect */
6995 { }
6996 },
6997 .chained = true,
6998 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
6999 },
Jian-Hong Pane1037352019-03-22 11:37:18 +08007000 [ALC256_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7001 .type = HDA_FIXUP_PINS,
7002 .v.pins = (const struct hda_pintbl[]) {
7003 { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
7004 { }
7005 },
7006 .chained = true,
7007 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7008 },
Bernhard Rosenkraenzere2a829b2019-03-05 00:38:19 +01007009 [ALC299_FIXUP_PREDATOR_SPK] = {
7010 .type = HDA_FIXUP_PINS,
7011 .v.pins = (const struct hda_pintbl[]) {
7012 { 0x21, 0x90170150 }, /* use as headset mic, without its own jack detect */
7013 { }
7014 }
7015 },
Jan-Marek Glogowskibd9c10b2019-09-15 16:57:28 +02007016 [ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE] = {
7017 .type = HDA_FIXUP_PINS,
7018 .v.pins = (const struct hda_pintbl[]) {
7019 { 0x19, 0x04a11040 },
7020 { 0x21, 0x04211020 },
7021 { }
7022 },
7023 .chained = true,
7024 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7025 },
Kailang Yange79c2262019-12-19 14:12:15 +08007026 [ALC289_FIXUP_DELL_SPK2] = {
7027 .type = HDA_FIXUP_PINS,
7028 .v.pins = (const struct hda_pintbl[]) {
7029 { 0x17, 0x90170130 }, /* bass spk */
7030 { }
7031 },
7032 .chained = true,
7033 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE
7034 },
7035 [ALC289_FIXUP_DUAL_SPK] = {
7036 .type = HDA_FIXUP_FUNC,
7037 .v.func = alc285_fixup_speaker2_to_dac1,
7038 .chained = true,
7039 .chain_id = ALC289_FIXUP_DELL_SPK2
7040 },
Chris Chiu48e01502019-12-30 11:11:18 +08007041 [ALC294_FIXUP_SPK2_TO_DAC1] = {
7042 .type = HDA_FIXUP_FUNC,
7043 .v.func = alc285_fixup_speaker2_to_dac1,
7044 .chained = true,
7045 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
7046 },
7047 [ALC294_FIXUP_ASUS_DUAL_SPK] = {
Jian-Hong Pan436e2552019-11-25 17:34:06 +08007048 .type = HDA_FIXUP_FUNC,
7049 /* The GPIO must be pulled to initialize the AMP */
7050 .v.func = alc_fixup_gpio4,
7051 .chained = true,
Chris Chiu48e01502019-12-30 11:11:18 +08007052 .chain_id = ALC294_FIXUP_SPK2_TO_DAC1
Jian-Hong Pan436e2552019-11-25 17:34:06 +08007053 },
Kailang Yang76f7dec2020-02-10 16:30:26 +08007054 [ALC285_FIXUP_THINKPAD_HEADSET_JACK] = {
7055 .type = HDA_FIXUP_FUNC,
7056 .v.func = alc_fixup_headset_jack,
7057 .chained = true,
7058 .chain_id = ALC285_FIXUP_SPEAKER2_TO_DAC1
7059 },
Jian-Hong Pan8b33a132020-02-25 15:29:21 +08007060 [ALC294_FIXUP_ASUS_HPE] = {
7061 .type = HDA_FIXUP_VERBS,
7062 .v.verbs = (const struct hda_verb[]) {
7063 /* Set EAPD high */
7064 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
7065 { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
7066 { }
7067 },
7068 .chained = true,
7069 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
7070 },
Kai-Heng Fengf5a88b02020-03-27 12:46:25 +08007071 [ALC285_FIXUP_HP_GPIO_LED] = {
7072 .type = HDA_FIXUP_FUNC,
7073 .v.func = alc285_fixup_hp_gpio_led,
7074 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02007075};
7076
7077static const struct snd_pci_quirk alc269_fixup_tbl[] = {
Marius Knausta6b92b62014-03-03 01:48:58 +01007078 SND_PCI_QUIRK(0x1025, 0x0283, "Acer TravelMate 8371", ALC269_FIXUP_INV_DMIC),
David Henningsson693b6132012-06-22 19:12:10 +02007079 SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC),
7080 SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC),
David Henningssonaaedfb42013-08-16 14:09:02 +02007081 SND_PCI_QUIRK(0x1025, 0x047c, "Acer AC700", ALC269_FIXUP_ACER_AC700),
Takashi Iwai78197172015-06-27 10:21:13 +02007082 SND_PCI_QUIRK(0x1025, 0x072d, "Acer Aspire V5-571G", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
7083 SND_PCI_QUIRK(0x1025, 0x080d, "Acer Aspire V5-122P", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
David Henningssonaaedfb42013-08-16 14:09:02 +02007084 SND_PCI_QUIRK(0x1025, 0x0740, "Acer AO725", ALC271_FIXUP_HP_GATE_MIC_JACK),
7085 SND_PCI_QUIRK(0x1025, 0x0742, "Acer AO756", ALC271_FIXUP_HP_GATE_MIC_JACK),
Simon South02322ac2016-03-02 23:10:44 -05007086 SND_PCI_QUIRK(0x1025, 0x0762, "Acer Aspire E1-472", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
Oleksij Rempelb1e89722013-12-04 20:50:53 +01007087 SND_PCI_QUIRK(0x1025, 0x0775, "Acer Aspire E1-572", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
Takashi Iwai1a22e772014-08-27 08:19:05 +02007088 SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS),
Chris Chiu705b65f2018-12-05 14:48:54 +08007089 SND_PCI_QUIRK(0x1025, 0x102b, "Acer Aspire C24-860", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE),
Takashi Iwaib9c2fa52015-11-19 16:39:50 +01007090 SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK),
Chris Chiuc7531e32019-03-21 17:17:31 +08007091 SND_PCI_QUIRK(0x1025, 0x1099, "Acer Aspire E5-523G", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
7092 SND_PCI_QUIRK(0x1025, 0x110e, "Acer Aspire ES1-432", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
Bernhard Rosenkraenzere2a829b2019-03-05 00:38:19 +01007093 SND_PCI_QUIRK(0x1025, 0x1246, "Acer Predator Helios 500", ALC299_FIXUP_PREDATOR_SPK),
Jian-Hong Pan667a8f72019-03-15 17:51:09 +08007094 SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
7095 SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
7096 SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
Jian-Hong Pan2733cce2019-03-21 16:39:04 +08007097 SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
Jian-Hong Panea5c7eb2019-04-01 11:25:05 +08007098 SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", ALC233_FIXUP_ACER_HEADSET_MIC),
Jian-Hong Pancbc05fd2019-03-13 17:33:24 +08007099 SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC),
David Henningssonaaedfb42013-08-16 14:09:02 +02007100 SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
Kailang Yang6ed11312015-10-26 15:37:39 +08007101 SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS),
Takashi Iwai86f799b2015-11-14 17:46:31 +01007102 SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X),
Takashi Iwaicf521032016-01-15 12:59:25 +01007103 SND_PCI_QUIRK(0x1028, 0x05be, "Dell Latitude E6540", ALC292_FIXUP_DELL_E7X),
Takashi Iwai8b99aba2015-06-15 11:59:32 +02007104 SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X),
7105 SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X),
David Henningsson0f4881d2013-12-20 16:08:13 +01007106 SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER),
David Henningsson73bdd592013-04-15 15:44:14 +02007107 SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
7108 SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
7109 SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
David Henningsson0f4881d2013-12-20 16:08:13 +01007110 SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
7111 SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
Takashi Iwai98070572016-01-12 21:06:39 +01007112 SND_PCI_QUIRK(0x1028, 0x062c, "Dell Latitude E5550", ALC292_FIXUP_DELL_E7X),
Takashi Iwai42755542015-06-29 10:56:53 +02007113 SND_PCI_QUIRK(0x1028, 0x062e, "Dell Latitude E7450", ALC292_FIXUP_DELL_E7X),
David Henningsson0f4881d2013-12-20 16:08:13 +01007114 SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),
Kailang Yanga22aa262014-04-23 17:34:28 +08007115 SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
7116 SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
Hui Wang831bfdf92015-06-26 12:35:17 +08007117 SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13),
Bastien Noceraafecb142016-04-18 11:10:42 +02007118 SND_PCI_QUIRK(0x1028, 0x0669, "Dell Optiplex 9020m", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
Takashi Iwai3a05d122015-07-29 09:04:52 +02007119 SND_PCI_QUIRK(0x1028, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK),
Kailang Yang8b724152014-12-17 17:08:59 +08007120 SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
Kailang Yangb7343042014-12-02 14:50:45 +08007121 SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
7122 SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
David Henningssonc04017e2015-12-15 14:44:03 +01007123 SND_PCI_QUIRK(0x1028, 0x06db, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
7124 SND_PCI_QUIRK(0x1028, 0x06dd, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
7125 SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
7126 SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
7127 SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
Kai-Heng Feng1099f482019-10-03 12:39:19 +08007128 SND_PCI_QUIRK(0x1028, 0x0704, "Dell XPS 13 9350", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE2),
Kai-Heng Fengfd06c772016-08-30 15:36:34 +08007129 SND_PCI_QUIRK(0x1028, 0x0706, "Dell Inspiron 7559", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
Kai-Heng Feng3b43b712016-02-25 15:19:38 +08007130 SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE),
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01007131 SND_PCI_QUIRK(0x1028, 0x0738, "Dell Precision 5820", ALC269_FIXUP_NO_SHUTUP),
Kai-Heng Feng1099f482019-10-03 12:39:19 +08007132 SND_PCI_QUIRK(0x1028, 0x075b, "Dell XPS 13 9360", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE2),
Kai-Heng Feng709ae622018-10-04 11:39:42 +08007133 SND_PCI_QUIRK(0x1028, 0x075c, "Dell XPS 27 7760", ALC298_FIXUP_SPK_VOLUME),
Hui Wangdd9aa332016-08-01 10:20:32 +08007134 SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME),
Takashi Iwaie312a862018-03-06 12:14:17 +01007135 SND_PCI_QUIRK(0x1028, 0x07b0, "Dell Precision 7520", ALC295_FIXUP_DISABLE_DAC3),
Takashi Iwai493de342017-02-28 17:27:57 +01007136 SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
Kailang Yang5f364132017-07-25 16:28:16 +08007137 SND_PCI_QUIRK(0x1028, 0x080c, "Dell WYSE", ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE),
Kai-Heng Feng1099f482019-10-03 12:39:19 +08007138 SND_PCI_QUIRK(0x1028, 0x082a, "Dell XPS 13 9360", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE2),
Kailang Yang40e2c4e2018-02-02 15:13:09 +08007139 SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
7140 SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
Kailang Yangf0ba9d62018-03-16 11:46:08 +08007141 SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
7142 SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
Kailang Yangae104a22018-02-05 16:07:20 +08007143 SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB),
Kailang Yang136824e2019-03-14 16:22:45 +08007144 SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE),
Kailang Yangda484d02019-03-14 15:50:59 +08007145 SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE),
Kailang Yangc2a7c55a2019-01-03 15:53:39 +08007146 SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
Kailang Yange79c2262019-12-19 14:12:15 +08007147 SND_PCI_QUIRK(0x1028, 0x097e, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
7148 SND_PCI_QUIRK(0x1028, 0x097d, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
Kailang Yang78def222020-02-20 15:21:54 +08007149 SND_PCI_QUIRK(0x1028, 0x098d, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
7150 SND_PCI_QUIRK(0x1028, 0x09bf, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
Kailang Yanga22aa262014-04-23 17:34:28 +08007151 SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
7152 SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
Takashi Iwai08fb0d02013-01-10 17:33:58 +01007153 SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01007154 SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),
David Henningsson8e35cd42013-11-06 11:20:01 +01007155 SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED),
David Henningsson33f4acd2015-01-07 15:50:13 +01007156 SND_PCI_QUIRK(0x103c, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY),
Kailang Yangc60666b2014-02-21 16:23:35 +08007157 /* ALC282 */
Hui Wang7976eb42015-02-13 11:14:41 +08007158 SND_PCI_QUIRK(0x103c, 0x21f9, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yang8a02b162014-06-13 17:16:31 +08007159 SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yang8a02b162014-06-13 17:16:31 +08007160 SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007161 SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
7162 SND_PCI_QUIRK(0x103c, 0x2237, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
7163 SND_PCI_QUIRK(0x103c, 0x2238, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
7164 SND_PCI_QUIRK(0x103c, 0x2239, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007165 SND_PCI_QUIRK(0x103c, 0x224b, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
Kailang Yangc60666b2014-02-21 16:23:35 +08007166 SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08007167 SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7168 SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yang8a02b162014-06-13 17:16:31 +08007169 SND_PCI_QUIRK(0x103c, 0x226e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangeaa8e5e2014-11-21 15:49:11 +08007170 SND_PCI_QUIRK(0x103c, 0x2271, "HP", ALC286_FIXUP_HP_GPIO_LED),
TienFu Chenb4b33f92015-01-20 15:06:21 +01007171 SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC280_FIXUP_HP_DOCK_PINS),
TienFu Chen3271cb22015-02-10 09:09:41 +01007172 SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC280_FIXUP_HP_DOCK_PINS),
Kailang Yangc60666b2014-02-21 16:23:35 +08007173 SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08007174 SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7175 SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7176 SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08007177 SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Keith Packard98973f22015-07-15 12:14:39 -07007178 SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC280_FIXUP_HP_9480M),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007179 SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7180 SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yangc60666b2014-02-21 16:23:35 +08007181 /* ALC290 */
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007182 SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007183 SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007184 SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007185 SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7186 SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7187 SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7188 SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7189 SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007190 SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Jaroslav Kysela04d54662017-03-09 13:29:13 +01007191 SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED),
Kailang Yangc60666b2014-02-21 16:23:35 +08007192 SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08007193 SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7194 SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7195 SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007196 SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7197 SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007198 SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yangc60666b2014-02-21 16:23:35 +08007199 SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08007200 SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08007201 SND_PCI_QUIRK(0x103c, 0x228b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08007202 SND_PCI_QUIRK(0x103c, 0x228e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7203 SND_PCI_QUIRK(0x103c, 0x22c5, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08007204 SND_PCI_QUIRK(0x103c, 0x22c7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7205 SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08007206 SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yang8a02b162014-06-13 17:16:31 +08007207 SND_PCI_QUIRK(0x103c, 0x2334, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7208 SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7209 SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7210 SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Takashi Iwaif8839822016-02-25 14:31:59 +01007211 SND_PCI_QUIRK(0x103c, 0x221c, "HP EliteBook 755 G2", ALC280_FIXUP_HP_HEADSET_MIC),
Jaroslav Kysela167897f2019-03-13 13:40:15 +01007212 SND_PCI_QUIRK(0x103c, 0x802e, "HP Z240 SFF", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
7213 SND_PCI_QUIRK(0x103c, 0x802f, "HP Z240", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
Takashi Iwai563785e2018-11-12 09:43:12 +01007214 SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
Hui Wange549d192016-04-01 11:00:15 +08007215 SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC),
Tom Bridenbbf8ff62018-05-29 17:34:20 +01007216 SND_PCI_QUIRK(0x103c, 0x827e, "HP x360", ALC295_FIXUP_HP_X360),
Jaroslav Kysela167897f2019-03-13 13:40:15 +01007217 SND_PCI_QUIRK(0x103c, 0x82bf, "HP G3 mini", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
7218 SND_PCI_QUIRK(0x103c, 0x82c0, "HP G3 mini premium", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
Alexandru Gagniuc56e40eb2018-08-04 11:44:44 -05007219 SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
Takashi Iwai190d0382019-08-13 17:39:56 +02007220 SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
Sam Bazleyd33cd422019-09-01 03:31:30 +01007221 SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
Kai-Heng Fengf5a88b02020-03-27 12:46:25 +08007222 SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_LED),
Chris Chiuc1732ed2017-02-28 14:17:13 -06007223 SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
Takashi Iwai7bba2152013-09-06 15:45:38 +02007224 SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
David Henningsson3e0d6112013-04-22 14:30:14 +02007225 SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Wandrille RONCE9cf65332018-12-19 14:52:44 +01007226 SND_PCI_QUIRK(0x1043, 0x10a1, "ASUS UX391UA", ALC294_FIXUP_ASUS_SPK),
Chris Chiuc1732ed2017-02-28 14:17:13 -06007227 SND_PCI_QUIRK(0x1043, 0x10c0, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
Takashi Iwai4eab0ea2017-06-06 12:33:17 +02007228 SND_PCI_QUIRK(0x1043, 0x10d0, "ASUS X540LA/X540LJ", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
David Henningsson3e0d6112013-04-22 14:30:14 +02007229 SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Takashi Iwai4eab0ea2017-06-06 12:33:17 +02007230 SND_PCI_QUIRK(0x1043, 0x11c0, "ASUS X556UR", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
7231 SND_PCI_QUIRK(0x1043, 0x1290, "ASUS X441SA", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
7232 SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
Chris Chiuc1732ed2017-02-28 14:17:13 -06007233 SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC),
7234 SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),
7235 SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
Oleksij Rempel2cede302013-11-27 17:12:03 +01007236 SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
Takashi Iwai23870832013-11-29 14:13:12 +01007237 SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
David Henningsson3e0d6112013-04-22 14:30:14 +02007238 SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
Chris Chiu48e01502019-12-30 11:11:18 +08007239 SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_DUAL_SPK),
Daniel Drake8c8967a2019-10-17 16:15:01 +08007240 SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC),
Jian-Hong Pan8b33a132020-02-25 15:29:21 +08007241 SND_PCI_QUIRK(0x1043, 0x19ce, "ASUS B9450FA", ALC294_FIXUP_ASUS_HPE),
Takashi Iwai017f2a12011-07-09 14:42:25 +02007242 SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
Chris Chiu28e8af82017-06-05 15:05:30 -06007243 SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC),
David Henningsson693b6132012-06-22 19:12:10 +02007244 SND_PCI_QUIRK(0x1043, 0x1b13, "Asus U41SV", ALC269_FIXUP_INV_DMIC),
Chris Chiu615966a2017-02-28 14:17:12 -06007245 SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
Takashi Iwai4eab0ea2017-06-06 12:33:17 +02007246 SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Chris Chiuc1732ed2017-02-28 14:17:13 -06007247 SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
Chris Chiueeed4cd2017-02-28 14:17:15 -06007248 SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02007249 SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
7250 SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
7251 SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
7252 SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
David Henningssond240d1d2013-04-15 12:50:02 +02007253 SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
Takashi Iwaif88abaa2014-02-07 12:07:59 +01007254 SND_PCI_QUIRK(0x104d, 0x90b5, "Sony VAIO Pro 11", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
David Henningsson88cfcf82013-10-11 10:18:45 +02007255 SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
Takashi Iwai1d045db2011-07-07 18:23:21 +02007256 SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
7257 SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
7258 SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
Takashi Iwaie9bd7d52014-05-21 11:06:49 +02007259 SND_PCI_QUIRK(0x104d, 0x9099, "Sony VAIO S13", ALC275_FIXUP_SONY_DISABLE_AAMIX),
Takashi Iwai24519912011-08-16 15:08:49 +02007260 SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),
Takashi Iwai4df3fd12015-06-29 08:38:02 +02007261 SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT),
Takashi Iwaicc7016a2015-04-08 20:47:55 +02007262 SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN),
Takashi Iwai88776f32015-05-01 09:20:34 +02007263 SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN),
Jan-Marek Glogowskifdcc9682018-02-14 11:29:15 +01007264 SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC),
David Henningsson2041d562014-06-13 11:15:44 +02007265 SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),
PeiSen Houb84e8432017-09-01 15:11:56 +08007266 SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE),
YOKOTA Hiroshi0fca97a2018-07-01 18:30:01 +09007267 SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-SZ6", ALC269_FIXUP_HEADSET_MODE),
David Henningssona33cc482014-10-07 10:18:41 +02007268 SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
Gabriele Mazzotta823ff162016-12-24 19:50:01 +01007269 SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
Anisse Astierabaa22742016-08-24 09:14:13 +02007270 SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
7271 SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),
Anisse Astier8cd65272018-11-23 17:59:11 +01007272 SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC),
Jeremy Soller89e3a562019-01-30 16:12:31 -07007273 SND_PCI_QUIRK(0x1558, 0x1325, "System76 Darter Pro (darp5)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
Jeremy Soller80a50522019-05-07 17:11:08 -04007274 SND_PCI_QUIRK(0x1558, 0x8550, "System76 Gazelle (gaze14)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
Jeremy Soller891afcf2019-05-10 10:15:07 -04007275 SND_PCI_QUIRK(0x1558, 0x8551, "System76 Gazelle (gaze14)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
7276 SND_PCI_QUIRK(0x1558, 0x8560, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
7277 SND_PCI_QUIRK(0x1558, 0x8561, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
Kailang Yangca169cc2017-04-25 16:17:40 +08007278 SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
Takashi Iwai1d045db2011-07-07 18:23:21 +02007279 SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
7280 SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
7281 SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
7282 SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
7283 SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
Takashi Iwai707fba32012-08-02 09:04:39 +02007284 SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK),
Felix Kaechelec8415a42012-08-06 23:02:01 +02007285 SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK),
Stefán Freyr84f98fd2012-10-19 22:46:00 +02007286 SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),
Philipp A. Mohrenweiser4407be62012-08-06 13:14:18 +02007287 SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),
David Henningsson108cc102012-07-20 10:37:25 +02007288 SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK),
David Henningssonaaedfb42013-08-16 14:09:02 +02007289 SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK),
Takashi Iwai9a811232015-12-09 15:17:43 +01007290 SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440),
Takashi Iwai1c37c222014-05-06 17:34:42 +02007291 SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK),
Takashi Iwaia12137e2014-06-27 12:14:35 +02007292 SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK),
Rick Sherman59a51a62015-08-18 21:04:30 -05007293 SND_PCI_QUIRK(0x17aa, 0x2211, "Thinkpad W541", ALC292_FIXUP_TPT440_DOCK),
Takashi Iwai6d169412014-10-07 17:27:02 +02007294 SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK),
Lukas Bossard7c215392014-10-29 18:31:07 +01007295 SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK),
David Henningssona4a9e082013-08-16 14:09:01 +02007296 SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Takashi Iwaib6903c02015-12-10 12:20:20 +01007297 SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK),
Laura Abbottd05ea7d2015-10-02 11:09:54 -07007298 SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK),
Yves-Alexis Perezc0278662015-04-11 09:31:35 +02007299 SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK),
Kailang Yang61fcf8e2018-02-02 15:26:46 +08007300 SND_PCI_QUIRK(0x17aa, 0x222d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7301 SND_PCI_QUIRK(0x17aa, 0x222e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
Torsten Hilbrichdab38e42016-06-07 13:14:21 +02007302 SND_PCI_QUIRK(0x17aa, 0x2231, "Thinkpad T560", ALC292_FIXUP_TPT460),
Sven Eckelmannc636b952016-04-11 16:55:26 +02007303 SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460),
Kailang Yang61fcf8e2018-02-02 15:26:46 +08007304 SND_PCI_QUIRK(0x17aa, 0x2245, "Thinkpad T470", ALC298_FIXUP_TPT470_DOCK),
7305 SND_PCI_QUIRK(0x17aa, 0x2246, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7306 SND_PCI_QUIRK(0x17aa, 0x2247, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
Dennis Wassenberge4c07b32018-03-08 13:17:54 +01007307 SND_PCI_QUIRK(0x17aa, 0x2249, "Thinkpad", ALC292_FIXUP_TPT460),
Kailang Yang61fcf8e2018-02-02 15:26:46 +08007308 SND_PCI_QUIRK(0x17aa, 0x224b, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7309 SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7310 SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
Benjamin Berg85981df2018-02-14 13:29:39 +01007311 SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Kailang Yang76f7dec2020-02-10 16:30:26 +08007312 SND_PCI_QUIRK(0x17aa, 0x2292, "Thinkpad X1 Yoga 7th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
7313 SND_PCI_QUIRK(0x17aa, 0x2293, "Thinkpad X1 Carbon 7th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
Kailang3694cb22015-12-28 11:35:24 +08007314 SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
Hui Wang6ef2f682016-03-11 12:04:02 +08007315 SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
Hui Wangf33f79f2017-07-07 12:08:29 +08007316 SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
Dennis Wassenbergbef33e12019-06-28 10:54:53 +02007317 SND_PCI_QUIRK(0x17aa, 0x3111, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
Hui Wange41fc8c2018-06-25 14:40:56 +08007318 SND_PCI_QUIRK(0x17aa, 0x312a, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
Kailang Yang65811832018-04-25 17:07:27 +08007319 SND_PCI_QUIRK(0x17aa, 0x312f, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
Hui Wang8da5bbf2017-12-22 11:17:46 +08007320 SND_PCI_QUIRK(0x17aa, 0x313c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
Hui Wang2a36c162019-09-04 13:53:27 +08007321 SND_PCI_QUIRK(0x17aa, 0x3151, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
Aaron Ma8a6c55d2019-10-24 19:44:39 +08007322 SND_PCI_QUIRK(0x17aa, 0x3176, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
7323 SND_PCI_QUIRK(0x17aa, 0x3178, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
David Henningsson56f27012016-01-11 09:33:14 +01007324 SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
Takashi Iwaifedb2242014-11-13 07:11:38 +01007325 SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
Michał Wadowski56df90b2019-05-14 16:58:00 +02007326 SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
David Henningssona4a9e082013-08-16 14:09:01 +02007327 SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Kailang Yang1bb3e062013-09-27 13:10:25 +02007328 SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC),
Takashi Iwaic497d9f2014-10-08 12:14:40 +02007329 SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK),
David Henningssoncd5302c2013-08-19 12:22:33 +02007330 SND_PCI_QUIRK(0x17aa, 0x5026, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Jo-Philipp Wichf2aa1112015-04-13 12:47:26 +02007331 SND_PCI_QUIRK(0x17aa, 0x5034, "Thinkpad T450", ALC292_FIXUP_TPT440_DOCK),
Sebastian Wicki80b311d2015-03-23 17:23:11 +01007332 SND_PCI_QUIRK(0x17aa, 0x5036, "Thinkpad T450s", ALC292_FIXUP_TPT440_DOCK),
Ansgar Hegerfeld09ea9972015-05-14 12:31:32 +02007333 SND_PCI_QUIRK(0x17aa, 0x503c, "Thinkpad L450", ALC292_FIXUP_TPT440_DOCK),
Conrad Kostecki037e1192016-04-26 10:08:10 +02007334 SND_PCI_QUIRK(0x17aa, 0x504a, "ThinkPad X260", ALC292_FIXUP_TPT440_DOCK),
Hui Wang23adc192015-12-08 12:27:18 +08007335 SND_PCI_QUIRK(0x17aa, 0x504b, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
Jaroslav Kysela0f087ee2016-06-24 15:13:16 +02007336 SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460),
Torsten Hilbrich9cd25742016-07-05 10:40:22 +02007337 SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460),
Jaroslav Kysela0f087ee2016-06-24 15:13:16 +02007338 SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460),
Kailang Yang61fcf8e2018-02-02 15:26:46 +08007339 SND_PCI_QUIRK(0x17aa, 0x505d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7340 SND_PCI_QUIRK(0x17aa, 0x505f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7341 SND_PCI_QUIRK(0x17aa, 0x5062, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
David Henningssoncd5302c2013-08-19 12:22:33 +02007342 SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Kailang Yang61fcf8e2018-02-02 15:26:46 +08007343 SND_PCI_QUIRK(0x17aa, 0x511e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7344 SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
David Henningsson012e7eb2012-08-08 08:43:37 +02007345 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
Takashi Iwai1d045db2011-07-07 18:23:21 +02007346 SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
Ayman Bagabas0fbf21c2019-05-23 05:30:11 -04007347 SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS),
Anisse Astier02b504d2013-06-03 11:53:10 +02007348 SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */
Hui Wang695d1ec2019-11-21 10:54:27 +08007349 SND_PCI_QUIRK(0x1d72, 0x1901, "RedmiBook 14", ALC256_FIXUP_ASUS_HEADSET_MIC),
Jan-Marek Glogowskibd9c10b2019-09-15 16:57:28 +02007350 SND_PCI_QUIRK(0x10ec, 0x118c, "Medion EE4254 MD62100", ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE),
Takashi Iwaia4297b52011-08-23 18:40:12 +02007351
Takashi Iwaia7f3eed2012-02-16 13:03:18 +01007352#if 0
Takashi Iwaia4297b52011-08-23 18:40:12 +02007353 /* Below is a quirk table taken from the old code.
7354 * Basically the device should work as is without the fixup table.
7355 * If BIOS doesn't give a proper info, enable the corresponding
7356 * fixup entry.
Jesper Juhl7d7eb9e2012-04-12 22:11:25 +02007357 */
Takashi Iwaia4297b52011-08-23 18:40:12 +02007358 SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
7359 ALC269_FIXUP_AMIC),
7360 SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC),
Takashi Iwaia4297b52011-08-23 18:40:12 +02007361 SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC),
7362 SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC),
7363 SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC),
7364 SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269_FIXUP_AMIC),
7365 SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269_FIXUP_AMIC),
7366 SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269_FIXUP_AMIC),
7367 SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_FIXUP_AMIC),
7368 SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269_FIXUP_AMIC),
7369 SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_FIXUP_AMIC),
7370 SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_FIXUP_AMIC),
7371 SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_FIXUP_AMIC),
7372 SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_FIXUP_AMIC),
7373 SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_FIXUP_AMIC),
7374 SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_FIXUP_AMIC),
7375 SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_FIXUP_AMIC),
7376 SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_FIXUP_AMIC),
7377 SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_FIXUP_AMIC),
7378 SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_FIXUP_AMIC),
7379 SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_FIXUP_AMIC),
7380 SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_FIXUP_AMIC),
7381 SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_FIXUP_AMIC),
7382 SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_FIXUP_AMIC),
7383 SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_FIXUP_AMIC),
7384 SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_FIXUP_AMIC),
7385 SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_FIXUP_AMIC),
7386 SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_FIXUP_AMIC),
7387 SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_FIXUP_AMIC),
7388 SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_FIXUP_AMIC),
7389 SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_FIXUP_AMIC),
7390 SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_FIXUP_AMIC),
7391 SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_FIXUP_AMIC),
7392 SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_FIXUP_AMIC),
7393 SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_FIXUP_AMIC),
7394 SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_FIXUP_DMIC),
7395 SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_FIXUP_AMIC),
7396 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_AMIC),
7397 SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_FIXUP_DMIC),
7398 SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_FIXUP_DMIC),
7399#endif
7400 {}
7401};
7402
David Henningsson214eef72014-07-22 14:09:35 +02007403static const struct snd_pci_quirk alc269_fixup_vendor_tbl[] = {
7404 SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
7405 SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED),
7406 SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
7407 SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", ALC269_FIXUP_THINKPAD_ACPI),
Ayman Bagabas0fbf21c2019-05-23 05:30:11 -04007408 SND_PCI_QUIRK_VENDOR(0x19e5, "Huawei Matebook", ALC255_FIXUP_MIC_MUTE_LED),
David Henningsson214eef72014-07-22 14:09:35 +02007409 {}
7410};
7411
Takashi Iwai1727a772013-01-10 09:52:52 +01007412static const struct hda_model_fixup alc269_fixup_models[] = {
Takashi Iwaia4297b52011-08-23 18:40:12 +02007413 {.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"},
7414 {.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"},
Takashi Iwai6e72aa52012-06-25 10:52:25 +02007415 {.id = ALC269_FIXUP_STEREO_DMIC, .name = "alc269-dmic"},
7416 {.id = ALC271_FIXUP_DMIC, .name = "alc271-dmic"},
7417 {.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"},
David Henningsson7c478f02013-10-11 10:18:46 +02007418 {.id = ALC269_FIXUP_HEADSET_MIC, .name = "headset-mic"},
Takashi Iwaib0169512015-05-19 10:20:13 +02007419 {.id = ALC269_FIXUP_HEADSET_MODE, .name = "headset-mode"},
7420 {.id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, .name = "headset-mode-no-hp-mic"},
David Henningsson108cc102012-07-20 10:37:25 +02007421 {.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01007422 {.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
Jaroslav Kysela04d54662017-03-09 13:29:13 +01007423 {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic1-led"},
David Henningssone32aa852013-06-17 11:04:02 +02007424 {.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
7425 {.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02007426 {.id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, .name = "dell-headset3"},
7427 {.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, .name = "dell-headset4"},
Kailang Yangbe8ef162014-04-08 15:19:49 +08007428 {.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},
Kailang Yang0202e992013-12-02 15:20:15 +08007429 {.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"},
Takashi Iwai1c37c222014-05-06 17:34:42 +02007430 {.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
Takashi Iwai9a811232015-12-09 15:17:43 +01007431 {.id = ALC292_FIXUP_TPT440, .name = "tpt440"},
Sven Eckelmannc636b952016-04-11 16:55:26 +02007432 {.id = ALC292_FIXUP_TPT460, .name = "tpt460"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02007433 {.id = ALC298_FIXUP_TPT470_DOCK, .name = "tpt470-dock"},
Takashi Iwaiba90d6a2017-05-22 16:38:47 +02007434 {.id = ALC233_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
Takashi Iwai28d1d6d2017-10-18 14:01:58 +02007435 {.id = ALC700_FIXUP_INTEL_REFERENCE, .name = "alc700-ref"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02007436 {.id = ALC269_FIXUP_SONY_VAIO, .name = "vaio"},
7437 {.id = ALC269_FIXUP_DELL_M101Z, .name = "dell-m101z"},
7438 {.id = ALC269_FIXUP_ASUS_G73JW, .name = "asus-g73jw"},
7439 {.id = ALC269_FIXUP_LENOVO_EAPD, .name = "lenovo-eapd"},
7440 {.id = ALC275_FIXUP_SONY_HWEQ, .name = "sony-hweq"},
7441 {.id = ALC269_FIXUP_PCM_44K, .name = "pcm44k"},
7442 {.id = ALC269_FIXUP_LIFEBOOK, .name = "lifebook"},
7443 {.id = ALC269_FIXUP_LIFEBOOK_EXTMIC, .name = "lifebook-extmic"},
7444 {.id = ALC269_FIXUP_LIFEBOOK_HP_PIN, .name = "lifebook-hp-pin"},
7445 {.id = ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC, .name = "lifebook-u7x7"},
7446 {.id = ALC269VB_FIXUP_AMIC, .name = "alc269vb-amic"},
7447 {.id = ALC269VB_FIXUP_DMIC, .name = "alc269vb-dmic"},
7448 {.id = ALC269_FIXUP_HP_MUTE_LED_MIC1, .name = "hp-mute-led-mic1"},
7449 {.id = ALC269_FIXUP_HP_MUTE_LED_MIC2, .name = "hp-mute-led-mic2"},
7450 {.id = ALC269_FIXUP_HP_MUTE_LED_MIC3, .name = "hp-mute-led-mic3"},
7451 {.id = ALC269_FIXUP_HP_GPIO_MIC1_LED, .name = "hp-gpio-mic1"},
7452 {.id = ALC269_FIXUP_HP_LINE1_MIC1_LED, .name = "hp-line1-mic1"},
7453 {.id = ALC269_FIXUP_NO_SHUTUP, .name = "noshutup"},
7454 {.id = ALC286_FIXUP_SONY_MIC_NO_PRESENCE, .name = "sony-nomic"},
7455 {.id = ALC269_FIXUP_ASPIRE_HEADSET_MIC, .name = "aspire-headset-mic"},
7456 {.id = ALC269_FIXUP_ASUS_X101, .name = "asus-x101"},
7457 {.id = ALC271_FIXUP_HP_GATE_MIC_JACK, .name = "acer-ao7xx"},
7458 {.id = ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572, .name = "acer-aspire-e1"},
7459 {.id = ALC269_FIXUP_ACER_AC700, .name = "acer-ac700"},
7460 {.id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST, .name = "limit-mic-boost"},
7461 {.id = ALC269VB_FIXUP_ASUS_ZENBOOK, .name = "asus-zenbook"},
7462 {.id = ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A, .name = "asus-zenbook-ux31a"},
7463 {.id = ALC269VB_FIXUP_ORDISSIMO_EVE2, .name = "ordissimo"},
7464 {.id = ALC282_FIXUP_ASUS_TX300, .name = "asus-tx300"},
7465 {.id = ALC283_FIXUP_INT_MIC, .name = "alc283-int-mic"},
7466 {.id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK, .name = "mono-speakers"},
7467 {.id = ALC290_FIXUP_SUBWOOFER_HSJACK, .name = "alc290-subwoofer"},
7468 {.id = ALC269_FIXUP_THINKPAD_ACPI, .name = "thinkpad"},
7469 {.id = ALC269_FIXUP_DMIC_THINKPAD_ACPI, .name = "dmic-thinkpad"},
7470 {.id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE, .name = "alc255-acer"},
7471 {.id = ALC255_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc255-asus"},
7472 {.id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc255-dell1"},
7473 {.id = ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "alc255-dell2"},
7474 {.id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc293-dell1"},
7475 {.id = ALC283_FIXUP_HEADSET_MIC, .name = "alc283-headset"},
Takashi Iwaib3802782018-11-26 17:47:46 +01007476 {.id = ALC255_FIXUP_MIC_MUTE_LED, .name = "alc255-dell-mute"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02007477 {.id = ALC282_FIXUP_ASPIRE_V5_PINS, .name = "aspire-v5"},
7478 {.id = ALC280_FIXUP_HP_GPIO4, .name = "hp-gpio4"},
7479 {.id = ALC286_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
7480 {.id = ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY, .name = "hp-gpio2-hotkey"},
7481 {.id = ALC280_FIXUP_HP_DOCK_PINS, .name = "hp-dock-pins"},
7482 {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic"},
7483 {.id = ALC280_FIXUP_HP_9480M, .name = "hp-9480m"},
7484 {.id = ALC288_FIXUP_DELL_HEADSET_MODE, .name = "alc288-dell-headset"},
7485 {.id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc288-dell1"},
7486 {.id = ALC288_FIXUP_DELL_XPS_13, .name = "alc288-dell-xps13"},
7487 {.id = ALC292_FIXUP_DELL_E7X, .name = "dell-e7x"},
7488 {.id = ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK, .name = "alc293-dell"},
7489 {.id = ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc298-dell1"},
7490 {.id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, .name = "alc298-dell-aio"},
7491 {.id = ALC275_FIXUP_DELL_XPS, .name = "alc275-dell-xps"},
7492 {.id = ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE, .name = "alc256-dell-xps13"},
7493 {.id = ALC293_FIXUP_LENOVO_SPK_NOISE, .name = "lenovo-spk-noise"},
7494 {.id = ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, .name = "lenovo-hotkey"},
7495 {.id = ALC255_FIXUP_DELL_SPK_NOISE, .name = "dell-spk-noise"},
Kailang Yang82aa0d72019-01-11 17:15:53 +08007496 {.id = ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc225-dell1"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02007497 {.id = ALC295_FIXUP_DISABLE_DAC3, .name = "alc295-disable-dac3"},
Jaroslav Kyselad2cd7952019-11-29 15:40:27 +01007498 {.id = ALC285_FIXUP_SPEAKER2_TO_DAC1, .name = "alc285-speaker2-to-dac1"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02007499 {.id = ALC280_FIXUP_HP_HEADSET_MIC, .name = "alc280-hp-headset"},
7500 {.id = ALC221_FIXUP_HP_FRONT_MIC, .name = "alc221-hp-mic"},
7501 {.id = ALC298_FIXUP_SPK_VOLUME, .name = "alc298-spk-volume"},
7502 {.id = ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER, .name = "dell-inspiron-7559"},
7503 {.id = ALC269_FIXUP_ATIV_BOOK_8, .name = "ativ-book"},
7504 {.id = ALC221_FIXUP_HP_MIC_NO_PRESENCE, .name = "alc221-hp-mic"},
7505 {.id = ALC256_FIXUP_ASUS_HEADSET_MODE, .name = "alc256-asus-headset"},
7506 {.id = ALC256_FIXUP_ASUS_MIC, .name = "alc256-asus-mic"},
7507 {.id = ALC256_FIXUP_ASUS_AIO_GPIO2, .name = "alc256-asus-aio"},
7508 {.id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc233-asus"},
7509 {.id = ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE, .name = "alc233-eapd"},
7510 {.id = ALC294_FIXUP_LENOVO_MIC_LOCATION, .name = "alc294-lenovo-mic"},
7511 {.id = ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE, .name = "alc225-wyse"},
7512 {.id = ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, .name = "alc274-dell-aio"},
7513 {.id = ALC255_FIXUP_DUMMY_LINEOUT_VERB, .name = "alc255-dummy-lineout"},
7514 {.id = ALC255_FIXUP_DELL_HEADSET_MIC, .name = "alc255-dell-headset"},
7515 {.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"},
Kailang Yang8983eb62019-04-03 15:31:49 +08007516 {.id = ALC225_FIXUP_HEADSET_JACK, .name = "alc-headset-jack"},
7517 {.id = ALC295_FIXUP_CHROME_BOOK, .name = "alc-chrome-book"},
Bernhard Rosenkraenzere2a829b2019-03-05 00:38:19 +01007518 {.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"},
Tomas Espeletaa2ef03f2019-08-09 16:37:54 +02007519 {.id = ALC298_FIXUP_HUAWEI_MBX_STEREO, .name = "huawei-mbx-stereo"},
Jan-Marek Glogowskibd9c10b2019-09-15 16:57:28 +02007520 {.id = ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, .name = "alc256-medion-headset"},
Takashi Iwai1d045db2011-07-07 18:23:21 +02007521 {}
7522};
Kailang Yangcfc5a842016-02-03 15:20:39 +08007523#define ALC225_STANDARD_PINS \
Kailang Yangcfc5a842016-02-03 15:20:39 +08007524 {0x21, 0x04211020}
Takashi Iwai1d045db2011-07-07 18:23:21 +02007525
Hui Wange8191a82015-04-24 13:39:59 +08007526#define ALC256_STANDARD_PINS \
7527 {0x12, 0x90a60140}, \
7528 {0x14, 0x90170110}, \
Hui Wange8191a82015-04-24 13:39:59 +08007529 {0x21, 0x02211020}
7530
David Henningssonfea185e2014-09-03 10:23:04 +02007531#define ALC282_STANDARD_PINS \
Hui Wang11580292015-08-03 11:03:49 +08007532 {0x14, 0x90170110}
Kailang Yange1e62b92015-04-08 16:01:22 +08007533
David Henningssonfea185e2014-09-03 10:23:04 +02007534#define ALC290_STANDARD_PINS \
Hui Wang11580292015-08-03 11:03:49 +08007535 {0x12, 0x99a30130}
David Henningssonfea185e2014-09-03 10:23:04 +02007536
7537#define ALC292_STANDARD_PINS \
7538 {0x14, 0x90170110}, \
Hui Wang11580292015-08-03 11:03:49 +08007539 {0x15, 0x0221401f}
Kailang Yang977e6272015-05-18 15:31:20 +08007540
Hui Wang3f6409702016-09-11 11:26:16 +08007541#define ALC295_STANDARD_PINS \
7542 {0x12, 0xb7a60130}, \
7543 {0x14, 0x90170110}, \
Hui Wang3f6409702016-09-11 11:26:16 +08007544 {0x21, 0x04211020}
7545
Woodrow Shen703867e2015-08-05 12:34:12 +08007546#define ALC298_STANDARD_PINS \
7547 {0x12, 0x90a60130}, \
7548 {0x21, 0x03211020}
7549
Hui Wange1918932014-05-26 16:22:44 +08007550static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
Kailang Yang8a328ac2018-08-21 16:54:41 +08007551 SND_HDA_PIN_QUIRK(0x10ec0221, 0x103c, "HP Workstation", ALC221_FIXUP_HP_HEADSET_MIC,
7552 {0x14, 0x01014020},
7553 {0x17, 0x90170110},
7554 {0x18, 0x02a11030},
7555 {0x19, 0x0181303F},
7556 {0x21, 0x0221102f}),
Chris Chiu5824ce82017-02-28 14:17:11 -06007557 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1025, "Acer", ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
7558 {0x12, 0x90a601c0},
7559 {0x14, 0x90171120},
7560 {0x21, 0x02211030}),
Chris Chiu615966a2017-02-28 14:17:12 -06007561 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
7562 {0x14, 0x90170110},
7563 {0x1b, 0x90a70130},
7564 {0x21, 0x03211020}),
7565 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
7566 {0x1a, 0x90a70130},
7567 {0x1b, 0x90170110},
7568 {0x21, 0x03211020}),
David Henningsson2ae95572016-02-25 09:37:05 +01007569 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
Kailang Yangcfc5a842016-02-03 15:20:39 +08007570 ALC225_STANDARD_PINS,
Hui Wang8a132092016-07-08 14:26:57 +08007571 {0x12, 0xb7a60130},
Kailang Yangcfc5a842016-02-03 15:20:39 +08007572 {0x14, 0x901701a0}),
David Henningsson2ae95572016-02-25 09:37:05 +01007573 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
Kailang Yangcfc5a842016-02-03 15:20:39 +08007574 ALC225_STANDARD_PINS,
Hui Wang8a132092016-07-08 14:26:57 +08007575 {0x12, 0xb7a60130},
Kailang Yangcfc5a842016-02-03 15:20:39 +08007576 {0x14, 0x901701b0}),
Hui Wang8a132092016-07-08 14:26:57 +08007577 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
7578 ALC225_STANDARD_PINS,
7579 {0x12, 0xb7a60150},
7580 {0x14, 0x901701a0}),
7581 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
7582 ALC225_STANDARD_PINS,
7583 {0x12, 0xb7a60150},
7584 {0x14, 0x901701b0}),
7585 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
7586 ALC225_STANDARD_PINS,
7587 {0x12, 0xb7a60130},
7588 {0x1b, 0x90170110}),
Kai-Heng Feng0ce48e12017-11-20 02:29:13 -05007589 SND_HDA_PIN_QUIRK(0x10ec0233, 0x8086, "Intel NUC Skull Canyon", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
7590 {0x1b, 0x01111010},
7591 {0x1e, 0x01451130},
7592 {0x21, 0x02211020}),
Hui Wang986376b2018-05-30 12:33:07 +08007593 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
7594 {0x12, 0x90a60140},
7595 {0x14, 0x90170110},
7596 {0x19, 0x02a11030},
7597 {0x21, 0x02211020}),
Hui Wange41fc8c2018-06-25 14:40:56 +08007598 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
7599 {0x14, 0x90170110},
7600 {0x19, 0x02a11030},
7601 {0x1a, 0x02a11040},
7602 {0x1b, 0x01014020},
7603 {0x21, 0x0221101f}),
Hui Wangc6b17f12018-07-06 15:14:11 +08007604 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
7605 {0x14, 0x90170110},
Hui Wangd06fb562018-10-10 11:57:25 +08007606 {0x19, 0x02a11030},
7607 {0x1a, 0x02a11040},
7608 {0x1b, 0x01011020},
7609 {0x21, 0x0221101f}),
7610 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
7611 {0x14, 0x90170110},
Hui Wangc6b17f12018-07-06 15:14:11 +08007612 {0x19, 0x02a11020},
7613 {0x1a, 0x02a11030},
7614 {0x21, 0x0221101f}),
Hui Wangc77900e2014-09-03 11:31:07 +08007615 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
Hui Wangc77900e2014-09-03 11:31:07 +08007616 {0x14, 0x90170110},
Hui Wangc77900e2014-09-03 11:31:07 +08007617 {0x21, 0x02211020}),
David Henningsson76c21322014-06-24 14:46:54 +02007618 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang86c72d12016-05-25 12:12:32 +08007619 {0x14, 0x90170130},
7620 {0x21, 0x02211040}),
7621 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningsson76c21322014-06-24 14:46:54 +02007622 {0x12, 0x90a60140},
7623 {0x14, 0x90170110},
David Henningsson76c21322014-06-24 14:46:54 +02007624 {0x21, 0x02211020}),
7625 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7626 {0x12, 0x90a60160},
7627 {0x14, 0x90170120},
David Henningsson76c21322014-06-24 14:46:54 +02007628 {0x21, 0x02211030}),
7629 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang392c9da2016-09-26 10:59:38 +08007630 {0x14, 0x90170110},
7631 {0x1b, 0x02011020},
7632 {0x21, 0x0221101f}),
7633 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang6aecd872016-10-20 14:03:33 +08007634 {0x14, 0x90170110},
7635 {0x1b, 0x01011020},
7636 {0x21, 0x0221101f}),
7637 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningssoncba59972015-07-22 10:00:25 +02007638 {0x14, 0x90170130},
David Henningssoncba59972015-07-22 10:00:25 +02007639 {0x1b, 0x01014020},
David Henningssoncba59972015-07-22 10:00:25 +02007640 {0x21, 0x0221103f}),
7641 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang59ec4b52016-08-04 15:28:04 +08007642 {0x14, 0x90170130},
Hui Wang6aecd872016-10-20 14:03:33 +08007643 {0x1b, 0x01011020},
7644 {0x21, 0x0221103f}),
7645 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7646 {0x14, 0x90170130},
Hui Wang59ec4b52016-08-04 15:28:04 +08007647 {0x1b, 0x02011020},
7648 {0x21, 0x0221103f}),
7649 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Woodrow Shene9c28e12015-07-25 10:36:16 +08007650 {0x14, 0x90170150},
Woodrow Shene9c28e12015-07-25 10:36:16 +08007651 {0x1b, 0x02011020},
Woodrow Shene9c28e12015-07-25 10:36:16 +08007652 {0x21, 0x0221105f}),
7653 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Woodrow Shene9c28e12015-07-25 10:36:16 +08007654 {0x14, 0x90170110},
Woodrow Shene9c28e12015-07-25 10:36:16 +08007655 {0x1b, 0x01014020},
Woodrow Shene9c28e12015-07-25 10:36:16 +08007656 {0x21, 0x0221101f}),
7657 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningsson76c21322014-06-24 14:46:54 +02007658 {0x12, 0x90a60160},
7659 {0x14, 0x90170120},
7660 {0x17, 0x90170140},
David Henningsson76c21322014-06-24 14:46:54 +02007661 {0x21, 0x0321102f}),
7662 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7663 {0x12, 0x90a60160},
7664 {0x14, 0x90170130},
David Henningsson76c21322014-06-24 14:46:54 +02007665 {0x21, 0x02211040}),
7666 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7667 {0x12, 0x90a60160},
7668 {0x14, 0x90170140},
David Henningsson76c21322014-06-24 14:46:54 +02007669 {0x21, 0x02211050}),
7670 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7671 {0x12, 0x90a60170},
7672 {0x14, 0x90170120},
David Henningsson76c21322014-06-24 14:46:54 +02007673 {0x21, 0x02211030}),
7674 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7675 {0x12, 0x90a60170},
7676 {0x14, 0x90170130},
David Henningsson76c21322014-06-24 14:46:54 +02007677 {0x21, 0x02211040}),
Hui Wang70658b92015-03-06 14:03:57 +08007678 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang70658b92015-03-06 14:03:57 +08007679 {0x12, 0x90a60170},
Hui Wang0a1f90a2016-01-13 11:51:38 +08007680 {0x14, 0x90171130},
7681 {0x21, 0x02211040}),
7682 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7683 {0x12, 0x90a60170},
Hui Wang70658b92015-03-06 14:03:57 +08007684 {0x14, 0x90170140},
Hui Wang70658b92015-03-06 14:03:57 +08007685 {0x21, 0x02211050}),
David Henningsson9b5a4e32015-05-11 14:04:14 +02007686 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5548", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningsson9b5a4e32015-05-11 14:04:14 +02007687 {0x12, 0x90a60180},
7688 {0x14, 0x90170130},
David Henningsson9b5a4e32015-05-11 14:04:14 +02007689 {0x21, 0x02211040}),
AceLan Kaof90d83b2016-06-03 14:45:25 +08007690 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5565", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7691 {0x12, 0x90a60180},
7692 {0x14, 0x90170120},
7693 {0x21, 0x02211030}),
Hui Wang989dbe42016-11-23 16:05:38 +08007694 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7695 {0x1b, 0x01011020},
7696 {0x21, 0x02211010}),
Chris Chiuc1732ed2017-02-28 14:17:13 -06007697 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
7698 {0x14, 0x90170110},
7699 {0x1b, 0x90a70130},
7700 {0x21, 0x04211020}),
7701 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
7702 {0x14, 0x90170110},
7703 {0x1b, 0x90a70130},
7704 {0x21, 0x03211020}),
Jian-Hong Pane1037352019-03-22 11:37:18 +08007705 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
Chris Chiua806ef12019-03-22 11:37:20 +08007706 {0x12, 0x90a60130},
7707 {0x14, 0x90170110},
7708 {0x21, 0x03211020}),
7709 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
Jian-Hong Pan6ac371a2019-03-22 11:37:22 +08007710 {0x12, 0x90a60130},
7711 {0x14, 0x90170110},
7712 {0x21, 0x04211020}),
7713 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
Jian-Hong Pane1037352019-03-22 11:37:18 +08007714 {0x1a, 0x90a70130},
7715 {0x1b, 0x90170110},
7716 {0x21, 0x03211020}),
David Henningssoncf51eb92014-10-30 08:26:02 +01007717 SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
7718 {0x12, 0x90a60130},
David Henningssoncf51eb92014-10-30 08:26:02 +01007719 {0x14, 0x90170110},
7720 {0x15, 0x0421101f},
Hui Wang11580292015-08-03 11:03:49 +08007721 {0x1a, 0x04a11020}),
Hui Wang02796612014-09-03 11:31:11 +08007722 SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED,
7723 {0x12, 0x90a60140},
Hui Wang02796612014-09-03 11:31:11 +08007724 {0x14, 0x90170110},
7725 {0x15, 0x0421101f},
Hui Wang02796612014-09-03 11:31:11 +08007726 {0x18, 0x02811030},
Hui Wang02796612014-09-03 11:31:11 +08007727 {0x1a, 0x04a1103f},
Hui Wang11580292015-08-03 11:03:49 +08007728 {0x1b, 0x02011020}),
David Henningsson42304472014-07-22 11:42:17 +02007729 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP 15 Touchsmart", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02007730 ALC282_STANDARD_PINS,
David Henningsson42304472014-07-22 11:42:17 +02007731 {0x12, 0x99a30130},
David Henningsson42304472014-07-22 11:42:17 +02007732 {0x19, 0x03a11020},
David Henningsson42304472014-07-22 11:42:17 +02007733 {0x21, 0x0321101f}),
Hui Wang2c609992014-09-03 11:31:08 +08007734 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02007735 ALC282_STANDARD_PINS,
Hui Wang2c609992014-09-03 11:31:08 +08007736 {0x12, 0x99a30130},
Hui Wang2c609992014-09-03 11:31:08 +08007737 {0x19, 0x03a11020},
Hui Wang2c609992014-09-03 11:31:08 +08007738 {0x21, 0x03211040}),
7739 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02007740 ALC282_STANDARD_PINS,
Hui Wang2c609992014-09-03 11:31:08 +08007741 {0x12, 0x99a30130},
Hui Wang2c609992014-09-03 11:31:08 +08007742 {0x19, 0x03a11030},
Hui Wang2c609992014-09-03 11:31:08 +08007743 {0x21, 0x03211020}),
7744 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02007745 ALC282_STANDARD_PINS,
Hui Wang2c609992014-09-03 11:31:08 +08007746 {0x12, 0x99a30130},
Hui Wang2c609992014-09-03 11:31:08 +08007747 {0x19, 0x04a11020},
Hui Wang2c609992014-09-03 11:31:08 +08007748 {0x21, 0x0421101f}),
Hui Wang200afc02014-09-03 11:31:10 +08007749 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED,
David Henningssonaec856d2014-09-03 10:23:05 +02007750 ALC282_STANDARD_PINS,
Hui Wang200afc02014-09-03 11:31:10 +08007751 {0x12, 0x90a60140},
Hui Wang200afc02014-09-03 11:31:10 +08007752 {0x19, 0x04a11030},
Hui Wang200afc02014-09-03 11:31:10 +08007753 {0x21, 0x04211020}),
David Henningsson76c21322014-06-24 14:46:54 +02007754 SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02007755 ALC282_STANDARD_PINS,
David Henningsson76c21322014-06-24 14:46:54 +02007756 {0x12, 0x90a60130},
David Henningsson76c21322014-06-24 14:46:54 +02007757 {0x21, 0x0321101f}),
7758 SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
7759 {0x12, 0x90a60160},
7760 {0x14, 0x90170120},
David Henningsson76c21322014-06-24 14:46:54 +02007761 {0x21, 0x02211030}),
Hui Wangbc262172014-09-03 11:31:05 +08007762 SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02007763 ALC282_STANDARD_PINS,
Hui Wangbc262172014-09-03 11:31:05 +08007764 {0x12, 0x90a60130},
Hui Wangbc262172014-09-03 11:31:05 +08007765 {0x19, 0x03a11020},
Hui Wangbc262172014-09-03 11:31:05 +08007766 {0x21, 0x0321101f}),
Hui Wangc8c6ee62019-02-14 11:41:33 +08007767 SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
Hui Wangc4cfcf62018-11-26 14:17:16 +08007768 {0x12, 0x90a60130},
7769 {0x14, 0x90170110},
7770 {0x19, 0x04a11040},
7771 {0x21, 0x04211020}),
Chris Chiu33aaebd2018-12-05 14:48:53 +08007772 SND_HDA_PIN_QUIRK(0x10ec0286, 0x1025, "Acer", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
7773 {0x12, 0x90a60130},
7774 {0x17, 0x90170110},
7775 {0x21, 0x02211020}),
Takashi Iwaid44a6862018-06-19 23:04:03 +02007776 SND_HDA_PIN_QUIRK(0x10ec0288, 0x1028, "Dell", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
Kailang Yange1e62b92015-04-08 16:01:22 +08007777 {0x12, 0x90a60120},
Kailang Yange1e62b92015-04-08 16:01:22 +08007778 {0x14, 0x90170110},
Kailang Yange1e62b92015-04-08 16:01:22 +08007779 {0x21, 0x0321101f}),
Hui Wange4442bc2014-09-03 11:31:09 +08007780 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02007781 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08007782 {0x15, 0x04211040},
Hui Wange4442bc2014-09-03 11:31:09 +08007783 {0x18, 0x90170112},
Hui Wang11580292015-08-03 11:03:49 +08007784 {0x1a, 0x04a11020}),
Hui Wange4442bc2014-09-03 11:31:09 +08007785 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02007786 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08007787 {0x15, 0x04211040},
Hui Wange4442bc2014-09-03 11:31:09 +08007788 {0x18, 0x90170110},
Hui Wang11580292015-08-03 11:03:49 +08007789 {0x1a, 0x04a11020}),
Hui Wange4442bc2014-09-03 11:31:09 +08007790 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02007791 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08007792 {0x15, 0x0421101f},
Hui Wang11580292015-08-03 11:03:49 +08007793 {0x1a, 0x04a11020}),
Hui Wange4442bc2014-09-03 11:31:09 +08007794 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02007795 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08007796 {0x15, 0x04211020},
Hui Wang11580292015-08-03 11:03:49 +08007797 {0x1a, 0x04a11040}),
Hui Wange4442bc2014-09-03 11:31:09 +08007798 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02007799 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08007800 {0x14, 0x90170110},
7801 {0x15, 0x04211020},
Hui Wang11580292015-08-03 11:03:49 +08007802 {0x1a, 0x04a11040}),
Hui Wange4442bc2014-09-03 11:31:09 +08007803 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02007804 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08007805 {0x14, 0x90170110},
7806 {0x15, 0x04211020},
Hui Wang11580292015-08-03 11:03:49 +08007807 {0x1a, 0x04a11020}),
Hui Wange4442bc2014-09-03 11:31:09 +08007808 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02007809 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08007810 {0x14, 0x90170110},
7811 {0x15, 0x0421101f},
Hui Wang11580292015-08-03 11:03:49 +08007812 {0x1a, 0x04a11020}),
Hui Wange8818fa2014-09-03 11:31:04 +08007813 SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02007814 ALC292_STANDARD_PINS,
Hui Wange8818fa2014-09-03 11:31:04 +08007815 {0x12, 0x90a60140},
Hui Wange8818fa2014-09-03 11:31:04 +08007816 {0x16, 0x01014020},
Hui Wang11580292015-08-03 11:03:49 +08007817 {0x19, 0x01a19030}),
Hui Wange8818fa2014-09-03 11:31:04 +08007818 SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02007819 ALC292_STANDARD_PINS,
Hui Wange8818fa2014-09-03 11:31:04 +08007820 {0x12, 0x90a60140},
Hui Wange8818fa2014-09-03 11:31:04 +08007821 {0x16, 0x01014020},
7822 {0x18, 0x02a19031},
Hui Wang11580292015-08-03 11:03:49 +08007823 {0x19, 0x01a1903e}),
David Henningsson76c21322014-06-24 14:46:54 +02007824 SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02007825 ALC292_STANDARD_PINS,
Hui Wang11580292015-08-03 11:03:49 +08007826 {0x12, 0x90a60140}),
David Henningsson76c21322014-06-24 14:46:54 +02007827 SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02007828 ALC292_STANDARD_PINS,
David Henningsson76c21322014-06-24 14:46:54 +02007829 {0x13, 0x90a60140},
David Henningsson76c21322014-06-24 14:46:54 +02007830 {0x16, 0x21014020},
Hui Wang11580292015-08-03 11:03:49 +08007831 {0x19, 0x21a19030}),
David Henningssone03fdbd2014-06-27 08:41:59 +02007832 SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02007833 ALC292_STANDARD_PINS,
Hui Wang11580292015-08-03 11:03:49 +08007834 {0x13, 0x90a60140}),
Chris Chiud8ae4582018-12-07 17:17:11 +08007835 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_MIC,
7836 {0x14, 0x90170110},
7837 {0x1b, 0x90a70130},
7838 {0x21, 0x04211020}),
Jian-Hong Pan0bea4cc2018-12-07 17:17:13 +08007839 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
7840 {0x12, 0x90a60130},
7841 {0x17, 0x90170110},
Jian-Hong Pan8bb37a22019-02-21 17:00:18 +08007842 {0x21, 0x03211020}),
7843 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
7844 {0x12, 0x90a60130},
7845 {0x17, 0x90170110},
Jian-Hong Pan0bea4cc2018-12-07 17:17:13 +08007846 {0x21, 0x04211020}),
Takashi Iwai3887c262019-04-30 15:10:01 +02007847 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
7848 {0x12, 0x90a60130},
7849 {0x17, 0x90170110},
7850 {0x21, 0x03211020}),
Kailang Yangfbc57122019-07-15 10:41:50 +08007851 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
Kailang Yang0a29c572019-04-24 16:34:25 +08007852 {0x14, 0x90170110},
7853 {0x21, 0x04211020}),
Kailang Yangfbc57122019-07-15 10:41:50 +08007854 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
7855 {0x14, 0x90170110},
7856 {0x21, 0x04211030}),
Hui Wang3f6409702016-09-11 11:26:16 +08007857 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wangf771d5b2016-10-18 10:59:09 +08007858 ALC295_STANDARD_PINS,
7859 {0x17, 0x21014020},
7860 {0x18, 0x21a19030}),
7861 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
7862 ALC295_STANDARD_PINS,
7863 {0x17, 0x21014040},
7864 {0x18, 0x21a19050}),
Hui Wang3f307832017-03-23 10:00:25 +08007865 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
7866 ALC295_STANDARD_PINS),
Kailang Yang977e6272015-05-18 15:31:20 +08007867 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
Woodrow Shen703867e2015-08-05 12:34:12 +08007868 ALC298_STANDARD_PINS,
Takashi Iwai9f502ff2015-08-05 12:09:45 +02007869 {0x17, 0x90170110}),
7870 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
7871 ALC298_STANDARD_PINS,
Woodrow Shen703867e2015-08-05 12:34:12 +08007872 {0x17, 0x90170140}),
7873 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
7874 ALC298_STANDARD_PINS,
Takashi Iwai9f502ff2015-08-05 12:09:45 +02007875 {0x17, 0x90170150}),
Kai-Heng Feng9f1bc2c42017-02-16 15:26:54 +08007876 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_SPK_VOLUME,
7877 {0x12, 0xb7a60140},
7878 {0x13, 0xb7a60150},
7879 {0x17, 0x90170110},
7880 {0x1a, 0x03011020},
7881 {0x21, 0x03211030}),
James McDonnell54324222019-09-16 14:53:38 +00007882 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
7883 {0x12, 0xb7a60140},
7884 {0x17, 0x90170110},
7885 {0x1a, 0x03a11030},
7886 {0x21, 0x03211020}),
Kailang Yangfcc6c872017-06-29 15:21:27 +08007887 SND_HDA_PIN_QUIRK(0x10ec0299, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
7888 ALC225_STANDARD_PINS,
7889 {0x12, 0xb7a60130},
Kailang Yangfcc6c872017-06-29 15:21:27 +08007890 {0x17, 0x90170110}),
Hui Wange1918932014-05-26 16:22:44 +08007891 {}
7892};
Takashi Iwai1d045db2011-07-07 18:23:21 +02007893
Hui Wang7c0a6932019-08-16 14:27:40 +08007894/* This is the fallback pin_fixup_tbl for alc269 family, to make the tbl match
7895 * more machines, don't need to match all valid pins, just need to match
7896 * all the pins defined in the tbl. Just because of this reason, it is possible
7897 * that a single machine matches multiple tbls, so there is one limitation:
7898 * at most one tbl is allowed to define for the same vendor and same codec
7899 */
7900static const struct snd_hda_pin_quirk alc269_fallback_pin_fixup_tbl[] = {
7901 SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
7902 {0x19, 0x40000000},
7903 {0x1b, 0x40000000}),
Hui Wangaed8c7f2019-11-21 10:26:43 +08007904 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7905 {0x19, 0x40000000},
7906 {0x1a, 0x40000000}),
Hui Wangd64ebdb2019-11-21 10:26:44 +08007907 SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7908 {0x19, 0x40000000},
7909 {0x1a, 0x40000000}),
Hui Wang5815bdf2019-12-11 13:13:21 +08007910 SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
7911 {0x19, 0x40000000},
7912 {0x1a, 0x40000000}),
Hui Wang7c0a6932019-08-16 14:27:40 +08007913 {}
7914};
7915
Takashi Iwai546bb672012-03-07 08:37:19 +01007916static void alc269_fill_coef(struct hda_codec *codec)
Takashi Iwai1d045db2011-07-07 18:23:21 +02007917{
Kailang Yang526af6e2012-03-07 08:25:20 +01007918 struct alc_spec *spec = codec->spec;
Takashi Iwai1d045db2011-07-07 18:23:21 +02007919 int val;
7920
Kailang Yang526af6e2012-03-07 08:25:20 +01007921 if (spec->codec_variant != ALC269_TYPE_ALC269VB)
Takashi Iwai546bb672012-03-07 08:37:19 +01007922 return;
Kailang Yang526af6e2012-03-07 08:25:20 +01007923
Takashi Iwai1bb7e432011-10-17 16:50:59 +02007924 if ((alc_get_coef0(codec) & 0x00ff) < 0x015) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02007925 alc_write_coef_idx(codec, 0xf, 0x960b);
7926 alc_write_coef_idx(codec, 0xe, 0x8817);
7927 }
7928
Takashi Iwai1bb7e432011-10-17 16:50:59 +02007929 if ((alc_get_coef0(codec) & 0x00ff) == 0x016) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02007930 alc_write_coef_idx(codec, 0xf, 0x960b);
7931 alc_write_coef_idx(codec, 0xe, 0x8814);
7932 }
7933
Takashi Iwai1bb7e432011-10-17 16:50:59 +02007934 if ((alc_get_coef0(codec) & 0x00ff) == 0x017) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02007935 /* Power up output pin */
Takashi Iwai98b24882014-08-18 13:47:50 +02007936 alc_update_coef_idx(codec, 0x04, 0, 1<<11);
Takashi Iwai1d045db2011-07-07 18:23:21 +02007937 }
7938
Takashi Iwai1bb7e432011-10-17 16:50:59 +02007939 if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02007940 val = alc_read_coef_idx(codec, 0xd);
Takashi Iwaif3ee07d2014-08-15 17:35:00 +02007941 if (val != -1 && (val & 0x0c00) >> 10 != 0x1) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02007942 /* Capless ramp up clock control */
7943 alc_write_coef_idx(codec, 0xd, val | (1<<10));
7944 }
7945 val = alc_read_coef_idx(codec, 0x17);
Takashi Iwaif3ee07d2014-08-15 17:35:00 +02007946 if (val != -1 && (val & 0x01c0) >> 6 != 0x4) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02007947 /* Class D power on reset */
7948 alc_write_coef_idx(codec, 0x17, val | (1<<7));
7949 }
7950 }
7951
Takashi Iwai98b24882014-08-18 13:47:50 +02007952 /* HP */
7953 alc_update_coef_idx(codec, 0x4, 0, 1<<11);
Takashi Iwai1d045db2011-07-07 18:23:21 +02007954}
7955
7956/*
7957 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02007958static int patch_alc269(struct hda_codec *codec)
7959{
7960 struct alc_spec *spec;
Takashi Iwai3de95172012-05-07 18:03:15 +02007961 int err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02007962
Takashi Iwai3de95172012-05-07 18:03:15 +02007963 err = alc_alloc_spec(codec, 0x0b);
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02007964 if (err < 0)
Takashi Iwai3de95172012-05-07 18:03:15 +02007965 return err;
7966
7967 spec = codec->spec;
Takashi Iwai08c189f2012-12-19 15:22:24 +01007968 spec->gen.shared_mic_vref_pin = 0x18;
Kailang Yang317d9312019-05-23 14:43:04 +08007969 codec->power_save_node = 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02007970
Takashi Iwai225068a2015-05-29 10:42:14 +02007971#ifdef CONFIG_PM
7972 codec->patch_ops.suspend = alc269_suspend;
7973 codec->patch_ops.resume = alc269_resume;
7974#endif
Kailang Yangc2d6af52017-06-21 14:50:54 +08007975 spec->shutup = alc_default_shutup;
7976 spec->init_hook = alc_default_init;
Takashi Iwai225068a2015-05-29 10:42:14 +02007977
Takashi Iwai7639a062015-03-03 10:07:24 +01007978 switch (codec->core.vendor_id) {
Kailang Yang065380f2013-01-10 10:25:48 +01007979 case 0x10ec0269:
Takashi Iwai1d045db2011-07-07 18:23:21 +02007980 spec->codec_variant = ALC269_TYPE_ALC269VA;
Takashi Iwai1bb7e432011-10-17 16:50:59 +02007981 switch (alc_get_coef0(codec) & 0x00f0) {
7982 case 0x0010:
Takashi Iwai5100cd02014-02-15 10:03:19 +01007983 if (codec->bus->pci &&
7984 codec->bus->pci->subsystem_vendor == 0x1025 &&
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02007985 spec->cdefine.platform_type == 1)
Takashi Iwai20ca0c32011-10-17 16:00:35 +02007986 err = alc_codec_rename(codec, "ALC271X");
Takashi Iwai1d045db2011-07-07 18:23:21 +02007987 spec->codec_variant = ALC269_TYPE_ALC269VB;
Takashi Iwai1bb7e432011-10-17 16:50:59 +02007988 break;
7989 case 0x0020:
Takashi Iwai5100cd02014-02-15 10:03:19 +01007990 if (codec->bus->pci &&
7991 codec->bus->pci->subsystem_vendor == 0x17aa &&
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02007992 codec->bus->pci->subsystem_device == 0x21f3)
Takashi Iwai20ca0c32011-10-17 16:00:35 +02007993 err = alc_codec_rename(codec, "ALC3202");
Takashi Iwai1d045db2011-07-07 18:23:21 +02007994 spec->codec_variant = ALC269_TYPE_ALC269VC;
Takashi Iwai1bb7e432011-10-17 16:50:59 +02007995 break;
Kailang Yangadcc70b2012-05-25 08:08:38 +02007996 case 0x0030:
7997 spec->codec_variant = ALC269_TYPE_ALC269VD;
7998 break;
Takashi Iwai1bb7e432011-10-17 16:50:59 +02007999 default:
Takashi Iwai1d045db2011-07-07 18:23:21 +02008000 alc_fix_pll_init(codec, 0x20, 0x04, 15);
Takashi Iwai1bb7e432011-10-17 16:50:59 +02008001 }
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008002 if (err < 0)
8003 goto error;
Kailang Yangc2d6af52017-06-21 14:50:54 +08008004 spec->shutup = alc269_shutup;
Takashi Iwai546bb672012-03-07 08:37:19 +01008005 spec->init_hook = alc269_fill_coef;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008006 alc269_fill_coef(codec);
Kailang Yang065380f2013-01-10 10:25:48 +01008007 break;
8008
8009 case 0x10ec0280:
8010 case 0x10ec0290:
8011 spec->codec_variant = ALC269_TYPE_ALC280;
8012 break;
8013 case 0x10ec0282:
Kailang Yang065380f2013-01-10 10:25:48 +01008014 spec->codec_variant = ALC269_TYPE_ALC282;
Kailang Yang7b5c7a02014-03-18 16:15:54 +08008015 spec->shutup = alc282_shutup;
8016 spec->init_hook = alc282_init;
Kailang Yang065380f2013-01-10 10:25:48 +01008017 break;
Kailang Yang2af02be2013-08-22 10:03:50 +02008018 case 0x10ec0233:
8019 case 0x10ec0283:
8020 spec->codec_variant = ALC269_TYPE_ALC283;
8021 spec->shutup = alc283_shutup;
8022 spec->init_hook = alc283_init;
8023 break;
Kailang Yang065380f2013-01-10 10:25:48 +01008024 case 0x10ec0284:
8025 case 0x10ec0292:
8026 spec->codec_variant = ALC269_TYPE_ALC284;
8027 break;
Kailang Yang161ebf22013-10-24 11:36:33 +02008028 case 0x10ec0293:
Kailang Yang4731d5d2017-06-30 15:22:57 +08008029 spec->codec_variant = ALC269_TYPE_ALC293;
Kailang Yang161ebf22013-10-24 11:36:33 +02008030 break;
Kailang Yang7fc7d042013-04-25 11:04:43 +02008031 case 0x10ec0286:
Kailang Yang7c665932014-04-14 15:09:44 +08008032 case 0x10ec0288:
Kailang Yang7fc7d042013-04-25 11:04:43 +02008033 spec->codec_variant = ALC269_TYPE_ALC286;
8034 break;
Kailang Yang506b62c2014-12-18 17:07:44 +08008035 case 0x10ec0298:
8036 spec->codec_variant = ALC269_TYPE_ALC298;
8037 break;
Kailang Yangea04a1d2018-04-25 15:31:52 +08008038 case 0x10ec0235:
Kailang Yang1d04c9d2013-10-24 11:35:18 +02008039 case 0x10ec0255:
8040 spec->codec_variant = ALC269_TYPE_ALC255;
Kailang Yangab3b8e52018-04-25 16:05:27 +08008041 spec->shutup = alc256_shutup;
8042 spec->init_hook = alc256_init;
Kailang Yang1d04c9d2013-10-24 11:35:18 +02008043 break;
Kailang Yang736f20a2017-10-20 15:06:34 +08008044 case 0x10ec0236:
Kailang Yang4344aec2014-12-17 17:39:05 +08008045 case 0x10ec0256:
8046 spec->codec_variant = ALC269_TYPE_ALC256;
Kailang Yang4a219ef2017-06-16 16:54:35 +08008047 spec->shutup = alc256_shutup;
8048 spec->init_hook = alc256_init;
David Henningsson7d1b6e22015-04-21 10:48:46 +02008049 spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */
Kailang Yang4344aec2014-12-17 17:39:05 +08008050 break;
Kailang Yangf429e7e2017-12-05 15:38:24 +08008051 case 0x10ec0257:
8052 spec->codec_variant = ALC269_TYPE_ALC257;
Kailang Yang88d42b22018-03-14 16:08:57 +08008053 spec->shutup = alc256_shutup;
8054 spec->init_hook = alc256_init;
Kailang Yangf429e7e2017-12-05 15:38:24 +08008055 spec->gen.mixer_nid = 0;
8056 break;
Kailang Yang0a6f0602017-06-30 16:00:48 +08008057 case 0x10ec0215:
8058 case 0x10ec0285:
8059 case 0x10ec0289:
8060 spec->codec_variant = ALC269_TYPE_ALC215;
Kailang Yang1b6832be2018-01-17 15:32:03 +08008061 spec->shutup = alc225_shutup;
8062 spec->init_hook = alc225_init;
Kailang Yang0a6f0602017-06-30 16:00:48 +08008063 spec->gen.mixer_nid = 0;
8064 break;
Kailang Yang42314302016-02-03 15:03:50 +08008065 case 0x10ec0225:
Kai-Heng Feng3b36b132020-03-11 14:13:28 +08008066 codec->power_save_node = 1;
8067 /* fall through */
Kailang Yang7d727862016-05-24 16:46:07 +08008068 case 0x10ec0295:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08008069 case 0x10ec0299:
Kailang Yang42314302016-02-03 15:03:50 +08008070 spec->codec_variant = ALC269_TYPE_ALC225;
Kailang Yangda911b12018-01-05 16:50:08 +08008071 spec->shutup = alc225_shutup;
8072 spec->init_hook = alc225_init;
Takashi Iwaic1350bf2017-12-27 09:03:45 +01008073 spec->gen.mixer_nid = 0; /* no loopback on ALC225, ALC295 and ALC299 */
Kailang Yang42314302016-02-03 15:03:50 +08008074 break;
Kailang Yangdcd4f0d2016-05-04 15:50:18 +08008075 case 0x10ec0234:
8076 case 0x10ec0274:
8077 case 0x10ec0294:
8078 spec->codec_variant = ALC269_TYPE_ALC294;
Hui Wang532a7782017-06-26 12:30:32 +08008079 spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */
Kailang Yang71683c32017-06-20 16:33:50 +08008080 alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */
Kailang Yang693abe12019-01-29 15:38:21 +08008081 spec->init_hook = alc294_init;
Kailang Yangdcd4f0d2016-05-04 15:50:18 +08008082 break;
Kailang Yang1078bef2018-11-08 16:36:15 +08008083 case 0x10ec0300:
8084 spec->codec_variant = ALC269_TYPE_ALC300;
8085 spec->gen.mixer_nid = 0; /* no loopback on ALC300 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02008086 break;
Kailang Yangf0778872019-10-24 15:13:32 +08008087 case 0x10ec0623:
8088 spec->codec_variant = ALC269_TYPE_ALC623;
8089 break;
Kailang Yang6fbae352016-05-30 16:44:20 +08008090 case 0x10ec0700:
8091 case 0x10ec0701:
8092 case 0x10ec0703:
Kailang Yang83629532019-05-02 16:03:26 +08008093 case 0x10ec0711:
Kailang Yang6fbae352016-05-30 16:44:20 +08008094 spec->codec_variant = ALC269_TYPE_ALC700;
8095 spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */
Kailang Yang2d7fe612017-11-22 15:21:32 +08008096 alc_update_coef_idx(codec, 0x4a, 1 << 15, 0); /* Combo jack auto trigger control */
Kailang Yang693abe12019-01-29 15:38:21 +08008097 spec->init_hook = alc294_init;
Kailang Yang6fbae352016-05-30 16:44:20 +08008098 break;
8099
Takashi Iwai1d045db2011-07-07 18:23:21 +02008100 }
8101
Kailang Yangad60d502013-06-28 12:03:01 +02008102 if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) {
Kailang Yang97a26572013-11-29 00:35:26 -05008103 spec->has_alc5505_dsp = 1;
Kailang Yangad60d502013-06-28 12:03:01 +02008104 spec->init_hook = alc5505_dsp_init;
8105 }
8106
Takashi Iwaic9af7532019-05-10 11:01:43 +02008107 alc_pre_init(codec);
8108
Takashi Iwaiefe55732018-06-15 11:55:02 +02008109 snd_hda_pick_fixup(codec, alc269_fixup_models,
8110 alc269_fixup_tbl, alc269_fixups);
Hui Wang0fc1e442019-08-16 14:27:39 +08008111 snd_hda_pick_pin_fixup(codec, alc269_pin_fixup_tbl, alc269_fixups, true);
Hui Wang7c0a6932019-08-16 14:27:40 +08008112 snd_hda_pick_pin_fixup(codec, alc269_fallback_pin_fixup_tbl, alc269_fixups, false);
Takashi Iwaiefe55732018-06-15 11:55:02 +02008113 snd_hda_pick_fixup(codec, NULL, alc269_fixup_vendor_tbl,
8114 alc269_fixups);
8115 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
8116
8117 alc_auto_parse_customize_define(codec);
8118
8119 if (has_cdefine_beep(codec))
8120 spec->gen.beep_nid = 0x01;
8121
Takashi Iwaia4297b52011-08-23 18:40:12 +02008122 /* automatic parse from the BIOS config */
8123 err = alc269_parse_auto_config(codec);
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008124 if (err < 0)
8125 goto error;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008126
Takashi Iwaifea80fa2018-06-20 12:52:46 +02008127 if (!spec->gen.no_analog && spec->gen.beep_nid && spec->gen.mixer_nid) {
8128 err = set_beep_amp(spec, spec->gen.mixer_nid, 0x04, HDA_INPUT);
8129 if (err < 0)
8130 goto error;
8131 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02008132
Takashi Iwai1727a772013-01-10 09:52:52 +01008133 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01008134
Takashi Iwai1d045db2011-07-07 18:23:21 +02008135 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008136
8137 error:
8138 alc_free(codec);
8139 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008140}
8141
8142/*
8143 * ALC861
8144 */
8145
Takashi Iwai1d045db2011-07-07 18:23:21 +02008146static int alc861_parse_auto_config(struct hda_codec *codec)
8147{
Takashi Iwai1d045db2011-07-07 18:23:21 +02008148 static const hda_nid_t alc861_ignore[] = { 0x1d, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02008149 static const hda_nid_t alc861_ssids[] = { 0x0e, 0x0f, 0x0b, 0 };
8150 return alc_parse_auto_config(codec, alc861_ignore, alc861_ssids);
Takashi Iwai1d045db2011-07-07 18:23:21 +02008151}
8152
Takashi Iwai1d045db2011-07-07 18:23:21 +02008153/* Pin config fixes */
8154enum {
Takashi Iwaie652f4c2012-02-13 11:56:25 +01008155 ALC861_FIXUP_FSC_AMILO_PI1505,
8156 ALC861_FIXUP_AMP_VREF_0F,
8157 ALC861_FIXUP_NO_JACK_DETECT,
8158 ALC861_FIXUP_ASUS_A6RP,
Takashi Iwai6ddf0fd2013-11-29 12:47:34 +01008159 ALC660_FIXUP_ASUS_W7J,
Takashi Iwai1d045db2011-07-07 18:23:21 +02008160};
8161
Takashi Iwai31150f22012-01-30 10:54:08 +01008162/* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */
8163static void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01008164 const struct hda_fixup *fix, int action)
Takashi Iwai31150f22012-01-30 10:54:08 +01008165{
8166 struct alc_spec *spec = codec->spec;
8167 unsigned int val;
8168
Takashi Iwai1727a772013-01-10 09:52:52 +01008169 if (action != HDA_FIXUP_ACT_INIT)
Takashi Iwai31150f22012-01-30 10:54:08 +01008170 return;
Takashi Iwaid3f02d62013-01-10 10:12:22 +01008171 val = snd_hda_codec_get_pin_target(codec, 0x0f);
Takashi Iwai31150f22012-01-30 10:54:08 +01008172 if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)))
8173 val |= AC_PINCTL_IN_EN;
8174 val |= AC_PINCTL_VREF_50;
Takashi Iwaicdd03ce2012-04-20 12:34:50 +02008175 snd_hda_set_pin_ctl(codec, 0x0f, val);
Takashi Iwai08c189f2012-12-19 15:22:24 +01008176 spec->gen.keep_vref_in_automute = 1;
Takashi Iwai31150f22012-01-30 10:54:08 +01008177}
8178
Takashi Iwaie652f4c2012-02-13 11:56:25 +01008179/* suppress the jack-detection */
8180static void alc_fixup_no_jack_detect(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01008181 const struct hda_fixup *fix, int action)
Takashi Iwaie652f4c2012-02-13 11:56:25 +01008182{
Takashi Iwai1727a772013-01-10 09:52:52 +01008183 if (action == HDA_FIXUP_ACT_PRE_PROBE)
Takashi Iwaie652f4c2012-02-13 11:56:25 +01008184 codec->no_jack_detect = 1;
Jesper Juhl7d7eb9e2012-04-12 22:11:25 +02008185}
Takashi Iwaie652f4c2012-02-13 11:56:25 +01008186
Takashi Iwai1727a772013-01-10 09:52:52 +01008187static const struct hda_fixup alc861_fixups[] = {
Takashi Iwaie652f4c2012-02-13 11:56:25 +01008188 [ALC861_FIXUP_FSC_AMILO_PI1505] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008189 .type = HDA_FIXUP_PINS,
8190 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02008191 { 0x0b, 0x0221101f }, /* HP */
8192 { 0x0f, 0x90170310 }, /* speaker */
8193 { }
8194 }
8195 },
Takashi Iwaie652f4c2012-02-13 11:56:25 +01008196 [ALC861_FIXUP_AMP_VREF_0F] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008197 .type = HDA_FIXUP_FUNC,
Takashi Iwai31150f22012-01-30 10:54:08 +01008198 .v.func = alc861_fixup_asus_amp_vref_0f,
Takashi Iwai3b25eb62012-01-25 09:55:46 +01008199 },
Takashi Iwaie652f4c2012-02-13 11:56:25 +01008200 [ALC861_FIXUP_NO_JACK_DETECT] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008201 .type = HDA_FIXUP_FUNC,
Takashi Iwaie652f4c2012-02-13 11:56:25 +01008202 .v.func = alc_fixup_no_jack_detect,
8203 },
8204 [ALC861_FIXUP_ASUS_A6RP] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008205 .type = HDA_FIXUP_FUNC,
Takashi Iwaie652f4c2012-02-13 11:56:25 +01008206 .v.func = alc861_fixup_asus_amp_vref_0f,
8207 .chained = true,
8208 .chain_id = ALC861_FIXUP_NO_JACK_DETECT,
Takashi Iwai6ddf0fd2013-11-29 12:47:34 +01008209 },
8210 [ALC660_FIXUP_ASUS_W7J] = {
8211 .type = HDA_FIXUP_VERBS,
8212 .v.verbs = (const struct hda_verb[]) {
8213 /* ASUS W7J needs a magic pin setup on unused NID 0x10
8214 * for enabling outputs
8215 */
8216 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
8217 { }
8218 },
Takashi Iwaie652f4c2012-02-13 11:56:25 +01008219 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02008220};
8221
8222static const struct snd_pci_quirk alc861_fixup_tbl[] = {
Takashi Iwai6ddf0fd2013-11-29 12:47:34 +01008223 SND_PCI_QUIRK(0x1043, 0x1253, "ASUS W7J", ALC660_FIXUP_ASUS_W7J),
Takashi Iwaie7ca2372013-12-02 15:27:19 +01008224 SND_PCI_QUIRK(0x1043, 0x1263, "ASUS Z35HL", ALC660_FIXUP_ASUS_W7J),
Takashi Iwaie652f4c2012-02-13 11:56:25 +01008225 SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP),
8226 SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", ALC861_FIXUP_AMP_VREF_0F),
8227 SND_PCI_QUIRK(0x1462, 0x7254, "HP DX2200", ALC861_FIXUP_NO_JACK_DETECT),
8228 SND_PCI_QUIRK(0x1584, 0x2b01, "Haier W18", ALC861_FIXUP_AMP_VREF_0F),
8229 SND_PCI_QUIRK(0x1584, 0x0000, "Uniwill ECS M31EI", ALC861_FIXUP_AMP_VREF_0F),
8230 SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", ALC861_FIXUP_FSC_AMILO_PI1505),
Takashi Iwai1d045db2011-07-07 18:23:21 +02008231 {}
8232};
8233
8234/*
8235 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02008236static int patch_alc861(struct hda_codec *codec)
8237{
8238 struct alc_spec *spec;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008239 int err;
8240
Takashi Iwai3de95172012-05-07 18:03:15 +02008241 err = alc_alloc_spec(codec, 0x15);
8242 if (err < 0)
8243 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008244
Takashi Iwai3de95172012-05-07 18:03:15 +02008245 spec = codec->spec;
Takashi Iwai2722b532019-08-22 09:55:37 +02008246 if (has_cdefine_beep(codec))
8247 spec->gen.beep_nid = 0x23;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008248
Takashi Iwai225068a2015-05-29 10:42:14 +02008249#ifdef CONFIG_PM
8250 spec->power_hook = alc_power_eapd;
8251#endif
8252
Takashi Iwaic9af7532019-05-10 11:01:43 +02008253 alc_pre_init(codec);
8254
Takashi Iwai1727a772013-01-10 09:52:52 +01008255 snd_hda_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);
8256 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai1d045db2011-07-07 18:23:21 +02008257
Takashi Iwaicb4e4822011-08-23 17:34:25 +02008258 /* automatic parse from the BIOS config */
8259 err = alc861_parse_auto_config(codec);
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008260 if (err < 0)
8261 goto error;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008262
Takashi Iwaifea80fa2018-06-20 12:52:46 +02008263 if (!spec->gen.no_analog) {
8264 err = set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
8265 if (err < 0)
8266 goto error;
8267 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02008268
Takashi Iwai1727a772013-01-10 09:52:52 +01008269 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01008270
Takashi Iwai1d045db2011-07-07 18:23:21 +02008271 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008272
8273 error:
8274 alc_free(codec);
8275 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008276}
8277
8278/*
8279 * ALC861-VD support
8280 *
8281 * Based on ALC882
8282 *
8283 * In addition, an independent DAC
8284 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02008285static int alc861vd_parse_auto_config(struct hda_codec *codec)
8286{
Takashi Iwai1d045db2011-07-07 18:23:21 +02008287 static const hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02008288 static const hda_nid_t alc861vd_ssids[] = { 0x15, 0x1b, 0x14, 0 };
8289 return alc_parse_auto_config(codec, alc861vd_ignore, alc861vd_ssids);
Takashi Iwai1d045db2011-07-07 18:23:21 +02008290}
8291
Takashi Iwai1d045db2011-07-07 18:23:21 +02008292enum {
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02008293 ALC660VD_FIX_ASUS_GPIO1,
8294 ALC861VD_FIX_DALLAS,
Takashi Iwai1d045db2011-07-07 18:23:21 +02008295};
8296
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02008297/* exclude VREF80 */
8298static void alc861vd_fixup_dallas(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01008299 const struct hda_fixup *fix, int action)
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02008300{
Takashi Iwai1727a772013-01-10 09:52:52 +01008301 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwaib78562b2012-12-17 20:06:49 +01008302 snd_hda_override_pin_caps(codec, 0x18, 0x00000734);
8303 snd_hda_override_pin_caps(codec, 0x19, 0x0000073c);
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02008304 }
8305}
8306
Takashi Iwaidf73d832018-06-19 23:05:47 +02008307/* reset GPIO1 */
8308static void alc660vd_fixup_asus_gpio1(struct hda_codec *codec,
8309 const struct hda_fixup *fix, int action)
8310{
8311 struct alc_spec *spec = codec->spec;
8312
8313 if (action == HDA_FIXUP_ACT_PRE_PROBE)
8314 spec->gpio_mask |= 0x02;
8315 alc_fixup_gpio(codec, action, 0x01);
8316}
8317
Takashi Iwai1727a772013-01-10 09:52:52 +01008318static const struct hda_fixup alc861vd_fixups[] = {
Takashi Iwai1d045db2011-07-07 18:23:21 +02008319 [ALC660VD_FIX_ASUS_GPIO1] = {
Takashi Iwaidf73d832018-06-19 23:05:47 +02008320 .type = HDA_FIXUP_FUNC,
8321 .v.func = alc660vd_fixup_asus_gpio1,
Takashi Iwai1d045db2011-07-07 18:23:21 +02008322 },
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02008323 [ALC861VD_FIX_DALLAS] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008324 .type = HDA_FIXUP_FUNC,
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02008325 .v.func = alc861vd_fixup_dallas,
8326 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02008327};
8328
8329static const struct snd_pci_quirk alc861vd_fixup_tbl[] = {
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02008330 SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_FIX_DALLAS),
Takashi Iwai1d045db2011-07-07 18:23:21 +02008331 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02008332 SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_FIX_DALLAS),
Takashi Iwai1d045db2011-07-07 18:23:21 +02008333 {}
8334};
8335
Takashi Iwai1d045db2011-07-07 18:23:21 +02008336/*
8337 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02008338static int patch_alc861vd(struct hda_codec *codec)
8339{
8340 struct alc_spec *spec;
Takashi Iwaicb4e4822011-08-23 17:34:25 +02008341 int err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008342
Takashi Iwai3de95172012-05-07 18:03:15 +02008343 err = alc_alloc_spec(codec, 0x0b);
8344 if (err < 0)
8345 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008346
Takashi Iwai3de95172012-05-07 18:03:15 +02008347 spec = codec->spec;
Takashi Iwai2722b532019-08-22 09:55:37 +02008348 if (has_cdefine_beep(codec))
8349 spec->gen.beep_nid = 0x23;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008350
Takashi Iwai225068a2015-05-29 10:42:14 +02008351 spec->shutup = alc_eapd_shutup;
8352
Takashi Iwaic9af7532019-05-10 11:01:43 +02008353 alc_pre_init(codec);
8354
Takashi Iwai1727a772013-01-10 09:52:52 +01008355 snd_hda_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);
8356 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai1d045db2011-07-07 18:23:21 +02008357
Takashi Iwaicb4e4822011-08-23 17:34:25 +02008358 /* automatic parse from the BIOS config */
8359 err = alc861vd_parse_auto_config(codec);
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008360 if (err < 0)
8361 goto error;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008362
Takashi Iwaifea80fa2018-06-20 12:52:46 +02008363 if (!spec->gen.no_analog) {
8364 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
8365 if (err < 0)
8366 goto error;
8367 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02008368
Takashi Iwai1727a772013-01-10 09:52:52 +01008369 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01008370
Takashi Iwai1d045db2011-07-07 18:23:21 +02008371 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008372
8373 error:
8374 alc_free(codec);
8375 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008376}
8377
8378/*
8379 * ALC662 support
8380 *
8381 * ALC662 is almost identical with ALC880 but has cleaner and more flexible
8382 * configuration. Each pin widget can choose any input DACs and a mixer.
8383 * Each ADC is connected from a mixer of all inputs. This makes possible
8384 * 6-channel independent captures.
8385 *
8386 * In addition, an independent DAC for the multi-playback (not used in this
8387 * driver yet).
8388 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02008389
8390/*
8391 * BIOS auto configuration
8392 */
8393
Kailang Yangbc9f98a2007-04-12 13:06:07 +02008394static int alc662_parse_auto_config(struct hda_codec *codec)
8395{
Takashi Iwai4c6d72d2011-05-02 11:30:18 +02008396 static const hda_nid_t alc662_ignore[] = { 0x1d, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02008397 static const hda_nid_t alc663_ssids[] = { 0x15, 0x1b, 0x14, 0x21 };
8398 static const hda_nid_t alc662_ssids[] = { 0x15, 0x1b, 0x14, 0 };
8399 const hda_nid_t *ssids;
Takashi Iwaiee979a142008-09-02 15:42:20 +02008400
Takashi Iwai7639a062015-03-03 10:07:24 +01008401 if (codec->core.vendor_id == 0x10ec0272 || codec->core.vendor_id == 0x10ec0663 ||
8402 codec->core.vendor_id == 0x10ec0665 || codec->core.vendor_id == 0x10ec0670 ||
8403 codec->core.vendor_id == 0x10ec0671)
Takashi Iwai3e6179b2011-07-08 16:55:13 +02008404 ssids = alc663_ssids;
Kailang Yang6227cdc2010-02-25 08:36:52 +01008405 else
Takashi Iwai3e6179b2011-07-08 16:55:13 +02008406 ssids = alc662_ssids;
8407 return alc_parse_auto_config(codec, alc662_ignore, ssids);
Kailang Yangbc9f98a2007-04-12 13:06:07 +02008408}
8409
Todd Broch6be79482010-12-07 16:51:05 -08008410static void alc272_fixup_mario(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01008411 const struct hda_fixup *fix, int action)
Takashi Iwai6fc398c2011-01-13 14:36:37 +01008412{
Takashi Iwai9bb1f062013-01-10 17:14:29 +01008413 if (action != HDA_FIXUP_ACT_PRE_PROBE)
Takashi Iwai6fc398c2011-01-13 14:36:37 +01008414 return;
Todd Broch6be79482010-12-07 16:51:05 -08008415 if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
8416 (0x3b << AC_AMPCAP_OFFSET_SHIFT) |
8417 (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |
8418 (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |
8419 (0 << AC_AMPCAP_MUTE_SHIFT)))
Takashi Iwai4e76a882014-02-25 12:21:03 +01008420 codec_warn(codec, "failed to override amp caps for NID 0x2\n");
Todd Broch6be79482010-12-07 16:51:05 -08008421}
8422
Takashi Iwai8e383952013-10-30 17:41:12 +01008423static const struct snd_pcm_chmap_elem asus_pcm_2_1_chmaps[] = {
8424 { .channels = 2,
8425 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
8426 { .channels = 4,
8427 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
8428 SNDRV_CHMAP_NA, SNDRV_CHMAP_LFE } }, /* LFE only on right */
8429 { }
8430};
8431
8432/* override the 2.1 chmap */
Takashi Iwaieb9ca3a2013-11-28 15:24:34 +01008433static void alc_fixup_bass_chmap(struct hda_codec *codec,
Takashi Iwai8e383952013-10-30 17:41:12 +01008434 const struct hda_fixup *fix, int action)
8435{
8436 if (action == HDA_FIXUP_ACT_BUILD) {
8437 struct alc_spec *spec = codec->spec;
Takashi Iwaibbbc7e82015-02-27 17:43:19 +01008438 spec->gen.pcm_rec[0]->stream[0].chmap = asus_pcm_2_1_chmaps;
Takashi Iwai8e383952013-10-30 17:41:12 +01008439 }
8440}
8441
Takashi Iwaibf686652014-01-13 16:18:25 +01008442/* avoid D3 for keeping GPIO up */
8443static unsigned int gpio_led_power_filter(struct hda_codec *codec,
8444 hda_nid_t nid,
8445 unsigned int power_state)
8446{
8447 struct alc_spec *spec = codec->spec;
Takashi Iwaid261eec2018-06-19 22:32:29 +02008448 if (nid == codec->core.afg && power_state == AC_PWRST_D3 && spec->gpio_data)
Takashi Iwaibf686652014-01-13 16:18:25 +01008449 return AC_PWRST_D0;
8450 return power_state;
8451}
8452
Takashi Iwai3e887f32014-01-10 17:50:58 +01008453static void alc662_fixup_led_gpio1(struct hda_codec *codec,
8454 const struct hda_fixup *fix, int action)
8455{
8456 struct alc_spec *spec = codec->spec;
Takashi Iwai3e887f32014-01-10 17:50:58 +01008457
Takashi Iwai01e4a272018-06-19 22:47:30 +02008458 alc_fixup_hp_gpio_led(codec, action, 0x01, 0);
Takashi Iwai3e887f32014-01-10 17:50:58 +01008459 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai0f32fd192014-11-19 12:16:14 +01008460 spec->mute_led_polarity = 1;
Takashi Iwaibf686652014-01-13 16:18:25 +01008461 codec->power_filter = gpio_led_power_filter;
Takashi Iwai3e887f32014-01-10 17:50:58 +01008462 }
8463}
8464
Kailang Yangc6790c82016-11-25 16:15:17 +08008465static void alc662_usi_automute_hook(struct hda_codec *codec,
8466 struct hda_jack_callback *jack)
8467{
8468 struct alc_spec *spec = codec->spec;
8469 int vref;
8470 msleep(200);
8471 snd_hda_gen_hp_automute(codec, jack);
8472
8473 vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
8474 msleep(100);
8475 snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
8476 vref);
8477}
8478
8479static void alc662_fixup_usi_headset_mic(struct hda_codec *codec,
8480 const struct hda_fixup *fix, int action)
8481{
8482 struct alc_spec *spec = codec->spec;
8483 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
8484 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
8485 spec->gen.hp_automute_hook = alc662_usi_automute_hook;
8486 }
8487}
8488
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02008489static void alc662_aspire_ethos_mute_speakers(struct hda_codec *codec,
8490 struct hda_jack_callback *cb)
8491{
8492 /* surround speakers at 0x1b already get muted automatically when
8493 * headphones are plugged in, but we have to mute/unmute the remaining
8494 * channels manually:
8495 * 0x15 - front left/front right
8496 * 0x18 - front center/ LFE
8497 */
8498 if (snd_hda_jack_detect_state(codec, 0x1b) == HDA_JACK_PRESENT) {
8499 snd_hda_set_pin_ctl_cache(codec, 0x15, 0);
8500 snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
8501 } else {
8502 snd_hda_set_pin_ctl_cache(codec, 0x15, PIN_OUT);
8503 snd_hda_set_pin_ctl_cache(codec, 0x18, PIN_OUT);
8504 }
8505}
8506
8507static void alc662_fixup_aspire_ethos_hp(struct hda_codec *codec,
8508 const struct hda_fixup *fix, int action)
8509{
8510 /* Pin 0x1b: shared headphones jack and surround speakers */
8511 if (!is_jack_detectable(codec, 0x1b))
8512 return;
8513
8514 switch (action) {
8515 case HDA_FIXUP_ACT_PRE_PROBE:
8516 snd_hda_jack_detect_enable_callback(codec, 0x1b,
8517 alc662_aspire_ethos_mute_speakers);
Takashi Iwai336820c2019-11-28 21:26:30 +01008518 /* subwoofer needs an extra GPIO setting to become audible */
8519 alc_setup_gpio(codec, 0x02);
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02008520 break;
8521 case HDA_FIXUP_ACT_INIT:
8522 /* Make sure to start in a correct state, i.e. if
8523 * headphones have been plugged in before powering up the system
8524 */
8525 alc662_aspire_ethos_mute_speakers(codec, NULL);
8526 break;
8527 }
8528}
8529
Kailang Yang5af290282020-01-17 14:04:01 +08008530static void alc671_fixup_hp_headset_mic2(struct hda_codec *codec,
8531 const struct hda_fixup *fix, int action)
8532{
8533 struct alc_spec *spec = codec->spec;
8534
8535 static const struct hda_pintbl pincfgs[] = {
8536 { 0x19, 0x02a11040 }, /* use as headset mic, with its own jack detect */
8537 { 0x1b, 0x0181304f },
8538 { }
8539 };
8540
8541 switch (action) {
8542 case HDA_FIXUP_ACT_PRE_PROBE:
8543 spec->gen.mixer_nid = 0;
8544 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
8545 snd_hda_apply_pincfgs(codec, pincfgs);
8546 break;
8547 case HDA_FIXUP_ACT_INIT:
8548 alc_write_coef_idx(codec, 0x19, 0xa054);
8549 break;
8550 }
8551}
8552
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01008553static const struct coef_fw alc668_coefs[] = {
Kailang Yangf3f91852014-10-24 15:43:46 +08008554 WRITE_COEF(0x01, 0xbebe), WRITE_COEF(0x02, 0xaaaa), WRITE_COEF(0x03, 0x0),
8555 WRITE_COEF(0x04, 0x0180), WRITE_COEF(0x06, 0x0), WRITE_COEF(0x07, 0x0f80),
8556 WRITE_COEF(0x08, 0x0031), WRITE_COEF(0x0a, 0x0060), WRITE_COEF(0x0b, 0x0),
8557 WRITE_COEF(0x0c, 0x7cf7), WRITE_COEF(0x0d, 0x1080), WRITE_COEF(0x0e, 0x7f7f),
8558 WRITE_COEF(0x0f, 0xcccc), WRITE_COEF(0x10, 0xddcc), WRITE_COEF(0x11, 0x0001),
8559 WRITE_COEF(0x13, 0x0), WRITE_COEF(0x14, 0x2aa0), WRITE_COEF(0x17, 0xa940),
8560 WRITE_COEF(0x19, 0x0), WRITE_COEF(0x1a, 0x0), WRITE_COEF(0x1b, 0x0),
8561 WRITE_COEF(0x1c, 0x0), WRITE_COEF(0x1d, 0x0), WRITE_COEF(0x1e, 0x7418),
8562 WRITE_COEF(0x1f, 0x0804), WRITE_COEF(0x20, 0x4200), WRITE_COEF(0x21, 0x0468),
8563 WRITE_COEF(0x22, 0x8ccc), WRITE_COEF(0x23, 0x0250), WRITE_COEF(0x24, 0x7418),
8564 WRITE_COEF(0x27, 0x0), WRITE_COEF(0x28, 0x8ccc), WRITE_COEF(0x2a, 0xff00),
8565 WRITE_COEF(0x2b, 0x8000), WRITE_COEF(0xa7, 0xff00), WRITE_COEF(0xa8, 0x8000),
8566 WRITE_COEF(0xaa, 0x2e17), WRITE_COEF(0xab, 0xa0c0), WRITE_COEF(0xac, 0x0),
8567 WRITE_COEF(0xad, 0x0), WRITE_COEF(0xae, 0x2ac6), WRITE_COEF(0xaf, 0xa480),
8568 WRITE_COEF(0xb0, 0x0), WRITE_COEF(0xb1, 0x0), WRITE_COEF(0xb2, 0x0),
8569 WRITE_COEF(0xb3, 0x0), WRITE_COEF(0xb4, 0x0), WRITE_COEF(0xb5, 0x1040),
8570 WRITE_COEF(0xb6, 0xd697), WRITE_COEF(0xb7, 0x902b), WRITE_COEF(0xb8, 0xd697),
8571 WRITE_COEF(0xb9, 0x902b), WRITE_COEF(0xba, 0xb8ba), WRITE_COEF(0xbb, 0xaaab),
8572 WRITE_COEF(0xbc, 0xaaaf), WRITE_COEF(0xbd, 0x6aaa), WRITE_COEF(0xbe, 0x1c02),
8573 WRITE_COEF(0xc0, 0x00ff), WRITE_COEF(0xc1, 0x0fa6),
8574 {}
8575};
8576
8577static void alc668_restore_default_value(struct hda_codec *codec)
8578{
8579 alc_process_coef_fw(codec, alc668_coefs);
8580}
8581
David Henningsson6cb3b702010-09-09 08:51:44 +02008582enum {
Daniel T Chen2df03512010-10-10 22:39:28 -04008583 ALC662_FIXUP_ASPIRE,
Takashi Iwai3e887f32014-01-10 17:50:58 +01008584 ALC662_FIXUP_LED_GPIO1,
David Henningsson6cb3b702010-09-09 08:51:44 +02008585 ALC662_FIXUP_IDEAPAD,
Todd Broch6be79482010-12-07 16:51:05 -08008586 ALC272_FIXUP_MARIO,
Anisse Astierd2ebd472011-01-20 12:36:21 +01008587 ALC662_FIXUP_CZC_P10T,
David Henningsson94024cd2011-04-29 14:10:55 +02008588 ALC662_FIXUP_SKU_IGNORE,
Takashi Iwaie59ea3e2011-06-29 17:21:00 +02008589 ALC662_FIXUP_HP_RP5800,
Takashi Iwai53c334a2011-08-23 18:27:14 +02008590 ALC662_FIXUP_ASUS_MODE1,
8591 ALC662_FIXUP_ASUS_MODE2,
8592 ALC662_FIXUP_ASUS_MODE3,
8593 ALC662_FIXUP_ASUS_MODE4,
8594 ALC662_FIXUP_ASUS_MODE5,
8595 ALC662_FIXUP_ASUS_MODE6,
8596 ALC662_FIXUP_ASUS_MODE7,
8597 ALC662_FIXUP_ASUS_MODE8,
Takashi Iwai1565cc32012-02-13 12:03:25 +01008598 ALC662_FIXUP_NO_JACK_DETECT,
David Henningssonedfe3bf2012-06-12 13:15:12 +02008599 ALC662_FIXUP_ZOTAC_Z68,
Takashi Iwai125821a2012-06-22 14:30:29 +02008600 ALC662_FIXUP_INV_DMIC,
David Henningsson1f8b46c2015-05-12 14:38:15 +02008601 ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
David Henningsson73bdd592013-04-15 15:44:14 +02008602 ALC668_FIXUP_DELL_MIC_NO_PRESENCE,
David Henningsson1f8b46c2015-05-12 14:38:15 +02008603 ALC662_FIXUP_HEADSET_MODE,
David Henningsson73bdd592013-04-15 15:44:14 +02008604 ALC668_FIXUP_HEADSET_MODE,
David Henningsson8e54b4a2014-02-07 09:31:07 +01008605 ALC662_FIXUP_BASS_MODE4_CHMAP,
David Henningsson61a75f12014-02-07 09:31:08 +01008606 ALC662_FIXUP_BASS_16,
Takashi Iwaia30c9aa2013-11-21 08:00:20 +01008607 ALC662_FIXUP_BASS_1A,
David Henningsson8e54b4a2014-02-07 09:31:07 +01008608 ALC662_FIXUP_BASS_CHMAP,
Hui Wang493a52a2014-01-14 14:07:36 +08008609 ALC668_FIXUP_AUTO_MUTE,
Gabriele Mazzotta5e6db662014-05-20 18:58:26 +02008610 ALC668_FIXUP_DELL_DISABLE_AAMIX,
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +02008611 ALC668_FIXUP_DELL_XPS13,
Bobi Mihalca9d4dc582016-03-23 13:26:11 +02008612 ALC662_FIXUP_ASUS_Nx50,
Mikhail Paulyshkafc7438b2017-04-21 08:52:42 +02008613 ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
Yura Pakhuchiy3231e202016-05-07 23:53:36 +07008614 ALC668_FIXUP_ASUS_Nx51,
Takashi Iwai5b7c5e12018-10-09 14:20:17 +02008615 ALC668_FIXUP_MIC_COEF,
Takashi Iwai11ba6112018-10-07 09:44:17 +02008616 ALC668_FIXUP_ASUS_G751,
Kailang Yang78f4f7c2016-06-07 11:31:34 +08008617 ALC891_FIXUP_HEADSET_MODE,
8618 ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
Shrirang Bagul9b51fe32016-08-01 13:16:17 +08008619 ALC662_FIXUP_ACER_VERITON,
Takashi Iwai1a3f0992016-10-20 12:14:51 +02008620 ALC892_FIXUP_ASROCK_MOBO,
Kailang Yangc6790c82016-11-25 16:15:17 +08008621 ALC662_FIXUP_USI_FUNC,
8622 ALC662_FIXUP_USI_HEADSET_MODE,
Kailang Yangca169cc2017-04-25 16:17:40 +08008623 ALC662_FIXUP_LENOVO_MULTI_CODECS,
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02008624 ALC669_FIXUP_ACER_ASPIRE_ETHOS,
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02008625 ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET,
Kailang Yang5af290282020-01-17 14:04:01 +08008626 ALC671_FIXUP_HP_HEADSET_MIC2,
Jian-Hong Pand858c702020-03-17 16:28:07 +08008627 ALC662_FIXUP_ACER_X2660G_HEADSET_MODE,
Jian-Hong Pana1244582020-03-17 16:28:09 +08008628 ALC662_FIXUP_ACER_NITRO_HEADSET_MODE,
David Henningsson6cb3b702010-09-09 08:51:44 +02008629};
8630
Takashi Iwai1727a772013-01-10 09:52:52 +01008631static const struct hda_fixup alc662_fixups[] = {
Daniel T Chen2df03512010-10-10 22:39:28 -04008632 [ALC662_FIXUP_ASPIRE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008633 .type = HDA_FIXUP_PINS,
8634 .v.pins = (const struct hda_pintbl[]) {
Daniel T Chen2df03512010-10-10 22:39:28 -04008635 { 0x15, 0x99130112 }, /* subwoofer */
8636 { }
8637 }
8638 },
Takashi Iwai3e887f32014-01-10 17:50:58 +01008639 [ALC662_FIXUP_LED_GPIO1] = {
8640 .type = HDA_FIXUP_FUNC,
8641 .v.func = alc662_fixup_led_gpio1,
8642 },
David Henningsson6cb3b702010-09-09 08:51:44 +02008643 [ALC662_FIXUP_IDEAPAD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008644 .type = HDA_FIXUP_PINS,
8645 .v.pins = (const struct hda_pintbl[]) {
David Henningsson6cb3b702010-09-09 08:51:44 +02008646 { 0x17, 0x99130112 }, /* subwoofer */
8647 { }
Takashi Iwai3e887f32014-01-10 17:50:58 +01008648 },
8649 .chained = true,
8650 .chain_id = ALC662_FIXUP_LED_GPIO1,
David Henningsson6cb3b702010-09-09 08:51:44 +02008651 },
Todd Broch6be79482010-12-07 16:51:05 -08008652 [ALC272_FIXUP_MARIO] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008653 .type = HDA_FIXUP_FUNC,
Takashi Iwaib5bfbc62011-01-13 14:22:32 +01008654 .v.func = alc272_fixup_mario,
Anisse Astierd2ebd472011-01-20 12:36:21 +01008655 },
8656 [ALC662_FIXUP_CZC_P10T] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008657 .type = HDA_FIXUP_VERBS,
Anisse Astierd2ebd472011-01-20 12:36:21 +01008658 .v.verbs = (const struct hda_verb[]) {
8659 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
8660 {}
8661 }
8662 },
David Henningsson94024cd2011-04-29 14:10:55 +02008663 [ALC662_FIXUP_SKU_IGNORE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008664 .type = HDA_FIXUP_FUNC,
Takashi Iwai23d30f22012-05-07 17:17:32 +02008665 .v.func = alc_fixup_sku_ignore,
Takashi Iwaic6b35872011-03-28 12:05:31 +02008666 },
Takashi Iwaie59ea3e2011-06-29 17:21:00 +02008667 [ALC662_FIXUP_HP_RP5800] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008668 .type = HDA_FIXUP_PINS,
8669 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaie59ea3e2011-06-29 17:21:00 +02008670 { 0x14, 0x0221201f }, /* HP out */
8671 { }
8672 },
8673 .chained = true,
8674 .chain_id = ALC662_FIXUP_SKU_IGNORE
8675 },
Takashi Iwai53c334a2011-08-23 18:27:14 +02008676 [ALC662_FIXUP_ASUS_MODE1] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008677 .type = HDA_FIXUP_PINS,
8678 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02008679 { 0x14, 0x99130110 }, /* speaker */
8680 { 0x18, 0x01a19c20 }, /* mic */
8681 { 0x19, 0x99a3092f }, /* int-mic */
8682 { 0x21, 0x0121401f }, /* HP out */
8683 { }
8684 },
8685 .chained = true,
8686 .chain_id = ALC662_FIXUP_SKU_IGNORE
8687 },
8688 [ALC662_FIXUP_ASUS_MODE2] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008689 .type = HDA_FIXUP_PINS,
8690 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai2996bdb2011-08-18 16:02:24 +02008691 { 0x14, 0x99130110 }, /* speaker */
8692 { 0x18, 0x01a19820 }, /* mic */
8693 { 0x19, 0x99a3092f }, /* int-mic */
8694 { 0x1b, 0x0121401f }, /* HP out */
8695 { }
8696 },
Takashi Iwai53c334a2011-08-23 18:27:14 +02008697 .chained = true,
8698 .chain_id = ALC662_FIXUP_SKU_IGNORE
8699 },
8700 [ALC662_FIXUP_ASUS_MODE3] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008701 .type = HDA_FIXUP_PINS,
8702 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02008703 { 0x14, 0x99130110 }, /* speaker */
8704 { 0x15, 0x0121441f }, /* HP */
8705 { 0x18, 0x01a19840 }, /* mic */
8706 { 0x19, 0x99a3094f }, /* int-mic */
8707 { 0x21, 0x01211420 }, /* HP2 */
8708 { }
8709 },
8710 .chained = true,
8711 .chain_id = ALC662_FIXUP_SKU_IGNORE
8712 },
8713 [ALC662_FIXUP_ASUS_MODE4] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008714 .type = HDA_FIXUP_PINS,
8715 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02008716 { 0x14, 0x99130110 }, /* speaker */
8717 { 0x16, 0x99130111 }, /* speaker */
8718 { 0x18, 0x01a19840 }, /* mic */
8719 { 0x19, 0x99a3094f }, /* int-mic */
8720 { 0x21, 0x0121441f }, /* HP */
8721 { }
8722 },
8723 .chained = true,
8724 .chain_id = ALC662_FIXUP_SKU_IGNORE
8725 },
8726 [ALC662_FIXUP_ASUS_MODE5] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008727 .type = HDA_FIXUP_PINS,
8728 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02008729 { 0x14, 0x99130110 }, /* speaker */
8730 { 0x15, 0x0121441f }, /* HP */
8731 { 0x16, 0x99130111 }, /* speaker */
8732 { 0x18, 0x01a19840 }, /* mic */
8733 { 0x19, 0x99a3094f }, /* int-mic */
8734 { }
8735 },
8736 .chained = true,
8737 .chain_id = ALC662_FIXUP_SKU_IGNORE
8738 },
8739 [ALC662_FIXUP_ASUS_MODE6] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008740 .type = HDA_FIXUP_PINS,
8741 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02008742 { 0x14, 0x99130110 }, /* speaker */
8743 { 0x15, 0x01211420 }, /* HP2 */
8744 { 0x18, 0x01a19840 }, /* mic */
8745 { 0x19, 0x99a3094f }, /* int-mic */
8746 { 0x1b, 0x0121441f }, /* HP */
8747 { }
8748 },
8749 .chained = true,
8750 .chain_id = ALC662_FIXUP_SKU_IGNORE
8751 },
8752 [ALC662_FIXUP_ASUS_MODE7] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008753 .type = HDA_FIXUP_PINS,
8754 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02008755 { 0x14, 0x99130110 }, /* speaker */
8756 { 0x17, 0x99130111 }, /* speaker */
8757 { 0x18, 0x01a19840 }, /* mic */
8758 { 0x19, 0x99a3094f }, /* int-mic */
8759 { 0x1b, 0x01214020 }, /* HP */
8760 { 0x21, 0x0121401f }, /* HP */
8761 { }
8762 },
8763 .chained = true,
8764 .chain_id = ALC662_FIXUP_SKU_IGNORE
8765 },
8766 [ALC662_FIXUP_ASUS_MODE8] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008767 .type = HDA_FIXUP_PINS,
8768 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02008769 { 0x14, 0x99130110 }, /* speaker */
8770 { 0x12, 0x99a30970 }, /* int-mic */
8771 { 0x15, 0x01214020 }, /* HP */
8772 { 0x17, 0x99130111 }, /* speaker */
8773 { 0x18, 0x01a19840 }, /* mic */
8774 { 0x21, 0x0121401f }, /* HP */
8775 { }
8776 },
8777 .chained = true,
8778 .chain_id = ALC662_FIXUP_SKU_IGNORE
Takashi Iwai2996bdb2011-08-18 16:02:24 +02008779 },
Takashi Iwai1565cc32012-02-13 12:03:25 +01008780 [ALC662_FIXUP_NO_JACK_DETECT] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008781 .type = HDA_FIXUP_FUNC,
Takashi Iwai1565cc32012-02-13 12:03:25 +01008782 .v.func = alc_fixup_no_jack_detect,
8783 },
David Henningssonedfe3bf2012-06-12 13:15:12 +02008784 [ALC662_FIXUP_ZOTAC_Z68] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008785 .type = HDA_FIXUP_PINS,
8786 .v.pins = (const struct hda_pintbl[]) {
David Henningssonedfe3bf2012-06-12 13:15:12 +02008787 { 0x1b, 0x02214020 }, /* Front HP */
8788 { }
8789 }
8790 },
Takashi Iwai125821a2012-06-22 14:30:29 +02008791 [ALC662_FIXUP_INV_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008792 .type = HDA_FIXUP_FUNC,
David Henningsson9d36a7d2014-10-07 10:18:42 +02008793 .v.func = alc_fixup_inv_dmic,
Takashi Iwai125821a2012-06-22 14:30:29 +02008794 },
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +02008795 [ALC668_FIXUP_DELL_XPS13] = {
8796 .type = HDA_FIXUP_FUNC,
8797 .v.func = alc_fixup_dell_xps13,
8798 .chained = true,
8799 .chain_id = ALC668_FIXUP_DELL_DISABLE_AAMIX
8800 },
Gabriele Mazzotta5e6db662014-05-20 18:58:26 +02008801 [ALC668_FIXUP_DELL_DISABLE_AAMIX] = {
8802 .type = HDA_FIXUP_FUNC,
8803 .v.func = alc_fixup_disable_aamix,
8804 .chained = true,
8805 .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
8806 },
Hui Wang493a52a2014-01-14 14:07:36 +08008807 [ALC668_FIXUP_AUTO_MUTE] = {
8808 .type = HDA_FIXUP_FUNC,
8809 .v.func = alc_fixup_auto_mute_via_amp,
8810 .chained = true,
8811 .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
8812 },
David Henningsson1f8b46c2015-05-12 14:38:15 +02008813 [ALC662_FIXUP_DELL_MIC_NO_PRESENCE] = {
8814 .type = HDA_FIXUP_PINS,
8815 .v.pins = (const struct hda_pintbl[]) {
8816 { 0x19, 0x03a1113c }, /* use as headset mic, without its own jack detect */
8817 /* headphone mic by setting pin control of 0x1b (headphone out) to in + vref_50 */
8818 { }
8819 },
8820 .chained = true,
8821 .chain_id = ALC662_FIXUP_HEADSET_MODE
8822 },
8823 [ALC662_FIXUP_HEADSET_MODE] = {
8824 .type = HDA_FIXUP_FUNC,
8825 .v.func = alc_fixup_headset_mode_alc662,
8826 },
David Henningsson73bdd592013-04-15 15:44:14 +02008827 [ALC668_FIXUP_DELL_MIC_NO_PRESENCE] = {
8828 .type = HDA_FIXUP_PINS,
8829 .v.pins = (const struct hda_pintbl[]) {
8830 { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
8831 { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
8832 { }
8833 },
8834 .chained = true,
8835 .chain_id = ALC668_FIXUP_HEADSET_MODE
8836 },
8837 [ALC668_FIXUP_HEADSET_MODE] = {
8838 .type = HDA_FIXUP_FUNC,
8839 .v.func = alc_fixup_headset_mode_alc668,
8840 },
David Henningsson8e54b4a2014-02-07 09:31:07 +01008841 [ALC662_FIXUP_BASS_MODE4_CHMAP] = {
Takashi Iwai8e383952013-10-30 17:41:12 +01008842 .type = HDA_FIXUP_FUNC,
Takashi Iwaieb9ca3a2013-11-28 15:24:34 +01008843 .v.func = alc_fixup_bass_chmap,
Takashi Iwai8e383952013-10-30 17:41:12 +01008844 .chained = true,
8845 .chain_id = ALC662_FIXUP_ASUS_MODE4
8846 },
David Henningsson61a75f12014-02-07 09:31:08 +01008847 [ALC662_FIXUP_BASS_16] = {
8848 .type = HDA_FIXUP_PINS,
8849 .v.pins = (const struct hda_pintbl[]) {
8850 {0x16, 0x80106111}, /* bass speaker */
8851 {}
8852 },
8853 .chained = true,
8854 .chain_id = ALC662_FIXUP_BASS_CHMAP,
8855 },
Takashi Iwaia30c9aa2013-11-21 08:00:20 +01008856 [ALC662_FIXUP_BASS_1A] = {
8857 .type = HDA_FIXUP_PINS,
8858 .v.pins = (const struct hda_pintbl[]) {
8859 {0x1a, 0x80106111}, /* bass speaker */
8860 {}
8861 },
David Henningsson8e54b4a2014-02-07 09:31:07 +01008862 .chained = true,
8863 .chain_id = ALC662_FIXUP_BASS_CHMAP,
Takashi Iwaia30c9aa2013-11-21 08:00:20 +01008864 },
David Henningsson8e54b4a2014-02-07 09:31:07 +01008865 [ALC662_FIXUP_BASS_CHMAP] = {
Takashi Iwaia30c9aa2013-11-21 08:00:20 +01008866 .type = HDA_FIXUP_FUNC,
Takashi Iwaieb9ca3a2013-11-28 15:24:34 +01008867 .v.func = alc_fixup_bass_chmap,
Takashi Iwaia30c9aa2013-11-21 08:00:20 +01008868 },
Bobi Mihalca9d4dc582016-03-23 13:26:11 +02008869 [ALC662_FIXUP_ASUS_Nx50] = {
8870 .type = HDA_FIXUP_FUNC,
8871 .v.func = alc_fixup_auto_mute_via_amp,
8872 .chained = true,
8873 .chain_id = ALC662_FIXUP_BASS_1A
8874 },
Mikhail Paulyshkafc7438b2017-04-21 08:52:42 +02008875 [ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE] = {
8876 .type = HDA_FIXUP_FUNC,
8877 .v.func = alc_fixup_headset_mode_alc668,
8878 .chain_id = ALC662_FIXUP_BASS_CHMAP
8879 },
Yura Pakhuchiy3231e202016-05-07 23:53:36 +07008880 [ALC668_FIXUP_ASUS_Nx51] = {
8881 .type = HDA_FIXUP_PINS,
8882 .v.pins = (const struct hda_pintbl[]) {
Mikhail Paulyshkafc7438b2017-04-21 08:52:42 +02008883 { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
8884 { 0x1a, 0x90170151 }, /* bass speaker */
8885 { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
Yura Pakhuchiy3231e202016-05-07 23:53:36 +07008886 {}
8887 },
8888 .chained = true,
Mikhail Paulyshkafc7438b2017-04-21 08:52:42 +02008889 .chain_id = ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
Yura Pakhuchiy3231e202016-05-07 23:53:36 +07008890 },
Takashi Iwai5b7c5e12018-10-09 14:20:17 +02008891 [ALC668_FIXUP_MIC_COEF] = {
Takashi Iwai11ba6112018-10-07 09:44:17 +02008892 .type = HDA_FIXUP_VERBS,
8893 .v.verbs = (const struct hda_verb[]) {
8894 { 0x20, AC_VERB_SET_COEF_INDEX, 0xc3 },
8895 { 0x20, AC_VERB_SET_PROC_COEF, 0x4000 },
8896 {}
8897 },
8898 },
Takashi Iwai5b7c5e12018-10-09 14:20:17 +02008899 [ALC668_FIXUP_ASUS_G751] = {
8900 .type = HDA_FIXUP_PINS,
8901 .v.pins = (const struct hda_pintbl[]) {
8902 { 0x16, 0x0421101f }, /* HP */
8903 {}
8904 },
8905 .chained = true,
8906 .chain_id = ALC668_FIXUP_MIC_COEF
8907 },
Kailang Yang78f4f7c2016-06-07 11:31:34 +08008908 [ALC891_FIXUP_HEADSET_MODE] = {
8909 .type = HDA_FIXUP_FUNC,
8910 .v.func = alc_fixup_headset_mode,
8911 },
8912 [ALC891_FIXUP_DELL_MIC_NO_PRESENCE] = {
8913 .type = HDA_FIXUP_PINS,
8914 .v.pins = (const struct hda_pintbl[]) {
8915 { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
8916 { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
8917 { }
8918 },
8919 .chained = true,
8920 .chain_id = ALC891_FIXUP_HEADSET_MODE
8921 },
Shrirang Bagul9b51fe32016-08-01 13:16:17 +08008922 [ALC662_FIXUP_ACER_VERITON] = {
8923 .type = HDA_FIXUP_PINS,
8924 .v.pins = (const struct hda_pintbl[]) {
8925 { 0x15, 0x50170120 }, /* no internal speaker */
8926 { }
8927 }
8928 },
Takashi Iwai1a3f0992016-10-20 12:14:51 +02008929 [ALC892_FIXUP_ASROCK_MOBO] = {
8930 .type = HDA_FIXUP_PINS,
8931 .v.pins = (const struct hda_pintbl[]) {
8932 { 0x15, 0x40f000f0 }, /* disabled */
8933 { 0x16, 0x40f000f0 }, /* disabled */
Takashi Iwai1a3f0992016-10-20 12:14:51 +02008934 { }
8935 }
8936 },
Kailang Yangc6790c82016-11-25 16:15:17 +08008937 [ALC662_FIXUP_USI_FUNC] = {
8938 .type = HDA_FIXUP_FUNC,
8939 .v.func = alc662_fixup_usi_headset_mic,
8940 },
8941 [ALC662_FIXUP_USI_HEADSET_MODE] = {
8942 .type = HDA_FIXUP_PINS,
8943 .v.pins = (const struct hda_pintbl[]) {
8944 { 0x19, 0x02a1913c }, /* use as headset mic, without its own jack detect */
8945 { 0x18, 0x01a1903d },
8946 { }
8947 },
8948 .chained = true,
8949 .chain_id = ALC662_FIXUP_USI_FUNC
8950 },
Kailang Yangca169cc2017-04-25 16:17:40 +08008951 [ALC662_FIXUP_LENOVO_MULTI_CODECS] = {
8952 .type = HDA_FIXUP_FUNC,
8953 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
8954 },
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02008955 [ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET] = {
8956 .type = HDA_FIXUP_FUNC,
8957 .v.func = alc662_fixup_aspire_ethos_hp,
8958 },
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02008959 [ALC669_FIXUP_ACER_ASPIRE_ETHOS] = {
8960 .type = HDA_FIXUP_PINS,
8961 .v.pins = (const struct hda_pintbl[]) {
8962 { 0x15, 0x92130110 }, /* front speakers */
8963 { 0x18, 0x99130111 }, /* center/subwoofer */
8964 { 0x1b, 0x11130012 }, /* surround plus jack for HP */
8965 { }
8966 },
8967 .chained = true,
Takashi Iwai336820c2019-11-28 21:26:30 +01008968 .chain_id = ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02008969 },
Kailang Yang5af290282020-01-17 14:04:01 +08008970 [ALC671_FIXUP_HP_HEADSET_MIC2] = {
8971 .type = HDA_FIXUP_FUNC,
8972 .v.func = alc671_fixup_hp_headset_mic2,
8973 },
Jian-Hong Pand858c702020-03-17 16:28:07 +08008974 [ALC662_FIXUP_ACER_X2660G_HEADSET_MODE] = {
8975 .type = HDA_FIXUP_PINS,
8976 .v.pins = (const struct hda_pintbl[]) {
8977 { 0x1a, 0x02a1113c }, /* use as headset mic, without its own jack detect */
8978 { }
8979 },
8980 .chained = true,
8981 .chain_id = ALC662_FIXUP_USI_FUNC
8982 },
Jian-Hong Pana1244582020-03-17 16:28:09 +08008983 [ALC662_FIXUP_ACER_NITRO_HEADSET_MODE] = {
8984 .type = HDA_FIXUP_PINS,
8985 .v.pins = (const struct hda_pintbl[]) {
8986 { 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */
8987 { 0x1b, 0x0221144f },
8988 { }
8989 },
8990 .chained = true,
8991 .chain_id = ALC662_FIXUP_USI_FUNC
8992 },
David Henningsson6cb3b702010-09-09 08:51:44 +02008993};
8994
Takashi Iwaia9111322011-05-02 11:30:18 +02008995static const struct snd_pci_quirk alc662_fixup_tbl[] = {
Takashi Iwai53c334a2011-08-23 18:27:14 +02008996 SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2),
Takashi Iwaid3d38352013-08-19 20:05:50 +02008997 SND_PCI_QUIRK(0x1025, 0x022f, "Acer Aspire One", ALC662_FIXUP_INV_DMIC),
David Henningsson02f6ff92015-12-07 11:29:31 +01008998 SND_PCI_QUIRK(0x1025, 0x0241, "Packard Bell DOTS", ALC662_FIXUP_INV_DMIC),
David Henningssona6c47a82011-02-10 15:39:19 +01008999 SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
David Henningsson94024cd2011-04-29 14:10:55 +02009000 SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),
Takashi Iwai125821a2012-06-22 14:30:29 +02009001 SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC),
Takashi Iwai18019282013-08-16 08:17:05 +02009002 SND_PCI_QUIRK(0x1025, 0x034a, "Gateway LT27", ALC662_FIXUP_INV_DMIC),
Daniel T Chen2df03512010-10-10 22:39:28 -04009003 SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
Jian-Hong Pana1244582020-03-17 16:28:09 +08009004 SND_PCI_QUIRK(0x1025, 0x123c, "Acer Nitro N50-600", ALC662_FIXUP_ACER_NITRO_HEADSET_MODE),
Jian-Hong Pand858c702020-03-17 16:28:07 +08009005 SND_PCI_QUIRK(0x1025, 0x124e, "Acer 2660G", ALC662_FIXUP_ACER_X2660G_HEADSET_MODE),
David Henningsson73bdd592013-04-15 15:44:14 +02009006 SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
9007 SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
Takashi Iwaic5d019c2014-07-22 17:33:32 +02009008 SND_PCI_QUIRK(0x1028, 0x05fe, "Dell XPS 15", ALC668_FIXUP_DELL_XPS13),
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +02009009 SND_PCI_QUIRK(0x1028, 0x060a, "Dell XPS 13", ALC668_FIXUP_DELL_XPS13),
Niranjan Sivakumar467e1432015-09-05 18:20:35 +02009010 SND_PCI_QUIRK(0x1028, 0x060d, "Dell M3800", ALC668_FIXUP_DELL_XPS13),
David Henningsson09d20142013-11-20 11:43:30 +01009011 SND_PCI_QUIRK(0x1028, 0x0625, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
David Henningssonad8ff992013-11-07 09:28:59 +01009012 SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
Kailang Yang8dc9abb2014-04-16 15:53:12 +08009013 SND_PCI_QUIRK(0x1028, 0x0696, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
9014 SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
Kailang Yang6a98e342014-10-27 16:20:30 +08009015 SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
Takashi Iwaie59ea3e2011-06-29 17:21:00 +02009016 SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
Kaho Ng2da2dc92016-05-09 00:27:49 +08009017 SND_PCI_QUIRK(0x1043, 0x1080, "Asus UX501VW", ALC668_FIXUP_HEADSET_MODE),
Bobi Mihalca83a9efb2016-03-23 13:32:33 +02009018 SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_ASUS_Nx50),
Takashi Iwaidb8948e2016-01-18 09:17:30 +01009019 SND_PCI_QUIRK(0x1043, 0x13df, "Asus N550JX", ALC662_FIXUP_BASS_1A),
Bobi Mihalca9d4dc582016-03-23 13:26:11 +02009020 SND_PCI_QUIRK(0x1043, 0x129d, "Asus N750", ALC662_FIXUP_ASUS_Nx50),
Takashi Iwai11ba6112018-10-07 09:44:17 +02009021 SND_PCI_QUIRK(0x1043, 0x12ff, "ASUS G751", ALC668_FIXUP_ASUS_G751),
David Henningsson8e54b4a2014-02-07 09:31:07 +01009022 SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
David Henningsson61a75f12014-02-07 09:31:08 +01009023 SND_PCI_QUIRK(0x1043, 0x15a7, "ASUS UX51VZH", ALC662_FIXUP_BASS_16),
Yura Pakhuchiy3231e202016-05-07 23:53:36 +07009024 SND_PCI_QUIRK(0x1043, 0x177d, "ASUS N551", ALC668_FIXUP_ASUS_Nx51),
9025 SND_PCI_QUIRK(0x1043, 0x17bd, "ASUS N751", ALC668_FIXUP_ASUS_Nx51),
Takashi Iwaic7efff92017-01-04 21:38:16 +01009026 SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71SL", ALC662_FIXUP_ASUS_MODE8),
David Henningsson61a75f12014-02-07 09:31:08 +01009027 SND_PCI_QUIRK(0x1043, 0x1b73, "ASUS N55SF", ALC662_FIXUP_BASS_16),
David Henningsson8e54b4a2014-02-07 09:31:07 +01009028 SND_PCI_QUIRK(0x1043, 0x1bf3, "ASUS N76VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
Takashi Iwai1565cc32012-02-13 12:03:25 +01009029 SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),
Takashi Iwai53c334a2011-08-23 18:27:14 +02009030 SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
Daniel T Chena0e90ac2010-11-20 10:20:35 -05009031 SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
Kailang Yangc6790c82016-11-25 16:15:17 +08009032 SND_PCI_QUIRK(0x14cd, 0x5003, "USI", ALC662_FIXUP_USI_HEADSET_MODE),
Kailang Yangca169cc2017-04-25 16:17:40 +08009033 SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC662_FIXUP_LENOVO_MULTI_CODECS),
Valentine Sinitsynd4118582010-10-01 22:24:08 +06009034 SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
David Henningsson6cb3b702010-09-09 08:51:44 +02009035 SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
Takashi Iwai1a3f0992016-10-20 12:14:51 +02009036 SND_PCI_QUIRK(0x1849, 0x5892, "ASRock B150M", ALC892_FIXUP_ASROCK_MOBO),
David Henningssonedfe3bf2012-06-12 13:15:12 +02009037 SND_PCI_QUIRK(0x19da, 0xa130, "Zotac Z68", ALC662_FIXUP_ZOTAC_Z68),
Shrirang Bagul9b51fe32016-08-01 13:16:17 +08009038 SND_PCI_QUIRK(0x1b0a, 0x01b8, "ACER Veriton", ALC662_FIXUP_ACER_VERITON),
Anisse Astierd2ebd472011-01-20 12:36:21 +01009039 SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02009040 SND_PCI_QUIRK(0x1025, 0x0566, "Acer Aspire Ethos 8951G", ALC669_FIXUP_ACER_ASPIRE_ETHOS),
Takashi Iwai53c334a2011-08-23 18:27:14 +02009041
9042#if 0
9043 /* Below is a quirk table taken from the old code.
9044 * Basically the device should work as is without the fixup table.
9045 * If BIOS doesn't give a proper info, enable the corresponding
9046 * fixup entry.
Jesper Juhl7d7eb9e2012-04-12 22:11:25 +02009047 */
Takashi Iwai53c334a2011-08-23 18:27:14 +02009048 SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1),
9049 SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3),
9050 SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1),
9051 SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC662_FIXUP_ASUS_MODE3),
9052 SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
9053 SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9054 SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
9055 SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC662_FIXUP_ASUS_MODE1),
9056 SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC662_FIXUP_ASUS_MODE1),
9057 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9058 SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC662_FIXUP_ASUS_MODE7),
9059 SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC662_FIXUP_ASUS_MODE7),
9060 SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC662_FIXUP_ASUS_MODE8),
9061 SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC662_FIXUP_ASUS_MODE3),
9062 SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC662_FIXUP_ASUS_MODE1),
9063 SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9064 SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_FIXUP_ASUS_MODE2),
9065 SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC662_FIXUP_ASUS_MODE1),
9066 SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9067 SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
9068 SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
9069 SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9070 SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC662_FIXUP_ASUS_MODE1),
9071 SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC662_FIXUP_ASUS_MODE3),
9072 SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_FIXUP_ASUS_MODE2),
9073 SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9074 SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC662_FIXUP_ASUS_MODE5),
9075 SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
9076 SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9077 SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC662_FIXUP_ASUS_MODE1),
9078 SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9079 SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9080 SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC662_FIXUP_ASUS_MODE3),
9081 SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC662_FIXUP_ASUS_MODE3),
9082 SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC662_FIXUP_ASUS_MODE1),
9083 SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC662_FIXUP_ASUS_MODE1),
9084 SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC662_FIXUP_ASUS_MODE1),
9085 SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC662_FIXUP_ASUS_MODE1),
9086 SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC662_FIXUP_ASUS_MODE1),
9087 SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9088 SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_FIXUP_ASUS_MODE2),
9089 SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC662_FIXUP_ASUS_MODE1),
9090 SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
9091 SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC662_FIXUP_ASUS_MODE3),
9092 SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC662_FIXUP_ASUS_MODE1),
9093 SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC662_FIXUP_ASUS_MODE1),
9094 SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC662_FIXUP_ASUS_MODE1),
9095 SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_FIXUP_ASUS_MODE2),
9096 SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
9097 SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE4),
9098#endif
David Henningsson6cb3b702010-09-09 08:51:44 +02009099 {}
9100};
9101
Takashi Iwai1727a772013-01-10 09:52:52 +01009102static const struct hda_model_fixup alc662_fixup_models[] = {
Takashi Iwaiaa3841b2018-06-26 07:42:40 +02009103 {.id = ALC662_FIXUP_ASPIRE, .name = "aspire"},
9104 {.id = ALC662_FIXUP_IDEAPAD, .name = "ideapad"},
Todd Broch6be79482010-12-07 16:51:05 -08009105 {.id = ALC272_FIXUP_MARIO, .name = "mario"},
Takashi Iwaiaa3841b2018-06-26 07:42:40 +02009106 {.id = ALC662_FIXUP_HP_RP5800, .name = "hp-rp5800"},
Takashi Iwai53c334a2011-08-23 18:27:14 +02009107 {.id = ALC662_FIXUP_ASUS_MODE1, .name = "asus-mode1"},
9108 {.id = ALC662_FIXUP_ASUS_MODE2, .name = "asus-mode2"},
9109 {.id = ALC662_FIXUP_ASUS_MODE3, .name = "asus-mode3"},
9110 {.id = ALC662_FIXUP_ASUS_MODE4, .name = "asus-mode4"},
9111 {.id = ALC662_FIXUP_ASUS_MODE5, .name = "asus-mode5"},
9112 {.id = ALC662_FIXUP_ASUS_MODE6, .name = "asus-mode6"},
9113 {.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},
9114 {.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},
Takashi Iwaiaa3841b2018-06-26 07:42:40 +02009115 {.id = ALC662_FIXUP_ZOTAC_Z68, .name = "zotac-z68"},
Takashi Iwai6e72aa52012-06-25 10:52:25 +02009116 {.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"},
Takashi Iwaiaa3841b2018-06-26 07:42:40 +02009117 {.id = ALC662_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc662-headset-multi"},
David Henningssone32aa852013-06-17 11:04:02 +02009118 {.id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
Takashi Iwaiaa3841b2018-06-26 07:42:40 +02009119 {.id = ALC662_FIXUP_HEADSET_MODE, .name = "alc662-headset"},
9120 {.id = ALC668_FIXUP_HEADSET_MODE, .name = "alc668-headset"},
9121 {.id = ALC662_FIXUP_BASS_16, .name = "bass16"},
9122 {.id = ALC662_FIXUP_BASS_1A, .name = "bass1a"},
9123 {.id = ALC668_FIXUP_AUTO_MUTE, .name = "automute"},
9124 {.id = ALC668_FIXUP_DELL_XPS13, .name = "dell-xps13"},
9125 {.id = ALC662_FIXUP_ASUS_Nx50, .name = "asus-nx50"},
9126 {.id = ALC668_FIXUP_ASUS_Nx51, .name = "asus-nx51"},
Takashi Iwai40c51672018-10-07 09:47:39 +02009127 {.id = ALC668_FIXUP_ASUS_G751, .name = "asus-g751"},
Takashi Iwaiaa3841b2018-06-26 07:42:40 +02009128 {.id = ALC891_FIXUP_HEADSET_MODE, .name = "alc891-headset"},
9129 {.id = ALC891_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc891-headset-multi"},
9130 {.id = ALC662_FIXUP_ACER_VERITON, .name = "acer-veriton"},
9131 {.id = ALC892_FIXUP_ASROCK_MOBO, .name = "asrock-mobo"},
9132 {.id = ALC662_FIXUP_USI_HEADSET_MODE, .name = "usi-headset"},
Takashi Iwaiba90d6a2017-05-22 16:38:47 +02009133 {.id = ALC662_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02009134 {.id = ALC669_FIXUP_ACER_ASPIRE_ETHOS, .name = "aspire-ethos"},
Todd Broch6be79482010-12-07 16:51:05 -08009135 {}
9136};
David Henningsson6cb3b702010-09-09 08:51:44 +02009137
Hui Wang532895c2014-05-29 15:59:19 +08009138static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = {
Kailang Yang78f4f7c2016-06-07 11:31:34 +08009139 SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
9140 {0x17, 0x02211010},
9141 {0x18, 0x01a19030},
9142 {0x1a, 0x01813040},
9143 {0x21, 0x01014020}),
Hui Wang4b4e0e32019-07-16 15:21:34 +08009144 SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
9145 {0x16, 0x01813030},
9146 {0x17, 0x02211010},
9147 {0x18, 0x01a19040},
9148 {0x21, 0x01014020}),
David Henningsson1f8b46c2015-05-12 14:38:15 +02009149 SND_HDA_PIN_QUIRK(0x10ec0662, 0x1028, "Dell", ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
David Henningsson1f8b46c2015-05-12 14:38:15 +02009150 {0x14, 0x01014010},
David Henningsson1f8b46c2015-05-12 14:38:15 +02009151 {0x18, 0x01a19020},
David Henningsson1f8b46c2015-05-12 14:38:15 +02009152 {0x1a, 0x0181302f},
Hui Wang11580292015-08-03 11:03:49 +08009153 {0x1b, 0x0221401f}),
David Henningsson76c21322014-06-24 14:46:54 +02009154 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
9155 {0x12, 0x99a30130},
9156 {0x14, 0x90170110},
9157 {0x15, 0x0321101f},
Hui Wang11580292015-08-03 11:03:49 +08009158 {0x16, 0x03011020}),
David Henningsson76c21322014-06-24 14:46:54 +02009159 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
9160 {0x12, 0x99a30140},
9161 {0x14, 0x90170110},
9162 {0x15, 0x0321101f},
Hui Wang11580292015-08-03 11:03:49 +08009163 {0x16, 0x03011020}),
David Henningsson76c21322014-06-24 14:46:54 +02009164 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
9165 {0x12, 0x99a30150},
9166 {0x14, 0x90170110},
9167 {0x15, 0x0321101f},
Hui Wang11580292015-08-03 11:03:49 +08009168 {0x16, 0x03011020}),
David Henningsson76c21322014-06-24 14:46:54 +02009169 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
David Henningsson76c21322014-06-24 14:46:54 +02009170 {0x14, 0x90170110},
9171 {0x15, 0x0321101f},
Hui Wang11580292015-08-03 11:03:49 +08009172 {0x16, 0x03011020}),
David Henningsson76c21322014-06-24 14:46:54 +02009173 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell XPS 15", ALC668_FIXUP_AUTO_MUTE,
9174 {0x12, 0x90a60130},
9175 {0x14, 0x90170110},
Hui Wang11580292015-08-03 11:03:49 +08009176 {0x15, 0x0321101f}),
Kailang Yang5af290282020-01-17 14:04:01 +08009177 SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
9178 {0x14, 0x01014010},
9179 {0x17, 0x90170150},
Kailang Yangf2adbae2020-02-05 15:40:01 +08009180 {0x19, 0x02a11060},
Kailang Yang5af290282020-01-17 14:04:01 +08009181 {0x1b, 0x01813030},
9182 {0x21, 0x02211020}),
9183 SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
9184 {0x14, 0x01014010},
9185 {0x18, 0x01a19040},
9186 {0x1b, 0x01813030},
9187 {0x21, 0x02211020}),
9188 SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
9189 {0x14, 0x01014020},
9190 {0x17, 0x90170110},
9191 {0x18, 0x01a19050},
9192 {0x1b, 0x01813040},
9193 {0x21, 0x02211030}),
Hui Wang532895c2014-05-29 15:59:19 +08009194 {}
9195};
9196
Takashi Iwai1d045db2011-07-07 18:23:21 +02009197/*
9198 */
Kailang Yangbc9f98a2007-04-12 13:06:07 +02009199static int patch_alc662(struct hda_codec *codec)
9200{
9201 struct alc_spec *spec;
Takashi Iwai3de95172012-05-07 18:03:15 +02009202 int err;
Kailang Yangbc9f98a2007-04-12 13:06:07 +02009203
Takashi Iwai3de95172012-05-07 18:03:15 +02009204 err = alc_alloc_spec(codec, 0x0b);
9205 if (err < 0)
9206 return err;
Kailang Yangbc9f98a2007-04-12 13:06:07 +02009207
Takashi Iwai3de95172012-05-07 18:03:15 +02009208 spec = codec->spec;
Takashi Iwai1f0f4b82011-06-27 10:52:59 +02009209
Takashi Iwai225068a2015-05-29 10:42:14 +02009210 spec->shutup = alc_eapd_shutup;
9211
Takashi Iwai53c334a2011-08-23 18:27:14 +02009212 /* handle multiple HPs as is */
9213 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
9214
Takashi Iwai2c3bf9a2008-06-04 12:39:38 +02009215 alc_fix_pll_init(codec, 0x20, 0x04, 15);
9216
Takashi Iwai7639a062015-03-03 10:07:24 +01009217 switch (codec->core.vendor_id) {
Kailang Yangf3f91852014-10-24 15:43:46 +08009218 case 0x10ec0668:
9219 spec->init_hook = alc668_restore_default_value;
9220 break;
Kailang Yangf3f91852014-10-24 15:43:46 +08009221 }
Kailang Yang8663ff72012-06-29 09:35:52 +02009222
Takashi Iwaic9af7532019-05-10 11:01:43 +02009223 alc_pre_init(codec);
9224
Takashi Iwai1727a772013-01-10 09:52:52 +01009225 snd_hda_pick_fixup(codec, alc662_fixup_models,
Takashi Iwai8e5a0502012-06-21 15:49:33 +02009226 alc662_fixup_tbl, alc662_fixups);
Hui Wang0fc1e442019-08-16 14:27:39 +08009227 snd_hda_pick_pin_fixup(codec, alc662_pin_fixup_tbl, alc662_fixups, true);
Takashi Iwai1727a772013-01-10 09:52:52 +01009228 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai8e5a0502012-06-21 15:49:33 +02009229
9230 alc_auto_parse_customize_define(codec);
9231
Takashi Iwai7504b6c2013-03-18 11:25:51 +01009232 if (has_cdefine_beep(codec))
9233 spec->gen.beep_nid = 0x01;
9234
Takashi Iwai1bb7e432011-10-17 16:50:59 +02009235 if ((alc_get_coef0(codec) & (1 << 14)) &&
Takashi Iwai5100cd02014-02-15 10:03:19 +01009236 codec->bus->pci && codec->bus->pci->subsystem_vendor == 0x1025 &&
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02009237 spec->cdefine.platform_type == 1) {
Wei Yongjun6134b1a2013-04-18 11:12:59 +08009238 err = alc_codec_rename(codec, "ALC272X");
9239 if (err < 0)
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02009240 goto error;
Takashi Iwai20ca0c32011-10-17 16:00:35 +02009241 }
Kailang Yang274693f2009-12-03 10:07:50 +01009242
Takashi Iwaib9c51062011-08-24 18:08:07 +02009243 /* automatic parse from the BIOS config */
9244 err = alc662_parse_auto_config(codec);
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02009245 if (err < 0)
9246 goto error;
Kailang Yangbc9f98a2007-04-12 13:06:07 +02009247
Takashi Iwai7504b6c2013-03-18 11:25:51 +01009248 if (!spec->gen.no_analog && spec->gen.beep_nid) {
Takashi Iwai7639a062015-03-03 10:07:24 +01009249 switch (codec->core.vendor_id) {
Kailang Yangda00c242010-03-19 11:23:45 +01009250 case 0x10ec0662:
Takashi Iwaifea80fa2018-06-20 12:52:46 +02009251 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
Kailang Yangda00c242010-03-19 11:23:45 +01009252 break;
9253 case 0x10ec0272:
9254 case 0x10ec0663:
9255 case 0x10ec0665:
Kailang Yang9ad54542013-11-26 15:41:40 +08009256 case 0x10ec0668:
Takashi Iwaifea80fa2018-06-20 12:52:46 +02009257 err = set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
Kailang Yangda00c242010-03-19 11:23:45 +01009258 break;
9259 case 0x10ec0273:
Takashi Iwaifea80fa2018-06-20 12:52:46 +02009260 err = set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
Kailang Yangda00c242010-03-19 11:23:45 +01009261 break;
9262 }
Takashi Iwaifea80fa2018-06-20 12:52:46 +02009263 if (err < 0)
9264 goto error;
Kailang Yangcec27c82010-02-04 14:18:18 +01009265 }
Takashi Iwai2134ea42008-01-10 16:53:55 +01009266
Takashi Iwai1727a772013-01-10 09:52:52 +01009267 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01009268
Kailang Yangbc9f98a2007-04-12 13:06:07 +02009269 return 0;
Kailang Yangbc9f98a2007-04-12 13:06:07 +02009270
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02009271 error:
9272 alc_free(codec);
9273 return err;
Kailang Yangb478b992011-05-18 11:51:15 +02009274}
9275
Kailang Yangbc9f98a2007-04-12 13:06:07 +02009276/*
Kailang Yangd1eb57f2010-06-23 16:25:26 +02009277 * ALC680 support
9278 */
Kailang Yangd1eb57f2010-06-23 16:25:26 +02009279
Kailang Yangd1eb57f2010-06-23 16:25:26 +02009280static int alc680_parse_auto_config(struct hda_codec *codec)
9281{
Takashi Iwai3e6179b2011-07-08 16:55:13 +02009282 return alc_parse_auto_config(codec, NULL, NULL);
Kailang Yangd1eb57f2010-06-23 16:25:26 +02009283}
9284
Kailang Yangd1eb57f2010-06-23 16:25:26 +02009285/*
Kailang Yangd1eb57f2010-06-23 16:25:26 +02009286 */
Kailang Yangd1eb57f2010-06-23 16:25:26 +02009287static int patch_alc680(struct hda_codec *codec)
9288{
Kailang Yangd1eb57f2010-06-23 16:25:26 +02009289 int err;
9290
Takashi Iwai1f0f4b82011-06-27 10:52:59 +02009291 /* ALC680 has no aa-loopback mixer */
Takashi Iwai3de95172012-05-07 18:03:15 +02009292 err = alc_alloc_spec(codec, 0);
9293 if (err < 0)
9294 return err;
Takashi Iwai1f0f4b82011-06-27 10:52:59 +02009295
Takashi Iwai1ebec5f2011-08-15 13:21:48 +02009296 /* automatic parse from the BIOS config */
9297 err = alc680_parse_auto_config(codec);
9298 if (err < 0) {
9299 alc_free(codec);
9300 return err;
Kailang Yangd1eb57f2010-06-23 16:25:26 +02009301 }
9302
Kailang Yangd1eb57f2010-06-23 16:25:26 +02009303 return 0;
9304}
9305
9306/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07009307 * patch entries
9308 */
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009309static const struct hda_device_id snd_hda_id_realtek[] = {
Kailang Yang0a6f0602017-06-30 16:00:48 +08009310 HDA_CODEC_ENTRY(0x10ec0215, "ALC215", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009311 HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269),
Hui Wang2a36c162019-09-04 13:53:27 +08009312 HDA_CODEC_ENTRY(0x10ec0222, "ALC222", patch_alc269),
Kailang Yang42314302016-02-03 15:03:50 +08009313 HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009314 HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269),
9315 HDA_CODEC_ENTRY(0x10ec0233, "ALC233", patch_alc269),
Kailang Yangdcd4f0d2016-05-04 15:50:18 +08009316 HDA_CODEC_ENTRY(0x10ec0234, "ALC234", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009317 HDA_CODEC_ENTRY(0x10ec0235, "ALC233", patch_alc269),
Kailang Yang736f20a2017-10-20 15:06:34 +08009318 HDA_CODEC_ENTRY(0x10ec0236, "ALC236", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009319 HDA_CODEC_ENTRY(0x10ec0255, "ALC255", patch_alc269),
9320 HDA_CODEC_ENTRY(0x10ec0256, "ALC256", patch_alc269),
Kailang Yangf429e7e2017-12-05 15:38:24 +08009321 HDA_CODEC_ENTRY(0x10ec0257, "ALC257", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009322 HDA_CODEC_ENTRY(0x10ec0260, "ALC260", patch_alc260),
9323 HDA_CODEC_ENTRY(0x10ec0262, "ALC262", patch_alc262),
9324 HDA_CODEC_ENTRY(0x10ec0267, "ALC267", patch_alc268),
9325 HDA_CODEC_ENTRY(0x10ec0268, "ALC268", patch_alc268),
9326 HDA_CODEC_ENTRY(0x10ec0269, "ALC269", patch_alc269),
9327 HDA_CODEC_ENTRY(0x10ec0270, "ALC270", patch_alc269),
9328 HDA_CODEC_ENTRY(0x10ec0272, "ALC272", patch_alc662),
Kailang Yangdcd4f0d2016-05-04 15:50:18 +08009329 HDA_CODEC_ENTRY(0x10ec0274, "ALC274", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009330 HDA_CODEC_ENTRY(0x10ec0275, "ALC275", patch_alc269),
9331 HDA_CODEC_ENTRY(0x10ec0276, "ALC276", patch_alc269),
9332 HDA_CODEC_ENTRY(0x10ec0280, "ALC280", patch_alc269),
9333 HDA_CODEC_ENTRY(0x10ec0282, "ALC282", patch_alc269),
9334 HDA_CODEC_ENTRY(0x10ec0283, "ALC283", patch_alc269),
9335 HDA_CODEC_ENTRY(0x10ec0284, "ALC284", patch_alc269),
Kailang Yang0a6f0602017-06-30 16:00:48 +08009336 HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009337 HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269),
9338 HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269),
Kailang Yang0a6f0602017-06-30 16:00:48 +08009339 HDA_CODEC_ENTRY(0x10ec0289, "ALC289", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009340 HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269),
9341 HDA_CODEC_ENTRY(0x10ec0292, "ALC292", patch_alc269),
9342 HDA_CODEC_ENTRY(0x10ec0293, "ALC293", patch_alc269),
Kailang Yangdcd4f0d2016-05-04 15:50:18 +08009343 HDA_CODEC_ENTRY(0x10ec0294, "ALC294", patch_alc269),
Kailang Yang7d727862016-05-24 16:46:07 +08009344 HDA_CODEC_ENTRY(0x10ec0295, "ALC295", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009345 HDA_CODEC_ENTRY(0x10ec0298, "ALC298", patch_alc269),
Kailang Yang28f1f9b2017-01-04 14:49:07 +08009346 HDA_CODEC_ENTRY(0x10ec0299, "ALC299", patch_alc269),
Kailang Yang1078bef2018-11-08 16:36:15 +08009347 HDA_CODEC_ENTRY(0x10ec0300, "ALC300", patch_alc269),
Kailang Yangf0778872019-10-24 15:13:32 +08009348 HDA_CODEC_ENTRY(0x10ec0623, "ALC623", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009349 HDA_CODEC_REV_ENTRY(0x10ec0861, 0x100340, "ALC660", patch_alc861),
9350 HDA_CODEC_ENTRY(0x10ec0660, "ALC660-VD", patch_alc861vd),
9351 HDA_CODEC_ENTRY(0x10ec0861, "ALC861", patch_alc861),
9352 HDA_CODEC_ENTRY(0x10ec0862, "ALC861-VD", patch_alc861vd),
9353 HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100002, "ALC662 rev2", patch_alc882),
9354 HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100101, "ALC662 rev1", patch_alc662),
9355 HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100300, "ALC662 rev3", patch_alc662),
9356 HDA_CODEC_ENTRY(0x10ec0663, "ALC663", patch_alc662),
9357 HDA_CODEC_ENTRY(0x10ec0665, "ALC665", patch_alc662),
9358 HDA_CODEC_ENTRY(0x10ec0667, "ALC667", patch_alc662),
9359 HDA_CODEC_ENTRY(0x10ec0668, "ALC668", patch_alc662),
9360 HDA_CODEC_ENTRY(0x10ec0670, "ALC670", patch_alc662),
9361 HDA_CODEC_ENTRY(0x10ec0671, "ALC671", patch_alc662),
9362 HDA_CODEC_ENTRY(0x10ec0680, "ALC680", patch_alc680),
Kailang Yang6fbae352016-05-30 16:44:20 +08009363 HDA_CODEC_ENTRY(0x10ec0700, "ALC700", patch_alc269),
9364 HDA_CODEC_ENTRY(0x10ec0701, "ALC701", patch_alc269),
9365 HDA_CODEC_ENTRY(0x10ec0703, "ALC703", patch_alc269),
Kailang Yang83629532019-05-02 16:03:26 +08009366 HDA_CODEC_ENTRY(0x10ec0711, "ALC711", patch_alc269),
Kailang Yang78f4f7c2016-06-07 11:31:34 +08009367 HDA_CODEC_ENTRY(0x10ec0867, "ALC891", patch_alc662),
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009368 HDA_CODEC_ENTRY(0x10ec0880, "ALC880", patch_alc880),
9369 HDA_CODEC_ENTRY(0x10ec0882, "ALC882", patch_alc882),
9370 HDA_CODEC_ENTRY(0x10ec0883, "ALC883", patch_alc882),
9371 HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100101, "ALC889A", patch_alc882),
9372 HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100103, "ALC889A", patch_alc882),
9373 HDA_CODEC_ENTRY(0x10ec0885, "ALC885", patch_alc882),
9374 HDA_CODEC_ENTRY(0x10ec0887, "ALC887", patch_alc882),
9375 HDA_CODEC_REV_ENTRY(0x10ec0888, 0x100101, "ALC1200", patch_alc882),
9376 HDA_CODEC_ENTRY(0x10ec0888, "ALC888", patch_alc882),
9377 HDA_CODEC_ENTRY(0x10ec0889, "ALC889", patch_alc882),
9378 HDA_CODEC_ENTRY(0x10ec0892, "ALC892", patch_alc662),
9379 HDA_CODEC_ENTRY(0x10ec0899, "ALC898", patch_alc882),
9380 HDA_CODEC_ENTRY(0x10ec0900, "ALC1150", patch_alc882),
Kailang Yang6d9ffcf2020-01-03 16:24:06 +08009381 HDA_CODEC_ENTRY(0x10ec0b00, "ALCS1200A", patch_alc882),
Kailang Yang65553b12017-07-11 15:15:47 +08009382 HDA_CODEC_ENTRY(0x10ec1168, "ALC1220", patch_alc882),
Kailang Yanga535ad52017-01-16 16:59:26 +08009383 HDA_CODEC_ENTRY(0x10ec1220, "ALC1220", patch_alc882),
Linus Torvalds1da177e2005-04-16 15:20:36 -07009384 {} /* terminator */
9385};
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009386MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_realtek);
Takashi Iwai1289e9e2008-11-27 15:47:11 +01009387
9388MODULE_LICENSE("GPL");
9389MODULE_DESCRIPTION("Realtek HD-audio codec");
9390
Takashi Iwaid8a766a2015-02-17 15:25:37 +01009391static struct hda_codec_driver realtek_driver = {
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009392 .id = snd_hda_id_realtek,
Takashi Iwai1289e9e2008-11-27 15:47:11 +01009393};
9394
Takashi Iwaid8a766a2015-02-17 15:25:37 +01009395module_hda_codec_driver(realtek_driver);