blob: 1b06c42612488c15e23a37e9bfb6a1b29b9c1254 [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>
Kai-Heng Feng87dc3642020-04-30 21:52:07 +080020#include <linux/leds.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070021#include <sound/core.h>
Kailang Yang9ad0e492010-09-14 23:22:00 +020022#include <sound/jack.h>
Pierre-Louis Bossartbe57bff2018-08-22 15:24:57 -050023#include <sound/hda_codec.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070024#include "hda_local.h"
Takashi Iwai23d30f22012-05-07 17:17:32 +020025#include "hda_auto_parser.h"
Takashi Iwai1835a0f2011-10-27 22:12:46 +020026#include "hda_jack.h"
Takashi Iwai08c189f2012-12-19 15:22:24 +010027#include "hda_generic.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070028
Takashi Iwaicd63a5f2013-07-05 12:13:59 +020029/* keep halting ALC5505 DSP, for power saving */
30#define HALT_REALTEK_ALC5505
31
Takashi Iwai4a79ba342009-04-22 16:31:35 +020032/* extra amp-initialization sequence types */
33enum {
Takashi Iwai1c76aa52018-06-21 16:37:54 +020034 ALC_INIT_UNDEFINED,
Takashi Iwai4a79ba342009-04-22 16:31:35 +020035 ALC_INIT_NONE,
36 ALC_INIT_DEFAULT,
Takashi Iwai4a79ba342009-04-22 16:31:35 +020037};
38
David Henningsson73bdd592013-04-15 15:44:14 +020039enum {
40 ALC_HEADSET_MODE_UNKNOWN,
41 ALC_HEADSET_MODE_UNPLUGGED,
42 ALC_HEADSET_MODE_HEADSET,
43 ALC_HEADSET_MODE_MIC,
44 ALC_HEADSET_MODE_HEADPHONE,
45};
46
47enum {
48 ALC_HEADSET_TYPE_UNKNOWN,
49 ALC_HEADSET_TYPE_CTIA,
50 ALC_HEADSET_TYPE_OMTP,
51};
52
Hui Wangc7b60a82015-12-28 11:35:25 +080053enum {
54 ALC_KEY_MICMUTE_INDEX,
55};
56
Kailang Yangda00c242010-03-19 11:23:45 +010057struct alc_customize_define {
58 unsigned int sku_cfg;
59 unsigned char port_connectivity;
60 unsigned char check_sum;
61 unsigned char customization;
62 unsigned char external_amp;
63 unsigned int enable_pcbeep:1;
64 unsigned int platform_type:1;
65 unsigned int swap:1;
66 unsigned int override:1;
David Henningsson90622912010-10-14 14:50:18 +020067 unsigned int fixup:1; /* Means that this sku is set by driver, not read from hw */
Kailang Yangda00c242010-03-19 11:23:45 +010068};
69
Linus Torvalds1da177e2005-04-16 15:20:36 -070070struct alc_spec {
Takashi Iwai08c189f2012-12-19 15:22:24 +010071 struct hda_gen_spec gen; /* must be at head */
Takashi Iwai23d30f22012-05-07 17:17:32 +020072
Linus Torvalds1da177e2005-04-16 15:20:36 -070073 /* codec parameterization */
Kailang Yangda00c242010-03-19 11:23:45 +010074 struct alc_customize_define cdefine;
Takashi Iwai08c189f2012-12-19 15:22:24 +010075 unsigned int parse_flags; /* flag for snd_hda_parse_pin_defcfg() */
76
Takashi Iwai5579cd62018-06-19 22:22:41 +020077 /* GPIO bits */
78 unsigned int gpio_mask;
79 unsigned int gpio_dir;
80 unsigned int gpio_data;
Takashi Iwai215c8502018-06-19 22:34:26 +020081 bool gpio_write_delay; /* add a delay before writing gpio_data */
Takashi Iwai5579cd62018-06-19 22:22:41 +020082
Takashi Iwai08fb0d02013-01-10 17:33:58 +010083 /* mute LED for HP laptops, see alc269_fixup_mic_mute_hook() */
84 int mute_led_polarity;
Kai-Heng Fengdbd13172020-04-30 16:32:51 +080085 int micmute_led_polarity;
Takashi Iwai08fb0d02013-01-10 17:33:58 +010086 hda_nid_t mute_led_nid;
Kailang Yang9c5dc3b2014-06-19 16:11:36 +080087 hda_nid_t cap_mute_led_nid;
Takashi Iwai08fb0d02013-01-10 17:33:58 +010088
Takashi Iwai0f32fd192014-11-19 12:16:14 +010089 unsigned int gpio_mute_led_mask;
90 unsigned int gpio_mic_led_mask;
Kailang Yang431e76c2020-04-07 14:40:20 +080091 unsigned int mute_led_coef_idx;
92 unsigned int mute_led_coefbit_mask;
93 unsigned int mute_led_coefbit_on;
94 unsigned int mute_led_coefbit_off;
95 unsigned int mic_led_coef_idx;
96 unsigned int mic_led_coefbit_mask;
97 unsigned int mic_led_coefbit_on;
98 unsigned int mic_led_coefbit_off;
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +010099
David Henningsson73bdd592013-04-15 15:44:14 +0200100 hda_nid_t headset_mic_pin;
101 hda_nid_t headphone_mic_pin;
102 int current_headset_mode;
103 int current_headset_type;
104
Takashi Iwaiae6b8132006-03-03 16:47:17 +0100105 /* hooks */
106 void (*init_hook)(struct hda_codec *codec);
Takashi Iwai83012a72012-08-24 18:38:08 +0200107#ifdef CONFIG_PM
Daniel T Chenc97259d2009-12-27 18:52:08 -0500108 void (*power_hook)(struct hda_codec *codec);
Hector Martinf5de24b2009-12-20 22:51:31 +0100109#endif
Takashi Iwai1c7161532011-04-07 10:37:16 +0200110 void (*shutup)(struct hda_codec *codec);
Takashi Iwai70a09762015-12-15 14:59:58 +0100111 void (*reboot_notify)(struct hda_codec *codec);
Takashi Iwaid922b512011-04-28 12:18:53 +0200112
Takashi Iwai4a79ba342009-04-22 16:31:35 +0200113 int init_amp;
Takashi Iwaid433a672010-09-20 15:11:54 +0200114 int codec_variant; /* flag for other variants */
Kailang Yang97a26572013-11-29 00:35:26 -0500115 unsigned int has_alc5505_dsp:1;
116 unsigned int no_depop_delay:1;
Kailang Yang693abe12019-01-29 15:38:21 +0800117 unsigned int done_hp_init:1;
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +0100118 unsigned int no_shutup_pins:1;
Kailang Yangd3ba58b2019-05-06 15:09:42 +0800119 unsigned int ultra_low_power:1;
Hui Wang476c02e2020-03-29 16:20:18 +0800120 unsigned int has_hs_key:1;
Takashi Iwaie64f14f2009-01-20 18:32:55 +0100121
Takashi Iwai2c3bf9a2008-06-04 12:39:38 +0200122 /* for PLL fix */
123 hda_nid_t pll_nid;
124 unsigned int pll_coef_idx, pll_coef_bit;
Takashi Iwai1bb7e432011-10-17 16:50:59 +0200125 unsigned int coef0;
David Henningsson33f4acd2015-01-07 15:50:13 +0100126 struct input_dev *kb_dev;
Hui Wangc7b60a82015-12-28 11:35:25 +0800127 u8 alc_mute_keycode_map[1];
Kailang Yangdf694da2005-12-05 19:42:22 +0100128};
129
Takashi Iwai23f0c042009-02-26 13:03:58 +0100130/*
Takashi Iwaif2a227c2014-08-18 13:35:22 +0200131 * COEF access helper functions
132 */
133
134static int alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
135 unsigned int coef_idx)
136{
137 unsigned int val;
138
139 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
140 val = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PROC_COEF, 0);
141 return val;
142}
143
144#define alc_read_coef_idx(codec, coef_idx) \
145 alc_read_coefex_idx(codec, 0x20, coef_idx)
146
147static void alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
148 unsigned int coef_idx, unsigned int coef_val)
149{
150 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
151 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PROC_COEF, coef_val);
152}
153
154#define alc_write_coef_idx(codec, coef_idx, coef_val) \
155 alc_write_coefex_idx(codec, 0x20, coef_idx, coef_val)
156
Takashi Iwai98b24882014-08-18 13:47:50 +0200157static void alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
158 unsigned int coef_idx, unsigned int mask,
159 unsigned int bits_set)
160{
161 unsigned int val = alc_read_coefex_idx(codec, nid, coef_idx);
162
163 if (val != -1)
164 alc_write_coefex_idx(codec, nid, coef_idx,
165 (val & ~mask) | bits_set);
166}
167
168#define alc_update_coef_idx(codec, coef_idx, mask, bits_set) \
169 alc_update_coefex_idx(codec, 0x20, coef_idx, mask, bits_set)
170
Takashi Iwaif2a227c2014-08-18 13:35:22 +0200171/* a special bypass for COEF 0; read the cached value at the second time */
172static unsigned int alc_get_coef0(struct hda_codec *codec)
173{
174 struct alc_spec *spec = codec->spec;
175
176 if (!spec->coef0)
177 spec->coef0 = alc_read_coef_idx(codec, 0);
178 return spec->coef0;
179}
180
Takashi Iwai54db6c32014-08-18 15:11:19 +0200181/* coef writes/updates batch */
182struct coef_fw {
183 unsigned char nid;
184 unsigned char idx;
185 unsigned short mask;
186 unsigned short val;
187};
188
189#define UPDATE_COEFEX(_nid, _idx, _mask, _val) \
190 { .nid = (_nid), .idx = (_idx), .mask = (_mask), .val = (_val) }
191#define WRITE_COEFEX(_nid, _idx, _val) UPDATE_COEFEX(_nid, _idx, -1, _val)
192#define WRITE_COEF(_idx, _val) WRITE_COEFEX(0x20, _idx, _val)
193#define UPDATE_COEF(_idx, _mask, _val) UPDATE_COEFEX(0x20, _idx, _mask, _val)
194
195static void alc_process_coef_fw(struct hda_codec *codec,
196 const struct coef_fw *fw)
197{
198 for (; fw->nid; fw++) {
199 if (fw->mask == (unsigned short)-1)
200 alc_write_coefex_idx(codec, fw->nid, fw->idx, fw->val);
201 else
202 alc_update_coefex_idx(codec, fw->nid, fw->idx,
203 fw->mask, fw->val);
204 }
205}
206
Takashi Iwaif2a227c2014-08-18 13:35:22 +0200207/*
Takashi Iwai1d045db2011-07-07 18:23:21 +0200208 * GPIO setup tables, used in initialization
Kailang Yangdf694da2005-12-05 19:42:22 +0100209 */
Takashi Iwai5579cd62018-06-19 22:22:41 +0200210
Kailang Yangbc9f98a2007-04-12 13:06:07 +0200211/* Enable GPIO mask and set output */
Takashi Iwai5579cd62018-06-19 22:22:41 +0200212static void alc_setup_gpio(struct hda_codec *codec, unsigned int mask)
213{
214 struct alc_spec *spec = codec->spec;
Kailang Yangbc9f98a2007-04-12 13:06:07 +0200215
Takashi Iwai5579cd62018-06-19 22:22:41 +0200216 spec->gpio_mask |= mask;
217 spec->gpio_dir |= mask;
218 spec->gpio_data |= mask;
219}
Kailang Yangbc9f98a2007-04-12 13:06:07 +0200220
Takashi Iwai5579cd62018-06-19 22:22:41 +0200221static void alc_write_gpio_data(struct hda_codec *codec)
222{
223 struct alc_spec *spec = codec->spec;
224
225 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
226 spec->gpio_data);
227}
228
Takashi Iwaiaaf312d2018-06-19 22:28:22 +0200229static void alc_update_gpio_data(struct hda_codec *codec, unsigned int mask,
230 bool on)
231{
232 struct alc_spec *spec = codec->spec;
233 unsigned int oldval = spec->gpio_data;
234
235 if (on)
236 spec->gpio_data |= mask;
237 else
238 spec->gpio_data &= ~mask;
239 if (oldval != spec->gpio_data)
240 alc_write_gpio_data(codec);
241}
242
Takashi Iwai5579cd62018-06-19 22:22:41 +0200243static void alc_write_gpio(struct hda_codec *codec)
244{
245 struct alc_spec *spec = codec->spec;
246
247 if (!spec->gpio_mask)
248 return;
249
250 snd_hda_codec_write(codec, codec->core.afg, 0,
251 AC_VERB_SET_GPIO_MASK, spec->gpio_mask);
252 snd_hda_codec_write(codec, codec->core.afg, 0,
253 AC_VERB_SET_GPIO_DIRECTION, spec->gpio_dir);
Takashi Iwai215c8502018-06-19 22:34:26 +0200254 if (spec->gpio_write_delay)
255 msleep(1);
Takashi Iwai5579cd62018-06-19 22:22:41 +0200256 alc_write_gpio_data(codec);
257}
258
259static void alc_fixup_gpio(struct hda_codec *codec, int action,
260 unsigned int mask)
261{
262 if (action == HDA_FIXUP_ACT_PRE_PROBE)
263 alc_setup_gpio(codec, mask);
264}
265
266static void alc_fixup_gpio1(struct hda_codec *codec,
267 const struct hda_fixup *fix, int action)
268{
269 alc_fixup_gpio(codec, action, 0x01);
270}
271
272static void alc_fixup_gpio2(struct hda_codec *codec,
273 const struct hda_fixup *fix, int action)
274{
275 alc_fixup_gpio(codec, action, 0x02);
276}
277
278static void alc_fixup_gpio3(struct hda_codec *codec,
279 const struct hda_fixup *fix, int action)
280{
281 alc_fixup_gpio(codec, action, 0x03);
282}
Kailang Yangbdd148a2007-05-08 15:19:08 +0200283
Takashi Iwaiae065f12018-06-19 23:00:03 +0200284static void alc_fixup_gpio4(struct hda_codec *codec,
285 const struct hda_fixup *fix, int action)
286{
287 alc_fixup_gpio(codec, action, 0x04);
288}
289
Takashi Iwai2c3bf9a2008-06-04 12:39:38 +0200290/*
291 * Fix hardware PLL issue
292 * On some codecs, the analog PLL gating control must be off while
293 * the default value is 1.
294 */
295static void alc_fix_pll(struct hda_codec *codec)
296{
297 struct alc_spec *spec = codec->spec;
Takashi Iwai2c3bf9a2008-06-04 12:39:38 +0200298
Takashi Iwai98b24882014-08-18 13:47:50 +0200299 if (spec->pll_nid)
300 alc_update_coefex_idx(codec, spec->pll_nid, spec->pll_coef_idx,
301 1 << spec->pll_coef_bit, 0);
Takashi Iwai2c3bf9a2008-06-04 12:39:38 +0200302}
303
304static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
305 unsigned int coef_idx, unsigned int coef_bit)
306{
307 struct alc_spec *spec = codec->spec;
308 spec->pll_nid = nid;
309 spec->pll_coef_idx = coef_idx;
310 spec->pll_coef_bit = coef_bit;
311 alc_fix_pll(codec);
312}
313
Takashi Iwaicf5a2272012-02-20 16:31:07 +0100314/* update the master volume per volume-knob's unsol event */
Takashi Iwai1a4f69d2014-09-11 15:22:46 +0200315static void alc_update_knob_master(struct hda_codec *codec,
316 struct hda_jack_callback *jack)
Takashi Iwaicf5a2272012-02-20 16:31:07 +0100317{
318 unsigned int val;
319 struct snd_kcontrol *kctl;
320 struct snd_ctl_elem_value *uctl;
321
322 kctl = snd_hda_find_mixer_ctl(codec, "Master Playback Volume");
323 if (!kctl)
324 return;
325 uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
326 if (!uctl)
327 return;
Takashi Iwai2ebab402016-02-09 10:23:52 +0100328 val = snd_hda_codec_read(codec, jack->nid, 0,
Takashi Iwaicf5a2272012-02-20 16:31:07 +0100329 AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
330 val &= HDA_AMP_VOLMASK;
331 uctl->value.integer.value[0] = val;
332 uctl->value.integer.value[1] = val;
333 kctl->put(kctl, uctl);
334 kfree(uctl);
335}
336
David Henningsson29adc4b2012-09-25 11:31:00 +0200337static void alc880_unsol_event(struct hda_codec *codec, unsigned int res)
Takashi Iwaif21d78e2012-01-19 12:10:29 +0100338{
David Henningsson29adc4b2012-09-25 11:31:00 +0200339 /* For some reason, the res given from ALC880 is broken.
340 Here we adjust it properly. */
341 snd_hda_jack_unsol_event(codec, res >> 2);
Takashi Iwaif21d78e2012-01-19 12:10:29 +0100342}
343
Kailang Yang394c97f2014-11-12 17:38:08 +0800344/* Change EAPD to verb control */
345static void alc_fill_eapd_coef(struct hda_codec *codec)
346{
347 int coef;
348
349 coef = alc_get_coef0(codec);
350
Takashi Iwai7639a062015-03-03 10:07:24 +0100351 switch (codec->core.vendor_id) {
Kailang Yang394c97f2014-11-12 17:38:08 +0800352 case 0x10ec0262:
353 alc_update_coef_idx(codec, 0x7, 0, 1<<5);
354 break;
355 case 0x10ec0267:
356 case 0x10ec0268:
357 alc_update_coef_idx(codec, 0x7, 0, 1<<13);
358 break;
359 case 0x10ec0269:
360 if ((coef & 0x00f0) == 0x0010)
361 alc_update_coef_idx(codec, 0xd, 0, 1<<14);
362 if ((coef & 0x00f0) == 0x0020)
363 alc_update_coef_idx(codec, 0x4, 1<<15, 0);
364 if ((coef & 0x00f0) == 0x0030)
365 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
366 break;
367 case 0x10ec0280:
368 case 0x10ec0284:
369 case 0x10ec0290:
370 case 0x10ec0292:
371 alc_update_coef_idx(codec, 0x4, 1<<15, 0);
372 break;
Kailang Yang42314302016-02-03 15:03:50 +0800373 case 0x10ec0225:
Takashi Iwai44be77c2017-12-27 08:53:59 +0100374 case 0x10ec0295:
375 case 0x10ec0299:
376 alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
377 /* fallthrough */
378 case 0x10ec0215:
Kailang Yang394c97f2014-11-12 17:38:08 +0800379 case 0x10ec0233:
Kailang Yangea04a1d2018-04-25 15:31:52 +0800380 case 0x10ec0235:
Thomas Hebbc4473742020-03-30 12:09:38 -0400381 case 0x10ec0236:
Kailang Yang7fbdcd82020-04-23 14:18:31 +0800382 case 0x10ec0245:
Kailang Yang394c97f2014-11-12 17:38:08 +0800383 case 0x10ec0255:
Thomas Hebbc4473742020-03-30 12:09:38 -0400384 case 0x10ec0256:
Kailang Yangf429e7e2017-12-05 15:38:24 +0800385 case 0x10ec0257:
Kailang Yang394c97f2014-11-12 17:38:08 +0800386 case 0x10ec0282:
387 case 0x10ec0283:
388 case 0x10ec0286:
Kailang Yang630e3612020-05-27 14:10:26 +0800389 case 0x10ec0287:
Kailang Yang394c97f2014-11-12 17:38:08 +0800390 case 0x10ec0288:
Kailang Yang0a6f0602017-06-30 16:00:48 +0800391 case 0x10ec0285:
Kailang Yang506b62c2014-12-18 17:07:44 +0800392 case 0x10ec0298:
Kailang Yang0a6f0602017-06-30 16:00:48 +0800393 case 0x10ec0289:
Kailang Yang1078bef2018-11-08 16:36:15 +0800394 case 0x10ec0300:
Kailang Yang394c97f2014-11-12 17:38:08 +0800395 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
396 break;
Kailang Yang3aabf942017-11-08 15:28:33 +0800397 case 0x10ec0275:
398 alc_update_coef_idx(codec, 0xe, 0, 1<<0);
399 break;
Kailang Yang394c97f2014-11-12 17:38:08 +0800400 case 0x10ec0293:
401 alc_update_coef_idx(codec, 0xa, 1<<13, 0);
402 break;
Kailang Yangdcd4f0d2016-05-04 15:50:18 +0800403 case 0x10ec0234:
404 case 0x10ec0274:
405 case 0x10ec0294:
Kailang Yang6fbae352016-05-30 16:44:20 +0800406 case 0x10ec0700:
407 case 0x10ec0701:
408 case 0x10ec0703:
Kailang Yang836295322019-05-02 16:03:26 +0800409 case 0x10ec0711:
Kailang Yangdcd4f0d2016-05-04 15:50:18 +0800410 alc_update_coef_idx(codec, 0x10, 1<<15, 0);
411 break;
Kailang Yang394c97f2014-11-12 17:38:08 +0800412 case 0x10ec0662:
413 if ((coef & 0x00f0) == 0x0030)
414 alc_update_coef_idx(codec, 0x4, 1<<10, 0); /* EAPD Ctrl */
415 break;
416 case 0x10ec0272:
417 case 0x10ec0273:
418 case 0x10ec0663:
419 case 0x10ec0665:
420 case 0x10ec0670:
421 case 0x10ec0671:
422 case 0x10ec0672:
423 alc_update_coef_idx(codec, 0xd, 0, 1<<14); /* EAPD Ctrl */
424 break;
Kailang Yang9194a1e2020-01-07 17:22:19 +0800425 case 0x10ec0222:
Kailang Yangf0778872019-10-24 15:13:32 +0800426 case 0x10ec0623:
427 alc_update_coef_idx(codec, 0x19, 1<<13, 0);
428 break;
Kailang Yang394c97f2014-11-12 17:38:08 +0800429 case 0x10ec0668:
430 alc_update_coef_idx(codec, 0x7, 3<<13, 0);
431 break;
432 case 0x10ec0867:
433 alc_update_coef_idx(codec, 0x4, 1<<10, 0);
434 break;
435 case 0x10ec0888:
436 if ((coef & 0x00f0) == 0x0020 || (coef & 0x00f0) == 0x0030)
437 alc_update_coef_idx(codec, 0x7, 1<<5, 0);
438 break;
439 case 0x10ec0892:
440 alc_update_coef_idx(codec, 0x7, 1<<5, 0);
441 break;
442 case 0x10ec0899:
443 case 0x10ec0900:
Kailang Yang6d9ffcf2020-01-03 16:24:06 +0800444 case 0x10ec0b00:
Kailang Yang65553b12017-07-11 15:15:47 +0800445 case 0x10ec1168:
Kailang Yanga535ad52017-01-16 16:59:26 +0800446 case 0x10ec1220:
Kailang Yang394c97f2014-11-12 17:38:08 +0800447 alc_update_coef_idx(codec, 0x7, 1<<1, 0);
448 break;
449 }
450}
451
Kailang Yangf9423e72008-05-27 12:32:25 +0200452/* additional initialization for ALC888 variants */
453static void alc888_coef_init(struct hda_codec *codec)
454{
Kailang Yang1df88742014-10-29 16:10:13 +0800455 switch (alc_get_coef0(codec) & 0x00f0) {
456 /* alc888-VA */
457 case 0x00:
458 /* alc888-VB */
459 case 0x10:
460 alc_update_coef_idx(codec, 7, 0, 0x2030); /* Turn EAPD to High */
461 break;
462 }
Jaroslav Kysela87a8c372009-07-23 10:58:29 +0200463}
464
Takashi Iwai3fb4a502010-01-19 15:46:37 +0100465/* turn on/off EAPD control (only if available) */
466static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
467{
468 if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
469 return;
470 if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
471 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
472 on ? 2 : 0);
473}
474
Takashi Iwai691f1fc2011-04-07 10:31:43 +0200475/* turn on/off EAPD controls of the codec */
476static void alc_auto_setup_eapd(struct hda_codec *codec, bool on)
477{
478 /* We currently only handle front, HP */
Michał Mirosławcaf3c042020-01-03 10:23:48 +0100479 static const hda_nid_t pins[] = {
Hui Wangaf95b412015-03-26 17:14:55 +0800480 0x0f, 0x10, 0x14, 0x15, 0x17, 0
Takashi Iwai39fa84e2011-06-27 15:28:57 +0200481 };
Michał Mirosławcaf3c042020-01-03 10:23:48 +0100482 const hda_nid_t *p;
Takashi Iwai39fa84e2011-06-27 15:28:57 +0200483 for (p = pins; *p; p++)
484 set_eapd(codec, *p, on);
Takashi Iwai691f1fc2011-04-07 10:31:43 +0200485}
486
Kailang Yangdad31972019-05-10 16:28:57 +0800487static int find_ext_mic_pin(struct hda_codec *codec);
488
489static void alc_headset_mic_no_shutup(struct hda_codec *codec)
490{
491 const struct hda_pincfg *pin;
492 int mic_pin = find_ext_mic_pin(codec);
493 int i;
494
495 /* don't shut up pins when unloading the driver; otherwise it breaks
496 * the default pin setup at the next load of the driver
497 */
498 if (codec->bus->shutdown)
499 return;
500
501 snd_array_for_each(&codec->init_pins, i, pin) {
502 /* use read here for syncing after issuing each verb */
503 if (pin->nid != mic_pin)
504 snd_hda_codec_read(codec, pin->nid, 0,
505 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
506 }
507
508 codec->pins_shutup = 1;
509}
510
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +0100511static void alc_shutup_pins(struct hda_codec *codec)
512{
513 struct alc_spec *spec = codec->spec;
514
Kailang Yangdad31972019-05-10 16:28:57 +0800515 switch (codec->core.vendor_id) {
Kailang Yang66c5d712019-12-09 15:56:15 +0800516 case 0x10ec0283:
Kailang Yangdad31972019-05-10 16:28:57 +0800517 case 0x10ec0286:
518 case 0x10ec0288:
519 case 0x10ec0298:
520 alc_headset_mic_no_shutup(codec);
521 break;
522 default:
523 if (!spec->no_shutup_pins)
524 snd_hda_shutup_pins(codec);
525 break;
526 }
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +0100527}
528
Takashi Iwai1c7161532011-04-07 10:37:16 +0200529/* generic shutup callback;
Lars-Peter Clausen4ce8e6a2016-11-08 15:48:06 +0100530 * just turning off EAPD and a little pause for avoiding pop-noise
Takashi Iwai1c7161532011-04-07 10:37:16 +0200531 */
532static void alc_eapd_shutup(struct hda_codec *codec)
533{
Kailang Yang97a26572013-11-29 00:35:26 -0500534 struct alc_spec *spec = codec->spec;
535
Takashi Iwai1c7161532011-04-07 10:37:16 +0200536 alc_auto_setup_eapd(codec, false);
Kailang Yang97a26572013-11-29 00:35:26 -0500537 if (!spec->no_depop_delay)
538 msleep(200);
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +0100539 alc_shutup_pins(codec);
Takashi Iwai1c7161532011-04-07 10:37:16 +0200540}
541
Takashi Iwai1d045db2011-07-07 18:23:21 +0200542/* generic EAPD initialization */
Takashi Iwai4a79ba342009-04-22 16:31:35 +0200543static void alc_auto_init_amp(struct hda_codec *codec, int type)
Kailang Yangbc9f98a2007-04-12 13:06:07 +0200544{
Takashi Iwai39fa84e2011-06-27 15:28:57 +0200545 alc_auto_setup_eapd(codec, true);
Takashi Iwai5579cd62018-06-19 22:22:41 +0200546 alc_write_gpio(codec);
Takashi Iwai4a79ba342009-04-22 16:31:35 +0200547 switch (type) {
Takashi Iwai4a79ba342009-04-22 16:31:35 +0200548 case ALC_INIT_DEFAULT:
Takashi Iwai7639a062015-03-03 10:07:24 +0100549 switch (codec->core.vendor_id) {
Kailang Yangc9b58002007-10-16 14:30:01 +0200550 case 0x10ec0260:
Takashi Iwai98b24882014-08-18 13:47:50 +0200551 alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x2010);
Kailang Yangc9b58002007-10-16 14:30:01 +0200552 break;
Kailang Yangc9b58002007-10-16 14:30:01 +0200553 case 0x10ec0880:
554 case 0x10ec0882:
555 case 0x10ec0883:
556 case 0x10ec0885:
Kailang Yang1df88742014-10-29 16:10:13 +0800557 alc_update_coef_idx(codec, 7, 0, 0x2030);
Kailang Yangc9b58002007-10-16 14:30:01 +0200558 break;
Kailang Yangf9423e72008-05-27 12:32:25 +0200559 case 0x10ec0888:
Takashi Iwai4a79ba342009-04-22 16:31:35 +0200560 alc888_coef_init(codec);
Kailang Yangf9423e72008-05-27 12:32:25 +0200561 break;
Kailang Yangbc9f98a2007-04-12 13:06:07 +0200562 }
Kailang Yangbc9f98a2007-04-12 13:06:07 +0200563 break;
564 }
Takashi Iwai4a79ba342009-04-22 16:31:35 +0200565}
Kailang Yangea1fb292008-08-26 12:58:38 +0200566
Takashi Iwai35a39f92019-02-01 11:19:50 +0100567/* get a primary headphone pin if available */
568static hda_nid_t alc_get_hp_pin(struct alc_spec *spec)
569{
570 if (spec->gen.autocfg.hp_pins[0])
571 return spec->gen.autocfg.hp_pins[0];
572 if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
573 return spec->gen.autocfg.line_out_pins[0];
574 return 0;
575}
Takashi Iwai1d045db2011-07-07 18:23:21 +0200576
577/*
578 * Realtek SSID verification
579 */
580
David Henningsson90622912010-10-14 14:50:18 +0200581/* Could be any non-zero and even value. When used as fixup, tells
582 * the driver to ignore any present sku defines.
583 */
584#define ALC_FIXUP_SKU_IGNORE (2)
585
Takashi Iwai23d30f22012-05-07 17:17:32 +0200586static void alc_fixup_sku_ignore(struct hda_codec *codec,
587 const struct hda_fixup *fix, int action)
588{
589 struct alc_spec *spec = codec->spec;
590 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
591 spec->cdefine.fixup = 1;
592 spec->cdefine.sku_cfg = ALC_FIXUP_SKU_IGNORE;
593 }
594}
595
Mengdong Linb5c66112013-11-29 00:35:35 -0500596static void alc_fixup_no_depop_delay(struct hda_codec *codec,
597 const struct hda_fixup *fix, int action)
598{
599 struct alc_spec *spec = codec->spec;
600
Mengdong Lin84d2dc32013-12-02 22:26:03 -0500601 if (action == HDA_FIXUP_ACT_PROBE) {
Mengdong Linb5c66112013-11-29 00:35:35 -0500602 spec->no_depop_delay = 1;
Mengdong Lin84d2dc32013-12-02 22:26:03 -0500603 codec->depop_delay = 0;
604 }
Mengdong Linb5c66112013-11-29 00:35:35 -0500605}
606
Kailang Yangda00c242010-03-19 11:23:45 +0100607static int alc_auto_parse_customize_define(struct hda_codec *codec)
608{
609 unsigned int ass, tmp, i;
Takashi Iwai7fb56222010-03-22 17:09:47 +0100610 unsigned nid = 0;
Kailang Yangda00c242010-03-19 11:23:45 +0100611 struct alc_spec *spec = codec->spec;
612
Takashi Iwaib6cbe512010-07-28 17:43:36 +0200613 spec->cdefine.enable_pcbeep = 1; /* assume always enabled */
614
David Henningsson90622912010-10-14 14:50:18 +0200615 if (spec->cdefine.fixup) {
616 ass = spec->cdefine.sku_cfg;
617 if (ass == ALC_FIXUP_SKU_IGNORE)
618 return -1;
619 goto do_sku;
620 }
621
Takashi Iwai5100cd02014-02-15 10:03:19 +0100622 if (!codec->bus->pci)
623 return -1;
Takashi Iwai7639a062015-03-03 10:07:24 +0100624 ass = codec->core.subsystem_id & 0xffff;
Takashi Iwaib6cbe512010-07-28 17:43:36 +0200625 if (ass != codec->bus->pci->subsystem_device && (ass & 1))
Kailang Yangda00c242010-03-19 11:23:45 +0100626 goto do_sku;
627
628 nid = 0x1d;
Takashi Iwai7639a062015-03-03 10:07:24 +0100629 if (codec->core.vendor_id == 0x10ec0260)
Kailang Yangda00c242010-03-19 11:23:45 +0100630 nid = 0x17;
631 ass = snd_hda_codec_get_pincfg(codec, nid);
632
633 if (!(ass & 1)) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100634 codec_info(codec, "%s: SKU not ready 0x%08x\n",
Takashi Iwai7639a062015-03-03 10:07:24 +0100635 codec->core.chip_name, ass);
Kailang Yangda00c242010-03-19 11:23:45 +0100636 return -1;
637 }
638
639 /* check sum */
640 tmp = 0;
641 for (i = 1; i < 16; i++) {
642 if ((ass >> i) & 1)
643 tmp++;
644 }
645 if (((ass >> 16) & 0xf) != tmp)
646 return -1;
647
648 spec->cdefine.port_connectivity = ass >> 30;
649 spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
650 spec->cdefine.check_sum = (ass >> 16) & 0xf;
651 spec->cdefine.customization = ass >> 8;
652do_sku:
653 spec->cdefine.sku_cfg = ass;
654 spec->cdefine.external_amp = (ass & 0x38) >> 3;
655 spec->cdefine.platform_type = (ass & 0x4) >> 2;
656 spec->cdefine.swap = (ass & 0x2) >> 1;
657 spec->cdefine.override = ass & 0x1;
658
Takashi Iwai4e76a882014-02-25 12:21:03 +0100659 codec_dbg(codec, "SKU: Nid=0x%x sku_cfg=0x%08x\n",
Kailang Yangda00c242010-03-19 11:23:45 +0100660 nid, spec->cdefine.sku_cfg);
Takashi Iwai4e76a882014-02-25 12:21:03 +0100661 codec_dbg(codec, "SKU: port_connectivity=0x%x\n",
Kailang Yangda00c242010-03-19 11:23:45 +0100662 spec->cdefine.port_connectivity);
Takashi Iwai4e76a882014-02-25 12:21:03 +0100663 codec_dbg(codec, "SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
664 codec_dbg(codec, "SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
665 codec_dbg(codec, "SKU: customization=0x%08x\n", spec->cdefine.customization);
666 codec_dbg(codec, "SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
667 codec_dbg(codec, "SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
668 codec_dbg(codec, "SKU: swap=0x%x\n", spec->cdefine.swap);
669 codec_dbg(codec, "SKU: override=0x%x\n", spec->cdefine.override);
Kailang Yangda00c242010-03-19 11:23:45 +0100670
671 return 0;
672}
673
Takashi Iwai08c189f2012-12-19 15:22:24 +0100674/* return the position of NID in the list, or -1 if not found */
675static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
676{
677 int i;
678 for (i = 0; i < nums; i++)
679 if (list[i] == nid)
680 return i;
681 return -1;
682}
Takashi Iwai1d045db2011-07-07 18:23:21 +0200683/* return true if the given NID is found in the list */
Takashi Iwai3af9ee62011-06-27 12:34:01 +0200684static bool found_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
685{
Takashi Iwai21268962011-07-07 15:01:13 +0200686 return find_idx_in_nid_list(nid, list, nums) >= 0;
Takashi Iwai3af9ee62011-06-27 12:34:01 +0200687}
688
Takashi Iwai4a79ba342009-04-22 16:31:35 +0200689/* check subsystem ID and set up device-specific initialization;
690 * return 1 if initialized, 0 if invalid SSID
691 */
692/* 32-bit subsystem ID for BIOS loading in HD Audio codec.
693 * 31 ~ 16 : Manufacture ID
694 * 15 ~ 8 : SKU ID
695 * 7 ~ 0 : Assembly ID
696 * port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
697 */
Takashi Iwai58c57cf2014-01-07 18:22:49 +0100698static int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports)
Takashi Iwai4a79ba342009-04-22 16:31:35 +0200699{
700 unsigned int ass, tmp, i;
701 unsigned nid;
702 struct alc_spec *spec = codec->spec;
703
David Henningsson90622912010-10-14 14:50:18 +0200704 if (spec->cdefine.fixup) {
705 ass = spec->cdefine.sku_cfg;
706 if (ass == ALC_FIXUP_SKU_IGNORE)
707 return 0;
708 goto do_sku;
709 }
710
Takashi Iwai7639a062015-03-03 10:07:24 +0100711 ass = codec->core.subsystem_id & 0xffff;
Takashi Iwai5100cd02014-02-15 10:03:19 +0100712 if (codec->bus->pci &&
713 ass != codec->bus->pci->subsystem_device && (ass & 1))
Takashi Iwai4a79ba342009-04-22 16:31:35 +0200714 goto do_sku;
715
716 /* invalid SSID, check the special NID pin defcfg instead */
717 /*
Sasha Alexandrdef319f2009-06-16 16:00:15 -0400718 * 31~30 : port connectivity
Takashi Iwai4a79ba342009-04-22 16:31:35 +0200719 * 29~21 : reserve
720 * 20 : PCBEEP input
721 * 19~16 : Check sum (15:1)
722 * 15~1 : Custom
723 * 0 : override
724 */
725 nid = 0x1d;
Takashi Iwai7639a062015-03-03 10:07:24 +0100726 if (codec->core.vendor_id == 0x10ec0260)
Takashi Iwai4a79ba342009-04-22 16:31:35 +0200727 nid = 0x17;
728 ass = snd_hda_codec_get_pincfg(codec, nid);
Takashi Iwai4e76a882014-02-25 12:21:03 +0100729 codec_dbg(codec,
730 "realtek: No valid SSID, checking pincfg 0x%08x for NID 0x%x\n",
Takashi Iwaicb6605c2009-04-28 13:03:19 +0200731 ass, nid);
Kailang Yang6227cdc2010-02-25 08:36:52 +0100732 if (!(ass & 1))
Takashi Iwai4a79ba342009-04-22 16:31:35 +0200733 return 0;
734 if ((ass >> 30) != 1) /* no physical connection */
735 return 0;
736
737 /* check sum */
738 tmp = 0;
739 for (i = 1; i < 16; i++) {
740 if ((ass >> i) & 1)
741 tmp++;
742 }
743 if (((ass >> 16) & 0xf) != tmp)
744 return 0;
745do_sku:
Takashi Iwai4e76a882014-02-25 12:21:03 +0100746 codec_dbg(codec, "realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
Takashi Iwai7639a062015-03-03 10:07:24 +0100747 ass & 0xffff, codec->core.vendor_id);
Takashi Iwai4a79ba342009-04-22 16:31:35 +0200748 /*
749 * 0 : override
750 * 1 : Swap Jack
751 * 2 : 0 --> Desktop, 1 --> Laptop
752 * 3~5 : External Amplifier control
753 * 7~6 : Reserved
754 */
755 tmp = (ass & 0x38) >> 3; /* external Amp control */
Takashi Iwai1c76aa52018-06-21 16:37:54 +0200756 if (spec->init_amp == ALC_INIT_UNDEFINED) {
757 switch (tmp) {
758 case 1:
Takashi Iwai5579cd62018-06-19 22:22:41 +0200759 alc_setup_gpio(codec, 0x01);
Takashi Iwai1c76aa52018-06-21 16:37:54 +0200760 break;
761 case 3:
Takashi Iwai5579cd62018-06-19 22:22:41 +0200762 alc_setup_gpio(codec, 0x02);
Takashi Iwai1c76aa52018-06-21 16:37:54 +0200763 break;
764 case 7:
Takashi Iwai5579cd62018-06-19 22:22:41 +0200765 alc_setup_gpio(codec, 0x03);
Takashi Iwai1c76aa52018-06-21 16:37:54 +0200766 break;
767 case 5:
768 default:
769 spec->init_amp = ALC_INIT_DEFAULT;
770 break;
771 }
Takashi Iwai4a79ba342009-04-22 16:31:35 +0200772 }
773
774 /* is laptop or Desktop and enable the function "Mute internal speaker
775 * when the external headphone out jack is plugged"
776 */
777 if (!(ass & 0x8000))
778 return 1;
779 /*
780 * 10~8 : Jack location
781 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
782 * 14~13: Resvered
783 * 15 : 1 --> enable the function "Mute internal speaker
784 * when the external headphone out jack is plugged"
785 */
Takashi Iwai35a39f92019-02-01 11:19:50 +0100786 if (!alc_get_hp_pin(spec)) {
Takashi Iwai01d48252009-10-06 13:21:54 +0200787 hda_nid_t nid;
Kailang Yangc9b58002007-10-16 14:30:01 +0200788 tmp = (ass >> 11) & 0x3; /* HP to chassis */
Takashi Iwai58c57cf2014-01-07 18:22:49 +0100789 nid = ports[tmp];
Takashi Iwai08c189f2012-12-19 15:22:24 +0100790 if (found_in_nid_list(nid, spec->gen.autocfg.line_out_pins,
791 spec->gen.autocfg.line_outs))
Takashi Iwai3af9ee62011-06-27 12:34:01 +0200792 return 1;
Takashi Iwai08c189f2012-12-19 15:22:24 +0100793 spec->gen.autocfg.hp_pins[0] = nid;
Kailang Yangc9b58002007-10-16 14:30:01 +0200794 }
Takashi Iwai4a79ba342009-04-22 16:31:35 +0200795 return 1;
796}
Kailang Yangea1fb292008-08-26 12:58:38 +0200797
Takashi Iwai3e6179b2011-07-08 16:55:13 +0200798/* Check the validity of ALC subsystem-id
799 * ports contains an array of 4 pin NIDs for port-A, E, D and I */
800static void alc_ssid_check(struct hda_codec *codec, const hda_nid_t *ports)
Takashi Iwai4a79ba342009-04-22 16:31:35 +0200801{
Takashi Iwai58c57cf2014-01-07 18:22:49 +0100802 if (!alc_subsystem_id(codec, ports)) {
Takashi Iwai4a79ba342009-04-22 16:31:35 +0200803 struct alc_spec *spec = codec->spec;
Takashi Iwai67791202020-04-18 21:06:39 +0200804 if (spec->init_amp == ALC_INIT_UNDEFINED) {
805 codec_dbg(codec,
806 "realtek: Enable default setup for auto mode as fallback\n");
807 spec->init_amp = ALC_INIT_DEFAULT;
808 }
Takashi Iwai4a79ba342009-04-22 16:31:35 +0200809 }
Takashi Iwai21268962011-07-07 15:01:13 +0200810}
Takashi Iwai1a1455d2011-04-28 17:36:18 +0200811
Takashi Iwai41e41f12005-06-08 14:48:49 +0200812/*
Takashi Iwai1d045db2011-07-07 18:23:21 +0200813 */
814
David Henningsson9d36a7d2014-10-07 10:18:42 +0200815static void alc_fixup_inv_dmic(struct hda_codec *codec,
816 const struct hda_fixup *fix, int action)
Takashi Iwai125821a2012-06-22 14:30:29 +0200817{
818 struct alc_spec *spec = codec->spec;
Takashi Iwai668d1e92012-11-29 14:10:17 +0100819
David Henningsson9d36a7d2014-10-07 10:18:42 +0200820 spec->gen.inv_dmic_split = 1;
Takashi Iwai6e72aa52012-06-25 10:52:25 +0200821}
822
Takashi Iwai603c4012008-07-30 15:01:44 +0200823
Takashi Iwai2eab6942012-12-18 15:30:41 +0100824static int alc_build_controls(struct hda_codec *codec)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700825{
Takashi Iwaia5cb4632018-06-20 12:50:11 +0200826 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700827
Takashi Iwai08c189f2012-12-19 15:22:24 +0100828 err = snd_hda_gen_build_controls(codec);
829 if (err < 0)
830 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700831
Takashi Iwai1727a772013-01-10 09:52:52 +0100832 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_BUILD);
Takashi Iwai420b0fe2012-03-12 12:35:27 +0100833 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700834}
835
Takashi Iwaie9edcee2005-06-13 14:16:38 +0200836
Linus Torvalds1da177e2005-04-16 15:20:36 -0700837/*
Takashi Iwaiae6b8132006-03-03 16:47:17 +0100838 * Common callbacks
Takashi Iwaie9edcee2005-06-13 14:16:38 +0200839 */
Takashi Iwai16ded522005-06-10 19:58:24 +0200840
Takashi Iwaic9af7532019-05-10 11:01:43 +0200841static void alc_pre_init(struct hda_codec *codec)
842{
843 alc_fill_eapd_coef(codec);
844}
845
Kailang Yangaeac1a02019-05-16 16:10:44 +0800846#define is_s3_resume(codec) \
847 ((codec)->core.dev.power.power_state.event == PM_EVENT_RESUME)
Takashi Iwaic9af7532019-05-10 11:01:43 +0200848#define is_s4_resume(codec) \
849 ((codec)->core.dev.power.power_state.event == PM_EVENT_RESTORE)
850
Linus Torvalds1da177e2005-04-16 15:20:36 -0700851static int alc_init(struct hda_codec *codec)
852{
853 struct alc_spec *spec = codec->spec;
Takashi Iwaie9edcee2005-06-13 14:16:38 +0200854
Takashi Iwaic9af7532019-05-10 11:01:43 +0200855 /* hibernation resume needs the full chip initialization */
856 if (is_s4_resume(codec))
857 alc_pre_init(codec);
858
Takashi Iwai546bb672012-03-07 08:37:19 +0100859 if (spec->init_hook)
860 spec->init_hook(codec);
Kailang Yang526af6e2012-03-07 08:25:20 +0100861
Takashi Iwai89781d02019-08-30 12:03:38 +0200862 spec->gen.skip_verbs = 1; /* applied in below */
Kailang Yang607ca3b2019-04-26 16:35:41 +0800863 snd_hda_gen_init(codec);
Takashi Iwai2c3bf9a2008-06-04 12:39:38 +0200864 alc_fix_pll(codec);
Takashi Iwai4a79ba342009-04-22 16:31:35 +0200865 alc_auto_init_amp(codec, spec->init_amp);
Takashi Iwai89781d02019-08-30 12:03:38 +0200866 snd_hda_apply_verbs(codec); /* apply verbs here after own init */
Takashi Iwai2c3bf9a2008-06-04 12:39:38 +0200867
Takashi Iwai1727a772013-01-10 09:52:52 +0100868 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT);
Takashi Iwaie08a0072006-09-07 17:52:14 +0200869
Linus Torvalds1da177e2005-04-16 15:20:36 -0700870 return 0;
871}
872
Takashi Iwaia4e09aa2009-12-27 11:22:24 +0100873static inline void alc_shutup(struct hda_codec *codec)
874{
Takashi Iwai1c7161532011-04-07 10:37:16 +0200875 struct alc_spec *spec = codec->spec;
876
Takashi Iwaic7273bd2018-06-12 16:09:57 +0200877 if (!snd_hda_get_bool_hint(codec, "shutup"))
878 return; /* disabled explicitly by hints */
879
Takashi Iwai1c7161532011-04-07 10:37:16 +0200880 if (spec && spec->shutup)
881 spec->shutup(codec);
Takashi Iwai9bfb2842013-07-24 14:31:50 +0200882 else
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +0100883 alc_shutup_pins(codec);
Takashi Iwaia4e09aa2009-12-27 11:22:24 +0100884}
885
Takashi Iwai70a09762015-12-15 14:59:58 +0100886static void alc_reboot_notify(struct hda_codec *codec)
887{
888 struct alc_spec *spec = codec->spec;
889
890 if (spec && spec->reboot_notify)
891 spec->reboot_notify(codec);
892 else
893 alc_shutup(codec);
894}
895
Takashi Iwai8a02c0c2014-02-10 18:09:45 +0100896#define alc_free snd_hda_gen_free
Linus Torvalds1da177e2005-04-16 15:20:36 -0700897
Takashi Iwai83012a72012-08-24 18:38:08 +0200898#ifdef CONFIG_PM
Daniel T Chenc97259d2009-12-27 18:52:08 -0500899static void alc_power_eapd(struct hda_codec *codec)
900{
Takashi Iwai691f1fc2011-04-07 10:31:43 +0200901 alc_auto_setup_eapd(codec, false);
Daniel T Chenc97259d2009-12-27 18:52:08 -0500902}
903
Takashi Iwai68cb2b52012-07-02 15:20:37 +0200904static int alc_suspend(struct hda_codec *codec)
Hector Martinf5de24b2009-12-20 22:51:31 +0100905{
906 struct alc_spec *spec = codec->spec;
Takashi Iwaia4e09aa2009-12-27 11:22:24 +0100907 alc_shutup(codec);
Hector Martinf5de24b2009-12-20 22:51:31 +0100908 if (spec && spec->power_hook)
Daniel T Chenc97259d2009-12-27 18:52:08 -0500909 spec->power_hook(codec);
Hector Martinf5de24b2009-12-20 22:51:31 +0100910 return 0;
911}
912#endif
913
Takashi Iwai2a439522011-07-26 09:52:50 +0200914#ifdef CONFIG_PM
Takashi Iwaie044c392008-10-27 16:56:24 +0100915static int alc_resume(struct hda_codec *codec)
916{
Kailang Yang97a26572013-11-29 00:35:26 -0500917 struct alc_spec *spec = codec->spec;
918
919 if (!spec->no_depop_delay)
920 msleep(150); /* to avoid pop noise */
Takashi Iwaie044c392008-10-27 16:56:24 +0100921 codec->patch_ops.init(codec);
Takashi Iwai1a462be2020-01-09 10:01:04 +0100922 snd_hda_regmap_sync(codec);
Takashi Iwai9e5341b2010-09-21 09:57:06 +0200923 hda_call_check_power_status(codec, 0x01);
Takashi Iwaie044c392008-10-27 16:56:24 +0100924 return 0;
925}
Takashi Iwaie044c392008-10-27 16:56:24 +0100926#endif
927
Linus Torvalds1da177e2005-04-16 15:20:36 -0700928/*
929 */
Takashi Iwaia9111322011-05-02 11:30:18 +0200930static const struct hda_codec_ops alc_patch_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700931 .build_controls = alc_build_controls,
Takashi Iwai08c189f2012-12-19 15:22:24 +0100932 .build_pcms = snd_hda_gen_build_pcms,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700933 .init = alc_init,
934 .free = alc_free,
David Henningsson29adc4b2012-09-25 11:31:00 +0200935 .unsol_event = snd_hda_jack_unsol_event,
Takashi Iwai2a439522011-07-26 09:52:50 +0200936#ifdef CONFIG_PM
Takashi Iwaie044c392008-10-27 16:56:24 +0100937 .resume = alc_resume,
Hector Martinf5de24b2009-12-20 22:51:31 +0100938 .suspend = alc_suspend,
Takashi Iwaifce52a32013-01-07 12:42:48 +0100939 .check_power_status = snd_hda_gen_check_power_status,
Takashi Iwaicb53c622007-08-10 17:21:45 +0200940#endif
Takashi Iwai70a09762015-12-15 14:59:58 +0100941 .reboot_notify = alc_reboot_notify,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700942};
943
David Henningsson29adc4b2012-09-25 11:31:00 +0200944
Takashi Iwaided255b2015-10-01 17:59:43 +0200945#define alc_codec_rename(codec, name) snd_hda_codec_set_name(codec, name)
Kailang Yangc027ddc2010-03-19 11:33:06 +0100946
Takashi Iwai2fa522b2005-05-12 14:51:12 +0200947/*
Kailang Yang4b016932013-11-28 11:55:09 +0100948 * Rename codecs appropriately from COEF value or subvendor id
Takashi Iwaie16fb6d2011-10-17 16:39:09 +0200949 */
950struct alc_codec_rename_table {
951 unsigned int vendor_id;
952 unsigned short coef_mask;
953 unsigned short coef_bits;
954 const char *name;
955};
956
Kailang Yang4b016932013-11-28 11:55:09 +0100957struct alc_codec_rename_pci_table {
958 unsigned int codec_vendor_id;
959 unsigned short pci_subvendor;
960 unsigned short pci_subdevice;
961 const char *name;
962};
963
Takashi Iwai6b0f95c2020-01-05 15:47:18 +0100964static const struct alc_codec_rename_table rename_tbl[] = {
Kailang Yange6e5f7a2014-06-06 16:46:43 +0800965 { 0x10ec0221, 0xf00f, 0x1003, "ALC231" },
Takashi Iwaie16fb6d2011-10-17 16:39:09 +0200966 { 0x10ec0269, 0xfff0, 0x3010, "ALC277" },
967 { 0x10ec0269, 0xf0f0, 0x2010, "ALC259" },
968 { 0x10ec0269, 0xf0f0, 0x3010, "ALC258" },
969 { 0x10ec0269, 0x00f0, 0x0010, "ALC269VB" },
970 { 0x10ec0269, 0xffff, 0xa023, "ALC259" },
971 { 0x10ec0269, 0xffff, 0x6023, "ALC281X" },
972 { 0x10ec0269, 0x00f0, 0x0020, "ALC269VC" },
Kailang Yangadcc70b2012-05-25 08:08:38 +0200973 { 0x10ec0269, 0x00f0, 0x0030, "ALC269VD" },
Kailang Yange6e5f7a2014-06-06 16:46:43 +0800974 { 0x10ec0662, 0xffff, 0x4020, "ALC656" },
Takashi Iwaie16fb6d2011-10-17 16:39:09 +0200975 { 0x10ec0887, 0x00f0, 0x0030, "ALC887-VD" },
976 { 0x10ec0888, 0x00f0, 0x0030, "ALC888-VD" },
977 { 0x10ec0888, 0xf0f0, 0x3020, "ALC886" },
978 { 0x10ec0899, 0x2000, 0x2000, "ALC899" },
979 { 0x10ec0892, 0xffff, 0x8020, "ALC661" },
980 { 0x10ec0892, 0xffff, 0x8011, "ALC661" },
981 { 0x10ec0892, 0xffff, 0x4011, "ALC656" },
982 { } /* terminator */
983};
984
Takashi Iwai6b0f95c2020-01-05 15:47:18 +0100985static const struct alc_codec_rename_pci_table rename_pci_tbl[] = {
Kailang Yang4b016932013-11-28 11:55:09 +0100986 { 0x10ec0280, 0x1028, 0, "ALC3220" },
987 { 0x10ec0282, 0x1028, 0, "ALC3221" },
988 { 0x10ec0283, 0x1028, 0, "ALC3223" },
Kailang Yang193177d2014-04-23 16:06:13 +0800989 { 0x10ec0288, 0x1028, 0, "ALC3263" },
Kailang Yang4b016932013-11-28 11:55:09 +0100990 { 0x10ec0292, 0x1028, 0, "ALC3226" },
Kailang Yang193177d2014-04-23 16:06:13 +0800991 { 0x10ec0293, 0x1028, 0, "ALC3235" },
Kailang Yang4b016932013-11-28 11:55:09 +0100992 { 0x10ec0255, 0x1028, 0, "ALC3234" },
993 { 0x10ec0668, 0x1028, 0, "ALC3661" },
Kailang Yange6e5f7a2014-06-06 16:46:43 +0800994 { 0x10ec0275, 0x1028, 0, "ALC3260" },
995 { 0x10ec0899, 0x1028, 0, "ALC3861" },
Kailang Yang2c674fa2015-05-05 15:02:42 +0800996 { 0x10ec0298, 0x1028, 0, "ALC3266" },
Kailang Yang736f20a2017-10-20 15:06:34 +0800997 { 0x10ec0236, 0x1028, 0, "ALC3204" },
Kailang Yang82324502015-05-25 17:16:49 +0800998 { 0x10ec0256, 0x1028, 0, "ALC3246" },
Kailang Yang42314302016-02-03 15:03:50 +0800999 { 0x10ec0225, 0x1028, 0, "ALC3253" },
Kailang Yang7d727862016-05-24 16:46:07 +08001000 { 0x10ec0295, 0x1028, 0, "ALC3254" },
Kailang Yang28f1f9b2017-01-04 14:49:07 +08001001 { 0x10ec0299, 0x1028, 0, "ALC3271" },
Kailang Yange6e5f7a2014-06-06 16:46:43 +08001002 { 0x10ec0670, 0x1025, 0, "ALC669X" },
1003 { 0x10ec0676, 0x1025, 0, "ALC679X" },
1004 { 0x10ec0282, 0x1043, 0, "ALC3229" },
1005 { 0x10ec0233, 0x1043, 0, "ALC3236" },
1006 { 0x10ec0280, 0x103c, 0, "ALC3228" },
1007 { 0x10ec0282, 0x103c, 0, "ALC3227" },
1008 { 0x10ec0286, 0x103c, 0, "ALC3242" },
1009 { 0x10ec0290, 0x103c, 0, "ALC3241" },
1010 { 0x10ec0668, 0x103c, 0, "ALC3662" },
1011 { 0x10ec0283, 0x17aa, 0, "ALC3239" },
1012 { 0x10ec0292, 0x17aa, 0, "ALC3232" },
Kailang Yang4b016932013-11-28 11:55:09 +01001013 { } /* terminator */
1014};
1015
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02001016static int alc_codec_rename_from_preset(struct hda_codec *codec)
1017{
1018 const struct alc_codec_rename_table *p;
Kailang Yang4b016932013-11-28 11:55:09 +01001019 const struct alc_codec_rename_pci_table *q;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02001020
1021 for (p = rename_tbl; p->vendor_id; p++) {
Takashi Iwai7639a062015-03-03 10:07:24 +01001022 if (p->vendor_id != codec->core.vendor_id)
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02001023 continue;
Takashi Iwai1bb7e432011-10-17 16:50:59 +02001024 if ((alc_get_coef0(codec) & p->coef_mask) == p->coef_bits)
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02001025 return alc_codec_rename(codec, p->name);
1026 }
Kailang Yang4b016932013-11-28 11:55:09 +01001027
Takashi Iwai5100cd02014-02-15 10:03:19 +01001028 if (!codec->bus->pci)
1029 return 0;
Kailang Yang4b016932013-11-28 11:55:09 +01001030 for (q = rename_pci_tbl; q->codec_vendor_id; q++) {
Takashi Iwai7639a062015-03-03 10:07:24 +01001031 if (q->codec_vendor_id != codec->core.vendor_id)
Kailang Yang4b016932013-11-28 11:55:09 +01001032 continue;
1033 if (q->pci_subvendor != codec->bus->pci->subsystem_vendor)
1034 continue;
1035 if (!q->pci_subdevice ||
1036 q->pci_subdevice == codec->bus->pci->subsystem_device)
1037 return alc_codec_rename(codec, q->name);
1038 }
1039
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02001040 return 0;
1041}
1042
Takashi Iwaie4770622011-07-08 11:11:35 +02001043
1044/*
Takashi Iwai1d045db2011-07-07 18:23:21 +02001045 * Digital-beep handlers
1046 */
1047#ifdef CONFIG_SND_HDA_INPUT_BEEP
Takashi Iwaifea80fa2018-06-20 12:52:46 +02001048
1049/* additional beep mixers; private_value will be overwritten */
1050static const struct snd_kcontrol_new alc_beep_mixer[] = {
1051 HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
1052 HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
1053};
1054
1055/* set up and create beep controls */
1056static int set_beep_amp(struct alc_spec *spec, hda_nid_t nid,
1057 int idx, int dir)
1058{
1059 struct snd_kcontrol_new *knew;
1060 unsigned int beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir);
1061 int i;
1062
1063 for (i = 0; i < ARRAY_SIZE(alc_beep_mixer); i++) {
1064 knew = snd_hda_gen_add_kctl(&spec->gen, NULL,
1065 &alc_beep_mixer[i]);
1066 if (!knew)
1067 return -ENOMEM;
1068 knew->private_value = beep_amp;
1069 }
1070 return 0;
1071}
Takashi Iwai1d045db2011-07-07 18:23:21 +02001072
1073static const struct snd_pci_quirk beep_white_list[] = {
Duncan Roe71100052012-10-10 14:19:50 +02001074 SND_PCI_QUIRK(0x1043, 0x103c, "ASUS", 1),
W. Trevor Kinga4b7f21d2014-03-29 17:47:24 -07001075 SND_PCI_QUIRK(0x1043, 0x115d, "ASUS", 1),
Takashi Iwai1d045db2011-07-07 18:23:21 +02001076 SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),
Takashi Iwai8554ee42013-02-25 09:54:43 +01001077 SND_PCI_QUIRK(0x1043, 0x8376, "EeePC", 1),
Takashi Iwai1d045db2011-07-07 18:23:21 +02001078 SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1),
1079 SND_PCI_QUIRK(0x1043, 0x831a, "EeePC", 1),
1080 SND_PCI_QUIRK(0x1043, 0x834a, "EeePC", 1),
Takashi Iwai78f8baf2012-03-06 14:02:32 +01001081 SND_PCI_QUIRK(0x1458, 0xa002, "GA-MA790X", 1),
Takashi Iwai1d045db2011-07-07 18:23:21 +02001082 SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),
Takashi Iwai051c78a2019-08-22 09:58:07 +02001083 /* blacklist -- no beep available */
1084 SND_PCI_QUIRK(0x17aa, 0x309e, "Lenovo ThinkCentre M73", 0),
1085 SND_PCI_QUIRK(0x17aa, 0x30a3, "Lenovo ThinkCentre M93", 0),
Takashi Iwai1d045db2011-07-07 18:23:21 +02001086 {}
1087};
1088
1089static inline int has_cdefine_beep(struct hda_codec *codec)
1090{
1091 struct alc_spec *spec = codec->spec;
1092 const struct snd_pci_quirk *q;
1093 q = snd_pci_quirk_lookup(codec->bus->pci, beep_white_list);
1094 if (q)
1095 return q->value;
1096 return spec->cdefine.enable_pcbeep;
1097}
1098#else
Takashi Iwaifea80fa2018-06-20 12:52:46 +02001099#define set_beep_amp(spec, nid, idx, dir) 0
Takashi Iwai1d045db2011-07-07 18:23:21 +02001100#define has_cdefine_beep(codec) 0
1101#endif
1102
1103/* parse the BIOS configuration and set up the alc_spec */
1104/* return 1 if successful, 0 if the proper config is not found,
1105 * or a negative error code
1106 */
Takashi Iwai3e6179b2011-07-08 16:55:13 +02001107static int alc_parse_auto_config(struct hda_codec *codec,
1108 const hda_nid_t *ignore_nids,
1109 const hda_nid_t *ssid_nids)
Takashi Iwai1d045db2011-07-07 18:23:21 +02001110{
1111 struct alc_spec *spec = codec->spec;
Takashi Iwai08c189f2012-12-19 15:22:24 +01001112 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001113 int err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001114
Takashi Iwai53c334a2011-08-23 18:27:14 +02001115 err = snd_hda_parse_pin_defcfg(codec, cfg, ignore_nids,
1116 spec->parse_flags);
Takashi Iwai1d045db2011-07-07 18:23:21 +02001117 if (err < 0)
1118 return err;
Takashi Iwai3e6179b2011-07-08 16:55:13 +02001119
1120 if (ssid_nids)
1121 alc_ssid_check(codec, ssid_nids);
1122
Takashi Iwai08c189f2012-12-19 15:22:24 +01001123 err = snd_hda_gen_parse_auto_config(codec, cfg);
1124 if (err < 0)
1125 return err;
Takashi Iwai070cff42012-02-21 12:54:17 +01001126
Takashi Iwai1d045db2011-07-07 18:23:21 +02001127 return 1;
1128}
1129
Takashi Iwai3de95172012-05-07 18:03:15 +02001130/* common preparation job for alc_spec */
1131static int alc_alloc_spec(struct hda_codec *codec, hda_nid_t mixer_nid)
1132{
1133 struct alc_spec *spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1134 int err;
1135
1136 if (!spec)
1137 return -ENOMEM;
1138 codec->spec = spec;
Takashi Iwai08c189f2012-12-19 15:22:24 +01001139 snd_hda_gen_spec_init(&spec->gen);
1140 spec->gen.mixer_nid = mixer_nid;
1141 spec->gen.own_eapd_ctl = 1;
Takashi Iwai1098b7c2012-12-17 20:03:15 +01001142 codec->single_adc_amp = 1;
Takashi Iwai08c189f2012-12-19 15:22:24 +01001143 /* FIXME: do we need this for all Realtek codec models? */
1144 codec->spdif_status_reset = 1;
Takashi Iwai225068a2015-05-29 10:42:14 +02001145 codec->patch_ops = alc_patch_ops;
Takashi Iwai3de95172012-05-07 18:03:15 +02001146
1147 err = alc_codec_rename_from_preset(codec);
1148 if (err < 0) {
1149 kfree(spec);
1150 return err;
1151 }
1152 return 0;
1153}
1154
Takashi Iwai3e6179b2011-07-08 16:55:13 +02001155static int alc880_parse_auto_config(struct hda_codec *codec)
1156{
1157 static const hda_nid_t alc880_ignore[] = { 0x1d, 0 };
Jesper Juhl7d7eb9e2012-04-12 22:11:25 +02001158 static const hda_nid_t alc880_ssids[] = { 0x15, 0x1b, 0x14, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02001159 return alc_parse_auto_config(codec, alc880_ignore, alc880_ssids);
1160}
1161
Takashi Iwai1d045db2011-07-07 18:23:21 +02001162/*
Takashi Iwaiee3b2962011-11-15 14:26:54 +01001163 * ALC880 fix-ups
1164 */
1165enum {
Takashi Iwai411225a2012-02-20 17:48:19 +01001166 ALC880_FIXUP_GPIO1,
Takashi Iwaiee3b2962011-11-15 14:26:54 +01001167 ALC880_FIXUP_GPIO2,
1168 ALC880_FIXUP_MEDION_RIM,
Takashi Iwaidc6af522012-02-17 16:18:59 +01001169 ALC880_FIXUP_LG,
Takashi Iwaidb8a38e2013-08-09 12:34:42 +02001170 ALC880_FIXUP_LG_LW25,
Takashi Iwaif02aab52012-02-17 16:33:56 +01001171 ALC880_FIXUP_W810,
Takashi Iwai27e917f2012-02-17 17:49:54 +01001172 ALC880_FIXUP_EAPD_COEF,
Takashi Iwaib9368f52012-02-17 17:54:44 +01001173 ALC880_FIXUP_TCL_S700,
Takashi Iwaicf5a2272012-02-20 16:31:07 +01001174 ALC880_FIXUP_VOL_KNOB,
1175 ALC880_FIXUP_FUJITSU,
Takashi Iwaiba533812012-02-20 16:36:52 +01001176 ALC880_FIXUP_F1734,
Takashi Iwai817de922012-02-20 17:20:48 +01001177 ALC880_FIXUP_UNIWILL,
Takashi Iwai967b88c2012-02-20 17:31:02 +01001178 ALC880_FIXUP_UNIWILL_DIG,
Takashi Iwai96e225f2012-02-20 17:41:51 +01001179 ALC880_FIXUP_Z71V,
Takashi Iwai487a5882013-11-07 07:29:30 +01001180 ALC880_FIXUP_ASUS_W5A,
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001181 ALC880_FIXUP_3ST_BASE,
1182 ALC880_FIXUP_3ST,
1183 ALC880_FIXUP_3ST_DIG,
1184 ALC880_FIXUP_5ST_BASE,
1185 ALC880_FIXUP_5ST,
1186 ALC880_FIXUP_5ST_DIG,
1187 ALC880_FIXUP_6ST_BASE,
1188 ALC880_FIXUP_6ST,
1189 ALC880_FIXUP_6ST_DIG,
Takashi Iwai53971452013-01-23 18:21:37 +01001190 ALC880_FIXUP_6ST_AUTOMUTE,
Takashi Iwaiee3b2962011-11-15 14:26:54 +01001191};
1192
Takashi Iwaicf5a2272012-02-20 16:31:07 +01001193/* enable the volume-knob widget support on NID 0x21 */
1194static void alc880_fixup_vol_knob(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01001195 const struct hda_fixup *fix, int action)
Takashi Iwaicf5a2272012-02-20 16:31:07 +01001196{
Takashi Iwai1727a772013-01-10 09:52:52 +01001197 if (action == HDA_FIXUP_ACT_PROBE)
Takashi Iwai62f949b2014-09-11 14:06:53 +02001198 snd_hda_jack_detect_enable_callback(codec, 0x21,
1199 alc_update_knob_master);
Takashi Iwaicf5a2272012-02-20 16:31:07 +01001200}
1201
Takashi Iwai1727a772013-01-10 09:52:52 +01001202static const struct hda_fixup alc880_fixups[] = {
Takashi Iwai411225a2012-02-20 17:48:19 +01001203 [ALC880_FIXUP_GPIO1] = {
Takashi Iwai5579cd62018-06-19 22:22:41 +02001204 .type = HDA_FIXUP_FUNC,
1205 .v.func = alc_fixup_gpio1,
Takashi Iwai411225a2012-02-20 17:48:19 +01001206 },
Takashi Iwaiee3b2962011-11-15 14:26:54 +01001207 [ALC880_FIXUP_GPIO2] = {
Takashi Iwai5579cd62018-06-19 22:22:41 +02001208 .type = HDA_FIXUP_FUNC,
1209 .v.func = alc_fixup_gpio2,
Takashi Iwaiee3b2962011-11-15 14:26:54 +01001210 },
1211 [ALC880_FIXUP_MEDION_RIM] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001212 .type = HDA_FIXUP_VERBS,
Takashi Iwaiee3b2962011-11-15 14:26:54 +01001213 .v.verbs = (const struct hda_verb[]) {
1214 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1215 { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
1216 { }
1217 },
1218 .chained = true,
1219 .chain_id = ALC880_FIXUP_GPIO2,
1220 },
Takashi Iwaidc6af522012-02-17 16:18:59 +01001221 [ALC880_FIXUP_LG] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001222 .type = HDA_FIXUP_PINS,
1223 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaidc6af522012-02-17 16:18:59 +01001224 /* disable bogus unused pins */
1225 { 0x16, 0x411111f0 },
1226 { 0x18, 0x411111f0 },
1227 { 0x1a, 0x411111f0 },
1228 { }
1229 }
1230 },
Takashi Iwaidb8a38e2013-08-09 12:34:42 +02001231 [ALC880_FIXUP_LG_LW25] = {
1232 .type = HDA_FIXUP_PINS,
1233 .v.pins = (const struct hda_pintbl[]) {
1234 { 0x1a, 0x0181344f }, /* line-in */
1235 { 0x1b, 0x0321403f }, /* headphone */
1236 { }
1237 }
1238 },
Takashi Iwaif02aab52012-02-17 16:33:56 +01001239 [ALC880_FIXUP_W810] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001240 .type = HDA_FIXUP_PINS,
1241 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaif02aab52012-02-17 16:33:56 +01001242 /* disable bogus unused pins */
1243 { 0x17, 0x411111f0 },
1244 { }
1245 },
1246 .chained = true,
1247 .chain_id = ALC880_FIXUP_GPIO2,
1248 },
Takashi Iwai27e917f2012-02-17 17:49:54 +01001249 [ALC880_FIXUP_EAPD_COEF] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001250 .type = HDA_FIXUP_VERBS,
Takashi Iwai27e917f2012-02-17 17:49:54 +01001251 .v.verbs = (const struct hda_verb[]) {
1252 /* change to EAPD mode */
1253 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1254 { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
1255 {}
1256 },
1257 },
Takashi Iwaib9368f52012-02-17 17:54:44 +01001258 [ALC880_FIXUP_TCL_S700] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001259 .type = HDA_FIXUP_VERBS,
Takashi Iwaib9368f52012-02-17 17:54:44 +01001260 .v.verbs = (const struct hda_verb[]) {
1261 /* change to EAPD mode */
1262 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1263 { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
1264 {}
1265 },
1266 .chained = true,
1267 .chain_id = ALC880_FIXUP_GPIO2,
1268 },
Takashi Iwaicf5a2272012-02-20 16:31:07 +01001269 [ALC880_FIXUP_VOL_KNOB] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001270 .type = HDA_FIXUP_FUNC,
Takashi Iwaicf5a2272012-02-20 16:31:07 +01001271 .v.func = alc880_fixup_vol_knob,
1272 },
1273 [ALC880_FIXUP_FUJITSU] = {
1274 /* override all pins as BIOS on old Amilo is broken */
Takashi Iwai1727a772013-01-10 09:52:52 +01001275 .type = HDA_FIXUP_PINS,
1276 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaibb148bd2015-08-13 18:02:39 +02001277 { 0x14, 0x0121401f }, /* HP */
Takashi Iwaicf5a2272012-02-20 16:31:07 +01001278 { 0x15, 0x99030120 }, /* speaker */
1279 { 0x16, 0x99030130 }, /* bass speaker */
1280 { 0x17, 0x411111f0 }, /* N/A */
1281 { 0x18, 0x411111f0 }, /* N/A */
1282 { 0x19, 0x01a19950 }, /* mic-in */
1283 { 0x1a, 0x411111f0 }, /* N/A */
1284 { 0x1b, 0x411111f0 }, /* N/A */
1285 { 0x1c, 0x411111f0 }, /* N/A */
1286 { 0x1d, 0x411111f0 }, /* N/A */
1287 { 0x1e, 0x01454140 }, /* SPDIF out */
1288 { }
1289 },
1290 .chained = true,
1291 .chain_id = ALC880_FIXUP_VOL_KNOB,
1292 },
Takashi Iwaiba533812012-02-20 16:36:52 +01001293 [ALC880_FIXUP_F1734] = {
1294 /* almost compatible with FUJITSU, but no bass and SPDIF */
Takashi Iwai1727a772013-01-10 09:52:52 +01001295 .type = HDA_FIXUP_PINS,
1296 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaibb148bd2015-08-13 18:02:39 +02001297 { 0x14, 0x0121401f }, /* HP */
Takashi Iwaiba533812012-02-20 16:36:52 +01001298 { 0x15, 0x99030120 }, /* speaker */
1299 { 0x16, 0x411111f0 }, /* N/A */
1300 { 0x17, 0x411111f0 }, /* N/A */
1301 { 0x18, 0x411111f0 }, /* N/A */
1302 { 0x19, 0x01a19950 }, /* mic-in */
1303 { 0x1a, 0x411111f0 }, /* N/A */
1304 { 0x1b, 0x411111f0 }, /* N/A */
1305 { 0x1c, 0x411111f0 }, /* N/A */
1306 { 0x1d, 0x411111f0 }, /* N/A */
1307 { 0x1e, 0x411111f0 }, /* N/A */
1308 { }
1309 },
1310 .chained = true,
1311 .chain_id = ALC880_FIXUP_VOL_KNOB,
1312 },
Takashi Iwai817de922012-02-20 17:20:48 +01001313 [ALC880_FIXUP_UNIWILL] = {
1314 /* need to fix HP and speaker pins to be parsed correctly */
Takashi Iwai1727a772013-01-10 09:52:52 +01001315 .type = HDA_FIXUP_PINS,
1316 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai817de922012-02-20 17:20:48 +01001317 { 0x14, 0x0121411f }, /* HP */
1318 { 0x15, 0x99030120 }, /* speaker */
1319 { 0x16, 0x99030130 }, /* bass speaker */
1320 { }
1321 },
1322 },
Takashi Iwai967b88c2012-02-20 17:31:02 +01001323 [ALC880_FIXUP_UNIWILL_DIG] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001324 .type = HDA_FIXUP_PINS,
1325 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai967b88c2012-02-20 17:31:02 +01001326 /* disable bogus unused pins */
1327 { 0x17, 0x411111f0 },
1328 { 0x19, 0x411111f0 },
1329 { 0x1b, 0x411111f0 },
1330 { 0x1f, 0x411111f0 },
1331 { }
1332 }
1333 },
Takashi Iwai96e225f2012-02-20 17:41:51 +01001334 [ALC880_FIXUP_Z71V] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001335 .type = HDA_FIXUP_PINS,
1336 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai96e225f2012-02-20 17:41:51 +01001337 /* set up the whole pins as BIOS is utterly broken */
1338 { 0x14, 0x99030120 }, /* speaker */
1339 { 0x15, 0x0121411f }, /* HP */
1340 { 0x16, 0x411111f0 }, /* N/A */
1341 { 0x17, 0x411111f0 }, /* N/A */
1342 { 0x18, 0x01a19950 }, /* mic-in */
1343 { 0x19, 0x411111f0 }, /* N/A */
1344 { 0x1a, 0x01813031 }, /* line-in */
1345 { 0x1b, 0x411111f0 }, /* N/A */
1346 { 0x1c, 0x411111f0 }, /* N/A */
1347 { 0x1d, 0x411111f0 }, /* N/A */
1348 { 0x1e, 0x0144111e }, /* SPDIF */
1349 { }
1350 }
1351 },
Takashi Iwai487a5882013-11-07 07:29:30 +01001352 [ALC880_FIXUP_ASUS_W5A] = {
1353 .type = HDA_FIXUP_PINS,
1354 .v.pins = (const struct hda_pintbl[]) {
1355 /* set up the whole pins as BIOS is utterly broken */
1356 { 0x14, 0x0121411f }, /* HP */
1357 { 0x15, 0x411111f0 }, /* N/A */
1358 { 0x16, 0x411111f0 }, /* N/A */
1359 { 0x17, 0x411111f0 }, /* N/A */
1360 { 0x18, 0x90a60160 }, /* mic */
1361 { 0x19, 0x411111f0 }, /* N/A */
1362 { 0x1a, 0x411111f0 }, /* N/A */
1363 { 0x1b, 0x411111f0 }, /* N/A */
1364 { 0x1c, 0x411111f0 }, /* N/A */
1365 { 0x1d, 0x411111f0 }, /* N/A */
1366 { 0x1e, 0xb743111e }, /* SPDIF out */
1367 { }
1368 },
1369 .chained = true,
1370 .chain_id = ALC880_FIXUP_GPIO1,
1371 },
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001372 [ALC880_FIXUP_3ST_BASE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001373 .type = HDA_FIXUP_PINS,
1374 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001375 { 0x14, 0x01014010 }, /* line-out */
1376 { 0x15, 0x411111f0 }, /* N/A */
1377 { 0x16, 0x411111f0 }, /* N/A */
1378 { 0x17, 0x411111f0 }, /* N/A */
1379 { 0x18, 0x01a19c30 }, /* mic-in */
1380 { 0x19, 0x0121411f }, /* HP */
1381 { 0x1a, 0x01813031 }, /* line-in */
1382 { 0x1b, 0x02a19c40 }, /* front-mic */
1383 { 0x1c, 0x411111f0 }, /* N/A */
1384 { 0x1d, 0x411111f0 }, /* N/A */
1385 /* 0x1e is filled in below */
1386 { 0x1f, 0x411111f0 }, /* N/A */
1387 { }
1388 }
1389 },
1390 [ALC880_FIXUP_3ST] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001391 .type = HDA_FIXUP_PINS,
1392 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001393 { 0x1e, 0x411111f0 }, /* N/A */
1394 { }
1395 },
1396 .chained = true,
1397 .chain_id = ALC880_FIXUP_3ST_BASE,
1398 },
1399 [ALC880_FIXUP_3ST_DIG] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001400 .type = HDA_FIXUP_PINS,
1401 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001402 { 0x1e, 0x0144111e }, /* SPDIF */
1403 { }
1404 },
1405 .chained = true,
1406 .chain_id = ALC880_FIXUP_3ST_BASE,
1407 },
1408 [ALC880_FIXUP_5ST_BASE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001409 .type = HDA_FIXUP_PINS,
1410 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001411 { 0x14, 0x01014010 }, /* front */
1412 { 0x15, 0x411111f0 }, /* N/A */
1413 { 0x16, 0x01011411 }, /* CLFE */
1414 { 0x17, 0x01016412 }, /* surr */
1415 { 0x18, 0x01a19c30 }, /* mic-in */
1416 { 0x19, 0x0121411f }, /* HP */
1417 { 0x1a, 0x01813031 }, /* line-in */
1418 { 0x1b, 0x02a19c40 }, /* front-mic */
1419 { 0x1c, 0x411111f0 }, /* N/A */
1420 { 0x1d, 0x411111f0 }, /* N/A */
1421 /* 0x1e is filled in below */
1422 { 0x1f, 0x411111f0 }, /* N/A */
1423 { }
1424 }
1425 },
1426 [ALC880_FIXUP_5ST] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001427 .type = HDA_FIXUP_PINS,
1428 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001429 { 0x1e, 0x411111f0 }, /* N/A */
1430 { }
1431 },
1432 .chained = true,
1433 .chain_id = ALC880_FIXUP_5ST_BASE,
1434 },
1435 [ALC880_FIXUP_5ST_DIG] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001436 .type = HDA_FIXUP_PINS,
1437 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001438 { 0x1e, 0x0144111e }, /* SPDIF */
1439 { }
1440 },
1441 .chained = true,
1442 .chain_id = ALC880_FIXUP_5ST_BASE,
1443 },
1444 [ALC880_FIXUP_6ST_BASE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001445 .type = HDA_FIXUP_PINS,
1446 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001447 { 0x14, 0x01014010 }, /* front */
1448 { 0x15, 0x01016412 }, /* surr */
1449 { 0x16, 0x01011411 }, /* CLFE */
1450 { 0x17, 0x01012414 }, /* side */
1451 { 0x18, 0x01a19c30 }, /* mic-in */
1452 { 0x19, 0x02a19c40 }, /* front-mic */
1453 { 0x1a, 0x01813031 }, /* line-in */
1454 { 0x1b, 0x0121411f }, /* HP */
1455 { 0x1c, 0x411111f0 }, /* N/A */
1456 { 0x1d, 0x411111f0 }, /* N/A */
1457 /* 0x1e is filled in below */
1458 { 0x1f, 0x411111f0 }, /* N/A */
1459 { }
1460 }
1461 },
1462 [ALC880_FIXUP_6ST] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001463 .type = HDA_FIXUP_PINS,
1464 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001465 { 0x1e, 0x411111f0 }, /* N/A */
1466 { }
1467 },
1468 .chained = true,
1469 .chain_id = ALC880_FIXUP_6ST_BASE,
1470 },
1471 [ALC880_FIXUP_6ST_DIG] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001472 .type = HDA_FIXUP_PINS,
1473 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001474 { 0x1e, 0x0144111e }, /* SPDIF */
1475 { }
1476 },
1477 .chained = true,
1478 .chain_id = ALC880_FIXUP_6ST_BASE,
1479 },
Takashi Iwai53971452013-01-23 18:21:37 +01001480 [ALC880_FIXUP_6ST_AUTOMUTE] = {
1481 .type = HDA_FIXUP_PINS,
1482 .v.pins = (const struct hda_pintbl[]) {
1483 { 0x1b, 0x0121401f }, /* HP with jack detect */
1484 { }
1485 },
1486 .chained_before = true,
1487 .chain_id = ALC880_FIXUP_6ST_BASE,
1488 },
Takashi Iwaiee3b2962011-11-15 14:26:54 +01001489};
1490
1491static const struct snd_pci_quirk alc880_fixup_tbl[] = {
Takashi Iwaif02aab52012-02-17 16:33:56 +01001492 SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_FIXUP_W810),
Takashi Iwai487a5882013-11-07 07:29:30 +01001493 SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS W5A", ALC880_FIXUP_ASUS_W5A),
Takashi Iwai96e225f2012-02-20 17:41:51 +01001494 SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_FIXUP_Z71V),
Takashi Iwai29e3fdc2012-02-20 17:56:57 +01001495 SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_FIXUP_GPIO1),
David Henningsson6538de02014-06-10 10:52:50 +02001496 SND_PCI_QUIRK(0x147b, 0x1045, "ABit AA8XE", ALC880_FIXUP_6ST_AUTOMUTE),
Takashi Iwai29e3fdc2012-02-20 17:56:57 +01001497 SND_PCI_QUIRK(0x1558, 0x5401, "Clevo GPIO2", ALC880_FIXUP_GPIO2),
Takashi Iwai27e917f2012-02-17 17:49:54 +01001498 SND_PCI_QUIRK_VENDOR(0x1558, "Clevo", ALC880_FIXUP_EAPD_COEF),
Takashi Iwai967b88c2012-02-20 17:31:02 +01001499 SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_FIXUP_UNIWILL_DIG),
Takashi Iwaiba533812012-02-20 16:36:52 +01001500 SND_PCI_QUIRK(0x1584, 0x9054, "Uniwill", ALC880_FIXUP_F1734),
Takashi Iwai817de922012-02-20 17:20:48 +01001501 SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_FIXUP_UNIWILL),
Takashi Iwai7833c7e2012-02-20 17:11:38 +01001502 SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_FIXUP_VOL_KNOB),
Takashi Iwaif02aab52012-02-17 16:33:56 +01001503 SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_FIXUP_W810),
Takashi Iwaiee3b2962011-11-15 14:26:54 +01001504 SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_FIXUP_MEDION_RIM),
Takashi Iwai53971452013-01-23 18:21:37 +01001505 SND_PCI_QUIRK(0x1631, 0xe011, "PB 13201056", ALC880_FIXUP_6ST_AUTOMUTE),
Takashi Iwaia1615742015-08-13 18:05:06 +02001506 SND_PCI_QUIRK(0x1734, 0x107c, "FSC Amilo M1437", ALC880_FIXUP_FUJITSU),
Takashi Iwaicf5a2272012-02-20 16:31:07 +01001507 SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FIXUP_FUJITSU),
Takashi Iwaiba533812012-02-20 16:36:52 +01001508 SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_FIXUP_F1734),
Takashi Iwaicf5a2272012-02-20 16:31:07 +01001509 SND_PCI_QUIRK(0x1734, 0x10b0, "FSC Amilo Pi1556", ALC880_FIXUP_FUJITSU),
Takashi Iwaidc6af522012-02-17 16:18:59 +01001510 SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_FIXUP_LG),
1511 SND_PCI_QUIRK(0x1854, 0x005f, "LG P1 Express", ALC880_FIXUP_LG),
1512 SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_FIXUP_LG),
Takashi Iwaidb8a38e2013-08-09 12:34:42 +02001513 SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_FIXUP_LG_LW25),
Takashi Iwaib9368f52012-02-17 17:54:44 +01001514 SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_FIXUP_TCL_S700),
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001515
1516 /* Below is the copied entries from alc880_quirks.c.
1517 * It's not quite sure whether BIOS sets the correct pin-config table
1518 * on these machines, thus they are kept to be compatible with
1519 * the old static quirks. Once when it's confirmed to work without
1520 * these overrides, it'd be better to remove.
1521 */
1522 SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_FIXUP_5ST_DIG),
1523 SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_FIXUP_6ST),
1524 SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_FIXUP_3ST_DIG),
1525 SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_FIXUP_6ST_DIG),
1526 SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_FIXUP_6ST_DIG),
1527 SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_FIXUP_6ST_DIG),
1528 SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_FIXUP_3ST_DIG),
1529 SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_FIXUP_3ST),
1530 SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_FIXUP_6ST_DIG),
1531 SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_FIXUP_3ST),
1532 SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_FIXUP_3ST),
1533 SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_FIXUP_5ST),
1534 SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_FIXUP_5ST),
1535 SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_FIXUP_5ST),
1536 SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_FIXUP_6ST_DIG),
1537 SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_FIXUP_6ST_DIG),
1538 SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_FIXUP_6ST_DIG),
1539 SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_FIXUP_6ST_DIG),
1540 SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_FIXUP_5ST_DIG),
1541 SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_FIXUP_5ST_DIG),
1542 SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_FIXUP_5ST_DIG),
1543 SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_FIXUP_6ST_DIG), /* broken BIOS */
1544 SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_FIXUP_6ST_DIG),
1545 SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1546 SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1547 SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1548 SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1549 SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1550 SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1551 SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1552 SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1553 SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1554 SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1555 /* default Intel */
1556 SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_FIXUP_3ST),
1557 SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_FIXUP_5ST_DIG),
1558 SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_FIXUP_6ST_DIG),
1559 {}
1560};
1561
Takashi Iwai1727a772013-01-10 09:52:52 +01001562static const struct hda_model_fixup alc880_fixup_models[] = {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001563 {.id = ALC880_FIXUP_3ST, .name = "3stack"},
1564 {.id = ALC880_FIXUP_3ST_DIG, .name = "3stack-digout"},
1565 {.id = ALC880_FIXUP_5ST, .name = "5stack"},
1566 {.id = ALC880_FIXUP_5ST_DIG, .name = "5stack-digout"},
1567 {.id = ALC880_FIXUP_6ST, .name = "6stack"},
1568 {.id = ALC880_FIXUP_6ST_DIG, .name = "6stack-digout"},
Takashi Iwai53971452013-01-23 18:21:37 +01001569 {.id = ALC880_FIXUP_6ST_AUTOMUTE, .name = "6stack-automute"},
Takashi Iwaiee3b2962011-11-15 14:26:54 +01001570 {}
1571};
1572
1573
1574/*
Takashi Iwai1d045db2011-07-07 18:23:21 +02001575 * OK, here we have finally the patch for ALC880
1576 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02001577static int patch_alc880(struct hda_codec *codec)
1578{
1579 struct alc_spec *spec;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001580 int err;
1581
Takashi Iwai3de95172012-05-07 18:03:15 +02001582 err = alc_alloc_spec(codec, 0x0b);
1583 if (err < 0)
1584 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001585
Takashi Iwai3de95172012-05-07 18:03:15 +02001586 spec = codec->spec;
Takashi Iwai08c189f2012-12-19 15:22:24 +01001587 spec->gen.need_dac_fix = 1;
Takashi Iwai7504b6c2013-03-18 11:25:51 +01001588 spec->gen.beep_nid = 0x01;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001589
Takashi Iwai225068a2015-05-29 10:42:14 +02001590 codec->patch_ops.unsol_event = alc880_unsol_event;
1591
Takashi Iwaic9af7532019-05-10 11:01:43 +02001592 alc_pre_init(codec);
1593
Takashi Iwai1727a772013-01-10 09:52:52 +01001594 snd_hda_pick_fixup(codec, alc880_fixup_models, alc880_fixup_tbl,
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001595 alc880_fixups);
Takashi Iwai1727a772013-01-10 09:52:52 +01001596 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai1d045db2011-07-07 18:23:21 +02001597
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001598 /* automatic parse from the BIOS config */
1599 err = alc880_parse_auto_config(codec);
1600 if (err < 0)
1601 goto error;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001602
Takashi Iwaifea80fa2018-06-20 12:52:46 +02001603 if (!spec->gen.no_analog) {
1604 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
1605 if (err < 0)
1606 goto error;
1607 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02001608
Takashi Iwai1727a772013-01-10 09:52:52 +01001609 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01001610
Takashi Iwai1d045db2011-07-07 18:23:21 +02001611 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02001612
1613 error:
1614 alc_free(codec);
1615 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001616}
1617
1618
1619/*
1620 * ALC260 support
1621 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02001622static int alc260_parse_auto_config(struct hda_codec *codec)
1623{
Takashi Iwai1d045db2011-07-07 18:23:21 +02001624 static const hda_nid_t alc260_ignore[] = { 0x17, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02001625 static const hda_nid_t alc260_ssids[] = { 0x10, 0x15, 0x0f, 0 };
1626 return alc_parse_auto_config(codec, alc260_ignore, alc260_ssids);
Takashi Iwai1d045db2011-07-07 18:23:21 +02001627}
1628
Takashi Iwai1d045db2011-07-07 18:23:21 +02001629/*
1630 * Pin config fixes
1631 */
1632enum {
Takashi Iwaica8f0422012-02-16 11:51:19 +01001633 ALC260_FIXUP_HP_DC5750,
1634 ALC260_FIXUP_HP_PIN_0F,
1635 ALC260_FIXUP_COEF,
Takashi Iwai15317ab2012-02-16 12:02:53 +01001636 ALC260_FIXUP_GPIO1,
Takashi Iwai20f7d922012-02-16 12:35:16 +01001637 ALC260_FIXUP_GPIO1_TOGGLE,
1638 ALC260_FIXUP_REPLACER,
Takashi Iwai0a1c4fa2012-02-16 12:42:30 +01001639 ALC260_FIXUP_HP_B1900,
Takashi Iwai118cb4a2012-04-19 07:33:27 +02001640 ALC260_FIXUP_KN1,
Takashi Iwai39aedee2013-01-10 17:10:40 +01001641 ALC260_FIXUP_FSC_S7020,
Takashi Iwai5ebd3bb2013-02-19 18:23:31 +01001642 ALC260_FIXUP_FSC_S7020_JWSE,
Takashi Iwaid08c5ef2013-11-22 08:06:36 +01001643 ALC260_FIXUP_VAIO_PINS,
Takashi Iwai1d045db2011-07-07 18:23:21 +02001644};
1645
Takashi Iwai20f7d922012-02-16 12:35:16 +01001646static void alc260_gpio1_automute(struct hda_codec *codec)
1647{
1648 struct alc_spec *spec = codec->spec;
Takashi Iwaiaaf312d2018-06-19 22:28:22 +02001649
1650 alc_update_gpio_data(codec, 0x01, spec->gen.hp_jack_present);
Takashi Iwai20f7d922012-02-16 12:35:16 +01001651}
1652
1653static void alc260_fixup_gpio1_toggle(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01001654 const struct hda_fixup *fix, int action)
Takashi Iwai20f7d922012-02-16 12:35:16 +01001655{
1656 struct alc_spec *spec = codec->spec;
Takashi Iwai1727a772013-01-10 09:52:52 +01001657 if (action == HDA_FIXUP_ACT_PROBE) {
Takashi Iwai20f7d922012-02-16 12:35:16 +01001658 /* although the machine has only one output pin, we need to
1659 * toggle GPIO1 according to the jack state
1660 */
Takashi Iwai08c189f2012-12-19 15:22:24 +01001661 spec->gen.automute_hook = alc260_gpio1_automute;
1662 spec->gen.detect_hp = 1;
1663 spec->gen.automute_speaker = 1;
1664 spec->gen.autocfg.hp_pins[0] = 0x0f; /* copy it for automute */
Takashi Iwai62f949b2014-09-11 14:06:53 +02001665 snd_hda_jack_detect_enable_callback(codec, 0x0f,
Takashi Iwai08c189f2012-12-19 15:22:24 +01001666 snd_hda_gen_hp_automute);
Takashi Iwai5579cd62018-06-19 22:22:41 +02001667 alc_setup_gpio(codec, 0x01);
Takashi Iwai20f7d922012-02-16 12:35:16 +01001668 }
1669}
1670
Takashi Iwai118cb4a2012-04-19 07:33:27 +02001671static void alc260_fixup_kn1(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01001672 const struct hda_fixup *fix, int action)
Takashi Iwai118cb4a2012-04-19 07:33:27 +02001673{
1674 struct alc_spec *spec = codec->spec;
Takashi Iwai1727a772013-01-10 09:52:52 +01001675 static const struct hda_pintbl pincfgs[] = {
Takashi Iwai118cb4a2012-04-19 07:33:27 +02001676 { 0x0f, 0x02214000 }, /* HP/speaker */
1677 { 0x12, 0x90a60160 }, /* int mic */
1678 { 0x13, 0x02a19000 }, /* ext mic */
1679 { 0x18, 0x01446000 }, /* SPDIF out */
1680 /* disable bogus I/O pins */
1681 { 0x10, 0x411111f0 },
1682 { 0x11, 0x411111f0 },
1683 { 0x14, 0x411111f0 },
1684 { 0x15, 0x411111f0 },
1685 { 0x16, 0x411111f0 },
1686 { 0x17, 0x411111f0 },
1687 { 0x19, 0x411111f0 },
1688 { }
1689 };
1690
1691 switch (action) {
Takashi Iwai1727a772013-01-10 09:52:52 +01001692 case HDA_FIXUP_ACT_PRE_PROBE:
1693 snd_hda_apply_pincfgs(codec, pincfgs);
Takashi Iwai118cb4a2012-04-19 07:33:27 +02001694 spec->init_amp = ALC_INIT_NONE;
1695 break;
1696 }
1697}
1698
Takashi Iwai39aedee2013-01-10 17:10:40 +01001699static void alc260_fixup_fsc_s7020(struct hda_codec *codec,
1700 const struct hda_fixup *fix, int action)
1701{
1702 struct alc_spec *spec = codec->spec;
Takashi Iwai1c76aa52018-06-21 16:37:54 +02001703 if (action == HDA_FIXUP_ACT_PRE_PROBE)
Takashi Iwaie6e0ee52013-02-18 17:04:20 +01001704 spec->init_amp = ALC_INIT_NONE;
Takashi Iwai5ebd3bb2013-02-19 18:23:31 +01001705}
1706
1707static void alc260_fixup_fsc_s7020_jwse(struct hda_codec *codec,
1708 const struct hda_fixup *fix, int action)
1709{
1710 struct alc_spec *spec = codec->spec;
1711 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwaif811c3c2013-03-07 18:32:59 +01001712 spec->gen.add_jack_modes = 1;
Takashi Iwai5ebd3bb2013-02-19 18:23:31 +01001713 spec->gen.hp_mic = 1;
Takashi Iwaie6e0ee52013-02-18 17:04:20 +01001714 }
Takashi Iwai39aedee2013-01-10 17:10:40 +01001715}
1716
Takashi Iwai1727a772013-01-10 09:52:52 +01001717static const struct hda_fixup alc260_fixups[] = {
Takashi Iwaica8f0422012-02-16 11:51:19 +01001718 [ALC260_FIXUP_HP_DC5750] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001719 .type = HDA_FIXUP_PINS,
1720 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02001721 { 0x11, 0x90130110 }, /* speaker */
1722 { }
1723 }
1724 },
Takashi Iwaica8f0422012-02-16 11:51:19 +01001725 [ALC260_FIXUP_HP_PIN_0F] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001726 .type = HDA_FIXUP_PINS,
1727 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaica8f0422012-02-16 11:51:19 +01001728 { 0x0f, 0x01214000 }, /* HP */
1729 { }
1730 }
1731 },
1732 [ALC260_FIXUP_COEF] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001733 .type = HDA_FIXUP_VERBS,
Takashi Iwaica8f0422012-02-16 11:51:19 +01001734 .v.verbs = (const struct hda_verb[]) {
Ronan Marquete30cf2d2014-06-01 18:38:53 +02001735 { 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1736 { 0x1a, AC_VERB_SET_PROC_COEF, 0x3040 },
Takashi Iwaica8f0422012-02-16 11:51:19 +01001737 { }
1738 },
Takashi Iwaica8f0422012-02-16 11:51:19 +01001739 },
Takashi Iwai15317ab2012-02-16 12:02:53 +01001740 [ALC260_FIXUP_GPIO1] = {
Takashi Iwai5579cd62018-06-19 22:22:41 +02001741 .type = HDA_FIXUP_FUNC,
1742 .v.func = alc_fixup_gpio1,
Takashi Iwai15317ab2012-02-16 12:02:53 +01001743 },
Takashi Iwai20f7d922012-02-16 12:35:16 +01001744 [ALC260_FIXUP_GPIO1_TOGGLE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001745 .type = HDA_FIXUP_FUNC,
Takashi Iwai20f7d922012-02-16 12:35:16 +01001746 .v.func = alc260_fixup_gpio1_toggle,
1747 .chained = true,
1748 .chain_id = ALC260_FIXUP_HP_PIN_0F,
1749 },
1750 [ALC260_FIXUP_REPLACER] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001751 .type = HDA_FIXUP_VERBS,
Takashi Iwai20f7d922012-02-16 12:35:16 +01001752 .v.verbs = (const struct hda_verb[]) {
Takashi Iwai192a98e2014-06-02 15:16:07 +02001753 { 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1754 { 0x1a, AC_VERB_SET_PROC_COEF, 0x3050 },
Takashi Iwai20f7d922012-02-16 12:35:16 +01001755 { }
1756 },
1757 .chained = true,
1758 .chain_id = ALC260_FIXUP_GPIO1_TOGGLE,
1759 },
Takashi Iwai0a1c4fa2012-02-16 12:42:30 +01001760 [ALC260_FIXUP_HP_B1900] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001761 .type = HDA_FIXUP_FUNC,
Takashi Iwai0a1c4fa2012-02-16 12:42:30 +01001762 .v.func = alc260_fixup_gpio1_toggle,
1763 .chained = true,
1764 .chain_id = ALC260_FIXUP_COEF,
Takashi Iwai118cb4a2012-04-19 07:33:27 +02001765 },
1766 [ALC260_FIXUP_KN1] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001767 .type = HDA_FIXUP_FUNC,
Takashi Iwai118cb4a2012-04-19 07:33:27 +02001768 .v.func = alc260_fixup_kn1,
1769 },
Takashi Iwai39aedee2013-01-10 17:10:40 +01001770 [ALC260_FIXUP_FSC_S7020] = {
1771 .type = HDA_FIXUP_FUNC,
1772 .v.func = alc260_fixup_fsc_s7020,
1773 },
Takashi Iwai5ebd3bb2013-02-19 18:23:31 +01001774 [ALC260_FIXUP_FSC_S7020_JWSE] = {
1775 .type = HDA_FIXUP_FUNC,
1776 .v.func = alc260_fixup_fsc_s7020_jwse,
1777 .chained = true,
1778 .chain_id = ALC260_FIXUP_FSC_S7020,
1779 },
Takashi Iwaid08c5ef2013-11-22 08:06:36 +01001780 [ALC260_FIXUP_VAIO_PINS] = {
1781 .type = HDA_FIXUP_PINS,
1782 .v.pins = (const struct hda_pintbl[]) {
1783 /* Pin configs are missing completely on some VAIOs */
1784 { 0x0f, 0x01211020 },
1785 { 0x10, 0x0001003f },
1786 { 0x11, 0x411111f0 },
1787 { 0x12, 0x01a15930 },
1788 { 0x13, 0x411111f0 },
1789 { 0x14, 0x411111f0 },
1790 { 0x15, 0x411111f0 },
1791 { 0x16, 0x411111f0 },
1792 { 0x17, 0x411111f0 },
1793 { 0x18, 0x411111f0 },
1794 { 0x19, 0x411111f0 },
1795 { }
1796 }
1797 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02001798};
1799
1800static const struct snd_pci_quirk alc260_fixup_tbl[] = {
Takashi Iwai15317ab2012-02-16 12:02:53 +01001801 SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_FIXUP_GPIO1),
Takashi Iwaica8f0422012-02-16 11:51:19 +01001802 SND_PCI_QUIRK(0x1025, 0x007f, "Acer Aspire 9500", ALC260_FIXUP_COEF),
Takashi Iwai15317ab2012-02-16 12:02:53 +01001803 SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_FIXUP_GPIO1),
Takashi Iwaica8f0422012-02-16 11:51:19 +01001804 SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", ALC260_FIXUP_HP_DC5750),
Takashi Iwai0a1c4fa2012-02-16 12:42:30 +01001805 SND_PCI_QUIRK(0x103c, 0x30ba, "HP Presario B1900", ALC260_FIXUP_HP_B1900),
Takashi Iwaid08c5ef2013-11-22 08:06:36 +01001806 SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_FIXUP_VAIO_PINS),
Takashi Iwai0f5a5b82013-11-21 09:12:52 +01001807 SND_PCI_QUIRK(0x104d, 0x81e2, "Sony VAIO TX", ALC260_FIXUP_HP_PIN_0F),
Takashi Iwai39aedee2013-01-10 17:10:40 +01001808 SND_PCI_QUIRK(0x10cf, 0x1326, "FSC LifeBook S7020", ALC260_FIXUP_FSC_S7020),
Takashi Iwaib1f58082012-02-16 12:45:03 +01001809 SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FIXUP_GPIO1),
Takashi Iwai118cb4a2012-04-19 07:33:27 +02001810 SND_PCI_QUIRK(0x152d, 0x0729, "Quanta KN1", ALC260_FIXUP_KN1),
Takashi Iwai20f7d922012-02-16 12:35:16 +01001811 SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_FIXUP_REPLACER),
Takashi Iwaica8f0422012-02-16 11:51:19 +01001812 SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_FIXUP_COEF),
Takashi Iwai1d045db2011-07-07 18:23:21 +02001813 {}
1814};
1815
Takashi Iwai5ebd3bb2013-02-19 18:23:31 +01001816static const struct hda_model_fixup alc260_fixup_models[] = {
1817 {.id = ALC260_FIXUP_GPIO1, .name = "gpio1"},
1818 {.id = ALC260_FIXUP_COEF, .name = "coef"},
1819 {.id = ALC260_FIXUP_FSC_S7020, .name = "fujitsu"},
1820 {.id = ALC260_FIXUP_FSC_S7020_JWSE, .name = "fujitsu-jwse"},
1821 {}
1822};
1823
Takashi Iwai1d045db2011-07-07 18:23:21 +02001824/*
1825 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02001826static int patch_alc260(struct hda_codec *codec)
1827{
1828 struct alc_spec *spec;
Takashi Iwaic3c2c9e2012-02-16 12:59:55 +01001829 int err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001830
Takashi Iwai3de95172012-05-07 18:03:15 +02001831 err = alc_alloc_spec(codec, 0x07);
1832 if (err < 0)
1833 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001834
Takashi Iwai3de95172012-05-07 18:03:15 +02001835 spec = codec->spec;
Takashi Iwaiea46c3c2013-01-15 18:45:53 +01001836 /* as quite a few machines require HP amp for speaker outputs,
1837 * it's easier to enable it unconditionally; even if it's unneeded,
1838 * it's almost harmless.
1839 */
1840 spec->gen.prefer_hp_amp = 1;
Takashi Iwai7504b6c2013-03-18 11:25:51 +01001841 spec->gen.beep_nid = 0x01;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001842
Takashi Iwai225068a2015-05-29 10:42:14 +02001843 spec->shutup = alc_eapd_shutup;
1844
Takashi Iwaic9af7532019-05-10 11:01:43 +02001845 alc_pre_init(codec);
1846
Takashi Iwai5ebd3bb2013-02-19 18:23:31 +01001847 snd_hda_pick_fixup(codec, alc260_fixup_models, alc260_fixup_tbl,
1848 alc260_fixups);
Takashi Iwai1727a772013-01-10 09:52:52 +01001849 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai1d045db2011-07-07 18:23:21 +02001850
Takashi Iwaic3c2c9e2012-02-16 12:59:55 +01001851 /* automatic parse from the BIOS config */
1852 err = alc260_parse_auto_config(codec);
1853 if (err < 0)
1854 goto error;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001855
Takashi Iwaifea80fa2018-06-20 12:52:46 +02001856 if (!spec->gen.no_analog) {
1857 err = set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
1858 if (err < 0)
1859 goto error;
1860 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02001861
Takashi Iwai1727a772013-01-10 09:52:52 +01001862 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01001863
Takashi Iwai1d045db2011-07-07 18:23:21 +02001864 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02001865
1866 error:
1867 alc_free(codec);
1868 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001869}
1870
1871
1872/*
1873 * ALC882/883/885/888/889 support
1874 *
1875 * ALC882 is almost identical with ALC880 but has cleaner and more flexible
1876 * configuration. Each pin widget can choose any input DACs and a mixer.
1877 * Each ADC is connected from a mixer of all inputs. This makes possible
1878 * 6-channel independent captures.
1879 *
1880 * In addition, an independent DAC for the multi-playback (not used in this
1881 * driver yet).
1882 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02001883
1884/*
1885 * Pin config fixes
1886 */
1887enum {
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01001888 ALC882_FIXUP_ABIT_AW9D_MAX,
1889 ALC882_FIXUP_LENOVO_Y530,
1890 ALC882_FIXUP_PB_M5210,
1891 ALC882_FIXUP_ACER_ASPIRE_7736,
1892 ALC882_FIXUP_ASUS_W90V,
Marton Balint8f239212012-03-05 21:33:23 +01001893 ALC889_FIXUP_CD,
David Henningssonb2c53e22014-01-01 14:01:34 +01001894 ALC889_FIXUP_FRONT_HP_NO_PRESENCE,
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01001895 ALC889_FIXUP_VAIO_TT,
Takashi Iwai0e7cc2e2011-11-09 12:42:48 +01001896 ALC888_FIXUP_EEE1601,
Takashi Iwai177943a32011-11-09 12:55:18 +01001897 ALC882_FIXUP_EAPD,
Takashi Iwai7a6069b2011-11-09 15:22:01 +01001898 ALC883_FIXUP_EAPD,
Takashi Iwai8812c4f2011-11-09 17:39:15 +01001899 ALC883_FIXUP_ACER_EAPD,
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001900 ALC882_FIXUP_GPIO1,
1901 ALC882_FIXUP_GPIO2,
Takashi Iwaieb844d52011-11-09 18:03:07 +01001902 ALC882_FIXUP_GPIO3,
Takashi Iwai68ef0562011-11-09 18:24:44 +01001903 ALC889_FIXUP_COEF,
1904 ALC882_FIXUP_ASUS_W2JC,
Takashi Iwaic3e837b2011-11-10 16:01:47 +01001905 ALC882_FIXUP_ACER_ASPIRE_4930G,
1906 ALC882_FIXUP_ACER_ASPIRE_8930G,
1907 ALC882_FIXUP_ASPIRE_8930G_VERBS,
Takashi Iwai56710872011-11-14 17:42:11 +01001908 ALC885_FIXUP_MACPRO_GPIO,
Takashi Iwai02a237b2012-02-13 15:25:07 +01001909 ALC889_FIXUP_DAC_ROUTE,
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001910 ALC889_FIXUP_MBP_VREF,
1911 ALC889_FIXUP_IMAC91_VREF,
Adrien Vergée7729a42014-01-24 14:56:14 -05001912 ALC889_FIXUP_MBA11_VREF,
Takashi Iwai0756f092013-12-04 13:59:45 +01001913 ALC889_FIXUP_MBA21_VREF,
Takashi Iwaic20f31e2014-02-03 11:02:10 +01001914 ALC889_FIXUP_MP11_VREF,
Mario Kleiner9f660a12015-12-22 00:45:43 +01001915 ALC889_FIXUP_MP41_VREF,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02001916 ALC882_FIXUP_INV_DMIC,
Takashi Iwaie427c232012-07-29 10:04:08 +02001917 ALC882_FIXUP_NO_PRIMARY_HP,
Takashi Iwai1f0bbf02013-11-28 15:21:21 +01001918 ALC887_FIXUP_ASUS_BASS,
Takashi Iwaieb9ca3a2013-11-28 15:24:34 +01001919 ALC887_FIXUP_BASS_CHMAP,
Takashi Iwai7beb3a62017-04-10 18:05:52 +02001920 ALC1220_FIXUP_GB_DUAL_CODECS,
Peisen0202f5c2017-10-26 10:35:36 +08001921 ALC1220_FIXUP_CLEVO_P950,
Richard Sailer80690a22019-04-02 15:52:04 +02001922 ALC1220_FIXUP_CLEVO_PB51ED,
1923 ALC1220_FIXUP_CLEVO_PB51ED_PINS,
Takashi Iwai1d045db2011-07-07 18:23:21 +02001924};
1925
Takashi Iwai68ef0562011-11-09 18:24:44 +01001926static void alc889_fixup_coef(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01001927 const struct hda_fixup *fix, int action)
Takashi Iwai68ef0562011-11-09 18:24:44 +01001928{
Takashi Iwai1727a772013-01-10 09:52:52 +01001929 if (action != HDA_FIXUP_ACT_INIT)
Takashi Iwai68ef0562011-11-09 18:24:44 +01001930 return;
Kailang Yang1df88742014-10-29 16:10:13 +08001931 alc_update_coef_idx(codec, 7, 0, 0x2030);
Takashi Iwai68ef0562011-11-09 18:24:44 +01001932}
1933
Takashi Iwai56710872011-11-14 17:42:11 +01001934/* set up GPIO at initialization */
1935static void alc885_fixup_macpro_gpio(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01001936 const struct hda_fixup *fix, int action)
Takashi Iwai56710872011-11-14 17:42:11 +01001937{
Takashi Iwai215c8502018-06-19 22:34:26 +02001938 struct alc_spec *spec = codec->spec;
1939
1940 spec->gpio_write_delay = true;
1941 alc_fixup_gpio3(codec, fix, action);
Takashi Iwai56710872011-11-14 17:42:11 +01001942}
1943
Takashi Iwai02a237b2012-02-13 15:25:07 +01001944/* Fix the connection of some pins for ALC889:
1945 * At least, Acer Aspire 5935 shows the connections to DAC3/4 don't
1946 * work correctly (bko#42740)
1947 */
1948static void alc889_fixup_dac_route(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01001949 const struct hda_fixup *fix, int action)
Takashi Iwai02a237b2012-02-13 15:25:07 +01001950{
Takashi Iwai1727a772013-01-10 09:52:52 +01001951 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwaief8d60f2012-02-17 10:12:38 +01001952 /* fake the connections during parsing the tree */
Michał Mirosławcaf3c042020-01-03 10:23:48 +01001953 static const hda_nid_t conn1[] = { 0x0c, 0x0d };
1954 static const hda_nid_t conn2[] = { 0x0e, 0x0f };
1955 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
1956 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
1957 snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn2), conn2);
1958 snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn2), conn2);
Takashi Iwai1727a772013-01-10 09:52:52 +01001959 } else if (action == HDA_FIXUP_ACT_PROBE) {
Takashi Iwaief8d60f2012-02-17 10:12:38 +01001960 /* restore the connections */
Michał Mirosławcaf3c042020-01-03 10:23:48 +01001961 static const hda_nid_t conn[] = { 0x0c, 0x0d, 0x0e, 0x0f, 0x26 };
1962 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
1963 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn), conn);
1964 snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn), conn);
1965 snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn), conn);
Takashi Iwai02a237b2012-02-13 15:25:07 +01001966 }
1967}
1968
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001969/* Set VREF on HP pin */
1970static void alc889_fixup_mbp_vref(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01001971 const struct hda_fixup *fix, int action)
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001972{
Michał Mirosławcaf3c042020-01-03 10:23:48 +01001973 static const hda_nid_t nids[] = { 0x14, 0x15, 0x19 };
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001974 struct alc_spec *spec = codec->spec;
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001975 int i;
1976
Takashi Iwai1727a772013-01-10 09:52:52 +01001977 if (action != HDA_FIXUP_ACT_INIT)
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001978 return;
1979 for (i = 0; i < ARRAY_SIZE(nids); i++) {
1980 unsigned int val = snd_hda_codec_get_pincfg(codec, nids[i]);
1981 if (get_defcfg_device(val) != AC_JACK_HP_OUT)
1982 continue;
Takashi Iwaid3f02d62013-01-10 10:12:22 +01001983 val = snd_hda_codec_get_pin_target(codec, nids[i]);
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001984 val |= AC_PINCTL_VREF_80;
Takashi Iwaicdd03ce2012-04-20 12:34:50 +02001985 snd_hda_set_pin_ctl(codec, nids[i], val);
Takashi Iwai08c189f2012-12-19 15:22:24 +01001986 spec->gen.keep_vref_in_automute = 1;
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001987 break;
1988 }
1989}
1990
Takashi Iwai0756f092013-12-04 13:59:45 +01001991static void alc889_fixup_mac_pins(struct hda_codec *codec,
1992 const hda_nid_t *nids, int num_nids)
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001993{
1994 struct alc_spec *spec = codec->spec;
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001995 int i;
1996
Takashi Iwai0756f092013-12-04 13:59:45 +01001997 for (i = 0; i < num_nids; i++) {
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001998 unsigned int val;
Takashi Iwaid3f02d62013-01-10 10:12:22 +01001999 val = snd_hda_codec_get_pin_target(codec, nids[i]);
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002000 val |= AC_PINCTL_VREF_50;
Takashi Iwaicdd03ce2012-04-20 12:34:50 +02002001 snd_hda_set_pin_ctl(codec, nids[i], val);
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002002 }
Takashi Iwai08c189f2012-12-19 15:22:24 +01002003 spec->gen.keep_vref_in_automute = 1;
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002004}
2005
Takashi Iwai0756f092013-12-04 13:59:45 +01002006/* Set VREF on speaker pins on imac91 */
2007static void alc889_fixup_imac91_vref(struct hda_codec *codec,
2008 const struct hda_fixup *fix, int action)
2009{
Michał Mirosławcaf3c042020-01-03 10:23:48 +01002010 static const hda_nid_t nids[] = { 0x18, 0x1a };
Takashi Iwai0756f092013-12-04 13:59:45 +01002011
2012 if (action == HDA_FIXUP_ACT_INIT)
2013 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2014}
2015
Adrien Vergée7729a42014-01-24 14:56:14 -05002016/* Set VREF on speaker pins on mba11 */
2017static void alc889_fixup_mba11_vref(struct hda_codec *codec,
2018 const struct hda_fixup *fix, int action)
2019{
Michał Mirosławcaf3c042020-01-03 10:23:48 +01002020 static const hda_nid_t nids[] = { 0x18 };
Adrien Vergée7729a42014-01-24 14:56:14 -05002021
2022 if (action == HDA_FIXUP_ACT_INIT)
2023 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2024}
2025
Takashi Iwai0756f092013-12-04 13:59:45 +01002026/* Set VREF on speaker pins on mba21 */
2027static void alc889_fixup_mba21_vref(struct hda_codec *codec,
2028 const struct hda_fixup *fix, int action)
2029{
Michał Mirosławcaf3c042020-01-03 10:23:48 +01002030 static const hda_nid_t nids[] = { 0x18, 0x19 };
Takashi Iwai0756f092013-12-04 13:59:45 +01002031
2032 if (action == HDA_FIXUP_ACT_INIT)
2033 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2034}
2035
Takashi Iwaie427c232012-07-29 10:04:08 +02002036/* Don't take HP output as primary
Fernando Luis Vázquez Caod9111492013-02-12 16:49:46 +09002037 * Strangely, the speaker output doesn't work on Vaio Z and some Vaio
2038 * all-in-one desktop PCs (for example VGC-LN51JGB) through DAC 0x05
Takashi Iwaie427c232012-07-29 10:04:08 +02002039 */
2040static void alc882_fixup_no_primary_hp(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01002041 const struct hda_fixup *fix, int action)
Takashi Iwaie427c232012-07-29 10:04:08 +02002042{
2043 struct alc_spec *spec = codec->spec;
Takashi Iwaida96fb52013-07-29 16:54:36 +02002044 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai08c189f2012-12-19 15:22:24 +01002045 spec->gen.no_primary_hp = 1;
Takashi Iwaida96fb52013-07-29 16:54:36 +02002046 spec->gen.no_multi_io = 1;
2047 }
Takashi Iwaie427c232012-07-29 10:04:08 +02002048}
2049
Takashi Iwaieb9ca3a2013-11-28 15:24:34 +01002050static void alc_fixup_bass_chmap(struct hda_codec *codec,
2051 const struct hda_fixup *fix, int action);
2052
Takashi Iwai7beb3a62017-04-10 18:05:52 +02002053/* For dual-codec configuration, we need to disable some features to avoid
2054 * conflicts of kctls and PCM streams
2055 */
2056static void alc_fixup_dual_codecs(struct hda_codec *codec,
2057 const struct hda_fixup *fix, int action)
2058{
2059 struct alc_spec *spec = codec->spec;
2060
2061 if (action != HDA_FIXUP_ACT_PRE_PROBE)
2062 return;
2063 /* disable vmaster */
2064 spec->gen.suppress_vmaster = 1;
2065 /* auto-mute and auto-mic switch don't work with multiple codecs */
2066 spec->gen.suppress_auto_mute = 1;
2067 spec->gen.suppress_auto_mic = 1;
2068 /* disable aamix as well */
2069 spec->gen.mixer_nid = 0;
2070 /* add location prefix to avoid conflicts */
2071 codec->force_pin_prefix = 1;
2072}
2073
2074static void rename_ctl(struct hda_codec *codec, const char *oldname,
2075 const char *newname)
2076{
2077 struct snd_kcontrol *kctl;
2078
2079 kctl = snd_hda_find_mixer_ctl(codec, oldname);
2080 if (kctl)
2081 strcpy(kctl->id.name, newname);
2082}
2083
2084static void alc1220_fixup_gb_dual_codecs(struct hda_codec *codec,
2085 const struct hda_fixup *fix,
2086 int action)
2087{
2088 alc_fixup_dual_codecs(codec, fix, action);
2089 switch (action) {
2090 case HDA_FIXUP_ACT_PRE_PROBE:
2091 /* override card longname to provide a unique UCM profile */
2092 strcpy(codec->card->longname, "HDAudio-Gigabyte-ALC1220DualCodecs");
2093 break;
2094 case HDA_FIXUP_ACT_BUILD:
2095 /* rename Capture controls depending on the codec */
2096 rename_ctl(codec, "Capture Volume",
2097 codec->addr == 0 ?
2098 "Rear-Panel Capture Volume" :
2099 "Front-Panel Capture Volume");
2100 rename_ctl(codec, "Capture Switch",
2101 codec->addr == 0 ?
2102 "Rear-Panel Capture Switch" :
2103 "Front-Panel Capture Switch");
2104 break;
2105 }
2106}
2107
Peisen0202f5c2017-10-26 10:35:36 +08002108static void alc1220_fixup_clevo_p950(struct hda_codec *codec,
2109 const struct hda_fixup *fix,
2110 int action)
2111{
Michał Mirosławcaf3c042020-01-03 10:23:48 +01002112 static const hda_nid_t conn1[] = { 0x0c };
Peisen0202f5c2017-10-26 10:35:36 +08002113
2114 if (action != HDA_FIXUP_ACT_PRE_PROBE)
2115 return;
2116
2117 alc_update_coef_idx(codec, 0x7, 0, 0x3c3);
2118 /* We therefore want to make sure 0x14 (front headphone) and
2119 * 0x1b (speakers) use the stereo DAC 0x02
2120 */
Michał Mirosławcaf3c042020-01-03 10:23:48 +01002121 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2122 snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
Peisen0202f5c2017-10-26 10:35:36 +08002123}
2124
Jeremy Soller7f665b12019-02-13 10:56:19 -07002125static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
2126 const struct hda_fixup *fix, int action);
2127
Richard Sailer80690a22019-04-02 15:52:04 +02002128static void alc1220_fixup_clevo_pb51ed(struct hda_codec *codec,
Jeremy Soller7f665b12019-02-13 10:56:19 -07002129 const struct hda_fixup *fix,
2130 int action)
2131{
2132 alc1220_fixup_clevo_p950(codec, fix, action);
2133 alc_fixup_headset_mode_no_hp_mic(codec, fix, action);
2134}
2135
Takashi Iwai1727a772013-01-10 09:52:52 +01002136static const struct hda_fixup alc882_fixups[] = {
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002137 [ALC882_FIXUP_ABIT_AW9D_MAX] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002138 .type = HDA_FIXUP_PINS,
2139 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02002140 { 0x15, 0x01080104 }, /* side */
2141 { 0x16, 0x01011012 }, /* rear */
2142 { 0x17, 0x01016011 }, /* clfe */
2143 { }
2144 }
2145 },
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002146 [ALC882_FIXUP_LENOVO_Y530] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002147 .type = HDA_FIXUP_PINS,
2148 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02002149 { 0x15, 0x99130112 }, /* rear int speakers */
2150 { 0x16, 0x99130111 }, /* subwoofer */
2151 { }
2152 }
2153 },
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002154 [ALC882_FIXUP_PB_M5210] = {
Takashi Iwaifd108212013-01-10 10:18:14 +01002155 .type = HDA_FIXUP_PINCTLS,
2156 .v.pins = (const struct hda_pintbl[]) {
2157 { 0x19, PIN_VREF50 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02002158 {}
2159 }
2160 },
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002161 [ALC882_FIXUP_ACER_ASPIRE_7736] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002162 .type = HDA_FIXUP_FUNC,
Takashi Iwai23d30f22012-05-07 17:17:32 +02002163 .v.func = alc_fixup_sku_ignore,
Takashi Iwai1d045db2011-07-07 18:23:21 +02002164 },
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002165 [ALC882_FIXUP_ASUS_W90V] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002166 .type = HDA_FIXUP_PINS,
2167 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai5cdf7452011-10-26 23:04:08 +02002168 { 0x16, 0x99130110 }, /* fix sequence for CLFE */
2169 { }
2170 }
2171 },
Marton Balint8f239212012-03-05 21:33:23 +01002172 [ALC889_FIXUP_CD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002173 .type = HDA_FIXUP_PINS,
2174 .v.pins = (const struct hda_pintbl[]) {
Marton Balint8f239212012-03-05 21:33:23 +01002175 { 0x1c, 0x993301f0 }, /* CD */
2176 { }
2177 }
2178 },
David Henningssonb2c53e22014-01-01 14:01:34 +01002179 [ALC889_FIXUP_FRONT_HP_NO_PRESENCE] = {
2180 .type = HDA_FIXUP_PINS,
2181 .v.pins = (const struct hda_pintbl[]) {
2182 { 0x1b, 0x02214120 }, /* Front HP jack is flaky, disable jack detect */
2183 { }
2184 },
2185 .chained = true,
2186 .chain_id = ALC889_FIXUP_CD,
2187 },
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002188 [ALC889_FIXUP_VAIO_TT] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002189 .type = HDA_FIXUP_PINS,
2190 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002191 { 0x17, 0x90170111 }, /* hidden surround speaker */
2192 { }
2193 }
2194 },
Takashi Iwai0e7cc2e2011-11-09 12:42:48 +01002195 [ALC888_FIXUP_EEE1601] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002196 .type = HDA_FIXUP_VERBS,
Takashi Iwai0e7cc2e2011-11-09 12:42:48 +01002197 .v.verbs = (const struct hda_verb[]) {
2198 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2199 { 0x20, AC_VERB_SET_PROC_COEF, 0x0838 },
2200 { }
2201 }
Takashi Iwai177943a32011-11-09 12:55:18 +01002202 },
2203 [ALC882_FIXUP_EAPD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002204 .type = HDA_FIXUP_VERBS,
Takashi Iwai177943a32011-11-09 12:55:18 +01002205 .v.verbs = (const struct hda_verb[]) {
2206 /* change to EAPD mode */
2207 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2208 { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
2209 { }
2210 }
2211 },
Takashi Iwai7a6069b2011-11-09 15:22:01 +01002212 [ALC883_FIXUP_EAPD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002213 .type = HDA_FIXUP_VERBS,
Takashi Iwai7a6069b2011-11-09 15:22:01 +01002214 .v.verbs = (const struct hda_verb[]) {
2215 /* change to EAPD mode */
2216 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2217 { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2218 { }
2219 }
2220 },
Takashi Iwai8812c4f2011-11-09 17:39:15 +01002221 [ALC883_FIXUP_ACER_EAPD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002222 .type = HDA_FIXUP_VERBS,
Takashi Iwai8812c4f2011-11-09 17:39:15 +01002223 .v.verbs = (const struct hda_verb[]) {
2224 /* eanable EAPD on Acer laptops */
2225 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2226 { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2227 { }
2228 }
2229 },
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002230 [ALC882_FIXUP_GPIO1] = {
Takashi Iwai5579cd62018-06-19 22:22:41 +02002231 .type = HDA_FIXUP_FUNC,
2232 .v.func = alc_fixup_gpio1,
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002233 },
2234 [ALC882_FIXUP_GPIO2] = {
Takashi Iwai5579cd62018-06-19 22:22:41 +02002235 .type = HDA_FIXUP_FUNC,
2236 .v.func = alc_fixup_gpio2,
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002237 },
Takashi Iwaieb844d52011-11-09 18:03:07 +01002238 [ALC882_FIXUP_GPIO3] = {
Takashi Iwai5579cd62018-06-19 22:22:41 +02002239 .type = HDA_FIXUP_FUNC,
2240 .v.func = alc_fixup_gpio3,
Takashi Iwaieb844d52011-11-09 18:03:07 +01002241 },
Takashi Iwai68ef0562011-11-09 18:24:44 +01002242 [ALC882_FIXUP_ASUS_W2JC] = {
Takashi Iwai5579cd62018-06-19 22:22:41 +02002243 .type = HDA_FIXUP_FUNC,
2244 .v.func = alc_fixup_gpio1,
Takashi Iwai68ef0562011-11-09 18:24:44 +01002245 .chained = true,
2246 .chain_id = ALC882_FIXUP_EAPD,
2247 },
2248 [ALC889_FIXUP_COEF] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002249 .type = HDA_FIXUP_FUNC,
Takashi Iwai68ef0562011-11-09 18:24:44 +01002250 .v.func = alc889_fixup_coef,
2251 },
Takashi Iwaic3e837b2011-11-10 16:01:47 +01002252 [ALC882_FIXUP_ACER_ASPIRE_4930G] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002253 .type = HDA_FIXUP_PINS,
2254 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaic3e837b2011-11-10 16:01:47 +01002255 { 0x16, 0x99130111 }, /* CLFE speaker */
2256 { 0x17, 0x99130112 }, /* surround speaker */
2257 { }
Takashi Iwai038d4fef2012-04-11 17:18:12 +02002258 },
2259 .chained = true,
2260 .chain_id = ALC882_FIXUP_GPIO1,
Takashi Iwaic3e837b2011-11-10 16:01:47 +01002261 },
2262 [ALC882_FIXUP_ACER_ASPIRE_8930G] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002263 .type = HDA_FIXUP_PINS,
2264 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaic3e837b2011-11-10 16:01:47 +01002265 { 0x16, 0x99130111 }, /* CLFE speaker */
2266 { 0x1b, 0x99130112 }, /* surround speaker */
2267 { }
2268 },
2269 .chained = true,
2270 .chain_id = ALC882_FIXUP_ASPIRE_8930G_VERBS,
2271 },
2272 [ALC882_FIXUP_ASPIRE_8930G_VERBS] = {
2273 /* additional init verbs for Acer Aspire 8930G */
Takashi Iwai1727a772013-01-10 09:52:52 +01002274 .type = HDA_FIXUP_VERBS,
Takashi Iwaic3e837b2011-11-10 16:01:47 +01002275 .v.verbs = (const struct hda_verb[]) {
2276 /* Enable all DACs */
2277 /* DAC DISABLE/MUTE 1? */
2278 /* setting bits 1-5 disables DAC nids 0x02-0x06
2279 * apparently. Init=0x38 */
2280 { 0x20, AC_VERB_SET_COEF_INDEX, 0x03 },
2281 { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2282 /* DAC DISABLE/MUTE 2? */
2283 /* some bit here disables the other DACs.
2284 * Init=0x4900 */
2285 { 0x20, AC_VERB_SET_COEF_INDEX, 0x08 },
2286 { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2287 /* DMIC fix
2288 * This laptop has a stereo digital microphone.
2289 * The mics are only 1cm apart which makes the stereo
2290 * useless. However, either the mic or the ALC889
2291 * makes the signal become a difference/sum signal
2292 * instead of standard stereo, which is annoying.
2293 * So instead we flip this bit which makes the
2294 * codec replicate the sum signal to both channels,
2295 * turning it into a normal mono mic.
2296 */
2297 /* DMIC_CONTROL? Init value = 0x0001 */
2298 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2299 { 0x20, AC_VERB_SET_PROC_COEF, 0x0003 },
2300 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2301 { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2302 { }
Takashi Iwai038d4fef2012-04-11 17:18:12 +02002303 },
2304 .chained = true,
2305 .chain_id = ALC882_FIXUP_GPIO1,
Takashi Iwaic3e837b2011-11-10 16:01:47 +01002306 },
Takashi Iwai56710872011-11-14 17:42:11 +01002307 [ALC885_FIXUP_MACPRO_GPIO] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002308 .type = HDA_FIXUP_FUNC,
Takashi Iwai56710872011-11-14 17:42:11 +01002309 .v.func = alc885_fixup_macpro_gpio,
2310 },
Takashi Iwai02a237b2012-02-13 15:25:07 +01002311 [ALC889_FIXUP_DAC_ROUTE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002312 .type = HDA_FIXUP_FUNC,
Takashi Iwai02a237b2012-02-13 15:25:07 +01002313 .v.func = alc889_fixup_dac_route,
2314 },
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002315 [ALC889_FIXUP_MBP_VREF] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002316 .type = HDA_FIXUP_FUNC,
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002317 .v.func = alc889_fixup_mbp_vref,
2318 .chained = true,
2319 .chain_id = ALC882_FIXUP_GPIO1,
2320 },
2321 [ALC889_FIXUP_IMAC91_VREF] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002322 .type = HDA_FIXUP_FUNC,
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002323 .v.func = alc889_fixup_imac91_vref,
2324 .chained = true,
2325 .chain_id = ALC882_FIXUP_GPIO1,
2326 },
Adrien Vergée7729a42014-01-24 14:56:14 -05002327 [ALC889_FIXUP_MBA11_VREF] = {
2328 .type = HDA_FIXUP_FUNC,
2329 .v.func = alc889_fixup_mba11_vref,
2330 .chained = true,
2331 .chain_id = ALC889_FIXUP_MBP_VREF,
2332 },
Takashi Iwai0756f092013-12-04 13:59:45 +01002333 [ALC889_FIXUP_MBA21_VREF] = {
2334 .type = HDA_FIXUP_FUNC,
2335 .v.func = alc889_fixup_mba21_vref,
2336 .chained = true,
2337 .chain_id = ALC889_FIXUP_MBP_VREF,
2338 },
Takashi Iwaic20f31e2014-02-03 11:02:10 +01002339 [ALC889_FIXUP_MP11_VREF] = {
2340 .type = HDA_FIXUP_FUNC,
2341 .v.func = alc889_fixup_mba11_vref,
2342 .chained = true,
2343 .chain_id = ALC885_FIXUP_MACPRO_GPIO,
2344 },
Mario Kleiner9f660a12015-12-22 00:45:43 +01002345 [ALC889_FIXUP_MP41_VREF] = {
2346 .type = HDA_FIXUP_FUNC,
2347 .v.func = alc889_fixup_mbp_vref,
2348 .chained = true,
2349 .chain_id = ALC885_FIXUP_MACPRO_GPIO,
2350 },
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002351 [ALC882_FIXUP_INV_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002352 .type = HDA_FIXUP_FUNC,
David Henningsson9d36a7d2014-10-07 10:18:42 +02002353 .v.func = alc_fixup_inv_dmic,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002354 },
Takashi Iwaie427c232012-07-29 10:04:08 +02002355 [ALC882_FIXUP_NO_PRIMARY_HP] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002356 .type = HDA_FIXUP_FUNC,
Takashi Iwaie427c232012-07-29 10:04:08 +02002357 .v.func = alc882_fixup_no_primary_hp,
2358 },
Takashi Iwai1f0bbf02013-11-28 15:21:21 +01002359 [ALC887_FIXUP_ASUS_BASS] = {
2360 .type = HDA_FIXUP_PINS,
2361 .v.pins = (const struct hda_pintbl[]) {
2362 {0x16, 0x99130130}, /* bass speaker */
2363 {}
2364 },
Takashi Iwaieb9ca3a2013-11-28 15:24:34 +01002365 .chained = true,
2366 .chain_id = ALC887_FIXUP_BASS_CHMAP,
2367 },
2368 [ALC887_FIXUP_BASS_CHMAP] = {
2369 .type = HDA_FIXUP_FUNC,
2370 .v.func = alc_fixup_bass_chmap,
Takashi Iwai1f0bbf02013-11-28 15:21:21 +01002371 },
Takashi Iwai7beb3a62017-04-10 18:05:52 +02002372 [ALC1220_FIXUP_GB_DUAL_CODECS] = {
2373 .type = HDA_FIXUP_FUNC,
2374 .v.func = alc1220_fixup_gb_dual_codecs,
2375 },
Peisen0202f5c2017-10-26 10:35:36 +08002376 [ALC1220_FIXUP_CLEVO_P950] = {
2377 .type = HDA_FIXUP_FUNC,
2378 .v.func = alc1220_fixup_clevo_p950,
2379 },
Richard Sailer80690a22019-04-02 15:52:04 +02002380 [ALC1220_FIXUP_CLEVO_PB51ED] = {
Jeremy Soller7f665b12019-02-13 10:56:19 -07002381 .type = HDA_FIXUP_FUNC,
Richard Sailer80690a22019-04-02 15:52:04 +02002382 .v.func = alc1220_fixup_clevo_pb51ed,
Jeremy Soller7f665b12019-02-13 10:56:19 -07002383 },
Richard Sailer80690a22019-04-02 15:52:04 +02002384 [ALC1220_FIXUP_CLEVO_PB51ED_PINS] = {
Jeremy Soller7f665b12019-02-13 10:56:19 -07002385 .type = HDA_FIXUP_PINS,
2386 .v.pins = (const struct hda_pintbl[]) {
2387 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
2388 {}
2389 },
2390 .chained = true,
Richard Sailer80690a22019-04-02 15:52:04 +02002391 .chain_id = ALC1220_FIXUP_CLEVO_PB51ED,
Jeremy Soller7f665b12019-02-13 10:56:19 -07002392 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02002393};
2394
2395static const struct snd_pci_quirk alc882_fixup_tbl[] = {
Takashi Iwai8812c4f2011-11-09 17:39:15 +01002396 SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD),
2397 SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
Takashi Iwaib5d724b2015-06-02 19:57:08 +02002398 SND_PCI_QUIRK(0x1025, 0x0107, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
Takashi Iwai8812c4f2011-11-09 17:39:15 +01002399 SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD),
2400 SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2401 SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD),
2402 SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_FIXUP_ACER_EAPD),
Takashi Iwaic3e837b2011-11-10 16:01:47 +01002403 SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
2404 ALC882_FIXUP_ACER_ASPIRE_4930G),
2405 SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
2406 ALC882_FIXUP_ACER_ASPIRE_4930G),
2407 SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
2408 ALC882_FIXUP_ACER_ASPIRE_8930G),
2409 SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
2410 ALC882_FIXUP_ACER_ASPIRE_8930G),
2411 SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
2412 ALC882_FIXUP_ACER_ASPIRE_4930G),
2413 SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
2414 ALC882_FIXUP_ACER_ASPIRE_4930G),
2415 SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
2416 ALC882_FIXUP_ACER_ASPIRE_4930G),
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002417 SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
Takashi Iwaif5c53d82012-05-07 10:07:33 +02002418 SND_PCI_QUIRK(0x1025, 0x021e, "Acer Aspire 5739G",
2419 ALC882_FIXUP_ACER_ASPIRE_4930G),
Takashi Iwai02a237b2012-02-13 15:25:07 +01002420 SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),
Takashi Iwaife97da12012-04-12 08:00:19 +02002421 SND_PCI_QUIRK(0x1025, 0x026b, "Acer Aspire 8940G", ALC882_FIXUP_ACER_ASPIRE_8930G),
Takashi Iwaiac9b1cd2011-11-09 17:45:55 +01002422 SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736),
Takashi Iwai177943a32011-11-09 12:55:18 +01002423 SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD),
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002424 SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),
Takashi Iwai68ef0562011-11-09 18:24:44 +01002425 SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_FIXUP_ASUS_W2JC),
Takashi Iwai0e7cc2e2011-11-09 12:42:48 +01002426 SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601),
Takashi Iwai1f0bbf02013-11-28 15:21:21 +01002427 SND_PCI_QUIRK(0x1043, 0x84bc, "ASUS ET2700", ALC887_FIXUP_ASUS_BASS),
Takashi Iwai85bcf962016-12-06 16:20:36 +01002428 SND_PCI_QUIRK(0x1043, 0x8691, "ASUS ROG Ranger VIII", ALC882_FIXUP_GPIO3),
Takashi Iwaiac9b1cd2011-11-09 17:45:55 +01002429 SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT),
Takashi Iwaie427c232012-07-29 10:04:08 +02002430 SND_PCI_QUIRK(0x104d, 0x905a, "Sony Vaio Z", ALC882_FIXUP_NO_PRIMARY_HP),
Sergei A. Trusov3f3c3712017-08-02 20:23:48 +10002431 SND_PCI_QUIRK(0x104d, 0x9060, "Sony Vaio VPCL14M1R", ALC882_FIXUP_NO_PRIMARY_HP),
Fernando Luis Vázquez Cao12e31a72013-02-12 16:47:44 +09002432 SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP),
Takashi Iwaic44d9b12016-02-07 09:38:26 +01002433 SND_PCI_QUIRK(0x104d, 0x9044, "Sony VAIO AiO", ALC882_FIXUP_NO_PRIMARY_HP),
Takashi Iwai56710872011-11-14 17:42:11 +01002434
2435 /* All Apple entries are in codec SSIDs */
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002436 SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF),
2437 SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC889_FIXUP_MBP_VREF),
2438 SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
Takashi Iwaic20f31e2014-02-03 11:02:10 +01002439 SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC889_FIXUP_MP11_VREF),
Takashi Iwai56710872011-11-14 17:42:11 +01002440 SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_FIXUP_MACPRO_GPIO),
2441 SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_FIXUP_MACPRO_GPIO),
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002442 SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC889_FIXUP_MBP_VREF),
2443 SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889_FIXUP_MBP_VREF),
Takashi Iwai56710872011-11-14 17:42:11 +01002444 SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD),
Adrien Vergée7729a42014-01-24 14:56:14 -05002445 SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC889_FIXUP_MBA11_VREF),
Takashi Iwai0756f092013-12-04 13:59:45 +01002446 SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBA21_VREF),
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002447 SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889_FIXUP_MBP_VREF),
2448 SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
Takashi Iwai56710872011-11-14 17:42:11 +01002449 SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO),
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002450 SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF),
2451 SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF),
2452 SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF),
Mario Kleiner9f660a12015-12-22 00:45:43 +01002453 SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 4,1/5,1", ALC889_FIXUP_MP41_VREF),
Takashi Iwai05193632012-11-12 10:07:36 +01002454 SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF),
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002455 SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),
2456 SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),
Takashi Iwai649ccd02015-07-30 22:30:29 +02002457 SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_MBA11_VREF),
Takashi Iwai56710872011-11-14 17:42:11 +01002458
Takashi Iwai7a6069b2011-11-09 15:22:01 +01002459 SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),
David Henningssonb2c53e22014-01-01 14:01:34 +01002460 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE),
Takashi Iwai7beb3a62017-04-10 18:05:52 +02002461 SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
Christian Lachner0d45e862020-02-23 10:24:16 +01002462 SND_PCI_QUIRK(0x1458, 0xa0cd, "Gigabyte X570 Aorus Master", ALC1220_FIXUP_CLEVO_P950),
Christian Lachnerd9e8fe02020-05-18 07:38:44 +02002463 SND_PCI_QUIRK(0x1458, 0xa0ce, "Gigabyte X570 Aorus Xtreme", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwaia0b03952020-06-16 15:21:50 +02002464 SND_PCI_QUIRK(0x1462, 0x11f7, "MSI-GE63", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwaia655e2b2020-02-17 16:19:47 +01002465 SND_PCI_QUIRK(0x1462, 0x1228, "MSI-GP63", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwai1d3aa4a2020-04-08 15:56:45 +02002466 SND_PCI_QUIRK(0x1462, 0x1275, "MSI-GL63", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwai7dafba32020-02-12 09:10:47 +01002467 SND_PCI_QUIRK(0x1462, 0x1276, "MSI-GL73", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwaicc5049a2020-02-18 09:09:15 +01002468 SND_PCI_QUIRK(0x1462, 0x1293, "MSI-GP65", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwaid2c3b142017-06-01 09:35:30 +02002469 SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),
Takashi Iwai63691582017-05-22 16:32:46 +02002470 SND_PCI_QUIRK(0x1462, 0xda57, "MSI Z270-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
Takashi Iwaid2c3b142017-06-01 09:35:30 +02002471 SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002472 SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
Peisen0202f5c2017-10-26 10:35:36 +08002473 SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwaif3d737b2018-07-17 17:08:32 +02002474 SND_PCI_QUIRK(0x1558, 0x95e1, "Clevo P95xER", ALC1220_FIXUP_CLEVO_P950),
Jeremy Soller2f0d5202018-05-07 09:28:45 -06002475 SND_PCI_QUIRK(0x1558, 0x95e2, "Clevo P950ER", ALC1220_FIXUP_CLEVO_P950),
Richard Sailer503d90b2019-06-19 13:33:11 +02002476 SND_PCI_QUIRK(0x1558, 0x96e1, "Clevo P960[ER][CDFN]-K", ALC1220_FIXUP_CLEVO_P950),
2477 SND_PCI_QUIRK(0x1558, 0x97e1, "Clevo P970[ER][CDFN]", ALC1220_FIXUP_CLEVO_P950),
2478 SND_PCI_QUIRK(0x1558, 0x65d1, "Clevo PB51[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2479 SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
PeiSen Hou259eb822020-05-19 08:50:12 +02002480 SND_PCI_QUIRK(0x1558, 0x50d3, "Clevo PC50[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2481 SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2482 SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
Takashi Iwai7a6069b2011-11-09 15:22:01 +01002483 SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
2484 SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),
Takashi Iwaiac9b1cd2011-11-09 17:45:55 +01002485 SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),
Takashi Iwai68ef0562011-11-09 18:24:44 +01002486 SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_FIXUP_COEF),
Takashi Iwai1d045db2011-07-07 18:23:21 +02002487 {}
2488};
2489
Takashi Iwai1727a772013-01-10 09:52:52 +01002490static const struct hda_model_fixup alc882_fixup_models[] = {
Takashi Iwai772c2912018-06-26 17:17:53 +02002491 {.id = ALC882_FIXUP_ABIT_AW9D_MAX, .name = "abit-aw9d"},
2492 {.id = ALC882_FIXUP_LENOVO_Y530, .name = "lenovo-y530"},
2493 {.id = ALC882_FIXUP_ACER_ASPIRE_7736, .name = "acer-aspire-7736"},
2494 {.id = ALC882_FIXUP_ASUS_W90V, .name = "asus-w90v"},
2495 {.id = ALC889_FIXUP_CD, .name = "cd"},
2496 {.id = ALC889_FIXUP_FRONT_HP_NO_PRESENCE, .name = "no-front-hp"},
2497 {.id = ALC889_FIXUP_VAIO_TT, .name = "vaio-tt"},
2498 {.id = ALC888_FIXUP_EEE1601, .name = "eee1601"},
2499 {.id = ALC882_FIXUP_EAPD, .name = "alc882-eapd"},
2500 {.id = ALC883_FIXUP_EAPD, .name = "alc883-eapd"},
2501 {.id = ALC882_FIXUP_GPIO1, .name = "gpio1"},
2502 {.id = ALC882_FIXUP_GPIO2, .name = "gpio2"},
2503 {.id = ALC882_FIXUP_GPIO3, .name = "gpio3"},
2504 {.id = ALC889_FIXUP_COEF, .name = "alc889-coef"},
2505 {.id = ALC882_FIXUP_ASUS_W2JC, .name = "asus-w2jc"},
Takashi Iwai912093b2012-04-11 14:03:41 +02002506 {.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name = "acer-aspire-4930g"},
2507 {.id = ALC882_FIXUP_ACER_ASPIRE_8930G, .name = "acer-aspire-8930g"},
2508 {.id = ALC883_FIXUP_ACER_EAPD, .name = "acer-aspire"},
Takashi Iwai772c2912018-06-26 17:17:53 +02002509 {.id = ALC885_FIXUP_MACPRO_GPIO, .name = "macpro-gpio"},
2510 {.id = ALC889_FIXUP_DAC_ROUTE, .name = "dac-route"},
2511 {.id = ALC889_FIXUP_MBP_VREF, .name = "mbp-vref"},
2512 {.id = ALC889_FIXUP_IMAC91_VREF, .name = "imac91-vref"},
2513 {.id = ALC889_FIXUP_MBA11_VREF, .name = "mba11-vref"},
2514 {.id = ALC889_FIXUP_MBA21_VREF, .name = "mba21-vref"},
2515 {.id = ALC889_FIXUP_MP11_VREF, .name = "mp11-vref"},
2516 {.id = ALC889_FIXUP_MP41_VREF, .name = "mp41-vref"},
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002517 {.id = ALC882_FIXUP_INV_DMIC, .name = "inv-dmic"},
Takashi Iwaie427c232012-07-29 10:04:08 +02002518 {.id = ALC882_FIXUP_NO_PRIMARY_HP, .name = "no-primary-hp"},
Takashi Iwai772c2912018-06-26 17:17:53 +02002519 {.id = ALC887_FIXUP_ASUS_BASS, .name = "asus-bass"},
Takashi Iwaiba90d6a2017-05-22 16:38:47 +02002520 {.id = ALC1220_FIXUP_GB_DUAL_CODECS, .name = "dual-codecs"},
Takashi Iwai772c2912018-06-26 17:17:53 +02002521 {.id = ALC1220_FIXUP_CLEVO_P950, .name = "clevo-p950"},
Takashi Iwai912093b2012-04-11 14:03:41 +02002522 {}
2523};
2524
Takashi Iwai1d045db2011-07-07 18:23:21 +02002525/*
2526 * BIOS auto configuration
2527 */
2528/* almost identical with ALC880 parser... */
2529static int alc882_parse_auto_config(struct hda_codec *codec)
2530{
Takashi Iwai1d045db2011-07-07 18:23:21 +02002531 static const hda_nid_t alc882_ignore[] = { 0x1d, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02002532 static const hda_nid_t alc882_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2533 return alc_parse_auto_config(codec, alc882_ignore, alc882_ssids);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002534}
2535
Takashi Iwai1d045db2011-07-07 18:23:21 +02002536/*
2537 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02002538static int patch_alc882(struct hda_codec *codec)
2539{
2540 struct alc_spec *spec;
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002541 int err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002542
Takashi Iwai3de95172012-05-07 18:03:15 +02002543 err = alc_alloc_spec(codec, 0x0b);
2544 if (err < 0)
2545 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002546
Takashi Iwai3de95172012-05-07 18:03:15 +02002547 spec = codec->spec;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002548
Takashi Iwai7639a062015-03-03 10:07:24 +01002549 switch (codec->core.vendor_id) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02002550 case 0x10ec0882:
2551 case 0x10ec0885:
Takashi Iwaiacf08082014-09-02 07:21:56 +02002552 case 0x10ec0900:
Kailang Yang6d9ffcf2020-01-03 16:24:06 +08002553 case 0x10ec0b00:
Kailang Yanga535ad52017-01-16 16:59:26 +08002554 case 0x10ec1220:
Takashi Iwai1d045db2011-07-07 18:23:21 +02002555 break;
2556 default:
2557 /* ALC883 and variants */
2558 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2559 break;
2560 }
2561
Takashi Iwaic9af7532019-05-10 11:01:43 +02002562 alc_pre_init(codec);
2563
Takashi Iwai1727a772013-01-10 09:52:52 +01002564 snd_hda_pick_fixup(codec, alc882_fixup_models, alc882_fixup_tbl,
Takashi Iwai912093b2012-04-11 14:03:41 +02002565 alc882_fixups);
Takashi Iwai1727a772013-01-10 09:52:52 +01002566 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002567
2568 alc_auto_parse_customize_define(codec);
2569
Takashi Iwai7504b6c2013-03-18 11:25:51 +01002570 if (has_cdefine_beep(codec))
2571 spec->gen.beep_nid = 0x01;
2572
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002573 /* automatic parse from the BIOS config */
2574 err = alc882_parse_auto_config(codec);
2575 if (err < 0)
2576 goto error;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002577
Takashi Iwaifea80fa2018-06-20 12:52:46 +02002578 if (!spec->gen.no_analog && spec->gen.beep_nid) {
2579 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2580 if (err < 0)
2581 goto error;
2582 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02002583
Takashi Iwai1727a772013-01-10 09:52:52 +01002584 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01002585
Takashi Iwai1d045db2011-07-07 18:23:21 +02002586 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02002587
2588 error:
2589 alc_free(codec);
2590 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002591}
2592
2593
2594/*
2595 * ALC262 support
2596 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02002597static int alc262_parse_auto_config(struct hda_codec *codec)
2598{
Takashi Iwai1d045db2011-07-07 18:23:21 +02002599 static const hda_nid_t alc262_ignore[] = { 0x1d, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02002600 static const hda_nid_t alc262_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2601 return alc_parse_auto_config(codec, alc262_ignore, alc262_ssids);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002602}
2603
2604/*
2605 * Pin config fixes
2606 */
2607enum {
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002608 ALC262_FIXUP_FSC_H270,
Takashi Iwai7513e6da2013-01-18 15:41:34 +01002609 ALC262_FIXUP_FSC_S7110,
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002610 ALC262_FIXUP_HP_Z200,
2611 ALC262_FIXUP_TYAN,
Takashi Iwaic4701502011-11-07 14:20:07 +01002612 ALC262_FIXUP_LENOVO_3000,
Takashi Iwaib42590b2011-11-07 14:41:01 +01002613 ALC262_FIXUP_BENQ,
2614 ALC262_FIXUP_BENQ_T31,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002615 ALC262_FIXUP_INV_DMIC,
Mengdong Linb5c66112013-11-29 00:35:35 -05002616 ALC262_FIXUP_INTEL_BAYLEYBAY,
Takashi Iwai1d045db2011-07-07 18:23:21 +02002617};
2618
Takashi Iwai1727a772013-01-10 09:52:52 +01002619static const struct hda_fixup alc262_fixups[] = {
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002620 [ALC262_FIXUP_FSC_H270] = {
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 { 0x14, 0x99130110 }, /* speaker */
2624 { 0x15, 0x0221142f }, /* front HP */
2625 { 0x1b, 0x0121141f }, /* rear HP */
2626 { }
2627 }
2628 },
Takashi Iwai7513e6da2013-01-18 15:41:34 +01002629 [ALC262_FIXUP_FSC_S7110] = {
2630 .type = HDA_FIXUP_PINS,
2631 .v.pins = (const struct hda_pintbl[]) {
2632 { 0x15, 0x90170110 }, /* speaker */
2633 { }
2634 },
2635 .chained = true,
2636 .chain_id = ALC262_FIXUP_BENQ,
2637 },
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002638 [ALC262_FIXUP_HP_Z200] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002639 .type = HDA_FIXUP_PINS,
2640 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02002641 { 0x16, 0x99130120 }, /* internal speaker */
2642 { }
2643 }
2644 },
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002645 [ALC262_FIXUP_TYAN] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002646 .type = HDA_FIXUP_PINS,
2647 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002648 { 0x14, 0x1993e1f0 }, /* int AUX */
2649 { }
2650 }
2651 },
Takashi Iwaic4701502011-11-07 14:20:07 +01002652 [ALC262_FIXUP_LENOVO_3000] = {
Takashi Iwaifd108212013-01-10 10:18:14 +01002653 .type = HDA_FIXUP_PINCTLS,
2654 .v.pins = (const struct hda_pintbl[]) {
2655 { 0x19, PIN_VREF50 },
Takashi Iwaib42590b2011-11-07 14:41:01 +01002656 {}
2657 },
2658 .chained = true,
2659 .chain_id = ALC262_FIXUP_BENQ,
2660 },
2661 [ALC262_FIXUP_BENQ] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002662 .type = HDA_FIXUP_VERBS,
Takashi Iwaib42590b2011-11-07 14:41:01 +01002663 .v.verbs = (const struct hda_verb[]) {
Takashi Iwaic4701502011-11-07 14:20:07 +01002664 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2665 { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2666 {}
2667 }
2668 },
Takashi Iwaib42590b2011-11-07 14:41:01 +01002669 [ALC262_FIXUP_BENQ_T31] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002670 .type = HDA_FIXUP_VERBS,
Takashi Iwaib42590b2011-11-07 14:41:01 +01002671 .v.verbs = (const struct hda_verb[]) {
2672 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2673 { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2674 {}
2675 }
2676 },
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002677 [ALC262_FIXUP_INV_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002678 .type = HDA_FIXUP_FUNC,
David Henningsson9d36a7d2014-10-07 10:18:42 +02002679 .v.func = alc_fixup_inv_dmic,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002680 },
Mengdong Linb5c66112013-11-29 00:35:35 -05002681 [ALC262_FIXUP_INTEL_BAYLEYBAY] = {
2682 .type = HDA_FIXUP_FUNC,
2683 .v.func = alc_fixup_no_depop_delay,
2684 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02002685};
2686
2687static const struct snd_pci_quirk alc262_fixup_tbl[] = {
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002688 SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", ALC262_FIXUP_HP_Z200),
Takashi Iwai7513e6da2013-01-18 15:41:34 +01002689 SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu Lifebook S7110", ALC262_FIXUP_FSC_S7110),
Takashi Iwai3dcd3be2011-11-07 14:59:40 +01002690 SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ),
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002691 SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN),
Takashi Iwai275ec0c2018-06-22 12:17:45 +02002692 SND_PCI_QUIRK(0x1734, 0x1141, "FSC ESPRIMO U9210", ALC262_FIXUP_FSC_H270),
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002693 SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270),
Takashi Iwaic4701502011-11-07 14:20:07 +01002694 SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000),
Takashi Iwaib42590b2011-11-07 14:41:01 +01002695 SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ),
2696 SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_FIXUP_BENQ_T31),
Mengdong Linb5c66112013-11-29 00:35:35 -05002697 SND_PCI_QUIRK(0x8086, 0x7270, "BayleyBay", ALC262_FIXUP_INTEL_BAYLEYBAY),
Takashi Iwai1d045db2011-07-07 18:23:21 +02002698 {}
2699};
2700
Takashi Iwai1727a772013-01-10 09:52:52 +01002701static const struct hda_model_fixup alc262_fixup_models[] = {
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002702 {.id = ALC262_FIXUP_INV_DMIC, .name = "inv-dmic"},
Takashi Iwaie43c44d2018-06-26 17:02:08 +02002703 {.id = ALC262_FIXUP_FSC_H270, .name = "fsc-h270"},
2704 {.id = ALC262_FIXUP_FSC_S7110, .name = "fsc-s7110"},
2705 {.id = ALC262_FIXUP_HP_Z200, .name = "hp-z200"},
2706 {.id = ALC262_FIXUP_TYAN, .name = "tyan"},
2707 {.id = ALC262_FIXUP_LENOVO_3000, .name = "lenovo-3000"},
2708 {.id = ALC262_FIXUP_BENQ, .name = "benq"},
2709 {.id = ALC262_FIXUP_BENQ_T31, .name = "benq-t31"},
2710 {.id = ALC262_FIXUP_INTEL_BAYLEYBAY, .name = "bayleybay"},
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002711 {}
2712};
Takashi Iwai1d045db2011-07-07 18:23:21 +02002713
Takashi Iwai1d045db2011-07-07 18:23:21 +02002714/*
2715 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02002716static int patch_alc262(struct hda_codec *codec)
2717{
2718 struct alc_spec *spec;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002719 int err;
2720
Takashi Iwai3de95172012-05-07 18:03:15 +02002721 err = alc_alloc_spec(codec, 0x0b);
2722 if (err < 0)
2723 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002724
Takashi Iwai3de95172012-05-07 18:03:15 +02002725 spec = codec->spec;
Takashi Iwai08c189f2012-12-19 15:22:24 +01002726 spec->gen.shared_mic_vref_pin = 0x18;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002727
Takashi Iwai225068a2015-05-29 10:42:14 +02002728 spec->shutup = alc_eapd_shutup;
2729
Takashi Iwai1d045db2011-07-07 18:23:21 +02002730#if 0
2731 /* pshou 07/11/05 set a zero PCM sample to DAC when FIFO is
2732 * under-run
2733 */
Takashi Iwai98b24882014-08-18 13:47:50 +02002734 alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x80);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002735#endif
Takashi Iwai1d045db2011-07-07 18:23:21 +02002736 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2737
Takashi Iwaic9af7532019-05-10 11:01:43 +02002738 alc_pre_init(codec);
2739
Takashi Iwai1727a772013-01-10 09:52:52 +01002740 snd_hda_pick_fixup(codec, alc262_fixup_models, alc262_fixup_tbl,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002741 alc262_fixups);
Takashi Iwai1727a772013-01-10 09:52:52 +01002742 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002743
Takashi Iwaiaf741c12012-05-07 18:09:48 +02002744 alc_auto_parse_customize_define(codec);
2745
Takashi Iwai7504b6c2013-03-18 11:25:51 +01002746 if (has_cdefine_beep(codec))
2747 spec->gen.beep_nid = 0x01;
2748
Takashi Iwai42399f72011-11-07 17:18:44 +01002749 /* automatic parse from the BIOS config */
2750 err = alc262_parse_auto_config(codec);
2751 if (err < 0)
2752 goto error;
Takashi Iwai3e6179b2011-07-08 16:55:13 +02002753
Takashi Iwaifea80fa2018-06-20 12:52:46 +02002754 if (!spec->gen.no_analog && spec->gen.beep_nid) {
2755 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2756 if (err < 0)
2757 goto error;
2758 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02002759
Takashi Iwai1727a772013-01-10 09:52:52 +01002760 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01002761
Takashi Iwai1d045db2011-07-07 18:23:21 +02002762 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02002763
2764 error:
2765 alc_free(codec);
2766 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002767}
2768
2769/*
2770 * ALC268
2771 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02002772/* bind Beep switches of both NID 0x0f and 0x10 */
Takashi Iwaia7177772017-05-10 12:04:08 +02002773static int alc268_beep_switch_put(struct snd_kcontrol *kcontrol,
2774 struct snd_ctl_elem_value *ucontrol)
2775{
2776 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2777 unsigned long pval;
2778 int err;
2779
2780 mutex_lock(&codec->control_mutex);
2781 pval = kcontrol->private_value;
2782 kcontrol->private_value = (pval & ~0xff) | 0x0f;
2783 err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2784 if (err >= 0) {
2785 kcontrol->private_value = (pval & ~0xff) | 0x10;
2786 err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2787 }
2788 kcontrol->private_value = pval;
2789 mutex_unlock(&codec->control_mutex);
2790 return err;
2791}
Takashi Iwai1d045db2011-07-07 18:23:21 +02002792
2793static const struct snd_kcontrol_new alc268_beep_mixer[] = {
2794 HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
Takashi Iwaia7177772017-05-10 12:04:08 +02002795 {
2796 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2797 .name = "Beep Playback Switch",
2798 .subdevice = HDA_SUBDEV_AMP_FLAG,
2799 .info = snd_hda_mixer_amp_switch_info,
2800 .get = snd_hda_mixer_amp_switch_get,
2801 .put = alc268_beep_switch_put,
2802 .private_value = HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT)
2803 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02002804};
2805
2806/* set PCBEEP vol = 0, mute connections */
2807static const struct hda_verb alc268_beep_init_verbs[] = {
2808 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2809 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2810 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2811 { }
2812};
2813
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002814enum {
2815 ALC268_FIXUP_INV_DMIC,
Takashi Iwaicb766402012-10-20 10:55:21 +02002816 ALC268_FIXUP_HP_EAPD,
Takashi Iwai24eff322013-11-04 18:21:08 +01002817 ALC268_FIXUP_SPDIF,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002818};
2819
Takashi Iwai1727a772013-01-10 09:52:52 +01002820static const struct hda_fixup alc268_fixups[] = {
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002821 [ALC268_FIXUP_INV_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002822 .type = HDA_FIXUP_FUNC,
David Henningsson9d36a7d2014-10-07 10:18:42 +02002823 .v.func = alc_fixup_inv_dmic,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002824 },
Takashi Iwaicb766402012-10-20 10:55:21 +02002825 [ALC268_FIXUP_HP_EAPD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002826 .type = HDA_FIXUP_VERBS,
Takashi Iwaicb766402012-10-20 10:55:21 +02002827 .v.verbs = (const struct hda_verb[]) {
2828 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 0},
2829 {}
2830 }
2831 },
Takashi Iwai24eff322013-11-04 18:21:08 +01002832 [ALC268_FIXUP_SPDIF] = {
2833 .type = HDA_FIXUP_PINS,
2834 .v.pins = (const struct hda_pintbl[]) {
2835 { 0x1e, 0x014b1180 }, /* enable SPDIF out */
2836 {}
2837 }
2838 },
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002839};
2840
Takashi Iwai1727a772013-01-10 09:52:52 +01002841static const struct hda_model_fixup alc268_fixup_models[] = {
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002842 {.id = ALC268_FIXUP_INV_DMIC, .name = "inv-dmic"},
Takashi Iwaicb766402012-10-20 10:55:21 +02002843 {.id = ALC268_FIXUP_HP_EAPD, .name = "hp-eapd"},
Takashi Iwai03bf11c2018-06-26 16:56:41 +02002844 {.id = ALC268_FIXUP_SPDIF, .name = "spdif"},
Takashi Iwaicb766402012-10-20 10:55:21 +02002845 {}
2846};
2847
2848static const struct snd_pci_quirk alc268_fixup_tbl[] = {
Takashi Iwai24eff322013-11-04 18:21:08 +01002849 SND_PCI_QUIRK(0x1025, 0x0139, "Acer TravelMate 6293", ALC268_FIXUP_SPDIF),
David Henningssonfcd8f3b2013-01-28 05:45:47 +01002850 SND_PCI_QUIRK(0x1025, 0x015b, "Acer AOA 150 (ZG5)", ALC268_FIXUP_INV_DMIC),
Takashi Iwaicb766402012-10-20 10:55:21 +02002851 /* below is codec SSID since multiple Toshiba laptops have the
2852 * same PCI SSID 1179:ff00
2853 */
2854 SND_PCI_QUIRK(0x1179, 0xff06, "Toshiba P200", ALC268_FIXUP_HP_EAPD),
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002855 {}
2856};
2857
Takashi Iwai1d045db2011-07-07 18:23:21 +02002858/*
2859 * BIOS auto configuration
2860 */
2861static int alc268_parse_auto_config(struct hda_codec *codec)
2862{
Takashi Iwai3e6179b2011-07-08 16:55:13 +02002863 static const hda_nid_t alc268_ssids[] = { 0x15, 0x1b, 0x14, 0 };
Takashi Iwai7504b6c2013-03-18 11:25:51 +01002864 return alc_parse_auto_config(codec, NULL, alc268_ssids);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002865}
2866
Takashi Iwai1d045db2011-07-07 18:23:21 +02002867/*
2868 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02002869static int patch_alc268(struct hda_codec *codec)
2870{
2871 struct alc_spec *spec;
Takashi Iwaia5cb4632018-06-20 12:50:11 +02002872 int i, err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002873
Takashi Iwai1d045db2011-07-07 18:23:21 +02002874 /* ALC268 has no aa-loopback mixer */
Takashi Iwai3de95172012-05-07 18:03:15 +02002875 err = alc_alloc_spec(codec, 0);
2876 if (err < 0)
2877 return err;
2878
2879 spec = codec->spec;
Takashi Iwai2722b532019-08-22 09:55:37 +02002880 if (has_cdefine_beep(codec))
2881 spec->gen.beep_nid = 0x01;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002882
Takashi Iwai225068a2015-05-29 10:42:14 +02002883 spec->shutup = alc_eapd_shutup;
2884
Takashi Iwaic9af7532019-05-10 11:01:43 +02002885 alc_pre_init(codec);
2886
Takashi Iwai1727a772013-01-10 09:52:52 +01002887 snd_hda_pick_fixup(codec, alc268_fixup_models, alc268_fixup_tbl, alc268_fixups);
2888 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002889
Takashi Iwai6ebb8052011-08-16 15:15:40 +02002890 /* automatic parse from the BIOS config */
2891 err = alc268_parse_auto_config(codec);
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02002892 if (err < 0)
2893 goto error;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002894
Takashi Iwai7504b6c2013-03-18 11:25:51 +01002895 if (err > 0 && !spec->gen.no_analog &&
2896 spec->gen.autocfg.speaker_pins[0] != 0x1d) {
Takashi Iwaia5cb4632018-06-20 12:50:11 +02002897 for (i = 0; i < ARRAY_SIZE(alc268_beep_mixer); i++) {
2898 if (!snd_hda_gen_add_kctl(&spec->gen, NULL,
2899 &alc268_beep_mixer[i])) {
2900 err = -ENOMEM;
2901 goto error;
2902 }
2903 }
Takashi Iwai7504b6c2013-03-18 11:25:51 +01002904 snd_hda_add_verbs(codec, alc268_beep_init_verbs);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002905 if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
2906 /* override the amp caps for beep generator */
2907 snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
2908 (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
2909 (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
2910 (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
2911 (0 << AC_AMPCAP_MUTE_SHIFT));
2912 }
2913
Takashi Iwai1727a772013-01-10 09:52:52 +01002914 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002915
Takashi Iwai1d045db2011-07-07 18:23:21 +02002916 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02002917
2918 error:
2919 alc_free(codec);
2920 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002921}
2922
2923/*
2924 * ALC269
2925 */
Takashi Iwai08c189f2012-12-19 15:22:24 +01002926
Takashi Iwai1d045db2011-07-07 18:23:21 +02002927static const struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
Takashi Iwai1d045db2011-07-07 18:23:21 +02002928 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
Takashi Iwai1d045db2011-07-07 18:23:21 +02002929};
2930
2931static const struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
Takashi Iwai1d045db2011-07-07 18:23:21 +02002932 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
Takashi Iwai1d045db2011-07-07 18:23:21 +02002933};
2934
Takashi Iwai1d045db2011-07-07 18:23:21 +02002935/* different alc269-variants */
2936enum {
2937 ALC269_TYPE_ALC269VA,
2938 ALC269_TYPE_ALC269VB,
2939 ALC269_TYPE_ALC269VC,
Kailang Yangadcc70b2012-05-25 08:08:38 +02002940 ALC269_TYPE_ALC269VD,
Kailang Yang065380f2013-01-10 10:25:48 +01002941 ALC269_TYPE_ALC280,
2942 ALC269_TYPE_ALC282,
Kailang Yang2af02be2013-08-22 10:03:50 +02002943 ALC269_TYPE_ALC283,
Kailang Yang065380f2013-01-10 10:25:48 +01002944 ALC269_TYPE_ALC284,
Kailang Yang4731d5d2017-06-30 15:22:57 +08002945 ALC269_TYPE_ALC293,
Kailang Yang7fc7d042013-04-25 11:04:43 +02002946 ALC269_TYPE_ALC286,
Kailang Yang506b62c2014-12-18 17:07:44 +08002947 ALC269_TYPE_ALC298,
Kailang Yang1d04c9d2013-10-24 11:35:18 +02002948 ALC269_TYPE_ALC255,
Kailang Yang4344aec2014-12-17 17:39:05 +08002949 ALC269_TYPE_ALC256,
Kailang Yangf429e7e2017-12-05 15:38:24 +08002950 ALC269_TYPE_ALC257,
Kailang Yang0a6f0602017-06-30 16:00:48 +08002951 ALC269_TYPE_ALC215,
Kailang Yang42314302016-02-03 15:03:50 +08002952 ALC269_TYPE_ALC225,
Kailang Yangdcd4f0d2016-05-04 15:50:18 +08002953 ALC269_TYPE_ALC294,
Kailang Yang1078bef2018-11-08 16:36:15 +08002954 ALC269_TYPE_ALC300,
Kailang Yangf0778872019-10-24 15:13:32 +08002955 ALC269_TYPE_ALC623,
Kailang Yang6fbae352016-05-30 16:44:20 +08002956 ALC269_TYPE_ALC700,
Takashi Iwai1d045db2011-07-07 18:23:21 +02002957};
2958
2959/*
2960 * BIOS auto configuration
2961 */
2962static int alc269_parse_auto_config(struct hda_codec *codec)
2963{
Takashi Iwai1d045db2011-07-07 18:23:21 +02002964 static const hda_nid_t alc269_ignore[] = { 0x1d, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02002965 static const hda_nid_t alc269_ssids[] = { 0, 0x1b, 0x14, 0x21 };
2966 static const hda_nid_t alc269va_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2967 struct alc_spec *spec = codec->spec;
Kailang Yangadcc70b2012-05-25 08:08:38 +02002968 const hda_nid_t *ssids;
2969
2970 switch (spec->codec_variant) {
2971 case ALC269_TYPE_ALC269VA:
2972 case ALC269_TYPE_ALC269VC:
Kailang Yang065380f2013-01-10 10:25:48 +01002973 case ALC269_TYPE_ALC280:
2974 case ALC269_TYPE_ALC284:
Kailang Yang4731d5d2017-06-30 15:22:57 +08002975 case ALC269_TYPE_ALC293:
Kailang Yangadcc70b2012-05-25 08:08:38 +02002976 ssids = alc269va_ssids;
2977 break;
2978 case ALC269_TYPE_ALC269VB:
2979 case ALC269_TYPE_ALC269VD:
Kailang Yang065380f2013-01-10 10:25:48 +01002980 case ALC269_TYPE_ALC282:
Kailang Yang2af02be2013-08-22 10:03:50 +02002981 case ALC269_TYPE_ALC283:
Kailang Yang7fc7d042013-04-25 11:04:43 +02002982 case ALC269_TYPE_ALC286:
Kailang Yang506b62c2014-12-18 17:07:44 +08002983 case ALC269_TYPE_ALC298:
Kailang Yang1d04c9d2013-10-24 11:35:18 +02002984 case ALC269_TYPE_ALC255:
Kailang Yang4344aec2014-12-17 17:39:05 +08002985 case ALC269_TYPE_ALC256:
Kailang Yangf429e7e2017-12-05 15:38:24 +08002986 case ALC269_TYPE_ALC257:
Kailang Yang0a6f0602017-06-30 16:00:48 +08002987 case ALC269_TYPE_ALC215:
Kailang Yang42314302016-02-03 15:03:50 +08002988 case ALC269_TYPE_ALC225:
Kailang Yangdcd4f0d2016-05-04 15:50:18 +08002989 case ALC269_TYPE_ALC294:
Kailang Yang1078bef2018-11-08 16:36:15 +08002990 case ALC269_TYPE_ALC300:
Kailang Yangf0778872019-10-24 15:13:32 +08002991 case ALC269_TYPE_ALC623:
Kailang Yang6fbae352016-05-30 16:44:20 +08002992 case ALC269_TYPE_ALC700:
Kailang Yangadcc70b2012-05-25 08:08:38 +02002993 ssids = alc269_ssids;
2994 break;
2995 default:
2996 ssids = alc269_ssids;
2997 break;
2998 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02002999
Takashi Iwai3e6179b2011-07-08 16:55:13 +02003000 return alc_parse_auto_config(codec, alc269_ignore, ssids);
Takashi Iwai1d045db2011-07-07 18:23:21 +02003001}
3002
Hui Wang476c02e2020-03-29 16:20:18 +08003003static const struct hda_jack_keymap alc_headset_btn_keymap[] = {
3004 { SND_JACK_BTN_0, KEY_PLAYPAUSE },
3005 { SND_JACK_BTN_1, KEY_VOICECOMMAND },
3006 { SND_JACK_BTN_2, KEY_VOLUMEUP },
3007 { SND_JACK_BTN_3, KEY_VOLUMEDOWN },
3008 {}
3009};
3010
3011static void alc_headset_btn_callback(struct hda_codec *codec,
3012 struct hda_jack_callback *jack)
3013{
3014 int report = 0;
3015
3016 if (jack->unsol_res & (7 << 13))
3017 report |= SND_JACK_BTN_0;
3018
3019 if (jack->unsol_res & (1 << 16 | 3 << 8))
3020 report |= SND_JACK_BTN_1;
3021
3022 /* Volume up key */
3023 if (jack->unsol_res & (7 << 23))
3024 report |= SND_JACK_BTN_2;
3025
3026 /* Volume down key */
3027 if (jack->unsol_res & (7 << 10))
3028 report |= SND_JACK_BTN_3;
3029
3030 jack->jack->button_state = report;
3031}
3032
3033static void alc_disable_headset_jack_key(struct hda_codec *codec)
3034{
3035 struct alc_spec *spec = codec->spec;
3036
3037 if (!spec->has_hs_key)
3038 return;
3039
3040 switch (codec->core.vendor_id) {
3041 case 0x10ec0215:
3042 case 0x10ec0225:
3043 case 0x10ec0285:
3044 case 0x10ec0295:
3045 case 0x10ec0289:
3046 case 0x10ec0299:
3047 alc_write_coef_idx(codec, 0x48, 0x0);
3048 alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3049 alc_update_coef_idx(codec, 0x44, 0x0045 << 8, 0x0);
3050 break;
3051 case 0x10ec0236:
3052 case 0x10ec0256:
3053 alc_write_coef_idx(codec, 0x48, 0x0);
3054 alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3055 break;
3056 }
3057}
3058
3059static void alc_enable_headset_jack_key(struct hda_codec *codec)
3060{
3061 struct alc_spec *spec = codec->spec;
3062
3063 if (!spec->has_hs_key)
3064 return;
3065
3066 switch (codec->core.vendor_id) {
3067 case 0x10ec0215:
3068 case 0x10ec0225:
3069 case 0x10ec0285:
3070 case 0x10ec0295:
3071 case 0x10ec0289:
3072 case 0x10ec0299:
3073 alc_write_coef_idx(codec, 0x48, 0xd011);
3074 alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3075 alc_update_coef_idx(codec, 0x44, 0x007f << 8, 0x0045 << 8);
3076 break;
3077 case 0x10ec0236:
3078 case 0x10ec0256:
3079 alc_write_coef_idx(codec, 0x48, 0xd011);
3080 alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3081 break;
3082 }
3083}
3084
3085static void alc_fixup_headset_jack(struct hda_codec *codec,
3086 const struct hda_fixup *fix, int action)
3087{
3088 struct alc_spec *spec = codec->spec;
3089
3090 switch (action) {
3091 case HDA_FIXUP_ACT_PRE_PROBE:
3092 spec->has_hs_key = 1;
3093 snd_hda_jack_detect_enable_callback(codec, 0x55,
3094 alc_headset_btn_callback);
3095 snd_hda_jack_add_kctl(codec, 0x55, "Headset Jack", false,
3096 SND_JACK_HEADSET, alc_headset_btn_keymap);
3097 break;
3098 case HDA_FIXUP_ACT_INIT:
3099 alc_enable_headset_jack_key(codec);
3100 break;
3101 }
3102}
3103
Kailang Yang1387e2d2012-11-08 10:23:18 +01003104static void alc269vb_toggle_power_output(struct hda_codec *codec, int power_up)
Takashi Iwai1d045db2011-07-07 18:23:21 +02003105{
Takashi Iwai98b24882014-08-18 13:47:50 +02003106 alc_update_coef_idx(codec, 0x04, 1 << 11, power_up ? (1 << 11) : 0);
Takashi Iwai1d045db2011-07-07 18:23:21 +02003107}
3108
3109static void alc269_shutup(struct hda_codec *codec)
3110{
Kailang Yangadcc70b2012-05-25 08:08:38 +02003111 struct alc_spec *spec = codec->spec;
3112
Kailang Yang1387e2d2012-11-08 10:23:18 +01003113 if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3114 alc269vb_toggle_power_output(codec, 0);
3115 if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
3116 (alc_get_coef0(codec) & 0x00ff) == 0x018) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02003117 msleep(150);
3118 }
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003119 alc_shutup_pins(codec);
Takashi Iwai1d045db2011-07-07 18:23:21 +02003120}
3121
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01003122static const struct coef_fw alc282_coefs[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02003123 WRITE_COEF(0x03, 0x0002), /* Power Down Control */
Kailang Yang32fa7e42014-10-24 16:26:01 +08003124 UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
Takashi Iwai54db6c32014-08-18 15:11:19 +02003125 WRITE_COEF(0x07, 0x0200), /* DMIC control */
3126 UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
3127 UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
3128 WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
3129 WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
3130 WRITE_COEF(0x0e, 0x6e00), /* LDO1/2/3, DAC/ADC */
3131 UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
3132 UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
3133 WRITE_COEF(0x6f, 0x0), /* Class D test 4 */
3134 UPDATE_COEF(0x0c, 0xfe00, 0), /* IO power down directly */
3135 WRITE_COEF(0x34, 0xa0c0), /* ANC */
3136 UPDATE_COEF(0x16, 0x0008, 0), /* AGC MUX */
3137 UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
3138 UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
3139 WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
3140 WRITE_COEF(0x63, 0x2902), /* PLL */
3141 WRITE_COEF(0x68, 0xa080), /* capless control 2 */
3142 WRITE_COEF(0x69, 0x3400), /* capless control 3 */
3143 WRITE_COEF(0x6a, 0x2f3e), /* capless control 4 */
3144 WRITE_COEF(0x6b, 0x0), /* capless control 5 */
3145 UPDATE_COEF(0x6d, 0x0fff, 0x0900), /* class D test 2 */
3146 WRITE_COEF(0x6e, 0x110a), /* class D test 3 */
3147 UPDATE_COEF(0x70, 0x00f8, 0x00d8), /* class D test 5 */
3148 WRITE_COEF(0x71, 0x0014), /* class D test 6 */
3149 WRITE_COEF(0x72, 0xc2ba), /* classD OCP */
3150 UPDATE_COEF(0x77, 0x0f80, 0), /* classD pure DC test */
3151 WRITE_COEF(0x6c, 0xfc06), /* Class D amp control */
3152 {}
3153};
3154
Kailang Yangcb149cb2014-03-18 16:45:32 +08003155static void alc282_restore_default_value(struct hda_codec *codec)
3156{
Takashi Iwai54db6c32014-08-18 15:11:19 +02003157 alc_process_coef_fw(codec, alc282_coefs);
Kailang Yangcb149cb2014-03-18 16:45:32 +08003158}
3159
Kailang Yang7b5c7a02014-03-18 16:15:54 +08003160static void alc282_init(struct hda_codec *codec)
3161{
3162 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003163 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang7b5c7a02014-03-18 16:15:54 +08003164 bool hp_pin_sense;
3165 int coef78;
3166
Kailang Yangcb149cb2014-03-18 16:45:32 +08003167 alc282_restore_default_value(codec);
3168
Kailang Yang7b5c7a02014-03-18 16:15:54 +08003169 if (!hp_pin)
3170 return;
3171 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3172 coef78 = alc_read_coef_idx(codec, 0x78);
3173
3174 /* Index 0x78 Direct Drive HP AMP LPM Control 1 */
3175 /* Headphone capless set to high power mode */
3176 alc_write_coef_idx(codec, 0x78, 0x9004);
3177
3178 if (hp_pin_sense)
3179 msleep(2);
3180
3181 snd_hda_codec_write(codec, hp_pin, 0,
3182 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3183
3184 if (hp_pin_sense)
3185 msleep(85);
3186
3187 snd_hda_codec_write(codec, hp_pin, 0,
3188 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3189
3190 if (hp_pin_sense)
3191 msleep(100);
3192
3193 /* Headphone capless set to normal mode */
3194 alc_write_coef_idx(codec, 0x78, coef78);
3195}
3196
3197static void alc282_shutup(struct hda_codec *codec)
3198{
3199 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003200 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang7b5c7a02014-03-18 16:15:54 +08003201 bool hp_pin_sense;
3202 int coef78;
3203
3204 if (!hp_pin) {
3205 alc269_shutup(codec);
3206 return;
3207 }
3208
3209 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3210 coef78 = alc_read_coef_idx(codec, 0x78);
3211 alc_write_coef_idx(codec, 0x78, 0x9004);
3212
3213 if (hp_pin_sense)
3214 msleep(2);
3215
3216 snd_hda_codec_write(codec, hp_pin, 0,
3217 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3218
3219 if (hp_pin_sense)
3220 msleep(85);
3221
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003222 if (!spec->no_shutup_pins)
3223 snd_hda_codec_write(codec, hp_pin, 0,
3224 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
Kailang Yang7b5c7a02014-03-18 16:15:54 +08003225
3226 if (hp_pin_sense)
3227 msleep(100);
3228
3229 alc_auto_setup_eapd(codec, false);
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003230 alc_shutup_pins(codec);
Kailang Yang7b5c7a02014-03-18 16:15:54 +08003231 alc_write_coef_idx(codec, 0x78, coef78);
3232}
3233
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01003234static const struct coef_fw alc283_coefs[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02003235 WRITE_COEF(0x03, 0x0002), /* Power Down Control */
Kailang Yang56779862014-10-24 16:17:51 +08003236 UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
Takashi Iwai54db6c32014-08-18 15:11:19 +02003237 WRITE_COEF(0x07, 0x0200), /* DMIC control */
3238 UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
3239 UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
3240 WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
3241 WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
3242 WRITE_COEF(0x0e, 0x6fc0), /* LDO1/2/3, DAC/ADC */
3243 UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
3244 UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
3245 WRITE_COEF(0x3a, 0x0), /* Class D test 4 */
3246 UPDATE_COEF(0x0c, 0xfe00, 0x0), /* IO power down directly */
3247 WRITE_COEF(0x22, 0xa0c0), /* ANC */
3248 UPDATE_COEFEX(0x53, 0x01, 0x000f, 0x0008), /* AGC MUX */
3249 UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
3250 UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
3251 WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
3252 WRITE_COEF(0x2e, 0x2902), /* PLL */
3253 WRITE_COEF(0x33, 0xa080), /* capless control 2 */
3254 WRITE_COEF(0x34, 0x3400), /* capless control 3 */
3255 WRITE_COEF(0x35, 0x2f3e), /* capless control 4 */
3256 WRITE_COEF(0x36, 0x0), /* capless control 5 */
3257 UPDATE_COEF(0x38, 0x0fff, 0x0900), /* class D test 2 */
3258 WRITE_COEF(0x39, 0x110a), /* class D test 3 */
3259 UPDATE_COEF(0x3b, 0x00f8, 0x00d8), /* class D test 5 */
3260 WRITE_COEF(0x3c, 0x0014), /* class D test 6 */
3261 WRITE_COEF(0x3d, 0xc2ba), /* classD OCP */
3262 UPDATE_COEF(0x42, 0x0f80, 0x0), /* classD pure DC test */
3263 WRITE_COEF(0x49, 0x0), /* test mode */
3264 UPDATE_COEF(0x40, 0xf800, 0x9800), /* Class D DC enable */
3265 UPDATE_COEF(0x42, 0xf000, 0x2000), /* DC offset */
3266 WRITE_COEF(0x37, 0xfc06), /* Class D amp control */
Kailang Yang56779862014-10-24 16:17:51 +08003267 UPDATE_COEF(0x1b, 0x8000, 0), /* HP JD control */
Takashi Iwai54db6c32014-08-18 15:11:19 +02003268 {}
3269};
3270
Kailang Yang6bd55b02014-03-17 13:51:27 +08003271static void alc283_restore_default_value(struct hda_codec *codec)
3272{
Takashi Iwai54db6c32014-08-18 15:11:19 +02003273 alc_process_coef_fw(codec, alc283_coefs);
Kailang Yang6bd55b02014-03-17 13:51:27 +08003274}
3275
Kailang Yang2af02be2013-08-22 10:03:50 +02003276static void alc283_init(struct hda_codec *codec)
3277{
3278 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003279 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang2af02be2013-08-22 10:03:50 +02003280 bool hp_pin_sense;
Kailang Yang2af02be2013-08-22 10:03:50 +02003281
Kailang Yang6bd55b02014-03-17 13:51:27 +08003282 alc283_restore_default_value(codec);
3283
Kailang Yang2af02be2013-08-22 10:03:50 +02003284 if (!hp_pin)
3285 return;
Kailang Yanga59d7192015-04-08 16:34:00 +08003286
3287 msleep(30);
Kailang Yang2af02be2013-08-22 10:03:50 +02003288 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3289
3290 /* Index 0x43 Direct Drive HP AMP LPM Control 1 */
3291 /* Headphone capless set to high power mode */
3292 alc_write_coef_idx(codec, 0x43, 0x9004);
3293
3294 snd_hda_codec_write(codec, hp_pin, 0,
3295 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3296
3297 if (hp_pin_sense)
3298 msleep(85);
3299
3300 snd_hda_codec_write(codec, hp_pin, 0,
3301 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3302
3303 if (hp_pin_sense)
3304 msleep(85);
3305 /* Index 0x46 Combo jack auto switch control 2 */
3306 /* 3k pull low control for Headset jack. */
Takashi Iwai98b24882014-08-18 13:47:50 +02003307 alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
Kailang Yang2af02be2013-08-22 10:03:50 +02003308 /* Headphone capless set to normal mode */
3309 alc_write_coef_idx(codec, 0x43, 0x9614);
3310}
3311
3312static void alc283_shutup(struct hda_codec *codec)
3313{
3314 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003315 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang2af02be2013-08-22 10:03:50 +02003316 bool hp_pin_sense;
Kailang Yang2af02be2013-08-22 10:03:50 +02003317
3318 if (!hp_pin) {
3319 alc269_shutup(codec);
3320 return;
3321 }
3322
3323 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3324
3325 alc_write_coef_idx(codec, 0x43, 0x9004);
3326
Harsha Priyab450b172014-10-09 11:04:56 +00003327 /*depop hp during suspend*/
3328 alc_write_coef_idx(codec, 0x06, 0x2100);
3329
Kailang Yang2af02be2013-08-22 10:03:50 +02003330 snd_hda_codec_write(codec, hp_pin, 0,
3331 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3332
3333 if (hp_pin_sense)
Kailang Yang88011c092013-10-24 15:45:24 +02003334 msleep(100);
Kailang Yang2af02be2013-08-22 10:03:50 +02003335
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003336 if (!spec->no_shutup_pins)
3337 snd_hda_codec_write(codec, hp_pin, 0,
3338 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
Kailang Yang2af02be2013-08-22 10:03:50 +02003339
Takashi Iwai98b24882014-08-18 13:47:50 +02003340 alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
Kailang Yang2af02be2013-08-22 10:03:50 +02003341
3342 if (hp_pin_sense)
Kailang Yang88011c092013-10-24 15:45:24 +02003343 msleep(100);
Kailang Yang0435b3f2014-04-08 17:14:14 +08003344 alc_auto_setup_eapd(codec, false);
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003345 alc_shutup_pins(codec);
Kailang Yang2af02be2013-08-22 10:03:50 +02003346 alc_write_coef_idx(codec, 0x43, 0x9614);
3347}
3348
Kailang Yang4a219ef2017-06-16 16:54:35 +08003349static void alc256_init(struct hda_codec *codec)
3350{
3351 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003352 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang4a219ef2017-06-16 16:54:35 +08003353 bool hp_pin_sense;
3354
3355 if (!hp_pin)
Kailang Yang6447c962019-05-08 16:27:03 +08003356 hp_pin = 0x21;
Kailang Yang4a219ef2017-06-16 16:54:35 +08003357
3358 msleep(30);
3359
3360 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3361
3362 if (hp_pin_sense)
3363 msleep(2);
3364
3365 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
Kailang Yang6447c962019-05-08 16:27:03 +08003366 if (spec->ultra_low_power) {
3367 alc_update_coef_idx(codec, 0x03, 1<<1, 1<<1);
3368 alc_update_coef_idx(codec, 0x08, 3<<2, 3<<2);
3369 alc_update_coef_idx(codec, 0x08, 7<<4, 0);
3370 alc_update_coef_idx(codec, 0x3b, 1<<15, 0);
3371 alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3372 msleep(30);
3373 }
Kailang Yang4a219ef2017-06-16 16:54:35 +08003374
3375 snd_hda_codec_write(codec, hp_pin, 0,
3376 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3377
Kailang Yang6447c962019-05-08 16:27:03 +08003378 if (hp_pin_sense || spec->ultra_low_power)
Kailang Yang4a219ef2017-06-16 16:54:35 +08003379 msleep(85);
3380
3381 snd_hda_codec_write(codec, hp_pin, 0,
3382 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3383
Kailang Yang6447c962019-05-08 16:27:03 +08003384 if (hp_pin_sense || spec->ultra_low_power)
Kailang Yang4a219ef2017-06-16 16:54:35 +08003385 msleep(100);
3386
3387 alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
3388 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
Kailang Yang88d42b22018-03-14 16:08:57 +08003389 alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15); /* Clear bit */
3390 alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15);
Thomas Hebbc4473742020-03-30 12:09:38 -04003391 /*
3392 * Expose headphone mic (or possibly Line In on some machines) instead
3393 * of PC Beep on 1Ah, and disable 1Ah loopback for all outputs. See
3394 * Documentation/sound/hd-audio/realtek-pc-beep.rst for details of
3395 * this register.
3396 */
3397 alc_write_coef_idx(codec, 0x36, 0x5757);
Kailang Yang4a219ef2017-06-16 16:54:35 +08003398}
3399
3400static void alc256_shutup(struct hda_codec *codec)
3401{
3402 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003403 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang4a219ef2017-06-16 16:54:35 +08003404 bool hp_pin_sense;
3405
Kailang Yang6447c962019-05-08 16:27:03 +08003406 if (!hp_pin)
3407 hp_pin = 0x21;
Kailang Yang4a219ef2017-06-16 16:54:35 +08003408
3409 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3410
3411 if (hp_pin_sense)
3412 msleep(2);
3413
3414 snd_hda_codec_write(codec, hp_pin, 0,
3415 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3416
Kailang Yang6447c962019-05-08 16:27:03 +08003417 if (hp_pin_sense || spec->ultra_low_power)
Kailang Yang4a219ef2017-06-16 16:54:35 +08003418 msleep(85);
3419
Takashi Iwai1c9609e2018-01-19 14:18:34 +01003420 /* 3k pull low control for Headset jack. */
3421 /* NOTE: call this before clearing the pin, otherwise codec stalls */
3422 alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
3423
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003424 if (!spec->no_shutup_pins)
3425 snd_hda_codec_write(codec, hp_pin, 0,
3426 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
Kailang Yang4a219ef2017-06-16 16:54:35 +08003427
Kailang Yang6447c962019-05-08 16:27:03 +08003428 if (hp_pin_sense || spec->ultra_low_power)
Kailang Yang4a219ef2017-06-16 16:54:35 +08003429 msleep(100);
3430
3431 alc_auto_setup_eapd(codec, false);
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003432 alc_shutup_pins(codec);
Kailang Yang6447c962019-05-08 16:27:03 +08003433 if (spec->ultra_low_power) {
3434 msleep(50);
3435 alc_update_coef_idx(codec, 0x03, 1<<1, 0);
3436 alc_update_coef_idx(codec, 0x08, 7<<4, 7<<4);
3437 alc_update_coef_idx(codec, 0x08, 3<<2, 0);
3438 alc_update_coef_idx(codec, 0x3b, 1<<15, 1<<15);
3439 alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3440 msleep(30);
3441 }
Kailang Yang4a219ef2017-06-16 16:54:35 +08003442}
3443
Kailang Yangda911b12018-01-05 16:50:08 +08003444static void alc225_init(struct hda_codec *codec)
3445{
3446 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003447 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yangda911b12018-01-05 16:50:08 +08003448 bool hp1_pin_sense, hp2_pin_sense;
3449
3450 if (!hp_pin)
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003451 hp_pin = 0x21;
Kailang Yangda911b12018-01-05 16:50:08 +08003452 msleep(30);
3453
3454 hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3455 hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3456
3457 if (hp1_pin_sense || hp2_pin_sense)
3458 msleep(2);
3459
3460 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003461 if (spec->ultra_low_power) {
3462 alc_update_coef_idx(codec, 0x08, 0x0f << 2, 3<<2);
3463 alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3464 alc_update_coef_idx(codec, 0x33, 1<<11, 0);
3465 msleep(30);
3466 }
Kailang Yangda911b12018-01-05 16:50:08 +08003467
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003468 if (hp1_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003469 snd_hda_codec_write(codec, hp_pin, 0,
3470 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3471 if (hp2_pin_sense)
3472 snd_hda_codec_write(codec, 0x16, 0,
3473 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3474
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003475 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003476 msleep(85);
3477
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003478 if (hp1_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003479 snd_hda_codec_write(codec, hp_pin, 0,
3480 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3481 if (hp2_pin_sense)
3482 snd_hda_codec_write(codec, 0x16, 0,
3483 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3484
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003485 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003486 msleep(100);
3487
3488 alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3489 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
3490}
3491
3492static void alc225_shutup(struct hda_codec *codec)
3493{
3494 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003495 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yangda911b12018-01-05 16:50:08 +08003496 bool hp1_pin_sense, hp2_pin_sense;
3497
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003498 if (!hp_pin)
3499 hp_pin = 0x21;
Hui Wang476c02e2020-03-29 16:20:18 +08003500
3501 alc_disable_headset_jack_key(codec);
Kailang Yangda911b12018-01-05 16:50:08 +08003502 /* 3k pull low control for Headset jack. */
3503 alc_update_coef_idx(codec, 0x4a, 0, 3 << 10);
3504
3505 hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3506 hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3507
3508 if (hp1_pin_sense || hp2_pin_sense)
3509 msleep(2);
3510
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003511 if (hp1_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003512 snd_hda_codec_write(codec, hp_pin, 0,
3513 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3514 if (hp2_pin_sense)
3515 snd_hda_codec_write(codec, 0x16, 0,
3516 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3517
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003518 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003519 msleep(85);
3520
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003521 if (hp1_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003522 snd_hda_codec_write(codec, hp_pin, 0,
3523 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3524 if (hp2_pin_sense)
3525 snd_hda_codec_write(codec, 0x16, 0,
3526 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3527
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003528 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003529 msleep(100);
3530
3531 alc_auto_setup_eapd(codec, false);
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003532 alc_shutup_pins(codec);
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003533 if (spec->ultra_low_power) {
3534 msleep(50);
3535 alc_update_coef_idx(codec, 0x08, 0x0f << 2, 0x0c << 2);
3536 alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3537 alc_update_coef_idx(codec, 0x33, 1<<11, 1<<11);
3538 alc_update_coef_idx(codec, 0x4a, 3<<4, 2<<4);
3539 msleep(30);
3540 }
Hui Wang476c02e2020-03-29 16:20:18 +08003541
3542 alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3543 alc_enable_headset_jack_key(codec);
Kailang Yangda911b12018-01-05 16:50:08 +08003544}
3545
Kailang Yangc2d6af52017-06-21 14:50:54 +08003546static void alc_default_init(struct hda_codec *codec)
3547{
3548 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003549 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yangc2d6af52017-06-21 14:50:54 +08003550 bool hp_pin_sense;
3551
3552 if (!hp_pin)
3553 return;
3554
3555 msleep(30);
3556
3557 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3558
3559 if (hp_pin_sense)
3560 msleep(2);
3561
3562 snd_hda_codec_write(codec, hp_pin, 0,
3563 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3564
3565 if (hp_pin_sense)
3566 msleep(85);
3567
3568 snd_hda_codec_write(codec, hp_pin, 0,
3569 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3570
3571 if (hp_pin_sense)
3572 msleep(100);
3573}
3574
3575static void alc_default_shutup(struct hda_codec *codec)
3576{
3577 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003578 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yangc2d6af52017-06-21 14:50:54 +08003579 bool hp_pin_sense;
3580
3581 if (!hp_pin) {
3582 alc269_shutup(codec);
3583 return;
3584 }
3585
3586 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3587
3588 if (hp_pin_sense)
3589 msleep(2);
3590
3591 snd_hda_codec_write(codec, hp_pin, 0,
3592 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3593
3594 if (hp_pin_sense)
3595 msleep(85);
3596
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003597 if (!spec->no_shutup_pins)
3598 snd_hda_codec_write(codec, hp_pin, 0,
3599 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
Kailang Yangc2d6af52017-06-21 14:50:54 +08003600
3601 if (hp_pin_sense)
3602 msleep(100);
3603
3604 alc_auto_setup_eapd(codec, false);
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003605 alc_shutup_pins(codec);
Kailang Yangc2d6af52017-06-21 14:50:54 +08003606}
3607
Kailang Yang693abe12019-01-29 15:38:21 +08003608static void alc294_hp_init(struct hda_codec *codec)
3609{
3610 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003611 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang693abe12019-01-29 15:38:21 +08003612 int i, val;
3613
3614 if (!hp_pin)
3615 return;
3616
3617 snd_hda_codec_write(codec, hp_pin, 0,
3618 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3619
3620 msleep(100);
3621
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003622 if (!spec->no_shutup_pins)
3623 snd_hda_codec_write(codec, hp_pin, 0,
3624 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
Kailang Yang693abe12019-01-29 15:38:21 +08003625
3626 alc_update_coef_idx(codec, 0x6f, 0x000f, 0);/* Set HP depop to manual mode */
3627 alc_update_coefex_idx(codec, 0x58, 0x00, 0x8000, 0x8000); /* HP depop procedure start */
3628
3629 /* Wait for depop procedure finish */
3630 val = alc_read_coefex_idx(codec, 0x58, 0x01);
3631 for (i = 0; i < 20 && val & 0x0080; i++) {
3632 msleep(50);
3633 val = alc_read_coefex_idx(codec, 0x58, 0x01);
3634 }
3635 /* Set HP depop to auto mode */
3636 alc_update_coef_idx(codec, 0x6f, 0x000f, 0x000b);
3637 msleep(50);
3638}
3639
3640static void alc294_init(struct hda_codec *codec)
3641{
3642 struct alc_spec *spec = codec->spec;
3643
Takashi Iwaif6ef4e02019-01-29 14:14:51 +01003644 /* required only at boot or S4 resume time */
3645 if (!spec->done_hp_init ||
3646 codec->core.dev.power.power_state.event == PM_EVENT_RESTORE) {
Kailang Yang693abe12019-01-29 15:38:21 +08003647 alc294_hp_init(codec);
3648 spec->done_hp_init = true;
3649 }
3650 alc_default_init(codec);
3651}
3652
Kailang Yangad60d502013-06-28 12:03:01 +02003653static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg,
3654 unsigned int val)
3655{
3656 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3657 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val & 0xffff); /* LSB */
3658 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val >> 16); /* MSB */
3659}
3660
3661static int alc5505_coef_get(struct hda_codec *codec, unsigned int index_reg)
3662{
3663 unsigned int val;
3664
3665 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3666 val = snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3667 & 0xffff;
3668 val |= snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3669 << 16;
3670 return val;
3671}
3672
3673static void alc5505_dsp_halt(struct hda_codec *codec)
3674{
3675 unsigned int val;
3676
3677 alc5505_coef_set(codec, 0x3000, 0x000c); /* DSP CPU stop */
3678 alc5505_coef_set(codec, 0x880c, 0x0008); /* DDR enter self refresh */
3679 alc5505_coef_set(codec, 0x61c0, 0x11110080); /* Clock control for PLL and CPU */
3680 alc5505_coef_set(codec, 0x6230, 0xfc0d4011); /* Disable Input OP */
3681 alc5505_coef_set(codec, 0x61b4, 0x040a2b03); /* Stop PLL2 */
3682 alc5505_coef_set(codec, 0x61b0, 0x00005b17); /* Stop PLL1 */
3683 alc5505_coef_set(codec, 0x61b8, 0x04133303); /* Stop PLL3 */
3684 val = alc5505_coef_get(codec, 0x6220);
3685 alc5505_coef_set(codec, 0x6220, (val | 0x3000)); /* switch Ringbuffer clock to DBUS clock */
3686}
3687
3688static void alc5505_dsp_back_from_halt(struct hda_codec *codec)
3689{
3690 alc5505_coef_set(codec, 0x61b8, 0x04133302);
3691 alc5505_coef_set(codec, 0x61b0, 0x00005b16);
3692 alc5505_coef_set(codec, 0x61b4, 0x040a2b02);
3693 alc5505_coef_set(codec, 0x6230, 0xf80d4011);
3694 alc5505_coef_set(codec, 0x6220, 0x2002010f);
3695 alc5505_coef_set(codec, 0x880c, 0x00000004);
3696}
3697
3698static void alc5505_dsp_init(struct hda_codec *codec)
3699{
3700 unsigned int val;
3701
3702 alc5505_dsp_halt(codec);
3703 alc5505_dsp_back_from_halt(codec);
3704 alc5505_coef_set(codec, 0x61b0, 0x5b14); /* PLL1 control */
3705 alc5505_coef_set(codec, 0x61b0, 0x5b16);
3706 alc5505_coef_set(codec, 0x61b4, 0x04132b00); /* PLL2 control */
3707 alc5505_coef_set(codec, 0x61b4, 0x04132b02);
3708 alc5505_coef_set(codec, 0x61b8, 0x041f3300); /* PLL3 control*/
3709 alc5505_coef_set(codec, 0x61b8, 0x041f3302);
3710 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_CODEC_RESET, 0); /* Function reset */
3711 alc5505_coef_set(codec, 0x61b8, 0x041b3302);
3712 alc5505_coef_set(codec, 0x61b8, 0x04173302);
3713 alc5505_coef_set(codec, 0x61b8, 0x04163302);
3714 alc5505_coef_set(codec, 0x8800, 0x348b328b); /* DRAM control */
3715 alc5505_coef_set(codec, 0x8808, 0x00020022); /* DRAM control */
3716 alc5505_coef_set(codec, 0x8818, 0x00000400); /* DRAM control */
3717
3718 val = alc5505_coef_get(codec, 0x6200) >> 16; /* Read revision ID */
3719 if (val <= 3)
3720 alc5505_coef_set(codec, 0x6220, 0x2002010f); /* I/O PAD Configuration */
3721 else
3722 alc5505_coef_set(codec, 0x6220, 0x6002018f);
3723
3724 alc5505_coef_set(codec, 0x61ac, 0x055525f0); /**/
3725 alc5505_coef_set(codec, 0x61c0, 0x12230080); /* Clock control */
3726 alc5505_coef_set(codec, 0x61b4, 0x040e2b02); /* PLL2 control */
3727 alc5505_coef_set(codec, 0x61bc, 0x010234f8); /* OSC Control */
3728 alc5505_coef_set(codec, 0x880c, 0x00000004); /* DRAM Function control */
3729 alc5505_coef_set(codec, 0x880c, 0x00000003);
3730 alc5505_coef_set(codec, 0x880c, 0x00000010);
Takashi Iwaicd63a5f2013-07-05 12:13:59 +02003731
3732#ifdef HALT_REALTEK_ALC5505
3733 alc5505_dsp_halt(codec);
3734#endif
Kailang Yangad60d502013-06-28 12:03:01 +02003735}
3736
Takashi Iwaicd63a5f2013-07-05 12:13:59 +02003737#ifdef HALT_REALTEK_ALC5505
Pierre-Louis Bossart8a718212020-01-11 15:47:35 -06003738#define alc5505_dsp_suspend(codec) do { } while (0) /* NOP */
3739#define alc5505_dsp_resume(codec) do { } while (0) /* NOP */
Takashi Iwaicd63a5f2013-07-05 12:13:59 +02003740#else
3741#define alc5505_dsp_suspend(codec) alc5505_dsp_halt(codec)
3742#define alc5505_dsp_resume(codec) alc5505_dsp_back_from_halt(codec)
3743#endif
3744
Takashi Iwai2a439522011-07-26 09:52:50 +02003745#ifdef CONFIG_PM
Kailang Yangad60d502013-06-28 12:03:01 +02003746static int alc269_suspend(struct hda_codec *codec)
3747{
3748 struct alc_spec *spec = codec->spec;
3749
3750 if (spec->has_alc5505_dsp)
Takashi Iwaicd63a5f2013-07-05 12:13:59 +02003751 alc5505_dsp_suspend(codec);
Kailang Yangad60d502013-06-28 12:03:01 +02003752 return alc_suspend(codec);
3753}
3754
Takashi Iwai1d045db2011-07-07 18:23:21 +02003755static int alc269_resume(struct hda_codec *codec)
3756{
Kailang Yangadcc70b2012-05-25 08:08:38 +02003757 struct alc_spec *spec = codec->spec;
3758
Kailang Yang1387e2d2012-11-08 10:23:18 +01003759 if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3760 alc269vb_toggle_power_output(codec, 0);
3761 if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
Kailang Yangadcc70b2012-05-25 08:08:38 +02003762 (alc_get_coef0(codec) & 0x00ff) == 0x018) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02003763 msleep(150);
3764 }
3765
3766 codec->patch_ops.init(codec);
3767
Kailang Yang1387e2d2012-11-08 10:23:18 +01003768 if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3769 alc269vb_toggle_power_output(codec, 1);
3770 if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
Kailang Yangadcc70b2012-05-25 08:08:38 +02003771 (alc_get_coef0(codec) & 0x00ff) == 0x017) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02003772 msleep(200);
3773 }
3774
Takashi Iwai1a462be2020-01-09 10:01:04 +01003775 snd_hda_regmap_sync(codec);
Takashi Iwai1d045db2011-07-07 18:23:21 +02003776 hda_call_check_power_status(codec, 0x01);
Hui Wangf4753712014-08-19 12:07:03 +08003777
3778 /* on some machine, the BIOS will clear the codec gpio data when enter
3779 * suspend, and won't restore the data after resume, so we restore it
3780 * in the driver.
3781 */
Takashi Iwaid261eec2018-06-19 22:32:29 +02003782 if (spec->gpio_data)
3783 alc_write_gpio_data(codec);
Hui Wangf4753712014-08-19 12:07:03 +08003784
Kailang Yangad60d502013-06-28 12:03:01 +02003785 if (spec->has_alc5505_dsp)
Takashi Iwaicd63a5f2013-07-05 12:13:59 +02003786 alc5505_dsp_resume(codec);
Kailang Yangc5177c82013-07-24 14:39:49 +02003787
Takashi Iwai1d045db2011-07-07 18:23:21 +02003788 return 0;
3789}
Takashi Iwai2a439522011-07-26 09:52:50 +02003790#endif /* CONFIG_PM */
Takashi Iwai1d045db2011-07-07 18:23:21 +02003791
David Henningsson108cc102012-07-20 10:37:25 +02003792static void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01003793 const struct hda_fixup *fix, int action)
David Henningsson108cc102012-07-20 10:37:25 +02003794{
3795 struct alc_spec *spec = codec->spec;
3796
Takashi Iwai1727a772013-01-10 09:52:52 +01003797 if (action == HDA_FIXUP_ACT_PRE_PROBE)
David Henningsson108cc102012-07-20 10:37:25 +02003798 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
3799}
3800
Jan-Marek Glogowskifdcc9682018-02-14 11:29:15 +01003801static void alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec *codec,
3802 const struct hda_fixup *fix,
3803 int action)
3804{
3805 unsigned int cfg_headphone = snd_hda_codec_get_pincfg(codec, 0x21);
3806 unsigned int cfg_headset_mic = snd_hda_codec_get_pincfg(codec, 0x19);
3807
3808 if (cfg_headphone && cfg_headset_mic == 0x411111f0)
3809 snd_hda_codec_set_pincfg(codec, 0x19,
3810 (cfg_headphone & ~AC_DEFCFG_DEVICE) |
3811 (AC_JACK_MIC_IN << AC_DEFCFG_DEVICE_SHIFT));
3812}
3813
Takashi Iwai1d045db2011-07-07 18:23:21 +02003814static void alc269_fixup_hweq(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01003815 const struct hda_fixup *fix, int action)
Takashi Iwai1d045db2011-07-07 18:23:21 +02003816{
Takashi Iwai98b24882014-08-18 13:47:50 +02003817 if (action == HDA_FIXUP_ACT_INIT)
3818 alc_update_coef_idx(codec, 0x1e, 0, 0x80);
Takashi Iwai1d045db2011-07-07 18:23:21 +02003819}
3820
David Henningsson7c478f02013-10-11 10:18:46 +02003821static void alc269_fixup_headset_mic(struct hda_codec *codec,
3822 const struct hda_fixup *fix, int action)
3823{
3824 struct alc_spec *spec = codec->spec;
3825
3826 if (action == HDA_FIXUP_ACT_PRE_PROBE)
3827 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
3828}
3829
Takashi Iwai1d045db2011-07-07 18:23:21 +02003830static void alc271_fixup_dmic(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01003831 const struct hda_fixup *fix, int action)
Takashi Iwai1d045db2011-07-07 18:23:21 +02003832{
3833 static const struct hda_verb verbs[] = {
3834 {0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
3835 {0x20, AC_VERB_SET_PROC_COEF, 0x4000},
3836 {}
3837 };
3838 unsigned int cfg;
3839
Takashi Iwai7639a062015-03-03 10:07:24 +01003840 if (strcmp(codec->core.chip_name, "ALC271X") &&
3841 strcmp(codec->core.chip_name, "ALC269VB"))
Takashi Iwai1d045db2011-07-07 18:23:21 +02003842 return;
3843 cfg = snd_hda_codec_get_pincfg(codec, 0x12);
3844 if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED)
3845 snd_hda_sequence_write(codec, verbs);
3846}
3847
Takashi Iwai017f2a102011-07-09 14:42:25 +02003848static void alc269_fixup_pcm_44k(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01003849 const struct hda_fixup *fix, int action)
Takashi Iwai017f2a102011-07-09 14:42:25 +02003850{
3851 struct alc_spec *spec = codec->spec;
3852
Takashi Iwai1727a772013-01-10 09:52:52 +01003853 if (action != HDA_FIXUP_ACT_PROBE)
Takashi Iwai017f2a102011-07-09 14:42:25 +02003854 return;
3855
3856 /* Due to a hardware problem on Lenovo Ideadpad, we need to
3857 * fix the sample rate of analog I/O to 44.1kHz
3858 */
Takashi Iwai08c189f2012-12-19 15:22:24 +01003859 spec->gen.stream_analog_playback = &alc269_44k_pcm_analog_playback;
3860 spec->gen.stream_analog_capture = &alc269_44k_pcm_analog_capture;
Takashi Iwai017f2a102011-07-09 14:42:25 +02003861}
3862
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02003863static void alc269_fixup_stereo_dmic(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01003864 const struct hda_fixup *fix, int action)
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02003865{
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02003866 /* The digital-mic unit sends PDM (differential signal) instead of
3867 * the standard PCM, thus you can't record a valid mono stream as is.
3868 * Below is a workaround specific to ALC269 to control the dmic
3869 * signal source as mono.
3870 */
Takashi Iwai98b24882014-08-18 13:47:50 +02003871 if (action == HDA_FIXUP_ACT_INIT)
3872 alc_update_coef_idx(codec, 0x07, 0, 0x80);
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02003873}
3874
Takashi Iwai24519912011-08-16 15:08:49 +02003875static void alc269_quanta_automute(struct hda_codec *codec)
3876{
Takashi Iwai08c189f2012-12-19 15:22:24 +01003877 snd_hda_gen_update_outputs(codec);
Takashi Iwai24519912011-08-16 15:08:49 +02003878
Takashi Iwai1687ccc2014-08-18 13:49:35 +02003879 alc_write_coef_idx(codec, 0x0c, 0x680);
3880 alc_write_coef_idx(codec, 0x0c, 0x480);
Takashi Iwai24519912011-08-16 15:08:49 +02003881}
3882
3883static void alc269_fixup_quanta_mute(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01003884 const struct hda_fixup *fix, int action)
Takashi Iwai24519912011-08-16 15:08:49 +02003885{
3886 struct alc_spec *spec = codec->spec;
Takashi Iwai1727a772013-01-10 09:52:52 +01003887 if (action != HDA_FIXUP_ACT_PROBE)
Takashi Iwai24519912011-08-16 15:08:49 +02003888 return;
Takashi Iwai08c189f2012-12-19 15:22:24 +01003889 spec->gen.automute_hook = alc269_quanta_automute;
Takashi Iwai24519912011-08-16 15:08:49 +02003890}
3891
David Henningssond240d1d2013-04-15 12:50:02 +02003892static void alc269_x101_hp_automute_hook(struct hda_codec *codec,
Takashi Iwai1a4f69d2014-09-11 15:22:46 +02003893 struct hda_jack_callback *jack)
David Henningssond240d1d2013-04-15 12:50:02 +02003894{
3895 struct alc_spec *spec = codec->spec;
3896 int vref;
3897 msleep(200);
3898 snd_hda_gen_hp_automute(codec, jack);
3899
3900 vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
3901 msleep(100);
3902 snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
3903 vref);
3904 msleep(500);
3905 snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
3906 vref);
3907}
3908
Tomas Espeletaa2ef03f2019-08-09 16:37:54 +02003909/*
3910 * Magic sequence to make Huawei Matebook X right speaker working (bko#197801)
3911 */
3912struct hda_alc298_mbxinit {
3913 unsigned char value_0x23;
3914 unsigned char value_0x25;
3915};
3916
3917static void alc298_huawei_mbx_stereo_seq(struct hda_codec *codec,
3918 const struct hda_alc298_mbxinit *initval,
3919 bool first)
3920{
3921 snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x0);
3922 alc_write_coef_idx(codec, 0x26, 0xb000);
3923
3924 if (first)
3925 snd_hda_codec_write(codec, 0x21, 0, AC_VERB_GET_PIN_SENSE, 0x0);
3926
3927 snd_hda_codec_write(codec, 0x6, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
3928 alc_write_coef_idx(codec, 0x26, 0xf000);
3929 alc_write_coef_idx(codec, 0x23, initval->value_0x23);
3930
3931 if (initval->value_0x23 != 0x1e)
3932 alc_write_coef_idx(codec, 0x25, initval->value_0x25);
3933
3934 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
3935 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
3936}
3937
3938static void alc298_fixup_huawei_mbx_stereo(struct hda_codec *codec,
3939 const struct hda_fixup *fix,
3940 int action)
3941{
3942 /* Initialization magic */
3943 static const struct hda_alc298_mbxinit dac_init[] = {
3944 {0x0c, 0x00}, {0x0d, 0x00}, {0x0e, 0x00}, {0x0f, 0x00},
3945 {0x10, 0x00}, {0x1a, 0x40}, {0x1b, 0x82}, {0x1c, 0x00},
3946 {0x1d, 0x00}, {0x1e, 0x00}, {0x1f, 0x00},
3947 {0x20, 0xc2}, {0x21, 0xc8}, {0x22, 0x26}, {0x23, 0x24},
3948 {0x27, 0xff}, {0x28, 0xff}, {0x29, 0xff}, {0x2a, 0x8f},
3949 {0x2b, 0x02}, {0x2c, 0x48}, {0x2d, 0x34}, {0x2e, 0x00},
3950 {0x2f, 0x00},
3951 {0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00},
3952 {0x34, 0x00}, {0x35, 0x01}, {0x36, 0x93}, {0x37, 0x0c},
3953 {0x38, 0x00}, {0x39, 0x00}, {0x3a, 0xf8}, {0x38, 0x80},
3954 {}
3955 };
3956 const struct hda_alc298_mbxinit *seq;
3957
3958 if (action != HDA_FIXUP_ACT_INIT)
3959 return;
3960
3961 /* Start */
3962 snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x00);
3963 snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
3964 alc_write_coef_idx(codec, 0x26, 0xf000);
3965 alc_write_coef_idx(codec, 0x22, 0x31);
3966 alc_write_coef_idx(codec, 0x23, 0x0b);
3967 alc_write_coef_idx(codec, 0x25, 0x00);
3968 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
3969 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
3970
3971 for (seq = dac_init; seq->value_0x23; seq++)
3972 alc298_huawei_mbx_stereo_seq(codec, seq, seq == dac_init);
3973}
3974
David Henningssond240d1d2013-04-15 12:50:02 +02003975static void alc269_fixup_x101_headset_mic(struct hda_codec *codec,
3976 const struct hda_fixup *fix, int action)
3977{
3978 struct alc_spec *spec = codec->spec;
3979 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3980 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
3981 spec->gen.hp_automute_hook = alc269_x101_hp_automute_hook;
3982 }
3983}
3984
3985
Takashi Iwai08fb0d02013-01-10 17:33:58 +01003986/* update mute-LED according to the speaker mute state via mic VREF pin */
3987static void alc269_fixup_mic_mute_hook(void *private_data, int enabled)
David Henningsson6d3cd5d2013-01-07 12:03:47 +01003988{
3989 struct hda_codec *codec = private_data;
Takashi Iwai08fb0d02013-01-10 17:33:58 +01003990 struct alc_spec *spec = codec->spec;
3991 unsigned int pinval;
3992
3993 if (spec->mute_led_polarity)
3994 enabled = !enabled;
Takashi Iwai415d5552014-04-03 11:51:21 +02003995 pinval = snd_hda_codec_get_pin_target(codec, spec->mute_led_nid);
3996 pinval &= ~AC_PINCTL_VREFEN;
3997 pinval |= enabled ? AC_PINCTL_VREF_HIZ : AC_PINCTL_VREF_80;
Takashi Iwaie40bdb02018-03-17 22:40:18 +01003998 if (spec->mute_led_nid) {
3999 /* temporarily power up/down for setting VREF */
4000 snd_hda_power_up_pm(codec);
Takashi Iwai08fb0d02013-01-10 17:33:58 +01004001 snd_hda_set_pin_ctl_cache(codec, spec->mute_led_nid, pinval);
Takashi Iwaie40bdb02018-03-17 22:40:18 +01004002 snd_hda_power_down_pm(codec);
4003 }
David Henningsson6d3cd5d2013-01-07 12:03:47 +01004004}
4005
David Henningssond5b6b652013-11-06 10:50:44 +01004006/* Make sure the led works even in runtime suspend */
4007static unsigned int led_power_filter(struct hda_codec *codec,
4008 hda_nid_t nid,
4009 unsigned int power_state)
4010{
4011 struct alc_spec *spec = codec->spec;
4012
Hui Wang50dd9052014-07-08 17:56:15 +08004013 if (power_state != AC_PWRST_D3 || nid == 0 ||
4014 (nid != spec->mute_led_nid && nid != spec->cap_mute_led_nid))
David Henningssond5b6b652013-11-06 10:50:44 +01004015 return power_state;
4016
4017 /* Set pin ctl again, it might have just been set to 0 */
4018 snd_hda_set_pin_ctl(codec, nid,
4019 snd_hda_codec_get_pin_target(codec, nid));
4020
Takashi Iwaicffd3962015-04-09 10:30:25 +02004021 return snd_hda_gen_path_power_filter(codec, nid, power_state);
David Henningssond5b6b652013-11-06 10:50:44 +01004022}
4023
Takashi Iwai08fb0d02013-01-10 17:33:58 +01004024static void alc269_fixup_hp_mute_led(struct hda_codec *codec,
4025 const struct hda_fixup *fix, int action)
David Henningsson6d3cd5d2013-01-07 12:03:47 +01004026{
4027 struct alc_spec *spec = codec->spec;
Takashi Iwai08fb0d02013-01-10 17:33:58 +01004028 const struct dmi_device *dev = NULL;
4029
4030 if (action != HDA_FIXUP_ACT_PRE_PROBE)
4031 return;
4032
4033 while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) {
4034 int pol, pin;
4035 if (sscanf(dev->name, "HP_Mute_LED_%d_%x", &pol, &pin) != 2)
4036 continue;
4037 if (pin < 0x0a || pin >= 0x10)
4038 break;
4039 spec->mute_led_polarity = pol;
4040 spec->mute_led_nid = pin - 0x0a + 0x18;
4041 spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook;
Takashi Iwaifd25a97a2012-12-20 14:57:18 +01004042 spec->gen.vmaster_mute_enum = 1;
David Henningssond5b6b652013-11-06 10:50:44 +01004043 codec->power_filter = led_power_filter;
Takashi Iwai4e76a882014-02-25 12:21:03 +01004044 codec_dbg(codec,
4045 "Detected mute LED for %x:%d\n", spec->mute_led_nid,
Takashi Iwai08fb0d02013-01-10 17:33:58 +01004046 spec->mute_led_polarity);
David Henningsson6d3cd5d2013-01-07 12:03:47 +01004047 break;
4048 }
4049}
4050
Takashi Iwai85c467d2018-05-29 11:38:38 +02004051static void alc269_fixup_hp_mute_led_micx(struct hda_codec *codec,
4052 const struct hda_fixup *fix,
4053 int action, hda_nid_t pin)
David Henningssond06ac142013-02-18 11:41:55 +01004054{
4055 struct alc_spec *spec = codec->spec;
Takashi Iwai85c467d2018-05-29 11:38:38 +02004056
David Henningssond06ac142013-02-18 11:41:55 +01004057 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4058 spec->mute_led_polarity = 0;
Takashi Iwai85c467d2018-05-29 11:38:38 +02004059 spec->mute_led_nid = pin;
David Henningssond06ac142013-02-18 11:41:55 +01004060 spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook;
4061 spec->gen.vmaster_mute_enum = 1;
David Henningssond5b6b652013-11-06 10:50:44 +01004062 codec->power_filter = led_power_filter;
David Henningssond06ac142013-02-18 11:41:55 +01004063 }
4064}
4065
Takashi Iwai85c467d2018-05-29 11:38:38 +02004066static void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec,
4067 const struct hda_fixup *fix, int action)
4068{
4069 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x18);
4070}
4071
Takashi Iwai08fb0d02013-01-10 17:33:58 +01004072static void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec,
4073 const struct hda_fixup *fix, int action)
Takashi Iwai420b0fe2012-03-12 12:35:27 +01004074{
Takashi Iwai85c467d2018-05-29 11:38:38 +02004075 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x19);
Takashi Iwai420b0fe2012-03-12 12:35:27 +01004076}
4077
Tom Briden7f783bd2017-03-25 10:12:01 +00004078static void alc269_fixup_hp_mute_led_mic3(struct hda_codec *codec,
4079 const struct hda_fixup *fix, int action)
4080{
Takashi Iwai85c467d2018-05-29 11:38:38 +02004081 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1b);
Tom Briden7f783bd2017-03-25 10:12:01 +00004082}
4083
Takashi Iwai0f32fd192014-11-19 12:16:14 +01004084/* update LED status via GPIO */
4085static void alc_update_gpio_led(struct hda_codec *codec, unsigned int mask,
Kai-Heng Fengdbd13172020-04-30 16:32:51 +08004086 int polarity, bool enabled)
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01004087{
Kai-Heng Fengdbd13172020-04-30 16:32:51 +08004088 if (polarity)
Takashi Iwai0f32fd192014-11-19 12:16:14 +01004089 enabled = !enabled;
Takashi Iwaid261eec2018-06-19 22:32:29 +02004090 alc_update_gpio_data(codec, mask, !enabled); /* muted -> LED on */
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01004091}
4092
Takashi Iwai0f32fd192014-11-19 12:16:14 +01004093/* turn on/off mute LED via GPIO per vmaster hook */
4094static void alc_fixup_gpio_mute_hook(void *private_data, int enabled)
4095{
4096 struct hda_codec *codec = private_data;
4097 struct alc_spec *spec = codec->spec;
4098
Kai-Heng Fengdbd13172020-04-30 16:32:51 +08004099 alc_update_gpio_led(codec, spec->gpio_mute_led_mask,
4100 spec->mute_led_polarity, enabled);
Takashi Iwai0f32fd192014-11-19 12:16:14 +01004101}
4102
4103/* turn on/off mic-mute LED via GPIO per capture hook */
Takashi Iwaid03abec2018-06-19 12:29:13 +02004104static void alc_gpio_micmute_update(struct hda_codec *codec)
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01004105{
4106 struct alc_spec *spec = codec->spec;
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01004107
Takashi Iwaid03abec2018-06-19 12:29:13 +02004108 alc_update_gpio_led(codec, spec->gpio_mic_led_mask,
Kai-Heng Fengdbd13172020-04-30 16:32:51 +08004109 spec->micmute_led_polarity,
Takashi Iwaid03abec2018-06-19 12:29:13 +02004110 spec->gen.micmute_led.led_value);
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01004111}
4112
Kai-Heng Feng87dc3642020-04-30 21:52:07 +08004113#if IS_REACHABLE(CONFIG_LEDS_TRIGGER_AUDIO)
4114static int micmute_led_set(struct led_classdev *led_cdev,
4115 enum led_brightness brightness)
4116{
4117 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4118 struct alc_spec *spec = codec->spec;
4119
4120 alc_update_gpio_led(codec, spec->gpio_mic_led_mask,
4121 spec->micmute_led_polarity, !!brightness);
4122 return 0;
4123}
4124
4125static struct led_classdev micmute_led_cdev = {
4126 .name = "hda::micmute",
4127 .max_brightness = 1,
4128 .brightness_set_blocking = micmute_led_set,
4129 .default_trigger = "audio-micmute",
4130};
4131#endif
4132
Takashi Iwai01e4a272018-06-19 22:47:30 +02004133/* setup mute and mic-mute GPIO bits, add hooks appropriately */
4134static void alc_fixup_hp_gpio_led(struct hda_codec *codec,
4135 int action,
4136 unsigned int mute_mask,
4137 unsigned int micmute_mask)
4138{
4139 struct alc_spec *spec = codec->spec;
Takashi Iwai0127f592020-05-01 09:28:56 +02004140#if IS_REACHABLE(CONFIG_LEDS_TRIGGER_AUDIO)
Kai-Heng Feng87dc3642020-04-30 21:52:07 +08004141 int err;
Takashi Iwai0127f592020-05-01 09:28:56 +02004142#endif
Takashi Iwai01e4a272018-06-19 22:47:30 +02004143
4144 alc_fixup_gpio(codec, action, mute_mask | micmute_mask);
4145
4146 if (action != HDA_FIXUP_ACT_PRE_PROBE)
4147 return;
4148 if (mute_mask) {
4149 spec->gpio_mute_led_mask = mute_mask;
4150 spec->gen.vmaster_mute.hook = alc_fixup_gpio_mute_hook;
4151 }
4152 if (micmute_mask) {
4153 spec->gpio_mic_led_mask = micmute_mask;
4154 snd_hda_gen_add_micmute_led(codec, alc_gpio_micmute_update);
Kai-Heng Feng87dc3642020-04-30 21:52:07 +08004155
4156#if IS_REACHABLE(CONFIG_LEDS_TRIGGER_AUDIO)
4157 micmute_led_cdev.brightness = ledtrig_audio_get(LED_AUDIO_MICMUTE);
4158 err = devm_led_classdev_register(&codec->core.dev, &micmute_led_cdev);
4159 if (err)
4160 codec_warn(codec, "failed to register micmute LED\n");
4161#endif
Takashi Iwai01e4a272018-06-19 22:47:30 +02004162 }
4163}
4164
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01004165static void alc269_fixup_hp_gpio_led(struct hda_codec *codec,
4166 const struct hda_fixup *fix, int action)
4167{
Takashi Iwai01e4a272018-06-19 22:47:30 +02004168 alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01004169}
4170
Kai-Heng Fengf5a88b02020-03-27 12:46:25 +08004171static void alc285_fixup_hp_gpio_led(struct hda_codec *codec,
4172 const struct hda_fixup *fix, int action)
4173{
Kai-Heng Feng3e0650a2020-04-30 16:32:52 +08004174 struct alc_spec *spec = codec->spec;
4175
4176 spec->micmute_led_polarity = 1;
4177
4178 alc_fixup_hp_gpio_led(codec, action, 0x04, 0x01);
Kai-Heng Fengf5a88b02020-03-27 12:46:25 +08004179}
4180
Kailang Yangeaa8e5e2014-11-21 15:49:11 +08004181static void alc286_fixup_hp_gpio_led(struct hda_codec *codec,
4182 const struct hda_fixup *fix, int action)
4183{
Takashi Iwai01e4a272018-06-19 22:47:30 +02004184 alc_fixup_hp_gpio_led(codec, action, 0x02, 0x20);
Takashi Iwai1d045db2011-07-07 18:23:21 +02004185}
4186
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004187/* turn on/off mic-mute LED per capture hook */
Takashi Iwaid03abec2018-06-19 12:29:13 +02004188static void alc_cap_micmute_update(struct hda_codec *codec)
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004189{
4190 struct alc_spec *spec = codec->spec;
Takashi Iwaid03abec2018-06-19 12:29:13 +02004191 unsigned int pinval;
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004192
Takashi Iwaid03abec2018-06-19 12:29:13 +02004193 if (!spec->cap_mute_led_nid)
4194 return;
Hui Wangfc1fad92014-07-08 17:56:14 +08004195 pinval = snd_hda_codec_get_pin_target(codec, spec->cap_mute_led_nid);
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004196 pinval &= ~AC_PINCTL_VREFEN;
Takashi Iwaid03abec2018-06-19 12:29:13 +02004197 if (spec->gen.micmute_led.led_value)
4198 pinval |= AC_PINCTL_VREF_80;
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004199 else
Takashi Iwaid03abec2018-06-19 12:29:13 +02004200 pinval |= AC_PINCTL_VREF_HIZ;
4201 snd_hda_set_pin_ctl_cache(codec, spec->cap_mute_led_nid, pinval);
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004202}
4203
4204static void alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec,
4205 const struct hda_fixup *fix, int action)
4206{
4207 struct alc_spec *spec = codec->spec;
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004208
Takashi Iwai01e4a272018-06-19 22:47:30 +02004209 alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004210 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai01e4a272018-06-19 22:47:30 +02004211 /* Like hp_gpio_mic1_led, but also needs GPIO4 low to
4212 * enable headphone amp
4213 */
4214 spec->gpio_mask |= 0x10;
4215 spec->gpio_dir |= 0x10;
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004216 spec->cap_mute_led_nid = 0x18;
Takashi Iwaid03abec2018-06-19 12:29:13 +02004217 snd_hda_gen_add_micmute_led(codec, alc_cap_micmute_update);
Hui Wang50dd9052014-07-08 17:56:15 +08004218 codec->power_filter = led_power_filter;
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004219 }
4220}
4221
David Henningsson7a5255f2014-10-30 08:26:01 +01004222static void alc280_fixup_hp_gpio4(struct hda_codec *codec,
4223 const struct hda_fixup *fix, int action)
4224{
David Henningsson7a5255f2014-10-30 08:26:01 +01004225 struct alc_spec *spec = codec->spec;
David Henningsson7a5255f2014-10-30 08:26:01 +01004226
Takashi Iwai01e4a272018-06-19 22:47:30 +02004227 alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
David Henningsson7a5255f2014-10-30 08:26:01 +01004228 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
David Henningsson7a5255f2014-10-30 08:26:01 +01004229 spec->cap_mute_led_nid = 0x18;
Takashi Iwaid03abec2018-06-19 12:29:13 +02004230 snd_hda_gen_add_micmute_led(codec, alc_cap_micmute_update);
David Henningsson7a5255f2014-10-30 08:26:01 +01004231 codec->power_filter = led_power_filter;
4232 }
4233}
4234
Kailang Yang431e76c2020-04-07 14:40:20 +08004235/* update mute-LED according to the speaker mute state via COEF bit */
4236static void alc_fixup_mute_led_coefbit_hook(void *private_data, int enabled)
4237{
4238 struct hda_codec *codec = private_data;
4239 struct alc_spec *spec = codec->spec;
4240
4241 if (spec->mute_led_polarity)
4242 enabled = !enabled;
4243
4244 /* temporarily power up/down for setting COEF bit */
4245 enabled ? alc_update_coef_idx(codec, spec->mute_led_coef_idx,
4246 spec->mute_led_coefbit_mask, spec->mute_led_coefbit_off) :
4247 alc_update_coef_idx(codec, spec->mute_led_coef_idx,
4248 spec->mute_led_coefbit_mask, spec->mute_led_coefbit_on);
4249}
4250
4251static void alc285_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4252 const struct hda_fixup *fix,
4253 int action)
4254{
4255 struct alc_spec *spec = codec->spec;
4256
4257 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4258 spec->mute_led_polarity = 0;
4259 spec->mute_led_coef_idx = 0x0b;
4260 spec->mute_led_coefbit_mask = 1<<3;
4261 spec->mute_led_coefbit_on = 1<<3;
4262 spec->mute_led_coefbit_off = 0;
4263 spec->gen.vmaster_mute.hook = alc_fixup_mute_led_coefbit_hook;
4264 spec->gen.vmaster_mute_enum = 1;
4265 }
4266}
4267
Kailang Yang24164f42020-04-07 14:52:42 +08004268static void alc236_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4269 const struct hda_fixup *fix,
4270 int action)
4271{
4272 struct alc_spec *spec = codec->spec;
4273
4274 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4275 spec->mute_led_polarity = 0;
4276 spec->mute_led_coef_idx = 0x34;
4277 spec->mute_led_coefbit_mask = 1<<5;
4278 spec->mute_led_coefbit_on = 0;
4279 spec->mute_led_coefbit_off = 1<<5;
4280 spec->gen.vmaster_mute.hook = alc_fixup_mute_led_coefbit_hook;
4281 spec->gen.vmaster_mute_enum = 1;
4282 }
4283}
4284
Kailang Yang431e76c2020-04-07 14:40:20 +08004285/* turn on/off mic-mute LED per capture hook by coef bit */
4286static void alc_hp_cap_micmute_update(struct hda_codec *codec)
4287{
4288 struct alc_spec *spec = codec->spec;
4289
4290 if (spec->gen.micmute_led.led_value)
4291 alc_update_coef_idx(codec, spec->mic_led_coef_idx,
4292 spec->mic_led_coefbit_mask, spec->mic_led_coefbit_on);
4293 else
4294 alc_update_coef_idx(codec, spec->mic_led_coef_idx,
4295 spec->mic_led_coefbit_mask, spec->mic_led_coefbit_off);
4296}
4297
4298static void alc285_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4299 const struct hda_fixup *fix, int action)
4300{
4301 struct alc_spec *spec = codec->spec;
4302
4303 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4304 spec->mic_led_coef_idx = 0x19;
4305 spec->mic_led_coefbit_mask = 1<<13;
4306 spec->mic_led_coefbit_on = 1<<13;
4307 spec->mic_led_coefbit_off = 0;
4308 snd_hda_gen_add_micmute_led(codec, alc_hp_cap_micmute_update);
4309 }
4310}
4311
Kailang Yang24164f42020-04-07 14:52:42 +08004312static void alc236_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4313 const struct hda_fixup *fix, int action)
4314{
4315 struct alc_spec *spec = codec->spec;
4316
4317 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4318 spec->mic_led_coef_idx = 0x35;
4319 spec->mic_led_coefbit_mask = 3<<2;
4320 spec->mic_led_coefbit_on = 2<<2;
4321 spec->mic_led_coefbit_off = 1<<2;
4322 snd_hda_gen_add_micmute_led(codec, alc_hp_cap_micmute_update);
4323 }
4324}
4325
Kailang Yang431e76c2020-04-07 14:40:20 +08004326static void alc285_fixup_hp_mute_led(struct hda_codec *codec,
4327 const struct hda_fixup *fix, int action)
4328{
4329 alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
4330 alc285_fixup_hp_coef_micmute_led(codec, fix, action);
4331}
4332
Kailang Yang24164f42020-04-07 14:52:42 +08004333static void alc236_fixup_hp_mute_led(struct hda_codec *codec,
4334 const struct hda_fixup *fix, int action)
4335{
4336 alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
4337 alc236_fixup_hp_coef_micmute_led(codec, fix, action);
4338}
4339
Takashi Iwai6a30aba2018-04-27 17:17:35 +02004340#if IS_REACHABLE(CONFIG_INPUT)
David Henningsson33f4acd2015-01-07 15:50:13 +01004341static void gpio2_mic_hotkey_event(struct hda_codec *codec,
4342 struct hda_jack_callback *event)
4343{
4344 struct alc_spec *spec = codec->spec;
4345
4346 /* GPIO2 just toggles on a keypress/keyrelease cycle. Therefore
4347 send both key on and key off event for every interrupt. */
Hui Wangc7b60a82015-12-28 11:35:25 +08004348 input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 1);
David Henningsson33f4acd2015-01-07 15:50:13 +01004349 input_sync(spec->kb_dev);
Hui Wangc7b60a82015-12-28 11:35:25 +08004350 input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 0);
David Henningsson33f4acd2015-01-07 15:50:13 +01004351 input_sync(spec->kb_dev);
4352}
David Henningsson33f4acd2015-01-07 15:50:13 +01004353
Kailang3694cb22015-12-28 11:35:24 +08004354static int alc_register_micmute_input_device(struct hda_codec *codec)
4355{
4356 struct alc_spec *spec = codec->spec;
Hui Wangc7b60a82015-12-28 11:35:25 +08004357 int i;
Kailang3694cb22015-12-28 11:35:24 +08004358
4359 spec->kb_dev = input_allocate_device();
4360 if (!spec->kb_dev) {
4361 codec_err(codec, "Out of memory (input_allocate_device)\n");
4362 return -ENOMEM;
4363 }
Hui Wangc7b60a82015-12-28 11:35:25 +08004364
4365 spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX] = KEY_MICMUTE;
4366
Kailang3694cb22015-12-28 11:35:24 +08004367 spec->kb_dev->name = "Microphone Mute Button";
4368 spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY);
Hui Wangc7b60a82015-12-28 11:35:25 +08004369 spec->kb_dev->keycodesize = sizeof(spec->alc_mute_keycode_map[0]);
4370 spec->kb_dev->keycodemax = ARRAY_SIZE(spec->alc_mute_keycode_map);
4371 spec->kb_dev->keycode = spec->alc_mute_keycode_map;
4372 for (i = 0; i < ARRAY_SIZE(spec->alc_mute_keycode_map); i++)
4373 set_bit(spec->alc_mute_keycode_map[i], spec->kb_dev->keybit);
Kailang3694cb22015-12-28 11:35:24 +08004374
4375 if (input_register_device(spec->kb_dev)) {
4376 codec_err(codec, "input_register_device failed\n");
4377 input_free_device(spec->kb_dev);
4378 spec->kb_dev = NULL;
4379 return -ENOMEM;
4380 }
4381
4382 return 0;
4383}
4384
Takashi Iwai01e4a272018-06-19 22:47:30 +02004385/* GPIO1 = set according to SKU external amp
4386 * GPIO2 = mic mute hotkey
4387 * GPIO3 = mute LED
4388 * GPIO4 = mic mute LED
4389 */
David Henningsson33f4acd2015-01-07 15:50:13 +01004390static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec,
4391 const struct hda_fixup *fix, int action)
4392{
David Henningsson33f4acd2015-01-07 15:50:13 +01004393 struct alc_spec *spec = codec->spec;
4394
Takashi Iwai01e4a272018-06-19 22:47:30 +02004395 alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
David Henningsson33f4acd2015-01-07 15:50:13 +01004396 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai1c76aa52018-06-21 16:37:54 +02004397 spec->init_amp = ALC_INIT_DEFAULT;
Kailang3694cb22015-12-28 11:35:24 +08004398 if (alc_register_micmute_input_device(codec) != 0)
David Henningsson33f4acd2015-01-07 15:50:13 +01004399 return;
David Henningsson33f4acd2015-01-07 15:50:13 +01004400
Takashi Iwai01e4a272018-06-19 22:47:30 +02004401 spec->gpio_mask |= 0x06;
4402 spec->gpio_dir |= 0x02;
4403 spec->gpio_data |= 0x02;
Takashi Iwai7639a062015-03-03 10:07:24 +01004404 snd_hda_codec_write_cache(codec, codec->core.afg, 0,
David Henningsson33f4acd2015-01-07 15:50:13 +01004405 AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x04);
Takashi Iwai7639a062015-03-03 10:07:24 +01004406 snd_hda_jack_detect_enable_callback(codec, codec->core.afg,
David Henningsson33f4acd2015-01-07 15:50:13 +01004407 gpio2_mic_hotkey_event);
David Henningsson33f4acd2015-01-07 15:50:13 +01004408 return;
4409 }
4410
4411 if (!spec->kb_dev)
4412 return;
4413
4414 switch (action) {
David Henningsson33f4acd2015-01-07 15:50:13 +01004415 case HDA_FIXUP_ACT_FREE:
4416 input_unregister_device(spec->kb_dev);
David Henningsson33f4acd2015-01-07 15:50:13 +01004417 spec->kb_dev = NULL;
4418 }
David Henningsson33f4acd2015-01-07 15:50:13 +01004419}
4420
Takashi Iwai01e4a272018-06-19 22:47:30 +02004421/* Line2 = mic mute hotkey
4422 * GPIO2 = mic mute LED
4423 */
Kailang3694cb22015-12-28 11:35:24 +08004424static void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec,
4425 const struct hda_fixup *fix, int action)
4426{
Kailang3694cb22015-12-28 11:35:24 +08004427 struct alc_spec *spec = codec->spec;
4428
Takashi Iwai01e4a272018-06-19 22:47:30 +02004429 alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
Kailang3694cb22015-12-28 11:35:24 +08004430 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai1c76aa52018-06-21 16:37:54 +02004431 spec->init_amp = ALC_INIT_DEFAULT;
Kailang3694cb22015-12-28 11:35:24 +08004432 if (alc_register_micmute_input_device(codec) != 0)
4433 return;
4434
Kailang3694cb22015-12-28 11:35:24 +08004435 snd_hda_jack_detect_enable_callback(codec, 0x1b,
4436 gpio2_mic_hotkey_event);
Kailang3694cb22015-12-28 11:35:24 +08004437 return;
4438 }
4439
4440 if (!spec->kb_dev)
4441 return;
4442
4443 switch (action) {
Kailang3694cb22015-12-28 11:35:24 +08004444 case HDA_FIXUP_ACT_FREE:
4445 input_unregister_device(spec->kb_dev);
4446 spec->kb_dev = NULL;
4447 }
4448}
Takashi Iwaic4696522018-01-15 10:44:35 +01004449#else /* INPUT */
4450#define alc280_fixup_hp_gpio2_mic_hotkey NULL
4451#define alc233_fixup_lenovo_line2_mic_hotkey NULL
4452#endif /* INPUT */
Kailang3694cb22015-12-28 11:35:24 +08004453
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004454static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec,
4455 const struct hda_fixup *fix, int action)
4456{
4457 struct alc_spec *spec = codec->spec;
4458
Takashi Iwai1bce62a2018-06-19 23:15:59 +02004459 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1a);
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004460 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004461 spec->cap_mute_led_nid = 0x18;
Takashi Iwaid03abec2018-06-19 12:29:13 +02004462 snd_hda_gen_add_micmute_led(codec, alc_cap_micmute_update);
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004463 }
4464}
4465
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004466static const struct coef_fw alc225_pre_hsmode[] = {
Kailang Yang5a367672017-07-21 15:23:53 +08004467 UPDATE_COEF(0x4a, 1<<8, 0),
4468 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0),
4469 UPDATE_COEF(0x63, 3<<14, 3<<14),
4470 UPDATE_COEF(0x4a, 3<<4, 2<<4),
4471 UPDATE_COEF(0x4a, 3<<10, 3<<10),
4472 UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10),
4473 UPDATE_COEF(0x4a, 3<<10, 0),
4474 {}
4475};
4476
David Henningsson73bdd592013-04-15 15:44:14 +02004477static void alc_headset_mode_unplugged(struct hda_codec *codec)
4478{
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004479 static const struct coef_fw coef0255[] = {
Kailang Yang717f43d2019-05-31 17:16:53 +08004480 WRITE_COEF(0x1b, 0x0c0b), /* LDO and MISC control */
Takashi Iwai54db6c32014-08-18 15:11:19 +02004481 WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
4482 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
4483 WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
4484 WRITE_COEFEX(0x57, 0x03, 0x8aa6), /* Direct Drive HP Amp control */
4485 {}
4486 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004487 static const struct coef_fw coef0256[] = {
Kailang Yange69e7e02016-05-30 15:58:28 +08004488 WRITE_COEF(0x1b, 0x0c4b), /* LDO and MISC control */
Kailang Yang717f43d2019-05-31 17:16:53 +08004489 WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
4490 WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
4491 WRITE_COEFEX(0x57, 0x03, 0x09a3), /* Direct Drive HP Amp control */
4492 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
Kailang Yange69e7e02016-05-30 15:58:28 +08004493 {}
4494 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004495 static const struct coef_fw coef0233[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004496 WRITE_COEF(0x1b, 0x0c0b),
4497 WRITE_COEF(0x45, 0xc429),
4498 UPDATE_COEF(0x35, 0x4000, 0),
4499 WRITE_COEF(0x06, 0x2104),
4500 WRITE_COEF(0x1a, 0x0001),
4501 WRITE_COEF(0x26, 0x0004),
4502 WRITE_COEF(0x32, 0x42a3),
4503 {}
4504 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004505 static const struct coef_fw coef0288[] = {
Kailang Yangf3b70332015-04-08 15:01:17 +08004506 UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
4507 UPDATE_COEF(0x50, 0x2000, 0x2000),
4508 UPDATE_COEF(0x56, 0x0006, 0x0006),
4509 UPDATE_COEF(0x66, 0x0008, 0),
4510 UPDATE_COEF(0x67, 0x2000, 0),
4511 {}
4512 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004513 static const struct coef_fw coef0298[] = {
Kailang Yang89542932017-07-17 15:03:43 +08004514 UPDATE_COEF(0x19, 0x1300, 0x0300),
4515 {}
4516 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004517 static const struct coef_fw coef0292[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004518 WRITE_COEF(0x76, 0x000e),
4519 WRITE_COEF(0x6c, 0x2400),
4520 WRITE_COEF(0x18, 0x7308),
4521 WRITE_COEF(0x6b, 0xc429),
4522 {}
4523 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004524 static const struct coef_fw coef0293[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004525 UPDATE_COEF(0x10, 7<<8, 6<<8), /* SET Line1 JD to 0 */
4526 UPDATE_COEFEX(0x57, 0x05, 1<<15|1<<13, 0x0), /* SET charge pump by verb */
4527 UPDATE_COEFEX(0x57, 0x03, 1<<10, 1<<10), /* SET EN_OSW to 1 */
4528 UPDATE_COEF(0x1a, 1<<3, 1<<3), /* Combo JD gating with LINE1-VREFO */
4529 WRITE_COEF(0x45, 0xc429), /* Set to TRS type */
4530 UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
4531 {}
4532 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004533 static const struct coef_fw coef0668[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004534 WRITE_COEF(0x15, 0x0d40),
4535 WRITE_COEF(0xb7, 0x802b),
4536 {}
4537 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004538 static const struct coef_fw coef0225[] = {
Kailang Yang5a367672017-07-21 15:23:53 +08004539 UPDATE_COEF(0x63, 3<<14, 0),
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004540 {}
4541 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004542 static const struct coef_fw coef0274[] = {
Kailang Yang71683c32017-06-20 16:33:50 +08004543 UPDATE_COEF(0x4a, 0x0100, 0),
4544 UPDATE_COEFEX(0x57, 0x05, 0x4000, 0),
4545 UPDATE_COEF(0x6b, 0xf000, 0x5000),
4546 UPDATE_COEF(0x4a, 0x0010, 0),
4547 UPDATE_COEF(0x4a, 0x0c00, 0x0c00),
4548 WRITE_COEF(0x45, 0x5289),
4549 UPDATE_COEF(0x4a, 0x0c00, 0),
4550 {}
4551 };
Takashi Iwai54db6c32014-08-18 15:11:19 +02004552
Takashi Iwai7639a062015-03-03 10:07:24 +01004553 switch (codec->core.vendor_id) {
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004554 case 0x10ec0255:
Kailang Yange69e7e02016-05-30 15:58:28 +08004555 alc_process_coef_fw(codec, coef0255);
4556 break;
Kailang Yang736f20a2017-10-20 15:06:34 +08004557 case 0x10ec0236:
Kailang Yang7081adf2015-03-30 17:05:37 +08004558 case 0x10ec0256:
Kailang Yange69e7e02016-05-30 15:58:28 +08004559 alc_process_coef_fw(codec, coef0256);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004560 break;
Kailang Yang71683c32017-06-20 16:33:50 +08004561 case 0x10ec0234:
4562 case 0x10ec0274:
4563 case 0x10ec0294:
4564 alc_process_coef_fw(codec, coef0274);
4565 break;
Kailang Yang13fd08a2014-05-21 16:49:48 +08004566 case 0x10ec0233:
David Henningsson73bdd592013-04-15 15:44:14 +02004567 case 0x10ec0283:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004568 alc_process_coef_fw(codec, coef0233);
David Henningsson73bdd592013-04-15 15:44:14 +02004569 break;
Kailang Yangf3b70332015-04-08 15:01:17 +08004570 case 0x10ec0286:
4571 case 0x10ec0288:
Kailang Yang89542932017-07-17 15:03:43 +08004572 alc_process_coef_fw(codec, coef0288);
4573 break;
Kailang Yang1a5bc8d2015-05-12 17:11:10 +08004574 case 0x10ec0298:
Kailang Yang89542932017-07-17 15:03:43 +08004575 alc_process_coef_fw(codec, coef0298);
Kailang Yangf3b70332015-04-08 15:01:17 +08004576 alc_process_coef_fw(codec, coef0288);
4577 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004578 case 0x10ec0292:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004579 alc_process_coef_fw(codec, coef0292);
David Henningsson73bdd592013-04-15 15:44:14 +02004580 break;
Kailang Yanga22aa262014-04-23 17:34:28 +08004581 case 0x10ec0293:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004582 alc_process_coef_fw(codec, coef0293);
Kailang Yanga22aa262014-04-23 17:34:28 +08004583 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004584 case 0x10ec0668:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004585 alc_process_coef_fw(codec, coef0668);
David Henningsson73bdd592013-04-15 15:44:14 +02004586 break;
Kailang Yangc2b691e2018-01-17 15:22:55 +08004587 case 0x10ec0215:
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004588 case 0x10ec0225:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004589 case 0x10ec0285:
Kailang Yang7d727862016-05-24 16:46:07 +08004590 case 0x10ec0295:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004591 case 0x10ec0289:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08004592 case 0x10ec0299:
Kailang Yang4d4b0c52019-01-09 16:23:37 +08004593 alc_process_coef_fw(codec, alc225_pre_hsmode);
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004594 alc_process_coef_fw(codec, coef0225);
4595 break;
Kailang Yang78f4f7c2016-06-07 11:31:34 +08004596 case 0x10ec0867:
4597 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
4598 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004599 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01004600 codec_dbg(codec, "Headset jack set to unplugged mode.\n");
David Henningsson73bdd592013-04-15 15:44:14 +02004601}
4602
4603
4604static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
4605 hda_nid_t mic_pin)
4606{
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004607 static const struct coef_fw coef0255[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004608 WRITE_COEFEX(0x57, 0x03, 0x8aa6),
4609 WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
4610 {}
4611 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004612 static const struct coef_fw coef0256[] = {
Kailang Yang717f43d2019-05-31 17:16:53 +08004613 UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14), /* Direct Drive HP Amp control(Set to verb control)*/
4614 WRITE_COEFEX(0x57, 0x03, 0x09a3),
4615 WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
4616 {}
4617 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004618 static const struct coef_fw coef0233[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004619 UPDATE_COEF(0x35, 0, 1<<14),
4620 WRITE_COEF(0x06, 0x2100),
4621 WRITE_COEF(0x1a, 0x0021),
4622 WRITE_COEF(0x26, 0x008c),
4623 {}
4624 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004625 static const struct coef_fw coef0288[] = {
Kailang Yang89542932017-07-17 15:03:43 +08004626 UPDATE_COEF(0x4f, 0x00c0, 0),
Kailang Yangf3b70332015-04-08 15:01:17 +08004627 UPDATE_COEF(0x50, 0x2000, 0),
4628 UPDATE_COEF(0x56, 0x0006, 0),
4629 UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
4630 UPDATE_COEF(0x66, 0x0008, 0x0008),
4631 UPDATE_COEF(0x67, 0x2000, 0x2000),
4632 {}
4633 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004634 static const struct coef_fw coef0292[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004635 WRITE_COEF(0x19, 0xa208),
4636 WRITE_COEF(0x2e, 0xacf0),
4637 {}
4638 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004639 static const struct coef_fw coef0293[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004640 UPDATE_COEFEX(0x57, 0x05, 0, 1<<15|1<<13), /* SET charge pump by verb */
4641 UPDATE_COEFEX(0x57, 0x03, 1<<10, 0), /* SET EN_OSW to 0 */
4642 UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
4643 {}
4644 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004645 static const struct coef_fw coef0688[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004646 WRITE_COEF(0xb7, 0x802b),
4647 WRITE_COEF(0xb5, 0x1040),
4648 UPDATE_COEF(0xc3, 0, 1<<12),
4649 {}
4650 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004651 static const struct coef_fw coef0225[] = {
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004652 UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14),
4653 UPDATE_COEF(0x4a, 3<<4, 2<<4),
4654 UPDATE_COEF(0x63, 3<<14, 0),
4655 {}
4656 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004657 static const struct coef_fw coef0274[] = {
Kailang Yang71683c32017-06-20 16:33:50 +08004658 UPDATE_COEFEX(0x57, 0x05, 0x4000, 0x4000),
4659 UPDATE_COEF(0x4a, 0x0010, 0),
4660 UPDATE_COEF(0x6b, 0xf000, 0),
4661 {}
4662 };
Takashi Iwai54db6c32014-08-18 15:11:19 +02004663
Takashi Iwai7639a062015-03-03 10:07:24 +01004664 switch (codec->core.vendor_id) {
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004665 case 0x10ec0255:
4666 alc_write_coef_idx(codec, 0x45, 0xc489);
4667 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
Takashi Iwai54db6c32014-08-18 15:11:19 +02004668 alc_process_coef_fw(codec, coef0255);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004669 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4670 break;
Kailang Yang717f43d2019-05-31 17:16:53 +08004671 case 0x10ec0236:
4672 case 0x10ec0256:
4673 alc_write_coef_idx(codec, 0x45, 0xc489);
4674 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4675 alc_process_coef_fw(codec, coef0256);
4676 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4677 break;
Kailang Yang71683c32017-06-20 16:33:50 +08004678 case 0x10ec0234:
4679 case 0x10ec0274:
4680 case 0x10ec0294:
4681 alc_write_coef_idx(codec, 0x45, 0x4689);
4682 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4683 alc_process_coef_fw(codec, coef0274);
4684 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4685 break;
Kailang Yang13fd08a2014-05-21 16:49:48 +08004686 case 0x10ec0233:
David Henningsson73bdd592013-04-15 15:44:14 +02004687 case 0x10ec0283:
4688 alc_write_coef_idx(codec, 0x45, 0xc429);
4689 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
Takashi Iwai54db6c32014-08-18 15:11:19 +02004690 alc_process_coef_fw(codec, coef0233);
David Henningsson73bdd592013-04-15 15:44:14 +02004691 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4692 break;
Kailang Yangf3b70332015-04-08 15:01:17 +08004693 case 0x10ec0286:
4694 case 0x10ec0288:
Kailang Yang1a5bc8d2015-05-12 17:11:10 +08004695 case 0x10ec0298:
Kailang Yangf3b70332015-04-08 15:01:17 +08004696 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4697 alc_process_coef_fw(codec, coef0288);
4698 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4699 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004700 case 0x10ec0292:
4701 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
Takashi Iwai54db6c32014-08-18 15:11:19 +02004702 alc_process_coef_fw(codec, coef0292);
David Henningsson73bdd592013-04-15 15:44:14 +02004703 break;
Kailang Yanga22aa262014-04-23 17:34:28 +08004704 case 0x10ec0293:
4705 /* Set to TRS mode */
4706 alc_write_coef_idx(codec, 0x45, 0xc429);
4707 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
Takashi Iwai54db6c32014-08-18 15:11:19 +02004708 alc_process_coef_fw(codec, coef0293);
Kailang Yanga22aa262014-04-23 17:34:28 +08004709 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4710 break;
Kailang Yang78f4f7c2016-06-07 11:31:34 +08004711 case 0x10ec0867:
4712 alc_update_coefex_idx(codec, 0x57, 0x5, 0, 1<<14);
4713 /* fallthru */
Kailang Yang9eb5d0e2017-01-17 15:40:25 +08004714 case 0x10ec0221:
David Henningsson1f8b46c2015-05-12 14:38:15 +02004715 case 0x10ec0662:
4716 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4717 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4718 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004719 case 0x10ec0668:
4720 alc_write_coef_idx(codec, 0x11, 0x0001);
4721 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
Takashi Iwai54db6c32014-08-18 15:11:19 +02004722 alc_process_coef_fw(codec, coef0688);
David Henningsson73bdd592013-04-15 15:44:14 +02004723 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4724 break;
Kailang Yangc2b691e2018-01-17 15:22:55 +08004725 case 0x10ec0215:
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004726 case 0x10ec0225:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004727 case 0x10ec0285:
Kailang Yang7d727862016-05-24 16:46:07 +08004728 case 0x10ec0295:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004729 case 0x10ec0289:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08004730 case 0x10ec0299:
Kailang Yang5a367672017-07-21 15:23:53 +08004731 alc_process_coef_fw(codec, alc225_pre_hsmode);
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004732 alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x31<<10);
4733 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4734 alc_process_coef_fw(codec, coef0225);
4735 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4736 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004737 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01004738 codec_dbg(codec, "Headset jack set to mic-in mode.\n");
David Henningsson73bdd592013-04-15 15:44:14 +02004739}
4740
4741static void alc_headset_mode_default(struct hda_codec *codec)
4742{
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004743 static const struct coef_fw coef0225[] = {
Kailang Yang5a367672017-07-21 15:23:53 +08004744 UPDATE_COEF(0x45, 0x3f<<10, 0x30<<10),
4745 UPDATE_COEF(0x45, 0x3f<<10, 0x31<<10),
4746 UPDATE_COEF(0x49, 3<<8, 0<<8),
4747 UPDATE_COEF(0x4a, 3<<4, 3<<4),
4748 UPDATE_COEF(0x63, 3<<14, 0),
4749 UPDATE_COEF(0x67, 0xf000, 0x3000),
David Henningsson2ae95572016-02-25 09:37:05 +01004750 {}
4751 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004752 static const struct coef_fw coef0255[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004753 WRITE_COEF(0x45, 0xc089),
4754 WRITE_COEF(0x45, 0xc489),
4755 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
4756 WRITE_COEF(0x49, 0x0049),
4757 {}
4758 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004759 static const struct coef_fw coef0256[] = {
Kailang Yang717f43d2019-05-31 17:16:53 +08004760 WRITE_COEF(0x45, 0xc489),
4761 WRITE_COEFEX(0x57, 0x03, 0x0da3),
4762 WRITE_COEF(0x49, 0x0049),
4763 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
4764 WRITE_COEF(0x06, 0x6100),
4765 {}
4766 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004767 static const struct coef_fw coef0233[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004768 WRITE_COEF(0x06, 0x2100),
4769 WRITE_COEF(0x32, 0x4ea3),
4770 {}
4771 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004772 static const struct coef_fw coef0288[] = {
Kailang Yangf3b70332015-04-08 15:01:17 +08004773 UPDATE_COEF(0x4f, 0xfcc0, 0xc400), /* Set to TRS type */
4774 UPDATE_COEF(0x50, 0x2000, 0x2000),
4775 UPDATE_COEF(0x56, 0x0006, 0x0006),
4776 UPDATE_COEF(0x66, 0x0008, 0),
4777 UPDATE_COEF(0x67, 0x2000, 0),
4778 {}
4779 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004780 static const struct coef_fw coef0292[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004781 WRITE_COEF(0x76, 0x000e),
4782 WRITE_COEF(0x6c, 0x2400),
4783 WRITE_COEF(0x6b, 0xc429),
4784 WRITE_COEF(0x18, 0x7308),
4785 {}
4786 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004787 static const struct coef_fw coef0293[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004788 UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
4789 WRITE_COEF(0x45, 0xC429), /* Set to TRS type */
4790 UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
4791 {}
4792 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004793 static const struct coef_fw coef0688[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004794 WRITE_COEF(0x11, 0x0041),
4795 WRITE_COEF(0x15, 0x0d40),
4796 WRITE_COEF(0xb7, 0x802b),
4797 {}
4798 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004799 static const struct coef_fw coef0274[] = {
Kailang Yang71683c32017-06-20 16:33:50 +08004800 WRITE_COEF(0x45, 0x4289),
4801 UPDATE_COEF(0x4a, 0x0010, 0x0010),
4802 UPDATE_COEF(0x6b, 0x0f00, 0),
4803 UPDATE_COEF(0x49, 0x0300, 0x0300),
4804 {}
4805 };
Takashi Iwai54db6c32014-08-18 15:11:19 +02004806
Takashi Iwai7639a062015-03-03 10:07:24 +01004807 switch (codec->core.vendor_id) {
Kailang Yangc2b691e2018-01-17 15:22:55 +08004808 case 0x10ec0215:
David Henningsson2ae95572016-02-25 09:37:05 +01004809 case 0x10ec0225:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004810 case 0x10ec0285:
Kailang Yang7d727862016-05-24 16:46:07 +08004811 case 0x10ec0295:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004812 case 0x10ec0289:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08004813 case 0x10ec0299:
Kailang Yang5a367672017-07-21 15:23:53 +08004814 alc_process_coef_fw(codec, alc225_pre_hsmode);
David Henningsson2ae95572016-02-25 09:37:05 +01004815 alc_process_coef_fw(codec, coef0225);
4816 break;
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004817 case 0x10ec0255:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004818 alc_process_coef_fw(codec, coef0255);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004819 break;
Kailang Yang717f43d2019-05-31 17:16:53 +08004820 case 0x10ec0236:
4821 case 0x10ec0256:
4822 alc_write_coef_idx(codec, 0x1b, 0x0e4b);
4823 alc_write_coef_idx(codec, 0x45, 0xc089);
4824 msleep(50);
4825 alc_process_coef_fw(codec, coef0256);
4826 break;
Kailang Yang71683c32017-06-20 16:33:50 +08004827 case 0x10ec0234:
4828 case 0x10ec0274:
4829 case 0x10ec0294:
4830 alc_process_coef_fw(codec, coef0274);
4831 break;
Kailang Yang13fd08a2014-05-21 16:49:48 +08004832 case 0x10ec0233:
David Henningsson73bdd592013-04-15 15:44:14 +02004833 case 0x10ec0283:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004834 alc_process_coef_fw(codec, coef0233);
David Henningsson73bdd592013-04-15 15:44:14 +02004835 break;
Kailang Yangf3b70332015-04-08 15:01:17 +08004836 case 0x10ec0286:
4837 case 0x10ec0288:
Kailang Yang1a5bc8d2015-05-12 17:11:10 +08004838 case 0x10ec0298:
Kailang Yangf3b70332015-04-08 15:01:17 +08004839 alc_process_coef_fw(codec, coef0288);
4840 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004841 case 0x10ec0292:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004842 alc_process_coef_fw(codec, coef0292);
David Henningsson73bdd592013-04-15 15:44:14 +02004843 break;
Kailang Yanga22aa262014-04-23 17:34:28 +08004844 case 0x10ec0293:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004845 alc_process_coef_fw(codec, coef0293);
Kailang Yanga22aa262014-04-23 17:34:28 +08004846 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004847 case 0x10ec0668:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004848 alc_process_coef_fw(codec, coef0688);
David Henningsson73bdd592013-04-15 15:44:14 +02004849 break;
Kailang Yang78f4f7c2016-06-07 11:31:34 +08004850 case 0x10ec0867:
4851 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
4852 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004853 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01004854 codec_dbg(codec, "Headset jack set to headphone (default) mode.\n");
David Henningsson73bdd592013-04-15 15:44:14 +02004855}
4856
4857/* Iphone type */
4858static void alc_headset_mode_ctia(struct hda_codec *codec)
4859{
Kailang Yang89542932017-07-17 15:03:43 +08004860 int val;
4861
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004862 static const struct coef_fw coef0255[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004863 WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
4864 WRITE_COEF(0x1b, 0x0c2b),
4865 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
4866 {}
4867 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004868 static const struct coef_fw coef0256[] = {
Kailang Yange69e7e02016-05-30 15:58:28 +08004869 WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
Kailang Yang717f43d2019-05-31 17:16:53 +08004870 WRITE_COEF(0x1b, 0x0e6b),
Kailang Yange69e7e02016-05-30 15:58:28 +08004871 {}
4872 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004873 static const struct coef_fw coef0233[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004874 WRITE_COEF(0x45, 0xd429),
4875 WRITE_COEF(0x1b, 0x0c2b),
4876 WRITE_COEF(0x32, 0x4ea3),
4877 {}
4878 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004879 static const struct coef_fw coef0288[] = {
Kailang Yangf3b70332015-04-08 15:01:17 +08004880 UPDATE_COEF(0x50, 0x2000, 0x2000),
4881 UPDATE_COEF(0x56, 0x0006, 0x0006),
4882 UPDATE_COEF(0x66, 0x0008, 0),
4883 UPDATE_COEF(0x67, 0x2000, 0),
4884 {}
4885 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004886 static const struct coef_fw coef0292[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004887 WRITE_COEF(0x6b, 0xd429),
4888 WRITE_COEF(0x76, 0x0008),
4889 WRITE_COEF(0x18, 0x7388),
4890 {}
4891 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004892 static const struct coef_fw coef0293[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004893 WRITE_COEF(0x45, 0xd429), /* Set to ctia type */
4894 UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
4895 {}
4896 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004897 static const struct coef_fw coef0688[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004898 WRITE_COEF(0x11, 0x0001),
4899 WRITE_COEF(0x15, 0x0d60),
4900 WRITE_COEF(0xc3, 0x0000),
4901 {}
4902 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004903 static const struct coef_fw coef0225_1[] = {
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004904 UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
Kailang Yang5a367672017-07-21 15:23:53 +08004905 UPDATE_COEF(0x63, 3<<14, 2<<14),
4906 {}
4907 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004908 static const struct coef_fw coef0225_2[] = {
Kailang Yang5a367672017-07-21 15:23:53 +08004909 UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
4910 UPDATE_COEF(0x63, 3<<14, 1<<14),
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004911 {}
4912 };
Takashi Iwai54db6c32014-08-18 15:11:19 +02004913
Takashi Iwai7639a062015-03-03 10:07:24 +01004914 switch (codec->core.vendor_id) {
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004915 case 0x10ec0255:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004916 alc_process_coef_fw(codec, coef0255);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004917 break;
Kailang Yang736f20a2017-10-20 15:06:34 +08004918 case 0x10ec0236:
Kailang Yange69e7e02016-05-30 15:58:28 +08004919 case 0x10ec0256:
4920 alc_process_coef_fw(codec, coef0256);
4921 break;
Kailang Yang71683c32017-06-20 16:33:50 +08004922 case 0x10ec0234:
4923 case 0x10ec0274:
4924 case 0x10ec0294:
4925 alc_write_coef_idx(codec, 0x45, 0xd689);
4926 break;
Kailang Yang13fd08a2014-05-21 16:49:48 +08004927 case 0x10ec0233:
David Henningsson73bdd592013-04-15 15:44:14 +02004928 case 0x10ec0283:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004929 alc_process_coef_fw(codec, coef0233);
David Henningsson73bdd592013-04-15 15:44:14 +02004930 break;
Kailang Yang1a5bc8d2015-05-12 17:11:10 +08004931 case 0x10ec0298:
Kailang Yang89542932017-07-17 15:03:43 +08004932 val = alc_read_coef_idx(codec, 0x50);
4933 if (val & (1 << 12)) {
4934 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
4935 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
4936 msleep(300);
4937 } else {
4938 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
4939 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
4940 msleep(300);
4941 }
4942 break;
Kailang Yangf3b70332015-04-08 15:01:17 +08004943 case 0x10ec0286:
4944 case 0x10ec0288:
4945 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
4946 msleep(300);
4947 alc_process_coef_fw(codec, coef0288);
4948 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004949 case 0x10ec0292:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004950 alc_process_coef_fw(codec, coef0292);
David Henningsson73bdd592013-04-15 15:44:14 +02004951 break;
Kailang Yanga22aa262014-04-23 17:34:28 +08004952 case 0x10ec0293:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004953 alc_process_coef_fw(codec, coef0293);
Kailang Yanga22aa262014-04-23 17:34:28 +08004954 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004955 case 0x10ec0668:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004956 alc_process_coef_fw(codec, coef0688);
David Henningsson73bdd592013-04-15 15:44:14 +02004957 break;
Kailang Yangc2b691e2018-01-17 15:22:55 +08004958 case 0x10ec0215:
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004959 case 0x10ec0225:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004960 case 0x10ec0285:
Kailang Yang7d727862016-05-24 16:46:07 +08004961 case 0x10ec0295:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004962 case 0x10ec0289:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08004963 case 0x10ec0299:
Kailang Yang5a367672017-07-21 15:23:53 +08004964 val = alc_read_coef_idx(codec, 0x45);
4965 if (val & (1 << 9))
4966 alc_process_coef_fw(codec, coef0225_2);
4967 else
4968 alc_process_coef_fw(codec, coef0225_1);
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004969 break;
Kailang Yang78f4f7c2016-06-07 11:31:34 +08004970 case 0x10ec0867:
4971 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
4972 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004973 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01004974 codec_dbg(codec, "Headset jack set to iPhone-style headset mode.\n");
David Henningsson73bdd592013-04-15 15:44:14 +02004975}
4976
4977/* Nokia type */
4978static void alc_headset_mode_omtp(struct hda_codec *codec)
4979{
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004980 static const struct coef_fw coef0255[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004981 WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
4982 WRITE_COEF(0x1b, 0x0c2b),
4983 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
4984 {}
4985 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004986 static const struct coef_fw coef0256[] = {
Kailang Yange69e7e02016-05-30 15:58:28 +08004987 WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
Kailang Yang717f43d2019-05-31 17:16:53 +08004988 WRITE_COEF(0x1b, 0x0e6b),
Kailang Yange69e7e02016-05-30 15:58:28 +08004989 {}
4990 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004991 static const struct coef_fw coef0233[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004992 WRITE_COEF(0x45, 0xe429),
4993 WRITE_COEF(0x1b, 0x0c2b),
4994 WRITE_COEF(0x32, 0x4ea3),
4995 {}
4996 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004997 static const struct coef_fw coef0288[] = {
Kailang Yangf3b70332015-04-08 15:01:17 +08004998 UPDATE_COEF(0x50, 0x2000, 0x2000),
4999 UPDATE_COEF(0x56, 0x0006, 0x0006),
5000 UPDATE_COEF(0x66, 0x0008, 0),
5001 UPDATE_COEF(0x67, 0x2000, 0),
5002 {}
5003 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005004 static const struct coef_fw coef0292[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005005 WRITE_COEF(0x6b, 0xe429),
5006 WRITE_COEF(0x76, 0x0008),
5007 WRITE_COEF(0x18, 0x7388),
5008 {}
5009 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005010 static const struct coef_fw coef0293[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005011 WRITE_COEF(0x45, 0xe429), /* Set to omtp type */
5012 UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
5013 {}
5014 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005015 static const struct coef_fw coef0688[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005016 WRITE_COEF(0x11, 0x0001),
5017 WRITE_COEF(0x15, 0x0d50),
5018 WRITE_COEF(0xc3, 0x0000),
5019 {}
5020 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005021 static const struct coef_fw coef0225[] = {
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08005022 UPDATE_COEF(0x45, 0x3f<<10, 0x39<<10),
Kailang Yang5a367672017-07-21 15:23:53 +08005023 UPDATE_COEF(0x63, 3<<14, 2<<14),
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08005024 {}
5025 };
Takashi Iwai54db6c32014-08-18 15:11:19 +02005026
Takashi Iwai7639a062015-03-03 10:07:24 +01005027 switch (codec->core.vendor_id) {
Kailang Yang9a22a8f52013-11-08 15:54:49 +08005028 case 0x10ec0255:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005029 alc_process_coef_fw(codec, coef0255);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08005030 break;
Kailang Yang736f20a2017-10-20 15:06:34 +08005031 case 0x10ec0236:
Kailang Yange69e7e02016-05-30 15:58:28 +08005032 case 0x10ec0256:
5033 alc_process_coef_fw(codec, coef0256);
5034 break;
Kailang Yang71683c32017-06-20 16:33:50 +08005035 case 0x10ec0234:
5036 case 0x10ec0274:
5037 case 0x10ec0294:
5038 alc_write_coef_idx(codec, 0x45, 0xe689);
5039 break;
Kailang Yang13fd08a2014-05-21 16:49:48 +08005040 case 0x10ec0233:
David Henningsson73bdd592013-04-15 15:44:14 +02005041 case 0x10ec0283:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005042 alc_process_coef_fw(codec, coef0233);
David Henningsson73bdd592013-04-15 15:44:14 +02005043 break;
Kailang Yang1a5bc8d2015-05-12 17:11:10 +08005044 case 0x10ec0298:
5045 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);/* Headset output enable */
Kailang Yang89542932017-07-17 15:03:43 +08005046 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5047 msleep(300);
5048 break;
Kailang Yangf3b70332015-04-08 15:01:17 +08005049 case 0x10ec0286:
5050 case 0x10ec0288:
5051 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5052 msleep(300);
5053 alc_process_coef_fw(codec, coef0288);
5054 break;
David Henningsson73bdd592013-04-15 15:44:14 +02005055 case 0x10ec0292:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005056 alc_process_coef_fw(codec, coef0292);
David Henningsson73bdd592013-04-15 15:44:14 +02005057 break;
Kailang Yanga22aa262014-04-23 17:34:28 +08005058 case 0x10ec0293:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005059 alc_process_coef_fw(codec, coef0293);
Kailang Yanga22aa262014-04-23 17:34:28 +08005060 break;
David Henningsson73bdd592013-04-15 15:44:14 +02005061 case 0x10ec0668:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005062 alc_process_coef_fw(codec, coef0688);
David Henningsson73bdd592013-04-15 15:44:14 +02005063 break;
Kailang Yangc2b691e2018-01-17 15:22:55 +08005064 case 0x10ec0215:
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08005065 case 0x10ec0225:
Kailang Yangc2b691e2018-01-17 15:22:55 +08005066 case 0x10ec0285:
Kailang Yang7d727862016-05-24 16:46:07 +08005067 case 0x10ec0295:
Kailang Yangc2b691e2018-01-17 15:22:55 +08005068 case 0x10ec0289:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08005069 case 0x10ec0299:
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08005070 alc_process_coef_fw(codec, coef0225);
5071 break;
David Henningsson73bdd592013-04-15 15:44:14 +02005072 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01005073 codec_dbg(codec, "Headset jack set to Nokia-style headset mode.\n");
David Henningsson73bdd592013-04-15 15:44:14 +02005074}
5075
5076static void alc_determine_headset_type(struct hda_codec *codec)
5077{
5078 int val;
5079 bool is_ctia = false;
5080 struct alc_spec *spec = codec->spec;
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005081 static const struct coef_fw coef0255[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005082 WRITE_COEF(0x45, 0xd089), /* combo jack auto switch control(Check type)*/
5083 WRITE_COEF(0x49, 0x0149), /* combo jack auto switch control(Vref
5084 conteol) */
5085 {}
5086 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005087 static const struct coef_fw coef0288[] = {
Kailang Yangf3b70332015-04-08 15:01:17 +08005088 UPDATE_COEF(0x4f, 0xfcc0, 0xd400), /* Check Type */
5089 {}
5090 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005091 static const struct coef_fw coef0298[] = {
Kailang Yang89542932017-07-17 15:03:43 +08005092 UPDATE_COEF(0x50, 0x2000, 0x2000),
5093 UPDATE_COEF(0x56, 0x0006, 0x0006),
5094 UPDATE_COEF(0x66, 0x0008, 0),
5095 UPDATE_COEF(0x67, 0x2000, 0),
5096 UPDATE_COEF(0x19, 0x1300, 0x1300),
5097 {}
5098 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005099 static const struct coef_fw coef0293[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005100 UPDATE_COEF(0x4a, 0x000f, 0x0008), /* Combo Jack auto detect */
5101 WRITE_COEF(0x45, 0xD429), /* Set to ctia type */
5102 {}
5103 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005104 static const struct coef_fw coef0688[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005105 WRITE_COEF(0x11, 0x0001),
5106 WRITE_COEF(0xb7, 0x802b),
5107 WRITE_COEF(0x15, 0x0d60),
5108 WRITE_COEF(0xc3, 0x0c00),
5109 {}
5110 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005111 static const struct coef_fw coef0274[] = {
Kailang Yang71683c32017-06-20 16:33:50 +08005112 UPDATE_COEF(0x4a, 0x0010, 0),
5113 UPDATE_COEF(0x4a, 0x8000, 0),
5114 WRITE_COEF(0x45, 0xd289),
5115 UPDATE_COEF(0x49, 0x0300, 0x0300),
5116 {}
5117 };
David Henningsson73bdd592013-04-15 15:44:14 +02005118
Takashi Iwai7639a062015-03-03 10:07:24 +01005119 switch (codec->core.vendor_id) {
Kailang Yang9a22a8f52013-11-08 15:54:49 +08005120 case 0x10ec0255:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005121 alc_process_coef_fw(codec, coef0255);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08005122 msleep(300);
5123 val = alc_read_coef_idx(codec, 0x46);
5124 is_ctia = (val & 0x0070) == 0x0070;
5125 break;
Kailang Yang717f43d2019-05-31 17:16:53 +08005126 case 0x10ec0236:
5127 case 0x10ec0256:
5128 alc_write_coef_idx(codec, 0x1b, 0x0e4b);
5129 alc_write_coef_idx(codec, 0x06, 0x6104);
5130 alc_write_coefex_idx(codec, 0x57, 0x3, 0x09a3);
5131
5132 snd_hda_codec_write(codec, 0x21, 0,
5133 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5134 msleep(80);
5135 snd_hda_codec_write(codec, 0x21, 0,
5136 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5137
5138 alc_process_coef_fw(codec, coef0255);
5139 msleep(300);
5140 val = alc_read_coef_idx(codec, 0x46);
5141 is_ctia = (val & 0x0070) == 0x0070;
5142
5143 alc_write_coefex_idx(codec, 0x57, 0x3, 0x0da3);
5144 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5145
5146 snd_hda_codec_write(codec, 0x21, 0,
5147 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5148 msleep(80);
5149 snd_hda_codec_write(codec, 0x21, 0,
5150 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5151 break;
Kailang Yang71683c32017-06-20 16:33:50 +08005152 case 0x10ec0234:
5153 case 0x10ec0274:
5154 case 0x10ec0294:
5155 alc_process_coef_fw(codec, coef0274);
5156 msleep(80);
5157 val = alc_read_coef_idx(codec, 0x46);
5158 is_ctia = (val & 0x00f0) == 0x00f0;
5159 break;
Kailang Yang13fd08a2014-05-21 16:49:48 +08005160 case 0x10ec0233:
David Henningsson73bdd592013-04-15 15:44:14 +02005161 case 0x10ec0283:
5162 alc_write_coef_idx(codec, 0x45, 0xd029);
5163 msleep(300);
5164 val = alc_read_coef_idx(codec, 0x46);
5165 is_ctia = (val & 0x0070) == 0x0070;
5166 break;
Kailang Yang1a5bc8d2015-05-12 17:11:10 +08005167 case 0x10ec0298:
Kailang Yang89542932017-07-17 15:03:43 +08005168 snd_hda_codec_write(codec, 0x21, 0,
5169 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5170 msleep(100);
5171 snd_hda_codec_write(codec, 0x21, 0,
5172 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5173 msleep(200);
5174
5175 val = alc_read_coef_idx(codec, 0x50);
5176 if (val & (1 << 12)) {
5177 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
5178 alc_process_coef_fw(codec, coef0288);
5179 msleep(350);
5180 val = alc_read_coef_idx(codec, 0x50);
5181 is_ctia = (val & 0x0070) == 0x0070;
5182 } else {
5183 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
5184 alc_process_coef_fw(codec, coef0288);
5185 msleep(350);
5186 val = alc_read_coef_idx(codec, 0x50);
5187 is_ctia = (val & 0x0070) == 0x0070;
5188 }
5189 alc_process_coef_fw(codec, coef0298);
5190 snd_hda_codec_write(codec, 0x21, 0,
5191 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP);
5192 msleep(75);
5193 snd_hda_codec_write(codec, 0x21, 0,
5194 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5195 break;
Kailang Yangf3b70332015-04-08 15:01:17 +08005196 case 0x10ec0286:
5197 case 0x10ec0288:
5198 alc_process_coef_fw(codec, coef0288);
5199 msleep(350);
5200 val = alc_read_coef_idx(codec, 0x50);
5201 is_ctia = (val & 0x0070) == 0x0070;
5202 break;
David Henningsson73bdd592013-04-15 15:44:14 +02005203 case 0x10ec0292:
5204 alc_write_coef_idx(codec, 0x6b, 0xd429);
5205 msleep(300);
5206 val = alc_read_coef_idx(codec, 0x6c);
5207 is_ctia = (val & 0x001c) == 0x001c;
5208 break;
Kailang Yanga22aa262014-04-23 17:34:28 +08005209 case 0x10ec0293:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005210 alc_process_coef_fw(codec, coef0293);
Kailang Yanga22aa262014-04-23 17:34:28 +08005211 msleep(300);
5212 val = alc_read_coef_idx(codec, 0x46);
5213 is_ctia = (val & 0x0070) == 0x0070;
5214 break;
David Henningsson73bdd592013-04-15 15:44:14 +02005215 case 0x10ec0668:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005216 alc_process_coef_fw(codec, coef0688);
David Henningsson73bdd592013-04-15 15:44:14 +02005217 msleep(300);
5218 val = alc_read_coef_idx(codec, 0xbe);
5219 is_ctia = (val & 0x1c02) == 0x1c02;
5220 break;
Kailang Yangc2b691e2018-01-17 15:22:55 +08005221 case 0x10ec0215:
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08005222 case 0x10ec0225:
Kailang Yangc2b691e2018-01-17 15:22:55 +08005223 case 0x10ec0285:
Kailang Yang7d727862016-05-24 16:46:07 +08005224 case 0x10ec0295:
Kailang Yangc2b691e2018-01-17 15:22:55 +08005225 case 0x10ec0289:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08005226 case 0x10ec0299:
Kailang Yangda911b12018-01-05 16:50:08 +08005227 snd_hda_codec_write(codec, 0x21, 0,
5228 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5229 msleep(80);
5230 snd_hda_codec_write(codec, 0x21, 0,
5231 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5232
Kailang Yang5a367672017-07-21 15:23:53 +08005233 alc_process_coef_fw(codec, alc225_pre_hsmode);
5234 alc_update_coef_idx(codec, 0x67, 0xf000, 0x1000);
5235 val = alc_read_coef_idx(codec, 0x45);
5236 if (val & (1 << 9)) {
5237 alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5238 alc_update_coef_idx(codec, 0x49, 3<<8, 2<<8);
5239 msleep(800);
5240 val = alc_read_coef_idx(codec, 0x46);
5241 is_ctia = (val & 0x00f0) == 0x00f0;
5242 } else {
5243 alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5244 alc_update_coef_idx(codec, 0x49, 3<<8, 1<<8);
5245 msleep(800);
5246 val = alc_read_coef_idx(codec, 0x46);
5247 is_ctia = (val & 0x00f0) == 0x00f0;
5248 }
5249 alc_update_coef_idx(codec, 0x4a, 7<<6, 7<<6);
5250 alc_update_coef_idx(codec, 0x4a, 3<<4, 3<<4);
5251 alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
Kailang Yangda911b12018-01-05 16:50:08 +08005252
5253 snd_hda_codec_write(codec, 0x21, 0,
5254 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5255 msleep(80);
5256 snd_hda_codec_write(codec, 0x21, 0,
5257 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08005258 break;
Kailang Yang78f4f7c2016-06-07 11:31:34 +08005259 case 0x10ec0867:
5260 is_ctia = true;
5261 break;
David Henningsson73bdd592013-04-15 15:44:14 +02005262 }
5263
Takashi Iwai4e76a882014-02-25 12:21:03 +01005264 codec_dbg(codec, "Headset jack detected iPhone-style headset: %s\n",
David Henningsson73bdd592013-04-15 15:44:14 +02005265 is_ctia ? "yes" : "no");
5266 spec->current_headset_type = is_ctia ? ALC_HEADSET_TYPE_CTIA : ALC_HEADSET_TYPE_OMTP;
5267}
5268
5269static void alc_update_headset_mode(struct hda_codec *codec)
5270{
5271 struct alc_spec *spec = codec->spec;
5272
5273 hda_nid_t mux_pin = spec->gen.imux_pins[spec->gen.cur_mux[0]];
Takashi Iwai35a39f92019-02-01 11:19:50 +01005274 hda_nid_t hp_pin = alc_get_hp_pin(spec);
David Henningsson73bdd592013-04-15 15:44:14 +02005275
5276 int new_headset_mode;
5277
5278 if (!snd_hda_jack_detect(codec, hp_pin))
5279 new_headset_mode = ALC_HEADSET_MODE_UNPLUGGED;
5280 else if (mux_pin == spec->headset_mic_pin)
5281 new_headset_mode = ALC_HEADSET_MODE_HEADSET;
5282 else if (mux_pin == spec->headphone_mic_pin)
5283 new_headset_mode = ALC_HEADSET_MODE_MIC;
5284 else
5285 new_headset_mode = ALC_HEADSET_MODE_HEADPHONE;
5286
David Henningsson5959a6b2013-11-12 11:10:57 +01005287 if (new_headset_mode == spec->current_headset_mode) {
5288 snd_hda_gen_update_outputs(codec);
David Henningsson73bdd592013-04-15 15:44:14 +02005289 return;
David Henningsson5959a6b2013-11-12 11:10:57 +01005290 }
David Henningsson73bdd592013-04-15 15:44:14 +02005291
5292 switch (new_headset_mode) {
5293 case ALC_HEADSET_MODE_UNPLUGGED:
5294 alc_headset_mode_unplugged(codec);
Kailang Yangaeac1a02019-05-16 16:10:44 +08005295 spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5296 spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
David Henningsson73bdd592013-04-15 15:44:14 +02005297 spec->gen.hp_jack_present = false;
5298 break;
5299 case ALC_HEADSET_MODE_HEADSET:
5300 if (spec->current_headset_type == ALC_HEADSET_TYPE_UNKNOWN)
5301 alc_determine_headset_type(codec);
5302 if (spec->current_headset_type == ALC_HEADSET_TYPE_CTIA)
5303 alc_headset_mode_ctia(codec);
5304 else if (spec->current_headset_type == ALC_HEADSET_TYPE_OMTP)
5305 alc_headset_mode_omtp(codec);
5306 spec->gen.hp_jack_present = true;
5307 break;
5308 case ALC_HEADSET_MODE_MIC:
5309 alc_headset_mode_mic_in(codec, hp_pin, spec->headphone_mic_pin);
5310 spec->gen.hp_jack_present = false;
5311 break;
5312 case ALC_HEADSET_MODE_HEADPHONE:
5313 alc_headset_mode_default(codec);
5314 spec->gen.hp_jack_present = true;
5315 break;
5316 }
5317 if (new_headset_mode != ALC_HEADSET_MODE_MIC) {
5318 snd_hda_set_pin_ctl_cache(codec, hp_pin,
5319 AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
David Henningsson1f8b46c2015-05-12 14:38:15 +02005320 if (spec->headphone_mic_pin && spec->headphone_mic_pin != hp_pin)
David Henningsson73bdd592013-04-15 15:44:14 +02005321 snd_hda_set_pin_ctl_cache(codec, spec->headphone_mic_pin,
5322 PIN_VREFHIZ);
5323 }
5324 spec->current_headset_mode = new_headset_mode;
5325
5326 snd_hda_gen_update_outputs(codec);
5327}
5328
5329static void alc_update_headset_mode_hook(struct hda_codec *codec,
Takashi Iwai7fe30712014-01-30 17:59:02 +01005330 struct snd_kcontrol *kcontrol,
5331 struct snd_ctl_elem_value *ucontrol)
David Henningsson73bdd592013-04-15 15:44:14 +02005332{
5333 alc_update_headset_mode(codec);
5334}
5335
Takashi Iwai1a4f69d2014-09-11 15:22:46 +02005336static void alc_update_headset_jack_cb(struct hda_codec *codec,
5337 struct hda_jack_callback *jack)
David Henningsson73bdd592013-04-15 15:44:14 +02005338{
David Henningsson73bdd592013-04-15 15:44:14 +02005339 snd_hda_gen_hp_automute(codec, jack);
5340}
5341
5342static void alc_probe_headset_mode(struct hda_codec *codec)
5343{
5344 int i;
5345 struct alc_spec *spec = codec->spec;
5346 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5347
5348 /* Find mic pins */
5349 for (i = 0; i < cfg->num_inputs; i++) {
5350 if (cfg->inputs[i].is_headset_mic && !spec->headset_mic_pin)
5351 spec->headset_mic_pin = cfg->inputs[i].pin;
5352 if (cfg->inputs[i].is_headphone_mic && !spec->headphone_mic_pin)
5353 spec->headphone_mic_pin = cfg->inputs[i].pin;
5354 }
5355
Takashi Iwai0bed2aa2018-06-19 12:45:53 +02005356 WARN_ON(spec->gen.cap_sync_hook);
David Henningsson73bdd592013-04-15 15:44:14 +02005357 spec->gen.cap_sync_hook = alc_update_headset_mode_hook;
5358 spec->gen.automute_hook = alc_update_headset_mode;
5359 spec->gen.hp_automute_hook = alc_update_headset_jack_cb;
5360}
5361
5362static void alc_fixup_headset_mode(struct hda_codec *codec,
5363 const struct hda_fixup *fix, int action)
5364{
5365 struct alc_spec *spec = codec->spec;
5366
5367 switch (action) {
5368 case HDA_FIXUP_ACT_PRE_PROBE:
5369 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC | HDA_PINCFG_HEADPHONE_MIC;
5370 break;
5371 case HDA_FIXUP_ACT_PROBE:
5372 alc_probe_headset_mode(codec);
5373 break;
5374 case HDA_FIXUP_ACT_INIT:
Kailang Yangaeac1a02019-05-16 16:10:44 +08005375 if (is_s3_resume(codec) || is_s4_resume(codec)) {
5376 spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5377 spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
5378 }
David Henningsson73bdd592013-04-15 15:44:14 +02005379 alc_update_headset_mode(codec);
5380 break;
5381 }
5382}
5383
5384static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
5385 const struct hda_fixup *fix, int action)
5386{
5387 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5388 struct alc_spec *spec = codec->spec;
5389 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5390 }
5391 else
5392 alc_fixup_headset_mode(codec, fix, action);
5393}
5394
Kailang Yang31278992014-03-03 15:27:22 +08005395static void alc255_set_default_jack_type(struct hda_codec *codec)
5396{
5397 /* Set to iphone type */
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005398 static const struct coef_fw alc255fw[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005399 WRITE_COEF(0x1b, 0x880b),
5400 WRITE_COEF(0x45, 0xd089),
5401 WRITE_COEF(0x1b, 0x080b),
5402 WRITE_COEF(0x46, 0x0004),
5403 WRITE_COEF(0x1b, 0x0c0b),
5404 {}
5405 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005406 static const struct coef_fw alc256fw[] = {
Kailang Yange69e7e02016-05-30 15:58:28 +08005407 WRITE_COEF(0x1b, 0x884b),
5408 WRITE_COEF(0x45, 0xd089),
5409 WRITE_COEF(0x1b, 0x084b),
5410 WRITE_COEF(0x46, 0x0004),
5411 WRITE_COEF(0x1b, 0x0c4b),
5412 {}
5413 };
5414 switch (codec->core.vendor_id) {
5415 case 0x10ec0255:
5416 alc_process_coef_fw(codec, alc255fw);
5417 break;
Kailang Yang736f20a2017-10-20 15:06:34 +08005418 case 0x10ec0236:
Kailang Yange69e7e02016-05-30 15:58:28 +08005419 case 0x10ec0256:
5420 alc_process_coef_fw(codec, alc256fw);
5421 break;
5422 }
Kailang Yang31278992014-03-03 15:27:22 +08005423 msleep(30);
5424}
5425
Kailang Yang9a22a8f52013-11-08 15:54:49 +08005426static void alc_fixup_headset_mode_alc255(struct hda_codec *codec,
5427 const struct hda_fixup *fix, int action)
5428{
5429 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Kailang Yang31278992014-03-03 15:27:22 +08005430 alc255_set_default_jack_type(codec);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08005431 }
5432 alc_fixup_headset_mode(codec, fix, action);
5433}
5434
Kailang Yang31278992014-03-03 15:27:22 +08005435static void alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec,
5436 const struct hda_fixup *fix, int action)
5437{
5438 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5439 struct alc_spec *spec = codec->spec;
5440 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5441 alc255_set_default_jack_type(codec);
5442 }
5443 else
5444 alc_fixup_headset_mode(codec, fix, action);
5445}
5446
Kailang Yange1e62b92015-04-08 16:01:22 +08005447static void alc288_update_headset_jack_cb(struct hda_codec *codec,
5448 struct hda_jack_callback *jack)
5449{
5450 struct alc_spec *spec = codec->spec;
Kailang Yange1e62b92015-04-08 16:01:22 +08005451
5452 alc_update_headset_jack_cb(codec, jack);
5453 /* Headset Mic enable or disable, only for Dell Dino */
Takashi Iwaid44a6862018-06-19 23:04:03 +02005454 alc_update_gpio_data(codec, 0x40, spec->gen.hp_jack_present);
Kailang Yange1e62b92015-04-08 16:01:22 +08005455}
5456
5457static void alc_fixup_headset_mode_dell_alc288(struct hda_codec *codec,
5458 const struct hda_fixup *fix, int action)
5459{
5460 alc_fixup_headset_mode(codec, fix, action);
5461 if (action == HDA_FIXUP_ACT_PROBE) {
5462 struct alc_spec *spec = codec->spec;
Takashi Iwaid44a6862018-06-19 23:04:03 +02005463 /* toggled via hp_automute_hook */
5464 spec->gpio_mask |= 0x40;
5465 spec->gpio_dir |= 0x40;
Kailang Yange1e62b92015-04-08 16:01:22 +08005466 spec->gen.hp_automute_hook = alc288_update_headset_jack_cb;
5467 }
5468}
5469
Hui Wang493a52a2014-01-14 14:07:36 +08005470static void alc_fixup_auto_mute_via_amp(struct hda_codec *codec,
5471 const struct hda_fixup *fix, int action)
5472{
5473 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5474 struct alc_spec *spec = codec->spec;
5475 spec->gen.auto_mute_via_amp = 1;
5476 }
5477}
5478
Takashi Iwai9b745ab2014-03-07 08:37:19 +01005479static void alc_fixup_no_shutup(struct hda_codec *codec,
5480 const struct hda_fixup *fix, int action)
5481{
Takashi Iwaiefe55732018-06-15 11:55:02 +02005482 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai9b745ab2014-03-07 08:37:19 +01005483 struct alc_spec *spec = codec->spec;
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01005484 spec->no_shutup_pins = 1;
Takashi Iwai9b745ab2014-03-07 08:37:19 +01005485 }
5486}
5487
Gabriele Mazzotta5e6db662014-05-20 18:58:26 +02005488static void alc_fixup_disable_aamix(struct hda_codec *codec,
5489 const struct hda_fixup *fix, int action)
5490{
5491 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5492 struct alc_spec *spec = codec->spec;
5493 /* Disable AA-loopback as it causes white noise */
5494 spec->gen.mixer_nid = 0;
5495 }
5496}
5497
Takashi Iwai7f57d802015-09-24 17:36:51 +02005498/* fixup for Thinkpad docks: add dock pins, avoid HP parser fixup */
5499static void alc_fixup_tpt440_dock(struct hda_codec *codec,
5500 const struct hda_fixup *fix, int action)
5501{
5502 static const struct hda_pintbl pincfgs[] = {
5503 { 0x16, 0x21211010 }, /* dock headphone */
5504 { 0x19, 0x21a11010 }, /* dock mic */
5505 { }
5506 };
5507 struct alc_spec *spec = codec->spec;
5508
5509 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Hui Wang871b9062019-08-14 12:09:08 +08005510 spec->reboot_notify = snd_hda_gen_reboot_notify; /* reduce noise */
Takashi Iwai7f57d802015-09-24 17:36:51 +02005511 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
5512 codec->power_save_node = 0; /* avoid click noises */
5513 snd_hda_apply_pincfgs(codec, pincfgs);
5514 }
5515}
5516
Kailang Yang61fcf8e2018-02-02 15:26:46 +08005517static void alc_fixup_tpt470_dock(struct hda_codec *codec,
5518 const struct hda_fixup *fix, int action)
5519{
5520 static const struct hda_pintbl pincfgs[] = {
5521 { 0x17, 0x21211010 }, /* dock headphone */
5522 { 0x19, 0x21a11010 }, /* dock mic */
5523 { }
5524 };
5525 struct alc_spec *spec = codec->spec;
5526
5527 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5528 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
Takashi Iwai71db96d2018-02-26 15:36:38 +01005529 snd_hda_apply_pincfgs(codec, pincfgs);
5530 } else if (action == HDA_FIXUP_ACT_INIT) {
Kailang Yang61fcf8e2018-02-02 15:26:46 +08005531 /* Enable DOCK device */
5532 snd_hda_codec_write(codec, 0x17, 0,
5533 AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
5534 /* Enable DOCK device */
5535 snd_hda_codec_write(codec, 0x19, 0,
5536 AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
Kailang Yang61fcf8e2018-02-02 15:26:46 +08005537 }
5538}
5539
Takashi Iwai399c01a2020-05-26 08:24:06 +02005540static void alc_fixup_tpt470_dacs(struct hda_codec *codec,
5541 const struct hda_fixup *fix, int action)
5542{
5543 /* Assure the speaker pin to be coupled with DAC NID 0x03; otherwise
5544 * the speaker output becomes too low by some reason on Thinkpads with
5545 * ALC298 codec
5546 */
5547 static const hda_nid_t preferred_pairs[] = {
5548 0x14, 0x03, 0x17, 0x02, 0x21, 0x02,
5549 0
5550 };
5551 struct alc_spec *spec = codec->spec;
5552
5553 if (action == HDA_FIXUP_ACT_PRE_PROBE)
5554 spec->gen.preferred_dacs = preferred_pairs;
5555}
5556
Gabriele Mazzotta9476d3692015-04-19 19:00:40 +02005557static void alc_shutup_dell_xps13(struct hda_codec *codec)
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +02005558{
5559 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01005560 int hp_pin = alc_get_hp_pin(spec);
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +02005561
Gabriele Mazzotta9476d3692015-04-19 19:00:40 +02005562 /* Prevent pop noises when headphones are plugged in */
5563 snd_hda_codec_write(codec, hp_pin, 0,
5564 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5565 msleep(20);
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +02005566}
5567
5568static void alc_fixup_dell_xps13(struct hda_codec *codec,
5569 const struct hda_fixup *fix, int action)
5570{
Takashi Iwai3e1b0c42015-04-27 10:43:22 +02005571 struct alc_spec *spec = codec->spec;
5572 struct hda_input_mux *imux = &spec->gen.input_mux;
5573 int i;
Gabriele Mazzottaf38663a2014-08-08 19:34:40 +02005574
Takashi Iwai3e1b0c42015-04-27 10:43:22 +02005575 switch (action) {
5576 case HDA_FIXUP_ACT_PRE_PROBE:
5577 /* mic pin 0x19 must be initialized with Vref Hi-Z, otherwise
5578 * it causes a click noise at start up
5579 */
5580 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
Takashi Iwaiefe55732018-06-15 11:55:02 +02005581 spec->shutup = alc_shutup_dell_xps13;
Takashi Iwai3e1b0c42015-04-27 10:43:22 +02005582 break;
5583 case HDA_FIXUP_ACT_PROBE:
Gabriele Mazzottaf38663a2014-08-08 19:34:40 +02005584 /* Make the internal mic the default input source. */
5585 for (i = 0; i < imux->num_items; i++) {
5586 if (spec->gen.imux_pins[i] == 0x12) {
5587 spec->gen.cur_mux[0] = i;
5588 break;
5589 }
5590 }
Takashi Iwai3e1b0c42015-04-27 10:43:22 +02005591 break;
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +02005592 }
5593}
5594
David Henningsson1f8b46c2015-05-12 14:38:15 +02005595static void alc_fixup_headset_mode_alc662(struct hda_codec *codec,
5596 const struct hda_fixup *fix, int action)
5597{
5598 struct alc_spec *spec = codec->spec;
5599
5600 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5601 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5602 spec->gen.hp_mic = 1; /* Mic-in is same pin as headphone */
David Henningssonb40eda62015-05-28 09:40:23 +02005603
5604 /* Disable boost for mic-in permanently. (This code is only called
5605 from quirks that guarantee that the headphone is at NID 0x1b.) */
5606 snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000);
5607 snd_hda_override_wcaps(codec, 0x1b, get_wcaps(codec, 0x1b) & ~AC_WCAP_IN_AMP);
David Henningsson1f8b46c2015-05-12 14:38:15 +02005608 } else
5609 alc_fixup_headset_mode(codec, fix, action);
5610}
5611
David Henningsson73bdd592013-04-15 15:44:14 +02005612static void alc_fixup_headset_mode_alc668(struct hda_codec *codec,
5613 const struct hda_fixup *fix, int action)
5614{
5615 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
David Henningsson73bdd592013-04-15 15:44:14 +02005616 alc_write_coef_idx(codec, 0xc4, 0x8000);
Takashi Iwai98b24882014-08-18 13:47:50 +02005617 alc_update_coef_idx(codec, 0xc2, ~0xfe, 0);
David Henningsson73bdd592013-04-15 15:44:14 +02005618 snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
5619 }
5620 alc_fixup_headset_mode(codec, fix, action);
5621}
5622
Chih-Chung Changbde7bc62013-08-05 16:38:42 +08005623/* Returns the nid of the external mic input pin, or 0 if it cannot be found. */
5624static int find_ext_mic_pin(struct hda_codec *codec)
5625{
5626 struct alc_spec *spec = codec->spec;
5627 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5628 hda_nid_t nid;
5629 unsigned int defcfg;
5630 int i;
5631
5632 for (i = 0; i < cfg->num_inputs; i++) {
5633 if (cfg->inputs[i].type != AUTO_PIN_MIC)
5634 continue;
5635 nid = cfg->inputs[i].pin;
5636 defcfg = snd_hda_codec_get_pincfg(codec, nid);
5637 if (snd_hda_get_input_pin_attr(defcfg) == INPUT_PIN_ATTR_INT)
5638 continue;
5639 return nid;
5640 }
5641
5642 return 0;
5643}
5644
Dylan Reid08a978d2012-11-18 22:56:40 -08005645static void alc271_hp_gate_mic_jack(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01005646 const struct hda_fixup *fix,
Dylan Reid08a978d2012-11-18 22:56:40 -08005647 int action)
5648{
5649 struct alc_spec *spec = codec->spec;
5650
Takashi Iwai0db75792013-01-23 13:57:20 +01005651 if (action == HDA_FIXUP_ACT_PROBE) {
Chih-Chung Changbde7bc62013-08-05 16:38:42 +08005652 int mic_pin = find_ext_mic_pin(codec);
Takashi Iwai35a39f92019-02-01 11:19:50 +01005653 int hp_pin = alc_get_hp_pin(spec);
Chih-Chung Changbde7bc62013-08-05 16:38:42 +08005654
5655 if (snd_BUG_ON(!mic_pin || !hp_pin))
Takashi Iwai0db75792013-01-23 13:57:20 +01005656 return;
Chih-Chung Changbde7bc62013-08-05 16:38:42 +08005657 snd_hda_jack_set_gating_jack(codec, mic_pin, hp_pin);
Takashi Iwai0db75792013-01-23 13:57:20 +01005658 }
Dylan Reid08a978d2012-11-18 22:56:40 -08005659}
David Henningsson693b6132012-06-22 19:12:10 +02005660
David Henningsson3e0d6112013-04-22 14:30:14 +02005661static void alc269_fixup_limit_int_mic_boost(struct hda_codec *codec,
5662 const struct hda_fixup *fix,
5663 int action)
5664{
5665 struct alc_spec *spec = codec->spec;
5666 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5667 int i;
5668
5669 /* The mic boosts on level 2 and 3 are too noisy
5670 on the internal mic input.
5671 Therefore limit the boost to 0 or 1. */
5672
5673 if (action != HDA_FIXUP_ACT_PROBE)
5674 return;
5675
5676 for (i = 0; i < cfg->num_inputs; i++) {
5677 hda_nid_t nid = cfg->inputs[i].pin;
5678 unsigned int defcfg;
5679 if (cfg->inputs[i].type != AUTO_PIN_MIC)
5680 continue;
5681 defcfg = snd_hda_codec_get_pincfg(codec, nid);
5682 if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
5683 continue;
5684
5685 snd_hda_override_amp_caps(codec, nid, HDA_INPUT,
5686 (0x00 << AC_AMPCAP_OFFSET_SHIFT) |
5687 (0x01 << AC_AMPCAP_NUM_STEPS_SHIFT) |
5688 (0x2f << AC_AMPCAP_STEP_SIZE_SHIFT) |
5689 (0 << AC_AMPCAP_MUTE_SHIFT));
5690 }
5691}
5692
Kailang Yangcd217a62013-08-22 10:15:24 +02005693static void alc283_hp_automute_hook(struct hda_codec *codec,
Takashi Iwai1a4f69d2014-09-11 15:22:46 +02005694 struct hda_jack_callback *jack)
Kailang Yangcd217a62013-08-22 10:15:24 +02005695{
5696 struct alc_spec *spec = codec->spec;
5697 int vref;
5698
5699 msleep(200);
5700 snd_hda_gen_hp_automute(codec, jack);
5701
5702 vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
5703
5704 msleep(600);
5705 snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5706 vref);
5707}
5708
Kailang Yangcd217a62013-08-22 10:15:24 +02005709static void alc283_fixup_chromebook(struct hda_codec *codec,
5710 const struct hda_fixup *fix, int action)
5711{
5712 struct alc_spec *spec = codec->spec;
Kailang Yangcd217a62013-08-22 10:15:24 +02005713
5714 switch (action) {
5715 case HDA_FIXUP_ACT_PRE_PROBE:
Kailang Yang0202e992013-12-02 15:20:15 +08005716 snd_hda_override_wcaps(codec, 0x03, 0);
Takashi Iwaid2e92702013-10-30 07:50:53 +01005717 /* Disable AA-loopback as it causes white noise */
5718 spec->gen.mixer_nid = 0;
Kailang Yang38070212013-11-01 15:57:35 +08005719 break;
5720 case HDA_FIXUP_ACT_INIT:
Kailang Yangde9481c2014-04-07 16:41:52 +08005721 /* MIC2-VREF control */
5722 /* Set to manual mode */
Takashi Iwai98b24882014-08-18 13:47:50 +02005723 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
Kailang Yang0202e992013-12-02 15:20:15 +08005724 /* Enable Line1 input control by verb */
Takashi Iwai98b24882014-08-18 13:47:50 +02005725 alc_update_coef_idx(codec, 0x1a, 0, 1 << 4);
Kailang Yang0202e992013-12-02 15:20:15 +08005726 break;
5727 }
5728}
5729
5730static void alc283_fixup_sense_combo_jack(struct hda_codec *codec,
5731 const struct hda_fixup *fix, int action)
5732{
5733 struct alc_spec *spec = codec->spec;
Kailang Yang0202e992013-12-02 15:20:15 +08005734
5735 switch (action) {
5736 case HDA_FIXUP_ACT_PRE_PROBE:
Kailang Yangcd217a62013-08-22 10:15:24 +02005737 spec->gen.hp_automute_hook = alc283_hp_automute_hook;
5738 break;
5739 case HDA_FIXUP_ACT_INIT:
5740 /* MIC2-VREF control */
5741 /* Set to manual mode */
Takashi Iwai98b24882014-08-18 13:47:50 +02005742 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
Kailang Yangcd217a62013-08-22 10:15:24 +02005743 break;
5744 }
5745}
5746
Takashi Iwai7bba2152013-09-06 15:45:38 +02005747/* mute tablet speaker pin (0x14) via dock plugging in addition */
5748static void asus_tx300_automute(struct hda_codec *codec)
5749{
5750 struct alc_spec *spec = codec->spec;
5751 snd_hda_gen_update_outputs(codec);
5752 if (snd_hda_jack_detect(codec, 0x1b))
5753 spec->gen.mute_bits |= (1ULL << 0x14);
5754}
5755
5756static void alc282_fixup_asus_tx300(struct hda_codec *codec,
5757 const struct hda_fixup *fix, int action)
5758{
5759 struct alc_spec *spec = codec->spec;
Takashi Iwai7bba2152013-09-06 15:45:38 +02005760 static const struct hda_pintbl dock_pins[] = {
5761 { 0x1b, 0x21114000 }, /* dock speaker pin */
5762 {}
5763 };
Takashi Iwai7bba2152013-09-06 15:45:38 +02005764
5765 switch (action) {
5766 case HDA_FIXUP_ACT_PRE_PROBE:
Takashi Iwai1c76aa52018-06-21 16:37:54 +02005767 spec->init_amp = ALC_INIT_DEFAULT;
Takashi Iwaiae065f12018-06-19 23:00:03 +02005768 /* TX300 needs to set up GPIO2 for the speaker amp */
5769 alc_setup_gpio(codec, 0x04);
Takashi Iwai7bba2152013-09-06 15:45:38 +02005770 snd_hda_apply_pincfgs(codec, dock_pins);
5771 spec->gen.auto_mute_via_amp = 1;
5772 spec->gen.automute_hook = asus_tx300_automute;
5773 snd_hda_jack_detect_enable_callback(codec, 0x1b,
Takashi Iwai7bba2152013-09-06 15:45:38 +02005774 snd_hda_gen_hp_automute);
5775 break;
Takashi Iwai5579cd62018-06-19 22:22:41 +02005776 case HDA_FIXUP_ACT_PROBE:
5777 spec->init_amp = ALC_INIT_DEFAULT;
5778 break;
Takashi Iwai7bba2152013-09-06 15:45:38 +02005779 case HDA_FIXUP_ACT_BUILD:
5780 /* this is a bit tricky; give more sane names for the main
5781 * (tablet) speaker and the dock speaker, respectively
5782 */
Takashi Iwai56798e62017-04-11 08:10:52 +02005783 rename_ctl(codec, "Speaker Playback Switch",
5784 "Dock Speaker Playback Switch");
5785 rename_ctl(codec, "Bass Speaker Playback Switch",
5786 "Speaker Playback Switch");
Takashi Iwai7bba2152013-09-06 15:45:38 +02005787 break;
5788 }
5789}
5790
David Henningsson338cae52013-10-07 10:39:59 +02005791static void alc290_fixup_mono_speakers(struct hda_codec *codec,
5792 const struct hda_fixup *fix, int action)
5793{
David Henningsson0f4881d2013-12-20 16:08:13 +01005794 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5795 /* DAC node 0x03 is giving mono output. We therefore want to
5796 make sure 0x14 (front speaker) and 0x15 (headphones) use the
5797 stereo DAC, while leaving 0x17 (bass speaker) for node 0x03. */
Michał Mirosławcaf3c042020-01-03 10:23:48 +01005798 static const hda_nid_t conn1[] = { 0x0c };
5799 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
5800 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
David Henningsson0f4881d2013-12-20 16:08:13 +01005801 }
David Henningsson338cae52013-10-07 10:39:59 +02005802}
5803
Hui Wangdd9aa332016-08-01 10:20:32 +08005804static void alc298_fixup_speaker_volume(struct hda_codec *codec,
5805 const struct hda_fixup *fix, int action)
5806{
5807 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5808 /* The speaker is routed to the Node 0x06 by a mistake, as a result
5809 we can't adjust the speaker's volume since this node does not has
5810 Amp-out capability. we change the speaker's route to:
5811 Node 0x02 (Audio Output) -> Node 0x0c (Audio Mixer) -> Node 0x17 (
5812 Pin Complex), since Node 0x02 has Amp-out caps, we can adjust
5813 speaker's volume now. */
5814
Michał Mirosławcaf3c042020-01-03 10:23:48 +01005815 static const hda_nid_t conn1[] = { 0x0c };
5816 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn1), conn1);
Hui Wangdd9aa332016-08-01 10:20:32 +08005817 }
5818}
5819
Takashi Iwaie312a862018-03-06 12:14:17 +01005820/* disable DAC3 (0x06) selection on NID 0x17 as it has no volume amp control */
5821static void alc295_fixup_disable_dac3(struct hda_codec *codec,
5822 const struct hda_fixup *fix, int action)
5823{
5824 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Michał Mirosławcaf3c042020-01-03 10:23:48 +01005825 static const hda_nid_t conn[] = { 0x02, 0x03 };
5826 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
Takashi Iwaie312a862018-03-06 12:14:17 +01005827 }
5828}
5829
Jaroslav Kyselad2cd7952019-11-29 15:40:27 +01005830/* force NID 0x17 (Bass Speaker) to DAC1 to share it with the main speaker */
5831static void alc285_fixup_speaker2_to_dac1(struct hda_codec *codec,
5832 const struct hda_fixup *fix, int action)
5833{
5834 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Michał Mirosławcaf3c042020-01-03 10:23:48 +01005835 static const hda_nid_t conn[] = { 0x02 };
5836 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
Jaroslav Kyselad2cd7952019-11-29 15:40:27 +01005837 }
5838}
5839
Keith Packard98973f22015-07-15 12:14:39 -07005840/* Hook to update amp GPIO4 for automute */
5841static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec,
5842 struct hda_jack_callback *jack)
5843{
5844 struct alc_spec *spec = codec->spec;
5845
5846 snd_hda_gen_hp_automute(codec, jack);
5847 /* mute_led_polarity is set to 0, so we pass inverted value here */
Kai-Heng Fengdbd13172020-04-30 16:32:51 +08005848 alc_update_gpio_led(codec, 0x10, spec->mute_led_polarity,
5849 !spec->gen.hp_jack_present);
Keith Packard98973f22015-07-15 12:14:39 -07005850}
5851
5852/* Manage GPIOs for HP EliteBook Folio 9480m.
5853 *
5854 * GPIO4 is the headphone amplifier power control
5855 * GPIO3 is the audio output mute indicator LED
5856 */
5857
5858static void alc280_fixup_hp_9480m(struct hda_codec *codec,
5859 const struct hda_fixup *fix,
5860 int action)
5861{
5862 struct alc_spec *spec = codec->spec;
Keith Packard98973f22015-07-15 12:14:39 -07005863
Takashi Iwai01e4a272018-06-19 22:47:30 +02005864 alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
Keith Packard98973f22015-07-15 12:14:39 -07005865 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai01e4a272018-06-19 22:47:30 +02005866 /* amp at GPIO4; toggled via alc280_hp_gpio4_automute_hook() */
5867 spec->gpio_mask |= 0x10;
5868 spec->gpio_dir |= 0x10;
Keith Packard98973f22015-07-15 12:14:39 -07005869 spec->gen.hp_automute_hook = alc280_hp_gpio4_automute_hook;
Keith Packard98973f22015-07-15 12:14:39 -07005870 }
5871}
5872
Takashi Iwaiae065f12018-06-19 23:00:03 +02005873static void alc275_fixup_gpio4_off(struct hda_codec *codec,
5874 const struct hda_fixup *fix,
5875 int action)
5876{
5877 struct alc_spec *spec = codec->spec;
5878
5879 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5880 spec->gpio_mask |= 0x04;
5881 spec->gpio_dir |= 0x04;
5882 /* set data bit low */
5883 }
5884}
5885
Kailang Yangca169cc2017-04-25 16:17:40 +08005886static void alc233_alc662_fixup_lenovo_dual_codecs(struct hda_codec *codec,
5887 const struct hda_fixup *fix,
5888 int action)
5889{
5890 alc_fixup_dual_codecs(codec, fix, action);
5891 switch (action) {
5892 case HDA_FIXUP_ACT_PRE_PROBE:
5893 /* override card longname to provide a unique UCM profile */
5894 strcpy(codec->card->longname, "HDAudio-Lenovo-DualCodecs");
5895 break;
5896 case HDA_FIXUP_ACT_BUILD:
5897 /* rename Capture controls depending on the codec */
5898 rename_ctl(codec, "Capture Volume",
5899 codec->addr == 0 ?
5900 "Rear-Panel Capture Volume" :
5901 "Front-Panel Capture Volume");
5902 rename_ctl(codec, "Capture Switch",
5903 codec->addr == 0 ?
5904 "Rear-Panel Capture Switch" :
5905 "Front-Panel Capture Switch");
5906 break;
5907 }
5908}
5909
Kai-Heng Feng52e4e362020-05-03 23:24:47 +08005910static void alc225_fixup_s3_pop_noise(struct hda_codec *codec,
5911 const struct hda_fixup *fix, int action)
5912{
5913 if (action != HDA_FIXUP_ACT_PRE_PROBE)
5914 return;
5915
5916 codec->power_save_node = 1;
5917}
5918
Kailang Yang92266652017-12-14 15:28:58 +08005919/* Forcibly assign NID 0x03 to HP/LO while NID 0x02 to SPK for EQ */
5920static void alc274_fixup_bind_dacs(struct hda_codec *codec,
5921 const struct hda_fixup *fix, int action)
5922{
5923 struct alc_spec *spec = codec->spec;
Michał Mirosławcaf3c042020-01-03 10:23:48 +01005924 static const hda_nid_t preferred_pairs[] = {
Kailang Yang92266652017-12-14 15:28:58 +08005925 0x21, 0x03, 0x1b, 0x03, 0x16, 0x02,
5926 0
5927 };
5928
5929 if (action != HDA_FIXUP_ACT_PRE_PROBE)
5930 return;
5931
5932 spec->gen.preferred_dacs = preferred_pairs;
Kailang Yang0700d3d2019-04-26 16:13:54 +08005933 spec->gen.auto_mute_via_amp = 1;
5934 codec->power_save_node = 0;
Kailang Yang92266652017-12-14 15:28:58 +08005935}
5936
Hui Wangc4cfcf62018-11-26 14:17:16 +08005937/* The DAC of NID 0x3 will introduce click/pop noise on headphones, so invalidate it */
5938static void alc285_fixup_invalidate_dacs(struct hda_codec *codec,
5939 const struct hda_fixup *fix, int action)
5940{
5941 if (action != HDA_FIXUP_ACT_PRE_PROBE)
5942 return;
5943
5944 snd_hda_override_wcaps(codec, 0x03, 0);
5945}
5946
Kailang Yang8983eb62019-04-03 15:31:49 +08005947static void alc295_fixup_chromebook(struct hda_codec *codec,
5948 const struct hda_fixup *fix, int action)
5949{
Kailang Yangd3ba58b2019-05-06 15:09:42 +08005950 struct alc_spec *spec = codec->spec;
5951
Kailang Yang8983eb62019-04-03 15:31:49 +08005952 switch (action) {
Kailang Yangd3ba58b2019-05-06 15:09:42 +08005953 case HDA_FIXUP_ACT_PRE_PROBE:
5954 spec->ultra_low_power = true;
5955 break;
Kailang Yang8983eb62019-04-03 15:31:49 +08005956 case HDA_FIXUP_ACT_INIT:
5957 switch (codec->core.vendor_id) {
5958 case 0x10ec0295:
5959 alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15); /* Reset HP JD */
5960 alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15);
5961 break;
5962 case 0x10ec0236:
5963 alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15); /* Reset HP JD */
5964 alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15);
5965 break;
5966 }
5967 break;
5968 }
5969}
5970
Kailang Yangd1dd4212019-01-09 17:05:24 +08005971static void alc_fixup_disable_mic_vref(struct hda_codec *codec,
5972 const struct hda_fixup *fix, int action)
5973{
5974 if (action == HDA_FIXUP_ACT_PRE_PROBE)
5975 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
5976}
5977
Takashi Iwaib317b032014-01-08 11:44:21 +01005978/* for hda_fixup_thinkpad_acpi() */
5979#include "thinkpad_helper.c"
David Henningssonb67ae3f2013-11-05 13:11:37 +01005980
Takashi Iwaid5a6cab2018-06-13 12:43:10 +02005981static void alc_fixup_thinkpad_acpi(struct hda_codec *codec,
5982 const struct hda_fixup *fix, int action)
5983{
5984 alc_fixup_no_shutup(codec, fix, action); /* reduce click noise */
5985 hda_fixup_thinkpad_acpi(codec, fix, action);
5986}
5987
Tom Bridenbbf8ff6b2018-05-29 17:34:20 +01005988/* for alc295_fixup_hp_top_speakers */
5989#include "hp_x360_helper.c"
5990
Takashi Iwai1d045db2011-07-07 18:23:21 +02005991enum {
5992 ALC269_FIXUP_SONY_VAIO,
5993 ALC275_FIXUP_SONY_VAIO_GPIO2,
5994 ALC269_FIXUP_DELL_M101Z,
5995 ALC269_FIXUP_SKU_IGNORE,
5996 ALC269_FIXUP_ASUS_G73JW,
5997 ALC269_FIXUP_LENOVO_EAPD,
5998 ALC275_FIXUP_SONY_HWEQ,
Takashi Iwaie9bd7d52014-05-21 11:06:49 +02005999 ALC275_FIXUP_SONY_DISABLE_AAMIX,
Takashi Iwai1d045db2011-07-07 18:23:21 +02006000 ALC271_FIXUP_DMIC,
Takashi Iwai017f2a102011-07-09 14:42:25 +02006001 ALC269_FIXUP_PCM_44K,
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02006002 ALC269_FIXUP_STEREO_DMIC,
David Henningsson7c478f02013-10-11 10:18:46 +02006003 ALC269_FIXUP_HEADSET_MIC,
Takashi Iwai24519912011-08-16 15:08:49 +02006004 ALC269_FIXUP_QUANTA_MUTE,
6005 ALC269_FIXUP_LIFEBOOK,
David Henningsson2041d562014-06-13 11:15:44 +02006006 ALC269_FIXUP_LIFEBOOK_EXTMIC,
Takashi Iwaicc7016a2015-04-08 20:47:55 +02006007 ALC269_FIXUP_LIFEBOOK_HP_PIN,
Takashi Iwai4df3fd12015-06-29 08:38:02 +02006008 ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT,
Jan-Marek Glogowskifdcc9682018-02-14 11:29:15 +01006009 ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC,
Takashi Iwaia4297b52011-08-23 18:40:12 +02006010 ALC269_FIXUP_AMIC,
6011 ALC269_FIXUP_DMIC,
6012 ALC269VB_FIXUP_AMIC,
6013 ALC269VB_FIXUP_DMIC,
Takashi Iwai08fb0d02013-01-10 17:33:58 +01006014 ALC269_FIXUP_HP_MUTE_LED,
David Henningssond06ac142013-02-18 11:41:55 +01006015 ALC269_FIXUP_HP_MUTE_LED_MIC1,
Takashi Iwai08fb0d02013-01-10 17:33:58 +01006016 ALC269_FIXUP_HP_MUTE_LED_MIC2,
Tom Briden7f783bd2017-03-25 10:12:01 +00006017 ALC269_FIXUP_HP_MUTE_LED_MIC3,
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01006018 ALC269_FIXUP_HP_GPIO_LED,
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08006019 ALC269_FIXUP_HP_GPIO_MIC1_LED,
6020 ALC269_FIXUP_HP_LINE1_MIC1_LED,
David Henningsson693b6132012-06-22 19:12:10 +02006021 ALC269_FIXUP_INV_DMIC,
David Henningsson108cc102012-07-20 10:37:25 +02006022 ALC269_FIXUP_LENOVO_DOCK,
Takashi Iwaib590b382020-05-14 18:05:33 +02006023 ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST,
Takashi Iwai9b745ab2014-03-07 08:37:19 +01006024 ALC269_FIXUP_NO_SHUTUP,
David Henningsson88cfcf82013-10-11 10:18:45 +02006025 ALC286_FIXUP_SONY_MIC_NO_PRESENCE,
David Henningsson108cc102012-07-20 10:37:25 +02006026 ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
David Henningsson73bdd592013-04-15 15:44:14 +02006027 ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
6028 ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
David Henningsson338cae52013-10-07 10:39:59 +02006029 ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
Kailang Yangfcc6c872017-06-29 15:21:27 +08006030 ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
David Henningsson73bdd592013-04-15 15:44:14 +02006031 ALC269_FIXUP_HEADSET_MODE,
6032 ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
Takashi Iwai78197172015-06-27 10:21:13 +02006033 ALC269_FIXUP_ASPIRE_HEADSET_MIC,
David Henningssond240d1d2013-04-15 12:50:02 +02006034 ALC269_FIXUP_ASUS_X101_FUNC,
6035 ALC269_FIXUP_ASUS_X101_VERB,
6036 ALC269_FIXUP_ASUS_X101,
Dylan Reid08a978d2012-11-18 22:56:40 -08006037 ALC271_FIXUP_AMIC_MIC2,
6038 ALC271_FIXUP_HP_GATE_MIC_JACK,
Oleksij Rempelb1e89722013-12-04 20:50:53 +01006039 ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572,
Dylan Reid42397002013-04-05 14:58:22 -07006040 ALC269_FIXUP_ACER_AC700,
David Henningsson3e0d6112013-04-22 14:30:14 +02006041 ALC269_FIXUP_LIMIT_INT_MIC_BOOST,
Oleksij Rempel2cede302013-11-27 17:12:03 +01006042 ALC269VB_FIXUP_ASUS_ZENBOOK,
Takashi Iwai23870832013-11-29 14:13:12 +01006043 ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A,
David Henningsson8e35cd42013-11-06 11:20:01 +01006044 ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED,
Anisse Astier02b504d2013-06-03 11:53:10 +02006045 ALC269VB_FIXUP_ORDISSIMO_EVE2,
Kailang Yangcd217a62013-08-22 10:15:24 +02006046 ALC283_FIXUP_CHROME_BOOK,
Kailang Yang0202e992013-12-02 15:20:15 +08006047 ALC283_FIXUP_SENSE_COMBO_JACK,
Takashi Iwai7bba2152013-09-06 15:45:38 +02006048 ALC282_FIXUP_ASUS_TX300,
Kailang Yang1bb3e062013-09-27 13:10:25 +02006049 ALC283_FIXUP_INT_MIC,
David Henningsson338cae52013-10-07 10:39:59 +02006050 ALC290_FIXUP_MONO_SPEAKERS,
David Henningsson0f4881d2013-12-20 16:08:13 +01006051 ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
6052 ALC290_FIXUP_SUBWOOFER,
6053 ALC290_FIXUP_SUBWOOFER_HSJACK,
David Henningssonb67ae3f2013-11-05 13:11:37 +01006054 ALC269_FIXUP_THINKPAD_ACPI,
David Henningsson56f27012016-01-11 09:33:14 +01006055 ALC269_FIXUP_DMIC_THINKPAD_ACPI,
Chris Chiu5824ce82017-02-28 14:17:11 -06006056 ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
Chris Chiu615966a2017-02-28 14:17:12 -06006057 ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
Kailang Yang9a22a8f52013-11-08 15:54:49 +08006058 ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Kailang Yang31278992014-03-03 15:27:22 +08006059 ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
Kailang Yang9a22a8f52013-11-08 15:54:49 +08006060 ALC255_FIXUP_HEADSET_MODE,
Kailang Yang31278992014-03-03 15:27:22 +08006061 ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,
Kailang Yanga22aa262014-04-23 17:34:28 +08006062 ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
Takashi Iwai1c37c222014-05-06 17:34:42 +02006063 ALC292_FIXUP_TPT440_DOCK,
Takashi Iwai9a811232015-12-09 15:17:43 +01006064 ALC292_FIXUP_TPT440,
Anisse Astierabaa22742016-08-24 09:14:13 +02006065 ALC283_FIXUP_HEADSET_MIC,
Takashi Iwaib3802782018-11-26 17:47:46 +01006066 ALC255_FIXUP_MIC_MUTE_LED,
Takashi Iwai1a22e772014-08-27 08:19:05 +02006067 ALC282_FIXUP_ASPIRE_V5_PINS,
David Henningsson7a5255f2014-10-30 08:26:01 +01006068 ALC280_FIXUP_HP_GPIO4,
Kailang Yangeaa8e5e2014-11-21 15:49:11 +08006069 ALC286_FIXUP_HP_GPIO_LED,
David Henningsson33f4acd2015-01-07 15:50:13 +01006070 ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY,
TienFu Chenb4b33f92015-01-20 15:06:21 +01006071 ALC280_FIXUP_HP_DOCK_PINS,
Jaroslav Kysela04d54662017-03-09 13:29:13 +01006072 ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED,
Keith Packard98973f22015-07-15 12:14:39 -07006073 ALC280_FIXUP_HP_9480M,
Kailang Yange1e62b92015-04-08 16:01:22 +08006074 ALC288_FIXUP_DELL_HEADSET_MODE,
6075 ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang831bfdf92015-06-26 12:35:17 +08006076 ALC288_FIXUP_DELL_XPS_13,
6077 ALC288_FIXUP_DISABLE_AAMIX,
Takashi Iwai5fab5822020-01-05 09:11:19 +01006078 ALC292_FIXUP_DELL_E7X_AAMIX,
Takashi Iwai8b99aba2015-06-15 11:59:32 +02006079 ALC292_FIXUP_DELL_E7X,
6080 ALC292_FIXUP_DISABLE_AAMIX,
David Henningssonc04017ea2015-12-15 14:44:03 +01006081 ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK,
James McDonnell54324222019-09-16 14:53:38 +00006082 ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
Kailang Yang977e6272015-05-18 15:31:20 +08006083 ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang2f726ae2017-03-31 10:31:40 +08006084 ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
Kailang Yang6ed11312015-10-26 15:37:39 +08006085 ALC275_FIXUP_DELL_XPS,
Hui Wang23adc192015-12-08 12:27:18 +08006086 ALC293_FIXUP_LENOVO_SPK_NOISE,
Kailang3694cb22015-12-28 11:35:24 +08006087 ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
Kai-Heng Feng3b43b712016-02-25 15:19:38 +08006088 ALC255_FIXUP_DELL_SPK_NOISE,
Kailang Yangd1dd4212019-01-09 17:05:24 +08006089 ALC225_FIXUP_DISABLE_MIC_VREF,
David Henningsson2ae95572016-02-25 09:37:05 +01006090 ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
Takashi Iwaie312a862018-03-06 12:14:17 +01006091 ALC295_FIXUP_DISABLE_DAC3,
Jaroslav Kyselad2cd7952019-11-29 15:40:27 +01006092 ALC285_FIXUP_SPEAKER2_TO_DAC1,
Takashi Iwaif883982d2016-02-25 14:31:59 +01006093 ALC280_FIXUP_HP_HEADSET_MIC,
Hui Wange549d192016-04-01 11:00:15 +08006094 ALC221_FIXUP_HP_FRONT_MIC,
Sven Eckelmannc636b952016-04-11 16:55:26 +02006095 ALC292_FIXUP_TPT460,
Hui Wangdd9aa332016-08-01 10:20:32 +08006096 ALC298_FIXUP_SPK_VOLUME,
Kai-Heng Fengfd06c772016-08-30 15:36:34 +08006097 ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER,
Gabriele Mazzotta823ff162016-12-24 19:50:01 +01006098 ALC269_FIXUP_ATIV_BOOK_8,
Kailang Yang9eb5d0e2017-01-17 15:40:25 +08006099 ALC221_FIXUP_HP_MIC_NO_PRESENCE,
Chris Chiuc1732ed2017-02-28 14:17:13 -06006100 ALC256_FIXUP_ASUS_HEADSET_MODE,
6101 ALC256_FIXUP_ASUS_MIC,
Chris Chiueeed4cd2017-02-28 14:17:15 -06006102 ALC256_FIXUP_ASUS_AIO_GPIO2,
Chris Chiu216d7ae2017-02-28 14:17:14 -06006103 ALC233_FIXUP_ASUS_MIC_NO_PRESENCE,
6104 ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE,
Kailang Yangca169cc2017-04-25 16:17:40 +08006105 ALC233_FIXUP_LENOVO_MULTI_CODECS,
Jian-Hong Panea5c7eb2019-04-01 11:25:05 +08006106 ALC233_FIXUP_ACER_HEADSET_MIC,
Hui Wangf33f79f2017-07-07 12:08:29 +08006107 ALC294_FIXUP_LENOVO_MIC_LOCATION,
Kailang Yang5f364132017-07-25 16:28:16 +08006108 ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE,
Kai-Heng Feng52e4e362020-05-03 23:24:47 +08006109 ALC225_FIXUP_S3_POP_NOISE,
PeiSen Houb84e8432017-09-01 15:11:56 +08006110 ALC700_FIXUP_INTEL_REFERENCE,
Kailang Yang92266652017-12-14 15:28:58 +08006111 ALC274_FIXUP_DELL_BIND_DACS,
6112 ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
Takashi Iwai399c01a2020-05-26 08:24:06 +02006113 ALC298_FIXUP_TPT470_DOCK_FIX,
Kailang Yang61fcf8e2018-02-02 15:26:46 +08006114 ALC298_FIXUP_TPT470_DOCK,
Kailang Yangae104a22018-02-05 16:07:20 +08006115 ALC255_FIXUP_DUMMY_LINEOUT_VERB,
Kailang Yangf0ba9d62018-03-16 11:46:08 +08006116 ALC255_FIXUP_DELL_HEADSET_MIC,
Ayman Bagabas0fbf21c2019-05-23 05:30:11 -04006117 ALC256_FIXUP_HUAWEI_MACH_WX9_PINS,
Tomas Espeletaa2ef03f2019-08-09 16:37:54 +02006118 ALC298_FIXUP_HUAWEI_MBX_STEREO,
Tom Bridenbbf8ff6b2018-05-29 17:34:20 +01006119 ALC295_FIXUP_HP_X360,
Kailang Yang8a328ac2018-08-21 16:54:41 +08006120 ALC221_FIXUP_HP_HEADSET_MIC,
Hui Wangc4cfcf62018-11-26 14:17:16 +08006121 ALC285_FIXUP_LENOVO_HEADPHONE_NOISE,
Girija Kumar Kasinadhunie8ed64b2018-11-26 13:40:46 -05006122 ALC295_FIXUP_HP_AUTO_MUTE,
Chris Chiu33aaebd2018-12-05 14:48:53 +08006123 ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
Chris Chiud8ae4582018-12-07 17:17:11 +08006124 ALC294_FIXUP_ASUS_MIC,
Jian-Hong Pan4e051102018-12-07 17:17:12 +08006125 ALC294_FIXUP_ASUS_HEADSET_MIC,
6126 ALC294_FIXUP_ASUS_SPK,
Jeremy Soller89e3a562019-01-30 16:12:31 -07006127 ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
Hui Wangc8c6ee62019-02-14 11:41:33 +08006128 ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
Jian-Hong Pancbc05fd2019-03-13 17:33:24 +08006129 ALC255_FIXUP_ACER_HEADSET_MIC,
Kailang Yang10f5b1b2019-02-21 16:10:22 +08006130 ALC295_FIXUP_CHROME_BOOK,
Kailang Yang8983eb62019-04-03 15:31:49 +08006131 ALC225_FIXUP_HEADSET_JACK,
Kailang Yang136824e2019-03-14 16:22:45 +08006132 ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE,
6133 ALC225_FIXUP_WYSE_AUTO_MUTE,
6134 ALC225_FIXUP_WYSE_DISABLE_MIC_VREF,
Jian-Hong Pan667a8f72019-03-15 17:51:09 +08006135 ALC286_FIXUP_ACER_AIO_HEADSET_MIC,
Daniel Drake8c8967a2019-10-17 16:15:01 +08006136 ALC256_FIXUP_ASUS_HEADSET_MIC,
Jian-Hong Pane1037352019-03-22 11:37:18 +08006137 ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
Bernhard Rosenkraenzere2a829b2019-03-05 00:38:19 +01006138 ALC299_FIXUP_PREDATOR_SPK,
Jan-Marek Glogowskibd9c10b2019-09-15 16:57:28 +02006139 ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE,
Kailang Yange79c2262019-12-19 14:12:15 +08006140 ALC289_FIXUP_DELL_SPK2,
6141 ALC289_FIXUP_DUAL_SPK,
Chris Chiu48e01502019-12-30 11:11:18 +08006142 ALC294_FIXUP_SPK2_TO_DAC1,
6143 ALC294_FIXUP_ASUS_DUAL_SPK,
Kailang Yang76f7dec2020-02-10 16:30:26 +08006144 ALC285_FIXUP_THINKPAD_HEADSET_JACK,
Jian-Hong Pan8b33a132020-02-25 15:29:21 +08006145 ALC294_FIXUP_ASUS_HPE,
Takashi Iwai1b94e592020-05-12 09:32:03 +02006146 ALC294_FIXUP_ASUS_COEF_1B,
Kai-Heng Fengf5a88b02020-03-27 12:46:25 +08006147 ALC285_FIXUP_HP_GPIO_LED,
Kailang Yang431e76c2020-04-07 14:40:20 +08006148 ALC285_FIXUP_HP_MUTE_LED,
Kailang Yang24164f42020-04-07 14:52:42 +08006149 ALC236_FIXUP_HP_MUTE_LED,
Mike Pozulp14425f12020-05-09 20:28:37 -07006150 ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
Chris Chiu9e433422020-05-12 14:15:24 +08006151 ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
Jian-Hong Pan8eae7e92020-07-06 15:18:25 +08006152 ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS,
Jian-Hong Pan6e15d122020-07-06 15:18:27 +08006153 ALC269VC_FIXUP_ACER_HEADSET_MIC,
Jian-Hong Pan781c90c2020-07-06 15:18:29 +08006154 ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE,
Armas Spannff536642020-07-11 13:05:57 +02006155 ALC289_FIXUP_ASUS_G401,
Jian-Hong Panf50a1212020-07-13 14:04:22 +08006156 ALC256_FIXUP_ACER_MIC_NO_PRESENCE,
Takashi Iwai1d045db2011-07-07 18:23:21 +02006157};
6158
Takashi Iwai1727a772013-01-10 09:52:52 +01006159static const struct hda_fixup alc269_fixups[] = {
Takashi Iwai1d045db2011-07-07 18:23:21 +02006160 [ALC269_FIXUP_SONY_VAIO] = {
Takashi Iwaifd108212013-01-10 10:18:14 +01006161 .type = HDA_FIXUP_PINCTLS,
6162 .v.pins = (const struct hda_pintbl[]) {
6163 {0x19, PIN_VREFGRD},
Takashi Iwai1d045db2011-07-07 18:23:21 +02006164 {}
6165 }
6166 },
6167 [ALC275_FIXUP_SONY_VAIO_GPIO2] = {
Takashi Iwaiae065f12018-06-19 23:00:03 +02006168 .type = HDA_FIXUP_FUNC,
6169 .v.func = alc275_fixup_gpio4_off,
Takashi Iwai1d045db2011-07-07 18:23:21 +02006170 .chained = true,
6171 .chain_id = ALC269_FIXUP_SONY_VAIO
6172 },
6173 [ALC269_FIXUP_DELL_M101Z] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006174 .type = HDA_FIXUP_VERBS,
Takashi Iwai1d045db2011-07-07 18:23:21 +02006175 .v.verbs = (const struct hda_verb[]) {
6176 /* Enables internal speaker */
6177 {0x20, AC_VERB_SET_COEF_INDEX, 13},
6178 {0x20, AC_VERB_SET_PROC_COEF, 0x4040},
6179 {}
6180 }
6181 },
6182 [ALC269_FIXUP_SKU_IGNORE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006183 .type = HDA_FIXUP_FUNC,
Takashi Iwai23d30f22012-05-07 17:17:32 +02006184 .v.func = alc_fixup_sku_ignore,
Takashi Iwai1d045db2011-07-07 18:23:21 +02006185 },
6186 [ALC269_FIXUP_ASUS_G73JW] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006187 .type = HDA_FIXUP_PINS,
6188 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02006189 { 0x17, 0x99130111 }, /* subwoofer */
6190 { }
6191 }
6192 },
6193 [ALC269_FIXUP_LENOVO_EAPD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006194 .type = HDA_FIXUP_VERBS,
Takashi Iwai1d045db2011-07-07 18:23:21 +02006195 .v.verbs = (const struct hda_verb[]) {
6196 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
6197 {}
6198 }
6199 },
6200 [ALC275_FIXUP_SONY_HWEQ] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006201 .type = HDA_FIXUP_FUNC,
Takashi Iwai1d045db2011-07-07 18:23:21 +02006202 .v.func = alc269_fixup_hweq,
6203 .chained = true,
6204 .chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
6205 },
Takashi Iwaie9bd7d52014-05-21 11:06:49 +02006206 [ALC275_FIXUP_SONY_DISABLE_AAMIX] = {
6207 .type = HDA_FIXUP_FUNC,
6208 .v.func = alc_fixup_disable_aamix,
6209 .chained = true,
6210 .chain_id = ALC269_FIXUP_SONY_VAIO
6211 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02006212 [ALC271_FIXUP_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006213 .type = HDA_FIXUP_FUNC,
Takashi Iwai1d045db2011-07-07 18:23:21 +02006214 .v.func = alc271_fixup_dmic,
6215 },
Takashi Iwai017f2a102011-07-09 14:42:25 +02006216 [ALC269_FIXUP_PCM_44K] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006217 .type = HDA_FIXUP_FUNC,
Takashi Iwai017f2a102011-07-09 14:42:25 +02006218 .v.func = alc269_fixup_pcm_44k,
David Henningsson012e7eb2012-08-08 08:43:37 +02006219 .chained = true,
6220 .chain_id = ALC269_FIXUP_QUANTA_MUTE
Takashi Iwai017f2a102011-07-09 14:42:25 +02006221 },
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02006222 [ALC269_FIXUP_STEREO_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006223 .type = HDA_FIXUP_FUNC,
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02006224 .v.func = alc269_fixup_stereo_dmic,
6225 },
David Henningsson7c478f02013-10-11 10:18:46 +02006226 [ALC269_FIXUP_HEADSET_MIC] = {
6227 .type = HDA_FIXUP_FUNC,
6228 .v.func = alc269_fixup_headset_mic,
6229 },
Takashi Iwai24519912011-08-16 15:08:49 +02006230 [ALC269_FIXUP_QUANTA_MUTE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006231 .type = HDA_FIXUP_FUNC,
Takashi Iwai24519912011-08-16 15:08:49 +02006232 .v.func = alc269_fixup_quanta_mute,
6233 },
6234 [ALC269_FIXUP_LIFEBOOK] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006235 .type = HDA_FIXUP_PINS,
6236 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai24519912011-08-16 15:08:49 +02006237 { 0x1a, 0x2101103f }, /* dock line-out */
6238 { 0x1b, 0x23a11040 }, /* dock mic-in */
6239 { }
6240 },
6241 .chained = true,
6242 .chain_id = ALC269_FIXUP_QUANTA_MUTE
6243 },
David Henningsson2041d562014-06-13 11:15:44 +02006244 [ALC269_FIXUP_LIFEBOOK_EXTMIC] = {
6245 .type = HDA_FIXUP_PINS,
6246 .v.pins = (const struct hda_pintbl[]) {
6247 { 0x19, 0x01a1903c }, /* headset mic, with jack detect */
6248 { }
6249 },
6250 },
Takashi Iwaicc7016a2015-04-08 20:47:55 +02006251 [ALC269_FIXUP_LIFEBOOK_HP_PIN] = {
6252 .type = HDA_FIXUP_PINS,
6253 .v.pins = (const struct hda_pintbl[]) {
6254 { 0x21, 0x0221102f }, /* HP out */
6255 { }
6256 },
6257 },
Takashi Iwai4df3fd12015-06-29 08:38:02 +02006258 [ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT] = {
6259 .type = HDA_FIXUP_FUNC,
6260 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
6261 },
Jan-Marek Glogowskifdcc9682018-02-14 11:29:15 +01006262 [ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC] = {
6263 .type = HDA_FIXUP_FUNC,
6264 .v.func = alc269_fixup_pincfg_U7x7_headset_mic,
6265 },
Takashi Iwaia4297b52011-08-23 18:40:12 +02006266 [ALC269_FIXUP_AMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006267 .type = HDA_FIXUP_PINS,
6268 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaia4297b52011-08-23 18:40:12 +02006269 { 0x14, 0x99130110 }, /* speaker */
6270 { 0x15, 0x0121401f }, /* HP out */
6271 { 0x18, 0x01a19c20 }, /* mic */
6272 { 0x19, 0x99a3092f }, /* int-mic */
6273 { }
6274 },
6275 },
6276 [ALC269_FIXUP_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006277 .type = HDA_FIXUP_PINS,
6278 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaia4297b52011-08-23 18:40:12 +02006279 { 0x12, 0x99a3092f }, /* int-mic */
6280 { 0x14, 0x99130110 }, /* speaker */
6281 { 0x15, 0x0121401f }, /* HP out */
6282 { 0x18, 0x01a19c20 }, /* mic */
6283 { }
6284 },
6285 },
6286 [ALC269VB_FIXUP_AMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006287 .type = HDA_FIXUP_PINS,
6288 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaia4297b52011-08-23 18:40:12 +02006289 { 0x14, 0x99130110 }, /* speaker */
6290 { 0x18, 0x01a19c20 }, /* mic */
6291 { 0x19, 0x99a3092f }, /* int-mic */
6292 { 0x21, 0x0121401f }, /* HP out */
6293 { }
6294 },
6295 },
David Henningsson2267ea92012-01-03 08:45:56 +01006296 [ALC269VB_FIXUP_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006297 .type = HDA_FIXUP_PINS,
6298 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaia4297b52011-08-23 18:40:12 +02006299 { 0x12, 0x99a3092f }, /* int-mic */
6300 { 0x14, 0x99130110 }, /* speaker */
6301 { 0x18, 0x01a19c20 }, /* mic */
6302 { 0x21, 0x0121401f }, /* HP out */
6303 { }
6304 },
6305 },
Takashi Iwai08fb0d02013-01-10 17:33:58 +01006306 [ALC269_FIXUP_HP_MUTE_LED] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006307 .type = HDA_FIXUP_FUNC,
Takashi Iwai08fb0d02013-01-10 17:33:58 +01006308 .v.func = alc269_fixup_hp_mute_led,
David Henningsson6d3cd5d2013-01-07 12:03:47 +01006309 },
David Henningssond06ac142013-02-18 11:41:55 +01006310 [ALC269_FIXUP_HP_MUTE_LED_MIC1] = {
6311 .type = HDA_FIXUP_FUNC,
6312 .v.func = alc269_fixup_hp_mute_led_mic1,
6313 },
Takashi Iwai08fb0d02013-01-10 17:33:58 +01006314 [ALC269_FIXUP_HP_MUTE_LED_MIC2] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006315 .type = HDA_FIXUP_FUNC,
Takashi Iwai08fb0d02013-01-10 17:33:58 +01006316 .v.func = alc269_fixup_hp_mute_led_mic2,
Takashi Iwai420b0fe2012-03-12 12:35:27 +01006317 },
Tom Briden7f783bd2017-03-25 10:12:01 +00006318 [ALC269_FIXUP_HP_MUTE_LED_MIC3] = {
6319 .type = HDA_FIXUP_FUNC,
6320 .v.func = alc269_fixup_hp_mute_led_mic3,
Girija Kumar Kasinadhunie8ed64b2018-11-26 13:40:46 -05006321 .chained = true,
6322 .chain_id = ALC295_FIXUP_HP_AUTO_MUTE
Tom Briden7f783bd2017-03-25 10:12:01 +00006323 },
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01006324 [ALC269_FIXUP_HP_GPIO_LED] = {
6325 .type = HDA_FIXUP_FUNC,
6326 .v.func = alc269_fixup_hp_gpio_led,
6327 },
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08006328 [ALC269_FIXUP_HP_GPIO_MIC1_LED] = {
6329 .type = HDA_FIXUP_FUNC,
6330 .v.func = alc269_fixup_hp_gpio_mic1_led,
6331 },
6332 [ALC269_FIXUP_HP_LINE1_MIC1_LED] = {
6333 .type = HDA_FIXUP_FUNC,
6334 .v.func = alc269_fixup_hp_line1_mic1_led,
6335 },
David Henningsson693b6132012-06-22 19:12:10 +02006336 [ALC269_FIXUP_INV_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006337 .type = HDA_FIXUP_FUNC,
David Henningsson9d36a7d2014-10-07 10:18:42 +02006338 .v.func = alc_fixup_inv_dmic,
David Henningsson693b6132012-06-22 19:12:10 +02006339 },
Takashi Iwai9b745ab2014-03-07 08:37:19 +01006340 [ALC269_FIXUP_NO_SHUTUP] = {
6341 .type = HDA_FIXUP_FUNC,
6342 .v.func = alc_fixup_no_shutup,
6343 },
David Henningsson108cc102012-07-20 10:37:25 +02006344 [ALC269_FIXUP_LENOVO_DOCK] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006345 .type = HDA_FIXUP_PINS,
6346 .v.pins = (const struct hda_pintbl[]) {
David Henningsson108cc102012-07-20 10:37:25 +02006347 { 0x19, 0x23a11040 }, /* dock mic */
6348 { 0x1b, 0x2121103f }, /* dock headphone */
6349 { }
6350 },
6351 .chained = true,
6352 .chain_id = ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT
6353 },
Takashi Iwaib590b382020-05-14 18:05:33 +02006354 [ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST] = {
6355 .type = HDA_FIXUP_FUNC,
6356 .v.func = alc269_fixup_limit_int_mic_boost,
6357 .chained = true,
6358 .chain_id = ALC269_FIXUP_LENOVO_DOCK,
6359 },
David Henningsson108cc102012-07-20 10:37:25 +02006360 [ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006361 .type = HDA_FIXUP_FUNC,
David Henningsson108cc102012-07-20 10:37:25 +02006362 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
David Henningsson52129002013-11-19 10:25:53 +01006363 .chained = true,
6364 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
David Henningsson108cc102012-07-20 10:37:25 +02006365 },
David Henningsson73bdd592013-04-15 15:44:14 +02006366 [ALC269_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6367 .type = HDA_FIXUP_PINS,
6368 .v.pins = (const struct hda_pintbl[]) {
6369 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6370 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6371 { }
6372 },
6373 .chained = true,
6374 .chain_id = ALC269_FIXUP_HEADSET_MODE
6375 },
6376 [ALC269_FIXUP_DELL2_MIC_NO_PRESENCE] = {
6377 .type = HDA_FIXUP_PINS,
6378 .v.pins = (const struct hda_pintbl[]) {
6379 { 0x16, 0x21014020 }, /* dock line out */
6380 { 0x19, 0x21a19030 }, /* dock mic */
6381 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6382 { }
6383 },
6384 .chained = true,
6385 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
6386 },
David Henningsson338cae52013-10-07 10:39:59 +02006387 [ALC269_FIXUP_DELL3_MIC_NO_PRESENCE] = {
6388 .type = HDA_FIXUP_PINS,
6389 .v.pins = (const struct hda_pintbl[]) {
6390 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6391 { }
6392 },
6393 .chained = true,
6394 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
6395 },
Kailang Yangfcc6c872017-06-29 15:21:27 +08006396 [ALC269_FIXUP_DELL4_MIC_NO_PRESENCE] = {
6397 .type = HDA_FIXUP_PINS,
6398 .v.pins = (const struct hda_pintbl[]) {
6399 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6400 { 0x1b, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6401 { }
6402 },
6403 .chained = true,
6404 .chain_id = ALC269_FIXUP_HEADSET_MODE
6405 },
David Henningsson73bdd592013-04-15 15:44:14 +02006406 [ALC269_FIXUP_HEADSET_MODE] = {
6407 .type = HDA_FIXUP_FUNC,
6408 .v.func = alc_fixup_headset_mode,
Hui Wang6676f302014-11-18 17:57:41 +08006409 .chained = true,
Takashi Iwaib3802782018-11-26 17:47:46 +01006410 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
David Henningsson73bdd592013-04-15 15:44:14 +02006411 },
6412 [ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
6413 .type = HDA_FIXUP_FUNC,
6414 .v.func = alc_fixup_headset_mode_no_hp_mic,
6415 },
Takashi Iwai78197172015-06-27 10:21:13 +02006416 [ALC269_FIXUP_ASPIRE_HEADSET_MIC] = {
6417 .type = HDA_FIXUP_PINS,
6418 .v.pins = (const struct hda_pintbl[]) {
6419 { 0x19, 0x01a1913c }, /* headset mic w/o jack detect */
6420 { }
6421 },
6422 .chained = true,
6423 .chain_id = ALC269_FIXUP_HEADSET_MODE,
6424 },
David Henningsson88cfcf82013-10-11 10:18:45 +02006425 [ALC286_FIXUP_SONY_MIC_NO_PRESENCE] = {
6426 .type = HDA_FIXUP_PINS,
6427 .v.pins = (const struct hda_pintbl[]) {
6428 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6429 { }
6430 },
David Henningssonfbc78ad2013-10-11 13:46:04 +02006431 .chained = true,
6432 .chain_id = ALC269_FIXUP_HEADSET_MIC
David Henningsson88cfcf82013-10-11 10:18:45 +02006433 },
Ayman Bagabas0fbf21c2019-05-23 05:30:11 -04006434 [ALC256_FIXUP_HUAWEI_MACH_WX9_PINS] = {
Ayman Bagabas8ac51bb2018-12-12 18:07:57 -05006435 .type = HDA_FIXUP_PINS,
6436 .v.pins = (const struct hda_pintbl[]) {
6437 {0x12, 0x90a60130},
6438 {0x13, 0x40000000},
6439 {0x14, 0x90170110},
6440 {0x18, 0x411111f0},
6441 {0x19, 0x04a11040},
6442 {0x1a, 0x411111f0},
6443 {0x1b, 0x90170112},
6444 {0x1d, 0x40759a05},
6445 {0x1e, 0x411111f0},
6446 {0x21, 0x04211020},
6447 { }
6448 },
Ayman Bagabase2744fd2018-12-12 18:07:59 -05006449 .chained = true,
6450 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
Ayman Bagabas8ac51bb2018-12-12 18:07:57 -05006451 },
Tomas Espeletaa2ef03f2019-08-09 16:37:54 +02006452 [ALC298_FIXUP_HUAWEI_MBX_STEREO] = {
6453 .type = HDA_FIXUP_FUNC,
6454 .v.func = alc298_fixup_huawei_mbx_stereo,
6455 .chained = true,
6456 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
6457 },
David Henningssond240d1d2013-04-15 12:50:02 +02006458 [ALC269_FIXUP_ASUS_X101_FUNC] = {
6459 .type = HDA_FIXUP_FUNC,
6460 .v.func = alc269_fixup_x101_headset_mic,
6461 },
6462 [ALC269_FIXUP_ASUS_X101_VERB] = {
6463 .type = HDA_FIXUP_VERBS,
6464 .v.verbs = (const struct hda_verb[]) {
6465 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6466 {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
6467 {0x20, AC_VERB_SET_PROC_COEF, 0x0310},
6468 { }
6469 },
6470 .chained = true,
6471 .chain_id = ALC269_FIXUP_ASUS_X101_FUNC
6472 },
6473 [ALC269_FIXUP_ASUS_X101] = {
6474 .type = HDA_FIXUP_PINS,
6475 .v.pins = (const struct hda_pintbl[]) {
6476 { 0x18, 0x04a1182c }, /* Headset mic */
6477 { }
6478 },
6479 .chained = true,
6480 .chain_id = ALC269_FIXUP_ASUS_X101_VERB
6481 },
Dylan Reid08a978d2012-11-18 22:56:40 -08006482 [ALC271_FIXUP_AMIC_MIC2] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006483 .type = HDA_FIXUP_PINS,
6484 .v.pins = (const struct hda_pintbl[]) {
Dylan Reid08a978d2012-11-18 22:56:40 -08006485 { 0x14, 0x99130110 }, /* speaker */
6486 { 0x19, 0x01a19c20 }, /* mic */
6487 { 0x1b, 0x99a7012f }, /* int-mic */
6488 { 0x21, 0x0121401f }, /* HP out */
6489 { }
6490 },
6491 },
6492 [ALC271_FIXUP_HP_GATE_MIC_JACK] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006493 .type = HDA_FIXUP_FUNC,
Dylan Reid08a978d2012-11-18 22:56:40 -08006494 .v.func = alc271_hp_gate_mic_jack,
6495 .chained = true,
6496 .chain_id = ALC271_FIXUP_AMIC_MIC2,
6497 },
Oleksij Rempelb1e89722013-12-04 20:50:53 +01006498 [ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572] = {
6499 .type = HDA_FIXUP_FUNC,
6500 .v.func = alc269_fixup_limit_int_mic_boost,
6501 .chained = true,
6502 .chain_id = ALC271_FIXUP_HP_GATE_MIC_JACK,
6503 },
Dylan Reid42397002013-04-05 14:58:22 -07006504 [ALC269_FIXUP_ACER_AC700] = {
6505 .type = HDA_FIXUP_PINS,
6506 .v.pins = (const struct hda_pintbl[]) {
6507 { 0x12, 0x99a3092f }, /* int-mic */
6508 { 0x14, 0x99130110 }, /* speaker */
6509 { 0x18, 0x03a11c20 }, /* mic */
6510 { 0x1e, 0x0346101e }, /* SPDIF1 */
6511 { 0x21, 0x0321101f }, /* HP out */
6512 { }
6513 },
6514 .chained = true,
6515 .chain_id = ALC271_FIXUP_DMIC,
6516 },
David Henningsson3e0d6112013-04-22 14:30:14 +02006517 [ALC269_FIXUP_LIMIT_INT_MIC_BOOST] = {
6518 .type = HDA_FIXUP_FUNC,
6519 .v.func = alc269_fixup_limit_int_mic_boost,
David Henningsson27937692013-11-18 11:51:47 +01006520 .chained = true,
6521 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
David Henningsson3e0d6112013-04-22 14:30:14 +02006522 },
Oleksij Rempel2cede302013-11-27 17:12:03 +01006523 [ALC269VB_FIXUP_ASUS_ZENBOOK] = {
6524 .type = HDA_FIXUP_FUNC,
6525 .v.func = alc269_fixup_limit_int_mic_boost,
6526 .chained = true,
6527 .chain_id = ALC269VB_FIXUP_DMIC,
6528 },
Takashi Iwai23870832013-11-29 14:13:12 +01006529 [ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A] = {
6530 .type = HDA_FIXUP_VERBS,
6531 .v.verbs = (const struct hda_verb[]) {
6532 /* class-D output amp +5dB */
6533 { 0x20, AC_VERB_SET_COEF_INDEX, 0x12 },
6534 { 0x20, AC_VERB_SET_PROC_COEF, 0x2800 },
6535 {}
6536 },
6537 .chained = true,
6538 .chain_id = ALC269VB_FIXUP_ASUS_ZENBOOK,
6539 },
David Henningsson8e35cd42013-11-06 11:20:01 +01006540 [ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED] = {
6541 .type = HDA_FIXUP_FUNC,
6542 .v.func = alc269_fixup_limit_int_mic_boost,
6543 .chained = true,
6544 .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC1,
6545 },
Anisse Astier02b504d2013-06-03 11:53:10 +02006546 [ALC269VB_FIXUP_ORDISSIMO_EVE2] = {
6547 .type = HDA_FIXUP_PINS,
6548 .v.pins = (const struct hda_pintbl[]) {
6549 { 0x12, 0x99a3092f }, /* int-mic */
6550 { 0x18, 0x03a11d20 }, /* mic */
6551 { 0x19, 0x411111f0 }, /* Unused bogus pin */
6552 { }
6553 },
6554 },
Kailang Yangcd217a62013-08-22 10:15:24 +02006555 [ALC283_FIXUP_CHROME_BOOK] = {
6556 .type = HDA_FIXUP_FUNC,
6557 .v.func = alc283_fixup_chromebook,
6558 },
Kailang Yang0202e992013-12-02 15:20:15 +08006559 [ALC283_FIXUP_SENSE_COMBO_JACK] = {
6560 .type = HDA_FIXUP_FUNC,
6561 .v.func = alc283_fixup_sense_combo_jack,
6562 .chained = true,
6563 .chain_id = ALC283_FIXUP_CHROME_BOOK,
6564 },
Takashi Iwai7bba2152013-09-06 15:45:38 +02006565 [ALC282_FIXUP_ASUS_TX300] = {
6566 .type = HDA_FIXUP_FUNC,
6567 .v.func = alc282_fixup_asus_tx300,
6568 },
Kailang Yang1bb3e062013-09-27 13:10:25 +02006569 [ALC283_FIXUP_INT_MIC] = {
6570 .type = HDA_FIXUP_VERBS,
6571 .v.verbs = (const struct hda_verb[]) {
6572 {0x20, AC_VERB_SET_COEF_INDEX, 0x1a},
6573 {0x20, AC_VERB_SET_PROC_COEF, 0x0011},
6574 { }
6575 },
6576 .chained = true,
6577 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
6578 },
David Henningsson0f4881d2013-12-20 16:08:13 +01006579 [ALC290_FIXUP_SUBWOOFER_HSJACK] = {
6580 .type = HDA_FIXUP_PINS,
6581 .v.pins = (const struct hda_pintbl[]) {
6582 { 0x17, 0x90170112 }, /* subwoofer */
6583 { }
6584 },
6585 .chained = true,
6586 .chain_id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
6587 },
6588 [ALC290_FIXUP_SUBWOOFER] = {
6589 .type = HDA_FIXUP_PINS,
6590 .v.pins = (const struct hda_pintbl[]) {
6591 { 0x17, 0x90170112 }, /* subwoofer */
6592 { }
6593 },
6594 .chained = true,
6595 .chain_id = ALC290_FIXUP_MONO_SPEAKERS,
6596 },
David Henningsson338cae52013-10-07 10:39:59 +02006597 [ALC290_FIXUP_MONO_SPEAKERS] = {
6598 .type = HDA_FIXUP_FUNC,
6599 .v.func = alc290_fixup_mono_speakers,
David Henningsson0f4881d2013-12-20 16:08:13 +01006600 },
6601 [ALC290_FIXUP_MONO_SPEAKERS_HSJACK] = {
6602 .type = HDA_FIXUP_FUNC,
6603 .v.func = alc290_fixup_mono_speakers,
David Henningsson338cae52013-10-07 10:39:59 +02006604 .chained = true,
6605 .chain_id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
6606 },
David Henningssonb67ae3f2013-11-05 13:11:37 +01006607 [ALC269_FIXUP_THINKPAD_ACPI] = {
6608 .type = HDA_FIXUP_FUNC,
Takashi Iwaid5a6cab2018-06-13 12:43:10 +02006609 .v.func = alc_fixup_thinkpad_acpi,
Takashi Iwai09da1112016-09-08 12:15:02 +02006610 .chained = true,
6611 .chain_id = ALC269_FIXUP_SKU_IGNORE,
David Henningssonb67ae3f2013-11-05 13:11:37 +01006612 },
David Henningsson56f27012016-01-11 09:33:14 +01006613 [ALC269_FIXUP_DMIC_THINKPAD_ACPI] = {
6614 .type = HDA_FIXUP_FUNC,
6615 .v.func = alc_fixup_inv_dmic,
6616 .chained = true,
6617 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
6618 },
Chris Chiu5824ce82017-02-28 14:17:11 -06006619 [ALC255_FIXUP_ACER_MIC_NO_PRESENCE] = {
Hui Wang17d30462019-06-14 16:44:12 +08006620 .type = HDA_FIXUP_PINS,
6621 .v.pins = (const struct hda_pintbl[]) {
6622 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6623 { }
Chris Chiu5824ce82017-02-28 14:17:11 -06006624 },
6625 .chained = true,
Hui Wang17d30462019-06-14 16:44:12 +08006626 .chain_id = ALC255_FIXUP_HEADSET_MODE
Chris Chiu5824ce82017-02-28 14:17:11 -06006627 },
Chris Chiu615966a2017-02-28 14:17:12 -06006628 [ALC255_FIXUP_ASUS_MIC_NO_PRESENCE] = {
6629 .type = HDA_FIXUP_PINS,
6630 .v.pins = (const struct hda_pintbl[]) {
6631 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6632 { }
6633 },
6634 .chained = true,
6635 .chain_id = ALC255_FIXUP_HEADSET_MODE
6636 },
Kailang Yang9a22a8f52013-11-08 15:54:49 +08006637 [ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6638 .type = HDA_FIXUP_PINS,
6639 .v.pins = (const struct hda_pintbl[]) {
6640 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6641 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6642 { }
6643 },
6644 .chained = true,
6645 .chain_id = ALC255_FIXUP_HEADSET_MODE
6646 },
Kailang Yang31278992014-03-03 15:27:22 +08006647 [ALC255_FIXUP_DELL2_MIC_NO_PRESENCE] = {
6648 .type = HDA_FIXUP_PINS,
6649 .v.pins = (const struct hda_pintbl[]) {
6650 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6651 { }
6652 },
6653 .chained = true,
6654 .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
6655 },
Kailang Yang9a22a8f52013-11-08 15:54:49 +08006656 [ALC255_FIXUP_HEADSET_MODE] = {
6657 .type = HDA_FIXUP_FUNC,
6658 .v.func = alc_fixup_headset_mode_alc255,
Hui Wang4a83d422014-11-18 17:57:40 +08006659 .chained = true,
Takashi Iwaib3802782018-11-26 17:47:46 +01006660 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
Kailang Yang9a22a8f52013-11-08 15:54:49 +08006661 },
Kailang Yang31278992014-03-03 15:27:22 +08006662 [ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
6663 .type = HDA_FIXUP_FUNC,
6664 .v.func = alc_fixup_headset_mode_alc255_no_hp_mic,
6665 },
Kailang Yanga22aa262014-04-23 17:34:28 +08006666 [ALC293_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6667 .type = HDA_FIXUP_PINS,
6668 .v.pins = (const struct hda_pintbl[]) {
6669 { 0x18, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6670 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6671 { }
6672 },
6673 .chained = true,
6674 .chain_id = ALC269_FIXUP_HEADSET_MODE
6675 },
Takashi Iwai1c37c222014-05-06 17:34:42 +02006676 [ALC292_FIXUP_TPT440_DOCK] = {
David Henningssonec56af62015-06-24 10:46:33 +02006677 .type = HDA_FIXUP_FUNC,
Takashi Iwai7f57d802015-09-24 17:36:51 +02006678 .v.func = alc_fixup_tpt440_dock,
Takashi Iwai1c37c222014-05-06 17:34:42 +02006679 .chained = true,
6680 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
6681 },
Takashi Iwai9a811232015-12-09 15:17:43 +01006682 [ALC292_FIXUP_TPT440] = {
6683 .type = HDA_FIXUP_FUNC,
Takashi Iwai157f0b72015-12-10 23:30:43 +01006684 .v.func = alc_fixup_disable_aamix,
Takashi Iwai9a811232015-12-09 15:17:43 +01006685 .chained = true,
6686 .chain_id = ALC292_FIXUP_TPT440_DOCK,
6687 },
Anisse Astierabaa22742016-08-24 09:14:13 +02006688 [ALC283_FIXUP_HEADSET_MIC] = {
Daniel Drake9dc12862014-07-22 10:58:29 +01006689 .type = HDA_FIXUP_PINS,
6690 .v.pins = (const struct hda_pintbl[]) {
6691 { 0x19, 0x04a110f0 },
6692 { },
6693 },
6694 },
Takashi Iwaib3802782018-11-26 17:47:46 +01006695 [ALC255_FIXUP_MIC_MUTE_LED] = {
Hui Wang00ef9942014-07-31 11:52:38 +08006696 .type = HDA_FIXUP_FUNC,
Takashi Iwaib3802782018-11-26 17:47:46 +01006697 .v.func = snd_hda_gen_fixup_micmute_led,
Hui Wang00ef9942014-07-31 11:52:38 +08006698 },
Takashi Iwai1a22e772014-08-27 08:19:05 +02006699 [ALC282_FIXUP_ASPIRE_V5_PINS] = {
6700 .type = HDA_FIXUP_PINS,
6701 .v.pins = (const struct hda_pintbl[]) {
6702 { 0x12, 0x90a60130 },
6703 { 0x14, 0x90170110 },
6704 { 0x17, 0x40000008 },
6705 { 0x18, 0x411111f0 },
Mateusz Sylwestrzak04206942015-07-19 17:38:56 +02006706 { 0x19, 0x01a1913c },
Takashi Iwai1a22e772014-08-27 08:19:05 +02006707 { 0x1a, 0x411111f0 },
6708 { 0x1b, 0x411111f0 },
6709 { 0x1d, 0x40f89b2d },
6710 { 0x1e, 0x411111f0 },
6711 { 0x21, 0x0321101f },
6712 { },
6713 },
6714 },
David Henningsson7a5255f2014-10-30 08:26:01 +01006715 [ALC280_FIXUP_HP_GPIO4] = {
6716 .type = HDA_FIXUP_FUNC,
6717 .v.func = alc280_fixup_hp_gpio4,
6718 },
Kailang Yangeaa8e5e2014-11-21 15:49:11 +08006719 [ALC286_FIXUP_HP_GPIO_LED] = {
6720 .type = HDA_FIXUP_FUNC,
6721 .v.func = alc286_fixup_hp_gpio_led,
6722 },
David Henningsson33f4acd2015-01-07 15:50:13 +01006723 [ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY] = {
6724 .type = HDA_FIXUP_FUNC,
6725 .v.func = alc280_fixup_hp_gpio2_mic_hotkey,
6726 },
TienFu Chenb4b33f92015-01-20 15:06:21 +01006727 [ALC280_FIXUP_HP_DOCK_PINS] = {
6728 .type = HDA_FIXUP_PINS,
6729 .v.pins = (const struct hda_pintbl[]) {
6730 { 0x1b, 0x21011020 }, /* line-out */
6731 { 0x1a, 0x01a1903c }, /* headset mic */
6732 { 0x18, 0x2181103f }, /* line-in */
6733 { },
6734 },
6735 .chained = true,
6736 .chain_id = ALC280_FIXUP_HP_GPIO4
6737 },
Jaroslav Kysela04d54662017-03-09 13:29:13 +01006738 [ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED] = {
6739 .type = HDA_FIXUP_PINS,
6740 .v.pins = (const struct hda_pintbl[]) {
6741 { 0x1b, 0x21011020 }, /* line-out */
6742 { 0x18, 0x2181103f }, /* line-in */
6743 { },
6744 },
6745 .chained = true,
6746 .chain_id = ALC269_FIXUP_HP_GPIO_MIC1_LED
6747 },
Keith Packard98973f22015-07-15 12:14:39 -07006748 [ALC280_FIXUP_HP_9480M] = {
6749 .type = HDA_FIXUP_FUNC,
6750 .v.func = alc280_fixup_hp_9480m,
6751 },
Kailang Yange1e62b92015-04-08 16:01:22 +08006752 [ALC288_FIXUP_DELL_HEADSET_MODE] = {
6753 .type = HDA_FIXUP_FUNC,
6754 .v.func = alc_fixup_headset_mode_dell_alc288,
6755 .chained = true,
Takashi Iwaib3802782018-11-26 17:47:46 +01006756 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
Kailang Yange1e62b92015-04-08 16:01:22 +08006757 },
6758 [ALC288_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6759 .type = HDA_FIXUP_PINS,
6760 .v.pins = (const struct hda_pintbl[]) {
6761 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6762 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6763 { }
6764 },
6765 .chained = true,
6766 .chain_id = ALC288_FIXUP_DELL_HEADSET_MODE
6767 },
Hui Wang831bfdf92015-06-26 12:35:17 +08006768 [ALC288_FIXUP_DISABLE_AAMIX] = {
6769 .type = HDA_FIXUP_FUNC,
6770 .v.func = alc_fixup_disable_aamix,
6771 .chained = true,
Takashi Iwaid44a6862018-06-19 23:04:03 +02006772 .chain_id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE
Hui Wang831bfdf92015-06-26 12:35:17 +08006773 },
6774 [ALC288_FIXUP_DELL_XPS_13] = {
6775 .type = HDA_FIXUP_FUNC,
6776 .v.func = alc_fixup_dell_xps13,
6777 .chained = true,
6778 .chain_id = ALC288_FIXUP_DISABLE_AAMIX
6779 },
Takashi Iwai8b99aba2015-06-15 11:59:32 +02006780 [ALC292_FIXUP_DISABLE_AAMIX] = {
6781 .type = HDA_FIXUP_FUNC,
6782 .v.func = alc_fixup_disable_aamix,
Hui Wang831bfdf92015-06-26 12:35:17 +08006783 .chained = true,
6784 .chain_id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE
Takashi Iwai8b99aba2015-06-15 11:59:32 +02006785 },
David Henningssonc04017ea2015-12-15 14:44:03 +01006786 [ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK] = {
6787 .type = HDA_FIXUP_FUNC,
6788 .v.func = alc_fixup_disable_aamix,
6789 .chained = true,
6790 .chain_id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE
6791 },
Takashi Iwai5fab5822020-01-05 09:11:19 +01006792 [ALC292_FIXUP_DELL_E7X_AAMIX] = {
Takashi Iwai8b99aba2015-06-15 11:59:32 +02006793 .type = HDA_FIXUP_FUNC,
6794 .v.func = alc_fixup_dell_xps13,
6795 .chained = true,
6796 .chain_id = ALC292_FIXUP_DISABLE_AAMIX
6797 },
Takashi Iwai5fab5822020-01-05 09:11:19 +01006798 [ALC292_FIXUP_DELL_E7X] = {
6799 .type = HDA_FIXUP_FUNC,
6800 .v.func = snd_hda_gen_fixup_micmute_led,
6801 /* micmute fixup must be applied at last */
6802 .chained_before = true,
6803 .chain_id = ALC292_FIXUP_DELL_E7X_AAMIX,
6804 },
James McDonnell54324222019-09-16 14:53:38 +00006805 [ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE] = {
6806 .type = HDA_FIXUP_PINS,
6807 .v.pins = (const struct hda_pintbl[]) {
6808 { 0x18, 0x01a1913c }, /* headset mic w/o jack detect */
6809 { }
6810 },
6811 .chained_before = true,
6812 .chain_id = ALC269_FIXUP_HEADSET_MODE,
6813 },
Kailang Yang977e6272015-05-18 15:31:20 +08006814 [ALC298_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6815 .type = HDA_FIXUP_PINS,
6816 .v.pins = (const struct hda_pintbl[]) {
6817 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6818 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6819 { }
6820 },
6821 .chained = true,
6822 .chain_id = ALC269_FIXUP_HEADSET_MODE
6823 },
Hui Wang2f726ae2017-03-31 10:31:40 +08006824 [ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE] = {
6825 .type = HDA_FIXUP_PINS,
6826 .v.pins = (const struct hda_pintbl[]) {
6827 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6828 { }
6829 },
6830 .chained = true,
6831 .chain_id = ALC269_FIXUP_HEADSET_MODE
6832 },
Kailang Yang6ed11312015-10-26 15:37:39 +08006833 [ALC275_FIXUP_DELL_XPS] = {
6834 .type = HDA_FIXUP_VERBS,
6835 .v.verbs = (const struct hda_verb[]) {
6836 /* Enables internal speaker */
6837 {0x20, AC_VERB_SET_COEF_INDEX, 0x1f},
6838 {0x20, AC_VERB_SET_PROC_COEF, 0x00c0},
6839 {0x20, AC_VERB_SET_COEF_INDEX, 0x30},
6840 {0x20, AC_VERB_SET_PROC_COEF, 0x00b1},
6841 {}
6842 }
6843 },
Hui Wang23adc192015-12-08 12:27:18 +08006844 [ALC293_FIXUP_LENOVO_SPK_NOISE] = {
6845 .type = HDA_FIXUP_FUNC,
6846 .v.func = alc_fixup_disable_aamix,
6847 .chained = true,
6848 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
6849 },
Kailang3694cb22015-12-28 11:35:24 +08006850 [ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY] = {
6851 .type = HDA_FIXUP_FUNC,
6852 .v.func = alc233_fixup_lenovo_line2_mic_hotkey,
6853 },
Kai-Heng Feng3b43b712016-02-25 15:19:38 +08006854 [ALC255_FIXUP_DELL_SPK_NOISE] = {
6855 .type = HDA_FIXUP_FUNC,
6856 .v.func = alc_fixup_disable_aamix,
6857 .chained = true,
6858 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
6859 },
Kailang Yangd1dd4212019-01-09 17:05:24 +08006860 [ALC225_FIXUP_DISABLE_MIC_VREF] = {
6861 .type = HDA_FIXUP_FUNC,
6862 .v.func = alc_fixup_disable_mic_vref,
6863 .chained = true,
6864 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
6865 },
David Henningsson2ae95572016-02-25 09:37:05 +01006866 [ALC225_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6867 .type = HDA_FIXUP_VERBS,
6868 .v.verbs = (const struct hda_verb[]) {
6869 /* Disable pass-through path for FRONT 14h */
6870 { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
6871 { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
6872 {}
6873 },
6874 .chained = true,
Kailang Yangd1dd4212019-01-09 17:05:24 +08006875 .chain_id = ALC225_FIXUP_DISABLE_MIC_VREF
David Henningsson2ae95572016-02-25 09:37:05 +01006876 },
Takashi Iwaif883982d2016-02-25 14:31:59 +01006877 [ALC280_FIXUP_HP_HEADSET_MIC] = {
6878 .type = HDA_FIXUP_FUNC,
6879 .v.func = alc_fixup_disable_aamix,
6880 .chained = true,
6881 .chain_id = ALC269_FIXUP_HEADSET_MIC,
6882 },
Hui Wange549d192016-04-01 11:00:15 +08006883 [ALC221_FIXUP_HP_FRONT_MIC] = {
6884 .type = HDA_FIXUP_PINS,
6885 .v.pins = (const struct hda_pintbl[]) {
6886 { 0x19, 0x02a19020 }, /* Front Mic */
6887 { }
6888 },
6889 },
Sven Eckelmannc636b952016-04-11 16:55:26 +02006890 [ALC292_FIXUP_TPT460] = {
6891 .type = HDA_FIXUP_FUNC,
6892 .v.func = alc_fixup_tpt440_dock,
6893 .chained = true,
6894 .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE,
6895 },
Hui Wangdd9aa332016-08-01 10:20:32 +08006896 [ALC298_FIXUP_SPK_VOLUME] = {
6897 .type = HDA_FIXUP_FUNC,
6898 .v.func = alc298_fixup_speaker_volume,
Hui Wang59ec4b52016-08-04 15:28:04 +08006899 .chained = true,
Hui Wang2f726ae2017-03-31 10:31:40 +08006900 .chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
Hui Wangdd9aa332016-08-01 10:20:32 +08006901 },
Takashi Iwaie312a862018-03-06 12:14:17 +01006902 [ALC295_FIXUP_DISABLE_DAC3] = {
6903 .type = HDA_FIXUP_FUNC,
6904 .v.func = alc295_fixup_disable_dac3,
6905 },
Jaroslav Kyselad2cd7952019-11-29 15:40:27 +01006906 [ALC285_FIXUP_SPEAKER2_TO_DAC1] = {
6907 .type = HDA_FIXUP_FUNC,
6908 .v.func = alc285_fixup_speaker2_to_dac1,
Hui Wangc37c0ab2020-02-19 13:23:06 +08006909 .chained = true,
6910 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
Jaroslav Kyselad2cd7952019-11-29 15:40:27 +01006911 },
Kai-Heng Fengfd06c772016-08-30 15:36:34 +08006912 [ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {
6913 .type = HDA_FIXUP_PINS,
6914 .v.pins = (const struct hda_pintbl[]) {
6915 { 0x1b, 0x90170151 },
6916 { }
6917 },
6918 .chained = true,
6919 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
6920 },
Gabriele Mazzotta823ff162016-12-24 19:50:01 +01006921 [ALC269_FIXUP_ATIV_BOOK_8] = {
6922 .type = HDA_FIXUP_FUNC,
6923 .v.func = alc_fixup_auto_mute_via_amp,
6924 .chained = true,
6925 .chain_id = ALC269_FIXUP_NO_SHUTUP
6926 },
Kailang Yang9eb5d0e2017-01-17 15:40:25 +08006927 [ALC221_FIXUP_HP_MIC_NO_PRESENCE] = {
6928 .type = HDA_FIXUP_PINS,
6929 .v.pins = (const struct hda_pintbl[]) {
6930 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6931 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6932 { }
6933 },
6934 .chained = true,
6935 .chain_id = ALC269_FIXUP_HEADSET_MODE
6936 },
Chris Chiuc1732ed2017-02-28 14:17:13 -06006937 [ALC256_FIXUP_ASUS_HEADSET_MODE] = {
6938 .type = HDA_FIXUP_FUNC,
6939 .v.func = alc_fixup_headset_mode,
6940 },
6941 [ALC256_FIXUP_ASUS_MIC] = {
6942 .type = HDA_FIXUP_PINS,
6943 .v.pins = (const struct hda_pintbl[]) {
6944 { 0x13, 0x90a60160 }, /* use as internal mic */
6945 { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
6946 { }
6947 },
6948 .chained = true,
6949 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
6950 },
Chris Chiueeed4cd2017-02-28 14:17:15 -06006951 [ALC256_FIXUP_ASUS_AIO_GPIO2] = {
Takashi Iwaiae065f12018-06-19 23:00:03 +02006952 .type = HDA_FIXUP_FUNC,
6953 /* Set up GPIO2 for the speaker amp */
6954 .v.func = alc_fixup_gpio4,
Chris Chiueeed4cd2017-02-28 14:17:15 -06006955 },
Chris Chiu216d7ae2017-02-28 14:17:14 -06006956 [ALC233_FIXUP_ASUS_MIC_NO_PRESENCE] = {
6957 .type = HDA_FIXUP_PINS,
6958 .v.pins = (const struct hda_pintbl[]) {
6959 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6960 { }
6961 },
6962 .chained = true,
6963 .chain_id = ALC269_FIXUP_HEADSET_MIC
6964 },
6965 [ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE] = {
6966 .type = HDA_FIXUP_VERBS,
6967 .v.verbs = (const struct hda_verb[]) {
6968 /* Enables internal speaker */
6969 {0x20, AC_VERB_SET_COEF_INDEX, 0x40},
6970 {0x20, AC_VERB_SET_PROC_COEF, 0x8800},
6971 {}
6972 },
6973 .chained = true,
6974 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
6975 },
Kailang Yangca169cc2017-04-25 16:17:40 +08006976 [ALC233_FIXUP_LENOVO_MULTI_CODECS] = {
6977 .type = HDA_FIXUP_FUNC,
6978 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
6979 },
Jian-Hong Panea5c7eb2019-04-01 11:25:05 +08006980 [ALC233_FIXUP_ACER_HEADSET_MIC] = {
6981 .type = HDA_FIXUP_VERBS,
6982 .v.verbs = (const struct hda_verb[]) {
6983 { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
6984 { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
6985 { }
6986 },
6987 .chained = true,
6988 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
6989 },
Hui Wangf33f79f2017-07-07 12:08:29 +08006990 [ALC294_FIXUP_LENOVO_MIC_LOCATION] = {
6991 .type = HDA_FIXUP_PINS,
6992 .v.pins = (const struct hda_pintbl[]) {
6993 /* Change the mic location from front to right, otherwise there are
6994 two front mics with the same name, pulseaudio can't handle them.
6995 This is just a temporary workaround, after applying this fixup,
6996 there will be one "Front Mic" and one "Mic" in this machine.
6997 */
6998 { 0x1a, 0x04a19040 },
6999 { }
7000 },
7001 },
Kailang Yang5f364132017-07-25 16:28:16 +08007002 [ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE] = {
7003 .type = HDA_FIXUP_PINS,
7004 .v.pins = (const struct hda_pintbl[]) {
7005 { 0x16, 0x0101102f }, /* Rear Headset HP */
7006 { 0x19, 0x02a1913c }, /* use as Front headset mic, without its own jack detect */
7007 { 0x1a, 0x01a19030 }, /* Rear Headset MIC */
7008 { 0x1b, 0x02011020 },
7009 { }
7010 },
7011 .chained = true,
Kai-Heng Feng52e4e362020-05-03 23:24:47 +08007012 .chain_id = ALC225_FIXUP_S3_POP_NOISE
7013 },
7014 [ALC225_FIXUP_S3_POP_NOISE] = {
7015 .type = HDA_FIXUP_FUNC,
7016 .v.func = alc225_fixup_s3_pop_noise,
7017 .chained = true,
Kailang Yang5f364132017-07-25 16:28:16 +08007018 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7019 },
PeiSen Houb84e8432017-09-01 15:11:56 +08007020 [ALC700_FIXUP_INTEL_REFERENCE] = {
7021 .type = HDA_FIXUP_VERBS,
7022 .v.verbs = (const struct hda_verb[]) {
7023 /* Enables internal speaker */
7024 {0x20, AC_VERB_SET_COEF_INDEX, 0x45},
7025 {0x20, AC_VERB_SET_PROC_COEF, 0x5289},
7026 {0x20, AC_VERB_SET_COEF_INDEX, 0x4A},
7027 {0x20, AC_VERB_SET_PROC_COEF, 0x001b},
7028 {0x58, AC_VERB_SET_COEF_INDEX, 0x00},
7029 {0x58, AC_VERB_SET_PROC_COEF, 0x3888},
7030 {0x20, AC_VERB_SET_COEF_INDEX, 0x6f},
7031 {0x20, AC_VERB_SET_PROC_COEF, 0x2c0b},
7032 {}
7033 }
7034 },
Kailang Yang92266652017-12-14 15:28:58 +08007035 [ALC274_FIXUP_DELL_BIND_DACS] = {
7036 .type = HDA_FIXUP_FUNC,
7037 .v.func = alc274_fixup_bind_dacs,
7038 .chained = true,
7039 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
7040 },
7041 [ALC274_FIXUP_DELL_AIO_LINEOUT_VERB] = {
7042 .type = HDA_FIXUP_PINS,
7043 .v.pins = (const struct hda_pintbl[]) {
7044 { 0x1b, 0x0401102f },
7045 { }
7046 },
7047 .chained = true,
7048 .chain_id = ALC274_FIXUP_DELL_BIND_DACS
7049 },
Takashi Iwai399c01a2020-05-26 08:24:06 +02007050 [ALC298_FIXUP_TPT470_DOCK_FIX] = {
Kailang Yang61fcf8e2018-02-02 15:26:46 +08007051 .type = HDA_FIXUP_FUNC,
7052 .v.func = alc_fixup_tpt470_dock,
7053 .chained = true,
7054 .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE
7055 },
Takashi Iwai399c01a2020-05-26 08:24:06 +02007056 [ALC298_FIXUP_TPT470_DOCK] = {
7057 .type = HDA_FIXUP_FUNC,
7058 .v.func = alc_fixup_tpt470_dacs,
7059 .chained = true,
7060 .chain_id = ALC298_FIXUP_TPT470_DOCK_FIX
7061 },
Kailang Yangae104a22018-02-05 16:07:20 +08007062 [ALC255_FIXUP_DUMMY_LINEOUT_VERB] = {
7063 .type = HDA_FIXUP_PINS,
7064 .v.pins = (const struct hda_pintbl[]) {
7065 { 0x14, 0x0201101f },
7066 { }
7067 },
7068 .chained = true,
7069 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
7070 },
Kailang Yangf0ba9d62018-03-16 11:46:08 +08007071 [ALC255_FIXUP_DELL_HEADSET_MIC] = {
7072 .type = HDA_FIXUP_PINS,
7073 .v.pins = (const struct hda_pintbl[]) {
7074 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7075 { }
7076 },
Hui Wang3ce0d5a2018-04-19 13:29:04 +08007077 .chained = true,
7078 .chain_id = ALC269_FIXUP_HEADSET_MIC
Kailang Yangf0ba9d62018-03-16 11:46:08 +08007079 },
Tom Bridenbbf8ff6b2018-05-29 17:34:20 +01007080 [ALC295_FIXUP_HP_X360] = {
7081 .type = HDA_FIXUP_FUNC,
7082 .v.func = alc295_fixup_hp_top_speakers,
7083 .chained = true,
7084 .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC3
Kailang Yang8a328ac2018-08-21 16:54:41 +08007085 },
7086 [ALC221_FIXUP_HP_HEADSET_MIC] = {
7087 .type = HDA_FIXUP_PINS,
7088 .v.pins = (const struct hda_pintbl[]) {
7089 { 0x19, 0x0181313f},
7090 { }
7091 },
7092 .chained = true,
7093 .chain_id = ALC269_FIXUP_HEADSET_MIC
7094 },
Hui Wangc4cfcf62018-11-26 14:17:16 +08007095 [ALC285_FIXUP_LENOVO_HEADPHONE_NOISE] = {
7096 .type = HDA_FIXUP_FUNC,
7097 .v.func = alc285_fixup_invalidate_dacs,
Hui Wang6ba189c2018-12-09 09:16:43 +08007098 .chained = true,
7099 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
Hui Wangc4cfcf62018-11-26 14:17:16 +08007100 },
Girija Kumar Kasinadhunie8ed64b2018-11-26 13:40:46 -05007101 [ALC295_FIXUP_HP_AUTO_MUTE] = {
7102 .type = HDA_FIXUP_FUNC,
7103 .v.func = alc_fixup_auto_mute_via_amp,
7104 },
Chris Chiu33aaebd2018-12-05 14:48:53 +08007105 [ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE] = {
7106 .type = HDA_FIXUP_PINS,
7107 .v.pins = (const struct hda_pintbl[]) {
7108 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7109 { }
7110 },
7111 .chained = true,
7112 .chain_id = ALC269_FIXUP_HEADSET_MIC
7113 },
Chris Chiud8ae4582018-12-07 17:17:11 +08007114 [ALC294_FIXUP_ASUS_MIC] = {
7115 .type = HDA_FIXUP_PINS,
7116 .v.pins = (const struct hda_pintbl[]) {
7117 { 0x13, 0x90a60160 }, /* use as internal mic */
7118 { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
7119 { }
7120 },
7121 .chained = true,
Kailang Yangef9ddb92020-07-10 15:31:11 +08007122 .chain_id = ALC269_FIXUP_HEADSET_MIC
Chris Chiud8ae4582018-12-07 17:17:11 +08007123 },
Jian-Hong Pan4e051102018-12-07 17:17:12 +08007124 [ALC294_FIXUP_ASUS_HEADSET_MIC] = {
7125 .type = HDA_FIXUP_PINS,
7126 .v.pins = (const struct hda_pintbl[]) {
Jian-Hong Pan82b01142018-12-27 16:46:31 +08007127 { 0x19, 0x01a1103c }, /* use as headset mic */
Jian-Hong Pan4e051102018-12-07 17:17:12 +08007128 { }
7129 },
7130 .chained = true,
Kailang Yangef9ddb92020-07-10 15:31:11 +08007131 .chain_id = ALC269_FIXUP_HEADSET_MIC
Jian-Hong Pan4e051102018-12-07 17:17:12 +08007132 },
7133 [ALC294_FIXUP_ASUS_SPK] = {
7134 .type = HDA_FIXUP_VERBS,
7135 .v.verbs = (const struct hda_verb[]) {
7136 /* Set EAPD high */
7137 { 0x20, AC_VERB_SET_COEF_INDEX, 0x40 },
7138 { 0x20, AC_VERB_SET_PROC_COEF, 0x8800 },
Kailang Yang473fbe132020-07-16 14:42:33 +08007139 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
7140 { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
Jian-Hong Pan4e051102018-12-07 17:17:12 +08007141 { }
7142 },
7143 .chained = true,
7144 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
7145 },
Jaroslav Kyselac8a9afa2019-03-14 09:21:08 +01007146 [ALC295_FIXUP_CHROME_BOOK] = {
Kailang Yange8547472018-11-28 15:32:45 +08007147 .type = HDA_FIXUP_FUNC,
Jaroslav Kyselac8a9afa2019-03-14 09:21:08 +01007148 .v.func = alc295_fixup_chromebook,
Kailang Yang8983eb62019-04-03 15:31:49 +08007149 .chained = true,
7150 .chain_id = ALC225_FIXUP_HEADSET_JACK
7151 },
7152 [ALC225_FIXUP_HEADSET_JACK] = {
7153 .type = HDA_FIXUP_FUNC,
7154 .v.func = alc_fixup_headset_jack,
Kailang Yange8547472018-11-28 15:32:45 +08007155 },
Jeremy Soller89e3a562019-01-30 16:12:31 -07007156 [ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
7157 .type = HDA_FIXUP_PINS,
7158 .v.pins = (const struct hda_pintbl[]) {
7159 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7160 { }
7161 },
7162 .chained = true,
7163 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7164 },
Hui Wangc8c6ee62019-02-14 11:41:33 +08007165 [ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE] = {
7166 .type = HDA_FIXUP_VERBS,
7167 .v.verbs = (const struct hda_verb[]) {
7168 /* Disable PCBEEP-IN passthrough */
7169 { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
7170 { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
7171 { }
7172 },
7173 .chained = true,
7174 .chain_id = ALC285_FIXUP_LENOVO_HEADPHONE_NOISE
7175 },
Jian-Hong Pancbc05fd2019-03-13 17:33:24 +08007176 [ALC255_FIXUP_ACER_HEADSET_MIC] = {
7177 .type = HDA_FIXUP_PINS,
7178 .v.pins = (const struct hda_pintbl[]) {
7179 { 0x19, 0x03a11130 },
7180 { 0x1a, 0x90a60140 }, /* use as internal mic */
7181 { }
7182 },
7183 .chained = true,
7184 .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
7185 },
Kailang Yang136824e2019-03-14 16:22:45 +08007186 [ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE] = {
7187 .type = HDA_FIXUP_PINS,
7188 .v.pins = (const struct hda_pintbl[]) {
7189 { 0x16, 0x01011020 }, /* Rear Line out */
7190 { 0x19, 0x01a1913c }, /* use as Front headset mic, without its own jack detect */
7191 { }
7192 },
7193 .chained = true,
7194 .chain_id = ALC225_FIXUP_WYSE_AUTO_MUTE
7195 },
7196 [ALC225_FIXUP_WYSE_AUTO_MUTE] = {
7197 .type = HDA_FIXUP_FUNC,
7198 .v.func = alc_fixup_auto_mute_via_amp,
7199 .chained = true,
7200 .chain_id = ALC225_FIXUP_WYSE_DISABLE_MIC_VREF
7201 },
7202 [ALC225_FIXUP_WYSE_DISABLE_MIC_VREF] = {
7203 .type = HDA_FIXUP_FUNC,
7204 .v.func = alc_fixup_disable_mic_vref,
7205 .chained = true,
7206 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7207 },
Jian-Hong Pan667a8f72019-03-15 17:51:09 +08007208 [ALC286_FIXUP_ACER_AIO_HEADSET_MIC] = {
7209 .type = HDA_FIXUP_VERBS,
7210 .v.verbs = (const struct hda_verb[]) {
7211 { 0x20, AC_VERB_SET_COEF_INDEX, 0x4f },
7212 { 0x20, AC_VERB_SET_PROC_COEF, 0x5029 },
7213 { }
7214 },
7215 .chained = true,
7216 .chain_id = ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE
7217 },
Daniel Drake8c8967a2019-10-17 16:15:01 +08007218 [ALC256_FIXUP_ASUS_HEADSET_MIC] = {
7219 .type = HDA_FIXUP_PINS,
7220 .v.pins = (const struct hda_pintbl[]) {
7221 { 0x19, 0x03a11020 }, /* headset mic with jack detect */
7222 { }
7223 },
7224 .chained = true,
7225 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7226 },
Jian-Hong Pane1037352019-03-22 11:37:18 +08007227 [ALC256_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7228 .type = HDA_FIXUP_PINS,
7229 .v.pins = (const struct hda_pintbl[]) {
7230 { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
7231 { }
7232 },
7233 .chained = true,
7234 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7235 },
Bernhard Rosenkraenzere2a829b2019-03-05 00:38:19 +01007236 [ALC299_FIXUP_PREDATOR_SPK] = {
7237 .type = HDA_FIXUP_PINS,
7238 .v.pins = (const struct hda_pintbl[]) {
7239 { 0x21, 0x90170150 }, /* use as headset mic, without its own jack detect */
7240 { }
7241 }
7242 },
Jan-Marek Glogowskibd9c10b2019-09-15 16:57:28 +02007243 [ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE] = {
7244 .type = HDA_FIXUP_PINS,
7245 .v.pins = (const struct hda_pintbl[]) {
7246 { 0x19, 0x04a11040 },
7247 { 0x21, 0x04211020 },
7248 { }
7249 },
7250 .chained = true,
7251 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7252 },
Kailang Yange79c2262019-12-19 14:12:15 +08007253 [ALC289_FIXUP_DELL_SPK2] = {
7254 .type = HDA_FIXUP_PINS,
7255 .v.pins = (const struct hda_pintbl[]) {
7256 { 0x17, 0x90170130 }, /* bass spk */
7257 { }
7258 },
7259 .chained = true,
7260 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE
7261 },
7262 [ALC289_FIXUP_DUAL_SPK] = {
7263 .type = HDA_FIXUP_FUNC,
7264 .v.func = alc285_fixup_speaker2_to_dac1,
7265 .chained = true,
7266 .chain_id = ALC289_FIXUP_DELL_SPK2
7267 },
Chris Chiu48e01502019-12-30 11:11:18 +08007268 [ALC294_FIXUP_SPK2_TO_DAC1] = {
7269 .type = HDA_FIXUP_FUNC,
7270 .v.func = alc285_fixup_speaker2_to_dac1,
7271 .chained = true,
7272 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
7273 },
7274 [ALC294_FIXUP_ASUS_DUAL_SPK] = {
Jian-Hong Pan436e2552019-11-25 17:34:06 +08007275 .type = HDA_FIXUP_FUNC,
7276 /* The GPIO must be pulled to initialize the AMP */
7277 .v.func = alc_fixup_gpio4,
7278 .chained = true,
Chris Chiu48e01502019-12-30 11:11:18 +08007279 .chain_id = ALC294_FIXUP_SPK2_TO_DAC1
Jian-Hong Pan436e2552019-11-25 17:34:06 +08007280 },
Kailang Yang76f7dec2020-02-10 16:30:26 +08007281 [ALC285_FIXUP_THINKPAD_HEADSET_JACK] = {
7282 .type = HDA_FIXUP_FUNC,
7283 .v.func = alc_fixup_headset_jack,
7284 .chained = true,
7285 .chain_id = ALC285_FIXUP_SPEAKER2_TO_DAC1
7286 },
Jian-Hong Pan8b33a132020-02-25 15:29:21 +08007287 [ALC294_FIXUP_ASUS_HPE] = {
7288 .type = HDA_FIXUP_VERBS,
7289 .v.verbs = (const struct hda_verb[]) {
7290 /* Set EAPD high */
7291 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
7292 { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
7293 { }
7294 },
7295 .chained = true,
7296 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
7297 },
Takashi Iwai1b94e592020-05-12 09:32:03 +02007298 [ALC294_FIXUP_ASUS_COEF_1B] = {
7299 .type = HDA_FIXUP_VERBS,
7300 .v.verbs = (const struct hda_verb[]) {
7301 /* Set bit 10 to correct noisy output after reboot from
7302 * Windows 10 (due to pop noise reduction?)
7303 */
7304 { 0x20, AC_VERB_SET_COEF_INDEX, 0x1b },
7305 { 0x20, AC_VERB_SET_PROC_COEF, 0x4e4b },
7306 { }
7307 },
7308 },
Kai-Heng Fengf5a88b02020-03-27 12:46:25 +08007309 [ALC285_FIXUP_HP_GPIO_LED] = {
7310 .type = HDA_FIXUP_FUNC,
7311 .v.func = alc285_fixup_hp_gpio_led,
7312 },
Kailang Yang431e76c2020-04-07 14:40:20 +08007313 [ALC285_FIXUP_HP_MUTE_LED] = {
7314 .type = HDA_FIXUP_FUNC,
7315 .v.func = alc285_fixup_hp_mute_led,
7316 },
Kailang Yang24164f42020-04-07 14:52:42 +08007317 [ALC236_FIXUP_HP_MUTE_LED] = {
7318 .type = HDA_FIXUP_FUNC,
7319 .v.func = alc236_fixup_hp_mute_led,
7320 },
Mike Pozulp14425f12020-05-09 20:28:37 -07007321 [ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
7322 .type = HDA_FIXUP_VERBS,
7323 .v.verbs = (const struct hda_verb[]) {
7324 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc5 },
7325 { }
7326 },
7327 },
Chris Chiu9e433422020-05-12 14:15:24 +08007328 [ALC295_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7329 .type = HDA_FIXUP_PINS,
7330 .v.pins = (const struct hda_pintbl[]) {
7331 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7332 { }
7333 },
7334 .chained = true,
7335 .chain_id = ALC269_FIXUP_HEADSET_MODE
7336 },
Jian-Hong Pan8eae7e92020-07-06 15:18:25 +08007337 [ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS] = {
7338 .type = HDA_FIXUP_PINS,
7339 .v.pins = (const struct hda_pintbl[]) {
7340 { 0x14, 0x90100120 }, /* use as internal speaker */
7341 { 0x18, 0x02a111f0 }, /* use as headset mic, without its own jack detect */
7342 { 0x1a, 0x01011020 }, /* use as line out */
7343 { },
7344 },
7345 .chained = true,
7346 .chain_id = ALC269_FIXUP_HEADSET_MIC
7347 },
Jian-Hong Pan6e15d122020-07-06 15:18:27 +08007348 [ALC269VC_FIXUP_ACER_HEADSET_MIC] = {
7349 .type = HDA_FIXUP_PINS,
7350 .v.pins = (const struct hda_pintbl[]) {
7351 { 0x18, 0x02a11030 }, /* use as headset mic */
7352 { }
7353 },
7354 .chained = true,
7355 .chain_id = ALC269_FIXUP_HEADSET_MIC
7356 },
Jian-Hong Pan781c90c2020-07-06 15:18:29 +08007357 [ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE] = {
7358 .type = HDA_FIXUP_PINS,
7359 .v.pins = (const struct hda_pintbl[]) {
7360 { 0x18, 0x01a11130 }, /* use as headset mic, without its own jack detect */
7361 { }
7362 },
7363 .chained = true,
7364 .chain_id = ALC269_FIXUP_HEADSET_MIC
7365 },
Armas Spannff536642020-07-11 13:05:57 +02007366 [ALC289_FIXUP_ASUS_G401] = {
7367 .type = HDA_FIXUP_PINS,
7368 .v.pins = (const struct hda_pintbl[]) {
7369 { 0x19, 0x03a11020 }, /* headset mic with jack detect */
7370 { }
7371 },
7372 },
Jian-Hong Panf50a1212020-07-13 14:04:22 +08007373 [ALC256_FIXUP_ACER_MIC_NO_PRESENCE] = {
7374 .type = HDA_FIXUP_PINS,
7375 .v.pins = (const struct hda_pintbl[]) {
7376 { 0x19, 0x02a11120 }, /* use as headset mic, without its own jack detect */
7377 { }
7378 },
7379 .chained = true,
7380 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7381 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02007382};
7383
7384static const struct snd_pci_quirk alc269_fixup_tbl[] = {
Marius Knausta6b92b62014-03-03 01:48:58 +01007385 SND_PCI_QUIRK(0x1025, 0x0283, "Acer TravelMate 8371", ALC269_FIXUP_INV_DMIC),
David Henningsson693b6132012-06-22 19:12:10 +02007386 SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC),
7387 SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC),
David Henningssonaaedfb42013-08-16 14:09:02 +02007388 SND_PCI_QUIRK(0x1025, 0x047c, "Acer AC700", ALC269_FIXUP_ACER_AC700),
Takashi Iwai78197172015-06-27 10:21:13 +02007389 SND_PCI_QUIRK(0x1025, 0x072d, "Acer Aspire V5-571G", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
7390 SND_PCI_QUIRK(0x1025, 0x080d, "Acer Aspire V5-122P", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
David Henningssonaaedfb42013-08-16 14:09:02 +02007391 SND_PCI_QUIRK(0x1025, 0x0740, "Acer AO725", ALC271_FIXUP_HP_GATE_MIC_JACK),
7392 SND_PCI_QUIRK(0x1025, 0x0742, "Acer AO756", ALC271_FIXUP_HP_GATE_MIC_JACK),
Simon South02322ac2016-03-02 23:10:44 -05007393 SND_PCI_QUIRK(0x1025, 0x0762, "Acer Aspire E1-472", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
Oleksij Rempelb1e89722013-12-04 20:50:53 +01007394 SND_PCI_QUIRK(0x1025, 0x0775, "Acer Aspire E1-572", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
Takashi Iwai1a22e772014-08-27 08:19:05 +02007395 SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS),
Chris Chiu705b65f2018-12-05 14:48:54 +08007396 SND_PCI_QUIRK(0x1025, 0x102b, "Acer Aspire C24-860", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE),
Jian-Hong Pan6e15d122020-07-06 15:18:27 +08007397 SND_PCI_QUIRK(0x1025, 0x1065, "Acer Aspire C20-820", ALC269VC_FIXUP_ACER_HEADSET_MIC),
Takashi Iwaib9c2fa52015-11-19 16:39:50 +01007398 SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK),
Chris Chiuc7531e32019-03-21 17:17:31 +08007399 SND_PCI_QUIRK(0x1025, 0x1099, "Acer Aspire E5-523G", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
7400 SND_PCI_QUIRK(0x1025, 0x110e, "Acer Aspire ES1-432", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
Bernhard Rosenkraenzere2a829b2019-03-05 00:38:19 +01007401 SND_PCI_QUIRK(0x1025, 0x1246, "Acer Predator Helios 500", ALC299_FIXUP_PREDATOR_SPK),
Jian-Hong Pan8eae7e92020-07-06 15:18:25 +08007402 SND_PCI_QUIRK(0x1025, 0x1247, "Acer vCopperbox", ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS),
Jian-Hong Pan781c90c2020-07-06 15:18:29 +08007403 SND_PCI_QUIRK(0x1025, 0x1248, "Acer Veriton N4660G", ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE),
Jian-Hong Pan667a8f72019-03-15 17:51:09 +08007404 SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
7405 SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
7406 SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
Jian-Hong Pan2733cce2019-03-21 16:39:04 +08007407 SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
Jian-Hong Panea5c7eb2019-04-01 11:25:05 +08007408 SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", ALC233_FIXUP_ACER_HEADSET_MIC),
Jian-Hong Pancbc05fd2019-03-13 17:33:24 +08007409 SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC),
Jian-Hong Panf50a1212020-07-13 14:04:22 +08007410 SND_PCI_QUIRK(0x1025, 0x1430, "Acer TravelMate B311R-31", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
David Henningssonaaedfb42013-08-16 14:09:02 +02007411 SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
Kailang Yang6ed11312015-10-26 15:37:39 +08007412 SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS),
Takashi Iwai86f799b2015-11-14 17:46:31 +01007413 SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X),
Takashi Iwaicf521032016-01-15 12:59:25 +01007414 SND_PCI_QUIRK(0x1028, 0x05be, "Dell Latitude E6540", ALC292_FIXUP_DELL_E7X),
Takashi Iwai8b99aba2015-06-15 11:59:32 +02007415 SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X),
7416 SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X),
David Henningsson0f4881d2013-12-20 16:08:13 +01007417 SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER),
David Henningsson73bdd592013-04-15 15:44:14 +02007418 SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
7419 SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
7420 SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
David Henningsson0f4881d2013-12-20 16:08:13 +01007421 SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
7422 SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
Takashi Iwai98070572016-01-12 21:06:39 +01007423 SND_PCI_QUIRK(0x1028, 0x062c, "Dell Latitude E5550", ALC292_FIXUP_DELL_E7X),
Takashi Iwai42755542015-06-29 10:56:53 +02007424 SND_PCI_QUIRK(0x1028, 0x062e, "Dell Latitude E7450", ALC292_FIXUP_DELL_E7X),
David Henningsson0f4881d2013-12-20 16:08:13 +01007425 SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),
Kailang Yanga22aa262014-04-23 17:34:28 +08007426 SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
7427 SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
Hui Wang831bfdf92015-06-26 12:35:17 +08007428 SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13),
Bastien Noceraafecb142016-04-18 11:10:42 +02007429 SND_PCI_QUIRK(0x1028, 0x0669, "Dell Optiplex 9020m", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
Takashi Iwai3a05d122015-07-29 09:04:52 +02007430 SND_PCI_QUIRK(0x1028, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK),
Kailang Yang8b724152014-12-17 17:08:59 +08007431 SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
Kailang Yangb7343042014-12-02 14:50:45 +08007432 SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
7433 SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
David Henningssonc04017ea2015-12-15 14:44:03 +01007434 SND_PCI_QUIRK(0x1028, 0x06db, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
7435 SND_PCI_QUIRK(0x1028, 0x06dd, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
7436 SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
7437 SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
7438 SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
Kai-Heng Fengfd06c772016-08-30 15:36:34 +08007439 SND_PCI_QUIRK(0x1028, 0x0706, "Dell Inspiron 7559", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
Kai-Heng Feng3b43b712016-02-25 15:19:38 +08007440 SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE),
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01007441 SND_PCI_QUIRK(0x1028, 0x0738, "Dell Precision 5820", ALC269_FIXUP_NO_SHUTUP),
Kai-Heng Feng709ae622018-10-04 11:39:42 +08007442 SND_PCI_QUIRK(0x1028, 0x075c, "Dell XPS 27 7760", ALC298_FIXUP_SPK_VOLUME),
Hui Wangdd9aa332016-08-01 10:20:32 +08007443 SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME),
Takashi Iwaie312a862018-03-06 12:14:17 +01007444 SND_PCI_QUIRK(0x1028, 0x07b0, "Dell Precision 7520", ALC295_FIXUP_DISABLE_DAC3),
Takashi Iwai493de342017-02-28 17:27:57 +01007445 SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
Kailang Yang5f364132017-07-25 16:28:16 +08007446 SND_PCI_QUIRK(0x1028, 0x080c, "Dell WYSE", ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE),
Kailang Yang40e2c4e2018-02-02 15:13:09 +08007447 SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
7448 SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
Kailang Yangf0ba9d62018-03-16 11:46:08 +08007449 SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
7450 SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
Kailang Yangae104a22018-02-05 16:07:20 +08007451 SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB),
Kailang Yang136824e2019-03-14 16:22:45 +08007452 SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE),
Kailang Yangda484d002019-03-14 15:50:59 +08007453 SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE),
Kailang Yangc2a7c55a2019-01-03 15:53:39 +08007454 SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
Kailang Yange79c2262019-12-19 14:12:15 +08007455 SND_PCI_QUIRK(0x1028, 0x097e, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
7456 SND_PCI_QUIRK(0x1028, 0x097d, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
Kailang Yang78def222020-02-20 15:21:54 +08007457 SND_PCI_QUIRK(0x1028, 0x098d, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
7458 SND_PCI_QUIRK(0x1028, 0x09bf, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
Kailang Yanga22aa262014-04-23 17:34:28 +08007459 SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
7460 SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
Takashi Iwai08fb0d02013-01-10 17:33:58 +01007461 SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01007462 SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),
David Henningsson8e35cd42013-11-06 11:20:01 +01007463 SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED),
David Henningsson33f4acd2015-01-07 15:50:13 +01007464 SND_PCI_QUIRK(0x103c, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY),
Kailang Yangc60666b2014-02-21 16:23:35 +08007465 /* ALC282 */
Hui Wang7976eb42015-02-13 11:14:41 +08007466 SND_PCI_QUIRK(0x103c, 0x21f9, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yang8a02b162014-06-13 17:16:31 +08007467 SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yang8a02b162014-06-13 17:16:31 +08007468 SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007469 SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
7470 SND_PCI_QUIRK(0x103c, 0x2237, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
7471 SND_PCI_QUIRK(0x103c, 0x2238, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
7472 SND_PCI_QUIRK(0x103c, 0x2239, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007473 SND_PCI_QUIRK(0x103c, 0x224b, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
Kailang Yangc60666b2014-02-21 16:23:35 +08007474 SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08007475 SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7476 SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yang8a02b162014-06-13 17:16:31 +08007477 SND_PCI_QUIRK(0x103c, 0x226e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangeaa8e5e2014-11-21 15:49:11 +08007478 SND_PCI_QUIRK(0x103c, 0x2271, "HP", ALC286_FIXUP_HP_GPIO_LED),
TienFu Chenb4b33f92015-01-20 15:06:21 +01007479 SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC280_FIXUP_HP_DOCK_PINS),
TienFu Chen3271cb22015-02-10 09:09:41 +01007480 SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC280_FIXUP_HP_DOCK_PINS),
Kailang Yangc60666b2014-02-21 16:23:35 +08007481 SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08007482 SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7483 SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7484 SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08007485 SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Keith Packard98973f22015-07-15 12:14:39 -07007486 SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC280_FIXUP_HP_9480M),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007487 SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7488 SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yangc60666b2014-02-21 16:23:35 +08007489 /* ALC290 */
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007490 SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007491 SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007492 SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007493 SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7494 SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7495 SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7496 SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7497 SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007498 SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Jaroslav Kysela04d54662017-03-09 13:29:13 +01007499 SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED),
Kailang Yangc60666b2014-02-21 16:23:35 +08007500 SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08007501 SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7502 SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7503 SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007504 SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7505 SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007506 SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yangc60666b2014-02-21 16:23:35 +08007507 SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08007508 SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08007509 SND_PCI_QUIRK(0x103c, 0x228b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08007510 SND_PCI_QUIRK(0x103c, 0x228e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7511 SND_PCI_QUIRK(0x103c, 0x22c5, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08007512 SND_PCI_QUIRK(0x103c, 0x22c7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7513 SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08007514 SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yang8a02b162014-06-13 17:16:31 +08007515 SND_PCI_QUIRK(0x103c, 0x2334, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7516 SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7517 SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7518 SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Takashi Iwaif883982d2016-02-25 14:31:59 +01007519 SND_PCI_QUIRK(0x103c, 0x221c, "HP EliteBook 755 G2", ALC280_FIXUP_HP_HEADSET_MIC),
Jaroslav Kysela167897f2019-03-13 13:40:15 +01007520 SND_PCI_QUIRK(0x103c, 0x802e, "HP Z240 SFF", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
7521 SND_PCI_QUIRK(0x103c, 0x802f, "HP Z240", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
Takashi Iwai563785e2018-11-12 09:43:12 +01007522 SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
Hui Wange549d192016-04-01 11:00:15 +08007523 SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC),
Tom Bridenbbf8ff6b2018-05-29 17:34:20 +01007524 SND_PCI_QUIRK(0x103c, 0x827e, "HP x360", ALC295_FIXUP_HP_X360),
Jaroslav Kysela167897f2019-03-13 13:40:15 +01007525 SND_PCI_QUIRK(0x103c, 0x82bf, "HP G3 mini", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
7526 SND_PCI_QUIRK(0x103c, 0x82c0, "HP G3 mini premium", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
Alexandru Gagniuc56e40eb2018-08-04 11:44:44 -05007527 SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
Takashi Iwai190d0382019-08-13 17:39:56 +02007528 SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
Sam Bazleyd33cd422019-09-01 03:31:30 +01007529 SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
Kai-Heng Fengb2c22912020-06-17 18:29:02 +08007530 SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED),
7531 SND_PCI_QUIRK(0x103c, 0x8729, "HP", ALC285_FIXUP_HP_GPIO_LED),
Kai-Heng Fengf5a88b02020-03-27 12:46:25 +08007532 SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_LED),
Kailang Yang431e76c2020-04-07 14:40:20 +08007533 SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED),
Kailang Yang24164f42020-04-07 14:52:42 +08007534 SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED),
Chris Chiuc1732ed2017-02-28 14:17:13 -06007535 SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
Takashi Iwai7bba2152013-09-06 15:45:38 +02007536 SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
David Henningsson3e0d6112013-04-22 14:30:14 +02007537 SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Wandrille RONCE9cf65332018-12-19 14:52:44 +01007538 SND_PCI_QUIRK(0x1043, 0x10a1, "ASUS UX391UA", ALC294_FIXUP_ASUS_SPK),
Chris Chiuc1732ed2017-02-28 14:17:13 -06007539 SND_PCI_QUIRK(0x1043, 0x10c0, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
Takashi Iwai4eab0ea2017-06-06 12:33:17 +02007540 SND_PCI_QUIRK(0x1043, 0x10d0, "ASUS X540LA/X540LJ", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
David Henningsson3e0d6112013-04-22 14:30:14 +02007541 SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Takashi Iwai4eab0ea2017-06-06 12:33:17 +02007542 SND_PCI_QUIRK(0x1043, 0x11c0, "ASUS X556UR", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
7543 SND_PCI_QUIRK(0x1043, 0x1290, "ASUS X441SA", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
7544 SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
Chris Chiuc1732ed2017-02-28 14:17:13 -06007545 SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC),
7546 SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),
7547 SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
Oleksij Rempel2cede302013-11-27 17:12:03 +01007548 SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
Takashi Iwai23870832013-11-29 14:13:12 +01007549 SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
David Henningsson3e0d6112013-04-22 14:30:14 +02007550 SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
Chris Chiu48e01502019-12-30 11:11:18 +08007551 SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_DUAL_SPK),
Daniel Drake8c8967a2019-10-17 16:15:01 +08007552 SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC),
Adam Barber4963d662020-04-10 17:00:32 +08007553 SND_PCI_QUIRK(0x1043, 0x18f1, "Asus FX505DT", ALC256_FIXUP_ASUS_HEADSET_MIC),
Kailang Yang158ae2f2020-07-16 15:21:59 +08007554 SND_PCI_QUIRK(0x1043, 0x194e, "ASUS UX563FD", ALC294_FIXUP_ASUS_HPE),
Jian-Hong Pan8b33a132020-02-25 15:29:21 +08007555 SND_PCI_QUIRK(0x1043, 0x19ce, "ASUS B9450FA", ALC294_FIXUP_ASUS_HPE),
Jian-Hong Pan7900e812020-05-12 14:15:28 +08007556 SND_PCI_QUIRK(0x1043, 0x19e1, "ASUS UX581LV", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE),
Takashi Iwai017f2a102011-07-09 14:42:25 +02007557 SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
Chris Chiu28e8af82017-06-05 15:05:30 -06007558 SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC),
Takashi Iwai1b94e592020-05-12 09:32:03 +02007559 SND_PCI_QUIRK(0x1043, 0x1b11, "ASUS UX431DA", ALC294_FIXUP_ASUS_COEF_1B),
David Henningsson693b6132012-06-22 19:12:10 +02007560 SND_PCI_QUIRK(0x1043, 0x1b13, "Asus U41SV", ALC269_FIXUP_INV_DMIC),
Chris Chiu615966a2017-02-28 14:17:12 -06007561 SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
Takashi Iwai4eab0ea2017-06-06 12:33:17 +02007562 SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Chris Chiuc1732ed2017-02-28 14:17:13 -06007563 SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
Armas Spannff536642020-07-11 13:05:57 +02007564 SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_G401),
Chris Chiueeed4cd2017-02-28 14:17:15 -06007565 SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02007566 SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
7567 SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
7568 SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
7569 SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
David Henningssond240d1d2013-04-15 12:50:02 +02007570 SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
Takashi Iwaif88abaa2014-02-07 12:07:59 +01007571 SND_PCI_QUIRK(0x104d, 0x90b5, "Sony VAIO Pro 11", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
David Henningsson88cfcf82013-10-11 10:18:45 +02007572 SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
Takashi Iwai1d045db2011-07-07 18:23:21 +02007573 SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
7574 SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
7575 SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
Takashi Iwaie9bd7d52014-05-21 11:06:49 +02007576 SND_PCI_QUIRK(0x104d, 0x9099, "Sony VAIO S13", ALC275_FIXUP_SONY_DISABLE_AAMIX),
Takashi Iwai24519912011-08-16 15:08:49 +02007577 SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),
Takashi Iwai4df3fd12015-06-29 08:38:02 +02007578 SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT),
Takashi Iwaicc7016a2015-04-08 20:47:55 +02007579 SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN),
Takashi Iwai88776f32015-05-01 09:20:34 +02007580 SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN),
Jan-Marek Glogowskifdcc9682018-02-14 11:29:15 +01007581 SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC),
David Henningsson2041d562014-06-13 11:15:44 +02007582 SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),
PeiSen Houb84e8432017-09-01 15:11:56 +08007583 SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE),
PeiSen Hou5734e502020-07-16 11:01:34 +02007584 SND_PCI_QUIRK(0x10ec, 0x1230, "Intel Reference board", ALC225_FIXUP_HEADSET_JACK),
YOKOTA Hiroshi0fca97a2018-07-01 18:30:01 +09007585 SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-SZ6", ALC269_FIXUP_HEADSET_MODE),
David Henningssona33cc482014-10-07 10:18:41 +02007586 SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
Mike Pozulp14425f12020-05-09 20:28:37 -07007587 SND_PCI_QUIRK(0x144d, 0xc169, "Samsung Notebook 9 Pen (NP930SBE-K01US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
7588 SND_PCI_QUIRK(0x144d, 0xc176, "Samsung Notebook 9 Pro (NP930MBE-K04US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
Gabriele Mazzotta823ff162016-12-24 19:50:01 +01007589 SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
Anisse Astierabaa22742016-08-24 09:14:13 +02007590 SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
7591 SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),
Anisse Astier8cd65272018-11-23 17:59:11 +01007592 SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC),
Jeremy Soller89e3a562019-01-30 16:12:31 -07007593 SND_PCI_QUIRK(0x1558, 0x1325, "System76 Darter Pro (darp5)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
Jeremy Soller80a50522019-05-07 17:11:08 -04007594 SND_PCI_QUIRK(0x1558, 0x8550, "System76 Gazelle (gaze14)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
Jeremy Soller891afcf2019-05-10 10:15:07 -04007595 SND_PCI_QUIRK(0x1558, 0x8551, "System76 Gazelle (gaze14)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
7596 SND_PCI_QUIRK(0x1558, 0x8560, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
7597 SND_PCI_QUIRK(0x1558, 0x8561, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
Kailang Yangca169cc2017-04-25 16:17:40 +08007598 SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
Hui Wangef0b3202020-04-27 11:00:39 +08007599 SND_PCI_QUIRK(0x17aa, 0x1048, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
Takashi Iwai1d045db2011-07-07 18:23:21 +02007600 SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
7601 SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
7602 SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
7603 SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
7604 SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
Takashi Iwaib590b382020-05-14 18:05:33 +02007605 SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST),
Felix Kaechelec8415a42012-08-06 23:02:01 +02007606 SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK),
Stefán Freyr84f98fd2012-10-19 22:46:00 +02007607 SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),
Philipp A. Mohrenweiser4407be62012-08-06 13:14:18 +02007608 SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),
David Henningsson108cc102012-07-20 10:37:25 +02007609 SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK),
David Henningssonaaedfb42013-08-16 14:09:02 +02007610 SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK),
Takashi Iwai9a811232015-12-09 15:17:43 +01007611 SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440),
Takashi Iwai1c37c222014-05-06 17:34:42 +02007612 SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK),
Takashi Iwaia12137e2014-06-27 12:14:35 +02007613 SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK),
Rick Sherman59a51a62015-08-18 21:04:30 -05007614 SND_PCI_QUIRK(0x17aa, 0x2211, "Thinkpad W541", ALC292_FIXUP_TPT440_DOCK),
Takashi Iwai6d169412014-10-07 17:27:02 +02007615 SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK),
Lukas Bossard7c215392014-10-29 18:31:07 +01007616 SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK),
David Henningssona4a9e082013-08-16 14:09:01 +02007617 SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Takashi Iwaib6903c02015-12-10 12:20:20 +01007618 SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK),
Laura Abbottd05ea7d2015-10-02 11:09:54 -07007619 SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK),
Yves-Alexis Perezc0278662015-04-11 09:31:35 +02007620 SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK),
Kailang Yang61fcf8e2018-02-02 15:26:46 +08007621 SND_PCI_QUIRK(0x17aa, 0x222d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7622 SND_PCI_QUIRK(0x17aa, 0x222e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
Torsten Hilbrichdab38e42016-06-07 13:14:21 +02007623 SND_PCI_QUIRK(0x17aa, 0x2231, "Thinkpad T560", ALC292_FIXUP_TPT460),
Sven Eckelmannc636b952016-04-11 16:55:26 +02007624 SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460),
Kailang Yang61fcf8e2018-02-02 15:26:46 +08007625 SND_PCI_QUIRK(0x17aa, 0x2245, "Thinkpad T470", ALC298_FIXUP_TPT470_DOCK),
7626 SND_PCI_QUIRK(0x17aa, 0x2246, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7627 SND_PCI_QUIRK(0x17aa, 0x2247, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
Dennis Wassenberge4c07b32018-03-08 13:17:54 +01007628 SND_PCI_QUIRK(0x17aa, 0x2249, "Thinkpad", ALC292_FIXUP_TPT460),
Kailang Yang61fcf8e2018-02-02 15:26:46 +08007629 SND_PCI_QUIRK(0x17aa, 0x224b, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7630 SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7631 SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
Benjamin Berg85981df2018-02-14 13:29:39 +01007632 SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Benjamin Poirier9774dc22020-07-03 17:00:04 +09007633 SND_PCI_QUIRK(0x17aa, 0x2292, "Thinkpad X1 Carbon 7th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
Hans de Goedeca707b32020-04-02 19:43:11 +02007634 SND_PCI_QUIRK(0x17aa, 0x22be, "Thinkpad X1 Carbon 8th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
Kailang3694cb22015-12-28 11:35:24 +08007635 SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
Hui Wang6ef2f682016-03-11 12:04:02 +08007636 SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
Hui Wangf33f79f2017-07-07 12:08:29 +08007637 SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
Dennis Wassenbergbef33e12019-06-28 10:54:53 +02007638 SND_PCI_QUIRK(0x17aa, 0x3111, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
Hui Wange41fc8c2018-06-25 14:40:56 +08007639 SND_PCI_QUIRK(0x17aa, 0x312a, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
Kailang Yang658118342018-04-25 17:07:27 +08007640 SND_PCI_QUIRK(0x17aa, 0x312f, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
Hui Wang8da5bbf2017-12-22 11:17:46 +08007641 SND_PCI_QUIRK(0x17aa, 0x313c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
Hui Wang2a36c162019-09-04 13:53:27 +08007642 SND_PCI_QUIRK(0x17aa, 0x3151, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
Aaron Ma8a6c55d02019-10-24 19:44:39 +08007643 SND_PCI_QUIRK(0x17aa, 0x3176, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
7644 SND_PCI_QUIRK(0x17aa, 0x3178, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
David Henningsson56f27012016-01-11 09:33:14 +01007645 SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
Takashi Iwaifedb2242014-11-13 07:11:38 +01007646 SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
Michał Wadowski56df90b2019-05-14 16:58:00 +02007647 SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
David Henningssona4a9e082013-08-16 14:09:01 +02007648 SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Kailang Yang1bb3e062013-09-27 13:10:25 +02007649 SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC),
Takashi Iwaic497d9f2014-10-08 12:14:40 +02007650 SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK),
David Henningssoncd5302c2013-08-19 12:22:33 +02007651 SND_PCI_QUIRK(0x17aa, 0x5026, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Jo-Philipp Wichf2aa1112015-04-13 12:47:26 +02007652 SND_PCI_QUIRK(0x17aa, 0x5034, "Thinkpad T450", ALC292_FIXUP_TPT440_DOCK),
Sebastian Wicki80b311d2015-03-23 17:23:11 +01007653 SND_PCI_QUIRK(0x17aa, 0x5036, "Thinkpad T450s", ALC292_FIXUP_TPT440_DOCK),
Ansgar Hegerfeld09ea9972015-05-14 12:31:32 +02007654 SND_PCI_QUIRK(0x17aa, 0x503c, "Thinkpad L450", ALC292_FIXUP_TPT440_DOCK),
Conrad Kostecki037e1192016-04-26 10:08:10 +02007655 SND_PCI_QUIRK(0x17aa, 0x504a, "ThinkPad X260", ALC292_FIXUP_TPT440_DOCK),
Hui Wang23adc192015-12-08 12:27:18 +08007656 SND_PCI_QUIRK(0x17aa, 0x504b, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
Jaroslav Kysela0f087ee2016-06-24 15:13:16 +02007657 SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460),
Torsten Hilbrich9cd25742016-07-05 10:40:22 +02007658 SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460),
Jaroslav Kysela0f087ee2016-06-24 15:13:16 +02007659 SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460),
Kailang Yang61fcf8e2018-02-02 15:26:46 +08007660 SND_PCI_QUIRK(0x17aa, 0x505d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7661 SND_PCI_QUIRK(0x17aa, 0x505f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7662 SND_PCI_QUIRK(0x17aa, 0x5062, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
David Henningssoncd5302c2013-08-19 12:22:33 +02007663 SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Kailang Yang61fcf8e2018-02-02 15:26:46 +08007664 SND_PCI_QUIRK(0x17aa, 0x511e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7665 SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
David Henningsson012e7eb2012-08-08 08:43:37 +02007666 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
Takashi Iwai1d045db2011-07-07 18:23:21 +02007667 SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
Ayman Bagabas0fbf21c2019-05-23 05:30:11 -04007668 SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS),
Anisse Astier02b504d2013-06-03 11:53:10 +02007669 SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */
Hui Wang695d1ec2019-11-21 10:54:27 +08007670 SND_PCI_QUIRK(0x1d72, 0x1901, "RedmiBook 14", ALC256_FIXUP_ASUS_HEADSET_MIC),
Jan-Marek Glogowskibd9c10b2019-09-15 16:57:28 +02007671 SND_PCI_QUIRK(0x10ec, 0x118c, "Medion EE4254 MD62100", ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE),
Takashi Iwaia4297b52011-08-23 18:40:12 +02007672
Takashi Iwaia7f3eed2012-02-16 13:03:18 +01007673#if 0
Takashi Iwaia4297b52011-08-23 18:40:12 +02007674 /* Below is a quirk table taken from the old code.
7675 * Basically the device should work as is without the fixup table.
7676 * If BIOS doesn't give a proper info, enable the corresponding
7677 * fixup entry.
Jesper Juhl7d7eb9e2012-04-12 22:11:25 +02007678 */
Takashi Iwaia4297b52011-08-23 18:40:12 +02007679 SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
7680 ALC269_FIXUP_AMIC),
7681 SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC),
Takashi Iwaia4297b52011-08-23 18:40:12 +02007682 SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC),
7683 SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC),
7684 SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC),
7685 SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269_FIXUP_AMIC),
7686 SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269_FIXUP_AMIC),
7687 SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269_FIXUP_AMIC),
7688 SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_FIXUP_AMIC),
7689 SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269_FIXUP_AMIC),
7690 SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_FIXUP_AMIC),
7691 SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_FIXUP_AMIC),
7692 SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_FIXUP_AMIC),
7693 SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_FIXUP_AMIC),
7694 SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_FIXUP_AMIC),
7695 SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_FIXUP_AMIC),
7696 SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_FIXUP_AMIC),
7697 SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_FIXUP_AMIC),
7698 SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_FIXUP_AMIC),
7699 SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_FIXUP_AMIC),
7700 SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_FIXUP_AMIC),
7701 SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_FIXUP_AMIC),
7702 SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_FIXUP_AMIC),
7703 SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_FIXUP_AMIC),
7704 SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_FIXUP_AMIC),
7705 SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_FIXUP_AMIC),
7706 SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_FIXUP_AMIC),
7707 SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_FIXUP_AMIC),
7708 SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_FIXUP_AMIC),
7709 SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_FIXUP_AMIC),
7710 SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_FIXUP_AMIC),
7711 SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_FIXUP_AMIC),
7712 SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_FIXUP_AMIC),
7713 SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_FIXUP_AMIC),
7714 SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_FIXUP_AMIC),
7715 SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_FIXUP_DMIC),
7716 SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_FIXUP_AMIC),
7717 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_AMIC),
7718 SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_FIXUP_DMIC),
7719 SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_FIXUP_DMIC),
7720#endif
7721 {}
7722};
7723
David Henningsson214eef72014-07-22 14:09:35 +02007724static const struct snd_pci_quirk alc269_fixup_vendor_tbl[] = {
7725 SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
7726 SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED),
7727 SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
7728 SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", ALC269_FIXUP_THINKPAD_ACPI),
Ayman Bagabas0fbf21c2019-05-23 05:30:11 -04007729 SND_PCI_QUIRK_VENDOR(0x19e5, "Huawei Matebook", ALC255_FIXUP_MIC_MUTE_LED),
David Henningsson214eef72014-07-22 14:09:35 +02007730 {}
7731};
7732
Takashi Iwai1727a772013-01-10 09:52:52 +01007733static const struct hda_model_fixup alc269_fixup_models[] = {
Takashi Iwaia4297b52011-08-23 18:40:12 +02007734 {.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"},
7735 {.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"},
Takashi Iwai6e72aa52012-06-25 10:52:25 +02007736 {.id = ALC269_FIXUP_STEREO_DMIC, .name = "alc269-dmic"},
7737 {.id = ALC271_FIXUP_DMIC, .name = "alc271-dmic"},
7738 {.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"},
David Henningsson7c478f02013-10-11 10:18:46 +02007739 {.id = ALC269_FIXUP_HEADSET_MIC, .name = "headset-mic"},
Takashi Iwaib0169512015-05-19 10:20:13 +02007740 {.id = ALC269_FIXUP_HEADSET_MODE, .name = "headset-mode"},
7741 {.id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, .name = "headset-mode-no-hp-mic"},
David Henningsson108cc102012-07-20 10:37:25 +02007742 {.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
Takashi Iwaib590b382020-05-14 18:05:33 +02007743 {.id = ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST, .name = "lenovo-dock-limit-boost"},
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01007744 {.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
Jaroslav Kysela04d54662017-03-09 13:29:13 +01007745 {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic1-led"},
David Henningssone32aa852013-06-17 11:04:02 +02007746 {.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
7747 {.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02007748 {.id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, .name = "dell-headset3"},
7749 {.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, .name = "dell-headset4"},
Kailang Yangbe8ef162014-04-08 15:19:49 +08007750 {.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},
Kailang Yang0202e992013-12-02 15:20:15 +08007751 {.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"},
Takashi Iwai1c37c222014-05-06 17:34:42 +02007752 {.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
Takashi Iwai9a811232015-12-09 15:17:43 +01007753 {.id = ALC292_FIXUP_TPT440, .name = "tpt440"},
Sven Eckelmannc636b952016-04-11 16:55:26 +02007754 {.id = ALC292_FIXUP_TPT460, .name = "tpt460"},
Takashi Iwai399c01a2020-05-26 08:24:06 +02007755 {.id = ALC298_FIXUP_TPT470_DOCK_FIX, .name = "tpt470-dock-fix"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02007756 {.id = ALC298_FIXUP_TPT470_DOCK, .name = "tpt470-dock"},
Takashi Iwaiba90d6a2017-05-22 16:38:47 +02007757 {.id = ALC233_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
Takashi Iwai28d1d6d2017-10-18 14:01:58 +02007758 {.id = ALC700_FIXUP_INTEL_REFERENCE, .name = "alc700-ref"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02007759 {.id = ALC269_FIXUP_SONY_VAIO, .name = "vaio"},
7760 {.id = ALC269_FIXUP_DELL_M101Z, .name = "dell-m101z"},
7761 {.id = ALC269_FIXUP_ASUS_G73JW, .name = "asus-g73jw"},
7762 {.id = ALC269_FIXUP_LENOVO_EAPD, .name = "lenovo-eapd"},
7763 {.id = ALC275_FIXUP_SONY_HWEQ, .name = "sony-hweq"},
7764 {.id = ALC269_FIXUP_PCM_44K, .name = "pcm44k"},
7765 {.id = ALC269_FIXUP_LIFEBOOK, .name = "lifebook"},
7766 {.id = ALC269_FIXUP_LIFEBOOK_EXTMIC, .name = "lifebook-extmic"},
7767 {.id = ALC269_FIXUP_LIFEBOOK_HP_PIN, .name = "lifebook-hp-pin"},
7768 {.id = ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC, .name = "lifebook-u7x7"},
7769 {.id = ALC269VB_FIXUP_AMIC, .name = "alc269vb-amic"},
7770 {.id = ALC269VB_FIXUP_DMIC, .name = "alc269vb-dmic"},
7771 {.id = ALC269_FIXUP_HP_MUTE_LED_MIC1, .name = "hp-mute-led-mic1"},
7772 {.id = ALC269_FIXUP_HP_MUTE_LED_MIC2, .name = "hp-mute-led-mic2"},
7773 {.id = ALC269_FIXUP_HP_MUTE_LED_MIC3, .name = "hp-mute-led-mic3"},
7774 {.id = ALC269_FIXUP_HP_GPIO_MIC1_LED, .name = "hp-gpio-mic1"},
7775 {.id = ALC269_FIXUP_HP_LINE1_MIC1_LED, .name = "hp-line1-mic1"},
7776 {.id = ALC269_FIXUP_NO_SHUTUP, .name = "noshutup"},
7777 {.id = ALC286_FIXUP_SONY_MIC_NO_PRESENCE, .name = "sony-nomic"},
7778 {.id = ALC269_FIXUP_ASPIRE_HEADSET_MIC, .name = "aspire-headset-mic"},
7779 {.id = ALC269_FIXUP_ASUS_X101, .name = "asus-x101"},
7780 {.id = ALC271_FIXUP_HP_GATE_MIC_JACK, .name = "acer-ao7xx"},
7781 {.id = ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572, .name = "acer-aspire-e1"},
7782 {.id = ALC269_FIXUP_ACER_AC700, .name = "acer-ac700"},
7783 {.id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST, .name = "limit-mic-boost"},
7784 {.id = ALC269VB_FIXUP_ASUS_ZENBOOK, .name = "asus-zenbook"},
7785 {.id = ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A, .name = "asus-zenbook-ux31a"},
7786 {.id = ALC269VB_FIXUP_ORDISSIMO_EVE2, .name = "ordissimo"},
7787 {.id = ALC282_FIXUP_ASUS_TX300, .name = "asus-tx300"},
7788 {.id = ALC283_FIXUP_INT_MIC, .name = "alc283-int-mic"},
7789 {.id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK, .name = "mono-speakers"},
7790 {.id = ALC290_FIXUP_SUBWOOFER_HSJACK, .name = "alc290-subwoofer"},
7791 {.id = ALC269_FIXUP_THINKPAD_ACPI, .name = "thinkpad"},
7792 {.id = ALC269_FIXUP_DMIC_THINKPAD_ACPI, .name = "dmic-thinkpad"},
7793 {.id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE, .name = "alc255-acer"},
7794 {.id = ALC255_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc255-asus"},
7795 {.id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc255-dell1"},
7796 {.id = ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "alc255-dell2"},
7797 {.id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc293-dell1"},
7798 {.id = ALC283_FIXUP_HEADSET_MIC, .name = "alc283-headset"},
Takashi Iwaib3802782018-11-26 17:47:46 +01007799 {.id = ALC255_FIXUP_MIC_MUTE_LED, .name = "alc255-dell-mute"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02007800 {.id = ALC282_FIXUP_ASPIRE_V5_PINS, .name = "aspire-v5"},
7801 {.id = ALC280_FIXUP_HP_GPIO4, .name = "hp-gpio4"},
7802 {.id = ALC286_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
7803 {.id = ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY, .name = "hp-gpio2-hotkey"},
7804 {.id = ALC280_FIXUP_HP_DOCK_PINS, .name = "hp-dock-pins"},
7805 {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic"},
7806 {.id = ALC280_FIXUP_HP_9480M, .name = "hp-9480m"},
7807 {.id = ALC288_FIXUP_DELL_HEADSET_MODE, .name = "alc288-dell-headset"},
7808 {.id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc288-dell1"},
7809 {.id = ALC288_FIXUP_DELL_XPS_13, .name = "alc288-dell-xps13"},
7810 {.id = ALC292_FIXUP_DELL_E7X, .name = "dell-e7x"},
7811 {.id = ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK, .name = "alc293-dell"},
7812 {.id = ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc298-dell1"},
7813 {.id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, .name = "alc298-dell-aio"},
7814 {.id = ALC275_FIXUP_DELL_XPS, .name = "alc275-dell-xps"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02007815 {.id = ALC293_FIXUP_LENOVO_SPK_NOISE, .name = "lenovo-spk-noise"},
7816 {.id = ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, .name = "lenovo-hotkey"},
7817 {.id = ALC255_FIXUP_DELL_SPK_NOISE, .name = "dell-spk-noise"},
Kailang Yang82aa0d72019-01-11 17:15:53 +08007818 {.id = ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc225-dell1"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02007819 {.id = ALC295_FIXUP_DISABLE_DAC3, .name = "alc295-disable-dac3"},
Jaroslav Kyselad2cd7952019-11-29 15:40:27 +01007820 {.id = ALC285_FIXUP_SPEAKER2_TO_DAC1, .name = "alc285-speaker2-to-dac1"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02007821 {.id = ALC280_FIXUP_HP_HEADSET_MIC, .name = "alc280-hp-headset"},
7822 {.id = ALC221_FIXUP_HP_FRONT_MIC, .name = "alc221-hp-mic"},
7823 {.id = ALC298_FIXUP_SPK_VOLUME, .name = "alc298-spk-volume"},
7824 {.id = ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER, .name = "dell-inspiron-7559"},
7825 {.id = ALC269_FIXUP_ATIV_BOOK_8, .name = "ativ-book"},
7826 {.id = ALC221_FIXUP_HP_MIC_NO_PRESENCE, .name = "alc221-hp-mic"},
7827 {.id = ALC256_FIXUP_ASUS_HEADSET_MODE, .name = "alc256-asus-headset"},
7828 {.id = ALC256_FIXUP_ASUS_MIC, .name = "alc256-asus-mic"},
7829 {.id = ALC256_FIXUP_ASUS_AIO_GPIO2, .name = "alc256-asus-aio"},
7830 {.id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc233-asus"},
7831 {.id = ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE, .name = "alc233-eapd"},
7832 {.id = ALC294_FIXUP_LENOVO_MIC_LOCATION, .name = "alc294-lenovo-mic"},
7833 {.id = ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE, .name = "alc225-wyse"},
7834 {.id = ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, .name = "alc274-dell-aio"},
7835 {.id = ALC255_FIXUP_DUMMY_LINEOUT_VERB, .name = "alc255-dummy-lineout"},
7836 {.id = ALC255_FIXUP_DELL_HEADSET_MIC, .name = "alc255-dell-headset"},
7837 {.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"},
Kailang Yang8983eb62019-04-03 15:31:49 +08007838 {.id = ALC225_FIXUP_HEADSET_JACK, .name = "alc-headset-jack"},
7839 {.id = ALC295_FIXUP_CHROME_BOOK, .name = "alc-chrome-book"},
Bernhard Rosenkraenzere2a829b2019-03-05 00:38:19 +01007840 {.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"},
Tomas Espeletaa2ef03f2019-08-09 16:37:54 +02007841 {.id = ALC298_FIXUP_HUAWEI_MBX_STEREO, .name = "huawei-mbx-stereo"},
Jan-Marek Glogowskibd9c10b2019-09-15 16:57:28 +02007842 {.id = ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, .name = "alc256-medion-headset"},
Takashi Iwai1d045db2011-07-07 18:23:21 +02007843 {}
7844};
Kailang Yangcfc5a842016-02-03 15:20:39 +08007845#define ALC225_STANDARD_PINS \
Kailang Yangcfc5a842016-02-03 15:20:39 +08007846 {0x21, 0x04211020}
Takashi Iwai1d045db2011-07-07 18:23:21 +02007847
Hui Wange8191a82015-04-24 13:39:59 +08007848#define ALC256_STANDARD_PINS \
7849 {0x12, 0x90a60140}, \
7850 {0x14, 0x90170110}, \
Hui Wange8191a82015-04-24 13:39:59 +08007851 {0x21, 0x02211020}
7852
David Henningssonfea185e2014-09-03 10:23:04 +02007853#define ALC282_STANDARD_PINS \
Hui Wang11580292015-08-03 11:03:49 +08007854 {0x14, 0x90170110}
Kailang Yange1e62b92015-04-08 16:01:22 +08007855
David Henningssonfea185e2014-09-03 10:23:04 +02007856#define ALC290_STANDARD_PINS \
Hui Wang11580292015-08-03 11:03:49 +08007857 {0x12, 0x99a30130}
David Henningssonfea185e2014-09-03 10:23:04 +02007858
7859#define ALC292_STANDARD_PINS \
7860 {0x14, 0x90170110}, \
Hui Wang11580292015-08-03 11:03:49 +08007861 {0x15, 0x0221401f}
Kailang Yang977e6272015-05-18 15:31:20 +08007862
Hui Wang3f6409702016-09-11 11:26:16 +08007863#define ALC295_STANDARD_PINS \
7864 {0x12, 0xb7a60130}, \
7865 {0x14, 0x90170110}, \
Hui Wang3f6409702016-09-11 11:26:16 +08007866 {0x21, 0x04211020}
7867
Woodrow Shen703867e2015-08-05 12:34:12 +08007868#define ALC298_STANDARD_PINS \
7869 {0x12, 0x90a60130}, \
7870 {0x21, 0x03211020}
7871
Hui Wange1918932014-05-26 16:22:44 +08007872static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
Kailang Yang8a328ac2018-08-21 16:54:41 +08007873 SND_HDA_PIN_QUIRK(0x10ec0221, 0x103c, "HP Workstation", ALC221_FIXUP_HP_HEADSET_MIC,
7874 {0x14, 0x01014020},
7875 {0x17, 0x90170110},
7876 {0x18, 0x02a11030},
7877 {0x19, 0x0181303F},
7878 {0x21, 0x0221102f}),
Chris Chiu5824ce82017-02-28 14:17:11 -06007879 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1025, "Acer", ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
7880 {0x12, 0x90a601c0},
7881 {0x14, 0x90171120},
7882 {0x21, 0x02211030}),
Chris Chiu615966a2017-02-28 14:17:12 -06007883 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
7884 {0x14, 0x90170110},
7885 {0x1b, 0x90a70130},
7886 {0x21, 0x03211020}),
7887 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
7888 {0x1a, 0x90a70130},
7889 {0x1b, 0x90170110},
7890 {0x21, 0x03211020}),
David Henningsson2ae95572016-02-25 09:37:05 +01007891 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
Kailang Yangcfc5a842016-02-03 15:20:39 +08007892 ALC225_STANDARD_PINS,
Hui Wang8a132092016-07-08 14:26:57 +08007893 {0x12, 0xb7a60130},
Kailang Yangcfc5a842016-02-03 15:20:39 +08007894 {0x14, 0x901701a0}),
David Henningsson2ae95572016-02-25 09:37:05 +01007895 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
Kailang Yangcfc5a842016-02-03 15:20:39 +08007896 ALC225_STANDARD_PINS,
Hui Wang8a132092016-07-08 14:26:57 +08007897 {0x12, 0xb7a60130},
Kailang Yangcfc5a842016-02-03 15:20:39 +08007898 {0x14, 0x901701b0}),
Hui Wang8a132092016-07-08 14:26:57 +08007899 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
7900 ALC225_STANDARD_PINS,
7901 {0x12, 0xb7a60150},
7902 {0x14, 0x901701a0}),
7903 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
7904 ALC225_STANDARD_PINS,
7905 {0x12, 0xb7a60150},
7906 {0x14, 0x901701b0}),
7907 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
7908 ALC225_STANDARD_PINS,
7909 {0x12, 0xb7a60130},
7910 {0x1b, 0x90170110}),
Kai-Heng Feng0ce48e12017-11-20 02:29:13 -05007911 SND_HDA_PIN_QUIRK(0x10ec0233, 0x8086, "Intel NUC Skull Canyon", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
7912 {0x1b, 0x01111010},
7913 {0x1e, 0x01451130},
7914 {0x21, 0x02211020}),
Hui Wang986376b2018-05-30 12:33:07 +08007915 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
7916 {0x12, 0x90a60140},
7917 {0x14, 0x90170110},
7918 {0x19, 0x02a11030},
7919 {0x21, 0x02211020}),
Hui Wange41fc8c2018-06-25 14:40:56 +08007920 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
7921 {0x14, 0x90170110},
7922 {0x19, 0x02a11030},
7923 {0x1a, 0x02a11040},
7924 {0x1b, 0x01014020},
7925 {0x21, 0x0221101f}),
Hui Wangc6b17f12018-07-06 15:14:11 +08007926 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
7927 {0x14, 0x90170110},
Hui Wangd06fb562018-10-10 11:57:25 +08007928 {0x19, 0x02a11030},
7929 {0x1a, 0x02a11040},
7930 {0x1b, 0x01011020},
7931 {0x21, 0x0221101f}),
7932 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
7933 {0x14, 0x90170110},
Hui Wangc6b17f12018-07-06 15:14:11 +08007934 {0x19, 0x02a11020},
7935 {0x1a, 0x02a11030},
7936 {0x21, 0x0221101f}),
Hui Wangc77900e2014-09-03 11:31:07 +08007937 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
Hui Wangc77900e2014-09-03 11:31:07 +08007938 {0x14, 0x90170110},
Hui Wangc77900e2014-09-03 11:31:07 +08007939 {0x21, 0x02211020}),
David Henningsson76c21322014-06-24 14:46:54 +02007940 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang86c72d12016-05-25 12:12:32 +08007941 {0x14, 0x90170130},
7942 {0x21, 0x02211040}),
7943 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningsson76c21322014-06-24 14:46:54 +02007944 {0x12, 0x90a60140},
7945 {0x14, 0x90170110},
David Henningsson76c21322014-06-24 14:46:54 +02007946 {0x21, 0x02211020}),
7947 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7948 {0x12, 0x90a60160},
7949 {0x14, 0x90170120},
David Henningsson76c21322014-06-24 14:46:54 +02007950 {0x21, 0x02211030}),
7951 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang392c9da2016-09-26 10:59:38 +08007952 {0x14, 0x90170110},
7953 {0x1b, 0x02011020},
7954 {0x21, 0x0221101f}),
7955 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang6aecd872016-10-20 14:03:33 +08007956 {0x14, 0x90170110},
7957 {0x1b, 0x01011020},
7958 {0x21, 0x0221101f}),
7959 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningssoncba59972015-07-22 10:00:25 +02007960 {0x14, 0x90170130},
David Henningssoncba59972015-07-22 10:00:25 +02007961 {0x1b, 0x01014020},
David Henningssoncba59972015-07-22 10:00:25 +02007962 {0x21, 0x0221103f}),
7963 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang59ec4b52016-08-04 15:28:04 +08007964 {0x14, 0x90170130},
Hui Wang6aecd872016-10-20 14:03:33 +08007965 {0x1b, 0x01011020},
7966 {0x21, 0x0221103f}),
7967 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7968 {0x14, 0x90170130},
Hui Wang59ec4b52016-08-04 15:28:04 +08007969 {0x1b, 0x02011020},
7970 {0x21, 0x0221103f}),
7971 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Woodrow Shene9c28e12015-07-25 10:36:16 +08007972 {0x14, 0x90170150},
Woodrow Shene9c28e12015-07-25 10:36:16 +08007973 {0x1b, 0x02011020},
Woodrow Shene9c28e12015-07-25 10:36:16 +08007974 {0x21, 0x0221105f}),
7975 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Woodrow Shene9c28e12015-07-25 10:36:16 +08007976 {0x14, 0x90170110},
Woodrow Shene9c28e12015-07-25 10:36:16 +08007977 {0x1b, 0x01014020},
Woodrow Shene9c28e12015-07-25 10:36:16 +08007978 {0x21, 0x0221101f}),
7979 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningsson76c21322014-06-24 14:46:54 +02007980 {0x12, 0x90a60160},
7981 {0x14, 0x90170120},
7982 {0x17, 0x90170140},
David Henningsson76c21322014-06-24 14:46:54 +02007983 {0x21, 0x0321102f}),
7984 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7985 {0x12, 0x90a60160},
7986 {0x14, 0x90170130},
David Henningsson76c21322014-06-24 14:46:54 +02007987 {0x21, 0x02211040}),
7988 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7989 {0x12, 0x90a60160},
7990 {0x14, 0x90170140},
David Henningsson76c21322014-06-24 14:46:54 +02007991 {0x21, 0x02211050}),
7992 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7993 {0x12, 0x90a60170},
7994 {0x14, 0x90170120},
David Henningsson76c21322014-06-24 14:46:54 +02007995 {0x21, 0x02211030}),
7996 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7997 {0x12, 0x90a60170},
7998 {0x14, 0x90170130},
David Henningsson76c21322014-06-24 14:46:54 +02007999 {0x21, 0x02211040}),
Hui Wang70658b92015-03-06 14:03:57 +08008000 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang70658b92015-03-06 14:03:57 +08008001 {0x12, 0x90a60170},
Hui Wang0a1f90a2016-01-13 11:51:38 +08008002 {0x14, 0x90171130},
8003 {0x21, 0x02211040}),
8004 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8005 {0x12, 0x90a60170},
Hui Wang70658b92015-03-06 14:03:57 +08008006 {0x14, 0x90170140},
Hui Wang70658b92015-03-06 14:03:57 +08008007 {0x21, 0x02211050}),
David Henningsson9b5a4e32015-05-11 14:04:14 +02008008 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5548", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningsson9b5a4e32015-05-11 14:04:14 +02008009 {0x12, 0x90a60180},
8010 {0x14, 0x90170130},
David Henningsson9b5a4e32015-05-11 14:04:14 +02008011 {0x21, 0x02211040}),
AceLan Kaof90d83b2016-06-03 14:45:25 +08008012 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5565", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8013 {0x12, 0x90a60180},
8014 {0x14, 0x90170120},
8015 {0x21, 0x02211030}),
Hui Wang989dbe42016-11-23 16:05:38 +08008016 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8017 {0x1b, 0x01011020},
8018 {0x21, 0x02211010}),
Chris Chiuc1732ed2017-02-28 14:17:13 -06008019 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
8020 {0x14, 0x90170110},
8021 {0x1b, 0x90a70130},
8022 {0x21, 0x04211020}),
8023 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
8024 {0x14, 0x90170110},
8025 {0x1b, 0x90a70130},
8026 {0x21, 0x03211020}),
Jian-Hong Pane1037352019-03-22 11:37:18 +08008027 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
Chris Chiua806ef12019-03-22 11:37:20 +08008028 {0x12, 0x90a60130},
8029 {0x14, 0x90170110},
8030 {0x21, 0x03211020}),
8031 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
Jian-Hong Pan6ac371a2019-03-22 11:37:22 +08008032 {0x12, 0x90a60130},
8033 {0x14, 0x90170110},
8034 {0x21, 0x04211020}),
8035 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
Jian-Hong Pane1037352019-03-22 11:37:18 +08008036 {0x1a, 0x90a70130},
8037 {0x1b, 0x90170110},
8038 {0x21, 0x03211020}),
David Henningssoncf51eb92014-10-30 08:26:02 +01008039 SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
8040 {0x12, 0x90a60130},
David Henningssoncf51eb92014-10-30 08:26:02 +01008041 {0x14, 0x90170110},
8042 {0x15, 0x0421101f},
Hui Wang11580292015-08-03 11:03:49 +08008043 {0x1a, 0x04a11020}),
Hui Wang02796612014-09-03 11:31:11 +08008044 SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED,
8045 {0x12, 0x90a60140},
Hui Wang02796612014-09-03 11:31:11 +08008046 {0x14, 0x90170110},
8047 {0x15, 0x0421101f},
Hui Wang02796612014-09-03 11:31:11 +08008048 {0x18, 0x02811030},
Hui Wang02796612014-09-03 11:31:11 +08008049 {0x1a, 0x04a1103f},
Hui Wang11580292015-08-03 11:03:49 +08008050 {0x1b, 0x02011020}),
David Henningsson42304472014-07-22 11:42:17 +02008051 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP 15 Touchsmart", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008052 ALC282_STANDARD_PINS,
David Henningsson42304472014-07-22 11:42:17 +02008053 {0x12, 0x99a30130},
David Henningsson42304472014-07-22 11:42:17 +02008054 {0x19, 0x03a11020},
David Henningsson42304472014-07-22 11:42:17 +02008055 {0x21, 0x0321101f}),
Hui Wang2c609992014-09-03 11:31:08 +08008056 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008057 ALC282_STANDARD_PINS,
Hui Wang2c609992014-09-03 11:31:08 +08008058 {0x12, 0x99a30130},
Hui Wang2c609992014-09-03 11:31:08 +08008059 {0x19, 0x03a11020},
Hui Wang2c609992014-09-03 11:31:08 +08008060 {0x21, 0x03211040}),
8061 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008062 ALC282_STANDARD_PINS,
Hui Wang2c609992014-09-03 11:31:08 +08008063 {0x12, 0x99a30130},
Hui Wang2c609992014-09-03 11:31:08 +08008064 {0x19, 0x03a11030},
Hui Wang2c609992014-09-03 11:31:08 +08008065 {0x21, 0x03211020}),
8066 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008067 ALC282_STANDARD_PINS,
Hui Wang2c609992014-09-03 11:31:08 +08008068 {0x12, 0x99a30130},
Hui Wang2c609992014-09-03 11:31:08 +08008069 {0x19, 0x04a11020},
Hui Wang2c609992014-09-03 11:31:08 +08008070 {0x21, 0x0421101f}),
Hui Wang200afc02014-09-03 11:31:10 +08008071 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED,
David Henningssonaec856d2014-09-03 10:23:05 +02008072 ALC282_STANDARD_PINS,
Hui Wang200afc02014-09-03 11:31:10 +08008073 {0x12, 0x90a60140},
Hui Wang200afc02014-09-03 11:31:10 +08008074 {0x19, 0x04a11030},
Hui Wang200afc02014-09-03 11:31:10 +08008075 {0x21, 0x04211020}),
David Henningsson76c21322014-06-24 14:46:54 +02008076 SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02008077 ALC282_STANDARD_PINS,
David Henningsson76c21322014-06-24 14:46:54 +02008078 {0x12, 0x90a60130},
David Henningsson76c21322014-06-24 14:46:54 +02008079 {0x21, 0x0321101f}),
8080 SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
8081 {0x12, 0x90a60160},
8082 {0x14, 0x90170120},
David Henningsson76c21322014-06-24 14:46:54 +02008083 {0x21, 0x02211030}),
Hui Wangbc262172014-09-03 11:31:05 +08008084 SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02008085 ALC282_STANDARD_PINS,
Hui Wangbc262172014-09-03 11:31:05 +08008086 {0x12, 0x90a60130},
Hui Wangbc262172014-09-03 11:31:05 +08008087 {0x19, 0x03a11020},
Hui Wangbc262172014-09-03 11:31:05 +08008088 {0x21, 0x0321101f}),
Hui Wangc8c6ee62019-02-14 11:41:33 +08008089 SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
Hui Wangc4cfcf62018-11-26 14:17:16 +08008090 {0x12, 0x90a60130},
8091 {0x14, 0x90170110},
8092 {0x19, 0x04a11040},
8093 {0x21, 0x04211020}),
Chris Chiu33aaebd2018-12-05 14:48:53 +08008094 SND_HDA_PIN_QUIRK(0x10ec0286, 0x1025, "Acer", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
8095 {0x12, 0x90a60130},
8096 {0x17, 0x90170110},
8097 {0x21, 0x02211020}),
Takashi Iwaid44a6862018-06-19 23:04:03 +02008098 SND_HDA_PIN_QUIRK(0x10ec0288, 0x1028, "Dell", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
Kailang Yange1e62b92015-04-08 16:01:22 +08008099 {0x12, 0x90a60120},
Kailang Yange1e62b92015-04-08 16:01:22 +08008100 {0x14, 0x90170110},
Kailang Yange1e62b92015-04-08 16:01:22 +08008101 {0x21, 0x0321101f}),
Hui Wange4442bc2014-09-03 11:31:09 +08008102 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008103 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08008104 {0x15, 0x04211040},
Hui Wange4442bc2014-09-03 11:31:09 +08008105 {0x18, 0x90170112},
Hui Wang11580292015-08-03 11:03:49 +08008106 {0x1a, 0x04a11020}),
Hui Wange4442bc2014-09-03 11:31:09 +08008107 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008108 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08008109 {0x15, 0x04211040},
Hui Wange4442bc2014-09-03 11:31:09 +08008110 {0x18, 0x90170110},
Hui Wang11580292015-08-03 11:03:49 +08008111 {0x1a, 0x04a11020}),
Hui Wange4442bc2014-09-03 11:31:09 +08008112 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008113 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08008114 {0x15, 0x0421101f},
Hui Wang11580292015-08-03 11:03:49 +08008115 {0x1a, 0x04a11020}),
Hui Wange4442bc2014-09-03 11:31:09 +08008116 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008117 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08008118 {0x15, 0x04211020},
Hui Wang11580292015-08-03 11:03:49 +08008119 {0x1a, 0x04a11040}),
Hui Wange4442bc2014-09-03 11:31:09 +08008120 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008121 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08008122 {0x14, 0x90170110},
8123 {0x15, 0x04211020},
Hui Wang11580292015-08-03 11:03:49 +08008124 {0x1a, 0x04a11040}),
Hui Wange4442bc2014-09-03 11:31:09 +08008125 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008126 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08008127 {0x14, 0x90170110},
8128 {0x15, 0x04211020},
Hui Wang11580292015-08-03 11:03:49 +08008129 {0x1a, 0x04a11020}),
Hui Wange4442bc2014-09-03 11:31:09 +08008130 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008131 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08008132 {0x14, 0x90170110},
8133 {0x15, 0x0421101f},
Hui Wang11580292015-08-03 11:03:49 +08008134 {0x1a, 0x04a11020}),
Hui Wange8818fa2014-09-03 11:31:04 +08008135 SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02008136 ALC292_STANDARD_PINS,
Hui Wange8818fa2014-09-03 11:31:04 +08008137 {0x12, 0x90a60140},
Hui Wange8818fa2014-09-03 11:31:04 +08008138 {0x16, 0x01014020},
Hui Wang11580292015-08-03 11:03:49 +08008139 {0x19, 0x01a19030}),
Hui Wange8818fa2014-09-03 11:31:04 +08008140 SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02008141 ALC292_STANDARD_PINS,
Hui Wange8818fa2014-09-03 11:31:04 +08008142 {0x12, 0x90a60140},
Hui Wange8818fa2014-09-03 11:31:04 +08008143 {0x16, 0x01014020},
8144 {0x18, 0x02a19031},
Hui Wang11580292015-08-03 11:03:49 +08008145 {0x19, 0x01a1903e}),
David Henningsson76c21322014-06-24 14:46:54 +02008146 SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02008147 ALC292_STANDARD_PINS,
Hui Wang11580292015-08-03 11:03:49 +08008148 {0x12, 0x90a60140}),
David Henningsson76c21322014-06-24 14:46:54 +02008149 SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02008150 ALC292_STANDARD_PINS,
David Henningsson76c21322014-06-24 14:46:54 +02008151 {0x13, 0x90a60140},
David Henningsson76c21322014-06-24 14:46:54 +02008152 {0x16, 0x21014020},
Hui Wang11580292015-08-03 11:03:49 +08008153 {0x19, 0x21a19030}),
David Henningssone03fdbd2014-06-27 08:41:59 +02008154 SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02008155 ALC292_STANDARD_PINS,
Hui Wang11580292015-08-03 11:03:49 +08008156 {0x13, 0x90a60140}),
Chris Chiud8ae4582018-12-07 17:17:11 +08008157 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_MIC,
8158 {0x14, 0x90170110},
8159 {0x1b, 0x90a70130},
8160 {0x21, 0x04211020}),
Jian-Hong Pan0bea4cc2018-12-07 17:17:13 +08008161 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
8162 {0x12, 0x90a60130},
8163 {0x17, 0x90170110},
Jian-Hong Pan8bb37a22019-02-21 17:00:18 +08008164 {0x21, 0x03211020}),
8165 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
8166 {0x12, 0x90a60130},
8167 {0x17, 0x90170110},
Jian-Hong Pan0bea4cc2018-12-07 17:17:13 +08008168 {0x21, 0x04211020}),
Takashi Iwai3887c262019-04-30 15:10:01 +02008169 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
8170 {0x12, 0x90a60130},
8171 {0x17, 0x90170110},
8172 {0x21, 0x03211020}),
Chris Chiu9e433422020-05-12 14:15:24 +08008173 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
Jian-Hong Panad97d662020-05-12 14:15:26 +08008174 {0x12, 0x90a60120},
8175 {0x17, 0x90170110},
8176 {0x21, 0x04211030}),
8177 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
Chris Chiu9e433422020-05-12 14:15:24 +08008178 {0x12, 0x90a60130},
8179 {0x17, 0x90170110},
8180 {0x21, 0x03211020}),
8181 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
8182 {0x12, 0x90a60130},
8183 {0x17, 0x90170110},
8184 {0x21, 0x03211020}),
Kailang Yangfbc57122019-07-15 10:41:50 +08008185 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
Kailang Yang0a29c572019-04-24 16:34:25 +08008186 {0x14, 0x90170110},
8187 {0x21, 0x04211020}),
Kailang Yangfbc57122019-07-15 10:41:50 +08008188 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
8189 {0x14, 0x90170110},
8190 {0x21, 0x04211030}),
Hui Wang3f6409702016-09-11 11:26:16 +08008191 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wangf771d5b2016-10-18 10:59:09 +08008192 ALC295_STANDARD_PINS,
8193 {0x17, 0x21014020},
8194 {0x18, 0x21a19030}),
8195 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
8196 ALC295_STANDARD_PINS,
8197 {0x17, 0x21014040},
8198 {0x18, 0x21a19050}),
Hui Wang3f307832017-03-23 10:00:25 +08008199 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
8200 ALC295_STANDARD_PINS),
Kailang Yang977e6272015-05-18 15:31:20 +08008201 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
Woodrow Shen703867e2015-08-05 12:34:12 +08008202 ALC298_STANDARD_PINS,
Takashi Iwai9f502ff2015-08-05 12:09:45 +02008203 {0x17, 0x90170110}),
8204 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
8205 ALC298_STANDARD_PINS,
Woodrow Shen703867e2015-08-05 12:34:12 +08008206 {0x17, 0x90170140}),
8207 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
8208 ALC298_STANDARD_PINS,
Takashi Iwai9f502ff2015-08-05 12:09:45 +02008209 {0x17, 0x90170150}),
Kai-Heng Feng9f1bc2c42017-02-16 15:26:54 +08008210 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_SPK_VOLUME,
8211 {0x12, 0xb7a60140},
8212 {0x13, 0xb7a60150},
8213 {0x17, 0x90170110},
8214 {0x1a, 0x03011020},
8215 {0x21, 0x03211030}),
James McDonnell54324222019-09-16 14:53:38 +00008216 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
8217 {0x12, 0xb7a60140},
8218 {0x17, 0x90170110},
8219 {0x1a, 0x03a11030},
8220 {0x21, 0x03211020}),
Kailang Yangfcc6c872017-06-29 15:21:27 +08008221 SND_HDA_PIN_QUIRK(0x10ec0299, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
8222 ALC225_STANDARD_PINS,
8223 {0x12, 0xb7a60130},
Kailang Yangfcc6c872017-06-29 15:21:27 +08008224 {0x17, 0x90170110}),
Hui Wang573fcbf2020-06-08 19:55:41 +08008225 SND_HDA_PIN_QUIRK(0x10ec0623, 0x17aa, "Lenovo", ALC283_FIXUP_HEADSET_MIC,
8226 {0x14, 0x01014010},
8227 {0x17, 0x90170120},
8228 {0x18, 0x02a11030},
8229 {0x19, 0x02a1103f},
8230 {0x21, 0x0221101f}),
Hui Wange1918932014-05-26 16:22:44 +08008231 {}
8232};
Takashi Iwai1d045db2011-07-07 18:23:21 +02008233
Hui Wang7c0a6932019-08-16 14:27:40 +08008234/* This is the fallback pin_fixup_tbl for alc269 family, to make the tbl match
8235 * more machines, don't need to match all valid pins, just need to match
8236 * all the pins defined in the tbl. Just because of this reason, it is possible
8237 * that a single machine matches multiple tbls, so there is one limitation:
8238 * at most one tbl is allowed to define for the same vendor and same codec
8239 */
8240static const struct snd_hda_pin_quirk alc269_fallback_pin_fixup_tbl[] = {
8241 SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
8242 {0x19, 0x40000000},
8243 {0x1b, 0x40000000}),
Hui Wangaed8c7f2019-11-21 10:26:43 +08008244 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8245 {0x19, 0x40000000},
8246 {0x1a, 0x40000000}),
Hui Wangd64ebdb2019-11-21 10:26:44 +08008247 SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8248 {0x19, 0x40000000},
8249 {0x1a, 0x40000000}),
Hui Wang5815bdf2019-12-11 13:13:21 +08008250 SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
8251 {0x19, 0x40000000},
8252 {0x1a, 0x40000000}),
Hui Wang7c0a6932019-08-16 14:27:40 +08008253 {}
8254};
8255
Takashi Iwai546bb672012-03-07 08:37:19 +01008256static void alc269_fill_coef(struct hda_codec *codec)
Takashi Iwai1d045db2011-07-07 18:23:21 +02008257{
Kailang Yang526af6e2012-03-07 08:25:20 +01008258 struct alc_spec *spec = codec->spec;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008259 int val;
8260
Kailang Yang526af6e2012-03-07 08:25:20 +01008261 if (spec->codec_variant != ALC269_TYPE_ALC269VB)
Takashi Iwai546bb672012-03-07 08:37:19 +01008262 return;
Kailang Yang526af6e2012-03-07 08:25:20 +01008263
Takashi Iwai1bb7e432011-10-17 16:50:59 +02008264 if ((alc_get_coef0(codec) & 0x00ff) < 0x015) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02008265 alc_write_coef_idx(codec, 0xf, 0x960b);
8266 alc_write_coef_idx(codec, 0xe, 0x8817);
8267 }
8268
Takashi Iwai1bb7e432011-10-17 16:50:59 +02008269 if ((alc_get_coef0(codec) & 0x00ff) == 0x016) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02008270 alc_write_coef_idx(codec, 0xf, 0x960b);
8271 alc_write_coef_idx(codec, 0xe, 0x8814);
8272 }
8273
Takashi Iwai1bb7e432011-10-17 16:50:59 +02008274 if ((alc_get_coef0(codec) & 0x00ff) == 0x017) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02008275 /* Power up output pin */
Takashi Iwai98b24882014-08-18 13:47:50 +02008276 alc_update_coef_idx(codec, 0x04, 0, 1<<11);
Takashi Iwai1d045db2011-07-07 18:23:21 +02008277 }
8278
Takashi Iwai1bb7e432011-10-17 16:50:59 +02008279 if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02008280 val = alc_read_coef_idx(codec, 0xd);
Takashi Iwaif3ee07d2014-08-15 17:35:00 +02008281 if (val != -1 && (val & 0x0c00) >> 10 != 0x1) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02008282 /* Capless ramp up clock control */
8283 alc_write_coef_idx(codec, 0xd, val | (1<<10));
8284 }
8285 val = alc_read_coef_idx(codec, 0x17);
Takashi Iwaif3ee07d2014-08-15 17:35:00 +02008286 if (val != -1 && (val & 0x01c0) >> 6 != 0x4) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02008287 /* Class D power on reset */
8288 alc_write_coef_idx(codec, 0x17, val | (1<<7));
8289 }
8290 }
8291
Takashi Iwai98b24882014-08-18 13:47:50 +02008292 /* HP */
8293 alc_update_coef_idx(codec, 0x4, 0, 1<<11);
Takashi Iwai1d045db2011-07-07 18:23:21 +02008294}
8295
8296/*
8297 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02008298static int patch_alc269(struct hda_codec *codec)
8299{
8300 struct alc_spec *spec;
Takashi Iwai3de95172012-05-07 18:03:15 +02008301 int err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008302
Takashi Iwai3de95172012-05-07 18:03:15 +02008303 err = alc_alloc_spec(codec, 0x0b);
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008304 if (err < 0)
Takashi Iwai3de95172012-05-07 18:03:15 +02008305 return err;
8306
8307 spec = codec->spec;
Takashi Iwai08c189f2012-12-19 15:22:24 +01008308 spec->gen.shared_mic_vref_pin = 0x18;
Kailang Yang317d9312019-05-23 14:43:04 +08008309 codec->power_save_node = 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008310
Takashi Iwai225068a2015-05-29 10:42:14 +02008311#ifdef CONFIG_PM
8312 codec->patch_ops.suspend = alc269_suspend;
8313 codec->patch_ops.resume = alc269_resume;
8314#endif
Kailang Yangc2d6af52017-06-21 14:50:54 +08008315 spec->shutup = alc_default_shutup;
8316 spec->init_hook = alc_default_init;
Takashi Iwai225068a2015-05-29 10:42:14 +02008317
Takashi Iwai7639a062015-03-03 10:07:24 +01008318 switch (codec->core.vendor_id) {
Kailang Yang065380f2013-01-10 10:25:48 +01008319 case 0x10ec0269:
Takashi Iwai1d045db2011-07-07 18:23:21 +02008320 spec->codec_variant = ALC269_TYPE_ALC269VA;
Takashi Iwai1bb7e432011-10-17 16:50:59 +02008321 switch (alc_get_coef0(codec) & 0x00f0) {
8322 case 0x0010:
Takashi Iwai5100cd02014-02-15 10:03:19 +01008323 if (codec->bus->pci &&
8324 codec->bus->pci->subsystem_vendor == 0x1025 &&
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008325 spec->cdefine.platform_type == 1)
Takashi Iwai20ca0c32011-10-17 16:00:35 +02008326 err = alc_codec_rename(codec, "ALC271X");
Takashi Iwai1d045db2011-07-07 18:23:21 +02008327 spec->codec_variant = ALC269_TYPE_ALC269VB;
Takashi Iwai1bb7e432011-10-17 16:50:59 +02008328 break;
8329 case 0x0020:
Takashi Iwai5100cd02014-02-15 10:03:19 +01008330 if (codec->bus->pci &&
8331 codec->bus->pci->subsystem_vendor == 0x17aa &&
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008332 codec->bus->pci->subsystem_device == 0x21f3)
Takashi Iwai20ca0c32011-10-17 16:00:35 +02008333 err = alc_codec_rename(codec, "ALC3202");
Takashi Iwai1d045db2011-07-07 18:23:21 +02008334 spec->codec_variant = ALC269_TYPE_ALC269VC;
Takashi Iwai1bb7e432011-10-17 16:50:59 +02008335 break;
Kailang Yangadcc70b2012-05-25 08:08:38 +02008336 case 0x0030:
8337 spec->codec_variant = ALC269_TYPE_ALC269VD;
8338 break;
Takashi Iwai1bb7e432011-10-17 16:50:59 +02008339 default:
Takashi Iwai1d045db2011-07-07 18:23:21 +02008340 alc_fix_pll_init(codec, 0x20, 0x04, 15);
Takashi Iwai1bb7e432011-10-17 16:50:59 +02008341 }
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008342 if (err < 0)
8343 goto error;
Kailang Yangc2d6af52017-06-21 14:50:54 +08008344 spec->shutup = alc269_shutup;
Takashi Iwai546bb672012-03-07 08:37:19 +01008345 spec->init_hook = alc269_fill_coef;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008346 alc269_fill_coef(codec);
Kailang Yang065380f2013-01-10 10:25:48 +01008347 break;
8348
8349 case 0x10ec0280:
8350 case 0x10ec0290:
8351 spec->codec_variant = ALC269_TYPE_ALC280;
8352 break;
8353 case 0x10ec0282:
Kailang Yang065380f2013-01-10 10:25:48 +01008354 spec->codec_variant = ALC269_TYPE_ALC282;
Kailang Yang7b5c7a02014-03-18 16:15:54 +08008355 spec->shutup = alc282_shutup;
8356 spec->init_hook = alc282_init;
Kailang Yang065380f2013-01-10 10:25:48 +01008357 break;
Kailang Yang2af02be2013-08-22 10:03:50 +02008358 case 0x10ec0233:
8359 case 0x10ec0283:
8360 spec->codec_variant = ALC269_TYPE_ALC283;
8361 spec->shutup = alc283_shutup;
8362 spec->init_hook = alc283_init;
8363 break;
Kailang Yang065380f2013-01-10 10:25:48 +01008364 case 0x10ec0284:
8365 case 0x10ec0292:
8366 spec->codec_variant = ALC269_TYPE_ALC284;
8367 break;
Kailang Yang161ebf22013-10-24 11:36:33 +02008368 case 0x10ec0293:
Kailang Yang4731d5d2017-06-30 15:22:57 +08008369 spec->codec_variant = ALC269_TYPE_ALC293;
Kailang Yang161ebf22013-10-24 11:36:33 +02008370 break;
Kailang Yang7fc7d042013-04-25 11:04:43 +02008371 case 0x10ec0286:
Kailang Yang7c665932014-04-14 15:09:44 +08008372 case 0x10ec0288:
Kailang Yang7fc7d042013-04-25 11:04:43 +02008373 spec->codec_variant = ALC269_TYPE_ALC286;
8374 break;
Kailang Yang506b62c2014-12-18 17:07:44 +08008375 case 0x10ec0298:
8376 spec->codec_variant = ALC269_TYPE_ALC298;
8377 break;
Kailang Yangea04a1d2018-04-25 15:31:52 +08008378 case 0x10ec0235:
Kailang Yang1d04c9d2013-10-24 11:35:18 +02008379 case 0x10ec0255:
8380 spec->codec_variant = ALC269_TYPE_ALC255;
Kailang Yangab3b8e52018-04-25 16:05:27 +08008381 spec->shutup = alc256_shutup;
8382 spec->init_hook = alc256_init;
Kailang Yang1d04c9d2013-10-24 11:35:18 +02008383 break;
Kailang Yang736f20a2017-10-20 15:06:34 +08008384 case 0x10ec0236:
Kailang Yang4344aec2014-12-17 17:39:05 +08008385 case 0x10ec0256:
8386 spec->codec_variant = ALC269_TYPE_ALC256;
Kailang Yang4a219ef2017-06-16 16:54:35 +08008387 spec->shutup = alc256_shutup;
8388 spec->init_hook = alc256_init;
David Henningsson7d1b6e22015-04-21 10:48:46 +02008389 spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */
Kailang Yang4344aec2014-12-17 17:39:05 +08008390 break;
Kailang Yangf429e7e2017-12-05 15:38:24 +08008391 case 0x10ec0257:
8392 spec->codec_variant = ALC269_TYPE_ALC257;
Kailang Yang88d42b22018-03-14 16:08:57 +08008393 spec->shutup = alc256_shutup;
8394 spec->init_hook = alc256_init;
Kailang Yangf429e7e2017-12-05 15:38:24 +08008395 spec->gen.mixer_nid = 0;
8396 break;
Kailang Yang0a6f0602017-06-30 16:00:48 +08008397 case 0x10ec0215:
Kailang Yang7fbdcd82020-04-23 14:18:31 +08008398 case 0x10ec0245:
Kailang Yang0a6f0602017-06-30 16:00:48 +08008399 case 0x10ec0285:
Kailang Yang630e3612020-05-27 14:10:26 +08008400 case 0x10ec0287:
Kailang Yang0a6f0602017-06-30 16:00:48 +08008401 case 0x10ec0289:
8402 spec->codec_variant = ALC269_TYPE_ALC215;
Kailang Yang1b6832be2018-01-17 15:32:03 +08008403 spec->shutup = alc225_shutup;
8404 spec->init_hook = alc225_init;
Kailang Yang0a6f0602017-06-30 16:00:48 +08008405 spec->gen.mixer_nid = 0;
8406 break;
Kailang Yang42314302016-02-03 15:03:50 +08008407 case 0x10ec0225:
Kailang Yang7d727862016-05-24 16:46:07 +08008408 case 0x10ec0295:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08008409 case 0x10ec0299:
Kailang Yang42314302016-02-03 15:03:50 +08008410 spec->codec_variant = ALC269_TYPE_ALC225;
Kailang Yangda911b12018-01-05 16:50:08 +08008411 spec->shutup = alc225_shutup;
8412 spec->init_hook = alc225_init;
Takashi Iwaic1350bf2017-12-27 09:03:45 +01008413 spec->gen.mixer_nid = 0; /* no loopback on ALC225, ALC295 and ALC299 */
Kailang Yang42314302016-02-03 15:03:50 +08008414 break;
Kailang Yangdcd4f0d2016-05-04 15:50:18 +08008415 case 0x10ec0234:
8416 case 0x10ec0274:
8417 case 0x10ec0294:
8418 spec->codec_variant = ALC269_TYPE_ALC294;
Hui Wang532a7782017-06-26 12:30:32 +08008419 spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */
Kailang Yang71683c32017-06-20 16:33:50 +08008420 alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */
Kailang Yang693abe12019-01-29 15:38:21 +08008421 spec->init_hook = alc294_init;
Kailang Yangdcd4f0d2016-05-04 15:50:18 +08008422 break;
Kailang Yang1078bef2018-11-08 16:36:15 +08008423 case 0x10ec0300:
8424 spec->codec_variant = ALC269_TYPE_ALC300;
8425 spec->gen.mixer_nid = 0; /* no loopback on ALC300 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02008426 break;
Kailang Yangf0778872019-10-24 15:13:32 +08008427 case 0x10ec0623:
8428 spec->codec_variant = ALC269_TYPE_ALC623;
8429 break;
Kailang Yang6fbae352016-05-30 16:44:20 +08008430 case 0x10ec0700:
8431 case 0x10ec0701:
8432 case 0x10ec0703:
Kailang Yang836295322019-05-02 16:03:26 +08008433 case 0x10ec0711:
Kailang Yang6fbae352016-05-30 16:44:20 +08008434 spec->codec_variant = ALC269_TYPE_ALC700;
8435 spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */
Kailang Yang2d7fe612017-11-22 15:21:32 +08008436 alc_update_coef_idx(codec, 0x4a, 1 << 15, 0); /* Combo jack auto trigger control */
Kailang Yang693abe12019-01-29 15:38:21 +08008437 spec->init_hook = alc294_init;
Kailang Yang6fbae352016-05-30 16:44:20 +08008438 break;
8439
Takashi Iwai1d045db2011-07-07 18:23:21 +02008440 }
8441
Kailang Yangad60d502013-06-28 12:03:01 +02008442 if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) {
Kailang Yang97a26572013-11-29 00:35:26 -05008443 spec->has_alc5505_dsp = 1;
Kailang Yangad60d502013-06-28 12:03:01 +02008444 spec->init_hook = alc5505_dsp_init;
8445 }
8446
Takashi Iwaic9af7532019-05-10 11:01:43 +02008447 alc_pre_init(codec);
8448
Takashi Iwaiefe55732018-06-15 11:55:02 +02008449 snd_hda_pick_fixup(codec, alc269_fixup_models,
8450 alc269_fixup_tbl, alc269_fixups);
Hui Wang0fc1e442019-08-16 14:27:39 +08008451 snd_hda_pick_pin_fixup(codec, alc269_pin_fixup_tbl, alc269_fixups, true);
Hui Wang7c0a6932019-08-16 14:27:40 +08008452 snd_hda_pick_pin_fixup(codec, alc269_fallback_pin_fixup_tbl, alc269_fixups, false);
Takashi Iwaiefe55732018-06-15 11:55:02 +02008453 snd_hda_pick_fixup(codec, NULL, alc269_fixup_vendor_tbl,
8454 alc269_fixups);
8455 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
8456
8457 alc_auto_parse_customize_define(codec);
8458
8459 if (has_cdefine_beep(codec))
8460 spec->gen.beep_nid = 0x01;
8461
Takashi Iwaia4297b52011-08-23 18:40:12 +02008462 /* automatic parse from the BIOS config */
8463 err = alc269_parse_auto_config(codec);
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008464 if (err < 0)
8465 goto error;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008466
Takashi Iwaifea80fa2018-06-20 12:52:46 +02008467 if (!spec->gen.no_analog && spec->gen.beep_nid && spec->gen.mixer_nid) {
8468 err = set_beep_amp(spec, spec->gen.mixer_nid, 0x04, HDA_INPUT);
8469 if (err < 0)
8470 goto error;
8471 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02008472
Takashi Iwai1727a772013-01-10 09:52:52 +01008473 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01008474
Takashi Iwai1d045db2011-07-07 18:23:21 +02008475 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008476
8477 error:
8478 alc_free(codec);
8479 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008480}
8481
8482/*
8483 * ALC861
8484 */
8485
Takashi Iwai1d045db2011-07-07 18:23:21 +02008486static int alc861_parse_auto_config(struct hda_codec *codec)
8487{
Takashi Iwai1d045db2011-07-07 18:23:21 +02008488 static const hda_nid_t alc861_ignore[] = { 0x1d, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02008489 static const hda_nid_t alc861_ssids[] = { 0x0e, 0x0f, 0x0b, 0 };
8490 return alc_parse_auto_config(codec, alc861_ignore, alc861_ssids);
Takashi Iwai1d045db2011-07-07 18:23:21 +02008491}
8492
Takashi Iwai1d045db2011-07-07 18:23:21 +02008493/* Pin config fixes */
8494enum {
Takashi Iwaie652f4c2012-02-13 11:56:25 +01008495 ALC861_FIXUP_FSC_AMILO_PI1505,
8496 ALC861_FIXUP_AMP_VREF_0F,
8497 ALC861_FIXUP_NO_JACK_DETECT,
8498 ALC861_FIXUP_ASUS_A6RP,
Takashi Iwai6ddf0fd2013-11-29 12:47:34 +01008499 ALC660_FIXUP_ASUS_W7J,
Takashi Iwai1d045db2011-07-07 18:23:21 +02008500};
8501
Takashi Iwai31150f22012-01-30 10:54:08 +01008502/* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */
8503static void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01008504 const struct hda_fixup *fix, int action)
Takashi Iwai31150f22012-01-30 10:54:08 +01008505{
8506 struct alc_spec *spec = codec->spec;
8507 unsigned int val;
8508
Takashi Iwai1727a772013-01-10 09:52:52 +01008509 if (action != HDA_FIXUP_ACT_INIT)
Takashi Iwai31150f22012-01-30 10:54:08 +01008510 return;
Takashi Iwaid3f02d62013-01-10 10:12:22 +01008511 val = snd_hda_codec_get_pin_target(codec, 0x0f);
Takashi Iwai31150f22012-01-30 10:54:08 +01008512 if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)))
8513 val |= AC_PINCTL_IN_EN;
8514 val |= AC_PINCTL_VREF_50;
Takashi Iwaicdd03ce2012-04-20 12:34:50 +02008515 snd_hda_set_pin_ctl(codec, 0x0f, val);
Takashi Iwai08c189f2012-12-19 15:22:24 +01008516 spec->gen.keep_vref_in_automute = 1;
Takashi Iwai31150f22012-01-30 10:54:08 +01008517}
8518
Takashi Iwaie652f4c2012-02-13 11:56:25 +01008519/* suppress the jack-detection */
8520static void alc_fixup_no_jack_detect(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01008521 const struct hda_fixup *fix, int action)
Takashi Iwaie652f4c2012-02-13 11:56:25 +01008522{
Takashi Iwai1727a772013-01-10 09:52:52 +01008523 if (action == HDA_FIXUP_ACT_PRE_PROBE)
Takashi Iwaie652f4c2012-02-13 11:56:25 +01008524 codec->no_jack_detect = 1;
Jesper Juhl7d7eb9e2012-04-12 22:11:25 +02008525}
Takashi Iwaie652f4c2012-02-13 11:56:25 +01008526
Takashi Iwai1727a772013-01-10 09:52:52 +01008527static const struct hda_fixup alc861_fixups[] = {
Takashi Iwaie652f4c2012-02-13 11:56:25 +01008528 [ALC861_FIXUP_FSC_AMILO_PI1505] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008529 .type = HDA_FIXUP_PINS,
8530 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02008531 { 0x0b, 0x0221101f }, /* HP */
8532 { 0x0f, 0x90170310 }, /* speaker */
8533 { }
8534 }
8535 },
Takashi Iwaie652f4c2012-02-13 11:56:25 +01008536 [ALC861_FIXUP_AMP_VREF_0F] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008537 .type = HDA_FIXUP_FUNC,
Takashi Iwai31150f22012-01-30 10:54:08 +01008538 .v.func = alc861_fixup_asus_amp_vref_0f,
Takashi Iwai3b25eb62012-01-25 09:55:46 +01008539 },
Takashi Iwaie652f4c2012-02-13 11:56:25 +01008540 [ALC861_FIXUP_NO_JACK_DETECT] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008541 .type = HDA_FIXUP_FUNC,
Takashi Iwaie652f4c2012-02-13 11:56:25 +01008542 .v.func = alc_fixup_no_jack_detect,
8543 },
8544 [ALC861_FIXUP_ASUS_A6RP] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008545 .type = HDA_FIXUP_FUNC,
Takashi Iwaie652f4c2012-02-13 11:56:25 +01008546 .v.func = alc861_fixup_asus_amp_vref_0f,
8547 .chained = true,
8548 .chain_id = ALC861_FIXUP_NO_JACK_DETECT,
Takashi Iwai6ddf0fd2013-11-29 12:47:34 +01008549 },
8550 [ALC660_FIXUP_ASUS_W7J] = {
8551 .type = HDA_FIXUP_VERBS,
8552 .v.verbs = (const struct hda_verb[]) {
8553 /* ASUS W7J needs a magic pin setup on unused NID 0x10
8554 * for enabling outputs
8555 */
8556 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
8557 { }
8558 },
Takashi Iwaie652f4c2012-02-13 11:56:25 +01008559 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02008560};
8561
8562static const struct snd_pci_quirk alc861_fixup_tbl[] = {
Takashi Iwai6ddf0fd2013-11-29 12:47:34 +01008563 SND_PCI_QUIRK(0x1043, 0x1253, "ASUS W7J", ALC660_FIXUP_ASUS_W7J),
Takashi Iwaie7ca2372013-12-02 15:27:19 +01008564 SND_PCI_QUIRK(0x1043, 0x1263, "ASUS Z35HL", ALC660_FIXUP_ASUS_W7J),
Takashi Iwaie652f4c2012-02-13 11:56:25 +01008565 SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP),
8566 SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", ALC861_FIXUP_AMP_VREF_0F),
8567 SND_PCI_QUIRK(0x1462, 0x7254, "HP DX2200", ALC861_FIXUP_NO_JACK_DETECT),
8568 SND_PCI_QUIRK(0x1584, 0x2b01, "Haier W18", ALC861_FIXUP_AMP_VREF_0F),
8569 SND_PCI_QUIRK(0x1584, 0x0000, "Uniwill ECS M31EI", ALC861_FIXUP_AMP_VREF_0F),
8570 SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", ALC861_FIXUP_FSC_AMILO_PI1505),
Takashi Iwai1d045db2011-07-07 18:23:21 +02008571 {}
8572};
8573
8574/*
8575 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02008576static int patch_alc861(struct hda_codec *codec)
8577{
8578 struct alc_spec *spec;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008579 int err;
8580
Takashi Iwai3de95172012-05-07 18:03:15 +02008581 err = alc_alloc_spec(codec, 0x15);
8582 if (err < 0)
8583 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008584
Takashi Iwai3de95172012-05-07 18:03:15 +02008585 spec = codec->spec;
Takashi Iwai2722b532019-08-22 09:55:37 +02008586 if (has_cdefine_beep(codec))
8587 spec->gen.beep_nid = 0x23;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008588
Takashi Iwai225068a2015-05-29 10:42:14 +02008589#ifdef CONFIG_PM
8590 spec->power_hook = alc_power_eapd;
8591#endif
8592
Takashi Iwaic9af7532019-05-10 11:01:43 +02008593 alc_pre_init(codec);
8594
Takashi Iwai1727a772013-01-10 09:52:52 +01008595 snd_hda_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);
8596 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai1d045db2011-07-07 18:23:21 +02008597
Takashi Iwaicb4e4822011-08-23 17:34:25 +02008598 /* automatic parse from the BIOS config */
8599 err = alc861_parse_auto_config(codec);
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008600 if (err < 0)
8601 goto error;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008602
Takashi Iwaifea80fa2018-06-20 12:52:46 +02008603 if (!spec->gen.no_analog) {
8604 err = set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
8605 if (err < 0)
8606 goto error;
8607 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02008608
Takashi Iwai1727a772013-01-10 09:52:52 +01008609 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01008610
Takashi Iwai1d045db2011-07-07 18:23:21 +02008611 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008612
8613 error:
8614 alc_free(codec);
8615 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008616}
8617
8618/*
8619 * ALC861-VD support
8620 *
8621 * Based on ALC882
8622 *
8623 * In addition, an independent DAC
8624 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02008625static int alc861vd_parse_auto_config(struct hda_codec *codec)
8626{
Takashi Iwai1d045db2011-07-07 18:23:21 +02008627 static const hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02008628 static const hda_nid_t alc861vd_ssids[] = { 0x15, 0x1b, 0x14, 0 };
8629 return alc_parse_auto_config(codec, alc861vd_ignore, alc861vd_ssids);
Takashi Iwai1d045db2011-07-07 18:23:21 +02008630}
8631
Takashi Iwai1d045db2011-07-07 18:23:21 +02008632enum {
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02008633 ALC660VD_FIX_ASUS_GPIO1,
8634 ALC861VD_FIX_DALLAS,
Takashi Iwai1d045db2011-07-07 18:23:21 +02008635};
8636
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02008637/* exclude VREF80 */
8638static void alc861vd_fixup_dallas(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01008639 const struct hda_fixup *fix, int action)
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02008640{
Takashi Iwai1727a772013-01-10 09:52:52 +01008641 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwaib78562b2012-12-17 20:06:49 +01008642 snd_hda_override_pin_caps(codec, 0x18, 0x00000734);
8643 snd_hda_override_pin_caps(codec, 0x19, 0x0000073c);
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02008644 }
8645}
8646
Takashi Iwaidf73d832018-06-19 23:05:47 +02008647/* reset GPIO1 */
8648static void alc660vd_fixup_asus_gpio1(struct hda_codec *codec,
8649 const struct hda_fixup *fix, int action)
8650{
8651 struct alc_spec *spec = codec->spec;
8652
8653 if (action == HDA_FIXUP_ACT_PRE_PROBE)
8654 spec->gpio_mask |= 0x02;
8655 alc_fixup_gpio(codec, action, 0x01);
8656}
8657
Takashi Iwai1727a772013-01-10 09:52:52 +01008658static const struct hda_fixup alc861vd_fixups[] = {
Takashi Iwai1d045db2011-07-07 18:23:21 +02008659 [ALC660VD_FIX_ASUS_GPIO1] = {
Takashi Iwaidf73d832018-06-19 23:05:47 +02008660 .type = HDA_FIXUP_FUNC,
8661 .v.func = alc660vd_fixup_asus_gpio1,
Takashi Iwai1d045db2011-07-07 18:23:21 +02008662 },
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02008663 [ALC861VD_FIX_DALLAS] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008664 .type = HDA_FIXUP_FUNC,
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02008665 .v.func = alc861vd_fixup_dallas,
8666 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02008667};
8668
8669static const struct snd_pci_quirk alc861vd_fixup_tbl[] = {
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02008670 SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_FIX_DALLAS),
Takashi Iwai1d045db2011-07-07 18:23:21 +02008671 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02008672 SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_FIX_DALLAS),
Takashi Iwai1d045db2011-07-07 18:23:21 +02008673 {}
8674};
8675
Takashi Iwai1d045db2011-07-07 18:23:21 +02008676/*
8677 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02008678static int patch_alc861vd(struct hda_codec *codec)
8679{
8680 struct alc_spec *spec;
Takashi Iwaicb4e4822011-08-23 17:34:25 +02008681 int err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008682
Takashi Iwai3de95172012-05-07 18:03:15 +02008683 err = alc_alloc_spec(codec, 0x0b);
8684 if (err < 0)
8685 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008686
Takashi Iwai3de95172012-05-07 18:03:15 +02008687 spec = codec->spec;
Takashi Iwai2722b532019-08-22 09:55:37 +02008688 if (has_cdefine_beep(codec))
8689 spec->gen.beep_nid = 0x23;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008690
Takashi Iwai225068a2015-05-29 10:42:14 +02008691 spec->shutup = alc_eapd_shutup;
8692
Takashi Iwaic9af7532019-05-10 11:01:43 +02008693 alc_pre_init(codec);
8694
Takashi Iwai1727a772013-01-10 09:52:52 +01008695 snd_hda_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);
8696 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai1d045db2011-07-07 18:23:21 +02008697
Takashi Iwaicb4e4822011-08-23 17:34:25 +02008698 /* automatic parse from the BIOS config */
8699 err = alc861vd_parse_auto_config(codec);
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008700 if (err < 0)
8701 goto error;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008702
Takashi Iwaifea80fa2018-06-20 12:52:46 +02008703 if (!spec->gen.no_analog) {
8704 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
8705 if (err < 0)
8706 goto error;
8707 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02008708
Takashi Iwai1727a772013-01-10 09:52:52 +01008709 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01008710
Takashi Iwai1d045db2011-07-07 18:23:21 +02008711 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008712
8713 error:
8714 alc_free(codec);
8715 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008716}
8717
8718/*
8719 * ALC662 support
8720 *
8721 * ALC662 is almost identical with ALC880 but has cleaner and more flexible
8722 * configuration. Each pin widget can choose any input DACs and a mixer.
8723 * Each ADC is connected from a mixer of all inputs. This makes possible
8724 * 6-channel independent captures.
8725 *
8726 * In addition, an independent DAC for the multi-playback (not used in this
8727 * driver yet).
8728 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02008729
8730/*
8731 * BIOS auto configuration
8732 */
8733
Kailang Yangbc9f98a2007-04-12 13:06:07 +02008734static int alc662_parse_auto_config(struct hda_codec *codec)
8735{
Takashi Iwai4c6d72d2011-05-02 11:30:18 +02008736 static const hda_nid_t alc662_ignore[] = { 0x1d, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02008737 static const hda_nid_t alc663_ssids[] = { 0x15, 0x1b, 0x14, 0x21 };
8738 static const hda_nid_t alc662_ssids[] = { 0x15, 0x1b, 0x14, 0 };
8739 const hda_nid_t *ssids;
Takashi Iwaiee979a142008-09-02 15:42:20 +02008740
Takashi Iwai7639a062015-03-03 10:07:24 +01008741 if (codec->core.vendor_id == 0x10ec0272 || codec->core.vendor_id == 0x10ec0663 ||
8742 codec->core.vendor_id == 0x10ec0665 || codec->core.vendor_id == 0x10ec0670 ||
8743 codec->core.vendor_id == 0x10ec0671)
Takashi Iwai3e6179b2011-07-08 16:55:13 +02008744 ssids = alc663_ssids;
Kailang Yang6227cdc2010-02-25 08:36:52 +01008745 else
Takashi Iwai3e6179b2011-07-08 16:55:13 +02008746 ssids = alc662_ssids;
8747 return alc_parse_auto_config(codec, alc662_ignore, ssids);
Kailang Yangbc9f98a2007-04-12 13:06:07 +02008748}
8749
Todd Broch6be79482010-12-07 16:51:05 -08008750static void alc272_fixup_mario(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01008751 const struct hda_fixup *fix, int action)
Takashi Iwai6fc398c2011-01-13 14:36:37 +01008752{
Takashi Iwai9bb1f062013-01-10 17:14:29 +01008753 if (action != HDA_FIXUP_ACT_PRE_PROBE)
Takashi Iwai6fc398c2011-01-13 14:36:37 +01008754 return;
Todd Broch6be79482010-12-07 16:51:05 -08008755 if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
8756 (0x3b << AC_AMPCAP_OFFSET_SHIFT) |
8757 (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |
8758 (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |
8759 (0 << AC_AMPCAP_MUTE_SHIFT)))
Takashi Iwai4e76a882014-02-25 12:21:03 +01008760 codec_warn(codec, "failed to override amp caps for NID 0x2\n");
Todd Broch6be79482010-12-07 16:51:05 -08008761}
8762
Takashi Iwai8e383952013-10-30 17:41:12 +01008763static const struct snd_pcm_chmap_elem asus_pcm_2_1_chmaps[] = {
8764 { .channels = 2,
8765 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
8766 { .channels = 4,
8767 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
8768 SNDRV_CHMAP_NA, SNDRV_CHMAP_LFE } }, /* LFE only on right */
8769 { }
8770};
8771
8772/* override the 2.1 chmap */
Takashi Iwaieb9ca3a2013-11-28 15:24:34 +01008773static void alc_fixup_bass_chmap(struct hda_codec *codec,
Takashi Iwai8e383952013-10-30 17:41:12 +01008774 const struct hda_fixup *fix, int action)
8775{
8776 if (action == HDA_FIXUP_ACT_BUILD) {
8777 struct alc_spec *spec = codec->spec;
Takashi Iwaibbbc7e82015-02-27 17:43:19 +01008778 spec->gen.pcm_rec[0]->stream[0].chmap = asus_pcm_2_1_chmaps;
Takashi Iwai8e383952013-10-30 17:41:12 +01008779 }
8780}
8781
Takashi Iwaibf686652014-01-13 16:18:25 +01008782/* avoid D3 for keeping GPIO up */
8783static unsigned int gpio_led_power_filter(struct hda_codec *codec,
8784 hda_nid_t nid,
8785 unsigned int power_state)
8786{
8787 struct alc_spec *spec = codec->spec;
Takashi Iwaid261eec2018-06-19 22:32:29 +02008788 if (nid == codec->core.afg && power_state == AC_PWRST_D3 && spec->gpio_data)
Takashi Iwaibf686652014-01-13 16:18:25 +01008789 return AC_PWRST_D0;
8790 return power_state;
8791}
8792
Takashi Iwai3e887f32014-01-10 17:50:58 +01008793static void alc662_fixup_led_gpio1(struct hda_codec *codec,
8794 const struct hda_fixup *fix, int action)
8795{
8796 struct alc_spec *spec = codec->spec;
Takashi Iwai3e887f32014-01-10 17:50:58 +01008797
Takashi Iwai01e4a272018-06-19 22:47:30 +02008798 alc_fixup_hp_gpio_led(codec, action, 0x01, 0);
Takashi Iwai3e887f32014-01-10 17:50:58 +01008799 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai0f32fd192014-11-19 12:16:14 +01008800 spec->mute_led_polarity = 1;
Takashi Iwaibf686652014-01-13 16:18:25 +01008801 codec->power_filter = gpio_led_power_filter;
Takashi Iwai3e887f32014-01-10 17:50:58 +01008802 }
8803}
8804
Kailang Yangc6790c82016-11-25 16:15:17 +08008805static void alc662_usi_automute_hook(struct hda_codec *codec,
8806 struct hda_jack_callback *jack)
8807{
8808 struct alc_spec *spec = codec->spec;
8809 int vref;
8810 msleep(200);
8811 snd_hda_gen_hp_automute(codec, jack);
8812
8813 vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
8814 msleep(100);
8815 snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
8816 vref);
8817}
8818
8819static void alc662_fixup_usi_headset_mic(struct hda_codec *codec,
8820 const struct hda_fixup *fix, int action)
8821{
8822 struct alc_spec *spec = codec->spec;
8823 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
8824 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
8825 spec->gen.hp_automute_hook = alc662_usi_automute_hook;
8826 }
8827}
8828
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02008829static void alc662_aspire_ethos_mute_speakers(struct hda_codec *codec,
8830 struct hda_jack_callback *cb)
8831{
8832 /* surround speakers at 0x1b already get muted automatically when
8833 * headphones are plugged in, but we have to mute/unmute the remaining
8834 * channels manually:
8835 * 0x15 - front left/front right
8836 * 0x18 - front center/ LFE
8837 */
8838 if (snd_hda_jack_detect_state(codec, 0x1b) == HDA_JACK_PRESENT) {
8839 snd_hda_set_pin_ctl_cache(codec, 0x15, 0);
8840 snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
8841 } else {
8842 snd_hda_set_pin_ctl_cache(codec, 0x15, PIN_OUT);
8843 snd_hda_set_pin_ctl_cache(codec, 0x18, PIN_OUT);
8844 }
8845}
8846
8847static void alc662_fixup_aspire_ethos_hp(struct hda_codec *codec,
8848 const struct hda_fixup *fix, int action)
8849{
8850 /* Pin 0x1b: shared headphones jack and surround speakers */
8851 if (!is_jack_detectable(codec, 0x1b))
8852 return;
8853
8854 switch (action) {
8855 case HDA_FIXUP_ACT_PRE_PROBE:
8856 snd_hda_jack_detect_enable_callback(codec, 0x1b,
8857 alc662_aspire_ethos_mute_speakers);
Takashi Iwai336820c2019-11-28 21:26:30 +01008858 /* subwoofer needs an extra GPIO setting to become audible */
8859 alc_setup_gpio(codec, 0x02);
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02008860 break;
8861 case HDA_FIXUP_ACT_INIT:
8862 /* Make sure to start in a correct state, i.e. if
8863 * headphones have been plugged in before powering up the system
8864 */
8865 alc662_aspire_ethos_mute_speakers(codec, NULL);
8866 break;
8867 }
8868}
8869
Kailang Yang5af290282020-01-17 14:04:01 +08008870static void alc671_fixup_hp_headset_mic2(struct hda_codec *codec,
8871 const struct hda_fixup *fix, int action)
8872{
8873 struct alc_spec *spec = codec->spec;
8874
8875 static const struct hda_pintbl pincfgs[] = {
8876 { 0x19, 0x02a11040 }, /* use as headset mic, with its own jack detect */
8877 { 0x1b, 0x0181304f },
8878 { }
8879 };
8880
8881 switch (action) {
8882 case HDA_FIXUP_ACT_PRE_PROBE:
8883 spec->gen.mixer_nid = 0;
8884 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
8885 snd_hda_apply_pincfgs(codec, pincfgs);
8886 break;
8887 case HDA_FIXUP_ACT_INIT:
8888 alc_write_coef_idx(codec, 0x19, 0xa054);
8889 break;
8890 }
8891}
8892
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01008893static const struct coef_fw alc668_coefs[] = {
Kailang Yangf3f91852014-10-24 15:43:46 +08008894 WRITE_COEF(0x01, 0xbebe), WRITE_COEF(0x02, 0xaaaa), WRITE_COEF(0x03, 0x0),
8895 WRITE_COEF(0x04, 0x0180), WRITE_COEF(0x06, 0x0), WRITE_COEF(0x07, 0x0f80),
8896 WRITE_COEF(0x08, 0x0031), WRITE_COEF(0x0a, 0x0060), WRITE_COEF(0x0b, 0x0),
8897 WRITE_COEF(0x0c, 0x7cf7), WRITE_COEF(0x0d, 0x1080), WRITE_COEF(0x0e, 0x7f7f),
8898 WRITE_COEF(0x0f, 0xcccc), WRITE_COEF(0x10, 0xddcc), WRITE_COEF(0x11, 0x0001),
8899 WRITE_COEF(0x13, 0x0), WRITE_COEF(0x14, 0x2aa0), WRITE_COEF(0x17, 0xa940),
8900 WRITE_COEF(0x19, 0x0), WRITE_COEF(0x1a, 0x0), WRITE_COEF(0x1b, 0x0),
8901 WRITE_COEF(0x1c, 0x0), WRITE_COEF(0x1d, 0x0), WRITE_COEF(0x1e, 0x7418),
8902 WRITE_COEF(0x1f, 0x0804), WRITE_COEF(0x20, 0x4200), WRITE_COEF(0x21, 0x0468),
8903 WRITE_COEF(0x22, 0x8ccc), WRITE_COEF(0x23, 0x0250), WRITE_COEF(0x24, 0x7418),
8904 WRITE_COEF(0x27, 0x0), WRITE_COEF(0x28, 0x8ccc), WRITE_COEF(0x2a, 0xff00),
8905 WRITE_COEF(0x2b, 0x8000), WRITE_COEF(0xa7, 0xff00), WRITE_COEF(0xa8, 0x8000),
8906 WRITE_COEF(0xaa, 0x2e17), WRITE_COEF(0xab, 0xa0c0), WRITE_COEF(0xac, 0x0),
8907 WRITE_COEF(0xad, 0x0), WRITE_COEF(0xae, 0x2ac6), WRITE_COEF(0xaf, 0xa480),
8908 WRITE_COEF(0xb0, 0x0), WRITE_COEF(0xb1, 0x0), WRITE_COEF(0xb2, 0x0),
8909 WRITE_COEF(0xb3, 0x0), WRITE_COEF(0xb4, 0x0), WRITE_COEF(0xb5, 0x1040),
8910 WRITE_COEF(0xb6, 0xd697), WRITE_COEF(0xb7, 0x902b), WRITE_COEF(0xb8, 0xd697),
8911 WRITE_COEF(0xb9, 0x902b), WRITE_COEF(0xba, 0xb8ba), WRITE_COEF(0xbb, 0xaaab),
8912 WRITE_COEF(0xbc, 0xaaaf), WRITE_COEF(0xbd, 0x6aaa), WRITE_COEF(0xbe, 0x1c02),
8913 WRITE_COEF(0xc0, 0x00ff), WRITE_COEF(0xc1, 0x0fa6),
8914 {}
8915};
8916
8917static void alc668_restore_default_value(struct hda_codec *codec)
8918{
8919 alc_process_coef_fw(codec, alc668_coefs);
8920}
8921
David Henningsson6cb3b702010-09-09 08:51:44 +02008922enum {
Daniel T Chen2df03512010-10-10 22:39:28 -04008923 ALC662_FIXUP_ASPIRE,
Takashi Iwai3e887f32014-01-10 17:50:58 +01008924 ALC662_FIXUP_LED_GPIO1,
David Henningsson6cb3b702010-09-09 08:51:44 +02008925 ALC662_FIXUP_IDEAPAD,
Todd Broch6be79482010-12-07 16:51:05 -08008926 ALC272_FIXUP_MARIO,
Anisse Astierd2ebd472011-01-20 12:36:21 +01008927 ALC662_FIXUP_CZC_P10T,
David Henningsson94024cd2011-04-29 14:10:55 +02008928 ALC662_FIXUP_SKU_IGNORE,
Takashi Iwaie59ea3e2011-06-29 17:21:00 +02008929 ALC662_FIXUP_HP_RP5800,
Takashi Iwai53c334a2011-08-23 18:27:14 +02008930 ALC662_FIXUP_ASUS_MODE1,
8931 ALC662_FIXUP_ASUS_MODE2,
8932 ALC662_FIXUP_ASUS_MODE3,
8933 ALC662_FIXUP_ASUS_MODE4,
8934 ALC662_FIXUP_ASUS_MODE5,
8935 ALC662_FIXUP_ASUS_MODE6,
8936 ALC662_FIXUP_ASUS_MODE7,
8937 ALC662_FIXUP_ASUS_MODE8,
Takashi Iwai1565cc32012-02-13 12:03:25 +01008938 ALC662_FIXUP_NO_JACK_DETECT,
David Henningssonedfe3bf2012-06-12 13:15:12 +02008939 ALC662_FIXUP_ZOTAC_Z68,
Takashi Iwai125821a2012-06-22 14:30:29 +02008940 ALC662_FIXUP_INV_DMIC,
David Henningsson1f8b46c2015-05-12 14:38:15 +02008941 ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
David Henningsson73bdd592013-04-15 15:44:14 +02008942 ALC668_FIXUP_DELL_MIC_NO_PRESENCE,
David Henningsson1f8b46c2015-05-12 14:38:15 +02008943 ALC662_FIXUP_HEADSET_MODE,
David Henningsson73bdd592013-04-15 15:44:14 +02008944 ALC668_FIXUP_HEADSET_MODE,
David Henningsson8e54b4a2014-02-07 09:31:07 +01008945 ALC662_FIXUP_BASS_MODE4_CHMAP,
David Henningsson61a75f12014-02-07 09:31:08 +01008946 ALC662_FIXUP_BASS_16,
Takashi Iwaia30c9aa2013-11-21 08:00:20 +01008947 ALC662_FIXUP_BASS_1A,
David Henningsson8e54b4a2014-02-07 09:31:07 +01008948 ALC662_FIXUP_BASS_CHMAP,
Hui Wang493a52a2014-01-14 14:07:36 +08008949 ALC668_FIXUP_AUTO_MUTE,
Gabriele Mazzotta5e6db662014-05-20 18:58:26 +02008950 ALC668_FIXUP_DELL_DISABLE_AAMIX,
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +02008951 ALC668_FIXUP_DELL_XPS13,
Bobi Mihalca9d4dc582016-03-23 13:26:11 +02008952 ALC662_FIXUP_ASUS_Nx50,
Mikhail Paulyshkafc7438b2017-04-21 08:52:42 +02008953 ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
Yura Pakhuchiy3231e202016-05-07 23:53:36 +07008954 ALC668_FIXUP_ASUS_Nx51,
Takashi Iwai5b7c5e12018-10-09 14:20:17 +02008955 ALC668_FIXUP_MIC_COEF,
Takashi Iwai11ba6112018-10-07 09:44:17 +02008956 ALC668_FIXUP_ASUS_G751,
Kailang Yang78f4f7c2016-06-07 11:31:34 +08008957 ALC891_FIXUP_HEADSET_MODE,
8958 ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
Shrirang Bagul9b51fe32016-08-01 13:16:17 +08008959 ALC662_FIXUP_ACER_VERITON,
Takashi Iwai1a3f0992016-10-20 12:14:51 +02008960 ALC892_FIXUP_ASROCK_MOBO,
Kailang Yangc6790c82016-11-25 16:15:17 +08008961 ALC662_FIXUP_USI_FUNC,
8962 ALC662_FIXUP_USI_HEADSET_MODE,
Kailang Yangca169cc2017-04-25 16:17:40 +08008963 ALC662_FIXUP_LENOVO_MULTI_CODECS,
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02008964 ALC669_FIXUP_ACER_ASPIRE_ETHOS,
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02008965 ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET,
Kailang Yang5af290282020-01-17 14:04:01 +08008966 ALC671_FIXUP_HP_HEADSET_MIC2,
Jian-Hong Pand858c702020-03-17 16:28:07 +08008967 ALC662_FIXUP_ACER_X2660G_HEADSET_MODE,
Jian-Hong Pana1244582020-03-17 16:28:09 +08008968 ALC662_FIXUP_ACER_NITRO_HEADSET_MODE,
David Henningsson6cb3b702010-09-09 08:51:44 +02008969};
8970
Takashi Iwai1727a772013-01-10 09:52:52 +01008971static const struct hda_fixup alc662_fixups[] = {
Daniel T Chen2df03512010-10-10 22:39:28 -04008972 [ALC662_FIXUP_ASPIRE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008973 .type = HDA_FIXUP_PINS,
8974 .v.pins = (const struct hda_pintbl[]) {
Daniel T Chen2df03512010-10-10 22:39:28 -04008975 { 0x15, 0x99130112 }, /* subwoofer */
8976 { }
8977 }
8978 },
Takashi Iwai3e887f32014-01-10 17:50:58 +01008979 [ALC662_FIXUP_LED_GPIO1] = {
8980 .type = HDA_FIXUP_FUNC,
8981 .v.func = alc662_fixup_led_gpio1,
8982 },
David Henningsson6cb3b702010-09-09 08:51:44 +02008983 [ALC662_FIXUP_IDEAPAD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008984 .type = HDA_FIXUP_PINS,
8985 .v.pins = (const struct hda_pintbl[]) {
David Henningsson6cb3b702010-09-09 08:51:44 +02008986 { 0x17, 0x99130112 }, /* subwoofer */
8987 { }
Takashi Iwai3e887f32014-01-10 17:50:58 +01008988 },
8989 .chained = true,
8990 .chain_id = ALC662_FIXUP_LED_GPIO1,
David Henningsson6cb3b702010-09-09 08:51:44 +02008991 },
Todd Broch6be79482010-12-07 16:51:05 -08008992 [ALC272_FIXUP_MARIO] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008993 .type = HDA_FIXUP_FUNC,
Takashi Iwaib5bfbc62011-01-13 14:22:32 +01008994 .v.func = alc272_fixup_mario,
Anisse Astierd2ebd472011-01-20 12:36:21 +01008995 },
8996 [ALC662_FIXUP_CZC_P10T] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01008997 .type = HDA_FIXUP_VERBS,
Anisse Astierd2ebd472011-01-20 12:36:21 +01008998 .v.verbs = (const struct hda_verb[]) {
8999 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
9000 {}
9001 }
9002 },
David Henningsson94024cd2011-04-29 14:10:55 +02009003 [ALC662_FIXUP_SKU_IGNORE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009004 .type = HDA_FIXUP_FUNC,
Takashi Iwai23d30f22012-05-07 17:17:32 +02009005 .v.func = alc_fixup_sku_ignore,
Takashi Iwaic6b35872011-03-28 12:05:31 +02009006 },
Takashi Iwaie59ea3e2011-06-29 17:21:00 +02009007 [ALC662_FIXUP_HP_RP5800] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009008 .type = HDA_FIXUP_PINS,
9009 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaie59ea3e2011-06-29 17:21:00 +02009010 { 0x14, 0x0221201f }, /* HP out */
9011 { }
9012 },
9013 .chained = true,
9014 .chain_id = ALC662_FIXUP_SKU_IGNORE
9015 },
Takashi Iwai53c334a2011-08-23 18:27:14 +02009016 [ALC662_FIXUP_ASUS_MODE1] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009017 .type = HDA_FIXUP_PINS,
9018 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02009019 { 0x14, 0x99130110 }, /* speaker */
9020 { 0x18, 0x01a19c20 }, /* mic */
9021 { 0x19, 0x99a3092f }, /* int-mic */
9022 { 0x21, 0x0121401f }, /* HP out */
9023 { }
9024 },
9025 .chained = true,
9026 .chain_id = ALC662_FIXUP_SKU_IGNORE
9027 },
9028 [ALC662_FIXUP_ASUS_MODE2] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009029 .type = HDA_FIXUP_PINS,
9030 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai2996bdb2011-08-18 16:02:24 +02009031 { 0x14, 0x99130110 }, /* speaker */
9032 { 0x18, 0x01a19820 }, /* mic */
9033 { 0x19, 0x99a3092f }, /* int-mic */
9034 { 0x1b, 0x0121401f }, /* HP out */
9035 { }
9036 },
Takashi Iwai53c334a2011-08-23 18:27:14 +02009037 .chained = true,
9038 .chain_id = ALC662_FIXUP_SKU_IGNORE
9039 },
9040 [ALC662_FIXUP_ASUS_MODE3] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009041 .type = HDA_FIXUP_PINS,
9042 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02009043 { 0x14, 0x99130110 }, /* speaker */
9044 { 0x15, 0x0121441f }, /* HP */
9045 { 0x18, 0x01a19840 }, /* mic */
9046 { 0x19, 0x99a3094f }, /* int-mic */
9047 { 0x21, 0x01211420 }, /* HP2 */
9048 { }
9049 },
9050 .chained = true,
9051 .chain_id = ALC662_FIXUP_SKU_IGNORE
9052 },
9053 [ALC662_FIXUP_ASUS_MODE4] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009054 .type = HDA_FIXUP_PINS,
9055 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02009056 { 0x14, 0x99130110 }, /* speaker */
9057 { 0x16, 0x99130111 }, /* speaker */
9058 { 0x18, 0x01a19840 }, /* mic */
9059 { 0x19, 0x99a3094f }, /* int-mic */
9060 { 0x21, 0x0121441f }, /* HP */
9061 { }
9062 },
9063 .chained = true,
9064 .chain_id = ALC662_FIXUP_SKU_IGNORE
9065 },
9066 [ALC662_FIXUP_ASUS_MODE5] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009067 .type = HDA_FIXUP_PINS,
9068 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02009069 { 0x14, 0x99130110 }, /* speaker */
9070 { 0x15, 0x0121441f }, /* HP */
9071 { 0x16, 0x99130111 }, /* speaker */
9072 { 0x18, 0x01a19840 }, /* mic */
9073 { 0x19, 0x99a3094f }, /* int-mic */
9074 { }
9075 },
9076 .chained = true,
9077 .chain_id = ALC662_FIXUP_SKU_IGNORE
9078 },
9079 [ALC662_FIXUP_ASUS_MODE6] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009080 .type = HDA_FIXUP_PINS,
9081 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02009082 { 0x14, 0x99130110 }, /* speaker */
9083 { 0x15, 0x01211420 }, /* HP2 */
9084 { 0x18, 0x01a19840 }, /* mic */
9085 { 0x19, 0x99a3094f }, /* int-mic */
9086 { 0x1b, 0x0121441f }, /* HP */
9087 { }
9088 },
9089 .chained = true,
9090 .chain_id = ALC662_FIXUP_SKU_IGNORE
9091 },
9092 [ALC662_FIXUP_ASUS_MODE7] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009093 .type = HDA_FIXUP_PINS,
9094 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02009095 { 0x14, 0x99130110 }, /* speaker */
9096 { 0x17, 0x99130111 }, /* speaker */
9097 { 0x18, 0x01a19840 }, /* mic */
9098 { 0x19, 0x99a3094f }, /* int-mic */
9099 { 0x1b, 0x01214020 }, /* HP */
9100 { 0x21, 0x0121401f }, /* HP */
9101 { }
9102 },
9103 .chained = true,
9104 .chain_id = ALC662_FIXUP_SKU_IGNORE
9105 },
9106 [ALC662_FIXUP_ASUS_MODE8] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009107 .type = HDA_FIXUP_PINS,
9108 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02009109 { 0x14, 0x99130110 }, /* speaker */
9110 { 0x12, 0x99a30970 }, /* int-mic */
9111 { 0x15, 0x01214020 }, /* HP */
9112 { 0x17, 0x99130111 }, /* speaker */
9113 { 0x18, 0x01a19840 }, /* mic */
9114 { 0x21, 0x0121401f }, /* HP */
9115 { }
9116 },
9117 .chained = true,
9118 .chain_id = ALC662_FIXUP_SKU_IGNORE
Takashi Iwai2996bdb2011-08-18 16:02:24 +02009119 },
Takashi Iwai1565cc32012-02-13 12:03:25 +01009120 [ALC662_FIXUP_NO_JACK_DETECT] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009121 .type = HDA_FIXUP_FUNC,
Takashi Iwai1565cc32012-02-13 12:03:25 +01009122 .v.func = alc_fixup_no_jack_detect,
9123 },
David Henningssonedfe3bf2012-06-12 13:15:12 +02009124 [ALC662_FIXUP_ZOTAC_Z68] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009125 .type = HDA_FIXUP_PINS,
9126 .v.pins = (const struct hda_pintbl[]) {
David Henningssonedfe3bf2012-06-12 13:15:12 +02009127 { 0x1b, 0x02214020 }, /* Front HP */
9128 { }
9129 }
9130 },
Takashi Iwai125821a2012-06-22 14:30:29 +02009131 [ALC662_FIXUP_INV_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009132 .type = HDA_FIXUP_FUNC,
David Henningsson9d36a7d2014-10-07 10:18:42 +02009133 .v.func = alc_fixup_inv_dmic,
Takashi Iwai125821a2012-06-22 14:30:29 +02009134 },
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +02009135 [ALC668_FIXUP_DELL_XPS13] = {
9136 .type = HDA_FIXUP_FUNC,
9137 .v.func = alc_fixup_dell_xps13,
9138 .chained = true,
9139 .chain_id = ALC668_FIXUP_DELL_DISABLE_AAMIX
9140 },
Gabriele Mazzotta5e6db662014-05-20 18:58:26 +02009141 [ALC668_FIXUP_DELL_DISABLE_AAMIX] = {
9142 .type = HDA_FIXUP_FUNC,
9143 .v.func = alc_fixup_disable_aamix,
9144 .chained = true,
9145 .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
9146 },
Hui Wang493a52a2014-01-14 14:07:36 +08009147 [ALC668_FIXUP_AUTO_MUTE] = {
9148 .type = HDA_FIXUP_FUNC,
9149 .v.func = alc_fixup_auto_mute_via_amp,
9150 .chained = true,
9151 .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
9152 },
David Henningsson1f8b46c2015-05-12 14:38:15 +02009153 [ALC662_FIXUP_DELL_MIC_NO_PRESENCE] = {
9154 .type = HDA_FIXUP_PINS,
9155 .v.pins = (const struct hda_pintbl[]) {
9156 { 0x19, 0x03a1113c }, /* use as headset mic, without its own jack detect */
9157 /* headphone mic by setting pin control of 0x1b (headphone out) to in + vref_50 */
9158 { }
9159 },
9160 .chained = true,
9161 .chain_id = ALC662_FIXUP_HEADSET_MODE
9162 },
9163 [ALC662_FIXUP_HEADSET_MODE] = {
9164 .type = HDA_FIXUP_FUNC,
9165 .v.func = alc_fixup_headset_mode_alc662,
9166 },
David Henningsson73bdd592013-04-15 15:44:14 +02009167 [ALC668_FIXUP_DELL_MIC_NO_PRESENCE] = {
9168 .type = HDA_FIXUP_PINS,
9169 .v.pins = (const struct hda_pintbl[]) {
9170 { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
9171 { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
9172 { }
9173 },
9174 .chained = true,
9175 .chain_id = ALC668_FIXUP_HEADSET_MODE
9176 },
9177 [ALC668_FIXUP_HEADSET_MODE] = {
9178 .type = HDA_FIXUP_FUNC,
9179 .v.func = alc_fixup_headset_mode_alc668,
9180 },
David Henningsson8e54b4a2014-02-07 09:31:07 +01009181 [ALC662_FIXUP_BASS_MODE4_CHMAP] = {
Takashi Iwai8e383952013-10-30 17:41:12 +01009182 .type = HDA_FIXUP_FUNC,
Takashi Iwaieb9ca3a2013-11-28 15:24:34 +01009183 .v.func = alc_fixup_bass_chmap,
Takashi Iwai8e383952013-10-30 17:41:12 +01009184 .chained = true,
9185 .chain_id = ALC662_FIXUP_ASUS_MODE4
9186 },
David Henningsson61a75f12014-02-07 09:31:08 +01009187 [ALC662_FIXUP_BASS_16] = {
9188 .type = HDA_FIXUP_PINS,
9189 .v.pins = (const struct hda_pintbl[]) {
9190 {0x16, 0x80106111}, /* bass speaker */
9191 {}
9192 },
9193 .chained = true,
9194 .chain_id = ALC662_FIXUP_BASS_CHMAP,
9195 },
Takashi Iwaia30c9aa2013-11-21 08:00:20 +01009196 [ALC662_FIXUP_BASS_1A] = {
9197 .type = HDA_FIXUP_PINS,
9198 .v.pins = (const struct hda_pintbl[]) {
9199 {0x1a, 0x80106111}, /* bass speaker */
9200 {}
9201 },
David Henningsson8e54b4a2014-02-07 09:31:07 +01009202 .chained = true,
9203 .chain_id = ALC662_FIXUP_BASS_CHMAP,
Takashi Iwaia30c9aa2013-11-21 08:00:20 +01009204 },
David Henningsson8e54b4a2014-02-07 09:31:07 +01009205 [ALC662_FIXUP_BASS_CHMAP] = {
Takashi Iwaia30c9aa2013-11-21 08:00:20 +01009206 .type = HDA_FIXUP_FUNC,
Takashi Iwaieb9ca3a2013-11-28 15:24:34 +01009207 .v.func = alc_fixup_bass_chmap,
Takashi Iwaia30c9aa2013-11-21 08:00:20 +01009208 },
Bobi Mihalca9d4dc582016-03-23 13:26:11 +02009209 [ALC662_FIXUP_ASUS_Nx50] = {
9210 .type = HDA_FIXUP_FUNC,
9211 .v.func = alc_fixup_auto_mute_via_amp,
9212 .chained = true,
9213 .chain_id = ALC662_FIXUP_BASS_1A
9214 },
Mikhail Paulyshkafc7438b2017-04-21 08:52:42 +02009215 [ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE] = {
9216 .type = HDA_FIXUP_FUNC,
9217 .v.func = alc_fixup_headset_mode_alc668,
9218 .chain_id = ALC662_FIXUP_BASS_CHMAP
9219 },
Yura Pakhuchiy3231e202016-05-07 23:53:36 +07009220 [ALC668_FIXUP_ASUS_Nx51] = {
9221 .type = HDA_FIXUP_PINS,
9222 .v.pins = (const struct hda_pintbl[]) {
Mikhail Paulyshkafc7438b2017-04-21 08:52:42 +02009223 { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
9224 { 0x1a, 0x90170151 }, /* bass speaker */
9225 { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
Yura Pakhuchiy3231e202016-05-07 23:53:36 +07009226 {}
9227 },
9228 .chained = true,
Mikhail Paulyshkafc7438b2017-04-21 08:52:42 +02009229 .chain_id = ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
Yura Pakhuchiy3231e202016-05-07 23:53:36 +07009230 },
Takashi Iwai5b7c5e12018-10-09 14:20:17 +02009231 [ALC668_FIXUP_MIC_COEF] = {
Takashi Iwai11ba6112018-10-07 09:44:17 +02009232 .type = HDA_FIXUP_VERBS,
9233 .v.verbs = (const struct hda_verb[]) {
9234 { 0x20, AC_VERB_SET_COEF_INDEX, 0xc3 },
9235 { 0x20, AC_VERB_SET_PROC_COEF, 0x4000 },
9236 {}
9237 },
9238 },
Takashi Iwai5b7c5e12018-10-09 14:20:17 +02009239 [ALC668_FIXUP_ASUS_G751] = {
9240 .type = HDA_FIXUP_PINS,
9241 .v.pins = (const struct hda_pintbl[]) {
9242 { 0x16, 0x0421101f }, /* HP */
9243 {}
9244 },
9245 .chained = true,
9246 .chain_id = ALC668_FIXUP_MIC_COEF
9247 },
Kailang Yang78f4f7c2016-06-07 11:31:34 +08009248 [ALC891_FIXUP_HEADSET_MODE] = {
9249 .type = HDA_FIXUP_FUNC,
9250 .v.func = alc_fixup_headset_mode,
9251 },
9252 [ALC891_FIXUP_DELL_MIC_NO_PRESENCE] = {
9253 .type = HDA_FIXUP_PINS,
9254 .v.pins = (const struct hda_pintbl[]) {
9255 { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
9256 { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
9257 { }
9258 },
9259 .chained = true,
9260 .chain_id = ALC891_FIXUP_HEADSET_MODE
9261 },
Shrirang Bagul9b51fe32016-08-01 13:16:17 +08009262 [ALC662_FIXUP_ACER_VERITON] = {
9263 .type = HDA_FIXUP_PINS,
9264 .v.pins = (const struct hda_pintbl[]) {
9265 { 0x15, 0x50170120 }, /* no internal speaker */
9266 { }
9267 }
9268 },
Takashi Iwai1a3f0992016-10-20 12:14:51 +02009269 [ALC892_FIXUP_ASROCK_MOBO] = {
9270 .type = HDA_FIXUP_PINS,
9271 .v.pins = (const struct hda_pintbl[]) {
9272 { 0x15, 0x40f000f0 }, /* disabled */
9273 { 0x16, 0x40f000f0 }, /* disabled */
Takashi Iwai1a3f0992016-10-20 12:14:51 +02009274 { }
9275 }
9276 },
Kailang Yangc6790c82016-11-25 16:15:17 +08009277 [ALC662_FIXUP_USI_FUNC] = {
9278 .type = HDA_FIXUP_FUNC,
9279 .v.func = alc662_fixup_usi_headset_mic,
9280 },
9281 [ALC662_FIXUP_USI_HEADSET_MODE] = {
9282 .type = HDA_FIXUP_PINS,
9283 .v.pins = (const struct hda_pintbl[]) {
9284 { 0x19, 0x02a1913c }, /* use as headset mic, without its own jack detect */
9285 { 0x18, 0x01a1903d },
9286 { }
9287 },
9288 .chained = true,
9289 .chain_id = ALC662_FIXUP_USI_FUNC
9290 },
Kailang Yangca169cc2017-04-25 16:17:40 +08009291 [ALC662_FIXUP_LENOVO_MULTI_CODECS] = {
9292 .type = HDA_FIXUP_FUNC,
9293 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
9294 },
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02009295 [ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET] = {
9296 .type = HDA_FIXUP_FUNC,
9297 .v.func = alc662_fixup_aspire_ethos_hp,
9298 },
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02009299 [ALC669_FIXUP_ACER_ASPIRE_ETHOS] = {
9300 .type = HDA_FIXUP_PINS,
9301 .v.pins = (const struct hda_pintbl[]) {
9302 { 0x15, 0x92130110 }, /* front speakers */
9303 { 0x18, 0x99130111 }, /* center/subwoofer */
9304 { 0x1b, 0x11130012 }, /* surround plus jack for HP */
9305 { }
9306 },
9307 .chained = true,
Takashi Iwai336820c2019-11-28 21:26:30 +01009308 .chain_id = ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02009309 },
Kailang Yang5af290282020-01-17 14:04:01 +08009310 [ALC671_FIXUP_HP_HEADSET_MIC2] = {
9311 .type = HDA_FIXUP_FUNC,
9312 .v.func = alc671_fixup_hp_headset_mic2,
9313 },
Jian-Hong Pand858c702020-03-17 16:28:07 +08009314 [ALC662_FIXUP_ACER_X2660G_HEADSET_MODE] = {
9315 .type = HDA_FIXUP_PINS,
9316 .v.pins = (const struct hda_pintbl[]) {
9317 { 0x1a, 0x02a1113c }, /* use as headset mic, without its own jack detect */
9318 { }
9319 },
9320 .chained = true,
9321 .chain_id = ALC662_FIXUP_USI_FUNC
9322 },
Jian-Hong Pana1244582020-03-17 16:28:09 +08009323 [ALC662_FIXUP_ACER_NITRO_HEADSET_MODE] = {
9324 .type = HDA_FIXUP_PINS,
9325 .v.pins = (const struct hda_pintbl[]) {
9326 { 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */
9327 { 0x1b, 0x0221144f },
9328 { }
9329 },
9330 .chained = true,
9331 .chain_id = ALC662_FIXUP_USI_FUNC
9332 },
David Henningsson6cb3b702010-09-09 08:51:44 +02009333};
9334
Takashi Iwaia9111322011-05-02 11:30:18 +02009335static const struct snd_pci_quirk alc662_fixup_tbl[] = {
Takashi Iwai53c334a2011-08-23 18:27:14 +02009336 SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2),
Takashi Iwaid3d38352013-08-19 20:05:50 +02009337 SND_PCI_QUIRK(0x1025, 0x022f, "Acer Aspire One", ALC662_FIXUP_INV_DMIC),
David Henningsson02f6ff92015-12-07 11:29:31 +01009338 SND_PCI_QUIRK(0x1025, 0x0241, "Packard Bell DOTS", ALC662_FIXUP_INV_DMIC),
David Henningssona6c47a82011-02-10 15:39:19 +01009339 SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
David Henningsson94024cd2011-04-29 14:10:55 +02009340 SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),
Takashi Iwai125821a2012-06-22 14:30:29 +02009341 SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC),
Takashi Iwai18019282013-08-16 08:17:05 +02009342 SND_PCI_QUIRK(0x1025, 0x034a, "Gateway LT27", ALC662_FIXUP_INV_DMIC),
Daniel T Chen2df03512010-10-10 22:39:28 -04009343 SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
Jian-Hong Pana1244582020-03-17 16:28:09 +08009344 SND_PCI_QUIRK(0x1025, 0x123c, "Acer Nitro N50-600", ALC662_FIXUP_ACER_NITRO_HEADSET_MODE),
Jian-Hong Pand858c702020-03-17 16:28:07 +08009345 SND_PCI_QUIRK(0x1025, 0x124e, "Acer 2660G", ALC662_FIXUP_ACER_X2660G_HEADSET_MODE),
David Henningsson73bdd592013-04-15 15:44:14 +02009346 SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
9347 SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
Takashi Iwaic5d019c2014-07-22 17:33:32 +02009348 SND_PCI_QUIRK(0x1028, 0x05fe, "Dell XPS 15", ALC668_FIXUP_DELL_XPS13),
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +02009349 SND_PCI_QUIRK(0x1028, 0x060a, "Dell XPS 13", ALC668_FIXUP_DELL_XPS13),
Niranjan Sivakumar467e1432015-09-05 18:20:35 +02009350 SND_PCI_QUIRK(0x1028, 0x060d, "Dell M3800", ALC668_FIXUP_DELL_XPS13),
David Henningsson09d20142013-11-20 11:43:30 +01009351 SND_PCI_QUIRK(0x1028, 0x0625, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
David Henningssonad8ff99e2013-11-07 09:28:59 +01009352 SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
Kailang Yang8dc9abb92014-04-16 15:53:12 +08009353 SND_PCI_QUIRK(0x1028, 0x0696, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
9354 SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
Kailang Yang6a98e342014-10-27 16:20:30 +08009355 SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
Takashi Iwaie59ea3e2011-06-29 17:21:00 +02009356 SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
Kaho Ng2da2dc92016-05-09 00:27:49 +08009357 SND_PCI_QUIRK(0x1043, 0x1080, "Asus UX501VW", ALC668_FIXUP_HEADSET_MODE),
Bobi Mihalca83a9efb2016-03-23 13:32:33 +02009358 SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_ASUS_Nx50),
Takashi Iwaidb8948e2016-01-18 09:17:30 +01009359 SND_PCI_QUIRK(0x1043, 0x13df, "Asus N550JX", ALC662_FIXUP_BASS_1A),
Bobi Mihalca9d4dc582016-03-23 13:26:11 +02009360 SND_PCI_QUIRK(0x1043, 0x129d, "Asus N750", ALC662_FIXUP_ASUS_Nx50),
Takashi Iwai11ba6112018-10-07 09:44:17 +02009361 SND_PCI_QUIRK(0x1043, 0x12ff, "ASUS G751", ALC668_FIXUP_ASUS_G751),
David Henningsson8e54b4a2014-02-07 09:31:07 +01009362 SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
David Henningsson61a75f12014-02-07 09:31:08 +01009363 SND_PCI_QUIRK(0x1043, 0x15a7, "ASUS UX51VZH", ALC662_FIXUP_BASS_16),
Yura Pakhuchiy3231e202016-05-07 23:53:36 +07009364 SND_PCI_QUIRK(0x1043, 0x177d, "ASUS N551", ALC668_FIXUP_ASUS_Nx51),
9365 SND_PCI_QUIRK(0x1043, 0x17bd, "ASUS N751", ALC668_FIXUP_ASUS_Nx51),
Takashi Iwaic7efff92017-01-04 21:38:16 +01009366 SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71SL", ALC662_FIXUP_ASUS_MODE8),
David Henningsson61a75f12014-02-07 09:31:08 +01009367 SND_PCI_QUIRK(0x1043, 0x1b73, "ASUS N55SF", ALC662_FIXUP_BASS_16),
David Henningsson8e54b4a2014-02-07 09:31:07 +01009368 SND_PCI_QUIRK(0x1043, 0x1bf3, "ASUS N76VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
Takashi Iwai1565cc32012-02-13 12:03:25 +01009369 SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),
Takashi Iwai53c334a2011-08-23 18:27:14 +02009370 SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
Daniel T Chena0e90ac2010-11-20 10:20:35 -05009371 SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
Kailang Yangc6790c82016-11-25 16:15:17 +08009372 SND_PCI_QUIRK(0x14cd, 0x5003, "USI", ALC662_FIXUP_USI_HEADSET_MODE),
Kailang Yangca169cc2017-04-25 16:17:40 +08009373 SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC662_FIXUP_LENOVO_MULTI_CODECS),
Valentine Sinitsynd4118582010-10-01 22:24:08 +06009374 SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
David Henningsson6cb3b702010-09-09 08:51:44 +02009375 SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
Takashi Iwai1a3f0992016-10-20 12:14:51 +02009376 SND_PCI_QUIRK(0x1849, 0x5892, "ASRock B150M", ALC892_FIXUP_ASROCK_MOBO),
David Henningssonedfe3bf2012-06-12 13:15:12 +02009377 SND_PCI_QUIRK(0x19da, 0xa130, "Zotac Z68", ALC662_FIXUP_ZOTAC_Z68),
Shrirang Bagul9b51fe32016-08-01 13:16:17 +08009378 SND_PCI_QUIRK(0x1b0a, 0x01b8, "ACER Veriton", ALC662_FIXUP_ACER_VERITON),
Anisse Astierd2ebd472011-01-20 12:36:21 +01009379 SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02009380 SND_PCI_QUIRK(0x1025, 0x0566, "Acer Aspire Ethos 8951G", ALC669_FIXUP_ACER_ASPIRE_ETHOS),
Takashi Iwai53c334a2011-08-23 18:27:14 +02009381
9382#if 0
9383 /* Below is a quirk table taken from the old code.
9384 * Basically the device should work as is without the fixup table.
9385 * If BIOS doesn't give a proper info, enable the corresponding
9386 * fixup entry.
Jesper Juhl7d7eb9e2012-04-12 22:11:25 +02009387 */
Takashi Iwai53c334a2011-08-23 18:27:14 +02009388 SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1),
9389 SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3),
9390 SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1),
9391 SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC662_FIXUP_ASUS_MODE3),
9392 SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
9393 SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9394 SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
9395 SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC662_FIXUP_ASUS_MODE1),
9396 SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC662_FIXUP_ASUS_MODE1),
9397 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9398 SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC662_FIXUP_ASUS_MODE7),
9399 SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC662_FIXUP_ASUS_MODE7),
9400 SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC662_FIXUP_ASUS_MODE8),
9401 SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC662_FIXUP_ASUS_MODE3),
9402 SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC662_FIXUP_ASUS_MODE1),
9403 SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9404 SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_FIXUP_ASUS_MODE2),
9405 SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC662_FIXUP_ASUS_MODE1),
9406 SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9407 SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
9408 SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
9409 SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9410 SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC662_FIXUP_ASUS_MODE1),
9411 SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC662_FIXUP_ASUS_MODE3),
9412 SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_FIXUP_ASUS_MODE2),
9413 SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9414 SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC662_FIXUP_ASUS_MODE5),
9415 SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
9416 SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9417 SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC662_FIXUP_ASUS_MODE1),
9418 SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9419 SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9420 SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC662_FIXUP_ASUS_MODE3),
9421 SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC662_FIXUP_ASUS_MODE3),
9422 SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC662_FIXUP_ASUS_MODE1),
9423 SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC662_FIXUP_ASUS_MODE1),
9424 SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC662_FIXUP_ASUS_MODE1),
9425 SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC662_FIXUP_ASUS_MODE1),
9426 SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC662_FIXUP_ASUS_MODE1),
9427 SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9428 SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_FIXUP_ASUS_MODE2),
9429 SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC662_FIXUP_ASUS_MODE1),
9430 SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
9431 SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC662_FIXUP_ASUS_MODE3),
9432 SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC662_FIXUP_ASUS_MODE1),
9433 SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC662_FIXUP_ASUS_MODE1),
9434 SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC662_FIXUP_ASUS_MODE1),
9435 SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_FIXUP_ASUS_MODE2),
9436 SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
9437 SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE4),
9438#endif
David Henningsson6cb3b702010-09-09 08:51:44 +02009439 {}
9440};
9441
Takashi Iwai1727a772013-01-10 09:52:52 +01009442static const struct hda_model_fixup alc662_fixup_models[] = {
Takashi Iwaiaa3841b2018-06-26 07:42:40 +02009443 {.id = ALC662_FIXUP_ASPIRE, .name = "aspire"},
9444 {.id = ALC662_FIXUP_IDEAPAD, .name = "ideapad"},
Todd Broch6be79482010-12-07 16:51:05 -08009445 {.id = ALC272_FIXUP_MARIO, .name = "mario"},
Takashi Iwaiaa3841b2018-06-26 07:42:40 +02009446 {.id = ALC662_FIXUP_HP_RP5800, .name = "hp-rp5800"},
Takashi Iwai53c334a2011-08-23 18:27:14 +02009447 {.id = ALC662_FIXUP_ASUS_MODE1, .name = "asus-mode1"},
9448 {.id = ALC662_FIXUP_ASUS_MODE2, .name = "asus-mode2"},
9449 {.id = ALC662_FIXUP_ASUS_MODE3, .name = "asus-mode3"},
9450 {.id = ALC662_FIXUP_ASUS_MODE4, .name = "asus-mode4"},
9451 {.id = ALC662_FIXUP_ASUS_MODE5, .name = "asus-mode5"},
9452 {.id = ALC662_FIXUP_ASUS_MODE6, .name = "asus-mode6"},
9453 {.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},
9454 {.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},
Takashi Iwaiaa3841b2018-06-26 07:42:40 +02009455 {.id = ALC662_FIXUP_ZOTAC_Z68, .name = "zotac-z68"},
Takashi Iwai6e72aa52012-06-25 10:52:25 +02009456 {.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"},
Takashi Iwaiaa3841b2018-06-26 07:42:40 +02009457 {.id = ALC662_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc662-headset-multi"},
David Henningssone32aa852013-06-17 11:04:02 +02009458 {.id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
Takashi Iwaiaa3841b2018-06-26 07:42:40 +02009459 {.id = ALC662_FIXUP_HEADSET_MODE, .name = "alc662-headset"},
9460 {.id = ALC668_FIXUP_HEADSET_MODE, .name = "alc668-headset"},
9461 {.id = ALC662_FIXUP_BASS_16, .name = "bass16"},
9462 {.id = ALC662_FIXUP_BASS_1A, .name = "bass1a"},
9463 {.id = ALC668_FIXUP_AUTO_MUTE, .name = "automute"},
9464 {.id = ALC668_FIXUP_DELL_XPS13, .name = "dell-xps13"},
9465 {.id = ALC662_FIXUP_ASUS_Nx50, .name = "asus-nx50"},
9466 {.id = ALC668_FIXUP_ASUS_Nx51, .name = "asus-nx51"},
Takashi Iwai40c51672018-10-07 09:47:39 +02009467 {.id = ALC668_FIXUP_ASUS_G751, .name = "asus-g751"},
Takashi Iwaiaa3841b2018-06-26 07:42:40 +02009468 {.id = ALC891_FIXUP_HEADSET_MODE, .name = "alc891-headset"},
9469 {.id = ALC891_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc891-headset-multi"},
9470 {.id = ALC662_FIXUP_ACER_VERITON, .name = "acer-veriton"},
9471 {.id = ALC892_FIXUP_ASROCK_MOBO, .name = "asrock-mobo"},
9472 {.id = ALC662_FIXUP_USI_HEADSET_MODE, .name = "usi-headset"},
Takashi Iwaiba90d6a2017-05-22 16:38:47 +02009473 {.id = ALC662_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02009474 {.id = ALC669_FIXUP_ACER_ASPIRE_ETHOS, .name = "aspire-ethos"},
Todd Broch6be79482010-12-07 16:51:05 -08009475 {}
9476};
David Henningsson6cb3b702010-09-09 08:51:44 +02009477
Hui Wang532895c2014-05-29 15:59:19 +08009478static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = {
Kailang Yang78f4f7c2016-06-07 11:31:34 +08009479 SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
9480 {0x17, 0x02211010},
9481 {0x18, 0x01a19030},
9482 {0x1a, 0x01813040},
9483 {0x21, 0x01014020}),
Hui Wang4b4e0e32019-07-16 15:21:34 +08009484 SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
9485 {0x16, 0x01813030},
9486 {0x17, 0x02211010},
9487 {0x18, 0x01a19040},
9488 {0x21, 0x01014020}),
David Henningsson1f8b46c2015-05-12 14:38:15 +02009489 SND_HDA_PIN_QUIRK(0x10ec0662, 0x1028, "Dell", ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
David Henningsson1f8b46c2015-05-12 14:38:15 +02009490 {0x14, 0x01014010},
David Henningsson1f8b46c2015-05-12 14:38:15 +02009491 {0x18, 0x01a19020},
David Henningsson1f8b46c2015-05-12 14:38:15 +02009492 {0x1a, 0x0181302f},
Hui Wang11580292015-08-03 11:03:49 +08009493 {0x1b, 0x0221401f}),
David Henningsson76c21322014-06-24 14:46:54 +02009494 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
9495 {0x12, 0x99a30130},
9496 {0x14, 0x90170110},
9497 {0x15, 0x0321101f},
Hui Wang11580292015-08-03 11:03:49 +08009498 {0x16, 0x03011020}),
David Henningsson76c21322014-06-24 14:46:54 +02009499 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
9500 {0x12, 0x99a30140},
9501 {0x14, 0x90170110},
9502 {0x15, 0x0321101f},
Hui Wang11580292015-08-03 11:03:49 +08009503 {0x16, 0x03011020}),
David Henningsson76c21322014-06-24 14:46:54 +02009504 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
9505 {0x12, 0x99a30150},
9506 {0x14, 0x90170110},
9507 {0x15, 0x0321101f},
Hui Wang11580292015-08-03 11:03:49 +08009508 {0x16, 0x03011020}),
David Henningsson76c21322014-06-24 14:46:54 +02009509 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
David Henningsson76c21322014-06-24 14:46:54 +02009510 {0x14, 0x90170110},
9511 {0x15, 0x0321101f},
Hui Wang11580292015-08-03 11:03:49 +08009512 {0x16, 0x03011020}),
David Henningsson76c21322014-06-24 14:46:54 +02009513 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell XPS 15", ALC668_FIXUP_AUTO_MUTE,
9514 {0x12, 0x90a60130},
9515 {0x14, 0x90170110},
Hui Wang11580292015-08-03 11:03:49 +08009516 {0x15, 0x0321101f}),
Kailang Yang5af290282020-01-17 14:04:01 +08009517 SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
9518 {0x14, 0x01014010},
9519 {0x17, 0x90170150},
Kailang Yangf2adbae2020-02-05 15:40:01 +08009520 {0x19, 0x02a11060},
Kailang Yang5af290282020-01-17 14:04:01 +08009521 {0x1b, 0x01813030},
9522 {0x21, 0x02211020}),
9523 SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
9524 {0x14, 0x01014010},
9525 {0x18, 0x01a19040},
9526 {0x1b, 0x01813030},
9527 {0x21, 0x02211020}),
9528 SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
9529 {0x14, 0x01014020},
9530 {0x17, 0x90170110},
9531 {0x18, 0x01a19050},
9532 {0x1b, 0x01813040},
9533 {0x21, 0x02211030}),
Hui Wang532895c2014-05-29 15:59:19 +08009534 {}
9535};
9536
Takashi Iwai1d045db2011-07-07 18:23:21 +02009537/*
9538 */
Kailang Yangbc9f98a2007-04-12 13:06:07 +02009539static int patch_alc662(struct hda_codec *codec)
9540{
9541 struct alc_spec *spec;
Takashi Iwai3de95172012-05-07 18:03:15 +02009542 int err;
Kailang Yangbc9f98a2007-04-12 13:06:07 +02009543
Takashi Iwai3de95172012-05-07 18:03:15 +02009544 err = alc_alloc_spec(codec, 0x0b);
9545 if (err < 0)
9546 return err;
Kailang Yangbc9f98a2007-04-12 13:06:07 +02009547
Takashi Iwai3de95172012-05-07 18:03:15 +02009548 spec = codec->spec;
Takashi Iwai1f0f4b82011-06-27 10:52:59 +02009549
Takashi Iwai225068a2015-05-29 10:42:14 +02009550 spec->shutup = alc_eapd_shutup;
9551
Takashi Iwai53c334a2011-08-23 18:27:14 +02009552 /* handle multiple HPs as is */
9553 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
9554
Takashi Iwai2c3bf9a2008-06-04 12:39:38 +02009555 alc_fix_pll_init(codec, 0x20, 0x04, 15);
9556
Takashi Iwai7639a062015-03-03 10:07:24 +01009557 switch (codec->core.vendor_id) {
Kailang Yangf3f91852014-10-24 15:43:46 +08009558 case 0x10ec0668:
9559 spec->init_hook = alc668_restore_default_value;
9560 break;
Kailang Yangf3f91852014-10-24 15:43:46 +08009561 }
Kailang Yang8663ff72012-06-29 09:35:52 +02009562
Takashi Iwaic9af7532019-05-10 11:01:43 +02009563 alc_pre_init(codec);
9564
Takashi Iwai1727a772013-01-10 09:52:52 +01009565 snd_hda_pick_fixup(codec, alc662_fixup_models,
Takashi Iwai8e5a0502012-06-21 15:49:33 +02009566 alc662_fixup_tbl, alc662_fixups);
Hui Wang0fc1e442019-08-16 14:27:39 +08009567 snd_hda_pick_pin_fixup(codec, alc662_pin_fixup_tbl, alc662_fixups, true);
Takashi Iwai1727a772013-01-10 09:52:52 +01009568 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai8e5a0502012-06-21 15:49:33 +02009569
9570 alc_auto_parse_customize_define(codec);
9571
Takashi Iwai7504b6c2013-03-18 11:25:51 +01009572 if (has_cdefine_beep(codec))
9573 spec->gen.beep_nid = 0x01;
9574
Takashi Iwai1bb7e432011-10-17 16:50:59 +02009575 if ((alc_get_coef0(codec) & (1 << 14)) &&
Takashi Iwai5100cd02014-02-15 10:03:19 +01009576 codec->bus->pci && codec->bus->pci->subsystem_vendor == 0x1025 &&
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02009577 spec->cdefine.platform_type == 1) {
Wei Yongjun6134b1a2013-04-18 11:12:59 +08009578 err = alc_codec_rename(codec, "ALC272X");
9579 if (err < 0)
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02009580 goto error;
Takashi Iwai20ca0c32011-10-17 16:00:35 +02009581 }
Kailang Yang274693f2009-12-03 10:07:50 +01009582
Takashi Iwaib9c51062011-08-24 18:08:07 +02009583 /* automatic parse from the BIOS config */
9584 err = alc662_parse_auto_config(codec);
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02009585 if (err < 0)
9586 goto error;
Kailang Yangbc9f98a2007-04-12 13:06:07 +02009587
Takashi Iwai7504b6c2013-03-18 11:25:51 +01009588 if (!spec->gen.no_analog && spec->gen.beep_nid) {
Takashi Iwai7639a062015-03-03 10:07:24 +01009589 switch (codec->core.vendor_id) {
Kailang Yangda00c242010-03-19 11:23:45 +01009590 case 0x10ec0662:
Takashi Iwaifea80fa2018-06-20 12:52:46 +02009591 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
Kailang Yangda00c242010-03-19 11:23:45 +01009592 break;
9593 case 0x10ec0272:
9594 case 0x10ec0663:
9595 case 0x10ec0665:
Kailang Yang9ad54542013-11-26 15:41:40 +08009596 case 0x10ec0668:
Takashi Iwaifea80fa2018-06-20 12:52:46 +02009597 err = set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
Kailang Yangda00c242010-03-19 11:23:45 +01009598 break;
9599 case 0x10ec0273:
Takashi Iwaifea80fa2018-06-20 12:52:46 +02009600 err = set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
Kailang Yangda00c242010-03-19 11:23:45 +01009601 break;
9602 }
Takashi Iwaifea80fa2018-06-20 12:52:46 +02009603 if (err < 0)
9604 goto error;
Kailang Yangcec27c82010-02-04 14:18:18 +01009605 }
Takashi Iwai2134ea42008-01-10 16:53:55 +01009606
Takashi Iwai1727a772013-01-10 09:52:52 +01009607 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01009608
Kailang Yangbc9f98a2007-04-12 13:06:07 +02009609 return 0;
Kailang Yangbc9f98a2007-04-12 13:06:07 +02009610
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02009611 error:
9612 alc_free(codec);
9613 return err;
Kailang Yangb478b992011-05-18 11:51:15 +02009614}
9615
Kailang Yangbc9f98a2007-04-12 13:06:07 +02009616/*
Kailang Yangd1eb57f2010-06-23 16:25:26 +02009617 * ALC680 support
9618 */
Kailang Yangd1eb57f2010-06-23 16:25:26 +02009619
Kailang Yangd1eb57f2010-06-23 16:25:26 +02009620static int alc680_parse_auto_config(struct hda_codec *codec)
9621{
Takashi Iwai3e6179b2011-07-08 16:55:13 +02009622 return alc_parse_auto_config(codec, NULL, NULL);
Kailang Yangd1eb57f2010-06-23 16:25:26 +02009623}
9624
Kailang Yangd1eb57f2010-06-23 16:25:26 +02009625/*
Kailang Yangd1eb57f2010-06-23 16:25:26 +02009626 */
Kailang Yangd1eb57f2010-06-23 16:25:26 +02009627static int patch_alc680(struct hda_codec *codec)
9628{
Kailang Yangd1eb57f2010-06-23 16:25:26 +02009629 int err;
9630
Takashi Iwai1f0f4b82011-06-27 10:52:59 +02009631 /* ALC680 has no aa-loopback mixer */
Takashi Iwai3de95172012-05-07 18:03:15 +02009632 err = alc_alloc_spec(codec, 0);
9633 if (err < 0)
9634 return err;
Takashi Iwai1f0f4b82011-06-27 10:52:59 +02009635
Takashi Iwai1ebec5f2011-08-15 13:21:48 +02009636 /* automatic parse from the BIOS config */
9637 err = alc680_parse_auto_config(codec);
9638 if (err < 0) {
9639 alc_free(codec);
9640 return err;
Kailang Yangd1eb57f2010-06-23 16:25:26 +02009641 }
9642
Kailang Yangd1eb57f2010-06-23 16:25:26 +02009643 return 0;
9644}
9645
9646/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07009647 * patch entries
9648 */
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009649static const struct hda_device_id snd_hda_id_realtek[] = {
Kailang Yang0a6f0602017-06-30 16:00:48 +08009650 HDA_CODEC_ENTRY(0x10ec0215, "ALC215", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009651 HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269),
Hui Wang2a36c162019-09-04 13:53:27 +08009652 HDA_CODEC_ENTRY(0x10ec0222, "ALC222", patch_alc269),
Kailang Yang42314302016-02-03 15:03:50 +08009653 HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009654 HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269),
9655 HDA_CODEC_ENTRY(0x10ec0233, "ALC233", patch_alc269),
Kailang Yangdcd4f0d2016-05-04 15:50:18 +08009656 HDA_CODEC_ENTRY(0x10ec0234, "ALC234", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009657 HDA_CODEC_ENTRY(0x10ec0235, "ALC233", patch_alc269),
Kailang Yang736f20a2017-10-20 15:06:34 +08009658 HDA_CODEC_ENTRY(0x10ec0236, "ALC236", patch_alc269),
Kailang Yang7fbdcd82020-04-23 14:18:31 +08009659 HDA_CODEC_ENTRY(0x10ec0245, "ALC245", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009660 HDA_CODEC_ENTRY(0x10ec0255, "ALC255", patch_alc269),
9661 HDA_CODEC_ENTRY(0x10ec0256, "ALC256", patch_alc269),
Kailang Yangf429e7e2017-12-05 15:38:24 +08009662 HDA_CODEC_ENTRY(0x10ec0257, "ALC257", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009663 HDA_CODEC_ENTRY(0x10ec0260, "ALC260", patch_alc260),
9664 HDA_CODEC_ENTRY(0x10ec0262, "ALC262", patch_alc262),
9665 HDA_CODEC_ENTRY(0x10ec0267, "ALC267", patch_alc268),
9666 HDA_CODEC_ENTRY(0x10ec0268, "ALC268", patch_alc268),
9667 HDA_CODEC_ENTRY(0x10ec0269, "ALC269", patch_alc269),
9668 HDA_CODEC_ENTRY(0x10ec0270, "ALC270", patch_alc269),
9669 HDA_CODEC_ENTRY(0x10ec0272, "ALC272", patch_alc662),
Kailang Yangdcd4f0d2016-05-04 15:50:18 +08009670 HDA_CODEC_ENTRY(0x10ec0274, "ALC274", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009671 HDA_CODEC_ENTRY(0x10ec0275, "ALC275", patch_alc269),
9672 HDA_CODEC_ENTRY(0x10ec0276, "ALC276", patch_alc269),
9673 HDA_CODEC_ENTRY(0x10ec0280, "ALC280", patch_alc269),
9674 HDA_CODEC_ENTRY(0x10ec0282, "ALC282", patch_alc269),
9675 HDA_CODEC_ENTRY(0x10ec0283, "ALC283", patch_alc269),
9676 HDA_CODEC_ENTRY(0x10ec0284, "ALC284", patch_alc269),
Kailang Yang0a6f0602017-06-30 16:00:48 +08009677 HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009678 HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269),
Kailang Yang630e3612020-05-27 14:10:26 +08009679 HDA_CODEC_ENTRY(0x10ec0287, "ALC287", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009680 HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269),
Kailang Yang0a6f0602017-06-30 16:00:48 +08009681 HDA_CODEC_ENTRY(0x10ec0289, "ALC289", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009682 HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269),
9683 HDA_CODEC_ENTRY(0x10ec0292, "ALC292", patch_alc269),
9684 HDA_CODEC_ENTRY(0x10ec0293, "ALC293", patch_alc269),
Kailang Yangdcd4f0d2016-05-04 15:50:18 +08009685 HDA_CODEC_ENTRY(0x10ec0294, "ALC294", patch_alc269),
Kailang Yang7d727862016-05-24 16:46:07 +08009686 HDA_CODEC_ENTRY(0x10ec0295, "ALC295", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009687 HDA_CODEC_ENTRY(0x10ec0298, "ALC298", patch_alc269),
Kailang Yang28f1f9b2017-01-04 14:49:07 +08009688 HDA_CODEC_ENTRY(0x10ec0299, "ALC299", patch_alc269),
Kailang Yang1078bef2018-11-08 16:36:15 +08009689 HDA_CODEC_ENTRY(0x10ec0300, "ALC300", patch_alc269),
Kailang Yangf0778872019-10-24 15:13:32 +08009690 HDA_CODEC_ENTRY(0x10ec0623, "ALC623", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009691 HDA_CODEC_REV_ENTRY(0x10ec0861, 0x100340, "ALC660", patch_alc861),
9692 HDA_CODEC_ENTRY(0x10ec0660, "ALC660-VD", patch_alc861vd),
9693 HDA_CODEC_ENTRY(0x10ec0861, "ALC861", patch_alc861),
9694 HDA_CODEC_ENTRY(0x10ec0862, "ALC861-VD", patch_alc861vd),
9695 HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100002, "ALC662 rev2", patch_alc882),
9696 HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100101, "ALC662 rev1", patch_alc662),
9697 HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100300, "ALC662 rev3", patch_alc662),
9698 HDA_CODEC_ENTRY(0x10ec0663, "ALC663", patch_alc662),
9699 HDA_CODEC_ENTRY(0x10ec0665, "ALC665", patch_alc662),
9700 HDA_CODEC_ENTRY(0x10ec0667, "ALC667", patch_alc662),
9701 HDA_CODEC_ENTRY(0x10ec0668, "ALC668", patch_alc662),
9702 HDA_CODEC_ENTRY(0x10ec0670, "ALC670", patch_alc662),
9703 HDA_CODEC_ENTRY(0x10ec0671, "ALC671", patch_alc662),
9704 HDA_CODEC_ENTRY(0x10ec0680, "ALC680", patch_alc680),
Kailang Yang6fbae352016-05-30 16:44:20 +08009705 HDA_CODEC_ENTRY(0x10ec0700, "ALC700", patch_alc269),
9706 HDA_CODEC_ENTRY(0x10ec0701, "ALC701", patch_alc269),
9707 HDA_CODEC_ENTRY(0x10ec0703, "ALC703", patch_alc269),
Kailang Yang836295322019-05-02 16:03:26 +08009708 HDA_CODEC_ENTRY(0x10ec0711, "ALC711", patch_alc269),
Kailang Yang78f4f7c2016-06-07 11:31:34 +08009709 HDA_CODEC_ENTRY(0x10ec0867, "ALC891", patch_alc662),
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009710 HDA_CODEC_ENTRY(0x10ec0880, "ALC880", patch_alc880),
9711 HDA_CODEC_ENTRY(0x10ec0882, "ALC882", patch_alc882),
9712 HDA_CODEC_ENTRY(0x10ec0883, "ALC883", patch_alc882),
9713 HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100101, "ALC889A", patch_alc882),
9714 HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100103, "ALC889A", patch_alc882),
9715 HDA_CODEC_ENTRY(0x10ec0885, "ALC885", patch_alc882),
9716 HDA_CODEC_ENTRY(0x10ec0887, "ALC887", patch_alc882),
9717 HDA_CODEC_REV_ENTRY(0x10ec0888, 0x100101, "ALC1200", patch_alc882),
9718 HDA_CODEC_ENTRY(0x10ec0888, "ALC888", patch_alc882),
9719 HDA_CODEC_ENTRY(0x10ec0889, "ALC889", patch_alc882),
9720 HDA_CODEC_ENTRY(0x10ec0892, "ALC892", patch_alc662),
9721 HDA_CODEC_ENTRY(0x10ec0899, "ALC898", patch_alc882),
9722 HDA_CODEC_ENTRY(0x10ec0900, "ALC1150", patch_alc882),
Kailang Yang6d9ffcf2020-01-03 16:24:06 +08009723 HDA_CODEC_ENTRY(0x10ec0b00, "ALCS1200A", patch_alc882),
Kailang Yang65553b12017-07-11 15:15:47 +08009724 HDA_CODEC_ENTRY(0x10ec1168, "ALC1220", patch_alc882),
Kailang Yanga535ad52017-01-16 16:59:26 +08009725 HDA_CODEC_ENTRY(0x10ec1220, "ALC1220", patch_alc882),
Linus Torvalds1da177e2005-04-16 15:20:36 -07009726 {} /* terminator */
9727};
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009728MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_realtek);
Takashi Iwai1289e9e2008-11-27 15:47:11 +01009729
9730MODULE_LICENSE("GPL");
9731MODULE_DESCRIPTION("Realtek HD-audio codec");
9732
Takashi Iwaid8a766a2015-02-17 15:25:37 +01009733static struct hda_codec_driver realtek_driver = {
Takashi Iwaib9a94a92015-10-01 16:20:04 +02009734 .id = snd_hda_id_realtek,
Takashi Iwai1289e9e2008-11-27 15:47:11 +01009735};
9736
Takashi Iwaid8a766a2015-02-17 15:25:37 +01009737module_hda_codec_driver(realtek_driver);