blob: a7544b77d3f7cca63a3492fc895097348701877e [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 Iwai4a79ba32009-04-22 16:31:35 +020032/* extra amp-initialization sequence types */
33enum {
Takashi Iwai1c76aa52018-06-21 16:37:54 +020034 ALC_INIT_UNDEFINED,
Takashi Iwai4a79ba32009-04-22 16:31:35 +020035 ALC_INIT_NONE,
36 ALC_INIT_DEFAULT,
Takashi Iwai4a79ba32009-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
Takashi Iwai766538a2020-06-18 13:08:41 +020070struct alc_coef_led {
71 unsigned int idx;
72 unsigned int mask;
73 unsigned int on;
74 unsigned int off;
75};
76
Linus Torvalds1da177e2005-04-16 15:20:36 -070077struct alc_spec {
Takashi Iwai08c189f2012-12-19 15:22:24 +010078 struct hda_gen_spec gen; /* must be at head */
Takashi Iwai23d30f22012-05-07 17:17:32 +020079
Linus Torvalds1da177e2005-04-16 15:20:36 -070080 /* codec parameterization */
Kailang Yangda00c242010-03-19 11:23:45 +010081 struct alc_customize_define cdefine;
Takashi Iwai08c189f2012-12-19 15:22:24 +010082 unsigned int parse_flags; /* flag for snd_hda_parse_pin_defcfg() */
83
Takashi Iwai5579cd62018-06-19 22:22:41 +020084 /* GPIO bits */
85 unsigned int gpio_mask;
86 unsigned int gpio_dir;
87 unsigned int gpio_data;
Takashi Iwai215c8502018-06-19 22:34:26 +020088 bool gpio_write_delay; /* add a delay before writing gpio_data */
Takashi Iwai5579cd62018-06-19 22:22:41 +020089
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +020090 /* mute LED for HP laptops, see vref_mute_led_set() */
Takashi Iwai08fb0d02013-01-10 17:33:58 +010091 int mute_led_polarity;
Kai-Heng Fengdbd13172020-04-30 16:32:51 +080092 int micmute_led_polarity;
Takashi Iwai08fb0d02013-01-10 17:33:58 +010093 hda_nid_t mute_led_nid;
Kailang Yang9c5dc3b2014-06-19 16:11:36 +080094 hda_nid_t cap_mute_led_nid;
Takashi Iwai08fb0d02013-01-10 17:33:58 +010095
Takashi Iwai0f32fd192014-11-19 12:16:14 +010096 unsigned int gpio_mute_led_mask;
97 unsigned int gpio_mic_led_mask;
Takashi Iwai766538a2020-06-18 13:08:41 +020098 struct alc_coef_led mute_led_coef;
99 struct alc_coef_led mic_led_coef;
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +0100100
David Henningsson73bdd592013-04-15 15:44:14 +0200101 hda_nid_t headset_mic_pin;
102 hda_nid_t headphone_mic_pin;
103 int current_headset_mode;
104 int current_headset_type;
105
Takashi Iwaiae6b8132006-03-03 16:47:17 +0100106 /* hooks */
107 void (*init_hook)(struct hda_codec *codec);
Takashi Iwai83012a72012-08-24 18:38:08 +0200108#ifdef CONFIG_PM
Daniel T Chenc97259d2009-12-27 18:52:08 -0500109 void (*power_hook)(struct hda_codec *codec);
Hector Martinf5de24b2009-12-20 22:51:31 +0100110#endif
Takashi Iwai1c7161532011-04-07 10:37:16 +0200111 void (*shutup)(struct hda_codec *codec);
Takashi Iwai70a09762015-12-15 14:59:58 +0100112 void (*reboot_notify)(struct hda_codec *codec);
Takashi Iwaid922b512011-04-28 12:18:53 +0200113
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200114 int init_amp;
Takashi Iwaid433a672010-09-20 15:11:54 +0200115 int codec_variant; /* flag for other variants */
Kailang Yang97a26572013-11-29 00:35:26 -0500116 unsigned int has_alc5505_dsp:1;
117 unsigned int no_depop_delay:1;
Kailang Yang693abe12019-01-29 15:38:21 +0800118 unsigned int done_hp_init:1;
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +0100119 unsigned int no_shutup_pins:1;
Kailang Yangd3ba58b2019-05-06 15:09:42 +0800120 unsigned int ultra_low_power:1;
Hui Wang476c02e2020-03-29 16:20:18 +0800121 unsigned int has_hs_key:1;
Kailang Yang92666d42020-11-19 17:04:21 +0800122 unsigned int no_internal_mic_pin:1;
Takashi Iwaie64f14f2009-01-20 18:32:55 +0100123
Takashi Iwai2c3bf9a2008-06-04 12:39:38 +0200124 /* for PLL fix */
125 hda_nid_t pll_nid;
126 unsigned int pll_coef_idx, pll_coef_bit;
Takashi Iwai1bb7e432011-10-17 16:50:59 +0200127 unsigned int coef0;
David Henningsson33f4acd2015-01-07 15:50:13 +0100128 struct input_dev *kb_dev;
Hui Wangc7b60a82015-12-28 11:35:25 +0800129 u8 alc_mute_keycode_map[1];
Kailang Yangdf694da2005-12-05 19:42:22 +0100130};
131
Takashi Iwai23f0c042009-02-26 13:03:58 +0100132/*
Takashi Iwaif2a227c2014-08-18 13:35:22 +0200133 * COEF access helper functions
134 */
135
136static int alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
137 unsigned int coef_idx)
138{
139 unsigned int val;
140
141 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
142 val = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PROC_COEF, 0);
143 return val;
144}
145
146#define alc_read_coef_idx(codec, coef_idx) \
147 alc_read_coefex_idx(codec, 0x20, coef_idx)
148
149static void alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
150 unsigned int coef_idx, unsigned int coef_val)
151{
152 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
153 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PROC_COEF, coef_val);
154}
155
156#define alc_write_coef_idx(codec, coef_idx, coef_val) \
157 alc_write_coefex_idx(codec, 0x20, coef_idx, coef_val)
158
Takashi Iwai98b24882014-08-18 13:47:50 +0200159static void alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
160 unsigned int coef_idx, unsigned int mask,
161 unsigned int bits_set)
162{
163 unsigned int val = alc_read_coefex_idx(codec, nid, coef_idx);
164
165 if (val != -1)
166 alc_write_coefex_idx(codec, nid, coef_idx,
167 (val & ~mask) | bits_set);
168}
169
170#define alc_update_coef_idx(codec, coef_idx, mask, bits_set) \
171 alc_update_coefex_idx(codec, 0x20, coef_idx, mask, bits_set)
172
Takashi Iwaif2a227c2014-08-18 13:35:22 +0200173/* a special bypass for COEF 0; read the cached value at the second time */
174static unsigned int alc_get_coef0(struct hda_codec *codec)
175{
176 struct alc_spec *spec = codec->spec;
177
178 if (!spec->coef0)
179 spec->coef0 = alc_read_coef_idx(codec, 0);
180 return spec->coef0;
181}
182
Takashi Iwai54db6c32014-08-18 15:11:19 +0200183/* coef writes/updates batch */
184struct coef_fw {
185 unsigned char nid;
186 unsigned char idx;
187 unsigned short mask;
188 unsigned short val;
189};
190
191#define UPDATE_COEFEX(_nid, _idx, _mask, _val) \
192 { .nid = (_nid), .idx = (_idx), .mask = (_mask), .val = (_val) }
193#define WRITE_COEFEX(_nid, _idx, _val) UPDATE_COEFEX(_nid, _idx, -1, _val)
194#define WRITE_COEF(_idx, _val) WRITE_COEFEX(0x20, _idx, _val)
195#define UPDATE_COEF(_idx, _mask, _val) UPDATE_COEFEX(0x20, _idx, _mask, _val)
196
197static void alc_process_coef_fw(struct hda_codec *codec,
198 const struct coef_fw *fw)
199{
200 for (; fw->nid; fw++) {
201 if (fw->mask == (unsigned short)-1)
202 alc_write_coefex_idx(codec, fw->nid, fw->idx, fw->val);
203 else
204 alc_update_coefex_idx(codec, fw->nid, fw->idx,
205 fw->mask, fw->val);
206 }
207}
208
Takashi Iwaif2a227c2014-08-18 13:35:22 +0200209/*
Takashi Iwai1d045db2011-07-07 18:23:21 +0200210 * GPIO setup tables, used in initialization
Kailang Yangdf694da2005-12-05 19:42:22 +0100211 */
Takashi Iwai5579cd62018-06-19 22:22:41 +0200212
Kailang Yangbc9f98a2007-04-12 13:06:07 +0200213/* Enable GPIO mask and set output */
Takashi Iwai5579cd62018-06-19 22:22:41 +0200214static void alc_setup_gpio(struct hda_codec *codec, unsigned int mask)
215{
216 struct alc_spec *spec = codec->spec;
Kailang Yangbc9f98a2007-04-12 13:06:07 +0200217
Takashi Iwai5579cd62018-06-19 22:22:41 +0200218 spec->gpio_mask |= mask;
219 spec->gpio_dir |= mask;
220 spec->gpio_data |= mask;
221}
Kailang Yangbc9f98a2007-04-12 13:06:07 +0200222
Takashi Iwai5579cd62018-06-19 22:22:41 +0200223static void alc_write_gpio_data(struct hda_codec *codec)
224{
225 struct alc_spec *spec = codec->spec;
226
227 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
228 spec->gpio_data);
229}
230
Takashi Iwaiaaf312d2018-06-19 22:28:22 +0200231static void alc_update_gpio_data(struct hda_codec *codec, unsigned int mask,
232 bool on)
233{
234 struct alc_spec *spec = codec->spec;
235 unsigned int oldval = spec->gpio_data;
236
237 if (on)
238 spec->gpio_data |= mask;
239 else
240 spec->gpio_data &= ~mask;
241 if (oldval != spec->gpio_data)
242 alc_write_gpio_data(codec);
243}
244
Takashi Iwai5579cd62018-06-19 22:22:41 +0200245static void alc_write_gpio(struct hda_codec *codec)
246{
247 struct alc_spec *spec = codec->spec;
248
249 if (!spec->gpio_mask)
250 return;
251
252 snd_hda_codec_write(codec, codec->core.afg, 0,
253 AC_VERB_SET_GPIO_MASK, spec->gpio_mask);
254 snd_hda_codec_write(codec, codec->core.afg, 0,
255 AC_VERB_SET_GPIO_DIRECTION, spec->gpio_dir);
Takashi Iwai215c8502018-06-19 22:34:26 +0200256 if (spec->gpio_write_delay)
257 msleep(1);
Takashi Iwai5579cd62018-06-19 22:22:41 +0200258 alc_write_gpio_data(codec);
259}
260
261static void alc_fixup_gpio(struct hda_codec *codec, int action,
262 unsigned int mask)
263{
264 if (action == HDA_FIXUP_ACT_PRE_PROBE)
265 alc_setup_gpio(codec, mask);
266}
267
268static void alc_fixup_gpio1(struct hda_codec *codec,
269 const struct hda_fixup *fix, int action)
270{
271 alc_fixup_gpio(codec, action, 0x01);
272}
273
274static void alc_fixup_gpio2(struct hda_codec *codec,
275 const struct hda_fixup *fix, int action)
276{
277 alc_fixup_gpio(codec, action, 0x02);
278}
279
280static void alc_fixup_gpio3(struct hda_codec *codec,
281 const struct hda_fixup *fix, int action)
282{
283 alc_fixup_gpio(codec, action, 0x03);
284}
Kailang Yangbdd148a2007-05-08 15:19:08 +0200285
Takashi Iwaiae065f12018-06-19 23:00:03 +0200286static void alc_fixup_gpio4(struct hda_codec *codec,
287 const struct hda_fixup *fix, int action)
288{
289 alc_fixup_gpio(codec, action, 0x04);
290}
291
Takashi Iwai8a503552020-06-18 13:08:32 +0200292static void alc_fixup_micmute_led(struct hda_codec *codec,
293 const struct hda_fixup *fix, int action)
294{
295 if (action == HDA_FIXUP_ACT_PROBE)
296 snd_hda_gen_add_micmute_led_cdev(codec, NULL);
297}
298
Takashi Iwai2c3bf9a2008-06-04 12:39:38 +0200299/*
300 * Fix hardware PLL issue
301 * On some codecs, the analog PLL gating control must be off while
302 * the default value is 1.
303 */
304static void alc_fix_pll(struct hda_codec *codec)
305{
306 struct alc_spec *spec = codec->spec;
Takashi Iwai2c3bf9a2008-06-04 12:39:38 +0200307
Takashi Iwai98b24882014-08-18 13:47:50 +0200308 if (spec->pll_nid)
309 alc_update_coefex_idx(codec, spec->pll_nid, spec->pll_coef_idx,
310 1 << spec->pll_coef_bit, 0);
Takashi Iwai2c3bf9a2008-06-04 12:39:38 +0200311}
312
313static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
314 unsigned int coef_idx, unsigned int coef_bit)
315{
316 struct alc_spec *spec = codec->spec;
317 spec->pll_nid = nid;
318 spec->pll_coef_idx = coef_idx;
319 spec->pll_coef_bit = coef_bit;
320 alc_fix_pll(codec);
321}
322
Takashi Iwaicf5a2272012-02-20 16:31:07 +0100323/* update the master volume per volume-knob's unsol event */
Takashi Iwai1a4f69d2014-09-11 15:22:46 +0200324static void alc_update_knob_master(struct hda_codec *codec,
325 struct hda_jack_callback *jack)
Takashi Iwaicf5a2272012-02-20 16:31:07 +0100326{
327 unsigned int val;
328 struct snd_kcontrol *kctl;
329 struct snd_ctl_elem_value *uctl;
330
331 kctl = snd_hda_find_mixer_ctl(codec, "Master Playback Volume");
332 if (!kctl)
333 return;
334 uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
335 if (!uctl)
336 return;
Takashi Iwai2ebab402016-02-09 10:23:52 +0100337 val = snd_hda_codec_read(codec, jack->nid, 0,
Takashi Iwaicf5a2272012-02-20 16:31:07 +0100338 AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
339 val &= HDA_AMP_VOLMASK;
340 uctl->value.integer.value[0] = val;
341 uctl->value.integer.value[1] = val;
342 kctl->put(kctl, uctl);
343 kfree(uctl);
344}
345
David Henningsson29adc4b2012-09-25 11:31:00 +0200346static void alc880_unsol_event(struct hda_codec *codec, unsigned int res)
Takashi Iwaif21d78e2012-01-19 12:10:29 +0100347{
David Henningsson29adc4b2012-09-25 11:31:00 +0200348 /* For some reason, the res given from ALC880 is broken.
349 Here we adjust it properly. */
350 snd_hda_jack_unsol_event(codec, res >> 2);
Takashi Iwaif21d78e2012-01-19 12:10:29 +0100351}
352
Kailang Yang394c97f2014-11-12 17:38:08 +0800353/* Change EAPD to verb control */
354static void alc_fill_eapd_coef(struct hda_codec *codec)
355{
356 int coef;
357
358 coef = alc_get_coef0(codec);
359
Takashi Iwai7639a062015-03-03 10:07:24 +0100360 switch (codec->core.vendor_id) {
Kailang Yang394c97f2014-11-12 17:38:08 +0800361 case 0x10ec0262:
362 alc_update_coef_idx(codec, 0x7, 0, 1<<5);
363 break;
364 case 0x10ec0267:
365 case 0x10ec0268:
366 alc_update_coef_idx(codec, 0x7, 0, 1<<13);
367 break;
368 case 0x10ec0269:
369 if ((coef & 0x00f0) == 0x0010)
370 alc_update_coef_idx(codec, 0xd, 0, 1<<14);
371 if ((coef & 0x00f0) == 0x0020)
372 alc_update_coef_idx(codec, 0x4, 1<<15, 0);
373 if ((coef & 0x00f0) == 0x0030)
374 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
375 break;
376 case 0x10ec0280:
377 case 0x10ec0284:
378 case 0x10ec0290:
379 case 0x10ec0292:
380 alc_update_coef_idx(codec, 0x4, 1<<15, 0);
381 break;
Kailang Yang42314302016-02-03 15:03:50 +0800382 case 0x10ec0225:
Takashi Iwai44be77c2017-12-27 08:53:59 +0100383 case 0x10ec0295:
384 case 0x10ec0299:
385 alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
Gustavo A. R. Silvac0dbbda2020-07-08 15:32:36 -0500386 fallthrough;
Takashi Iwai44be77c2017-12-27 08:53:59 +0100387 case 0x10ec0215:
Kailang Yang394c97f2014-11-12 17:38:08 +0800388 case 0x10ec0233:
Kailang Yangea04a1d2018-04-25 15:31:52 +0800389 case 0x10ec0235:
Thomas Hebbc4473742020-03-30 12:09:38 -0400390 case 0x10ec0236:
Kailang Yang7fbdcd82020-04-23 14:18:31 +0800391 case 0x10ec0245:
Kailang Yang394c97f2014-11-12 17:38:08 +0800392 case 0x10ec0255:
Thomas Hebbc4473742020-03-30 12:09:38 -0400393 case 0x10ec0256:
Kailang Yangf429e7e2017-12-05 15:38:24 +0800394 case 0x10ec0257:
Kailang Yang394c97f2014-11-12 17:38:08 +0800395 case 0x10ec0282:
396 case 0x10ec0283:
397 case 0x10ec0286:
Kailang Yang630e3612020-05-27 14:10:26 +0800398 case 0x10ec0287:
Kailang Yang394c97f2014-11-12 17:38:08 +0800399 case 0x10ec0288:
Kailang Yang0a6f0602017-06-30 16:00:48 +0800400 case 0x10ec0285:
Kailang Yang506b62c2014-12-18 17:07:44 +0800401 case 0x10ec0298:
Kailang Yang0a6f0602017-06-30 16:00:48 +0800402 case 0x10ec0289:
Kailang Yang1078bef2018-11-08 16:36:15 +0800403 case 0x10ec0300:
Kailang Yang394c97f2014-11-12 17:38:08 +0800404 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
405 break;
Kailang Yang3aabf942017-11-08 15:28:33 +0800406 case 0x10ec0275:
407 alc_update_coef_idx(codec, 0xe, 0, 1<<0);
408 break;
Kailang Yang394c97f2014-11-12 17:38:08 +0800409 case 0x10ec0293:
410 alc_update_coef_idx(codec, 0xa, 1<<13, 0);
411 break;
Kailang Yangdcd4f0d2016-05-04 15:50:18 +0800412 case 0x10ec0234:
413 case 0x10ec0274:
414 case 0x10ec0294:
Kailang Yang6fbae352016-05-30 16:44:20 +0800415 case 0x10ec0700:
416 case 0x10ec0701:
417 case 0x10ec0703:
Kailang Yang83629532019-05-02 16:03:26 +0800418 case 0x10ec0711:
Kailang Yangdcd4f0d2016-05-04 15:50:18 +0800419 alc_update_coef_idx(codec, 0x10, 1<<15, 0);
420 break;
Kailang Yang394c97f2014-11-12 17:38:08 +0800421 case 0x10ec0662:
422 if ((coef & 0x00f0) == 0x0030)
423 alc_update_coef_idx(codec, 0x4, 1<<10, 0); /* EAPD Ctrl */
424 break;
425 case 0x10ec0272:
426 case 0x10ec0273:
427 case 0x10ec0663:
428 case 0x10ec0665:
429 case 0x10ec0670:
430 case 0x10ec0671:
431 case 0x10ec0672:
432 alc_update_coef_idx(codec, 0xd, 0, 1<<14); /* EAPD Ctrl */
433 break;
Kailang Yang9194a1e2020-01-07 17:22:19 +0800434 case 0x10ec0222:
Kailang Yangf0778872019-10-24 15:13:32 +0800435 case 0x10ec0623:
436 alc_update_coef_idx(codec, 0x19, 1<<13, 0);
437 break;
Kailang Yang394c97f2014-11-12 17:38:08 +0800438 case 0x10ec0668:
439 alc_update_coef_idx(codec, 0x7, 3<<13, 0);
440 break;
441 case 0x10ec0867:
442 alc_update_coef_idx(codec, 0x4, 1<<10, 0);
443 break;
444 case 0x10ec0888:
445 if ((coef & 0x00f0) == 0x0020 || (coef & 0x00f0) == 0x0030)
446 alc_update_coef_idx(codec, 0x7, 1<<5, 0);
447 break;
448 case 0x10ec0892:
Kailang Yange5782a52020-11-27 14:39:23 +0800449 case 0x10ec0897:
Kailang Yang394c97f2014-11-12 17:38:08 +0800450 alc_update_coef_idx(codec, 0x7, 1<<5, 0);
451 break;
452 case 0x10ec0899:
453 case 0x10ec0900:
Kailang Yang6d9ffcf2020-01-03 16:24:06 +0800454 case 0x10ec0b00:
Kailang Yang65553b12017-07-11 15:15:47 +0800455 case 0x10ec1168:
Kailang Yanga535ad52017-01-16 16:59:26 +0800456 case 0x10ec1220:
Kailang Yang394c97f2014-11-12 17:38:08 +0800457 alc_update_coef_idx(codec, 0x7, 1<<1, 0);
458 break;
459 }
460}
461
Kailang Yangf9423e72008-05-27 12:32:25 +0200462/* additional initialization for ALC888 variants */
463static void alc888_coef_init(struct hda_codec *codec)
464{
Kailang Yang1df88742014-10-29 16:10:13 +0800465 switch (alc_get_coef0(codec) & 0x00f0) {
466 /* alc888-VA */
467 case 0x00:
468 /* alc888-VB */
469 case 0x10:
470 alc_update_coef_idx(codec, 7, 0, 0x2030); /* Turn EAPD to High */
471 break;
472 }
Jaroslav Kysela87a8c372009-07-23 10:58:29 +0200473}
474
Takashi Iwai3fb4a502010-01-19 15:46:37 +0100475/* turn on/off EAPD control (only if available) */
476static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
477{
478 if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
479 return;
480 if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
481 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
482 on ? 2 : 0);
483}
484
Takashi Iwai691f1fc2011-04-07 10:31:43 +0200485/* turn on/off EAPD controls of the codec */
486static void alc_auto_setup_eapd(struct hda_codec *codec, bool on)
487{
488 /* We currently only handle front, HP */
Michał Mirosławcaf3c042020-01-03 10:23:48 +0100489 static const hda_nid_t pins[] = {
Hui Wangaf95b412015-03-26 17:14:55 +0800490 0x0f, 0x10, 0x14, 0x15, 0x17, 0
Takashi Iwai39fa84e2011-06-27 15:28:57 +0200491 };
Michał Mirosławcaf3c042020-01-03 10:23:48 +0100492 const hda_nid_t *p;
Takashi Iwai39fa84e2011-06-27 15:28:57 +0200493 for (p = pins; *p; p++)
494 set_eapd(codec, *p, on);
Takashi Iwai691f1fc2011-04-07 10:31:43 +0200495}
496
Kailang Yangdad31972019-05-10 16:28:57 +0800497static int find_ext_mic_pin(struct hda_codec *codec);
498
499static void alc_headset_mic_no_shutup(struct hda_codec *codec)
500{
501 const struct hda_pincfg *pin;
502 int mic_pin = find_ext_mic_pin(codec);
503 int i;
504
505 /* don't shut up pins when unloading the driver; otherwise it breaks
506 * the default pin setup at the next load of the driver
507 */
508 if (codec->bus->shutdown)
509 return;
510
511 snd_array_for_each(&codec->init_pins, i, pin) {
512 /* use read here for syncing after issuing each verb */
513 if (pin->nid != mic_pin)
514 snd_hda_codec_read(codec, pin->nid, 0,
515 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
516 }
517
518 codec->pins_shutup = 1;
519}
520
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +0100521static void alc_shutup_pins(struct hda_codec *codec)
522{
523 struct alc_spec *spec = codec->spec;
524
Kailang Yangdad31972019-05-10 16:28:57 +0800525 switch (codec->core.vendor_id) {
Kailang Yang66c5d712019-12-09 15:56:15 +0800526 case 0x10ec0283:
Kailang Yangdad31972019-05-10 16:28:57 +0800527 case 0x10ec0286:
528 case 0x10ec0288:
529 case 0x10ec0298:
530 alc_headset_mic_no_shutup(codec);
531 break;
532 default:
533 if (!spec->no_shutup_pins)
534 snd_hda_shutup_pins(codec);
535 break;
536 }
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +0100537}
538
Takashi Iwai1c7161532011-04-07 10:37:16 +0200539/* generic shutup callback;
Lars-Peter Clausen4ce8e6a2016-11-08 15:48:06 +0100540 * just turning off EAPD and a little pause for avoiding pop-noise
Takashi Iwai1c7161532011-04-07 10:37:16 +0200541 */
542static void alc_eapd_shutup(struct hda_codec *codec)
543{
Kailang Yang97a26572013-11-29 00:35:26 -0500544 struct alc_spec *spec = codec->spec;
545
Takashi Iwai1c7161532011-04-07 10:37:16 +0200546 alc_auto_setup_eapd(codec, false);
Kailang Yang97a26572013-11-29 00:35:26 -0500547 if (!spec->no_depop_delay)
548 msleep(200);
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +0100549 alc_shutup_pins(codec);
Takashi Iwai1c7161532011-04-07 10:37:16 +0200550}
551
Takashi Iwai1d045db2011-07-07 18:23:21 +0200552/* generic EAPD initialization */
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200553static void alc_auto_init_amp(struct hda_codec *codec, int type)
Kailang Yangbc9f98a2007-04-12 13:06:07 +0200554{
Takashi Iwai39fa84e2011-06-27 15:28:57 +0200555 alc_auto_setup_eapd(codec, true);
Takashi Iwai5579cd62018-06-19 22:22:41 +0200556 alc_write_gpio(codec);
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200557 switch (type) {
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200558 case ALC_INIT_DEFAULT:
Takashi Iwai7639a062015-03-03 10:07:24 +0100559 switch (codec->core.vendor_id) {
Kailang Yangc9b58002007-10-16 14:30:01 +0200560 case 0x10ec0260:
Takashi Iwai98b24882014-08-18 13:47:50 +0200561 alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x2010);
Kailang Yangc9b58002007-10-16 14:30:01 +0200562 break;
Kailang Yangc9b58002007-10-16 14:30:01 +0200563 case 0x10ec0880:
564 case 0x10ec0882:
565 case 0x10ec0883:
566 case 0x10ec0885:
Kailang Yang1df88742014-10-29 16:10:13 +0800567 alc_update_coef_idx(codec, 7, 0, 0x2030);
Kailang Yangc9b58002007-10-16 14:30:01 +0200568 break;
Kailang Yangf9423e72008-05-27 12:32:25 +0200569 case 0x10ec0888:
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200570 alc888_coef_init(codec);
Kailang Yangf9423e72008-05-27 12:32:25 +0200571 break;
Kailang Yangbc9f98a2007-04-12 13:06:07 +0200572 }
Kailang Yangbc9f98a2007-04-12 13:06:07 +0200573 break;
574 }
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200575}
Kailang Yangea1fb292008-08-26 12:58:38 +0200576
Takashi Iwai35a39f92019-02-01 11:19:50 +0100577/* get a primary headphone pin if available */
578static hda_nid_t alc_get_hp_pin(struct alc_spec *spec)
579{
580 if (spec->gen.autocfg.hp_pins[0])
581 return spec->gen.autocfg.hp_pins[0];
582 if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
583 return spec->gen.autocfg.line_out_pins[0];
584 return 0;
585}
Takashi Iwai1d045db2011-07-07 18:23:21 +0200586
587/*
588 * Realtek SSID verification
589 */
590
David Henningsson90622912010-10-14 14:50:18 +0200591/* Could be any non-zero and even value. When used as fixup, tells
592 * the driver to ignore any present sku defines.
593 */
594#define ALC_FIXUP_SKU_IGNORE (2)
595
Takashi Iwai23d30f22012-05-07 17:17:32 +0200596static void alc_fixup_sku_ignore(struct hda_codec *codec,
597 const struct hda_fixup *fix, int action)
598{
599 struct alc_spec *spec = codec->spec;
600 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
601 spec->cdefine.fixup = 1;
602 spec->cdefine.sku_cfg = ALC_FIXUP_SKU_IGNORE;
603 }
604}
605
Mengdong Linb5c66112013-11-29 00:35:35 -0500606static void alc_fixup_no_depop_delay(struct hda_codec *codec,
607 const struct hda_fixup *fix, int action)
608{
609 struct alc_spec *spec = codec->spec;
610
Mengdong Lin84d2dc32013-12-02 22:26:03 -0500611 if (action == HDA_FIXUP_ACT_PROBE) {
Mengdong Linb5c66112013-11-29 00:35:35 -0500612 spec->no_depop_delay = 1;
Mengdong Lin84d2dc32013-12-02 22:26:03 -0500613 codec->depop_delay = 0;
614 }
Mengdong Linb5c66112013-11-29 00:35:35 -0500615}
616
Kailang Yangda00c242010-03-19 11:23:45 +0100617static int alc_auto_parse_customize_define(struct hda_codec *codec)
618{
619 unsigned int ass, tmp, i;
Takashi Iwai7fb56222010-03-22 17:09:47 +0100620 unsigned nid = 0;
Kailang Yangda00c242010-03-19 11:23:45 +0100621 struct alc_spec *spec = codec->spec;
622
Takashi Iwaib6cbe512010-07-28 17:43:36 +0200623 spec->cdefine.enable_pcbeep = 1; /* assume always enabled */
624
David Henningsson90622912010-10-14 14:50:18 +0200625 if (spec->cdefine.fixup) {
626 ass = spec->cdefine.sku_cfg;
627 if (ass == ALC_FIXUP_SKU_IGNORE)
628 return -1;
629 goto do_sku;
630 }
631
Takashi Iwai5100cd02014-02-15 10:03:19 +0100632 if (!codec->bus->pci)
633 return -1;
Takashi Iwai7639a062015-03-03 10:07:24 +0100634 ass = codec->core.subsystem_id & 0xffff;
Takashi Iwaib6cbe512010-07-28 17:43:36 +0200635 if (ass != codec->bus->pci->subsystem_device && (ass & 1))
Kailang Yangda00c242010-03-19 11:23:45 +0100636 goto do_sku;
637
638 nid = 0x1d;
Takashi Iwai7639a062015-03-03 10:07:24 +0100639 if (codec->core.vendor_id == 0x10ec0260)
Kailang Yangda00c242010-03-19 11:23:45 +0100640 nid = 0x17;
641 ass = snd_hda_codec_get_pincfg(codec, nid);
642
643 if (!(ass & 1)) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100644 codec_info(codec, "%s: SKU not ready 0x%08x\n",
Takashi Iwai7639a062015-03-03 10:07:24 +0100645 codec->core.chip_name, ass);
Kailang Yangda00c242010-03-19 11:23:45 +0100646 return -1;
647 }
648
649 /* check sum */
650 tmp = 0;
651 for (i = 1; i < 16; i++) {
652 if ((ass >> i) & 1)
653 tmp++;
654 }
655 if (((ass >> 16) & 0xf) != tmp)
656 return -1;
657
658 spec->cdefine.port_connectivity = ass >> 30;
659 spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
660 spec->cdefine.check_sum = (ass >> 16) & 0xf;
661 spec->cdefine.customization = ass >> 8;
662do_sku:
663 spec->cdefine.sku_cfg = ass;
664 spec->cdefine.external_amp = (ass & 0x38) >> 3;
665 spec->cdefine.platform_type = (ass & 0x4) >> 2;
666 spec->cdefine.swap = (ass & 0x2) >> 1;
667 spec->cdefine.override = ass & 0x1;
668
Takashi Iwai4e76a882014-02-25 12:21:03 +0100669 codec_dbg(codec, "SKU: Nid=0x%x sku_cfg=0x%08x\n",
Kailang Yangda00c242010-03-19 11:23:45 +0100670 nid, spec->cdefine.sku_cfg);
Takashi Iwai4e76a882014-02-25 12:21:03 +0100671 codec_dbg(codec, "SKU: port_connectivity=0x%x\n",
Kailang Yangda00c242010-03-19 11:23:45 +0100672 spec->cdefine.port_connectivity);
Takashi Iwai4e76a882014-02-25 12:21:03 +0100673 codec_dbg(codec, "SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
674 codec_dbg(codec, "SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
675 codec_dbg(codec, "SKU: customization=0x%08x\n", spec->cdefine.customization);
676 codec_dbg(codec, "SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
677 codec_dbg(codec, "SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
678 codec_dbg(codec, "SKU: swap=0x%x\n", spec->cdefine.swap);
679 codec_dbg(codec, "SKU: override=0x%x\n", spec->cdefine.override);
Kailang Yangda00c242010-03-19 11:23:45 +0100680
681 return 0;
682}
683
Takashi Iwai08c189f2012-12-19 15:22:24 +0100684/* return the position of NID in the list, or -1 if not found */
685static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
686{
687 int i;
688 for (i = 0; i < nums; i++)
689 if (list[i] == nid)
690 return i;
691 return -1;
692}
Takashi Iwai1d045db2011-07-07 18:23:21 +0200693/* return true if the given NID is found in the list */
Takashi Iwai3af9ee62011-06-27 12:34:01 +0200694static bool found_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
695{
Takashi Iwai21268962011-07-07 15:01:13 +0200696 return find_idx_in_nid_list(nid, list, nums) >= 0;
Takashi Iwai3af9ee62011-06-27 12:34:01 +0200697}
698
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200699/* check subsystem ID and set up device-specific initialization;
700 * return 1 if initialized, 0 if invalid SSID
701 */
702/* 32-bit subsystem ID for BIOS loading in HD Audio codec.
703 * 31 ~ 16 : Manufacture ID
704 * 15 ~ 8 : SKU ID
705 * 7 ~ 0 : Assembly ID
706 * port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
707 */
Takashi Iwai58c57cf2014-01-07 18:22:49 +0100708static int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports)
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200709{
710 unsigned int ass, tmp, i;
711 unsigned nid;
712 struct alc_spec *spec = codec->spec;
713
David Henningsson90622912010-10-14 14:50:18 +0200714 if (spec->cdefine.fixup) {
715 ass = spec->cdefine.sku_cfg;
716 if (ass == ALC_FIXUP_SKU_IGNORE)
717 return 0;
718 goto do_sku;
719 }
720
Takashi Iwai7639a062015-03-03 10:07:24 +0100721 ass = codec->core.subsystem_id & 0xffff;
Takashi Iwai5100cd02014-02-15 10:03:19 +0100722 if (codec->bus->pci &&
723 ass != codec->bus->pci->subsystem_device && (ass & 1))
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200724 goto do_sku;
725
726 /* invalid SSID, check the special NID pin defcfg instead */
727 /*
Sasha Alexandrdef319f2009-06-16 16:00:15 -0400728 * 31~30 : port connectivity
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200729 * 29~21 : reserve
730 * 20 : PCBEEP input
731 * 19~16 : Check sum (15:1)
732 * 15~1 : Custom
733 * 0 : override
734 */
735 nid = 0x1d;
Takashi Iwai7639a062015-03-03 10:07:24 +0100736 if (codec->core.vendor_id == 0x10ec0260)
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200737 nid = 0x17;
738 ass = snd_hda_codec_get_pincfg(codec, nid);
Takashi Iwai4e76a882014-02-25 12:21:03 +0100739 codec_dbg(codec,
740 "realtek: No valid SSID, checking pincfg 0x%08x for NID 0x%x\n",
Takashi Iwaicb6605c2009-04-28 13:03:19 +0200741 ass, nid);
Kailang Yang6227cdc2010-02-25 08:36:52 +0100742 if (!(ass & 1))
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200743 return 0;
744 if ((ass >> 30) != 1) /* no physical connection */
745 return 0;
746
747 /* check sum */
748 tmp = 0;
749 for (i = 1; i < 16; i++) {
750 if ((ass >> i) & 1)
751 tmp++;
752 }
753 if (((ass >> 16) & 0xf) != tmp)
754 return 0;
755do_sku:
Takashi Iwai4e76a882014-02-25 12:21:03 +0100756 codec_dbg(codec, "realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
Takashi Iwai7639a062015-03-03 10:07:24 +0100757 ass & 0xffff, codec->core.vendor_id);
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200758 /*
759 * 0 : override
760 * 1 : Swap Jack
761 * 2 : 0 --> Desktop, 1 --> Laptop
762 * 3~5 : External Amplifier control
763 * 7~6 : Reserved
764 */
765 tmp = (ass & 0x38) >> 3; /* external Amp control */
Takashi Iwai1c76aa52018-06-21 16:37:54 +0200766 if (spec->init_amp == ALC_INIT_UNDEFINED) {
767 switch (tmp) {
768 case 1:
Takashi Iwai5579cd62018-06-19 22:22:41 +0200769 alc_setup_gpio(codec, 0x01);
Takashi Iwai1c76aa52018-06-21 16:37:54 +0200770 break;
771 case 3:
Takashi Iwai5579cd62018-06-19 22:22:41 +0200772 alc_setup_gpio(codec, 0x02);
Takashi Iwai1c76aa52018-06-21 16:37:54 +0200773 break;
774 case 7:
Takashi Iwai5579cd62018-06-19 22:22:41 +0200775 alc_setup_gpio(codec, 0x03);
Takashi Iwai1c76aa52018-06-21 16:37:54 +0200776 break;
777 case 5:
778 default:
779 spec->init_amp = ALC_INIT_DEFAULT;
780 break;
781 }
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200782 }
783
784 /* is laptop or Desktop and enable the function "Mute internal speaker
785 * when the external headphone out jack is plugged"
786 */
787 if (!(ass & 0x8000))
788 return 1;
789 /*
790 * 10~8 : Jack location
791 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
792 * 14~13: Resvered
793 * 15 : 1 --> enable the function "Mute internal speaker
794 * when the external headphone out jack is plugged"
795 */
Takashi Iwai35a39f92019-02-01 11:19:50 +0100796 if (!alc_get_hp_pin(spec)) {
Takashi Iwai01d48252009-10-06 13:21:54 +0200797 hda_nid_t nid;
Kailang Yangc9b58002007-10-16 14:30:01 +0200798 tmp = (ass >> 11) & 0x3; /* HP to chassis */
Takashi Iwai58c57cf2014-01-07 18:22:49 +0100799 nid = ports[tmp];
Takashi Iwai08c189f2012-12-19 15:22:24 +0100800 if (found_in_nid_list(nid, spec->gen.autocfg.line_out_pins,
801 spec->gen.autocfg.line_outs))
Takashi Iwai3af9ee62011-06-27 12:34:01 +0200802 return 1;
Takashi Iwai08c189f2012-12-19 15:22:24 +0100803 spec->gen.autocfg.hp_pins[0] = nid;
Kailang Yangc9b58002007-10-16 14:30:01 +0200804 }
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200805 return 1;
806}
Kailang Yangea1fb292008-08-26 12:58:38 +0200807
Takashi Iwai3e6179b2011-07-08 16:55:13 +0200808/* Check the validity of ALC subsystem-id
809 * ports contains an array of 4 pin NIDs for port-A, E, D and I */
810static void alc_ssid_check(struct hda_codec *codec, const hda_nid_t *ports)
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200811{
Takashi Iwai58c57cf2014-01-07 18:22:49 +0100812 if (!alc_subsystem_id(codec, ports)) {
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200813 struct alc_spec *spec = codec->spec;
Takashi Iwai67791202020-04-18 21:06:39 +0200814 if (spec->init_amp == ALC_INIT_UNDEFINED) {
815 codec_dbg(codec,
816 "realtek: Enable default setup for auto mode as fallback\n");
817 spec->init_amp = ALC_INIT_DEFAULT;
818 }
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200819 }
Takashi Iwai21268962011-07-07 15:01:13 +0200820}
Takashi Iwai1a1455d2011-04-28 17:36:18 +0200821
Takashi Iwai41e41f12005-06-08 14:48:49 +0200822/*
Takashi Iwai1d045db2011-07-07 18:23:21 +0200823 */
824
David Henningsson9d36a7d2014-10-07 10:18:42 +0200825static void alc_fixup_inv_dmic(struct hda_codec *codec,
826 const struct hda_fixup *fix, int action)
Takashi Iwai125821a2012-06-22 14:30:29 +0200827{
828 struct alc_spec *spec = codec->spec;
Takashi Iwai668d1e92012-11-29 14:10:17 +0100829
David Henningsson9d36a7d2014-10-07 10:18:42 +0200830 spec->gen.inv_dmic_split = 1;
Takashi Iwai6e72aa52012-06-25 10:52:25 +0200831}
832
Takashi Iwai603c4012008-07-30 15:01:44 +0200833
Takashi Iwai2eab6942012-12-18 15:30:41 +0100834static int alc_build_controls(struct hda_codec *codec)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700835{
Takashi Iwaia5cb4632018-06-20 12:50:11 +0200836 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700837
Takashi Iwai08c189f2012-12-19 15:22:24 +0100838 err = snd_hda_gen_build_controls(codec);
839 if (err < 0)
840 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700841
Takashi Iwai1727a772013-01-10 09:52:52 +0100842 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_BUILD);
Takashi Iwai420b0fe2012-03-12 12:35:27 +0100843 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700844}
845
Takashi Iwaie9edcee2005-06-13 14:16:38 +0200846
Linus Torvalds1da177e2005-04-16 15:20:36 -0700847/*
Takashi Iwaiae6b8132006-03-03 16:47:17 +0100848 * Common callbacks
Takashi Iwaie9edcee2005-06-13 14:16:38 +0200849 */
Takashi Iwai16ded522005-06-10 19:58:24 +0200850
Takashi Iwaic9af7532019-05-10 11:01:43 +0200851static void alc_pre_init(struct hda_codec *codec)
852{
853 alc_fill_eapd_coef(codec);
854}
855
Kailang Yangaeac1a02019-05-16 16:10:44 +0800856#define is_s3_resume(codec) \
857 ((codec)->core.dev.power.power_state.event == PM_EVENT_RESUME)
Takashi Iwaic9af7532019-05-10 11:01:43 +0200858#define is_s4_resume(codec) \
859 ((codec)->core.dev.power.power_state.event == PM_EVENT_RESTORE)
860
Linus Torvalds1da177e2005-04-16 15:20:36 -0700861static int alc_init(struct hda_codec *codec)
862{
863 struct alc_spec *spec = codec->spec;
Takashi Iwaie9edcee2005-06-13 14:16:38 +0200864
Takashi Iwaic9af7532019-05-10 11:01:43 +0200865 /* hibernation resume needs the full chip initialization */
866 if (is_s4_resume(codec))
867 alc_pre_init(codec);
868
Takashi Iwai546bb672012-03-07 08:37:19 +0100869 if (spec->init_hook)
870 spec->init_hook(codec);
Kailang Yang526af6e2012-03-07 08:25:20 +0100871
Takashi Iwai89781d02019-08-30 12:03:38 +0200872 spec->gen.skip_verbs = 1; /* applied in below */
Kailang Yang607ca3b2019-04-26 16:35:41 +0800873 snd_hda_gen_init(codec);
Takashi Iwai2c3bf9a2008-06-04 12:39:38 +0200874 alc_fix_pll(codec);
Takashi Iwai4a79ba32009-04-22 16:31:35 +0200875 alc_auto_init_amp(codec, spec->init_amp);
Takashi Iwai89781d02019-08-30 12:03:38 +0200876 snd_hda_apply_verbs(codec); /* apply verbs here after own init */
Takashi Iwai2c3bf9a2008-06-04 12:39:38 +0200877
Takashi Iwai1727a772013-01-10 09:52:52 +0100878 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT);
Takashi Iwaie08a0072006-09-07 17:52:14 +0200879
Linus Torvalds1da177e2005-04-16 15:20:36 -0700880 return 0;
881}
882
Takashi Iwaia4e09aa2009-12-27 11:22:24 +0100883static inline void alc_shutup(struct hda_codec *codec)
884{
Takashi Iwai1c7161532011-04-07 10:37:16 +0200885 struct alc_spec *spec = codec->spec;
886
Takashi Iwaic7273bd2018-06-12 16:09:57 +0200887 if (!snd_hda_get_bool_hint(codec, "shutup"))
888 return; /* disabled explicitly by hints */
889
Takashi Iwai1c7161532011-04-07 10:37:16 +0200890 if (spec && spec->shutup)
891 spec->shutup(codec);
Takashi Iwai9bfb2842013-07-24 14:31:50 +0200892 else
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +0100893 alc_shutup_pins(codec);
Takashi Iwaia4e09aa2009-12-27 11:22:24 +0100894}
895
Takashi Iwai70a09762015-12-15 14:59:58 +0100896static void alc_reboot_notify(struct hda_codec *codec)
897{
898 struct alc_spec *spec = codec->spec;
899
900 if (spec && spec->reboot_notify)
901 spec->reboot_notify(codec);
902 else
903 alc_shutup(codec);
904}
905
Takashi Iwai8a02c0c2014-02-10 18:09:45 +0100906#define alc_free snd_hda_gen_free
Linus Torvalds1da177e2005-04-16 15:20:36 -0700907
Takashi Iwai83012a72012-08-24 18:38:08 +0200908#ifdef CONFIG_PM
Daniel T Chenc97259d2009-12-27 18:52:08 -0500909static void alc_power_eapd(struct hda_codec *codec)
910{
Takashi Iwai691f1fc2011-04-07 10:31:43 +0200911 alc_auto_setup_eapd(codec, false);
Daniel T Chenc97259d2009-12-27 18:52:08 -0500912}
913
Takashi Iwai68cb2b52012-07-02 15:20:37 +0200914static int alc_suspend(struct hda_codec *codec)
Hector Martinf5de24b2009-12-20 22:51:31 +0100915{
916 struct alc_spec *spec = codec->spec;
Takashi Iwaia4e09aa2009-12-27 11:22:24 +0100917 alc_shutup(codec);
Hector Martinf5de24b2009-12-20 22:51:31 +0100918 if (spec && spec->power_hook)
Daniel T Chenc97259d2009-12-27 18:52:08 -0500919 spec->power_hook(codec);
Hector Martinf5de24b2009-12-20 22:51:31 +0100920 return 0;
921}
922#endif
923
Takashi Iwai2a439522011-07-26 09:52:50 +0200924#ifdef CONFIG_PM
Takashi Iwaie044c392008-10-27 16:56:24 +0100925static int alc_resume(struct hda_codec *codec)
926{
Kailang Yang97a26572013-11-29 00:35:26 -0500927 struct alc_spec *spec = codec->spec;
928
929 if (!spec->no_depop_delay)
930 msleep(150); /* to avoid pop noise */
Takashi Iwaie044c392008-10-27 16:56:24 +0100931 codec->patch_ops.init(codec);
Takashi Iwai1a462be2020-01-09 10:01:04 +0100932 snd_hda_regmap_sync(codec);
Takashi Iwai9e5341b2010-09-21 09:57:06 +0200933 hda_call_check_power_status(codec, 0x01);
Takashi Iwaie044c392008-10-27 16:56:24 +0100934 return 0;
935}
Takashi Iwaie044c392008-10-27 16:56:24 +0100936#endif
937
Linus Torvalds1da177e2005-04-16 15:20:36 -0700938/*
939 */
Takashi Iwaia9111322011-05-02 11:30:18 +0200940static const struct hda_codec_ops alc_patch_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700941 .build_controls = alc_build_controls,
Takashi Iwai08c189f2012-12-19 15:22:24 +0100942 .build_pcms = snd_hda_gen_build_pcms,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700943 .init = alc_init,
944 .free = alc_free,
David Henningsson29adc4b2012-09-25 11:31:00 +0200945 .unsol_event = snd_hda_jack_unsol_event,
Takashi Iwai2a439522011-07-26 09:52:50 +0200946#ifdef CONFIG_PM
Takashi Iwaie044c392008-10-27 16:56:24 +0100947 .resume = alc_resume,
Hector Martinf5de24b2009-12-20 22:51:31 +0100948 .suspend = alc_suspend,
Takashi Iwaifce52a32013-01-07 12:42:48 +0100949 .check_power_status = snd_hda_gen_check_power_status,
Takashi Iwaicb53c622007-08-10 17:21:45 +0200950#endif
Takashi Iwai70a09762015-12-15 14:59:58 +0100951 .reboot_notify = alc_reboot_notify,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700952};
953
David Henningsson29adc4b2012-09-25 11:31:00 +0200954
Takashi Iwaided255b2015-10-01 17:59:43 +0200955#define alc_codec_rename(codec, name) snd_hda_codec_set_name(codec, name)
Kailang Yangc027ddc2010-03-19 11:33:06 +0100956
Takashi Iwai2fa522b2005-05-12 14:51:12 +0200957/*
Kailang Yang4b016932013-11-28 11:55:09 +0100958 * Rename codecs appropriately from COEF value or subvendor id
Takashi Iwaie16fb6d2011-10-17 16:39:09 +0200959 */
960struct alc_codec_rename_table {
961 unsigned int vendor_id;
962 unsigned short coef_mask;
963 unsigned short coef_bits;
964 const char *name;
965};
966
Kailang Yang4b016932013-11-28 11:55:09 +0100967struct alc_codec_rename_pci_table {
968 unsigned int codec_vendor_id;
969 unsigned short pci_subvendor;
970 unsigned short pci_subdevice;
971 const char *name;
972};
973
Takashi Iwai6b0f95c2020-01-05 15:47:18 +0100974static const struct alc_codec_rename_table rename_tbl[] = {
Kailang Yange6e5f7a2014-06-06 16:46:43 +0800975 { 0x10ec0221, 0xf00f, 0x1003, "ALC231" },
Takashi Iwaie16fb6d2011-10-17 16:39:09 +0200976 { 0x10ec0269, 0xfff0, 0x3010, "ALC277" },
977 { 0x10ec0269, 0xf0f0, 0x2010, "ALC259" },
978 { 0x10ec0269, 0xf0f0, 0x3010, "ALC258" },
979 { 0x10ec0269, 0x00f0, 0x0010, "ALC269VB" },
980 { 0x10ec0269, 0xffff, 0xa023, "ALC259" },
981 { 0x10ec0269, 0xffff, 0x6023, "ALC281X" },
982 { 0x10ec0269, 0x00f0, 0x0020, "ALC269VC" },
Kailang Yangadcc70b2012-05-25 08:08:38 +0200983 { 0x10ec0269, 0x00f0, 0x0030, "ALC269VD" },
Kailang Yange6e5f7a2014-06-06 16:46:43 +0800984 { 0x10ec0662, 0xffff, 0x4020, "ALC656" },
Takashi Iwaie16fb6d2011-10-17 16:39:09 +0200985 { 0x10ec0887, 0x00f0, 0x0030, "ALC887-VD" },
986 { 0x10ec0888, 0x00f0, 0x0030, "ALC888-VD" },
987 { 0x10ec0888, 0xf0f0, 0x3020, "ALC886" },
988 { 0x10ec0899, 0x2000, 0x2000, "ALC899" },
989 { 0x10ec0892, 0xffff, 0x8020, "ALC661" },
990 { 0x10ec0892, 0xffff, 0x8011, "ALC661" },
991 { 0x10ec0892, 0xffff, 0x4011, "ALC656" },
992 { } /* terminator */
993};
994
Takashi Iwai6b0f95c2020-01-05 15:47:18 +0100995static const struct alc_codec_rename_pci_table rename_pci_tbl[] = {
Kailang Yang4b016932013-11-28 11:55:09 +0100996 { 0x10ec0280, 0x1028, 0, "ALC3220" },
997 { 0x10ec0282, 0x1028, 0, "ALC3221" },
998 { 0x10ec0283, 0x1028, 0, "ALC3223" },
Kailang Yang193177d2014-04-23 16:06:13 +0800999 { 0x10ec0288, 0x1028, 0, "ALC3263" },
Kailang Yang4b016932013-11-28 11:55:09 +01001000 { 0x10ec0292, 0x1028, 0, "ALC3226" },
Kailang Yang193177d2014-04-23 16:06:13 +08001001 { 0x10ec0293, 0x1028, 0, "ALC3235" },
Kailang Yang4b016932013-11-28 11:55:09 +01001002 { 0x10ec0255, 0x1028, 0, "ALC3234" },
1003 { 0x10ec0668, 0x1028, 0, "ALC3661" },
Kailang Yange6e5f7a2014-06-06 16:46:43 +08001004 { 0x10ec0275, 0x1028, 0, "ALC3260" },
1005 { 0x10ec0899, 0x1028, 0, "ALC3861" },
Kailang Yang2c674fa2015-05-05 15:02:42 +08001006 { 0x10ec0298, 0x1028, 0, "ALC3266" },
Kailang Yang736f20a2017-10-20 15:06:34 +08001007 { 0x10ec0236, 0x1028, 0, "ALC3204" },
Kailang Yang82324502015-05-25 17:16:49 +08001008 { 0x10ec0256, 0x1028, 0, "ALC3246" },
Kailang Yang42314302016-02-03 15:03:50 +08001009 { 0x10ec0225, 0x1028, 0, "ALC3253" },
Kailang Yang7d727862016-05-24 16:46:07 +08001010 { 0x10ec0295, 0x1028, 0, "ALC3254" },
Kailang Yang28f1f9b2017-01-04 14:49:07 +08001011 { 0x10ec0299, 0x1028, 0, "ALC3271" },
Kailang Yange6e5f7a2014-06-06 16:46:43 +08001012 { 0x10ec0670, 0x1025, 0, "ALC669X" },
1013 { 0x10ec0676, 0x1025, 0, "ALC679X" },
1014 { 0x10ec0282, 0x1043, 0, "ALC3229" },
1015 { 0x10ec0233, 0x1043, 0, "ALC3236" },
1016 { 0x10ec0280, 0x103c, 0, "ALC3228" },
1017 { 0x10ec0282, 0x103c, 0, "ALC3227" },
1018 { 0x10ec0286, 0x103c, 0, "ALC3242" },
1019 { 0x10ec0290, 0x103c, 0, "ALC3241" },
1020 { 0x10ec0668, 0x103c, 0, "ALC3662" },
1021 { 0x10ec0283, 0x17aa, 0, "ALC3239" },
1022 { 0x10ec0292, 0x17aa, 0, "ALC3232" },
Kailang Yang4b016932013-11-28 11:55:09 +01001023 { } /* terminator */
1024};
1025
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02001026static int alc_codec_rename_from_preset(struct hda_codec *codec)
1027{
1028 const struct alc_codec_rename_table *p;
Kailang Yang4b016932013-11-28 11:55:09 +01001029 const struct alc_codec_rename_pci_table *q;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02001030
1031 for (p = rename_tbl; p->vendor_id; p++) {
Takashi Iwai7639a062015-03-03 10:07:24 +01001032 if (p->vendor_id != codec->core.vendor_id)
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02001033 continue;
Takashi Iwai1bb7e432011-10-17 16:50:59 +02001034 if ((alc_get_coef0(codec) & p->coef_mask) == p->coef_bits)
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02001035 return alc_codec_rename(codec, p->name);
1036 }
Kailang Yang4b016932013-11-28 11:55:09 +01001037
Takashi Iwai5100cd02014-02-15 10:03:19 +01001038 if (!codec->bus->pci)
1039 return 0;
Kailang Yang4b016932013-11-28 11:55:09 +01001040 for (q = rename_pci_tbl; q->codec_vendor_id; q++) {
Takashi Iwai7639a062015-03-03 10:07:24 +01001041 if (q->codec_vendor_id != codec->core.vendor_id)
Kailang Yang4b016932013-11-28 11:55:09 +01001042 continue;
1043 if (q->pci_subvendor != codec->bus->pci->subsystem_vendor)
1044 continue;
1045 if (!q->pci_subdevice ||
1046 q->pci_subdevice == codec->bus->pci->subsystem_device)
1047 return alc_codec_rename(codec, q->name);
1048 }
1049
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02001050 return 0;
1051}
1052
Takashi Iwaie4770622011-07-08 11:11:35 +02001053
1054/*
Takashi Iwai1d045db2011-07-07 18:23:21 +02001055 * Digital-beep handlers
1056 */
1057#ifdef CONFIG_SND_HDA_INPUT_BEEP
Takashi Iwaifea80fa2018-06-20 12:52:46 +02001058
1059/* additional beep mixers; private_value will be overwritten */
1060static const struct snd_kcontrol_new alc_beep_mixer[] = {
1061 HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
1062 HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
1063};
1064
1065/* set up and create beep controls */
1066static int set_beep_amp(struct alc_spec *spec, hda_nid_t nid,
1067 int idx, int dir)
1068{
1069 struct snd_kcontrol_new *knew;
1070 unsigned int beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir);
1071 int i;
1072
1073 for (i = 0; i < ARRAY_SIZE(alc_beep_mixer); i++) {
1074 knew = snd_hda_gen_add_kctl(&spec->gen, NULL,
1075 &alc_beep_mixer[i]);
1076 if (!knew)
1077 return -ENOMEM;
1078 knew->private_value = beep_amp;
1079 }
1080 return 0;
1081}
Takashi Iwai1d045db2011-07-07 18:23:21 +02001082
Takashi Iwai6317e5e2020-07-14 19:26:27 +02001083static const struct snd_pci_quirk beep_allow_list[] = {
Duncan Roe71100052012-10-10 14:19:50 +02001084 SND_PCI_QUIRK(0x1043, 0x103c, "ASUS", 1),
W. Trevor Kinga4b7f21d2014-03-29 17:47:24 -07001085 SND_PCI_QUIRK(0x1043, 0x115d, "ASUS", 1),
Takashi Iwai1d045db2011-07-07 18:23:21 +02001086 SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),
Takashi Iwai8554ee42013-02-25 09:54:43 +01001087 SND_PCI_QUIRK(0x1043, 0x8376, "EeePC", 1),
Takashi Iwai1d045db2011-07-07 18:23:21 +02001088 SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1),
1089 SND_PCI_QUIRK(0x1043, 0x831a, "EeePC", 1),
1090 SND_PCI_QUIRK(0x1043, 0x834a, "EeePC", 1),
Takashi Iwai78f8baf2012-03-06 14:02:32 +01001091 SND_PCI_QUIRK(0x1458, 0xa002, "GA-MA790X", 1),
Takashi Iwai1d045db2011-07-07 18:23:21 +02001092 SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),
Takashi Iwai6317e5e2020-07-14 19:26:27 +02001093 /* denylist -- no beep available */
Takashi Iwai051c78a2019-08-22 09:58:07 +02001094 SND_PCI_QUIRK(0x17aa, 0x309e, "Lenovo ThinkCentre M73", 0),
1095 SND_PCI_QUIRK(0x17aa, 0x30a3, "Lenovo ThinkCentre M93", 0),
Takashi Iwai1d045db2011-07-07 18:23:21 +02001096 {}
1097};
1098
1099static inline int has_cdefine_beep(struct hda_codec *codec)
1100{
1101 struct alc_spec *spec = codec->spec;
1102 const struct snd_pci_quirk *q;
Takashi Iwai6317e5e2020-07-14 19:26:27 +02001103 q = snd_pci_quirk_lookup(codec->bus->pci, beep_allow_list);
Takashi Iwai1d045db2011-07-07 18:23:21 +02001104 if (q)
1105 return q->value;
1106 return spec->cdefine.enable_pcbeep;
1107}
1108#else
Takashi Iwaifea80fa2018-06-20 12:52:46 +02001109#define set_beep_amp(spec, nid, idx, dir) 0
Takashi Iwai1d045db2011-07-07 18:23:21 +02001110#define has_cdefine_beep(codec) 0
1111#endif
1112
1113/* parse the BIOS configuration and set up the alc_spec */
1114/* return 1 if successful, 0 if the proper config is not found,
1115 * or a negative error code
1116 */
Takashi Iwai3e6179b2011-07-08 16:55:13 +02001117static int alc_parse_auto_config(struct hda_codec *codec,
1118 const hda_nid_t *ignore_nids,
1119 const hda_nid_t *ssid_nids)
Takashi Iwai1d045db2011-07-07 18:23:21 +02001120{
1121 struct alc_spec *spec = codec->spec;
Takashi Iwai08c189f2012-12-19 15:22:24 +01001122 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001123 int err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001124
Takashi Iwai53c334a2011-08-23 18:27:14 +02001125 err = snd_hda_parse_pin_defcfg(codec, cfg, ignore_nids,
1126 spec->parse_flags);
Takashi Iwai1d045db2011-07-07 18:23:21 +02001127 if (err < 0)
1128 return err;
Takashi Iwai3e6179b2011-07-08 16:55:13 +02001129
1130 if (ssid_nids)
1131 alc_ssid_check(codec, ssid_nids);
1132
Takashi Iwai08c189f2012-12-19 15:22:24 +01001133 err = snd_hda_gen_parse_auto_config(codec, cfg);
1134 if (err < 0)
1135 return err;
Takashi Iwai070cff42012-02-21 12:54:17 +01001136
Takashi Iwai1d045db2011-07-07 18:23:21 +02001137 return 1;
1138}
1139
Takashi Iwai3de95172012-05-07 18:03:15 +02001140/* common preparation job for alc_spec */
1141static int alc_alloc_spec(struct hda_codec *codec, hda_nid_t mixer_nid)
1142{
1143 struct alc_spec *spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1144 int err;
1145
1146 if (!spec)
1147 return -ENOMEM;
1148 codec->spec = spec;
Takashi Iwai08c189f2012-12-19 15:22:24 +01001149 snd_hda_gen_spec_init(&spec->gen);
1150 spec->gen.mixer_nid = mixer_nid;
1151 spec->gen.own_eapd_ctl = 1;
Takashi Iwai1098b7c2012-12-17 20:03:15 +01001152 codec->single_adc_amp = 1;
Takashi Iwai08c189f2012-12-19 15:22:24 +01001153 /* FIXME: do we need this for all Realtek codec models? */
1154 codec->spdif_status_reset = 1;
Kai Vehmanena6e7d0a2020-10-12 13:27:04 +03001155 codec->forced_resume = 1;
Takashi Iwai225068a2015-05-29 10:42:14 +02001156 codec->patch_ops = alc_patch_ops;
Takashi Iwai3de95172012-05-07 18:03:15 +02001157
1158 err = alc_codec_rename_from_preset(codec);
1159 if (err < 0) {
1160 kfree(spec);
1161 return err;
1162 }
1163 return 0;
1164}
1165
Takashi Iwai3e6179b2011-07-08 16:55:13 +02001166static int alc880_parse_auto_config(struct hda_codec *codec)
1167{
1168 static const hda_nid_t alc880_ignore[] = { 0x1d, 0 };
Jesper Juhl7d7eb9e2012-04-12 22:11:25 +02001169 static const hda_nid_t alc880_ssids[] = { 0x15, 0x1b, 0x14, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02001170 return alc_parse_auto_config(codec, alc880_ignore, alc880_ssids);
1171}
1172
Takashi Iwai1d045db2011-07-07 18:23:21 +02001173/*
Takashi Iwaiee3b2962011-11-15 14:26:54 +01001174 * ALC880 fix-ups
1175 */
1176enum {
Takashi Iwai411225a2012-02-20 17:48:19 +01001177 ALC880_FIXUP_GPIO1,
Takashi Iwaiee3b2962011-11-15 14:26:54 +01001178 ALC880_FIXUP_GPIO2,
1179 ALC880_FIXUP_MEDION_RIM,
Takashi Iwaidc6af522012-02-17 16:18:59 +01001180 ALC880_FIXUP_LG,
Takashi Iwaidb8a38e2013-08-09 12:34:42 +02001181 ALC880_FIXUP_LG_LW25,
Takashi Iwaif02aab52012-02-17 16:33:56 +01001182 ALC880_FIXUP_W810,
Takashi Iwai27e917f2012-02-17 17:49:54 +01001183 ALC880_FIXUP_EAPD_COEF,
Takashi Iwaib9368f52012-02-17 17:54:44 +01001184 ALC880_FIXUP_TCL_S700,
Takashi Iwaicf5a2272012-02-20 16:31:07 +01001185 ALC880_FIXUP_VOL_KNOB,
1186 ALC880_FIXUP_FUJITSU,
Takashi Iwaiba533812012-02-20 16:36:52 +01001187 ALC880_FIXUP_F1734,
Takashi Iwai817de922012-02-20 17:20:48 +01001188 ALC880_FIXUP_UNIWILL,
Takashi Iwai967b88c2012-02-20 17:31:02 +01001189 ALC880_FIXUP_UNIWILL_DIG,
Takashi Iwai96e225f2012-02-20 17:41:51 +01001190 ALC880_FIXUP_Z71V,
Takashi Iwai487a5882013-11-07 07:29:30 +01001191 ALC880_FIXUP_ASUS_W5A,
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001192 ALC880_FIXUP_3ST_BASE,
1193 ALC880_FIXUP_3ST,
1194 ALC880_FIXUP_3ST_DIG,
1195 ALC880_FIXUP_5ST_BASE,
1196 ALC880_FIXUP_5ST,
1197 ALC880_FIXUP_5ST_DIG,
1198 ALC880_FIXUP_6ST_BASE,
1199 ALC880_FIXUP_6ST,
1200 ALC880_FIXUP_6ST_DIG,
Takashi Iwai53971452013-01-23 18:21:37 +01001201 ALC880_FIXUP_6ST_AUTOMUTE,
Takashi Iwaiee3b2962011-11-15 14:26:54 +01001202};
1203
Takashi Iwaicf5a2272012-02-20 16:31:07 +01001204/* enable the volume-knob widget support on NID 0x21 */
1205static void alc880_fixup_vol_knob(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01001206 const struct hda_fixup *fix, int action)
Takashi Iwaicf5a2272012-02-20 16:31:07 +01001207{
Takashi Iwai1727a772013-01-10 09:52:52 +01001208 if (action == HDA_FIXUP_ACT_PROBE)
Takashi Iwai62f949b2014-09-11 14:06:53 +02001209 snd_hda_jack_detect_enable_callback(codec, 0x21,
1210 alc_update_knob_master);
Takashi Iwaicf5a2272012-02-20 16:31:07 +01001211}
1212
Takashi Iwai1727a772013-01-10 09:52:52 +01001213static const struct hda_fixup alc880_fixups[] = {
Takashi Iwai411225a2012-02-20 17:48:19 +01001214 [ALC880_FIXUP_GPIO1] = {
Takashi Iwai5579cd62018-06-19 22:22:41 +02001215 .type = HDA_FIXUP_FUNC,
1216 .v.func = alc_fixup_gpio1,
Takashi Iwai411225a2012-02-20 17:48:19 +01001217 },
Takashi Iwaiee3b2962011-11-15 14:26:54 +01001218 [ALC880_FIXUP_GPIO2] = {
Takashi Iwai5579cd62018-06-19 22:22:41 +02001219 .type = HDA_FIXUP_FUNC,
1220 .v.func = alc_fixup_gpio2,
Takashi Iwaiee3b2962011-11-15 14:26:54 +01001221 },
1222 [ALC880_FIXUP_MEDION_RIM] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001223 .type = HDA_FIXUP_VERBS,
Takashi Iwaiee3b2962011-11-15 14:26:54 +01001224 .v.verbs = (const struct hda_verb[]) {
1225 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1226 { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
1227 { }
1228 },
1229 .chained = true,
1230 .chain_id = ALC880_FIXUP_GPIO2,
1231 },
Takashi Iwaidc6af522012-02-17 16:18:59 +01001232 [ALC880_FIXUP_LG] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001233 .type = HDA_FIXUP_PINS,
1234 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaidc6af522012-02-17 16:18:59 +01001235 /* disable bogus unused pins */
1236 { 0x16, 0x411111f0 },
1237 { 0x18, 0x411111f0 },
1238 { 0x1a, 0x411111f0 },
1239 { }
1240 }
1241 },
Takashi Iwaidb8a38e2013-08-09 12:34:42 +02001242 [ALC880_FIXUP_LG_LW25] = {
1243 .type = HDA_FIXUP_PINS,
1244 .v.pins = (const struct hda_pintbl[]) {
1245 { 0x1a, 0x0181344f }, /* line-in */
1246 { 0x1b, 0x0321403f }, /* headphone */
1247 { }
1248 }
1249 },
Takashi Iwaif02aab52012-02-17 16:33:56 +01001250 [ALC880_FIXUP_W810] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001251 .type = HDA_FIXUP_PINS,
1252 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaif02aab52012-02-17 16:33:56 +01001253 /* disable bogus unused pins */
1254 { 0x17, 0x411111f0 },
1255 { }
1256 },
1257 .chained = true,
1258 .chain_id = ALC880_FIXUP_GPIO2,
1259 },
Takashi Iwai27e917f2012-02-17 17:49:54 +01001260 [ALC880_FIXUP_EAPD_COEF] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001261 .type = HDA_FIXUP_VERBS,
Takashi Iwai27e917f2012-02-17 17:49:54 +01001262 .v.verbs = (const struct hda_verb[]) {
1263 /* change to EAPD mode */
1264 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1265 { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
1266 {}
1267 },
1268 },
Takashi Iwaib9368f52012-02-17 17:54:44 +01001269 [ALC880_FIXUP_TCL_S700] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001270 .type = HDA_FIXUP_VERBS,
Takashi Iwaib9368f52012-02-17 17:54:44 +01001271 .v.verbs = (const struct hda_verb[]) {
1272 /* change to EAPD mode */
1273 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1274 { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
1275 {}
1276 },
1277 .chained = true,
1278 .chain_id = ALC880_FIXUP_GPIO2,
1279 },
Takashi Iwaicf5a2272012-02-20 16:31:07 +01001280 [ALC880_FIXUP_VOL_KNOB] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001281 .type = HDA_FIXUP_FUNC,
Takashi Iwaicf5a2272012-02-20 16:31:07 +01001282 .v.func = alc880_fixup_vol_knob,
1283 },
1284 [ALC880_FIXUP_FUJITSU] = {
1285 /* override all pins as BIOS on old Amilo is broken */
Takashi Iwai1727a772013-01-10 09:52:52 +01001286 .type = HDA_FIXUP_PINS,
1287 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaibb148bd2015-08-13 18:02:39 +02001288 { 0x14, 0x0121401f }, /* HP */
Takashi Iwaicf5a2272012-02-20 16:31:07 +01001289 { 0x15, 0x99030120 }, /* speaker */
1290 { 0x16, 0x99030130 }, /* bass speaker */
1291 { 0x17, 0x411111f0 }, /* N/A */
1292 { 0x18, 0x411111f0 }, /* N/A */
1293 { 0x19, 0x01a19950 }, /* mic-in */
1294 { 0x1a, 0x411111f0 }, /* N/A */
1295 { 0x1b, 0x411111f0 }, /* N/A */
1296 { 0x1c, 0x411111f0 }, /* N/A */
1297 { 0x1d, 0x411111f0 }, /* N/A */
1298 { 0x1e, 0x01454140 }, /* SPDIF out */
1299 { }
1300 },
1301 .chained = true,
1302 .chain_id = ALC880_FIXUP_VOL_KNOB,
1303 },
Takashi Iwaiba533812012-02-20 16:36:52 +01001304 [ALC880_FIXUP_F1734] = {
1305 /* almost compatible with FUJITSU, but no bass and SPDIF */
Takashi Iwai1727a772013-01-10 09:52:52 +01001306 .type = HDA_FIXUP_PINS,
1307 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaibb148bd2015-08-13 18:02:39 +02001308 { 0x14, 0x0121401f }, /* HP */
Takashi Iwaiba533812012-02-20 16:36:52 +01001309 { 0x15, 0x99030120 }, /* speaker */
1310 { 0x16, 0x411111f0 }, /* N/A */
1311 { 0x17, 0x411111f0 }, /* N/A */
1312 { 0x18, 0x411111f0 }, /* N/A */
1313 { 0x19, 0x01a19950 }, /* mic-in */
1314 { 0x1a, 0x411111f0 }, /* N/A */
1315 { 0x1b, 0x411111f0 }, /* N/A */
1316 { 0x1c, 0x411111f0 }, /* N/A */
1317 { 0x1d, 0x411111f0 }, /* N/A */
1318 { 0x1e, 0x411111f0 }, /* N/A */
1319 { }
1320 },
1321 .chained = true,
1322 .chain_id = ALC880_FIXUP_VOL_KNOB,
1323 },
Takashi Iwai817de922012-02-20 17:20:48 +01001324 [ALC880_FIXUP_UNIWILL] = {
1325 /* need to fix HP and speaker pins to be parsed correctly */
Takashi Iwai1727a772013-01-10 09:52:52 +01001326 .type = HDA_FIXUP_PINS,
1327 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai817de922012-02-20 17:20:48 +01001328 { 0x14, 0x0121411f }, /* HP */
1329 { 0x15, 0x99030120 }, /* speaker */
1330 { 0x16, 0x99030130 }, /* bass speaker */
1331 { }
1332 },
1333 },
Takashi Iwai967b88c2012-02-20 17:31:02 +01001334 [ALC880_FIXUP_UNIWILL_DIG] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001335 .type = HDA_FIXUP_PINS,
1336 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai967b88c2012-02-20 17:31:02 +01001337 /* disable bogus unused pins */
1338 { 0x17, 0x411111f0 },
1339 { 0x19, 0x411111f0 },
1340 { 0x1b, 0x411111f0 },
1341 { 0x1f, 0x411111f0 },
1342 { }
1343 }
1344 },
Takashi Iwai96e225f2012-02-20 17:41:51 +01001345 [ALC880_FIXUP_Z71V] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001346 .type = HDA_FIXUP_PINS,
1347 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai96e225f2012-02-20 17:41:51 +01001348 /* set up the whole pins as BIOS is utterly broken */
1349 { 0x14, 0x99030120 }, /* speaker */
1350 { 0x15, 0x0121411f }, /* HP */
1351 { 0x16, 0x411111f0 }, /* N/A */
1352 { 0x17, 0x411111f0 }, /* N/A */
1353 { 0x18, 0x01a19950 }, /* mic-in */
1354 { 0x19, 0x411111f0 }, /* N/A */
1355 { 0x1a, 0x01813031 }, /* line-in */
1356 { 0x1b, 0x411111f0 }, /* N/A */
1357 { 0x1c, 0x411111f0 }, /* N/A */
1358 { 0x1d, 0x411111f0 }, /* N/A */
1359 { 0x1e, 0x0144111e }, /* SPDIF */
1360 { }
1361 }
1362 },
Takashi Iwai487a5882013-11-07 07:29:30 +01001363 [ALC880_FIXUP_ASUS_W5A] = {
1364 .type = HDA_FIXUP_PINS,
1365 .v.pins = (const struct hda_pintbl[]) {
1366 /* set up the whole pins as BIOS is utterly broken */
1367 { 0x14, 0x0121411f }, /* HP */
1368 { 0x15, 0x411111f0 }, /* N/A */
1369 { 0x16, 0x411111f0 }, /* N/A */
1370 { 0x17, 0x411111f0 }, /* N/A */
1371 { 0x18, 0x90a60160 }, /* mic */
1372 { 0x19, 0x411111f0 }, /* N/A */
1373 { 0x1a, 0x411111f0 }, /* N/A */
1374 { 0x1b, 0x411111f0 }, /* N/A */
1375 { 0x1c, 0x411111f0 }, /* N/A */
1376 { 0x1d, 0x411111f0 }, /* N/A */
1377 { 0x1e, 0xb743111e }, /* SPDIF out */
1378 { }
1379 },
1380 .chained = true,
1381 .chain_id = ALC880_FIXUP_GPIO1,
1382 },
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001383 [ALC880_FIXUP_3ST_BASE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001384 .type = HDA_FIXUP_PINS,
1385 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001386 { 0x14, 0x01014010 }, /* line-out */
1387 { 0x15, 0x411111f0 }, /* N/A */
1388 { 0x16, 0x411111f0 }, /* N/A */
1389 { 0x17, 0x411111f0 }, /* N/A */
1390 { 0x18, 0x01a19c30 }, /* mic-in */
1391 { 0x19, 0x0121411f }, /* HP */
1392 { 0x1a, 0x01813031 }, /* line-in */
1393 { 0x1b, 0x02a19c40 }, /* front-mic */
1394 { 0x1c, 0x411111f0 }, /* N/A */
1395 { 0x1d, 0x411111f0 }, /* N/A */
1396 /* 0x1e is filled in below */
1397 { 0x1f, 0x411111f0 }, /* N/A */
1398 { }
1399 }
1400 },
1401 [ALC880_FIXUP_3ST] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001402 .type = HDA_FIXUP_PINS,
1403 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001404 { 0x1e, 0x411111f0 }, /* N/A */
1405 { }
1406 },
1407 .chained = true,
1408 .chain_id = ALC880_FIXUP_3ST_BASE,
1409 },
1410 [ALC880_FIXUP_3ST_DIG] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001411 .type = HDA_FIXUP_PINS,
1412 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001413 { 0x1e, 0x0144111e }, /* SPDIF */
1414 { }
1415 },
1416 .chained = true,
1417 .chain_id = ALC880_FIXUP_3ST_BASE,
1418 },
1419 [ALC880_FIXUP_5ST_BASE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001420 .type = HDA_FIXUP_PINS,
1421 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001422 { 0x14, 0x01014010 }, /* front */
1423 { 0x15, 0x411111f0 }, /* N/A */
1424 { 0x16, 0x01011411 }, /* CLFE */
1425 { 0x17, 0x01016412 }, /* surr */
1426 { 0x18, 0x01a19c30 }, /* mic-in */
1427 { 0x19, 0x0121411f }, /* HP */
1428 { 0x1a, 0x01813031 }, /* line-in */
1429 { 0x1b, 0x02a19c40 }, /* front-mic */
1430 { 0x1c, 0x411111f0 }, /* N/A */
1431 { 0x1d, 0x411111f0 }, /* N/A */
1432 /* 0x1e is filled in below */
1433 { 0x1f, 0x411111f0 }, /* N/A */
1434 { }
1435 }
1436 },
1437 [ALC880_FIXUP_5ST] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001438 .type = HDA_FIXUP_PINS,
1439 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001440 { 0x1e, 0x411111f0 }, /* N/A */
1441 { }
1442 },
1443 .chained = true,
1444 .chain_id = ALC880_FIXUP_5ST_BASE,
1445 },
1446 [ALC880_FIXUP_5ST_DIG] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001447 .type = HDA_FIXUP_PINS,
1448 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001449 { 0x1e, 0x0144111e }, /* SPDIF */
1450 { }
1451 },
1452 .chained = true,
1453 .chain_id = ALC880_FIXUP_5ST_BASE,
1454 },
1455 [ALC880_FIXUP_6ST_BASE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001456 .type = HDA_FIXUP_PINS,
1457 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001458 { 0x14, 0x01014010 }, /* front */
1459 { 0x15, 0x01016412 }, /* surr */
1460 { 0x16, 0x01011411 }, /* CLFE */
1461 { 0x17, 0x01012414 }, /* side */
1462 { 0x18, 0x01a19c30 }, /* mic-in */
1463 { 0x19, 0x02a19c40 }, /* front-mic */
1464 { 0x1a, 0x01813031 }, /* line-in */
1465 { 0x1b, 0x0121411f }, /* HP */
1466 { 0x1c, 0x411111f0 }, /* N/A */
1467 { 0x1d, 0x411111f0 }, /* N/A */
1468 /* 0x1e is filled in below */
1469 { 0x1f, 0x411111f0 }, /* N/A */
1470 { }
1471 }
1472 },
1473 [ALC880_FIXUP_6ST] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001474 .type = HDA_FIXUP_PINS,
1475 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001476 { 0x1e, 0x411111f0 }, /* N/A */
1477 { }
1478 },
1479 .chained = true,
1480 .chain_id = ALC880_FIXUP_6ST_BASE,
1481 },
1482 [ALC880_FIXUP_6ST_DIG] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001483 .type = HDA_FIXUP_PINS,
1484 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001485 { 0x1e, 0x0144111e }, /* SPDIF */
1486 { }
1487 },
1488 .chained = true,
1489 .chain_id = ALC880_FIXUP_6ST_BASE,
1490 },
Takashi Iwai53971452013-01-23 18:21:37 +01001491 [ALC880_FIXUP_6ST_AUTOMUTE] = {
1492 .type = HDA_FIXUP_PINS,
1493 .v.pins = (const struct hda_pintbl[]) {
1494 { 0x1b, 0x0121401f }, /* HP with jack detect */
1495 { }
1496 },
1497 .chained_before = true,
1498 .chain_id = ALC880_FIXUP_6ST_BASE,
1499 },
Takashi Iwaiee3b2962011-11-15 14:26:54 +01001500};
1501
1502static const struct snd_pci_quirk alc880_fixup_tbl[] = {
Takashi Iwaif02aab52012-02-17 16:33:56 +01001503 SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_FIXUP_W810),
Takashi Iwai487a5882013-11-07 07:29:30 +01001504 SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS W5A", ALC880_FIXUP_ASUS_W5A),
Takashi Iwai96e225f2012-02-20 17:41:51 +01001505 SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_FIXUP_Z71V),
Takashi Iwai29e3fdc2012-02-20 17:56:57 +01001506 SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_FIXUP_GPIO1),
David Henningsson6538de02014-06-10 10:52:50 +02001507 SND_PCI_QUIRK(0x147b, 0x1045, "ABit AA8XE", ALC880_FIXUP_6ST_AUTOMUTE),
Takashi Iwai29e3fdc2012-02-20 17:56:57 +01001508 SND_PCI_QUIRK(0x1558, 0x5401, "Clevo GPIO2", ALC880_FIXUP_GPIO2),
Takashi Iwai27e917f2012-02-17 17:49:54 +01001509 SND_PCI_QUIRK_VENDOR(0x1558, "Clevo", ALC880_FIXUP_EAPD_COEF),
Takashi Iwai967b88c2012-02-20 17:31:02 +01001510 SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_FIXUP_UNIWILL_DIG),
Takashi Iwaiba533812012-02-20 16:36:52 +01001511 SND_PCI_QUIRK(0x1584, 0x9054, "Uniwill", ALC880_FIXUP_F1734),
Takashi Iwai817de922012-02-20 17:20:48 +01001512 SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_FIXUP_UNIWILL),
Takashi Iwai7833c7e2012-02-20 17:11:38 +01001513 SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_FIXUP_VOL_KNOB),
Takashi Iwaif02aab52012-02-17 16:33:56 +01001514 SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_FIXUP_W810),
Takashi Iwaiee3b2962011-11-15 14:26:54 +01001515 SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_FIXUP_MEDION_RIM),
Takashi Iwai53971452013-01-23 18:21:37 +01001516 SND_PCI_QUIRK(0x1631, 0xe011, "PB 13201056", ALC880_FIXUP_6ST_AUTOMUTE),
Takashi Iwaia1615742015-08-13 18:05:06 +02001517 SND_PCI_QUIRK(0x1734, 0x107c, "FSC Amilo M1437", ALC880_FIXUP_FUJITSU),
Takashi Iwaicf5a2272012-02-20 16:31:07 +01001518 SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FIXUP_FUJITSU),
Takashi Iwaiba533812012-02-20 16:36:52 +01001519 SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_FIXUP_F1734),
Takashi Iwaicf5a2272012-02-20 16:31:07 +01001520 SND_PCI_QUIRK(0x1734, 0x10b0, "FSC Amilo Pi1556", ALC880_FIXUP_FUJITSU),
Takashi Iwaidc6af522012-02-17 16:18:59 +01001521 SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_FIXUP_LG),
1522 SND_PCI_QUIRK(0x1854, 0x005f, "LG P1 Express", ALC880_FIXUP_LG),
1523 SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_FIXUP_LG),
Takashi Iwaidb8a38e2013-08-09 12:34:42 +02001524 SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_FIXUP_LG_LW25),
Takashi Iwaib9368f52012-02-17 17:54:44 +01001525 SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_FIXUP_TCL_S700),
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001526
1527 /* Below is the copied entries from alc880_quirks.c.
1528 * It's not quite sure whether BIOS sets the correct pin-config table
1529 * on these machines, thus they are kept to be compatible with
1530 * the old static quirks. Once when it's confirmed to work without
1531 * these overrides, it'd be better to remove.
1532 */
1533 SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_FIXUP_5ST_DIG),
1534 SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_FIXUP_6ST),
1535 SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_FIXUP_3ST_DIG),
1536 SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_FIXUP_6ST_DIG),
1537 SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_FIXUP_6ST_DIG),
1538 SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_FIXUP_6ST_DIG),
1539 SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_FIXUP_3ST_DIG),
1540 SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_FIXUP_3ST),
1541 SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_FIXUP_6ST_DIG),
1542 SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_FIXUP_3ST),
1543 SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_FIXUP_3ST),
1544 SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_FIXUP_5ST),
1545 SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_FIXUP_5ST),
1546 SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_FIXUP_5ST),
1547 SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_FIXUP_6ST_DIG),
1548 SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_FIXUP_6ST_DIG),
1549 SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_FIXUP_6ST_DIG),
1550 SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_FIXUP_6ST_DIG),
1551 SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_FIXUP_5ST_DIG),
1552 SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_FIXUP_5ST_DIG),
1553 SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_FIXUP_5ST_DIG),
1554 SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_FIXUP_6ST_DIG), /* broken BIOS */
1555 SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_FIXUP_6ST_DIG),
1556 SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1557 SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1558 SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1559 SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1560 SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1561 SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1562 SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1563 SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1564 SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1565 SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1566 /* default Intel */
1567 SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_FIXUP_3ST),
1568 SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_FIXUP_5ST_DIG),
1569 SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_FIXUP_6ST_DIG),
1570 {}
1571};
1572
Takashi Iwai1727a772013-01-10 09:52:52 +01001573static const struct hda_model_fixup alc880_fixup_models[] = {
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001574 {.id = ALC880_FIXUP_3ST, .name = "3stack"},
1575 {.id = ALC880_FIXUP_3ST_DIG, .name = "3stack-digout"},
1576 {.id = ALC880_FIXUP_5ST, .name = "5stack"},
1577 {.id = ALC880_FIXUP_5ST_DIG, .name = "5stack-digout"},
1578 {.id = ALC880_FIXUP_6ST, .name = "6stack"},
1579 {.id = ALC880_FIXUP_6ST_DIG, .name = "6stack-digout"},
Takashi Iwai53971452013-01-23 18:21:37 +01001580 {.id = ALC880_FIXUP_6ST_AUTOMUTE, .name = "6stack-automute"},
Takashi Iwaiee3b2962011-11-15 14:26:54 +01001581 {}
1582};
1583
1584
1585/*
Takashi Iwai1d045db2011-07-07 18:23:21 +02001586 * OK, here we have finally the patch for ALC880
1587 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02001588static int patch_alc880(struct hda_codec *codec)
1589{
1590 struct alc_spec *spec;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001591 int err;
1592
Takashi Iwai3de95172012-05-07 18:03:15 +02001593 err = alc_alloc_spec(codec, 0x0b);
1594 if (err < 0)
1595 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001596
Takashi Iwai3de95172012-05-07 18:03:15 +02001597 spec = codec->spec;
Takashi Iwai08c189f2012-12-19 15:22:24 +01001598 spec->gen.need_dac_fix = 1;
Takashi Iwai7504b6c2013-03-18 11:25:51 +01001599 spec->gen.beep_nid = 0x01;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001600
Takashi Iwai225068a2015-05-29 10:42:14 +02001601 codec->patch_ops.unsol_event = alc880_unsol_event;
1602
Takashi Iwaic9af7532019-05-10 11:01:43 +02001603 alc_pre_init(codec);
1604
Takashi Iwai1727a772013-01-10 09:52:52 +01001605 snd_hda_pick_fixup(codec, alc880_fixup_models, alc880_fixup_tbl,
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001606 alc880_fixups);
Takashi Iwai1727a772013-01-10 09:52:52 +01001607 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai1d045db2011-07-07 18:23:21 +02001608
Takashi Iwai67b6ec32012-02-20 18:20:42 +01001609 /* automatic parse from the BIOS config */
1610 err = alc880_parse_auto_config(codec);
1611 if (err < 0)
1612 goto error;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001613
Takashi Iwaifea80fa2018-06-20 12:52:46 +02001614 if (!spec->gen.no_analog) {
1615 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
1616 if (err < 0)
1617 goto error;
1618 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02001619
Takashi Iwai1727a772013-01-10 09:52:52 +01001620 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01001621
Takashi Iwai1d045db2011-07-07 18:23:21 +02001622 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02001623
1624 error:
1625 alc_free(codec);
1626 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001627}
1628
1629
1630/*
1631 * ALC260 support
1632 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02001633static int alc260_parse_auto_config(struct hda_codec *codec)
1634{
Takashi Iwai1d045db2011-07-07 18:23:21 +02001635 static const hda_nid_t alc260_ignore[] = { 0x17, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02001636 static const hda_nid_t alc260_ssids[] = { 0x10, 0x15, 0x0f, 0 };
1637 return alc_parse_auto_config(codec, alc260_ignore, alc260_ssids);
Takashi Iwai1d045db2011-07-07 18:23:21 +02001638}
1639
Takashi Iwai1d045db2011-07-07 18:23:21 +02001640/*
1641 * Pin config fixes
1642 */
1643enum {
Takashi Iwaica8f0422012-02-16 11:51:19 +01001644 ALC260_FIXUP_HP_DC5750,
1645 ALC260_FIXUP_HP_PIN_0F,
1646 ALC260_FIXUP_COEF,
Takashi Iwai15317ab2012-02-16 12:02:53 +01001647 ALC260_FIXUP_GPIO1,
Takashi Iwai20f7d922012-02-16 12:35:16 +01001648 ALC260_FIXUP_GPIO1_TOGGLE,
1649 ALC260_FIXUP_REPLACER,
Takashi Iwai0a1c4fa2012-02-16 12:42:30 +01001650 ALC260_FIXUP_HP_B1900,
Takashi Iwai118cb4a2012-04-19 07:33:27 +02001651 ALC260_FIXUP_KN1,
Takashi Iwai39aedee2013-01-10 17:10:40 +01001652 ALC260_FIXUP_FSC_S7020,
Takashi Iwai5ebd3bb2013-02-19 18:23:31 +01001653 ALC260_FIXUP_FSC_S7020_JWSE,
Takashi Iwaid08c5ef2013-11-22 08:06:36 +01001654 ALC260_FIXUP_VAIO_PINS,
Takashi Iwai1d045db2011-07-07 18:23:21 +02001655};
1656
Takashi Iwai20f7d922012-02-16 12:35:16 +01001657static void alc260_gpio1_automute(struct hda_codec *codec)
1658{
1659 struct alc_spec *spec = codec->spec;
Takashi Iwaiaaf312d2018-06-19 22:28:22 +02001660
1661 alc_update_gpio_data(codec, 0x01, spec->gen.hp_jack_present);
Takashi Iwai20f7d922012-02-16 12:35:16 +01001662}
1663
1664static void alc260_fixup_gpio1_toggle(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01001665 const struct hda_fixup *fix, int action)
Takashi Iwai20f7d922012-02-16 12:35:16 +01001666{
1667 struct alc_spec *spec = codec->spec;
Takashi Iwai1727a772013-01-10 09:52:52 +01001668 if (action == HDA_FIXUP_ACT_PROBE) {
Takashi Iwai20f7d922012-02-16 12:35:16 +01001669 /* although the machine has only one output pin, we need to
1670 * toggle GPIO1 according to the jack state
1671 */
Takashi Iwai08c189f2012-12-19 15:22:24 +01001672 spec->gen.automute_hook = alc260_gpio1_automute;
1673 spec->gen.detect_hp = 1;
1674 spec->gen.automute_speaker = 1;
1675 spec->gen.autocfg.hp_pins[0] = 0x0f; /* copy it for automute */
Takashi Iwai62f949b2014-09-11 14:06:53 +02001676 snd_hda_jack_detect_enable_callback(codec, 0x0f,
Takashi Iwai08c189f2012-12-19 15:22:24 +01001677 snd_hda_gen_hp_automute);
Takashi Iwai5579cd62018-06-19 22:22:41 +02001678 alc_setup_gpio(codec, 0x01);
Takashi Iwai20f7d922012-02-16 12:35:16 +01001679 }
1680}
1681
Takashi Iwai118cb4a2012-04-19 07:33:27 +02001682static void alc260_fixup_kn1(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01001683 const struct hda_fixup *fix, int action)
Takashi Iwai118cb4a2012-04-19 07:33:27 +02001684{
1685 struct alc_spec *spec = codec->spec;
Takashi Iwai1727a772013-01-10 09:52:52 +01001686 static const struct hda_pintbl pincfgs[] = {
Takashi Iwai118cb4a2012-04-19 07:33:27 +02001687 { 0x0f, 0x02214000 }, /* HP/speaker */
1688 { 0x12, 0x90a60160 }, /* int mic */
1689 { 0x13, 0x02a19000 }, /* ext mic */
1690 { 0x18, 0x01446000 }, /* SPDIF out */
1691 /* disable bogus I/O pins */
1692 { 0x10, 0x411111f0 },
1693 { 0x11, 0x411111f0 },
1694 { 0x14, 0x411111f0 },
1695 { 0x15, 0x411111f0 },
1696 { 0x16, 0x411111f0 },
1697 { 0x17, 0x411111f0 },
1698 { 0x19, 0x411111f0 },
1699 { }
1700 };
1701
1702 switch (action) {
Takashi Iwai1727a772013-01-10 09:52:52 +01001703 case HDA_FIXUP_ACT_PRE_PROBE:
1704 snd_hda_apply_pincfgs(codec, pincfgs);
Takashi Iwai118cb4a2012-04-19 07:33:27 +02001705 spec->init_amp = ALC_INIT_NONE;
1706 break;
1707 }
1708}
1709
Takashi Iwai39aedee2013-01-10 17:10:40 +01001710static void alc260_fixup_fsc_s7020(struct hda_codec *codec,
1711 const struct hda_fixup *fix, int action)
1712{
1713 struct alc_spec *spec = codec->spec;
Takashi Iwai1c76aa52018-06-21 16:37:54 +02001714 if (action == HDA_FIXUP_ACT_PRE_PROBE)
Takashi Iwaie6e0ee52013-02-18 17:04:20 +01001715 spec->init_amp = ALC_INIT_NONE;
Takashi Iwai5ebd3bb2013-02-19 18:23:31 +01001716}
1717
1718static void alc260_fixup_fsc_s7020_jwse(struct hda_codec *codec,
1719 const struct hda_fixup *fix, int action)
1720{
1721 struct alc_spec *spec = codec->spec;
1722 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwaif811c3c2013-03-07 18:32:59 +01001723 spec->gen.add_jack_modes = 1;
Takashi Iwai5ebd3bb2013-02-19 18:23:31 +01001724 spec->gen.hp_mic = 1;
Takashi Iwaie6e0ee52013-02-18 17:04:20 +01001725 }
Takashi Iwai39aedee2013-01-10 17:10:40 +01001726}
1727
Takashi Iwai1727a772013-01-10 09:52:52 +01001728static const struct hda_fixup alc260_fixups[] = {
Takashi Iwaica8f0422012-02-16 11:51:19 +01001729 [ALC260_FIXUP_HP_DC5750] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001730 .type = HDA_FIXUP_PINS,
1731 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02001732 { 0x11, 0x90130110 }, /* speaker */
1733 { }
1734 }
1735 },
Takashi Iwaica8f0422012-02-16 11:51:19 +01001736 [ALC260_FIXUP_HP_PIN_0F] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001737 .type = HDA_FIXUP_PINS,
1738 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaica8f0422012-02-16 11:51:19 +01001739 { 0x0f, 0x01214000 }, /* HP */
1740 { }
1741 }
1742 },
1743 [ALC260_FIXUP_COEF] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001744 .type = HDA_FIXUP_VERBS,
Takashi Iwaica8f0422012-02-16 11:51:19 +01001745 .v.verbs = (const struct hda_verb[]) {
Ronan Marquete30cf2d2014-06-01 18:38:53 +02001746 { 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1747 { 0x1a, AC_VERB_SET_PROC_COEF, 0x3040 },
Takashi Iwaica8f0422012-02-16 11:51:19 +01001748 { }
1749 },
Takashi Iwaica8f0422012-02-16 11:51:19 +01001750 },
Takashi Iwai15317ab2012-02-16 12:02:53 +01001751 [ALC260_FIXUP_GPIO1] = {
Takashi Iwai5579cd62018-06-19 22:22:41 +02001752 .type = HDA_FIXUP_FUNC,
1753 .v.func = alc_fixup_gpio1,
Takashi Iwai15317ab2012-02-16 12:02:53 +01001754 },
Takashi Iwai20f7d922012-02-16 12:35:16 +01001755 [ALC260_FIXUP_GPIO1_TOGGLE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001756 .type = HDA_FIXUP_FUNC,
Takashi Iwai20f7d922012-02-16 12:35:16 +01001757 .v.func = alc260_fixup_gpio1_toggle,
1758 .chained = true,
1759 .chain_id = ALC260_FIXUP_HP_PIN_0F,
1760 },
1761 [ALC260_FIXUP_REPLACER] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001762 .type = HDA_FIXUP_VERBS,
Takashi Iwai20f7d922012-02-16 12:35:16 +01001763 .v.verbs = (const struct hda_verb[]) {
Takashi Iwai192a98e2014-06-02 15:16:07 +02001764 { 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1765 { 0x1a, AC_VERB_SET_PROC_COEF, 0x3050 },
Takashi Iwai20f7d922012-02-16 12:35:16 +01001766 { }
1767 },
1768 .chained = true,
1769 .chain_id = ALC260_FIXUP_GPIO1_TOGGLE,
1770 },
Takashi Iwai0a1c4fa2012-02-16 12:42:30 +01001771 [ALC260_FIXUP_HP_B1900] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001772 .type = HDA_FIXUP_FUNC,
Takashi Iwai0a1c4fa2012-02-16 12:42:30 +01001773 .v.func = alc260_fixup_gpio1_toggle,
1774 .chained = true,
1775 .chain_id = ALC260_FIXUP_COEF,
Takashi Iwai118cb4a2012-04-19 07:33:27 +02001776 },
1777 [ALC260_FIXUP_KN1] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01001778 .type = HDA_FIXUP_FUNC,
Takashi Iwai118cb4a2012-04-19 07:33:27 +02001779 .v.func = alc260_fixup_kn1,
1780 },
Takashi Iwai39aedee2013-01-10 17:10:40 +01001781 [ALC260_FIXUP_FSC_S7020] = {
1782 .type = HDA_FIXUP_FUNC,
1783 .v.func = alc260_fixup_fsc_s7020,
1784 },
Takashi Iwai5ebd3bb2013-02-19 18:23:31 +01001785 [ALC260_FIXUP_FSC_S7020_JWSE] = {
1786 .type = HDA_FIXUP_FUNC,
1787 .v.func = alc260_fixup_fsc_s7020_jwse,
1788 .chained = true,
1789 .chain_id = ALC260_FIXUP_FSC_S7020,
1790 },
Takashi Iwaid08c5ef2013-11-22 08:06:36 +01001791 [ALC260_FIXUP_VAIO_PINS] = {
1792 .type = HDA_FIXUP_PINS,
1793 .v.pins = (const struct hda_pintbl[]) {
1794 /* Pin configs are missing completely on some VAIOs */
1795 { 0x0f, 0x01211020 },
1796 { 0x10, 0x0001003f },
1797 { 0x11, 0x411111f0 },
1798 { 0x12, 0x01a15930 },
1799 { 0x13, 0x411111f0 },
1800 { 0x14, 0x411111f0 },
1801 { 0x15, 0x411111f0 },
1802 { 0x16, 0x411111f0 },
1803 { 0x17, 0x411111f0 },
1804 { 0x18, 0x411111f0 },
1805 { 0x19, 0x411111f0 },
1806 { }
1807 }
1808 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02001809};
1810
1811static const struct snd_pci_quirk alc260_fixup_tbl[] = {
Takashi Iwai15317ab2012-02-16 12:02:53 +01001812 SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_FIXUP_GPIO1),
Takashi Iwaica8f0422012-02-16 11:51:19 +01001813 SND_PCI_QUIRK(0x1025, 0x007f, "Acer Aspire 9500", ALC260_FIXUP_COEF),
Takashi Iwai15317ab2012-02-16 12:02:53 +01001814 SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_FIXUP_GPIO1),
Takashi Iwaica8f0422012-02-16 11:51:19 +01001815 SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", ALC260_FIXUP_HP_DC5750),
Takashi Iwai0a1c4fa2012-02-16 12:42:30 +01001816 SND_PCI_QUIRK(0x103c, 0x30ba, "HP Presario B1900", ALC260_FIXUP_HP_B1900),
Takashi Iwaid08c5ef2013-11-22 08:06:36 +01001817 SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_FIXUP_VAIO_PINS),
Takashi Iwai0f5a5b82013-11-21 09:12:52 +01001818 SND_PCI_QUIRK(0x104d, 0x81e2, "Sony VAIO TX", ALC260_FIXUP_HP_PIN_0F),
Takashi Iwai39aedee2013-01-10 17:10:40 +01001819 SND_PCI_QUIRK(0x10cf, 0x1326, "FSC LifeBook S7020", ALC260_FIXUP_FSC_S7020),
Takashi Iwaib1f58082012-02-16 12:45:03 +01001820 SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FIXUP_GPIO1),
Takashi Iwai118cb4a2012-04-19 07:33:27 +02001821 SND_PCI_QUIRK(0x152d, 0x0729, "Quanta KN1", ALC260_FIXUP_KN1),
Takashi Iwai20f7d922012-02-16 12:35:16 +01001822 SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_FIXUP_REPLACER),
Takashi Iwaica8f0422012-02-16 11:51:19 +01001823 SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_FIXUP_COEF),
Takashi Iwai1d045db2011-07-07 18:23:21 +02001824 {}
1825};
1826
Takashi Iwai5ebd3bb2013-02-19 18:23:31 +01001827static const struct hda_model_fixup alc260_fixup_models[] = {
1828 {.id = ALC260_FIXUP_GPIO1, .name = "gpio1"},
1829 {.id = ALC260_FIXUP_COEF, .name = "coef"},
1830 {.id = ALC260_FIXUP_FSC_S7020, .name = "fujitsu"},
1831 {.id = ALC260_FIXUP_FSC_S7020_JWSE, .name = "fujitsu-jwse"},
1832 {}
1833};
1834
Takashi Iwai1d045db2011-07-07 18:23:21 +02001835/*
1836 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02001837static int patch_alc260(struct hda_codec *codec)
1838{
1839 struct alc_spec *spec;
Takashi Iwaic3c2c9e2012-02-16 12:59:55 +01001840 int err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001841
Takashi Iwai3de95172012-05-07 18:03:15 +02001842 err = alc_alloc_spec(codec, 0x07);
1843 if (err < 0)
1844 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001845
Takashi Iwai3de95172012-05-07 18:03:15 +02001846 spec = codec->spec;
Takashi Iwaiea46c3c2013-01-15 18:45:53 +01001847 /* as quite a few machines require HP amp for speaker outputs,
1848 * it's easier to enable it unconditionally; even if it's unneeded,
1849 * it's almost harmless.
1850 */
1851 spec->gen.prefer_hp_amp = 1;
Takashi Iwai7504b6c2013-03-18 11:25:51 +01001852 spec->gen.beep_nid = 0x01;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001853
Takashi Iwai225068a2015-05-29 10:42:14 +02001854 spec->shutup = alc_eapd_shutup;
1855
Takashi Iwaic9af7532019-05-10 11:01:43 +02001856 alc_pre_init(codec);
1857
Takashi Iwai5ebd3bb2013-02-19 18:23:31 +01001858 snd_hda_pick_fixup(codec, alc260_fixup_models, alc260_fixup_tbl,
1859 alc260_fixups);
Takashi Iwai1727a772013-01-10 09:52:52 +01001860 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai1d045db2011-07-07 18:23:21 +02001861
Takashi Iwaic3c2c9e2012-02-16 12:59:55 +01001862 /* automatic parse from the BIOS config */
1863 err = alc260_parse_auto_config(codec);
1864 if (err < 0)
1865 goto error;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001866
Takashi Iwaifea80fa2018-06-20 12:52:46 +02001867 if (!spec->gen.no_analog) {
1868 err = set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
1869 if (err < 0)
1870 goto error;
1871 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02001872
Takashi Iwai1727a772013-01-10 09:52:52 +01001873 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01001874
Takashi Iwai1d045db2011-07-07 18:23:21 +02001875 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02001876
1877 error:
1878 alc_free(codec);
1879 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02001880}
1881
1882
1883/*
1884 * ALC882/883/885/888/889 support
1885 *
1886 * ALC882 is almost identical with ALC880 but has cleaner and more flexible
1887 * configuration. Each pin widget can choose any input DACs and a mixer.
1888 * Each ADC is connected from a mixer of all inputs. This makes possible
1889 * 6-channel independent captures.
1890 *
1891 * In addition, an independent DAC for the multi-playback (not used in this
1892 * driver yet).
1893 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02001894
1895/*
1896 * Pin config fixes
1897 */
1898enum {
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01001899 ALC882_FIXUP_ABIT_AW9D_MAX,
1900 ALC882_FIXUP_LENOVO_Y530,
1901 ALC882_FIXUP_PB_M5210,
1902 ALC882_FIXUP_ACER_ASPIRE_7736,
1903 ALC882_FIXUP_ASUS_W90V,
Marton Balint8f239212012-03-05 21:33:23 +01001904 ALC889_FIXUP_CD,
David Henningssonb2c53e22014-01-01 14:01:34 +01001905 ALC889_FIXUP_FRONT_HP_NO_PRESENCE,
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01001906 ALC889_FIXUP_VAIO_TT,
Takashi Iwai0e7cc2e2011-11-09 12:42:48 +01001907 ALC888_FIXUP_EEE1601,
PeiSen Hou4841b8e2021-02-02 10:30:22 +01001908 ALC886_FIXUP_EAPD,
Takashi Iwai177943a32011-11-09 12:55:18 +01001909 ALC882_FIXUP_EAPD,
Takashi Iwai7a6069b2011-11-09 15:22:01 +01001910 ALC883_FIXUP_EAPD,
Takashi Iwai8812c4f2011-11-09 17:39:15 +01001911 ALC883_FIXUP_ACER_EAPD,
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001912 ALC882_FIXUP_GPIO1,
1913 ALC882_FIXUP_GPIO2,
Takashi Iwaieb844d52011-11-09 18:03:07 +01001914 ALC882_FIXUP_GPIO3,
Takashi Iwai68ef0562011-11-09 18:24:44 +01001915 ALC889_FIXUP_COEF,
1916 ALC882_FIXUP_ASUS_W2JC,
Takashi Iwaic3e837b2011-11-10 16:01:47 +01001917 ALC882_FIXUP_ACER_ASPIRE_4930G,
1918 ALC882_FIXUP_ACER_ASPIRE_8930G,
1919 ALC882_FIXUP_ASPIRE_8930G_VERBS,
Takashi Iwai56710872011-11-14 17:42:11 +01001920 ALC885_FIXUP_MACPRO_GPIO,
Takashi Iwai02a237b2012-02-13 15:25:07 +01001921 ALC889_FIXUP_DAC_ROUTE,
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001922 ALC889_FIXUP_MBP_VREF,
1923 ALC889_FIXUP_IMAC91_VREF,
Adrien Vergée7729a42014-01-24 14:56:14 -05001924 ALC889_FIXUP_MBA11_VREF,
Takashi Iwai0756f092013-12-04 13:59:45 +01001925 ALC889_FIXUP_MBA21_VREF,
Takashi Iwaic20f31e2014-02-03 11:02:10 +01001926 ALC889_FIXUP_MP11_VREF,
Mario Kleiner9f660a12015-12-22 00:45:43 +01001927 ALC889_FIXUP_MP41_VREF,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02001928 ALC882_FIXUP_INV_DMIC,
Takashi Iwaie427c232012-07-29 10:04:08 +02001929 ALC882_FIXUP_NO_PRIMARY_HP,
Takashi Iwai1f0bbf02013-11-28 15:21:21 +01001930 ALC887_FIXUP_ASUS_BASS,
Takashi Iwaieb9ca3a2013-11-28 15:24:34 +01001931 ALC887_FIXUP_BASS_CHMAP,
Takashi Iwai7beb3a62017-04-10 18:05:52 +02001932 ALC1220_FIXUP_GB_DUAL_CODECS,
Peisen0202f5c2017-10-26 10:35:36 +08001933 ALC1220_FIXUP_CLEVO_P950,
Richard Sailer80690a22019-04-02 15:52:04 +02001934 ALC1220_FIXUP_CLEVO_PB51ED,
1935 ALC1220_FIXUP_CLEVO_PB51ED_PINS,
Jian-Hong Panca184352020-10-07 13:22:25 +08001936 ALC887_FIXUP_ASUS_AUDIO,
1937 ALC887_FIXUP_ASUS_HMIC,
Takashi Iwai1d045db2011-07-07 18:23:21 +02001938};
1939
Takashi Iwai68ef0562011-11-09 18:24:44 +01001940static void alc889_fixup_coef(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01001941 const struct hda_fixup *fix, int action)
Takashi Iwai68ef0562011-11-09 18:24:44 +01001942{
Takashi Iwai1727a772013-01-10 09:52:52 +01001943 if (action != HDA_FIXUP_ACT_INIT)
Takashi Iwai68ef0562011-11-09 18:24:44 +01001944 return;
Kailang Yang1df88742014-10-29 16:10:13 +08001945 alc_update_coef_idx(codec, 7, 0, 0x2030);
Takashi Iwai68ef0562011-11-09 18:24:44 +01001946}
1947
Takashi Iwai56710872011-11-14 17:42:11 +01001948/* set up GPIO at initialization */
1949static void alc885_fixup_macpro_gpio(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01001950 const struct hda_fixup *fix, int action)
Takashi Iwai56710872011-11-14 17:42:11 +01001951{
Takashi Iwai215c8502018-06-19 22:34:26 +02001952 struct alc_spec *spec = codec->spec;
1953
1954 spec->gpio_write_delay = true;
1955 alc_fixup_gpio3(codec, fix, action);
Takashi Iwai56710872011-11-14 17:42:11 +01001956}
1957
Takashi Iwai02a237b2012-02-13 15:25:07 +01001958/* Fix the connection of some pins for ALC889:
1959 * At least, Acer Aspire 5935 shows the connections to DAC3/4 don't
1960 * work correctly (bko#42740)
1961 */
1962static void alc889_fixup_dac_route(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01001963 const struct hda_fixup *fix, int action)
Takashi Iwai02a237b2012-02-13 15:25:07 +01001964{
Takashi Iwai1727a772013-01-10 09:52:52 +01001965 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwaief8d60f2012-02-17 10:12:38 +01001966 /* fake the connections during parsing the tree */
Michał Mirosławcaf3c042020-01-03 10:23:48 +01001967 static const hda_nid_t conn1[] = { 0x0c, 0x0d };
1968 static const hda_nid_t conn2[] = { 0x0e, 0x0f };
1969 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
1970 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
1971 snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn2), conn2);
1972 snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn2), conn2);
Takashi Iwai1727a772013-01-10 09:52:52 +01001973 } else if (action == HDA_FIXUP_ACT_PROBE) {
Takashi Iwaief8d60f2012-02-17 10:12:38 +01001974 /* restore the connections */
Michał Mirosławcaf3c042020-01-03 10:23:48 +01001975 static const hda_nid_t conn[] = { 0x0c, 0x0d, 0x0e, 0x0f, 0x26 };
1976 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
1977 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn), conn);
1978 snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn), conn);
1979 snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn), conn);
Takashi Iwai02a237b2012-02-13 15:25:07 +01001980 }
1981}
1982
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001983/* Set VREF on HP pin */
1984static void alc889_fixup_mbp_vref(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01001985 const struct hda_fixup *fix, int action)
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001986{
Michał Mirosławcaf3c042020-01-03 10:23:48 +01001987 static const hda_nid_t nids[] = { 0x14, 0x15, 0x19 };
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001988 struct alc_spec *spec = codec->spec;
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001989 int i;
1990
Takashi Iwai1727a772013-01-10 09:52:52 +01001991 if (action != HDA_FIXUP_ACT_INIT)
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001992 return;
1993 for (i = 0; i < ARRAY_SIZE(nids); i++) {
1994 unsigned int val = snd_hda_codec_get_pincfg(codec, nids[i]);
1995 if (get_defcfg_device(val) != AC_JACK_HP_OUT)
1996 continue;
Takashi Iwaid3f02d62013-01-10 10:12:22 +01001997 val = snd_hda_codec_get_pin_target(codec, nids[i]);
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001998 val |= AC_PINCTL_VREF_80;
Takashi Iwaicdd03ce2012-04-20 12:34:50 +02001999 snd_hda_set_pin_ctl(codec, nids[i], val);
Takashi Iwai08c189f2012-12-19 15:22:24 +01002000 spec->gen.keep_vref_in_automute = 1;
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002001 break;
2002 }
2003}
2004
Takashi Iwai0756f092013-12-04 13:59:45 +01002005static void alc889_fixup_mac_pins(struct hda_codec *codec,
2006 const hda_nid_t *nids, int num_nids)
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002007{
2008 struct alc_spec *spec = codec->spec;
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002009 int i;
2010
Takashi Iwai0756f092013-12-04 13:59:45 +01002011 for (i = 0; i < num_nids; i++) {
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002012 unsigned int val;
Takashi Iwaid3f02d62013-01-10 10:12:22 +01002013 val = snd_hda_codec_get_pin_target(codec, nids[i]);
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002014 val |= AC_PINCTL_VREF_50;
Takashi Iwaicdd03ce2012-04-20 12:34:50 +02002015 snd_hda_set_pin_ctl(codec, nids[i], val);
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002016 }
Takashi Iwai08c189f2012-12-19 15:22:24 +01002017 spec->gen.keep_vref_in_automute = 1;
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002018}
2019
Takashi Iwai0756f092013-12-04 13:59:45 +01002020/* Set VREF on speaker pins on imac91 */
2021static void alc889_fixup_imac91_vref(struct hda_codec *codec,
2022 const struct hda_fixup *fix, int action)
2023{
Michał Mirosławcaf3c042020-01-03 10:23:48 +01002024 static const hda_nid_t nids[] = { 0x18, 0x1a };
Takashi Iwai0756f092013-12-04 13:59:45 +01002025
2026 if (action == HDA_FIXUP_ACT_INIT)
2027 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2028}
2029
Adrien Vergée7729a42014-01-24 14:56:14 -05002030/* Set VREF on speaker pins on mba11 */
2031static void alc889_fixup_mba11_vref(struct hda_codec *codec,
2032 const struct hda_fixup *fix, int action)
2033{
Michał Mirosławcaf3c042020-01-03 10:23:48 +01002034 static const hda_nid_t nids[] = { 0x18 };
Adrien Vergée7729a42014-01-24 14:56:14 -05002035
2036 if (action == HDA_FIXUP_ACT_INIT)
2037 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2038}
2039
Takashi Iwai0756f092013-12-04 13:59:45 +01002040/* Set VREF on speaker pins on mba21 */
2041static void alc889_fixup_mba21_vref(struct hda_codec *codec,
2042 const struct hda_fixup *fix, int action)
2043{
Michał Mirosławcaf3c042020-01-03 10:23:48 +01002044 static const hda_nid_t nids[] = { 0x18, 0x19 };
Takashi Iwai0756f092013-12-04 13:59:45 +01002045
2046 if (action == HDA_FIXUP_ACT_INIT)
2047 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2048}
2049
Takashi Iwaie427c232012-07-29 10:04:08 +02002050/* Don't take HP output as primary
Fernando Luis Vázquez Caod9111492013-02-12 16:49:46 +09002051 * Strangely, the speaker output doesn't work on Vaio Z and some Vaio
2052 * all-in-one desktop PCs (for example VGC-LN51JGB) through DAC 0x05
Takashi Iwaie427c232012-07-29 10:04:08 +02002053 */
2054static void alc882_fixup_no_primary_hp(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01002055 const struct hda_fixup *fix, int action)
Takashi Iwaie427c232012-07-29 10:04:08 +02002056{
2057 struct alc_spec *spec = codec->spec;
Takashi Iwaida96fb52013-07-29 16:54:36 +02002058 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai08c189f2012-12-19 15:22:24 +01002059 spec->gen.no_primary_hp = 1;
Takashi Iwaida96fb52013-07-29 16:54:36 +02002060 spec->gen.no_multi_io = 1;
2061 }
Takashi Iwaie427c232012-07-29 10:04:08 +02002062}
2063
Takashi Iwaieb9ca3a2013-11-28 15:24:34 +01002064static void alc_fixup_bass_chmap(struct hda_codec *codec,
2065 const struct hda_fixup *fix, int action);
2066
Takashi Iwai7beb3a62017-04-10 18:05:52 +02002067/* For dual-codec configuration, we need to disable some features to avoid
2068 * conflicts of kctls and PCM streams
2069 */
2070static void alc_fixup_dual_codecs(struct hda_codec *codec,
2071 const struct hda_fixup *fix, int action)
2072{
2073 struct alc_spec *spec = codec->spec;
2074
2075 if (action != HDA_FIXUP_ACT_PRE_PROBE)
2076 return;
2077 /* disable vmaster */
2078 spec->gen.suppress_vmaster = 1;
2079 /* auto-mute and auto-mic switch don't work with multiple codecs */
2080 spec->gen.suppress_auto_mute = 1;
2081 spec->gen.suppress_auto_mic = 1;
2082 /* disable aamix as well */
2083 spec->gen.mixer_nid = 0;
2084 /* add location prefix to avoid conflicts */
2085 codec->force_pin_prefix = 1;
2086}
2087
2088static void rename_ctl(struct hda_codec *codec, const char *oldname,
2089 const char *newname)
2090{
2091 struct snd_kcontrol *kctl;
2092
2093 kctl = snd_hda_find_mixer_ctl(codec, oldname);
2094 if (kctl)
2095 strcpy(kctl->id.name, newname);
2096}
2097
2098static void alc1220_fixup_gb_dual_codecs(struct hda_codec *codec,
2099 const struct hda_fixup *fix,
2100 int action)
2101{
2102 alc_fixup_dual_codecs(codec, fix, action);
2103 switch (action) {
2104 case HDA_FIXUP_ACT_PRE_PROBE:
2105 /* override card longname to provide a unique UCM profile */
2106 strcpy(codec->card->longname, "HDAudio-Gigabyte-ALC1220DualCodecs");
2107 break;
2108 case HDA_FIXUP_ACT_BUILD:
2109 /* rename Capture controls depending on the codec */
2110 rename_ctl(codec, "Capture Volume",
2111 codec->addr == 0 ?
2112 "Rear-Panel Capture Volume" :
2113 "Front-Panel Capture Volume");
2114 rename_ctl(codec, "Capture Switch",
2115 codec->addr == 0 ?
2116 "Rear-Panel Capture Switch" :
2117 "Front-Panel Capture Switch");
2118 break;
2119 }
2120}
2121
Peisen0202f5c2017-10-26 10:35:36 +08002122static void alc1220_fixup_clevo_p950(struct hda_codec *codec,
2123 const struct hda_fixup *fix,
2124 int action)
2125{
Michał Mirosławcaf3c042020-01-03 10:23:48 +01002126 static const hda_nid_t conn1[] = { 0x0c };
Peisen0202f5c2017-10-26 10:35:36 +08002127
2128 if (action != HDA_FIXUP_ACT_PRE_PROBE)
2129 return;
2130
2131 alc_update_coef_idx(codec, 0x7, 0, 0x3c3);
2132 /* We therefore want to make sure 0x14 (front headphone) and
2133 * 0x1b (speakers) use the stereo DAC 0x02
2134 */
Michał Mirosławcaf3c042020-01-03 10:23:48 +01002135 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2136 snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
Peisen0202f5c2017-10-26 10:35:36 +08002137}
2138
Jeremy Soller7f665b12019-02-13 10:56:19 -07002139static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
2140 const struct hda_fixup *fix, int action);
2141
Richard Sailer80690a22019-04-02 15:52:04 +02002142static void alc1220_fixup_clevo_pb51ed(struct hda_codec *codec,
Jeremy Soller7f665b12019-02-13 10:56:19 -07002143 const struct hda_fixup *fix,
2144 int action)
2145{
2146 alc1220_fixup_clevo_p950(codec, fix, action);
2147 alc_fixup_headset_mode_no_hp_mic(codec, fix, action);
2148}
2149
Jian-Hong Panca184352020-10-07 13:22:25 +08002150static void alc887_asus_hp_automute_hook(struct hda_codec *codec,
2151 struct hda_jack_callback *jack)
2152{
2153 struct alc_spec *spec = codec->spec;
2154 unsigned int vref;
2155
2156 snd_hda_gen_hp_automute(codec, jack);
2157
2158 if (spec->gen.hp_jack_present)
2159 vref = AC_PINCTL_VREF_80;
2160 else
2161 vref = AC_PINCTL_VREF_HIZ;
2162 snd_hda_set_pin_ctl(codec, 0x19, PIN_HP | vref);
2163}
2164
2165static void alc887_fixup_asus_jack(struct hda_codec *codec,
2166 const struct hda_fixup *fix, int action)
2167{
2168 struct alc_spec *spec = codec->spec;
2169 if (action != HDA_FIXUP_ACT_PROBE)
2170 return;
2171 snd_hda_set_pin_ctl_cache(codec, 0x1b, PIN_HP);
2172 spec->gen.hp_automute_hook = alc887_asus_hp_automute_hook;
2173}
2174
Takashi Iwai1727a772013-01-10 09:52:52 +01002175static const struct hda_fixup alc882_fixups[] = {
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002176 [ALC882_FIXUP_ABIT_AW9D_MAX] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002177 .type = HDA_FIXUP_PINS,
2178 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02002179 { 0x15, 0x01080104 }, /* side */
2180 { 0x16, 0x01011012 }, /* rear */
2181 { 0x17, 0x01016011 }, /* clfe */
2182 { }
2183 }
2184 },
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002185 [ALC882_FIXUP_LENOVO_Y530] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002186 .type = HDA_FIXUP_PINS,
2187 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02002188 { 0x15, 0x99130112 }, /* rear int speakers */
2189 { 0x16, 0x99130111 }, /* subwoofer */
2190 { }
2191 }
2192 },
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002193 [ALC882_FIXUP_PB_M5210] = {
Takashi Iwaifd108212013-01-10 10:18:14 +01002194 .type = HDA_FIXUP_PINCTLS,
2195 .v.pins = (const struct hda_pintbl[]) {
2196 { 0x19, PIN_VREF50 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02002197 {}
2198 }
2199 },
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002200 [ALC882_FIXUP_ACER_ASPIRE_7736] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002201 .type = HDA_FIXUP_FUNC,
Takashi Iwai23d30f22012-05-07 17:17:32 +02002202 .v.func = alc_fixup_sku_ignore,
Takashi Iwai1d045db2011-07-07 18:23:21 +02002203 },
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002204 [ALC882_FIXUP_ASUS_W90V] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002205 .type = HDA_FIXUP_PINS,
2206 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai5cdf7452011-10-26 23:04:08 +02002207 { 0x16, 0x99130110 }, /* fix sequence for CLFE */
2208 { }
2209 }
2210 },
Marton Balint8f239212012-03-05 21:33:23 +01002211 [ALC889_FIXUP_CD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002212 .type = HDA_FIXUP_PINS,
2213 .v.pins = (const struct hda_pintbl[]) {
Marton Balint8f239212012-03-05 21:33:23 +01002214 { 0x1c, 0x993301f0 }, /* CD */
2215 { }
2216 }
2217 },
David Henningssonb2c53e22014-01-01 14:01:34 +01002218 [ALC889_FIXUP_FRONT_HP_NO_PRESENCE] = {
2219 .type = HDA_FIXUP_PINS,
2220 .v.pins = (const struct hda_pintbl[]) {
2221 { 0x1b, 0x02214120 }, /* Front HP jack is flaky, disable jack detect */
2222 { }
2223 },
2224 .chained = true,
2225 .chain_id = ALC889_FIXUP_CD,
2226 },
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002227 [ALC889_FIXUP_VAIO_TT] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002228 .type = HDA_FIXUP_PINS,
2229 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002230 { 0x17, 0x90170111 }, /* hidden surround speaker */
2231 { }
2232 }
2233 },
Takashi Iwai0e7cc2e2011-11-09 12:42:48 +01002234 [ALC888_FIXUP_EEE1601] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002235 .type = HDA_FIXUP_VERBS,
Takashi Iwai0e7cc2e2011-11-09 12:42:48 +01002236 .v.verbs = (const struct hda_verb[]) {
2237 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2238 { 0x20, AC_VERB_SET_PROC_COEF, 0x0838 },
2239 { }
2240 }
Takashi Iwai177943a32011-11-09 12:55:18 +01002241 },
PeiSen Hou4841b8e2021-02-02 10:30:22 +01002242 [ALC886_FIXUP_EAPD] = {
2243 .type = HDA_FIXUP_VERBS,
2244 .v.verbs = (const struct hda_verb[]) {
2245 /* change to EAPD mode */
2246 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2247 { 0x20, AC_VERB_SET_PROC_COEF, 0x0068 },
2248 { }
2249 }
2250 },
Takashi Iwai177943a32011-11-09 12:55:18 +01002251 [ALC882_FIXUP_EAPD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002252 .type = HDA_FIXUP_VERBS,
Takashi Iwai177943a32011-11-09 12:55:18 +01002253 .v.verbs = (const struct hda_verb[]) {
2254 /* change to EAPD mode */
2255 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2256 { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
2257 { }
2258 }
2259 },
Takashi Iwai7a6069b2011-11-09 15:22:01 +01002260 [ALC883_FIXUP_EAPD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002261 .type = HDA_FIXUP_VERBS,
Takashi Iwai7a6069b2011-11-09 15:22:01 +01002262 .v.verbs = (const struct hda_verb[]) {
2263 /* change to EAPD mode */
2264 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2265 { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2266 { }
2267 }
2268 },
Takashi Iwai8812c4f2011-11-09 17:39:15 +01002269 [ALC883_FIXUP_ACER_EAPD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002270 .type = HDA_FIXUP_VERBS,
Takashi Iwai8812c4f2011-11-09 17:39:15 +01002271 .v.verbs = (const struct hda_verb[]) {
2272 /* eanable EAPD on Acer laptops */
2273 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2274 { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2275 { }
2276 }
2277 },
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002278 [ALC882_FIXUP_GPIO1] = {
Takashi Iwai5579cd62018-06-19 22:22:41 +02002279 .type = HDA_FIXUP_FUNC,
2280 .v.func = alc_fixup_gpio1,
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002281 },
2282 [ALC882_FIXUP_GPIO2] = {
Takashi Iwai5579cd62018-06-19 22:22:41 +02002283 .type = HDA_FIXUP_FUNC,
2284 .v.func = alc_fixup_gpio2,
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002285 },
Takashi Iwaieb844d52011-11-09 18:03:07 +01002286 [ALC882_FIXUP_GPIO3] = {
Takashi Iwai5579cd62018-06-19 22:22:41 +02002287 .type = HDA_FIXUP_FUNC,
2288 .v.func = alc_fixup_gpio3,
Takashi Iwaieb844d52011-11-09 18:03:07 +01002289 },
Takashi Iwai68ef0562011-11-09 18:24:44 +01002290 [ALC882_FIXUP_ASUS_W2JC] = {
Takashi Iwai5579cd62018-06-19 22:22:41 +02002291 .type = HDA_FIXUP_FUNC,
2292 .v.func = alc_fixup_gpio1,
Takashi Iwai68ef0562011-11-09 18:24:44 +01002293 .chained = true,
2294 .chain_id = ALC882_FIXUP_EAPD,
2295 },
2296 [ALC889_FIXUP_COEF] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002297 .type = HDA_FIXUP_FUNC,
Takashi Iwai68ef0562011-11-09 18:24:44 +01002298 .v.func = alc889_fixup_coef,
2299 },
Takashi Iwaic3e837b2011-11-10 16:01:47 +01002300 [ALC882_FIXUP_ACER_ASPIRE_4930G] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002301 .type = HDA_FIXUP_PINS,
2302 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaic3e837b2011-11-10 16:01:47 +01002303 { 0x16, 0x99130111 }, /* CLFE speaker */
2304 { 0x17, 0x99130112 }, /* surround speaker */
2305 { }
Takashi Iwai038d4fe2012-04-11 17:18:12 +02002306 },
2307 .chained = true,
2308 .chain_id = ALC882_FIXUP_GPIO1,
Takashi Iwaic3e837b2011-11-10 16:01:47 +01002309 },
2310 [ALC882_FIXUP_ACER_ASPIRE_8930G] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002311 .type = HDA_FIXUP_PINS,
2312 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaic3e837b2011-11-10 16:01:47 +01002313 { 0x16, 0x99130111 }, /* CLFE speaker */
2314 { 0x1b, 0x99130112 }, /* surround speaker */
2315 { }
2316 },
2317 .chained = true,
2318 .chain_id = ALC882_FIXUP_ASPIRE_8930G_VERBS,
2319 },
2320 [ALC882_FIXUP_ASPIRE_8930G_VERBS] = {
2321 /* additional init verbs for Acer Aspire 8930G */
Takashi Iwai1727a772013-01-10 09:52:52 +01002322 .type = HDA_FIXUP_VERBS,
Takashi Iwaic3e837b2011-11-10 16:01:47 +01002323 .v.verbs = (const struct hda_verb[]) {
2324 /* Enable all DACs */
2325 /* DAC DISABLE/MUTE 1? */
2326 /* setting bits 1-5 disables DAC nids 0x02-0x06
2327 * apparently. Init=0x38 */
2328 { 0x20, AC_VERB_SET_COEF_INDEX, 0x03 },
2329 { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2330 /* DAC DISABLE/MUTE 2? */
2331 /* some bit here disables the other DACs.
2332 * Init=0x4900 */
2333 { 0x20, AC_VERB_SET_COEF_INDEX, 0x08 },
2334 { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2335 /* DMIC fix
2336 * This laptop has a stereo digital microphone.
2337 * The mics are only 1cm apart which makes the stereo
2338 * useless. However, either the mic or the ALC889
2339 * makes the signal become a difference/sum signal
2340 * instead of standard stereo, which is annoying.
2341 * So instead we flip this bit which makes the
2342 * codec replicate the sum signal to both channels,
2343 * turning it into a normal mono mic.
2344 */
2345 /* DMIC_CONTROL? Init value = 0x0001 */
2346 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2347 { 0x20, AC_VERB_SET_PROC_COEF, 0x0003 },
2348 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2349 { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2350 { }
Takashi Iwai038d4fe2012-04-11 17:18:12 +02002351 },
2352 .chained = true,
2353 .chain_id = ALC882_FIXUP_GPIO1,
Takashi Iwaic3e837b2011-11-10 16:01:47 +01002354 },
Takashi Iwai56710872011-11-14 17:42:11 +01002355 [ALC885_FIXUP_MACPRO_GPIO] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002356 .type = HDA_FIXUP_FUNC,
Takashi Iwai56710872011-11-14 17:42:11 +01002357 .v.func = alc885_fixup_macpro_gpio,
2358 },
Takashi Iwai02a237b2012-02-13 15:25:07 +01002359 [ALC889_FIXUP_DAC_ROUTE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002360 .type = HDA_FIXUP_FUNC,
Takashi Iwai02a237b2012-02-13 15:25:07 +01002361 .v.func = alc889_fixup_dac_route,
2362 },
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002363 [ALC889_FIXUP_MBP_VREF] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002364 .type = HDA_FIXUP_FUNC,
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002365 .v.func = alc889_fixup_mbp_vref,
2366 .chained = true,
2367 .chain_id = ALC882_FIXUP_GPIO1,
2368 },
2369 [ALC889_FIXUP_IMAC91_VREF] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002370 .type = HDA_FIXUP_FUNC,
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002371 .v.func = alc889_fixup_imac91_vref,
2372 .chained = true,
2373 .chain_id = ALC882_FIXUP_GPIO1,
2374 },
Adrien Vergée7729a42014-01-24 14:56:14 -05002375 [ALC889_FIXUP_MBA11_VREF] = {
2376 .type = HDA_FIXUP_FUNC,
2377 .v.func = alc889_fixup_mba11_vref,
2378 .chained = true,
2379 .chain_id = ALC889_FIXUP_MBP_VREF,
2380 },
Takashi Iwai0756f092013-12-04 13:59:45 +01002381 [ALC889_FIXUP_MBA21_VREF] = {
2382 .type = HDA_FIXUP_FUNC,
2383 .v.func = alc889_fixup_mba21_vref,
2384 .chained = true,
2385 .chain_id = ALC889_FIXUP_MBP_VREF,
2386 },
Takashi Iwaic20f31e2014-02-03 11:02:10 +01002387 [ALC889_FIXUP_MP11_VREF] = {
2388 .type = HDA_FIXUP_FUNC,
2389 .v.func = alc889_fixup_mba11_vref,
2390 .chained = true,
2391 .chain_id = ALC885_FIXUP_MACPRO_GPIO,
2392 },
Mario Kleiner9f660a12015-12-22 00:45:43 +01002393 [ALC889_FIXUP_MP41_VREF] = {
2394 .type = HDA_FIXUP_FUNC,
2395 .v.func = alc889_fixup_mbp_vref,
2396 .chained = true,
2397 .chain_id = ALC885_FIXUP_MACPRO_GPIO,
2398 },
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002399 [ALC882_FIXUP_INV_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002400 .type = HDA_FIXUP_FUNC,
David Henningsson9d36a7d2014-10-07 10:18:42 +02002401 .v.func = alc_fixup_inv_dmic,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002402 },
Takashi Iwaie427c232012-07-29 10:04:08 +02002403 [ALC882_FIXUP_NO_PRIMARY_HP] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002404 .type = HDA_FIXUP_FUNC,
Takashi Iwaie427c232012-07-29 10:04:08 +02002405 .v.func = alc882_fixup_no_primary_hp,
2406 },
Takashi Iwai1f0bbf02013-11-28 15:21:21 +01002407 [ALC887_FIXUP_ASUS_BASS] = {
2408 .type = HDA_FIXUP_PINS,
2409 .v.pins = (const struct hda_pintbl[]) {
2410 {0x16, 0x99130130}, /* bass speaker */
2411 {}
2412 },
Takashi Iwaieb9ca3a2013-11-28 15:24:34 +01002413 .chained = true,
2414 .chain_id = ALC887_FIXUP_BASS_CHMAP,
2415 },
2416 [ALC887_FIXUP_BASS_CHMAP] = {
2417 .type = HDA_FIXUP_FUNC,
2418 .v.func = alc_fixup_bass_chmap,
Takashi Iwai1f0bbf02013-11-28 15:21:21 +01002419 },
Takashi Iwai7beb3a62017-04-10 18:05:52 +02002420 [ALC1220_FIXUP_GB_DUAL_CODECS] = {
2421 .type = HDA_FIXUP_FUNC,
2422 .v.func = alc1220_fixup_gb_dual_codecs,
2423 },
Peisen0202f5c2017-10-26 10:35:36 +08002424 [ALC1220_FIXUP_CLEVO_P950] = {
2425 .type = HDA_FIXUP_FUNC,
2426 .v.func = alc1220_fixup_clevo_p950,
2427 },
Richard Sailer80690a22019-04-02 15:52:04 +02002428 [ALC1220_FIXUP_CLEVO_PB51ED] = {
Jeremy Soller7f665b12019-02-13 10:56:19 -07002429 .type = HDA_FIXUP_FUNC,
Richard Sailer80690a22019-04-02 15:52:04 +02002430 .v.func = alc1220_fixup_clevo_pb51ed,
Jeremy Soller7f665b12019-02-13 10:56:19 -07002431 },
Richard Sailer80690a22019-04-02 15:52:04 +02002432 [ALC1220_FIXUP_CLEVO_PB51ED_PINS] = {
Jeremy Soller7f665b12019-02-13 10:56:19 -07002433 .type = HDA_FIXUP_PINS,
2434 .v.pins = (const struct hda_pintbl[]) {
2435 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
2436 {}
2437 },
2438 .chained = true,
Richard Sailer80690a22019-04-02 15:52:04 +02002439 .chain_id = ALC1220_FIXUP_CLEVO_PB51ED,
Jeremy Soller7f665b12019-02-13 10:56:19 -07002440 },
Jian-Hong Panca184352020-10-07 13:22:25 +08002441 [ALC887_FIXUP_ASUS_AUDIO] = {
2442 .type = HDA_FIXUP_PINS,
2443 .v.pins = (const struct hda_pintbl[]) {
2444 { 0x15, 0x02a14150 }, /* use as headset mic, without its own jack detect */
2445 { 0x19, 0x22219420 },
2446 {}
2447 },
2448 },
2449 [ALC887_FIXUP_ASUS_HMIC] = {
2450 .type = HDA_FIXUP_FUNC,
2451 .v.func = alc887_fixup_asus_jack,
2452 .chained = true,
2453 .chain_id = ALC887_FIXUP_ASUS_AUDIO,
2454 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02002455};
2456
2457static const struct snd_pci_quirk alc882_fixup_tbl[] = {
Takashi Iwai8812c4f2011-11-09 17:39:15 +01002458 SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD),
2459 SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
Takashi Iwaib5d724b2015-06-02 19:57:08 +02002460 SND_PCI_QUIRK(0x1025, 0x0107, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
Takashi Iwai8812c4f2011-11-09 17:39:15 +01002461 SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD),
2462 SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2463 SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD),
2464 SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_FIXUP_ACER_EAPD),
Takashi Iwaic3e837b2011-11-10 16:01:47 +01002465 SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
2466 ALC882_FIXUP_ACER_ASPIRE_4930G),
2467 SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
2468 ALC882_FIXUP_ACER_ASPIRE_4930G),
2469 SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
2470 ALC882_FIXUP_ACER_ASPIRE_8930G),
2471 SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
2472 ALC882_FIXUP_ACER_ASPIRE_8930G),
2473 SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
2474 ALC882_FIXUP_ACER_ASPIRE_4930G),
2475 SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
2476 ALC882_FIXUP_ACER_ASPIRE_4930G),
2477 SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
2478 ALC882_FIXUP_ACER_ASPIRE_4930G),
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002479 SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
Takashi Iwaif5c53d82012-05-07 10:07:33 +02002480 SND_PCI_QUIRK(0x1025, 0x021e, "Acer Aspire 5739G",
2481 ALC882_FIXUP_ACER_ASPIRE_4930G),
Takashi Iwai02a237b2012-02-13 15:25:07 +01002482 SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),
Takashi Iwaife97da12012-04-12 08:00:19 +02002483 SND_PCI_QUIRK(0x1025, 0x026b, "Acer Aspire 8940G", ALC882_FIXUP_ACER_ASPIRE_8930G),
Takashi Iwaiac9b1cd2011-11-09 17:45:55 +01002484 SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736),
Takashi Iwai177943a32011-11-09 12:55:18 +01002485 SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD),
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002486 SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),
Takashi Iwai68ef0562011-11-09 18:24:44 +01002487 SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_FIXUP_ASUS_W2JC),
Jian-Hong Panca184352020-10-07 13:22:25 +08002488 SND_PCI_QUIRK(0x1043, 0x2390, "Asus D700SA", ALC887_FIXUP_ASUS_HMIC),
Takashi Iwai0e7cc2e2011-11-09 12:42:48 +01002489 SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601),
Takashi Iwai1f0bbf02013-11-28 15:21:21 +01002490 SND_PCI_QUIRK(0x1043, 0x84bc, "ASUS ET2700", ALC887_FIXUP_ASUS_BASS),
Takashi Iwai85bcf962016-12-06 16:20:36 +01002491 SND_PCI_QUIRK(0x1043, 0x8691, "ASUS ROG Ranger VIII", ALC882_FIXUP_GPIO3),
Takashi Iwaiac9b1cd2011-11-09 17:45:55 +01002492 SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT),
Takashi Iwaie427c232012-07-29 10:04:08 +02002493 SND_PCI_QUIRK(0x104d, 0x905a, "Sony Vaio Z", ALC882_FIXUP_NO_PRIMARY_HP),
Sergei A. Trusov3f3c3712017-08-02 20:23:48 +10002494 SND_PCI_QUIRK(0x104d, 0x9060, "Sony Vaio VPCL14M1R", ALC882_FIXUP_NO_PRIMARY_HP),
Fernando Luis Vázquez Cao12e31a72013-02-12 16:47:44 +09002495 SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP),
Takashi Iwaic44d9b12016-02-07 09:38:26 +01002496 SND_PCI_QUIRK(0x104d, 0x9044, "Sony VAIO AiO", ALC882_FIXUP_NO_PRIMARY_HP),
Takashi Iwai56710872011-11-14 17:42:11 +01002497
2498 /* All Apple entries are in codec SSIDs */
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002499 SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF),
2500 SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC889_FIXUP_MBP_VREF),
2501 SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
Takashi Iwaic20f31e2014-02-03 11:02:10 +01002502 SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC889_FIXUP_MP11_VREF),
Takashi Iwai56710872011-11-14 17:42:11 +01002503 SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_FIXUP_MACPRO_GPIO),
2504 SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_FIXUP_MACPRO_GPIO),
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002505 SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC889_FIXUP_MBP_VREF),
2506 SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889_FIXUP_MBP_VREF),
Takashi Iwai56710872011-11-14 17:42:11 +01002507 SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD),
Adrien Vergée7729a42014-01-24 14:56:14 -05002508 SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC889_FIXUP_MBA11_VREF),
Takashi Iwai0756f092013-12-04 13:59:45 +01002509 SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBA21_VREF),
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002510 SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889_FIXUP_MBP_VREF),
2511 SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
Takashi Iwai56710872011-11-14 17:42:11 +01002512 SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO),
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002513 SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF),
2514 SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF),
2515 SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF),
Mario Kleiner9f660a12015-12-22 00:45:43 +01002516 SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 4,1/5,1", ALC889_FIXUP_MP41_VREF),
Takashi Iwai05193632012-11-12 10:07:36 +01002517 SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF),
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002518 SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),
2519 SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),
Takashi Iwai649ccd02015-07-30 22:30:29 +02002520 SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_MBA11_VREF),
Takashi Iwai56710872011-11-14 17:42:11 +01002521
Takashi Iwai7a6069b2011-11-09 15:22:01 +01002522 SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),
PeiSen Hou4841b8e2021-02-02 10:30:22 +01002523 SND_PCI_QUIRK(0x13fe, 0x1009, "Advantech MIT-W101", ALC886_FIXUP_EAPD),
David Henningssonb2c53e22014-01-01 14:01:34 +01002524 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE),
Takashi Iwai7beb3a62017-04-10 18:05:52 +02002525 SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
Christian Lachner0d45e862020-02-23 10:24:16 +01002526 SND_PCI_QUIRK(0x1458, 0xa0cd, "Gigabyte X570 Aorus Master", ALC1220_FIXUP_CLEVO_P950),
Christian Lachnerd9e8fe02020-05-18 07:38:44 +02002527 SND_PCI_QUIRK(0x1458, 0xa0ce, "Gigabyte X570 Aorus Xtreme", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwaia0b03952020-06-16 15:21:50 +02002528 SND_PCI_QUIRK(0x1462, 0x11f7, "MSI-GE63", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwaia655e2b2020-02-17 16:19:47 +01002529 SND_PCI_QUIRK(0x1462, 0x1228, "MSI-GP63", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwai09926202020-12-20 09:09:43 +01002530 SND_PCI_QUIRK(0x1462, 0x1229, "MSI-GP73", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwai1d3aa4a2020-04-08 15:56:45 +02002531 SND_PCI_QUIRK(0x1462, 0x1275, "MSI-GL63", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwai7dafba32020-02-12 09:10:47 +01002532 SND_PCI_QUIRK(0x1462, 0x1276, "MSI-GL73", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwaicc5049a2020-02-18 09:09:15 +01002533 SND_PCI_QUIRK(0x1462, 0x1293, "MSI-GP65", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwaid2c3b142017-06-01 09:35:30 +02002534 SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),
Takashi Iwai26af1772021-03-03 15:23:46 +01002535 SND_PCI_QUIRK(0x1462, 0xcc34, "MSI Godlike X570", ALC1220_FIXUP_GB_DUAL_CODECS),
Takashi Iwai63691582017-05-22 16:32:46 +02002536 SND_PCI_QUIRK(0x1462, 0xda57, "MSI Z270-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
Takashi Iwaid2c3b142017-06-01 09:35:30 +02002537 SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002538 SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
Peisen0202f5c2017-10-26 10:35:36 +08002539 SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),
PeiSen Houb5acfe12020-11-11 08:58:59 +01002540 SND_PCI_QUIRK(0x1558, 0x9506, "Clevo P955HQ", ALC1220_FIXUP_CLEVO_P950),
2541 SND_PCI_QUIRK(0x1558, 0x950A, "Clevo P955H[PR]", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwaif3d737b2018-07-17 17:08:32 +02002542 SND_PCI_QUIRK(0x1558, 0x95e1, "Clevo P95xER", ALC1220_FIXUP_CLEVO_P950),
Jeremy Soller2f0d5202018-05-07 09:28:45 -06002543 SND_PCI_QUIRK(0x1558, 0x95e2, "Clevo P950ER", ALC1220_FIXUP_CLEVO_P950),
PeiSen Houb5acfe12020-11-11 08:58:59 +01002544 SND_PCI_QUIRK(0x1558, 0x95e3, "Clevo P955[ER]T", ALC1220_FIXUP_CLEVO_P950),
2545 SND_PCI_QUIRK(0x1558, 0x95e4, "Clevo P955ER", ALC1220_FIXUP_CLEVO_P950),
2546 SND_PCI_QUIRK(0x1558, 0x95e5, "Clevo P955EE6", ALC1220_FIXUP_CLEVO_P950),
2547 SND_PCI_QUIRK(0x1558, 0x95e6, "Clevo P950R[CDF]", ALC1220_FIXUP_CLEVO_P950),
Richard Sailer503d90b2019-06-19 13:33:11 +02002548 SND_PCI_QUIRK(0x1558, 0x96e1, "Clevo P960[ER][CDFN]-K", ALC1220_FIXUP_CLEVO_P950),
2549 SND_PCI_QUIRK(0x1558, 0x97e1, "Clevo P970[ER][CDFN]", ALC1220_FIXUP_CLEVO_P950),
PeiSen Houb5acfe12020-11-11 08:58:59 +01002550 SND_PCI_QUIRK(0x1558, 0x97e2, "Clevo P970RC-M", ALC1220_FIXUP_CLEVO_P950),
PeiSen Hou259eb822020-05-19 08:50:12 +02002551 SND_PCI_QUIRK(0x1558, 0x50d3, "Clevo PC50[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
PeiSen Houb5acfe12020-11-11 08:58:59 +01002552 SND_PCI_QUIRK(0x1558, 0x65d1, "Clevo PB51[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2553 SND_PCI_QUIRK(0x1558, 0x65d2, "Clevo PB51R[CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2554 SND_PCI_QUIRK(0x1558, 0x65e1, "Clevo PB51[ED][DF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2555 SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2556 SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
PeiSen Hou259eb822020-05-19 08:50:12 +02002557 SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2558 SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
Takashi Iwai7a6069b2011-11-09 15:22:01 +01002559 SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
2560 SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),
Takashi Iwaiac9b1cd2011-11-09 17:45:55 +01002561 SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),
Takashi Iwai68ef0562011-11-09 18:24:44 +01002562 SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_FIXUP_COEF),
Takashi Iwai1d045db2011-07-07 18:23:21 +02002563 {}
2564};
2565
Takashi Iwai1727a772013-01-10 09:52:52 +01002566static const struct hda_model_fixup alc882_fixup_models[] = {
Takashi Iwai772c2912018-06-26 17:17:53 +02002567 {.id = ALC882_FIXUP_ABIT_AW9D_MAX, .name = "abit-aw9d"},
2568 {.id = ALC882_FIXUP_LENOVO_Y530, .name = "lenovo-y530"},
2569 {.id = ALC882_FIXUP_ACER_ASPIRE_7736, .name = "acer-aspire-7736"},
2570 {.id = ALC882_FIXUP_ASUS_W90V, .name = "asus-w90v"},
2571 {.id = ALC889_FIXUP_CD, .name = "cd"},
2572 {.id = ALC889_FIXUP_FRONT_HP_NO_PRESENCE, .name = "no-front-hp"},
2573 {.id = ALC889_FIXUP_VAIO_TT, .name = "vaio-tt"},
2574 {.id = ALC888_FIXUP_EEE1601, .name = "eee1601"},
2575 {.id = ALC882_FIXUP_EAPD, .name = "alc882-eapd"},
2576 {.id = ALC883_FIXUP_EAPD, .name = "alc883-eapd"},
2577 {.id = ALC882_FIXUP_GPIO1, .name = "gpio1"},
2578 {.id = ALC882_FIXUP_GPIO2, .name = "gpio2"},
2579 {.id = ALC882_FIXUP_GPIO3, .name = "gpio3"},
2580 {.id = ALC889_FIXUP_COEF, .name = "alc889-coef"},
2581 {.id = ALC882_FIXUP_ASUS_W2JC, .name = "asus-w2jc"},
Takashi Iwai912093b2012-04-11 14:03:41 +02002582 {.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name = "acer-aspire-4930g"},
2583 {.id = ALC882_FIXUP_ACER_ASPIRE_8930G, .name = "acer-aspire-8930g"},
2584 {.id = ALC883_FIXUP_ACER_EAPD, .name = "acer-aspire"},
Takashi Iwai772c2912018-06-26 17:17:53 +02002585 {.id = ALC885_FIXUP_MACPRO_GPIO, .name = "macpro-gpio"},
2586 {.id = ALC889_FIXUP_DAC_ROUTE, .name = "dac-route"},
2587 {.id = ALC889_FIXUP_MBP_VREF, .name = "mbp-vref"},
2588 {.id = ALC889_FIXUP_IMAC91_VREF, .name = "imac91-vref"},
2589 {.id = ALC889_FIXUP_MBA11_VREF, .name = "mba11-vref"},
2590 {.id = ALC889_FIXUP_MBA21_VREF, .name = "mba21-vref"},
2591 {.id = ALC889_FIXUP_MP11_VREF, .name = "mp11-vref"},
2592 {.id = ALC889_FIXUP_MP41_VREF, .name = "mp41-vref"},
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002593 {.id = ALC882_FIXUP_INV_DMIC, .name = "inv-dmic"},
Takashi Iwaie427c232012-07-29 10:04:08 +02002594 {.id = ALC882_FIXUP_NO_PRIMARY_HP, .name = "no-primary-hp"},
Takashi Iwai772c2912018-06-26 17:17:53 +02002595 {.id = ALC887_FIXUP_ASUS_BASS, .name = "asus-bass"},
Takashi Iwaiba90d6a2017-05-22 16:38:47 +02002596 {.id = ALC1220_FIXUP_GB_DUAL_CODECS, .name = "dual-codecs"},
Takashi Iwai772c2912018-06-26 17:17:53 +02002597 {.id = ALC1220_FIXUP_CLEVO_P950, .name = "clevo-p950"},
Takashi Iwai912093b2012-04-11 14:03:41 +02002598 {}
2599};
2600
Takashi Iwai1d045db2011-07-07 18:23:21 +02002601/*
2602 * BIOS auto configuration
2603 */
2604/* almost identical with ALC880 parser... */
2605static int alc882_parse_auto_config(struct hda_codec *codec)
2606{
Takashi Iwai1d045db2011-07-07 18:23:21 +02002607 static const hda_nid_t alc882_ignore[] = { 0x1d, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02002608 static const hda_nid_t alc882_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2609 return alc_parse_auto_config(codec, alc882_ignore, alc882_ssids);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002610}
2611
Takashi Iwai1d045db2011-07-07 18:23:21 +02002612/*
2613 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02002614static int patch_alc882(struct hda_codec *codec)
2615{
2616 struct alc_spec *spec;
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002617 int err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002618
Takashi Iwai3de95172012-05-07 18:03:15 +02002619 err = alc_alloc_spec(codec, 0x0b);
2620 if (err < 0)
2621 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002622
Takashi Iwai3de95172012-05-07 18:03:15 +02002623 spec = codec->spec;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002624
Takashi Iwai7639a062015-03-03 10:07:24 +01002625 switch (codec->core.vendor_id) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02002626 case 0x10ec0882:
2627 case 0x10ec0885:
Takashi Iwaiacf08082014-09-02 07:21:56 +02002628 case 0x10ec0900:
Kailang Yang6d9ffcf2020-01-03 16:24:06 +08002629 case 0x10ec0b00:
Kailang Yanga535ad52017-01-16 16:59:26 +08002630 case 0x10ec1220:
Takashi Iwai1d045db2011-07-07 18:23:21 +02002631 break;
2632 default:
2633 /* ALC883 and variants */
2634 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2635 break;
2636 }
2637
Takashi Iwaic9af7532019-05-10 11:01:43 +02002638 alc_pre_init(codec);
2639
Takashi Iwai1727a772013-01-10 09:52:52 +01002640 snd_hda_pick_fixup(codec, alc882_fixup_models, alc882_fixup_tbl,
Takashi Iwai912093b2012-04-11 14:03:41 +02002641 alc882_fixups);
Takashi Iwai1727a772013-01-10 09:52:52 +01002642 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002643
2644 alc_auto_parse_customize_define(codec);
2645
Takashi Iwai7504b6c2013-03-18 11:25:51 +01002646 if (has_cdefine_beep(codec))
2647 spec->gen.beep_nid = 0x01;
2648
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002649 /* automatic parse from the BIOS config */
2650 err = alc882_parse_auto_config(codec);
2651 if (err < 0)
2652 goto error;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002653
Takashi Iwaifea80fa2018-06-20 12:52:46 +02002654 if (!spec->gen.no_analog && spec->gen.beep_nid) {
2655 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2656 if (err < 0)
2657 goto error;
2658 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02002659
Takashi Iwai1727a772013-01-10 09:52:52 +01002660 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01002661
Takashi Iwai1d045db2011-07-07 18:23:21 +02002662 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02002663
2664 error:
2665 alc_free(codec);
2666 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002667}
2668
2669
2670/*
2671 * ALC262 support
2672 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02002673static int alc262_parse_auto_config(struct hda_codec *codec)
2674{
Takashi Iwai1d045db2011-07-07 18:23:21 +02002675 static const hda_nid_t alc262_ignore[] = { 0x1d, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02002676 static const hda_nid_t alc262_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2677 return alc_parse_auto_config(codec, alc262_ignore, alc262_ssids);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002678}
2679
2680/*
2681 * Pin config fixes
2682 */
2683enum {
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002684 ALC262_FIXUP_FSC_H270,
Takashi Iwai7513e6d2013-01-18 15:41:34 +01002685 ALC262_FIXUP_FSC_S7110,
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002686 ALC262_FIXUP_HP_Z200,
2687 ALC262_FIXUP_TYAN,
Takashi Iwaic4701502011-11-07 14:20:07 +01002688 ALC262_FIXUP_LENOVO_3000,
Takashi Iwaib42590b2011-11-07 14:41:01 +01002689 ALC262_FIXUP_BENQ,
2690 ALC262_FIXUP_BENQ_T31,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002691 ALC262_FIXUP_INV_DMIC,
Mengdong Linb5c66112013-11-29 00:35:35 -05002692 ALC262_FIXUP_INTEL_BAYLEYBAY,
Takashi Iwai1d045db2011-07-07 18:23:21 +02002693};
2694
Takashi Iwai1727a772013-01-10 09:52:52 +01002695static const struct hda_fixup alc262_fixups[] = {
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002696 [ALC262_FIXUP_FSC_H270] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002697 .type = HDA_FIXUP_PINS,
2698 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02002699 { 0x14, 0x99130110 }, /* speaker */
2700 { 0x15, 0x0221142f }, /* front HP */
2701 { 0x1b, 0x0121141f }, /* rear HP */
2702 { }
2703 }
2704 },
Takashi Iwai7513e6d2013-01-18 15:41:34 +01002705 [ALC262_FIXUP_FSC_S7110] = {
2706 .type = HDA_FIXUP_PINS,
2707 .v.pins = (const struct hda_pintbl[]) {
2708 { 0x15, 0x90170110 }, /* speaker */
2709 { }
2710 },
2711 .chained = true,
2712 .chain_id = ALC262_FIXUP_BENQ,
2713 },
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002714 [ALC262_FIXUP_HP_Z200] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002715 .type = HDA_FIXUP_PINS,
2716 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02002717 { 0x16, 0x99130120 }, /* internal speaker */
2718 { }
2719 }
2720 },
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002721 [ALC262_FIXUP_TYAN] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002722 .type = HDA_FIXUP_PINS,
2723 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002724 { 0x14, 0x1993e1f0 }, /* int AUX */
2725 { }
2726 }
2727 },
Takashi Iwaic4701502011-11-07 14:20:07 +01002728 [ALC262_FIXUP_LENOVO_3000] = {
Takashi Iwaifd108212013-01-10 10:18:14 +01002729 .type = HDA_FIXUP_PINCTLS,
2730 .v.pins = (const struct hda_pintbl[]) {
2731 { 0x19, PIN_VREF50 },
Takashi Iwaib42590b2011-11-07 14:41:01 +01002732 {}
2733 },
2734 .chained = true,
2735 .chain_id = ALC262_FIXUP_BENQ,
2736 },
2737 [ALC262_FIXUP_BENQ] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002738 .type = HDA_FIXUP_VERBS,
Takashi Iwaib42590b2011-11-07 14:41:01 +01002739 .v.verbs = (const struct hda_verb[]) {
Takashi Iwaic4701502011-11-07 14:20:07 +01002740 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2741 { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2742 {}
2743 }
2744 },
Takashi Iwaib42590b2011-11-07 14:41:01 +01002745 [ALC262_FIXUP_BENQ_T31] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002746 .type = HDA_FIXUP_VERBS,
Takashi Iwaib42590b2011-11-07 14:41:01 +01002747 .v.verbs = (const struct hda_verb[]) {
2748 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2749 { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2750 {}
2751 }
2752 },
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002753 [ALC262_FIXUP_INV_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002754 .type = HDA_FIXUP_FUNC,
David Henningsson9d36a7d2014-10-07 10:18:42 +02002755 .v.func = alc_fixup_inv_dmic,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002756 },
Mengdong Linb5c66112013-11-29 00:35:35 -05002757 [ALC262_FIXUP_INTEL_BAYLEYBAY] = {
2758 .type = HDA_FIXUP_FUNC,
2759 .v.func = alc_fixup_no_depop_delay,
2760 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02002761};
2762
2763static const struct snd_pci_quirk alc262_fixup_tbl[] = {
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002764 SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", ALC262_FIXUP_HP_Z200),
Takashi Iwai7513e6d2013-01-18 15:41:34 +01002765 SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu Lifebook S7110", ALC262_FIXUP_FSC_S7110),
Takashi Iwai3dcd3be2011-11-07 14:59:40 +01002766 SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ),
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002767 SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN),
Takashi Iwai275ec0c2018-06-22 12:17:45 +02002768 SND_PCI_QUIRK(0x1734, 0x1141, "FSC ESPRIMO U9210", ALC262_FIXUP_FSC_H270),
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002769 SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270),
Takashi Iwaic4701502011-11-07 14:20:07 +01002770 SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000),
Takashi Iwaib42590b2011-11-07 14:41:01 +01002771 SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ),
2772 SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_FIXUP_BENQ_T31),
Mengdong Linb5c66112013-11-29 00:35:35 -05002773 SND_PCI_QUIRK(0x8086, 0x7270, "BayleyBay", ALC262_FIXUP_INTEL_BAYLEYBAY),
Takashi Iwai1d045db2011-07-07 18:23:21 +02002774 {}
2775};
2776
Takashi Iwai1727a772013-01-10 09:52:52 +01002777static const struct hda_model_fixup alc262_fixup_models[] = {
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002778 {.id = ALC262_FIXUP_INV_DMIC, .name = "inv-dmic"},
Takashi Iwaie43c44d2018-06-26 17:02:08 +02002779 {.id = ALC262_FIXUP_FSC_H270, .name = "fsc-h270"},
2780 {.id = ALC262_FIXUP_FSC_S7110, .name = "fsc-s7110"},
2781 {.id = ALC262_FIXUP_HP_Z200, .name = "hp-z200"},
2782 {.id = ALC262_FIXUP_TYAN, .name = "tyan"},
2783 {.id = ALC262_FIXUP_LENOVO_3000, .name = "lenovo-3000"},
2784 {.id = ALC262_FIXUP_BENQ, .name = "benq"},
2785 {.id = ALC262_FIXUP_BENQ_T31, .name = "benq-t31"},
2786 {.id = ALC262_FIXUP_INTEL_BAYLEYBAY, .name = "bayleybay"},
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002787 {}
2788};
Takashi Iwai1d045db2011-07-07 18:23:21 +02002789
Takashi Iwai1d045db2011-07-07 18:23:21 +02002790/*
2791 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02002792static int patch_alc262(struct hda_codec *codec)
2793{
2794 struct alc_spec *spec;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002795 int err;
2796
Takashi Iwai3de95172012-05-07 18:03:15 +02002797 err = alc_alloc_spec(codec, 0x0b);
2798 if (err < 0)
2799 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002800
Takashi Iwai3de95172012-05-07 18:03:15 +02002801 spec = codec->spec;
Takashi Iwai08c189f2012-12-19 15:22:24 +01002802 spec->gen.shared_mic_vref_pin = 0x18;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002803
Takashi Iwai225068a2015-05-29 10:42:14 +02002804 spec->shutup = alc_eapd_shutup;
2805
Takashi Iwai1d045db2011-07-07 18:23:21 +02002806#if 0
2807 /* pshou 07/11/05 set a zero PCM sample to DAC when FIFO is
2808 * under-run
2809 */
Takashi Iwai98b24882014-08-18 13:47:50 +02002810 alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x80);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002811#endif
Takashi Iwai1d045db2011-07-07 18:23:21 +02002812 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2813
Takashi Iwaic9af7532019-05-10 11:01:43 +02002814 alc_pre_init(codec);
2815
Takashi Iwai1727a772013-01-10 09:52:52 +01002816 snd_hda_pick_fixup(codec, alc262_fixup_models, alc262_fixup_tbl,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002817 alc262_fixups);
Takashi Iwai1727a772013-01-10 09:52:52 +01002818 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002819
Takashi Iwaiaf741c12012-05-07 18:09:48 +02002820 alc_auto_parse_customize_define(codec);
2821
Takashi Iwai7504b6c2013-03-18 11:25:51 +01002822 if (has_cdefine_beep(codec))
2823 spec->gen.beep_nid = 0x01;
2824
Takashi Iwai42399f72011-11-07 17:18:44 +01002825 /* automatic parse from the BIOS config */
2826 err = alc262_parse_auto_config(codec);
2827 if (err < 0)
2828 goto error;
Takashi Iwai3e6179b2011-07-08 16:55:13 +02002829
Takashi Iwaifea80fa2018-06-20 12:52:46 +02002830 if (!spec->gen.no_analog && spec->gen.beep_nid) {
2831 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2832 if (err < 0)
2833 goto error;
2834 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02002835
Takashi Iwai1727a772013-01-10 09:52:52 +01002836 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01002837
Takashi Iwai1d045db2011-07-07 18:23:21 +02002838 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02002839
2840 error:
2841 alc_free(codec);
2842 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002843}
2844
2845/*
2846 * ALC268
2847 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02002848/* bind Beep switches of both NID 0x0f and 0x10 */
Takashi Iwaia7177772017-05-10 12:04:08 +02002849static int alc268_beep_switch_put(struct snd_kcontrol *kcontrol,
2850 struct snd_ctl_elem_value *ucontrol)
2851{
2852 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2853 unsigned long pval;
2854 int err;
2855
2856 mutex_lock(&codec->control_mutex);
2857 pval = kcontrol->private_value;
2858 kcontrol->private_value = (pval & ~0xff) | 0x0f;
2859 err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2860 if (err >= 0) {
2861 kcontrol->private_value = (pval & ~0xff) | 0x10;
2862 err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2863 }
2864 kcontrol->private_value = pval;
2865 mutex_unlock(&codec->control_mutex);
2866 return err;
2867}
Takashi Iwai1d045db2011-07-07 18:23:21 +02002868
2869static const struct snd_kcontrol_new alc268_beep_mixer[] = {
2870 HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
Takashi Iwaia7177772017-05-10 12:04:08 +02002871 {
2872 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2873 .name = "Beep Playback Switch",
2874 .subdevice = HDA_SUBDEV_AMP_FLAG,
2875 .info = snd_hda_mixer_amp_switch_info,
2876 .get = snd_hda_mixer_amp_switch_get,
2877 .put = alc268_beep_switch_put,
2878 .private_value = HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT)
2879 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02002880};
2881
2882/* set PCBEEP vol = 0, mute connections */
2883static const struct hda_verb alc268_beep_init_verbs[] = {
2884 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2885 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2886 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2887 { }
2888};
2889
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002890enum {
2891 ALC268_FIXUP_INV_DMIC,
Takashi Iwaicb766402012-10-20 10:55:21 +02002892 ALC268_FIXUP_HP_EAPD,
Takashi Iwai24eff322013-11-04 18:21:08 +01002893 ALC268_FIXUP_SPDIF,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002894};
2895
Takashi Iwai1727a772013-01-10 09:52:52 +01002896static const struct hda_fixup alc268_fixups[] = {
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002897 [ALC268_FIXUP_INV_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002898 .type = HDA_FIXUP_FUNC,
David Henningsson9d36a7d2014-10-07 10:18:42 +02002899 .v.func = alc_fixup_inv_dmic,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002900 },
Takashi Iwaicb766402012-10-20 10:55:21 +02002901 [ALC268_FIXUP_HP_EAPD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002902 .type = HDA_FIXUP_VERBS,
Takashi Iwaicb766402012-10-20 10:55:21 +02002903 .v.verbs = (const struct hda_verb[]) {
2904 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 0},
2905 {}
2906 }
2907 },
Takashi Iwai24eff322013-11-04 18:21:08 +01002908 [ALC268_FIXUP_SPDIF] = {
2909 .type = HDA_FIXUP_PINS,
2910 .v.pins = (const struct hda_pintbl[]) {
2911 { 0x1e, 0x014b1180 }, /* enable SPDIF out */
2912 {}
2913 }
2914 },
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002915};
2916
Takashi Iwai1727a772013-01-10 09:52:52 +01002917static const struct hda_model_fixup alc268_fixup_models[] = {
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002918 {.id = ALC268_FIXUP_INV_DMIC, .name = "inv-dmic"},
Takashi Iwaicb766402012-10-20 10:55:21 +02002919 {.id = ALC268_FIXUP_HP_EAPD, .name = "hp-eapd"},
Takashi Iwai03bf11c2018-06-26 16:56:41 +02002920 {.id = ALC268_FIXUP_SPDIF, .name = "spdif"},
Takashi Iwaicb766402012-10-20 10:55:21 +02002921 {}
2922};
2923
2924static const struct snd_pci_quirk alc268_fixup_tbl[] = {
Takashi Iwai24eff322013-11-04 18:21:08 +01002925 SND_PCI_QUIRK(0x1025, 0x0139, "Acer TravelMate 6293", ALC268_FIXUP_SPDIF),
David Henningssonfcd8f3b2013-01-28 05:45:47 +01002926 SND_PCI_QUIRK(0x1025, 0x015b, "Acer AOA 150 (ZG5)", ALC268_FIXUP_INV_DMIC),
Takashi Iwaicb766402012-10-20 10:55:21 +02002927 /* below is codec SSID since multiple Toshiba laptops have the
2928 * same PCI SSID 1179:ff00
2929 */
2930 SND_PCI_QUIRK(0x1179, 0xff06, "Toshiba P200", ALC268_FIXUP_HP_EAPD),
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002931 {}
2932};
2933
Takashi Iwai1d045db2011-07-07 18:23:21 +02002934/*
2935 * BIOS auto configuration
2936 */
2937static int alc268_parse_auto_config(struct hda_codec *codec)
2938{
Takashi Iwai3e6179b2011-07-08 16:55:13 +02002939 static const hda_nid_t alc268_ssids[] = { 0x15, 0x1b, 0x14, 0 };
Takashi Iwai7504b6c2013-03-18 11:25:51 +01002940 return alc_parse_auto_config(codec, NULL, alc268_ssids);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002941}
2942
Takashi Iwai1d045db2011-07-07 18:23:21 +02002943/*
2944 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02002945static int patch_alc268(struct hda_codec *codec)
2946{
2947 struct alc_spec *spec;
Takashi Iwaia5cb4632018-06-20 12:50:11 +02002948 int i, err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002949
Takashi Iwai1d045db2011-07-07 18:23:21 +02002950 /* ALC268 has no aa-loopback mixer */
Takashi Iwai3de95172012-05-07 18:03:15 +02002951 err = alc_alloc_spec(codec, 0);
2952 if (err < 0)
2953 return err;
2954
2955 spec = codec->spec;
Takashi Iwai2722b532019-08-22 09:55:37 +02002956 if (has_cdefine_beep(codec))
2957 spec->gen.beep_nid = 0x01;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002958
Takashi Iwai225068a2015-05-29 10:42:14 +02002959 spec->shutup = alc_eapd_shutup;
2960
Takashi Iwaic9af7532019-05-10 11:01:43 +02002961 alc_pre_init(codec);
2962
Takashi Iwai1727a772013-01-10 09:52:52 +01002963 snd_hda_pick_fixup(codec, alc268_fixup_models, alc268_fixup_tbl, alc268_fixups);
2964 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002965
Takashi Iwai6ebb8052011-08-16 15:15:40 +02002966 /* automatic parse from the BIOS config */
2967 err = alc268_parse_auto_config(codec);
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02002968 if (err < 0)
2969 goto error;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002970
Takashi Iwai7504b6c2013-03-18 11:25:51 +01002971 if (err > 0 && !spec->gen.no_analog &&
2972 spec->gen.autocfg.speaker_pins[0] != 0x1d) {
Takashi Iwaia5cb4632018-06-20 12:50:11 +02002973 for (i = 0; i < ARRAY_SIZE(alc268_beep_mixer); i++) {
2974 if (!snd_hda_gen_add_kctl(&spec->gen, NULL,
2975 &alc268_beep_mixer[i])) {
2976 err = -ENOMEM;
2977 goto error;
2978 }
2979 }
Takashi Iwai7504b6c2013-03-18 11:25:51 +01002980 snd_hda_add_verbs(codec, alc268_beep_init_verbs);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002981 if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
2982 /* override the amp caps for beep generator */
2983 snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
2984 (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
2985 (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
2986 (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
2987 (0 << AC_AMPCAP_MUTE_SHIFT));
2988 }
2989
Takashi Iwai1727a772013-01-10 09:52:52 +01002990 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002991
Takashi Iwai1d045db2011-07-07 18:23:21 +02002992 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02002993
2994 error:
2995 alc_free(codec);
2996 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002997}
2998
2999/*
3000 * ALC269
3001 */
Takashi Iwai08c189f2012-12-19 15:22:24 +01003002
Takashi Iwai1d045db2011-07-07 18:23:21 +02003003static const struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
Takashi Iwai1d045db2011-07-07 18:23:21 +02003004 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
Takashi Iwai1d045db2011-07-07 18:23:21 +02003005};
3006
3007static const struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
Takashi Iwai1d045db2011-07-07 18:23:21 +02003008 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
Takashi Iwai1d045db2011-07-07 18:23:21 +02003009};
3010
Takashi Iwai1d045db2011-07-07 18:23:21 +02003011/* different alc269-variants */
3012enum {
3013 ALC269_TYPE_ALC269VA,
3014 ALC269_TYPE_ALC269VB,
3015 ALC269_TYPE_ALC269VC,
Kailang Yangadcc70b2012-05-25 08:08:38 +02003016 ALC269_TYPE_ALC269VD,
Kailang Yang065380f2013-01-10 10:25:48 +01003017 ALC269_TYPE_ALC280,
3018 ALC269_TYPE_ALC282,
Kailang Yang2af02be2013-08-22 10:03:50 +02003019 ALC269_TYPE_ALC283,
Kailang Yang065380f2013-01-10 10:25:48 +01003020 ALC269_TYPE_ALC284,
Kailang Yang4731d5d2017-06-30 15:22:57 +08003021 ALC269_TYPE_ALC293,
Kailang Yang7fc7d042013-04-25 11:04:43 +02003022 ALC269_TYPE_ALC286,
Kailang Yang506b62c2014-12-18 17:07:44 +08003023 ALC269_TYPE_ALC298,
Kailang Yang1d04c9d2013-10-24 11:35:18 +02003024 ALC269_TYPE_ALC255,
Kailang Yang4344aec2014-12-17 17:39:05 +08003025 ALC269_TYPE_ALC256,
Kailang Yangf429e7e2017-12-05 15:38:24 +08003026 ALC269_TYPE_ALC257,
Kailang Yang0a6f0602017-06-30 16:00:48 +08003027 ALC269_TYPE_ALC215,
Kailang Yang42314302016-02-03 15:03:50 +08003028 ALC269_TYPE_ALC225,
Kailang Yangdcd4f0d2016-05-04 15:50:18 +08003029 ALC269_TYPE_ALC294,
Kailang Yang1078bef2018-11-08 16:36:15 +08003030 ALC269_TYPE_ALC300,
Kailang Yangf0778872019-10-24 15:13:32 +08003031 ALC269_TYPE_ALC623,
Kailang Yang6fbae352016-05-30 16:44:20 +08003032 ALC269_TYPE_ALC700,
Takashi Iwai1d045db2011-07-07 18:23:21 +02003033};
3034
3035/*
3036 * BIOS auto configuration
3037 */
3038static int alc269_parse_auto_config(struct hda_codec *codec)
3039{
Takashi Iwai1d045db2011-07-07 18:23:21 +02003040 static const hda_nid_t alc269_ignore[] = { 0x1d, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02003041 static const hda_nid_t alc269_ssids[] = { 0, 0x1b, 0x14, 0x21 };
3042 static const hda_nid_t alc269va_ssids[] = { 0x15, 0x1b, 0x14, 0 };
3043 struct alc_spec *spec = codec->spec;
Kailang Yangadcc70b2012-05-25 08:08:38 +02003044 const hda_nid_t *ssids;
3045
3046 switch (spec->codec_variant) {
3047 case ALC269_TYPE_ALC269VA:
3048 case ALC269_TYPE_ALC269VC:
Kailang Yang065380f2013-01-10 10:25:48 +01003049 case ALC269_TYPE_ALC280:
3050 case ALC269_TYPE_ALC284:
Kailang Yang4731d5d2017-06-30 15:22:57 +08003051 case ALC269_TYPE_ALC293:
Kailang Yangadcc70b2012-05-25 08:08:38 +02003052 ssids = alc269va_ssids;
3053 break;
3054 case ALC269_TYPE_ALC269VB:
3055 case ALC269_TYPE_ALC269VD:
Kailang Yang065380f2013-01-10 10:25:48 +01003056 case ALC269_TYPE_ALC282:
Kailang Yang2af02be2013-08-22 10:03:50 +02003057 case ALC269_TYPE_ALC283:
Kailang Yang7fc7d042013-04-25 11:04:43 +02003058 case ALC269_TYPE_ALC286:
Kailang Yang506b62c2014-12-18 17:07:44 +08003059 case ALC269_TYPE_ALC298:
Kailang Yang1d04c9d2013-10-24 11:35:18 +02003060 case ALC269_TYPE_ALC255:
Kailang Yang4344aec2014-12-17 17:39:05 +08003061 case ALC269_TYPE_ALC256:
Kailang Yangf429e7e2017-12-05 15:38:24 +08003062 case ALC269_TYPE_ALC257:
Kailang Yang0a6f0602017-06-30 16:00:48 +08003063 case ALC269_TYPE_ALC215:
Kailang Yang42314302016-02-03 15:03:50 +08003064 case ALC269_TYPE_ALC225:
Kailang Yangdcd4f0d2016-05-04 15:50:18 +08003065 case ALC269_TYPE_ALC294:
Kailang Yang1078bef2018-11-08 16:36:15 +08003066 case ALC269_TYPE_ALC300:
Kailang Yangf0778872019-10-24 15:13:32 +08003067 case ALC269_TYPE_ALC623:
Kailang Yang6fbae352016-05-30 16:44:20 +08003068 case ALC269_TYPE_ALC700:
Kailang Yangadcc70b2012-05-25 08:08:38 +02003069 ssids = alc269_ssids;
3070 break;
3071 default:
3072 ssids = alc269_ssids;
3073 break;
3074 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02003075
Takashi Iwai3e6179b2011-07-08 16:55:13 +02003076 return alc_parse_auto_config(codec, alc269_ignore, ssids);
Takashi Iwai1d045db2011-07-07 18:23:21 +02003077}
3078
Hui Wang476c02e2020-03-29 16:20:18 +08003079static const struct hda_jack_keymap alc_headset_btn_keymap[] = {
3080 { SND_JACK_BTN_0, KEY_PLAYPAUSE },
3081 { SND_JACK_BTN_1, KEY_VOICECOMMAND },
3082 { SND_JACK_BTN_2, KEY_VOLUMEUP },
3083 { SND_JACK_BTN_3, KEY_VOLUMEDOWN },
3084 {}
3085};
3086
3087static void alc_headset_btn_callback(struct hda_codec *codec,
3088 struct hda_jack_callback *jack)
3089{
3090 int report = 0;
3091
3092 if (jack->unsol_res & (7 << 13))
3093 report |= SND_JACK_BTN_0;
3094
3095 if (jack->unsol_res & (1 << 16 | 3 << 8))
3096 report |= SND_JACK_BTN_1;
3097
3098 /* Volume up key */
3099 if (jack->unsol_res & (7 << 23))
3100 report |= SND_JACK_BTN_2;
3101
3102 /* Volume down key */
3103 if (jack->unsol_res & (7 << 10))
3104 report |= SND_JACK_BTN_3;
3105
3106 jack->jack->button_state = report;
3107}
3108
3109static void alc_disable_headset_jack_key(struct hda_codec *codec)
3110{
3111 struct alc_spec *spec = codec->spec;
3112
3113 if (!spec->has_hs_key)
3114 return;
3115
3116 switch (codec->core.vendor_id) {
3117 case 0x10ec0215:
3118 case 0x10ec0225:
3119 case 0x10ec0285:
Hui Wangc72b9bf2020-12-05 13:11:30 +08003120 case 0x10ec0287:
Hui Wang476c02e2020-03-29 16:20:18 +08003121 case 0x10ec0295:
3122 case 0x10ec0289:
3123 case 0x10ec0299:
3124 alc_write_coef_idx(codec, 0x48, 0x0);
3125 alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3126 alc_update_coef_idx(codec, 0x44, 0x0045 << 8, 0x0);
3127 break;
3128 case 0x10ec0236:
3129 case 0x10ec0256:
3130 alc_write_coef_idx(codec, 0x48, 0x0);
3131 alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3132 break;
3133 }
3134}
3135
3136static void alc_enable_headset_jack_key(struct hda_codec *codec)
3137{
3138 struct alc_spec *spec = codec->spec;
3139
3140 if (!spec->has_hs_key)
3141 return;
3142
3143 switch (codec->core.vendor_id) {
3144 case 0x10ec0215:
3145 case 0x10ec0225:
3146 case 0x10ec0285:
Hui Wangc72b9bf2020-12-05 13:11:30 +08003147 case 0x10ec0287:
Hui Wang476c02e2020-03-29 16:20:18 +08003148 case 0x10ec0295:
3149 case 0x10ec0289:
3150 case 0x10ec0299:
3151 alc_write_coef_idx(codec, 0x48, 0xd011);
3152 alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3153 alc_update_coef_idx(codec, 0x44, 0x007f << 8, 0x0045 << 8);
3154 break;
3155 case 0x10ec0236:
3156 case 0x10ec0256:
3157 alc_write_coef_idx(codec, 0x48, 0xd011);
3158 alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3159 break;
3160 }
3161}
3162
3163static void alc_fixup_headset_jack(struct hda_codec *codec,
3164 const struct hda_fixup *fix, int action)
3165{
3166 struct alc_spec *spec = codec->spec;
3167
3168 switch (action) {
3169 case HDA_FIXUP_ACT_PRE_PROBE:
3170 spec->has_hs_key = 1;
3171 snd_hda_jack_detect_enable_callback(codec, 0x55,
3172 alc_headset_btn_callback);
3173 snd_hda_jack_add_kctl(codec, 0x55, "Headset Jack", false,
3174 SND_JACK_HEADSET, alc_headset_btn_keymap);
3175 break;
3176 case HDA_FIXUP_ACT_INIT:
3177 alc_enable_headset_jack_key(codec);
3178 break;
3179 }
3180}
3181
Kailang Yang1387e2d2012-11-08 10:23:18 +01003182static void alc269vb_toggle_power_output(struct hda_codec *codec, int power_up)
Takashi Iwai1d045db2011-07-07 18:23:21 +02003183{
Takashi Iwai98b24882014-08-18 13:47:50 +02003184 alc_update_coef_idx(codec, 0x04, 1 << 11, power_up ? (1 << 11) : 0);
Takashi Iwai1d045db2011-07-07 18:23:21 +02003185}
3186
3187static void alc269_shutup(struct hda_codec *codec)
3188{
Kailang Yangadcc70b2012-05-25 08:08:38 +02003189 struct alc_spec *spec = codec->spec;
3190
Kailang Yang1387e2d2012-11-08 10:23:18 +01003191 if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3192 alc269vb_toggle_power_output(codec, 0);
3193 if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
3194 (alc_get_coef0(codec) & 0x00ff) == 0x018) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02003195 msleep(150);
3196 }
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003197 alc_shutup_pins(codec);
Takashi Iwai1d045db2011-07-07 18:23:21 +02003198}
3199
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01003200static const struct coef_fw alc282_coefs[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02003201 WRITE_COEF(0x03, 0x0002), /* Power Down Control */
Kailang Yang32fa7e42014-10-24 16:26:01 +08003202 UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
Takashi Iwai54db6c32014-08-18 15:11:19 +02003203 WRITE_COEF(0x07, 0x0200), /* DMIC control */
3204 UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
3205 UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
3206 WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
3207 WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
3208 WRITE_COEF(0x0e, 0x6e00), /* LDO1/2/3, DAC/ADC */
3209 UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
3210 UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
3211 WRITE_COEF(0x6f, 0x0), /* Class D test 4 */
3212 UPDATE_COEF(0x0c, 0xfe00, 0), /* IO power down directly */
3213 WRITE_COEF(0x34, 0xa0c0), /* ANC */
3214 UPDATE_COEF(0x16, 0x0008, 0), /* AGC MUX */
3215 UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
3216 UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
3217 WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
3218 WRITE_COEF(0x63, 0x2902), /* PLL */
3219 WRITE_COEF(0x68, 0xa080), /* capless control 2 */
3220 WRITE_COEF(0x69, 0x3400), /* capless control 3 */
3221 WRITE_COEF(0x6a, 0x2f3e), /* capless control 4 */
3222 WRITE_COEF(0x6b, 0x0), /* capless control 5 */
3223 UPDATE_COEF(0x6d, 0x0fff, 0x0900), /* class D test 2 */
3224 WRITE_COEF(0x6e, 0x110a), /* class D test 3 */
3225 UPDATE_COEF(0x70, 0x00f8, 0x00d8), /* class D test 5 */
3226 WRITE_COEF(0x71, 0x0014), /* class D test 6 */
3227 WRITE_COEF(0x72, 0xc2ba), /* classD OCP */
3228 UPDATE_COEF(0x77, 0x0f80, 0), /* classD pure DC test */
3229 WRITE_COEF(0x6c, 0xfc06), /* Class D amp control */
3230 {}
3231};
3232
Kailang Yangcb149cb2014-03-18 16:45:32 +08003233static void alc282_restore_default_value(struct hda_codec *codec)
3234{
Takashi Iwai54db6c32014-08-18 15:11:19 +02003235 alc_process_coef_fw(codec, alc282_coefs);
Kailang Yangcb149cb2014-03-18 16:45:32 +08003236}
3237
Kailang Yang7b5c7a02014-03-18 16:15:54 +08003238static void alc282_init(struct hda_codec *codec)
3239{
3240 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003241 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang7b5c7a02014-03-18 16:15:54 +08003242 bool hp_pin_sense;
3243 int coef78;
3244
Kailang Yangcb149cb2014-03-18 16:45:32 +08003245 alc282_restore_default_value(codec);
3246
Kailang Yang7b5c7a02014-03-18 16:15:54 +08003247 if (!hp_pin)
3248 return;
3249 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3250 coef78 = alc_read_coef_idx(codec, 0x78);
3251
3252 /* Index 0x78 Direct Drive HP AMP LPM Control 1 */
3253 /* Headphone capless set to high power mode */
3254 alc_write_coef_idx(codec, 0x78, 0x9004);
3255
3256 if (hp_pin_sense)
3257 msleep(2);
3258
3259 snd_hda_codec_write(codec, hp_pin, 0,
3260 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3261
3262 if (hp_pin_sense)
3263 msleep(85);
3264
3265 snd_hda_codec_write(codec, hp_pin, 0,
3266 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3267
3268 if (hp_pin_sense)
3269 msleep(100);
3270
3271 /* Headphone capless set to normal mode */
3272 alc_write_coef_idx(codec, 0x78, coef78);
3273}
3274
3275static void alc282_shutup(struct hda_codec *codec)
3276{
3277 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003278 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang7b5c7a02014-03-18 16:15:54 +08003279 bool hp_pin_sense;
3280 int coef78;
3281
3282 if (!hp_pin) {
3283 alc269_shutup(codec);
3284 return;
3285 }
3286
3287 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3288 coef78 = alc_read_coef_idx(codec, 0x78);
3289 alc_write_coef_idx(codec, 0x78, 0x9004);
3290
3291 if (hp_pin_sense)
3292 msleep(2);
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
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003300 if (!spec->no_shutup_pins)
3301 snd_hda_codec_write(codec, hp_pin, 0,
3302 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
Kailang Yang7b5c7a02014-03-18 16:15:54 +08003303
3304 if (hp_pin_sense)
3305 msleep(100);
3306
3307 alc_auto_setup_eapd(codec, false);
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003308 alc_shutup_pins(codec);
Kailang Yang7b5c7a02014-03-18 16:15:54 +08003309 alc_write_coef_idx(codec, 0x78, coef78);
3310}
3311
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01003312static const struct coef_fw alc283_coefs[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02003313 WRITE_COEF(0x03, 0x0002), /* Power Down Control */
Kailang Yang56779862014-10-24 16:17:51 +08003314 UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
Takashi Iwai54db6c32014-08-18 15:11:19 +02003315 WRITE_COEF(0x07, 0x0200), /* DMIC control */
3316 UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
3317 UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
3318 WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
3319 WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
3320 WRITE_COEF(0x0e, 0x6fc0), /* LDO1/2/3, DAC/ADC */
3321 UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
3322 UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
3323 WRITE_COEF(0x3a, 0x0), /* Class D test 4 */
3324 UPDATE_COEF(0x0c, 0xfe00, 0x0), /* IO power down directly */
3325 WRITE_COEF(0x22, 0xa0c0), /* ANC */
3326 UPDATE_COEFEX(0x53, 0x01, 0x000f, 0x0008), /* AGC MUX */
3327 UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
3328 UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
3329 WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
3330 WRITE_COEF(0x2e, 0x2902), /* PLL */
3331 WRITE_COEF(0x33, 0xa080), /* capless control 2 */
3332 WRITE_COEF(0x34, 0x3400), /* capless control 3 */
3333 WRITE_COEF(0x35, 0x2f3e), /* capless control 4 */
3334 WRITE_COEF(0x36, 0x0), /* capless control 5 */
3335 UPDATE_COEF(0x38, 0x0fff, 0x0900), /* class D test 2 */
3336 WRITE_COEF(0x39, 0x110a), /* class D test 3 */
3337 UPDATE_COEF(0x3b, 0x00f8, 0x00d8), /* class D test 5 */
3338 WRITE_COEF(0x3c, 0x0014), /* class D test 6 */
3339 WRITE_COEF(0x3d, 0xc2ba), /* classD OCP */
3340 UPDATE_COEF(0x42, 0x0f80, 0x0), /* classD pure DC test */
3341 WRITE_COEF(0x49, 0x0), /* test mode */
3342 UPDATE_COEF(0x40, 0xf800, 0x9800), /* Class D DC enable */
3343 UPDATE_COEF(0x42, 0xf000, 0x2000), /* DC offset */
3344 WRITE_COEF(0x37, 0xfc06), /* Class D amp control */
Kailang Yang56779862014-10-24 16:17:51 +08003345 UPDATE_COEF(0x1b, 0x8000, 0), /* HP JD control */
Takashi Iwai54db6c32014-08-18 15:11:19 +02003346 {}
3347};
3348
Kailang Yang6bd55b02014-03-17 13:51:27 +08003349static void alc283_restore_default_value(struct hda_codec *codec)
3350{
Takashi Iwai54db6c32014-08-18 15:11:19 +02003351 alc_process_coef_fw(codec, alc283_coefs);
Kailang Yang6bd55b02014-03-17 13:51:27 +08003352}
3353
Kailang Yang2af02be2013-08-22 10:03:50 +02003354static void alc283_init(struct hda_codec *codec)
3355{
3356 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003357 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang2af02be2013-08-22 10:03:50 +02003358 bool hp_pin_sense;
Kailang Yang2af02be2013-08-22 10:03:50 +02003359
Kailang Yang6bd55b02014-03-17 13:51:27 +08003360 alc283_restore_default_value(codec);
3361
Kailang Yang2af02be2013-08-22 10:03:50 +02003362 if (!hp_pin)
3363 return;
Kailang Yanga59d7192015-04-08 16:34:00 +08003364
3365 msleep(30);
Kailang Yang2af02be2013-08-22 10:03:50 +02003366 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3367
3368 /* Index 0x43 Direct Drive HP AMP LPM Control 1 */
3369 /* Headphone capless set to high power mode */
3370 alc_write_coef_idx(codec, 0x43, 0x9004);
3371
3372 snd_hda_codec_write(codec, hp_pin, 0,
3373 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3374
3375 if (hp_pin_sense)
3376 msleep(85);
3377
3378 snd_hda_codec_write(codec, hp_pin, 0,
3379 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3380
3381 if (hp_pin_sense)
3382 msleep(85);
3383 /* Index 0x46 Combo jack auto switch control 2 */
3384 /* 3k pull low control for Headset jack. */
Takashi Iwai98b24882014-08-18 13:47:50 +02003385 alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
Kailang Yang2af02be2013-08-22 10:03:50 +02003386 /* Headphone capless set to normal mode */
3387 alc_write_coef_idx(codec, 0x43, 0x9614);
3388}
3389
3390static void alc283_shutup(struct hda_codec *codec)
3391{
3392 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003393 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang2af02be2013-08-22 10:03:50 +02003394 bool hp_pin_sense;
Kailang Yang2af02be2013-08-22 10:03:50 +02003395
3396 if (!hp_pin) {
3397 alc269_shutup(codec);
3398 return;
3399 }
3400
3401 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3402
3403 alc_write_coef_idx(codec, 0x43, 0x9004);
3404
Harsha Priyab450b172014-10-09 11:04:56 +00003405 /*depop hp during suspend*/
3406 alc_write_coef_idx(codec, 0x06, 0x2100);
3407
Kailang Yang2af02be2013-08-22 10:03:50 +02003408 snd_hda_codec_write(codec, hp_pin, 0,
3409 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3410
3411 if (hp_pin_sense)
Kailang Yang88011c092013-10-24 15:45:24 +02003412 msleep(100);
Kailang Yang2af02be2013-08-22 10:03:50 +02003413
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003414 if (!spec->no_shutup_pins)
3415 snd_hda_codec_write(codec, hp_pin, 0,
3416 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
Kailang Yang2af02be2013-08-22 10:03:50 +02003417
Takashi Iwai98b24882014-08-18 13:47:50 +02003418 alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
Kailang Yang2af02be2013-08-22 10:03:50 +02003419
3420 if (hp_pin_sense)
Kailang Yang88011c092013-10-24 15:45:24 +02003421 msleep(100);
Kailang Yang0435b3f2014-04-08 17:14:14 +08003422 alc_auto_setup_eapd(codec, false);
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003423 alc_shutup_pins(codec);
Kailang Yang2af02be2013-08-22 10:03:50 +02003424 alc_write_coef_idx(codec, 0x43, 0x9614);
3425}
3426
Kailang Yang4a219ef2017-06-16 16:54:35 +08003427static void alc256_init(struct hda_codec *codec)
3428{
3429 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003430 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang4a219ef2017-06-16 16:54:35 +08003431 bool hp_pin_sense;
3432
3433 if (!hp_pin)
Kailang Yang6447c962019-05-08 16:27:03 +08003434 hp_pin = 0x21;
Kailang Yang4a219ef2017-06-16 16:54:35 +08003435
3436 msleep(30);
3437
3438 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3439
3440 if (hp_pin_sense)
3441 msleep(2);
3442
3443 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
Kailang Yang6447c962019-05-08 16:27:03 +08003444 if (spec->ultra_low_power) {
3445 alc_update_coef_idx(codec, 0x03, 1<<1, 1<<1);
3446 alc_update_coef_idx(codec, 0x08, 3<<2, 3<<2);
3447 alc_update_coef_idx(codec, 0x08, 7<<4, 0);
3448 alc_update_coef_idx(codec, 0x3b, 1<<15, 0);
3449 alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3450 msleep(30);
3451 }
Kailang Yang4a219ef2017-06-16 16:54:35 +08003452
3453 snd_hda_codec_write(codec, hp_pin, 0,
3454 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3455
Kailang Yang6447c962019-05-08 16:27:03 +08003456 if (hp_pin_sense || spec->ultra_low_power)
Kailang Yang4a219ef2017-06-16 16:54:35 +08003457 msleep(85);
3458
3459 snd_hda_codec_write(codec, hp_pin, 0,
3460 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3461
Kailang Yang6447c962019-05-08 16:27:03 +08003462 if (hp_pin_sense || spec->ultra_low_power)
Kailang Yang4a219ef2017-06-16 16:54:35 +08003463 msleep(100);
3464
3465 alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
3466 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
Kailang Yang88d42b22018-03-14 16:08:57 +08003467 alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15); /* Clear bit */
3468 alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15);
Thomas Hebbc4473742020-03-30 12:09:38 -04003469 /*
3470 * Expose headphone mic (or possibly Line In on some machines) instead
3471 * of PC Beep on 1Ah, and disable 1Ah loopback for all outputs. See
3472 * Documentation/sound/hd-audio/realtek-pc-beep.rst for details of
3473 * this register.
3474 */
3475 alc_write_coef_idx(codec, 0x36, 0x5757);
Kailang Yang4a219ef2017-06-16 16:54:35 +08003476}
3477
3478static void alc256_shutup(struct hda_codec *codec)
3479{
3480 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003481 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang4a219ef2017-06-16 16:54:35 +08003482 bool hp_pin_sense;
3483
Kailang Yang6447c962019-05-08 16:27:03 +08003484 if (!hp_pin)
3485 hp_pin = 0x21;
Kailang Yang4a219ef2017-06-16 16:54:35 +08003486
3487 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3488
3489 if (hp_pin_sense)
3490 msleep(2);
3491
3492 snd_hda_codec_write(codec, hp_pin, 0,
3493 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3494
Kailang Yang6447c962019-05-08 16:27:03 +08003495 if (hp_pin_sense || spec->ultra_low_power)
Kailang Yang4a219ef2017-06-16 16:54:35 +08003496 msleep(85);
3497
Takashi Iwai1c9609e2018-01-19 14:18:34 +01003498 /* 3k pull low control for Headset jack. */
3499 /* NOTE: call this before clearing the pin, otherwise codec stalls */
Hui Wang3f742492020-09-14 14:51:18 +08003500 /* If disable 3k pulldown control for alc257, the Mic detection will not work correctly
3501 * when booting with headset plugged. So skip setting it for the codec alc257
3502 */
3503 if (codec->core.vendor_id != 0x10ec0257)
3504 alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
Takashi Iwai1c9609e2018-01-19 14:18:34 +01003505
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003506 if (!spec->no_shutup_pins)
3507 snd_hda_codec_write(codec, hp_pin, 0,
3508 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
Kailang Yang4a219ef2017-06-16 16:54:35 +08003509
Kailang Yang6447c962019-05-08 16:27:03 +08003510 if (hp_pin_sense || spec->ultra_low_power)
Kailang Yang4a219ef2017-06-16 16:54:35 +08003511 msleep(100);
3512
3513 alc_auto_setup_eapd(codec, false);
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003514 alc_shutup_pins(codec);
Kailang Yang6447c962019-05-08 16:27:03 +08003515 if (spec->ultra_low_power) {
3516 msleep(50);
3517 alc_update_coef_idx(codec, 0x03, 1<<1, 0);
3518 alc_update_coef_idx(codec, 0x08, 7<<4, 7<<4);
3519 alc_update_coef_idx(codec, 0x08, 3<<2, 0);
3520 alc_update_coef_idx(codec, 0x3b, 1<<15, 1<<15);
3521 alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3522 msleep(30);
3523 }
Kailang Yang4a219ef2017-06-16 16:54:35 +08003524}
3525
Kailang Yangda911b12018-01-05 16:50:08 +08003526static void alc225_init(struct hda_codec *codec)
3527{
3528 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003529 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yangda911b12018-01-05 16:50:08 +08003530 bool hp1_pin_sense, hp2_pin_sense;
3531
3532 if (!hp_pin)
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003533 hp_pin = 0x21;
Kailang Yangda911b12018-01-05 16:50:08 +08003534 msleep(30);
3535
3536 hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3537 hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3538
3539 if (hp1_pin_sense || hp2_pin_sense)
3540 msleep(2);
3541
3542 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003543 if (spec->ultra_low_power) {
3544 alc_update_coef_idx(codec, 0x08, 0x0f << 2, 3<<2);
3545 alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3546 alc_update_coef_idx(codec, 0x33, 1<<11, 0);
3547 msleep(30);
3548 }
Kailang Yangda911b12018-01-05 16:50:08 +08003549
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003550 if (hp1_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003551 snd_hda_codec_write(codec, hp_pin, 0,
3552 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3553 if (hp2_pin_sense)
3554 snd_hda_codec_write(codec, 0x16, 0,
3555 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3556
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003557 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003558 msleep(85);
3559
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003560 if (hp1_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003561 snd_hda_codec_write(codec, hp_pin, 0,
3562 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3563 if (hp2_pin_sense)
3564 snd_hda_codec_write(codec, 0x16, 0,
3565 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3566
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003567 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003568 msleep(100);
3569
3570 alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3571 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
3572}
3573
3574static void alc225_shutup(struct hda_codec *codec)
3575{
3576 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003577 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yangda911b12018-01-05 16:50:08 +08003578 bool hp1_pin_sense, hp2_pin_sense;
3579
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003580 if (!hp_pin)
3581 hp_pin = 0x21;
Hui Wang476c02e2020-03-29 16:20:18 +08003582
3583 alc_disable_headset_jack_key(codec);
Kailang Yangda911b12018-01-05 16:50:08 +08003584 /* 3k pull low control for Headset jack. */
3585 alc_update_coef_idx(codec, 0x4a, 0, 3 << 10);
3586
3587 hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3588 hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3589
3590 if (hp1_pin_sense || hp2_pin_sense)
3591 msleep(2);
3592
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003593 if (hp1_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003594 snd_hda_codec_write(codec, hp_pin, 0,
3595 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3596 if (hp2_pin_sense)
3597 snd_hda_codec_write(codec, 0x16, 0,
3598 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3599
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003600 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003601 msleep(85);
3602
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003603 if (hp1_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003604 snd_hda_codec_write(codec, hp_pin, 0,
3605 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3606 if (hp2_pin_sense)
3607 snd_hda_codec_write(codec, 0x16, 0,
3608 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3609
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003610 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003611 msleep(100);
3612
3613 alc_auto_setup_eapd(codec, false);
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003614 alc_shutup_pins(codec);
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003615 if (spec->ultra_low_power) {
3616 msleep(50);
3617 alc_update_coef_idx(codec, 0x08, 0x0f << 2, 0x0c << 2);
3618 alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3619 alc_update_coef_idx(codec, 0x33, 1<<11, 1<<11);
3620 alc_update_coef_idx(codec, 0x4a, 3<<4, 2<<4);
3621 msleep(30);
3622 }
Hui Wang476c02e2020-03-29 16:20:18 +08003623
3624 alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3625 alc_enable_headset_jack_key(codec);
Kailang Yangda911b12018-01-05 16:50:08 +08003626}
3627
Kailang Yangc2d6af52017-06-21 14:50:54 +08003628static void alc_default_init(struct hda_codec *codec)
3629{
3630 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003631 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yangc2d6af52017-06-21 14:50:54 +08003632 bool hp_pin_sense;
3633
3634 if (!hp_pin)
3635 return;
3636
3637 msleep(30);
3638
3639 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3640
3641 if (hp_pin_sense)
3642 msleep(2);
3643
3644 snd_hda_codec_write(codec, hp_pin, 0,
3645 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3646
3647 if (hp_pin_sense)
3648 msleep(85);
3649
3650 snd_hda_codec_write(codec, hp_pin, 0,
3651 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3652
3653 if (hp_pin_sense)
3654 msleep(100);
3655}
3656
3657static void alc_default_shutup(struct hda_codec *codec)
3658{
3659 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003660 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yangc2d6af52017-06-21 14:50:54 +08003661 bool hp_pin_sense;
3662
3663 if (!hp_pin) {
3664 alc269_shutup(codec);
3665 return;
3666 }
3667
3668 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3669
3670 if (hp_pin_sense)
3671 msleep(2);
3672
3673 snd_hda_codec_write(codec, hp_pin, 0,
3674 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3675
3676 if (hp_pin_sense)
3677 msleep(85);
3678
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003679 if (!spec->no_shutup_pins)
3680 snd_hda_codec_write(codec, hp_pin, 0,
3681 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
Kailang Yangc2d6af52017-06-21 14:50:54 +08003682
3683 if (hp_pin_sense)
3684 msleep(100);
3685
3686 alc_auto_setup_eapd(codec, false);
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003687 alc_shutup_pins(codec);
Kailang Yangc2d6af52017-06-21 14:50:54 +08003688}
3689
Kailang Yang693abe12019-01-29 15:38:21 +08003690static void alc294_hp_init(struct hda_codec *codec)
3691{
3692 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003693 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang693abe12019-01-29 15:38:21 +08003694 int i, val;
3695
3696 if (!hp_pin)
3697 return;
3698
3699 snd_hda_codec_write(codec, hp_pin, 0,
3700 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3701
3702 msleep(100);
3703
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003704 if (!spec->no_shutup_pins)
3705 snd_hda_codec_write(codec, hp_pin, 0,
3706 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
Kailang Yang693abe12019-01-29 15:38:21 +08003707
3708 alc_update_coef_idx(codec, 0x6f, 0x000f, 0);/* Set HP depop to manual mode */
3709 alc_update_coefex_idx(codec, 0x58, 0x00, 0x8000, 0x8000); /* HP depop procedure start */
3710
3711 /* Wait for depop procedure finish */
3712 val = alc_read_coefex_idx(codec, 0x58, 0x01);
3713 for (i = 0; i < 20 && val & 0x0080; i++) {
3714 msleep(50);
3715 val = alc_read_coefex_idx(codec, 0x58, 0x01);
3716 }
3717 /* Set HP depop to auto mode */
3718 alc_update_coef_idx(codec, 0x6f, 0x000f, 0x000b);
3719 msleep(50);
3720}
3721
3722static void alc294_init(struct hda_codec *codec)
3723{
3724 struct alc_spec *spec = codec->spec;
3725
Takashi Iwaif6ef4e02019-01-29 14:14:51 +01003726 /* required only at boot or S4 resume time */
3727 if (!spec->done_hp_init ||
3728 codec->core.dev.power.power_state.event == PM_EVENT_RESTORE) {
Kailang Yang693abe12019-01-29 15:38:21 +08003729 alc294_hp_init(codec);
3730 spec->done_hp_init = true;
3731 }
3732 alc_default_init(codec);
3733}
3734
Kailang Yangad60d502013-06-28 12:03:01 +02003735static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg,
3736 unsigned int val)
3737{
3738 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3739 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val & 0xffff); /* LSB */
3740 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val >> 16); /* MSB */
3741}
3742
3743static int alc5505_coef_get(struct hda_codec *codec, unsigned int index_reg)
3744{
3745 unsigned int val;
3746
3747 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3748 val = snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3749 & 0xffff;
3750 val |= snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3751 << 16;
3752 return val;
3753}
3754
3755static void alc5505_dsp_halt(struct hda_codec *codec)
3756{
3757 unsigned int val;
3758
3759 alc5505_coef_set(codec, 0x3000, 0x000c); /* DSP CPU stop */
3760 alc5505_coef_set(codec, 0x880c, 0x0008); /* DDR enter self refresh */
3761 alc5505_coef_set(codec, 0x61c0, 0x11110080); /* Clock control for PLL and CPU */
3762 alc5505_coef_set(codec, 0x6230, 0xfc0d4011); /* Disable Input OP */
3763 alc5505_coef_set(codec, 0x61b4, 0x040a2b03); /* Stop PLL2 */
3764 alc5505_coef_set(codec, 0x61b0, 0x00005b17); /* Stop PLL1 */
3765 alc5505_coef_set(codec, 0x61b8, 0x04133303); /* Stop PLL3 */
3766 val = alc5505_coef_get(codec, 0x6220);
3767 alc5505_coef_set(codec, 0x6220, (val | 0x3000)); /* switch Ringbuffer clock to DBUS clock */
3768}
3769
3770static void alc5505_dsp_back_from_halt(struct hda_codec *codec)
3771{
3772 alc5505_coef_set(codec, 0x61b8, 0x04133302);
3773 alc5505_coef_set(codec, 0x61b0, 0x00005b16);
3774 alc5505_coef_set(codec, 0x61b4, 0x040a2b02);
3775 alc5505_coef_set(codec, 0x6230, 0xf80d4011);
3776 alc5505_coef_set(codec, 0x6220, 0x2002010f);
3777 alc5505_coef_set(codec, 0x880c, 0x00000004);
3778}
3779
3780static void alc5505_dsp_init(struct hda_codec *codec)
3781{
3782 unsigned int val;
3783
3784 alc5505_dsp_halt(codec);
3785 alc5505_dsp_back_from_halt(codec);
3786 alc5505_coef_set(codec, 0x61b0, 0x5b14); /* PLL1 control */
3787 alc5505_coef_set(codec, 0x61b0, 0x5b16);
3788 alc5505_coef_set(codec, 0x61b4, 0x04132b00); /* PLL2 control */
3789 alc5505_coef_set(codec, 0x61b4, 0x04132b02);
3790 alc5505_coef_set(codec, 0x61b8, 0x041f3300); /* PLL3 control*/
3791 alc5505_coef_set(codec, 0x61b8, 0x041f3302);
3792 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_CODEC_RESET, 0); /* Function reset */
3793 alc5505_coef_set(codec, 0x61b8, 0x041b3302);
3794 alc5505_coef_set(codec, 0x61b8, 0x04173302);
3795 alc5505_coef_set(codec, 0x61b8, 0x04163302);
3796 alc5505_coef_set(codec, 0x8800, 0x348b328b); /* DRAM control */
3797 alc5505_coef_set(codec, 0x8808, 0x00020022); /* DRAM control */
3798 alc5505_coef_set(codec, 0x8818, 0x00000400); /* DRAM control */
3799
3800 val = alc5505_coef_get(codec, 0x6200) >> 16; /* Read revision ID */
3801 if (val <= 3)
3802 alc5505_coef_set(codec, 0x6220, 0x2002010f); /* I/O PAD Configuration */
3803 else
3804 alc5505_coef_set(codec, 0x6220, 0x6002018f);
3805
3806 alc5505_coef_set(codec, 0x61ac, 0x055525f0); /**/
3807 alc5505_coef_set(codec, 0x61c0, 0x12230080); /* Clock control */
3808 alc5505_coef_set(codec, 0x61b4, 0x040e2b02); /* PLL2 control */
3809 alc5505_coef_set(codec, 0x61bc, 0x010234f8); /* OSC Control */
3810 alc5505_coef_set(codec, 0x880c, 0x00000004); /* DRAM Function control */
3811 alc5505_coef_set(codec, 0x880c, 0x00000003);
3812 alc5505_coef_set(codec, 0x880c, 0x00000010);
Takashi Iwaicd63a5f2013-07-05 12:13:59 +02003813
3814#ifdef HALT_REALTEK_ALC5505
3815 alc5505_dsp_halt(codec);
3816#endif
Kailang Yangad60d502013-06-28 12:03:01 +02003817}
3818
Takashi Iwaicd63a5f2013-07-05 12:13:59 +02003819#ifdef HALT_REALTEK_ALC5505
Pierre-Louis Bossart8a718212020-01-11 15:47:35 -06003820#define alc5505_dsp_suspend(codec) do { } while (0) /* NOP */
3821#define alc5505_dsp_resume(codec) do { } while (0) /* NOP */
Takashi Iwaicd63a5f2013-07-05 12:13:59 +02003822#else
3823#define alc5505_dsp_suspend(codec) alc5505_dsp_halt(codec)
3824#define alc5505_dsp_resume(codec) alc5505_dsp_back_from_halt(codec)
3825#endif
3826
Takashi Iwai2a439522011-07-26 09:52:50 +02003827#ifdef CONFIG_PM
Kailang Yangad60d502013-06-28 12:03:01 +02003828static int alc269_suspend(struct hda_codec *codec)
3829{
3830 struct alc_spec *spec = codec->spec;
3831
3832 if (spec->has_alc5505_dsp)
Takashi Iwaicd63a5f2013-07-05 12:13:59 +02003833 alc5505_dsp_suspend(codec);
Kailang Yangad60d502013-06-28 12:03:01 +02003834 return alc_suspend(codec);
3835}
3836
Takashi Iwai1d045db2011-07-07 18:23:21 +02003837static int alc269_resume(struct hda_codec *codec)
3838{
Kailang Yangadcc70b2012-05-25 08:08:38 +02003839 struct alc_spec *spec = codec->spec;
3840
Kailang Yang1387e2d2012-11-08 10:23:18 +01003841 if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3842 alc269vb_toggle_power_output(codec, 0);
3843 if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
Kailang Yangadcc70b2012-05-25 08:08:38 +02003844 (alc_get_coef0(codec) & 0x00ff) == 0x018) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02003845 msleep(150);
3846 }
3847
3848 codec->patch_ops.init(codec);
3849
Kailang Yang1387e2d2012-11-08 10:23:18 +01003850 if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3851 alc269vb_toggle_power_output(codec, 1);
3852 if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
Kailang Yangadcc70b2012-05-25 08:08:38 +02003853 (alc_get_coef0(codec) & 0x00ff) == 0x017) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02003854 msleep(200);
3855 }
3856
Takashi Iwai1a462be2020-01-09 10:01:04 +01003857 snd_hda_regmap_sync(codec);
Takashi Iwai1d045db2011-07-07 18:23:21 +02003858 hda_call_check_power_status(codec, 0x01);
Hui Wangf4753712014-08-19 12:07:03 +08003859
3860 /* on some machine, the BIOS will clear the codec gpio data when enter
3861 * suspend, and won't restore the data after resume, so we restore it
3862 * in the driver.
3863 */
Takashi Iwaid261eec2018-06-19 22:32:29 +02003864 if (spec->gpio_data)
3865 alc_write_gpio_data(codec);
Hui Wangf4753712014-08-19 12:07:03 +08003866
Kailang Yangad60d502013-06-28 12:03:01 +02003867 if (spec->has_alc5505_dsp)
Takashi Iwaicd63a5f2013-07-05 12:13:59 +02003868 alc5505_dsp_resume(codec);
Kailang Yangc5177c82013-07-24 14:39:49 +02003869
Takashi Iwai1d045db2011-07-07 18:23:21 +02003870 return 0;
3871}
Takashi Iwai2a439522011-07-26 09:52:50 +02003872#endif /* CONFIG_PM */
Takashi Iwai1d045db2011-07-07 18:23:21 +02003873
David Henningsson108cc102012-07-20 10:37:25 +02003874static void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01003875 const struct hda_fixup *fix, int action)
David Henningsson108cc102012-07-20 10:37:25 +02003876{
3877 struct alc_spec *spec = codec->spec;
3878
Takashi Iwai1727a772013-01-10 09:52:52 +01003879 if (action == HDA_FIXUP_ACT_PRE_PROBE)
David Henningsson108cc102012-07-20 10:37:25 +02003880 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
3881}
3882
Jan-Marek Glogowskifdcc9682018-02-14 11:29:15 +01003883static void alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec *codec,
3884 const struct hda_fixup *fix,
3885 int action)
3886{
3887 unsigned int cfg_headphone = snd_hda_codec_get_pincfg(codec, 0x21);
3888 unsigned int cfg_headset_mic = snd_hda_codec_get_pincfg(codec, 0x19);
3889
3890 if (cfg_headphone && cfg_headset_mic == 0x411111f0)
3891 snd_hda_codec_set_pincfg(codec, 0x19,
3892 (cfg_headphone & ~AC_DEFCFG_DEVICE) |
3893 (AC_JACK_MIC_IN << AC_DEFCFG_DEVICE_SHIFT));
3894}
3895
Takashi Iwai1d045db2011-07-07 18:23:21 +02003896static void alc269_fixup_hweq(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01003897 const struct hda_fixup *fix, int action)
Takashi Iwai1d045db2011-07-07 18:23:21 +02003898{
Takashi Iwai98b24882014-08-18 13:47:50 +02003899 if (action == HDA_FIXUP_ACT_INIT)
3900 alc_update_coef_idx(codec, 0x1e, 0, 0x80);
Takashi Iwai1d045db2011-07-07 18:23:21 +02003901}
3902
David Henningsson7c478f02013-10-11 10:18:46 +02003903static void alc269_fixup_headset_mic(struct hda_codec *codec,
3904 const struct hda_fixup *fix, int action)
3905{
3906 struct alc_spec *spec = codec->spec;
3907
3908 if (action == HDA_FIXUP_ACT_PRE_PROBE)
3909 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
3910}
3911
Takashi Iwai1d045db2011-07-07 18:23:21 +02003912static void alc271_fixup_dmic(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01003913 const struct hda_fixup *fix, int action)
Takashi Iwai1d045db2011-07-07 18:23:21 +02003914{
3915 static const struct hda_verb verbs[] = {
3916 {0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
3917 {0x20, AC_VERB_SET_PROC_COEF, 0x4000},
3918 {}
3919 };
3920 unsigned int cfg;
3921
Takashi Iwai7639a062015-03-03 10:07:24 +01003922 if (strcmp(codec->core.chip_name, "ALC271X") &&
3923 strcmp(codec->core.chip_name, "ALC269VB"))
Takashi Iwai1d045db2011-07-07 18:23:21 +02003924 return;
3925 cfg = snd_hda_codec_get_pincfg(codec, 0x12);
3926 if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED)
3927 snd_hda_sequence_write(codec, verbs);
3928}
3929
Takashi Iwaic8426b22021-04-07 11:57:30 +02003930/* Fix the speaker amp after resume, etc */
3931static void alc269vb_fixup_aspire_e1_coef(struct hda_codec *codec,
3932 const struct hda_fixup *fix,
3933 int action)
3934{
3935 if (action == HDA_FIXUP_ACT_INIT)
3936 alc_update_coef_idx(codec, 0x0d, 0x6000, 0x6000);
3937}
3938
Takashi Iwai017f2a12011-07-09 14:42:25 +02003939static void alc269_fixup_pcm_44k(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01003940 const struct hda_fixup *fix, int action)
Takashi Iwai017f2a12011-07-09 14:42:25 +02003941{
3942 struct alc_spec *spec = codec->spec;
3943
Takashi Iwai1727a772013-01-10 09:52:52 +01003944 if (action != HDA_FIXUP_ACT_PROBE)
Takashi Iwai017f2a12011-07-09 14:42:25 +02003945 return;
3946
3947 /* Due to a hardware problem on Lenovo Ideadpad, we need to
3948 * fix the sample rate of analog I/O to 44.1kHz
3949 */
Takashi Iwai08c189f2012-12-19 15:22:24 +01003950 spec->gen.stream_analog_playback = &alc269_44k_pcm_analog_playback;
3951 spec->gen.stream_analog_capture = &alc269_44k_pcm_analog_capture;
Takashi Iwai017f2a12011-07-09 14:42:25 +02003952}
3953
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02003954static void alc269_fixup_stereo_dmic(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01003955 const struct hda_fixup *fix, int action)
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02003956{
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02003957 /* The digital-mic unit sends PDM (differential signal) instead of
3958 * the standard PCM, thus you can't record a valid mono stream as is.
3959 * Below is a workaround specific to ALC269 to control the dmic
3960 * signal source as mono.
3961 */
Takashi Iwai98b24882014-08-18 13:47:50 +02003962 if (action == HDA_FIXUP_ACT_INIT)
3963 alc_update_coef_idx(codec, 0x07, 0, 0x80);
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02003964}
3965
Takashi Iwai24519912011-08-16 15:08:49 +02003966static void alc269_quanta_automute(struct hda_codec *codec)
3967{
Takashi Iwai08c189f2012-12-19 15:22:24 +01003968 snd_hda_gen_update_outputs(codec);
Takashi Iwai24519912011-08-16 15:08:49 +02003969
Takashi Iwai1687ccc2014-08-18 13:49:35 +02003970 alc_write_coef_idx(codec, 0x0c, 0x680);
3971 alc_write_coef_idx(codec, 0x0c, 0x480);
Takashi Iwai24519912011-08-16 15:08:49 +02003972}
3973
3974static void alc269_fixup_quanta_mute(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01003975 const struct hda_fixup *fix, int action)
Takashi Iwai24519912011-08-16 15:08:49 +02003976{
3977 struct alc_spec *spec = codec->spec;
Takashi Iwai1727a772013-01-10 09:52:52 +01003978 if (action != HDA_FIXUP_ACT_PROBE)
Takashi Iwai24519912011-08-16 15:08:49 +02003979 return;
Takashi Iwai08c189f2012-12-19 15:22:24 +01003980 spec->gen.automute_hook = alc269_quanta_automute;
Takashi Iwai24519912011-08-16 15:08:49 +02003981}
3982
David Henningssond240d1d2013-04-15 12:50:02 +02003983static void alc269_x101_hp_automute_hook(struct hda_codec *codec,
Takashi Iwai1a4f69d2014-09-11 15:22:46 +02003984 struct hda_jack_callback *jack)
David Henningssond240d1d2013-04-15 12:50:02 +02003985{
3986 struct alc_spec *spec = codec->spec;
3987 int vref;
3988 msleep(200);
3989 snd_hda_gen_hp_automute(codec, jack);
3990
3991 vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
3992 msleep(100);
3993 snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
3994 vref);
3995 msleep(500);
3996 snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
3997 vref);
3998}
3999
Tomas Espeletaa2ef03f2019-08-09 16:37:54 +02004000/*
4001 * Magic sequence to make Huawei Matebook X right speaker working (bko#197801)
4002 */
4003struct hda_alc298_mbxinit {
4004 unsigned char value_0x23;
4005 unsigned char value_0x25;
4006};
4007
4008static void alc298_huawei_mbx_stereo_seq(struct hda_codec *codec,
4009 const struct hda_alc298_mbxinit *initval,
4010 bool first)
4011{
4012 snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x0);
4013 alc_write_coef_idx(codec, 0x26, 0xb000);
4014
4015 if (first)
4016 snd_hda_codec_write(codec, 0x21, 0, AC_VERB_GET_PIN_SENSE, 0x0);
4017
4018 snd_hda_codec_write(codec, 0x6, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
4019 alc_write_coef_idx(codec, 0x26, 0xf000);
4020 alc_write_coef_idx(codec, 0x23, initval->value_0x23);
4021
4022 if (initval->value_0x23 != 0x1e)
4023 alc_write_coef_idx(codec, 0x25, initval->value_0x25);
4024
4025 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
4026 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
4027}
4028
4029static void alc298_fixup_huawei_mbx_stereo(struct hda_codec *codec,
4030 const struct hda_fixup *fix,
4031 int action)
4032{
4033 /* Initialization magic */
4034 static const struct hda_alc298_mbxinit dac_init[] = {
4035 {0x0c, 0x00}, {0x0d, 0x00}, {0x0e, 0x00}, {0x0f, 0x00},
4036 {0x10, 0x00}, {0x1a, 0x40}, {0x1b, 0x82}, {0x1c, 0x00},
4037 {0x1d, 0x00}, {0x1e, 0x00}, {0x1f, 0x00},
4038 {0x20, 0xc2}, {0x21, 0xc8}, {0x22, 0x26}, {0x23, 0x24},
4039 {0x27, 0xff}, {0x28, 0xff}, {0x29, 0xff}, {0x2a, 0x8f},
4040 {0x2b, 0x02}, {0x2c, 0x48}, {0x2d, 0x34}, {0x2e, 0x00},
4041 {0x2f, 0x00},
4042 {0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00},
4043 {0x34, 0x00}, {0x35, 0x01}, {0x36, 0x93}, {0x37, 0x0c},
4044 {0x38, 0x00}, {0x39, 0x00}, {0x3a, 0xf8}, {0x38, 0x80},
4045 {}
4046 };
4047 const struct hda_alc298_mbxinit *seq;
4048
4049 if (action != HDA_FIXUP_ACT_INIT)
4050 return;
4051
4052 /* Start */
4053 snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x00);
4054 snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
4055 alc_write_coef_idx(codec, 0x26, 0xf000);
4056 alc_write_coef_idx(codec, 0x22, 0x31);
4057 alc_write_coef_idx(codec, 0x23, 0x0b);
4058 alc_write_coef_idx(codec, 0x25, 0x00);
4059 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
4060 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
4061
4062 for (seq = dac_init; seq->value_0x23; seq++)
4063 alc298_huawei_mbx_stereo_seq(codec, seq, seq == dac_init);
4064}
4065
David Henningssond240d1d2013-04-15 12:50:02 +02004066static void alc269_fixup_x101_headset_mic(struct hda_codec *codec,
4067 const struct hda_fixup *fix, int action)
4068{
4069 struct alc_spec *spec = codec->spec;
4070 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4071 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
4072 spec->gen.hp_automute_hook = alc269_x101_hp_automute_hook;
4073 }
4074}
4075
Takashi Iwai766538a2020-06-18 13:08:41 +02004076static void alc_update_vref_led(struct hda_codec *codec, hda_nid_t pin,
4077 bool polarity, bool on)
David Henningsson6d3cd5d2013-01-07 12:03:47 +01004078{
Takashi Iwai08fb0d02013-01-10 17:33:58 +01004079 unsigned int pinval;
4080
Takashi Iwai766538a2020-06-18 13:08:41 +02004081 if (!pin)
4082 return;
4083 if (polarity)
4084 on = !on;
4085 pinval = snd_hda_codec_get_pin_target(codec, pin);
Takashi Iwai415d5552014-04-03 11:51:21 +02004086 pinval &= ~AC_PINCTL_VREFEN;
Takashi Iwai766538a2020-06-18 13:08:41 +02004087 pinval |= on ? AC_PINCTL_VREF_80 : AC_PINCTL_VREF_HIZ;
4088 /* temporarily power up/down for setting VREF */
4089 snd_hda_power_up_pm(codec);
4090 snd_hda_set_pin_ctl_cache(codec, pin, pinval);
4091 snd_hda_power_down_pm(codec);
4092}
Takashi Iwai1d045db2011-07-07 18:23:21 +02004093
David Henningsson6d3cd5d2013-01-07 12:03:47 +01004094/* update mute-LED according to the speaker mute state via mic VREF pin */
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004095static int vref_mute_led_set(struct led_classdev *led_cdev,
4096 enum led_brightness brightness)
David Henningsson6d3cd5d2013-01-07 12:03:47 +01004097{
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004098 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
Takashi Iwai08fb0d02013-01-10 17:33:58 +01004099 struct alc_spec *spec = codec->spec;
Takashi Iwai08fb0d02013-01-10 17:33:58 +01004100
Takashi Iwai766538a2020-06-18 13:08:41 +02004101 alc_update_vref_led(codec, spec->mute_led_nid,
4102 spec->mute_led_polarity, brightness);
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004103 return 0;
David Henningsson6d3cd5d2013-01-07 12:03:47 +01004104}
4105
David Henningssond5b6b652013-11-06 10:50:44 +01004106/* Make sure the led works even in runtime suspend */
4107static unsigned int led_power_filter(struct hda_codec *codec,
4108 hda_nid_t nid,
4109 unsigned int power_state)
4110{
4111 struct alc_spec *spec = codec->spec;
4112
Hui Wang50dd9052014-07-08 17:56:15 +08004113 if (power_state != AC_PWRST_D3 || nid == 0 ||
4114 (nid != spec->mute_led_nid && nid != spec->cap_mute_led_nid))
David Henningssond5b6b652013-11-06 10:50:44 +01004115 return power_state;
4116
4117 /* Set pin ctl again, it might have just been set to 0 */
4118 snd_hda_set_pin_ctl(codec, nid,
4119 snd_hda_codec_get_pin_target(codec, nid));
4120
Takashi Iwaicffd3962015-04-09 10:30:25 +02004121 return snd_hda_gen_path_power_filter(codec, nid, power_state);
David Henningssond5b6b652013-11-06 10:50:44 +01004122}
4123
Takashi Iwai08fb0d02013-01-10 17:33:58 +01004124static void alc269_fixup_hp_mute_led(struct hda_codec *codec,
4125 const struct hda_fixup *fix, int action)
David Henningsson6d3cd5d2013-01-07 12:03:47 +01004126{
4127 struct alc_spec *spec = codec->spec;
Takashi Iwai08fb0d02013-01-10 17:33:58 +01004128 const struct dmi_device *dev = NULL;
4129
4130 if (action != HDA_FIXUP_ACT_PRE_PROBE)
4131 return;
4132
4133 while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) {
4134 int pol, pin;
4135 if (sscanf(dev->name, "HP_Mute_LED_%d_%x", &pol, &pin) != 2)
4136 continue;
4137 if (pin < 0x0a || pin >= 0x10)
4138 break;
4139 spec->mute_led_polarity = pol;
4140 spec->mute_led_nid = pin - 0x0a + 0x18;
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004141 snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
David Henningssond5b6b652013-11-06 10:50:44 +01004142 codec->power_filter = led_power_filter;
Takashi Iwai4e76a882014-02-25 12:21:03 +01004143 codec_dbg(codec,
4144 "Detected mute LED for %x:%d\n", spec->mute_led_nid,
Takashi Iwai08fb0d02013-01-10 17:33:58 +01004145 spec->mute_led_polarity);
David Henningsson6d3cd5d2013-01-07 12:03:47 +01004146 break;
4147 }
4148}
4149
Takashi Iwai85c467d2018-05-29 11:38:38 +02004150static void alc269_fixup_hp_mute_led_micx(struct hda_codec *codec,
4151 const struct hda_fixup *fix,
4152 int action, hda_nid_t pin)
David Henningssond06ac142013-02-18 11:41:55 +01004153{
4154 struct alc_spec *spec = codec->spec;
Takashi Iwai85c467d2018-05-29 11:38:38 +02004155
David Henningssond06ac142013-02-18 11:41:55 +01004156 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4157 spec->mute_led_polarity = 0;
Takashi Iwai85c467d2018-05-29 11:38:38 +02004158 spec->mute_led_nid = pin;
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004159 snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
David Henningssond5b6b652013-11-06 10:50:44 +01004160 codec->power_filter = led_power_filter;
David Henningssond06ac142013-02-18 11:41:55 +01004161 }
4162}
4163
Takashi Iwai85c467d2018-05-29 11:38:38 +02004164static void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec,
4165 const struct hda_fixup *fix, int action)
4166{
4167 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x18);
4168}
4169
Takashi Iwai08fb0d02013-01-10 17:33:58 +01004170static void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec,
4171 const struct hda_fixup *fix, int action)
Takashi Iwai420b0fe2012-03-12 12:35:27 +01004172{
Takashi Iwai85c467d2018-05-29 11:38:38 +02004173 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x19);
Takashi Iwai420b0fe2012-03-12 12:35:27 +01004174}
4175
Tom Briden7f783bd2017-03-25 10:12:01 +00004176static void alc269_fixup_hp_mute_led_mic3(struct hda_codec *codec,
4177 const struct hda_fixup *fix, int action)
4178{
Takashi Iwai85c467d2018-05-29 11:38:38 +02004179 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1b);
Tom Briden7f783bd2017-03-25 10:12:01 +00004180}
4181
Takashi Iwai0f32fd192014-11-19 12:16:14 +01004182/* update LED status via GPIO */
4183static void alc_update_gpio_led(struct hda_codec *codec, unsigned int mask,
Kai-Heng Fengdbd13172020-04-30 16:32:51 +08004184 int polarity, bool enabled)
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01004185{
Kai-Heng Fengdbd13172020-04-30 16:32:51 +08004186 if (polarity)
Takashi Iwai0f32fd192014-11-19 12:16:14 +01004187 enabled = !enabled;
Takashi Iwaid261eec2018-06-19 22:32:29 +02004188 alc_update_gpio_data(codec, mask, !enabled); /* muted -> LED on */
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01004189}
4190
Takashi Iwai0f32fd192014-11-19 12:16:14 +01004191/* turn on/off mute LED via GPIO per vmaster hook */
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004192static int gpio_mute_led_set(struct led_classdev *led_cdev,
4193 enum led_brightness brightness)
Takashi Iwai0f32fd192014-11-19 12:16:14 +01004194{
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004195 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
Takashi Iwai0f32fd192014-11-19 12:16:14 +01004196 struct alc_spec *spec = codec->spec;
4197
Kai-Heng Fengdbd13172020-04-30 16:32:51 +08004198 alc_update_gpio_led(codec, spec->gpio_mute_led_mask,
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004199 spec->mute_led_polarity, !brightness);
4200 return 0;
Takashi Iwai0f32fd192014-11-19 12:16:14 +01004201}
4202
4203/* turn on/off mic-mute LED via GPIO per capture hook */
Kai-Heng Feng87dc3642020-04-30 21:52:07 +08004204static int micmute_led_set(struct led_classdev *led_cdev,
4205 enum led_brightness brightness)
4206{
4207 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4208 struct alc_spec *spec = codec->spec;
4209
4210 alc_update_gpio_led(codec, spec->gpio_mic_led_mask,
Hui Wang40469062020-08-11 20:24:30 +08004211 spec->micmute_led_polarity, !brightness);
Kai-Heng Feng87dc3642020-04-30 21:52:07 +08004212 return 0;
4213}
4214
Takashi Iwai01e4a272018-06-19 22:47:30 +02004215/* setup mute and mic-mute GPIO bits, add hooks appropriately */
4216static void alc_fixup_hp_gpio_led(struct hda_codec *codec,
4217 int action,
4218 unsigned int mute_mask,
4219 unsigned int micmute_mask)
4220{
4221 struct alc_spec *spec = codec->spec;
4222
4223 alc_fixup_gpio(codec, action, mute_mask | micmute_mask);
4224
4225 if (action != HDA_FIXUP_ACT_PRE_PROBE)
4226 return;
4227 if (mute_mask) {
4228 spec->gpio_mute_led_mask = mute_mask;
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004229 snd_hda_gen_add_mute_led_cdev(codec, gpio_mute_led_set);
Takashi Iwai01e4a272018-06-19 22:47:30 +02004230 }
4231 if (micmute_mask) {
4232 spec->gpio_mic_led_mask = micmute_mask;
Takashi Iwai7cdf8c42020-06-18 13:08:31 +02004233 snd_hda_gen_add_micmute_led_cdev(codec, micmute_led_set);
Takashi Iwai01e4a272018-06-19 22:47:30 +02004234 }
4235}
4236
Jeremy Szue7d66cf2021-03-16 15:46:24 +08004237static void alc236_fixup_hp_gpio_led(struct hda_codec *codec,
4238 const struct hda_fixup *fix, int action)
4239{
4240 alc_fixup_hp_gpio_led(codec, action, 0x02, 0x01);
4241}
4242
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01004243static void alc269_fixup_hp_gpio_led(struct hda_codec *codec,
4244 const struct hda_fixup *fix, int action)
4245{
Takashi Iwai01e4a272018-06-19 22:47:30 +02004246 alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01004247}
4248
Kai-Heng Fengf5a88b02020-03-27 12:46:25 +08004249static void alc285_fixup_hp_gpio_led(struct hda_codec *codec,
4250 const struct hda_fixup *fix, int action)
4251{
Kai-Heng Feng3e0650a2020-04-30 16:32:52 +08004252 alc_fixup_hp_gpio_led(codec, action, 0x04, 0x01);
Kai-Heng Fengf5a88b02020-03-27 12:46:25 +08004253}
4254
Kailang Yangeaa8e5e2014-11-21 15:49:11 +08004255static void alc286_fixup_hp_gpio_led(struct hda_codec *codec,
4256 const struct hda_fixup *fix, int action)
4257{
Takashi Iwai01e4a272018-06-19 22:47:30 +02004258 alc_fixup_hp_gpio_led(codec, action, 0x02, 0x20);
Takashi Iwai1d045db2011-07-07 18:23:21 +02004259}
4260
Kailang Yanga0ccbc52020-11-06 15:20:38 +08004261static void alc287_fixup_hp_gpio_led(struct hda_codec *codec,
4262 const struct hda_fixup *fix, int action)
4263{
4264 alc_fixup_hp_gpio_led(codec, action, 0x10, 0);
4265}
4266
Takashi Iwai8a503552020-06-18 13:08:32 +02004267/* turn on/off mic-mute LED per capture hook via VREF change */
4268static int vref_micmute_led_set(struct led_classdev *led_cdev,
4269 enum led_brightness brightness)
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004270{
Takashi Iwai8a503552020-06-18 13:08:32 +02004271 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004272 struct alc_spec *spec = codec->spec;
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004273
Takashi Iwai766538a2020-06-18 13:08:41 +02004274 alc_update_vref_led(codec, spec->cap_mute_led_nid,
4275 spec->micmute_led_polarity, brightness);
Takashi Iwai8a503552020-06-18 13:08:32 +02004276 return 0;
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004277}
4278
4279static void alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec,
4280 const struct hda_fixup *fix, int action)
4281{
4282 struct alc_spec *spec = codec->spec;
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004283
Takashi Iwai01e4a272018-06-19 22:47:30 +02004284 alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004285 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai01e4a272018-06-19 22:47:30 +02004286 /* Like hp_gpio_mic1_led, but also needs GPIO4 low to
4287 * enable headphone amp
4288 */
4289 spec->gpio_mask |= 0x10;
4290 spec->gpio_dir |= 0x10;
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004291 spec->cap_mute_led_nid = 0x18;
Takashi Iwai8a503552020-06-18 13:08:32 +02004292 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
Hui Wang50dd9052014-07-08 17:56:15 +08004293 codec->power_filter = led_power_filter;
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004294 }
4295}
4296
David Henningsson7a5255f2014-10-30 08:26:01 +01004297static void alc280_fixup_hp_gpio4(struct hda_codec *codec,
4298 const struct hda_fixup *fix, int action)
4299{
David Henningsson7a5255f2014-10-30 08:26:01 +01004300 struct alc_spec *spec = codec->spec;
David Henningsson7a5255f2014-10-30 08:26:01 +01004301
Takashi Iwai01e4a272018-06-19 22:47:30 +02004302 alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
David Henningsson7a5255f2014-10-30 08:26:01 +01004303 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
David Henningsson7a5255f2014-10-30 08:26:01 +01004304 spec->cap_mute_led_nid = 0x18;
Takashi Iwai8a503552020-06-18 13:08:32 +02004305 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
David Henningsson7a5255f2014-10-30 08:26:01 +01004306 codec->power_filter = led_power_filter;
4307 }
4308}
4309
Takashi Iwaic3bb2b52021-02-15 09:25:40 +01004310/* HP Spectre x360 14 model needs a unique workaround for enabling the amp;
4311 * it needs to toggle the GPIO0 once on and off at each time (bko#210633)
4312 */
4313static void alc245_fixup_hp_x360_amp(struct hda_codec *codec,
4314 const struct hda_fixup *fix, int action)
4315{
4316 struct alc_spec *spec = codec->spec;
4317
4318 switch (action) {
4319 case HDA_FIXUP_ACT_PRE_PROBE:
4320 spec->gpio_mask |= 0x01;
4321 spec->gpio_dir |= 0x01;
4322 break;
4323 case HDA_FIXUP_ACT_INIT:
4324 /* need to toggle GPIO to enable the amp */
4325 alc_update_gpio_data(codec, 0x01, true);
4326 msleep(100);
4327 alc_update_gpio_data(codec, 0x01, false);
4328 break;
4329 }
4330}
4331
Takashi Iwai766538a2020-06-18 13:08:41 +02004332static void alc_update_coef_led(struct hda_codec *codec,
4333 struct alc_coef_led *led,
4334 bool polarity, bool on)
Kailang Yang431e76c2020-04-07 14:40:20 +08004335{
Takashi Iwai766538a2020-06-18 13:08:41 +02004336 if (polarity)
4337 on = !on;
4338 /* temporarily power up/down for setting COEF bit */
4339 alc_update_coef_idx(codec, led->idx, led->mask,
4340 on ? led->on : led->off);
4341}
4342
Kailang Yang431e76c2020-04-07 14:40:20 +08004343/* update mute-LED according to the speaker mute state via COEF bit */
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004344static int coef_mute_led_set(struct led_classdev *led_cdev,
4345 enum led_brightness brightness)
Kailang Yang431e76c2020-04-07 14:40:20 +08004346{
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004347 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
Kailang Yang431e76c2020-04-07 14:40:20 +08004348 struct alc_spec *spec = codec->spec;
4349
Takashi Iwai766538a2020-06-18 13:08:41 +02004350 alc_update_coef_led(codec, &spec->mute_led_coef,
4351 spec->mute_led_polarity, brightness);
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004352 return 0;
Kailang Yang431e76c2020-04-07 14:40:20 +08004353}
4354
4355static void alc285_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4356 const struct hda_fixup *fix,
4357 int action)
4358{
4359 struct alc_spec *spec = codec->spec;
4360
4361 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4362 spec->mute_led_polarity = 0;
Takashi Iwai766538a2020-06-18 13:08:41 +02004363 spec->mute_led_coef.idx = 0x0b;
4364 spec->mute_led_coef.mask = 1 << 3;
4365 spec->mute_led_coef.on = 1 << 3;
4366 spec->mute_led_coef.off = 0;
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004367 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
Kailang Yang431e76c2020-04-07 14:40:20 +08004368 }
4369}
4370
Kailang Yang24164f42020-04-07 14:52:42 +08004371static void alc236_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4372 const struct hda_fixup *fix,
4373 int action)
4374{
4375 struct alc_spec *spec = codec->spec;
4376
4377 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4378 spec->mute_led_polarity = 0;
Takashi Iwai766538a2020-06-18 13:08:41 +02004379 spec->mute_led_coef.idx = 0x34;
4380 spec->mute_led_coef.mask = 1 << 5;
4381 spec->mute_led_coef.on = 0;
4382 spec->mute_led_coef.off = 1 << 5;
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004383 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
Kailang Yang24164f42020-04-07 14:52:42 +08004384 }
4385}
4386
Kailang Yang431e76c2020-04-07 14:40:20 +08004387/* turn on/off mic-mute LED per capture hook by coef bit */
Takashi Iwai8a503552020-06-18 13:08:32 +02004388static int coef_micmute_led_set(struct led_classdev *led_cdev,
4389 enum led_brightness brightness)
Kailang Yang431e76c2020-04-07 14:40:20 +08004390{
Takashi Iwai8a503552020-06-18 13:08:32 +02004391 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
Kailang Yang431e76c2020-04-07 14:40:20 +08004392 struct alc_spec *spec = codec->spec;
4393
Takashi Iwai766538a2020-06-18 13:08:41 +02004394 alc_update_coef_led(codec, &spec->mic_led_coef,
4395 spec->micmute_led_polarity, brightness);
Takashi Iwai8a503552020-06-18 13:08:32 +02004396 return 0;
Kailang Yang431e76c2020-04-07 14:40:20 +08004397}
4398
4399static void alc285_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4400 const struct hda_fixup *fix, int action)
4401{
4402 struct alc_spec *spec = codec->spec;
4403
4404 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai766538a2020-06-18 13:08:41 +02004405 spec->mic_led_coef.idx = 0x19;
4406 spec->mic_led_coef.mask = 1 << 13;
4407 spec->mic_led_coef.on = 1 << 13;
4408 spec->mic_led_coef.off = 0;
Takashi Iwai8a503552020-06-18 13:08:32 +02004409 snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
Kailang Yang431e76c2020-04-07 14:40:20 +08004410 }
4411}
4412
Kailang Yang24164f42020-04-07 14:52:42 +08004413static void alc236_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4414 const struct hda_fixup *fix, int action)
4415{
4416 struct alc_spec *spec = codec->spec;
4417
4418 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai766538a2020-06-18 13:08:41 +02004419 spec->mic_led_coef.idx = 0x35;
4420 spec->mic_led_coef.mask = 3 << 2;
4421 spec->mic_led_coef.on = 2 << 2;
4422 spec->mic_led_coef.off = 1 << 2;
Takashi Iwai8a503552020-06-18 13:08:32 +02004423 snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
Kailang Yang24164f42020-04-07 14:52:42 +08004424 }
4425}
4426
Kailang Yang431e76c2020-04-07 14:40:20 +08004427static void alc285_fixup_hp_mute_led(struct hda_codec *codec,
4428 const struct hda_fixup *fix, int action)
4429{
4430 alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
4431 alc285_fixup_hp_coef_micmute_led(codec, fix, action);
4432}
4433
Kailang Yang24164f42020-04-07 14:52:42 +08004434static void alc236_fixup_hp_mute_led(struct hda_codec *codec,
4435 const struct hda_fixup *fix, int action)
4436{
4437 alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
4438 alc236_fixup_hp_coef_micmute_led(codec, fix, action);
4439}
4440
Takashi Iwai6a30aba2018-04-27 17:17:35 +02004441#if IS_REACHABLE(CONFIG_INPUT)
David Henningsson33f4acd2015-01-07 15:50:13 +01004442static void gpio2_mic_hotkey_event(struct hda_codec *codec,
4443 struct hda_jack_callback *event)
4444{
4445 struct alc_spec *spec = codec->spec;
4446
4447 /* GPIO2 just toggles on a keypress/keyrelease cycle. Therefore
4448 send both key on and key off event for every interrupt. */
Hui Wangc7b60a82015-12-28 11:35:25 +08004449 input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 1);
David Henningsson33f4acd2015-01-07 15:50:13 +01004450 input_sync(spec->kb_dev);
Hui Wangc7b60a82015-12-28 11:35:25 +08004451 input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 0);
David Henningsson33f4acd2015-01-07 15:50:13 +01004452 input_sync(spec->kb_dev);
4453}
David Henningsson33f4acd2015-01-07 15:50:13 +01004454
Kailang3694cb22015-12-28 11:35:24 +08004455static int alc_register_micmute_input_device(struct hda_codec *codec)
4456{
4457 struct alc_spec *spec = codec->spec;
Hui Wangc7b60a82015-12-28 11:35:25 +08004458 int i;
Kailang3694cb22015-12-28 11:35:24 +08004459
4460 spec->kb_dev = input_allocate_device();
4461 if (!spec->kb_dev) {
4462 codec_err(codec, "Out of memory (input_allocate_device)\n");
4463 return -ENOMEM;
4464 }
Hui Wangc7b60a82015-12-28 11:35:25 +08004465
4466 spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX] = KEY_MICMUTE;
4467
Kailang3694cb22015-12-28 11:35:24 +08004468 spec->kb_dev->name = "Microphone Mute Button";
4469 spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY);
Hui Wangc7b60a82015-12-28 11:35:25 +08004470 spec->kb_dev->keycodesize = sizeof(spec->alc_mute_keycode_map[0]);
4471 spec->kb_dev->keycodemax = ARRAY_SIZE(spec->alc_mute_keycode_map);
4472 spec->kb_dev->keycode = spec->alc_mute_keycode_map;
4473 for (i = 0; i < ARRAY_SIZE(spec->alc_mute_keycode_map); i++)
4474 set_bit(spec->alc_mute_keycode_map[i], spec->kb_dev->keybit);
Kailang3694cb22015-12-28 11:35:24 +08004475
4476 if (input_register_device(spec->kb_dev)) {
4477 codec_err(codec, "input_register_device failed\n");
4478 input_free_device(spec->kb_dev);
4479 spec->kb_dev = NULL;
4480 return -ENOMEM;
4481 }
4482
4483 return 0;
4484}
4485
Takashi Iwai01e4a272018-06-19 22:47:30 +02004486/* GPIO1 = set according to SKU external amp
4487 * GPIO2 = mic mute hotkey
4488 * GPIO3 = mute LED
4489 * GPIO4 = mic mute LED
4490 */
David Henningsson33f4acd2015-01-07 15:50:13 +01004491static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec,
4492 const struct hda_fixup *fix, int action)
4493{
David Henningsson33f4acd2015-01-07 15:50:13 +01004494 struct alc_spec *spec = codec->spec;
4495
Takashi Iwai01e4a272018-06-19 22:47:30 +02004496 alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
David Henningsson33f4acd2015-01-07 15:50:13 +01004497 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai1c76aa52018-06-21 16:37:54 +02004498 spec->init_amp = ALC_INIT_DEFAULT;
Kailang3694cb22015-12-28 11:35:24 +08004499 if (alc_register_micmute_input_device(codec) != 0)
David Henningsson33f4acd2015-01-07 15:50:13 +01004500 return;
David Henningsson33f4acd2015-01-07 15:50:13 +01004501
Takashi Iwai01e4a272018-06-19 22:47:30 +02004502 spec->gpio_mask |= 0x06;
4503 spec->gpio_dir |= 0x02;
4504 spec->gpio_data |= 0x02;
Takashi Iwai7639a062015-03-03 10:07:24 +01004505 snd_hda_codec_write_cache(codec, codec->core.afg, 0,
David Henningsson33f4acd2015-01-07 15:50:13 +01004506 AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x04);
Takashi Iwai7639a062015-03-03 10:07:24 +01004507 snd_hda_jack_detect_enable_callback(codec, codec->core.afg,
David Henningsson33f4acd2015-01-07 15:50:13 +01004508 gpio2_mic_hotkey_event);
David Henningsson33f4acd2015-01-07 15:50:13 +01004509 return;
4510 }
4511
4512 if (!spec->kb_dev)
4513 return;
4514
4515 switch (action) {
David Henningsson33f4acd2015-01-07 15:50:13 +01004516 case HDA_FIXUP_ACT_FREE:
4517 input_unregister_device(spec->kb_dev);
David Henningsson33f4acd2015-01-07 15:50:13 +01004518 spec->kb_dev = NULL;
4519 }
David Henningsson33f4acd2015-01-07 15:50:13 +01004520}
4521
Takashi Iwai01e4a272018-06-19 22:47:30 +02004522/* Line2 = mic mute hotkey
4523 * GPIO2 = mic mute LED
4524 */
Kailang3694cb22015-12-28 11:35:24 +08004525static void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec,
4526 const struct hda_fixup *fix, int action)
4527{
Kailang3694cb22015-12-28 11:35:24 +08004528 struct alc_spec *spec = codec->spec;
4529
Takashi Iwai01e4a272018-06-19 22:47:30 +02004530 alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
Kailang3694cb22015-12-28 11:35:24 +08004531 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai1c76aa52018-06-21 16:37:54 +02004532 spec->init_amp = ALC_INIT_DEFAULT;
Kailang3694cb22015-12-28 11:35:24 +08004533 if (alc_register_micmute_input_device(codec) != 0)
4534 return;
4535
Kailang3694cb22015-12-28 11:35:24 +08004536 snd_hda_jack_detect_enable_callback(codec, 0x1b,
4537 gpio2_mic_hotkey_event);
Kailang3694cb22015-12-28 11:35:24 +08004538 return;
4539 }
4540
4541 if (!spec->kb_dev)
4542 return;
4543
4544 switch (action) {
Kailang3694cb22015-12-28 11:35:24 +08004545 case HDA_FIXUP_ACT_FREE:
4546 input_unregister_device(spec->kb_dev);
4547 spec->kb_dev = NULL;
4548 }
4549}
Takashi Iwaic4696522018-01-15 10:44:35 +01004550#else /* INPUT */
4551#define alc280_fixup_hp_gpio2_mic_hotkey NULL
4552#define alc233_fixup_lenovo_line2_mic_hotkey NULL
4553#endif /* INPUT */
Kailang3694cb22015-12-28 11:35:24 +08004554
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004555static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec,
4556 const struct hda_fixup *fix, int action)
4557{
4558 struct alc_spec *spec = codec->spec;
4559
Takashi Iwai1bce62a2018-06-19 23:15:59 +02004560 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1a);
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004561 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004562 spec->cap_mute_led_nid = 0x18;
Takashi Iwai8a503552020-06-18 13:08:32 +02004563 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004564 }
4565}
4566
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004567static const struct coef_fw alc225_pre_hsmode[] = {
Kailang Yang5a367672017-07-21 15:23:53 +08004568 UPDATE_COEF(0x4a, 1<<8, 0),
4569 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0),
4570 UPDATE_COEF(0x63, 3<<14, 3<<14),
4571 UPDATE_COEF(0x4a, 3<<4, 2<<4),
4572 UPDATE_COEF(0x4a, 3<<10, 3<<10),
4573 UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10),
4574 UPDATE_COEF(0x4a, 3<<10, 0),
4575 {}
4576};
4577
David Henningsson73bdd592013-04-15 15:44:14 +02004578static void alc_headset_mode_unplugged(struct hda_codec *codec)
4579{
Kailang Yang92666d42020-11-19 17:04:21 +08004580 struct alc_spec *spec = codec->spec;
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004581 static const struct coef_fw coef0255[] = {
Kailang Yang717f43d2019-05-31 17:16:53 +08004582 WRITE_COEF(0x1b, 0x0c0b), /* LDO and MISC control */
Takashi Iwai54db6c32014-08-18 15:11:19 +02004583 WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
4584 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
4585 WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
4586 WRITE_COEFEX(0x57, 0x03, 0x8aa6), /* Direct Drive HP Amp control */
4587 {}
4588 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004589 static const struct coef_fw coef0256[] = {
Kailang Yange69e7e02016-05-30 15:58:28 +08004590 WRITE_COEF(0x1b, 0x0c4b), /* LDO and MISC control */
Kailang Yang717f43d2019-05-31 17:16:53 +08004591 WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
4592 WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
4593 WRITE_COEFEX(0x57, 0x03, 0x09a3), /* Direct Drive HP Amp control */
4594 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
Kailang Yange69e7e02016-05-30 15:58:28 +08004595 {}
4596 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004597 static const struct coef_fw coef0233[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004598 WRITE_COEF(0x1b, 0x0c0b),
4599 WRITE_COEF(0x45, 0xc429),
4600 UPDATE_COEF(0x35, 0x4000, 0),
4601 WRITE_COEF(0x06, 0x2104),
4602 WRITE_COEF(0x1a, 0x0001),
4603 WRITE_COEF(0x26, 0x0004),
4604 WRITE_COEF(0x32, 0x42a3),
4605 {}
4606 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004607 static const struct coef_fw coef0288[] = {
Kailang Yangf3b70332015-04-08 15:01:17 +08004608 UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
4609 UPDATE_COEF(0x50, 0x2000, 0x2000),
4610 UPDATE_COEF(0x56, 0x0006, 0x0006),
4611 UPDATE_COEF(0x66, 0x0008, 0),
4612 UPDATE_COEF(0x67, 0x2000, 0),
4613 {}
4614 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004615 static const struct coef_fw coef0298[] = {
Kailang Yang89542932017-07-17 15:03:43 +08004616 UPDATE_COEF(0x19, 0x1300, 0x0300),
4617 {}
4618 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004619 static const struct coef_fw coef0292[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004620 WRITE_COEF(0x76, 0x000e),
4621 WRITE_COEF(0x6c, 0x2400),
4622 WRITE_COEF(0x18, 0x7308),
4623 WRITE_COEF(0x6b, 0xc429),
4624 {}
4625 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004626 static const struct coef_fw coef0293[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004627 UPDATE_COEF(0x10, 7<<8, 6<<8), /* SET Line1 JD to 0 */
4628 UPDATE_COEFEX(0x57, 0x05, 1<<15|1<<13, 0x0), /* SET charge pump by verb */
4629 UPDATE_COEFEX(0x57, 0x03, 1<<10, 1<<10), /* SET EN_OSW to 1 */
4630 UPDATE_COEF(0x1a, 1<<3, 1<<3), /* Combo JD gating with LINE1-VREFO */
4631 WRITE_COEF(0x45, 0xc429), /* Set to TRS type */
4632 UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
4633 {}
4634 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004635 static const struct coef_fw coef0668[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004636 WRITE_COEF(0x15, 0x0d40),
4637 WRITE_COEF(0xb7, 0x802b),
4638 {}
4639 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004640 static const struct coef_fw coef0225[] = {
Kailang Yang5a367672017-07-21 15:23:53 +08004641 UPDATE_COEF(0x63, 3<<14, 0),
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004642 {}
4643 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004644 static const struct coef_fw coef0274[] = {
Kailang Yang71683c32017-06-20 16:33:50 +08004645 UPDATE_COEF(0x4a, 0x0100, 0),
4646 UPDATE_COEFEX(0x57, 0x05, 0x4000, 0),
4647 UPDATE_COEF(0x6b, 0xf000, 0x5000),
4648 UPDATE_COEF(0x4a, 0x0010, 0),
4649 UPDATE_COEF(0x4a, 0x0c00, 0x0c00),
4650 WRITE_COEF(0x45, 0x5289),
4651 UPDATE_COEF(0x4a, 0x0c00, 0),
4652 {}
4653 };
Takashi Iwai54db6c32014-08-18 15:11:19 +02004654
Kailang Yang92666d42020-11-19 17:04:21 +08004655 if (spec->no_internal_mic_pin) {
4656 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
4657 return;
4658 }
4659
Takashi Iwai7639a062015-03-03 10:07:24 +01004660 switch (codec->core.vendor_id) {
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004661 case 0x10ec0255:
Kailang Yange69e7e02016-05-30 15:58:28 +08004662 alc_process_coef_fw(codec, coef0255);
4663 break;
Kailang Yang736f20a2017-10-20 15:06:34 +08004664 case 0x10ec0236:
Kailang Yang7081adf2015-03-30 17:05:37 +08004665 case 0x10ec0256:
Kailang Yange69e7e02016-05-30 15:58:28 +08004666 alc_process_coef_fw(codec, coef0256);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004667 break;
Kailang Yang71683c32017-06-20 16:33:50 +08004668 case 0x10ec0234:
4669 case 0x10ec0274:
4670 case 0x10ec0294:
4671 alc_process_coef_fw(codec, coef0274);
4672 break;
Kailang Yang13fd08a2014-05-21 16:49:48 +08004673 case 0x10ec0233:
David Henningsson73bdd592013-04-15 15:44:14 +02004674 case 0x10ec0283:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004675 alc_process_coef_fw(codec, coef0233);
David Henningsson73bdd592013-04-15 15:44:14 +02004676 break;
Kailang Yangf3b70332015-04-08 15:01:17 +08004677 case 0x10ec0286:
4678 case 0x10ec0288:
Kailang Yang89542932017-07-17 15:03:43 +08004679 alc_process_coef_fw(codec, coef0288);
4680 break;
Kailang Yang1a5bc8d2015-05-12 17:11:10 +08004681 case 0x10ec0298:
Kailang Yang89542932017-07-17 15:03:43 +08004682 alc_process_coef_fw(codec, coef0298);
Kailang Yangf3b70332015-04-08 15:01:17 +08004683 alc_process_coef_fw(codec, coef0288);
4684 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004685 case 0x10ec0292:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004686 alc_process_coef_fw(codec, coef0292);
David Henningsson73bdd592013-04-15 15:44:14 +02004687 break;
Kailang Yanga22aa262014-04-23 17:34:28 +08004688 case 0x10ec0293:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004689 alc_process_coef_fw(codec, coef0293);
Kailang Yanga22aa262014-04-23 17:34:28 +08004690 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004691 case 0x10ec0668:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004692 alc_process_coef_fw(codec, coef0668);
David Henningsson73bdd592013-04-15 15:44:14 +02004693 break;
Kailang Yangc2b691e2018-01-17 15:22:55 +08004694 case 0x10ec0215:
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004695 case 0x10ec0225:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004696 case 0x10ec0285:
Kailang Yang7d727862016-05-24 16:46:07 +08004697 case 0x10ec0295:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004698 case 0x10ec0289:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08004699 case 0x10ec0299:
Kailang Yang4d4b0c52019-01-09 16:23:37 +08004700 alc_process_coef_fw(codec, alc225_pre_hsmode);
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004701 alc_process_coef_fw(codec, coef0225);
4702 break;
Kailang Yang78f4f7c2016-06-07 11:31:34 +08004703 case 0x10ec0867:
4704 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
4705 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004706 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01004707 codec_dbg(codec, "Headset jack set to unplugged mode.\n");
David Henningsson73bdd592013-04-15 15:44:14 +02004708}
4709
4710
4711static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
4712 hda_nid_t mic_pin)
4713{
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004714 static const struct coef_fw coef0255[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004715 WRITE_COEFEX(0x57, 0x03, 0x8aa6),
4716 WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
4717 {}
4718 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004719 static const struct coef_fw coef0256[] = {
Kailang Yang717f43d2019-05-31 17:16:53 +08004720 UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14), /* Direct Drive HP Amp control(Set to verb control)*/
4721 WRITE_COEFEX(0x57, 0x03, 0x09a3),
4722 WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
4723 {}
4724 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004725 static const struct coef_fw coef0233[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004726 UPDATE_COEF(0x35, 0, 1<<14),
4727 WRITE_COEF(0x06, 0x2100),
4728 WRITE_COEF(0x1a, 0x0021),
4729 WRITE_COEF(0x26, 0x008c),
4730 {}
4731 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004732 static const struct coef_fw coef0288[] = {
Kailang Yang89542932017-07-17 15:03:43 +08004733 UPDATE_COEF(0x4f, 0x00c0, 0),
Kailang Yangf3b70332015-04-08 15:01:17 +08004734 UPDATE_COEF(0x50, 0x2000, 0),
4735 UPDATE_COEF(0x56, 0x0006, 0),
4736 UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
4737 UPDATE_COEF(0x66, 0x0008, 0x0008),
4738 UPDATE_COEF(0x67, 0x2000, 0x2000),
4739 {}
4740 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004741 static const struct coef_fw coef0292[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004742 WRITE_COEF(0x19, 0xa208),
4743 WRITE_COEF(0x2e, 0xacf0),
4744 {}
4745 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004746 static const struct coef_fw coef0293[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004747 UPDATE_COEFEX(0x57, 0x05, 0, 1<<15|1<<13), /* SET charge pump by verb */
4748 UPDATE_COEFEX(0x57, 0x03, 1<<10, 0), /* SET EN_OSW to 0 */
4749 UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
4750 {}
4751 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004752 static const struct coef_fw coef0688[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004753 WRITE_COEF(0xb7, 0x802b),
4754 WRITE_COEF(0xb5, 0x1040),
4755 UPDATE_COEF(0xc3, 0, 1<<12),
4756 {}
4757 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004758 static const struct coef_fw coef0225[] = {
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004759 UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14),
4760 UPDATE_COEF(0x4a, 3<<4, 2<<4),
4761 UPDATE_COEF(0x63, 3<<14, 0),
4762 {}
4763 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004764 static const struct coef_fw coef0274[] = {
Kailang Yang71683c32017-06-20 16:33:50 +08004765 UPDATE_COEFEX(0x57, 0x05, 0x4000, 0x4000),
4766 UPDATE_COEF(0x4a, 0x0010, 0),
4767 UPDATE_COEF(0x6b, 0xf000, 0),
4768 {}
4769 };
Takashi Iwai54db6c32014-08-18 15:11:19 +02004770
Takashi Iwai7639a062015-03-03 10:07:24 +01004771 switch (codec->core.vendor_id) {
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004772 case 0x10ec0255:
4773 alc_write_coef_idx(codec, 0x45, 0xc489);
4774 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
Takashi Iwai54db6c32014-08-18 15:11:19 +02004775 alc_process_coef_fw(codec, coef0255);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004776 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4777 break;
Kailang Yang717f43d2019-05-31 17:16:53 +08004778 case 0x10ec0236:
4779 case 0x10ec0256:
4780 alc_write_coef_idx(codec, 0x45, 0xc489);
4781 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4782 alc_process_coef_fw(codec, coef0256);
4783 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4784 break;
Kailang Yang71683c32017-06-20 16:33:50 +08004785 case 0x10ec0234:
4786 case 0x10ec0274:
4787 case 0x10ec0294:
4788 alc_write_coef_idx(codec, 0x45, 0x4689);
4789 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4790 alc_process_coef_fw(codec, coef0274);
4791 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4792 break;
Kailang Yang13fd08a2014-05-21 16:49:48 +08004793 case 0x10ec0233:
David Henningsson73bdd592013-04-15 15:44:14 +02004794 case 0x10ec0283:
4795 alc_write_coef_idx(codec, 0x45, 0xc429);
4796 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
Takashi Iwai54db6c32014-08-18 15:11:19 +02004797 alc_process_coef_fw(codec, coef0233);
David Henningsson73bdd592013-04-15 15:44:14 +02004798 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4799 break;
Kailang Yangf3b70332015-04-08 15:01:17 +08004800 case 0x10ec0286:
4801 case 0x10ec0288:
Kailang Yang1a5bc8d2015-05-12 17:11:10 +08004802 case 0x10ec0298:
Kailang Yangf3b70332015-04-08 15:01:17 +08004803 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4804 alc_process_coef_fw(codec, coef0288);
4805 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4806 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004807 case 0x10ec0292:
4808 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
Takashi Iwai54db6c32014-08-18 15:11:19 +02004809 alc_process_coef_fw(codec, coef0292);
David Henningsson73bdd592013-04-15 15:44:14 +02004810 break;
Kailang Yanga22aa262014-04-23 17:34:28 +08004811 case 0x10ec0293:
4812 /* Set to TRS mode */
4813 alc_write_coef_idx(codec, 0x45, 0xc429);
4814 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
Takashi Iwai54db6c32014-08-18 15:11:19 +02004815 alc_process_coef_fw(codec, coef0293);
Kailang Yanga22aa262014-04-23 17:34:28 +08004816 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4817 break;
Kailang Yang78f4f7c2016-06-07 11:31:34 +08004818 case 0x10ec0867:
4819 alc_update_coefex_idx(codec, 0x57, 0x5, 0, 1<<14);
Gustavo A. R. Silvac0dbbda2020-07-08 15:32:36 -05004820 fallthrough;
Kailang Yang9eb5d0e2017-01-17 15:40:25 +08004821 case 0x10ec0221:
David Henningsson1f8b46c2015-05-12 14:38:15 +02004822 case 0x10ec0662:
4823 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4824 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4825 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004826 case 0x10ec0668:
4827 alc_write_coef_idx(codec, 0x11, 0x0001);
4828 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
Takashi Iwai54db6c32014-08-18 15:11:19 +02004829 alc_process_coef_fw(codec, coef0688);
David Henningsson73bdd592013-04-15 15:44:14 +02004830 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4831 break;
Kailang Yangc2b691e2018-01-17 15:22:55 +08004832 case 0x10ec0215:
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004833 case 0x10ec0225:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004834 case 0x10ec0285:
Kailang Yang7d727862016-05-24 16:46:07 +08004835 case 0x10ec0295:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004836 case 0x10ec0289:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08004837 case 0x10ec0299:
Kailang Yang5a367672017-07-21 15:23:53 +08004838 alc_process_coef_fw(codec, alc225_pre_hsmode);
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004839 alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x31<<10);
4840 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4841 alc_process_coef_fw(codec, coef0225);
4842 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4843 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004844 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01004845 codec_dbg(codec, "Headset jack set to mic-in mode.\n");
David Henningsson73bdd592013-04-15 15:44:14 +02004846}
4847
4848static void alc_headset_mode_default(struct hda_codec *codec)
4849{
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004850 static const struct coef_fw coef0225[] = {
Kailang Yang5a367672017-07-21 15:23:53 +08004851 UPDATE_COEF(0x45, 0x3f<<10, 0x30<<10),
4852 UPDATE_COEF(0x45, 0x3f<<10, 0x31<<10),
4853 UPDATE_COEF(0x49, 3<<8, 0<<8),
4854 UPDATE_COEF(0x4a, 3<<4, 3<<4),
4855 UPDATE_COEF(0x63, 3<<14, 0),
4856 UPDATE_COEF(0x67, 0xf000, 0x3000),
David Henningsson2ae95572016-02-25 09:37:05 +01004857 {}
4858 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004859 static const struct coef_fw coef0255[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004860 WRITE_COEF(0x45, 0xc089),
4861 WRITE_COEF(0x45, 0xc489),
4862 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
4863 WRITE_COEF(0x49, 0x0049),
4864 {}
4865 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004866 static const struct coef_fw coef0256[] = {
Kailang Yang717f43d2019-05-31 17:16:53 +08004867 WRITE_COEF(0x45, 0xc489),
4868 WRITE_COEFEX(0x57, 0x03, 0x0da3),
4869 WRITE_COEF(0x49, 0x0049),
4870 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
4871 WRITE_COEF(0x06, 0x6100),
4872 {}
4873 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004874 static const struct coef_fw coef0233[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004875 WRITE_COEF(0x06, 0x2100),
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(0x4f, 0xfcc0, 0xc400), /* Set to TRS type */
4881 UPDATE_COEF(0x50, 0x2000, 0x2000),
4882 UPDATE_COEF(0x56, 0x0006, 0x0006),
4883 UPDATE_COEF(0x66, 0x0008, 0),
4884 UPDATE_COEF(0x67, 0x2000, 0),
4885 {}
4886 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004887 static const struct coef_fw coef0292[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004888 WRITE_COEF(0x76, 0x000e),
4889 WRITE_COEF(0x6c, 0x2400),
4890 WRITE_COEF(0x6b, 0xc429),
4891 WRITE_COEF(0x18, 0x7308),
4892 {}
4893 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004894 static const struct coef_fw coef0293[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004895 UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
4896 WRITE_COEF(0x45, 0xC429), /* Set to TRS type */
4897 UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
4898 {}
4899 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004900 static const struct coef_fw coef0688[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004901 WRITE_COEF(0x11, 0x0041),
4902 WRITE_COEF(0x15, 0x0d40),
4903 WRITE_COEF(0xb7, 0x802b),
4904 {}
4905 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004906 static const struct coef_fw coef0274[] = {
Kailang Yang71683c32017-06-20 16:33:50 +08004907 WRITE_COEF(0x45, 0x4289),
4908 UPDATE_COEF(0x4a, 0x0010, 0x0010),
4909 UPDATE_COEF(0x6b, 0x0f00, 0),
4910 UPDATE_COEF(0x49, 0x0300, 0x0300),
4911 {}
4912 };
Takashi Iwai54db6c32014-08-18 15:11:19 +02004913
Takashi Iwai7639a062015-03-03 10:07:24 +01004914 switch (codec->core.vendor_id) {
Kailang Yangc2b691e2018-01-17 15:22:55 +08004915 case 0x10ec0215:
David Henningsson2ae95572016-02-25 09:37:05 +01004916 case 0x10ec0225:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004917 case 0x10ec0285:
Kailang Yang7d727862016-05-24 16:46:07 +08004918 case 0x10ec0295:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004919 case 0x10ec0289:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08004920 case 0x10ec0299:
Kailang Yang5a367672017-07-21 15:23:53 +08004921 alc_process_coef_fw(codec, alc225_pre_hsmode);
David Henningsson2ae95572016-02-25 09:37:05 +01004922 alc_process_coef_fw(codec, coef0225);
4923 break;
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004924 case 0x10ec0255:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004925 alc_process_coef_fw(codec, coef0255);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004926 break;
Kailang Yang717f43d2019-05-31 17:16:53 +08004927 case 0x10ec0236:
4928 case 0x10ec0256:
4929 alc_write_coef_idx(codec, 0x1b, 0x0e4b);
4930 alc_write_coef_idx(codec, 0x45, 0xc089);
4931 msleep(50);
4932 alc_process_coef_fw(codec, coef0256);
4933 break;
Kailang Yang71683c32017-06-20 16:33:50 +08004934 case 0x10ec0234:
4935 case 0x10ec0274:
4936 case 0x10ec0294:
4937 alc_process_coef_fw(codec, coef0274);
4938 break;
Kailang Yang13fd08a2014-05-21 16:49:48 +08004939 case 0x10ec0233:
David Henningsson73bdd592013-04-15 15:44:14 +02004940 case 0x10ec0283:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004941 alc_process_coef_fw(codec, coef0233);
David Henningsson73bdd592013-04-15 15:44:14 +02004942 break;
Kailang Yangf3b70332015-04-08 15:01:17 +08004943 case 0x10ec0286:
4944 case 0x10ec0288:
Kailang Yang1a5bc8d2015-05-12 17:11:10 +08004945 case 0x10ec0298:
Kailang Yangf3b70332015-04-08 15:01:17 +08004946 alc_process_coef_fw(codec, coef0288);
4947 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004948 case 0x10ec0292:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004949 alc_process_coef_fw(codec, coef0292);
David Henningsson73bdd592013-04-15 15:44:14 +02004950 break;
Kailang Yanga22aa262014-04-23 17:34:28 +08004951 case 0x10ec0293:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004952 alc_process_coef_fw(codec, coef0293);
Kailang Yanga22aa262014-04-23 17:34:28 +08004953 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004954 case 0x10ec0668:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004955 alc_process_coef_fw(codec, coef0688);
David Henningsson73bdd592013-04-15 15:44:14 +02004956 break;
Kailang Yang78f4f7c2016-06-07 11:31:34 +08004957 case 0x10ec0867:
4958 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
4959 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004960 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01004961 codec_dbg(codec, "Headset jack set to headphone (default) mode.\n");
David Henningsson73bdd592013-04-15 15:44:14 +02004962}
4963
4964/* Iphone type */
4965static void alc_headset_mode_ctia(struct hda_codec *codec)
4966{
Kailang Yang89542932017-07-17 15:03:43 +08004967 int val;
4968
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004969 static const struct coef_fw coef0255[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004970 WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
4971 WRITE_COEF(0x1b, 0x0c2b),
4972 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
4973 {}
4974 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004975 static const struct coef_fw coef0256[] = {
Kailang Yange69e7e02016-05-30 15:58:28 +08004976 WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
Kailang Yang717f43d2019-05-31 17:16:53 +08004977 WRITE_COEF(0x1b, 0x0e6b),
Kailang Yange69e7e02016-05-30 15:58:28 +08004978 {}
4979 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004980 static const struct coef_fw coef0233[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004981 WRITE_COEF(0x45, 0xd429),
4982 WRITE_COEF(0x1b, 0x0c2b),
4983 WRITE_COEF(0x32, 0x4ea3),
4984 {}
4985 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004986 static const struct coef_fw coef0288[] = {
Kailang Yangf3b70332015-04-08 15:01:17 +08004987 UPDATE_COEF(0x50, 0x2000, 0x2000),
4988 UPDATE_COEF(0x56, 0x0006, 0x0006),
4989 UPDATE_COEF(0x66, 0x0008, 0),
4990 UPDATE_COEF(0x67, 0x2000, 0),
4991 {}
4992 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004993 static const struct coef_fw coef0292[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004994 WRITE_COEF(0x6b, 0xd429),
4995 WRITE_COEF(0x76, 0x0008),
4996 WRITE_COEF(0x18, 0x7388),
4997 {}
4998 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004999 static const struct coef_fw coef0293[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005000 WRITE_COEF(0x45, 0xd429), /* Set to ctia type */
5001 UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
5002 {}
5003 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005004 static const struct coef_fw coef0688[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005005 WRITE_COEF(0x11, 0x0001),
5006 WRITE_COEF(0x15, 0x0d60),
5007 WRITE_COEF(0xc3, 0x0000),
5008 {}
5009 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005010 static const struct coef_fw coef0225_1[] = {
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08005011 UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
Kailang Yang5a367672017-07-21 15:23:53 +08005012 UPDATE_COEF(0x63, 3<<14, 2<<14),
5013 {}
5014 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005015 static const struct coef_fw coef0225_2[] = {
Kailang Yang5a367672017-07-21 15:23:53 +08005016 UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
5017 UPDATE_COEF(0x63, 3<<14, 1<<14),
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08005018 {}
5019 };
Takashi Iwai54db6c32014-08-18 15:11:19 +02005020
Takashi Iwai7639a062015-03-03 10:07:24 +01005021 switch (codec->core.vendor_id) {
Kailang Yang9a22a8f52013-11-08 15:54:49 +08005022 case 0x10ec0255:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005023 alc_process_coef_fw(codec, coef0255);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08005024 break;
Kailang Yang736f20a2017-10-20 15:06:34 +08005025 case 0x10ec0236:
Kailang Yange69e7e02016-05-30 15:58:28 +08005026 case 0x10ec0256:
5027 alc_process_coef_fw(codec, coef0256);
5028 break;
Kailang Yang71683c32017-06-20 16:33:50 +08005029 case 0x10ec0234:
5030 case 0x10ec0274:
5031 case 0x10ec0294:
5032 alc_write_coef_idx(codec, 0x45, 0xd689);
5033 break;
Kailang Yang13fd08a2014-05-21 16:49:48 +08005034 case 0x10ec0233:
David Henningsson73bdd592013-04-15 15:44:14 +02005035 case 0x10ec0283:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005036 alc_process_coef_fw(codec, coef0233);
David Henningsson73bdd592013-04-15 15:44:14 +02005037 break;
Kailang Yang1a5bc8d2015-05-12 17:11:10 +08005038 case 0x10ec0298:
Kailang Yang89542932017-07-17 15:03:43 +08005039 val = alc_read_coef_idx(codec, 0x50);
5040 if (val & (1 << 12)) {
5041 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
5042 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5043 msleep(300);
5044 } else {
5045 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
5046 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5047 msleep(300);
5048 }
5049 break;
Kailang Yangf3b70332015-04-08 15:01:17 +08005050 case 0x10ec0286:
5051 case 0x10ec0288:
5052 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5053 msleep(300);
5054 alc_process_coef_fw(codec, coef0288);
5055 break;
David Henningsson73bdd592013-04-15 15:44:14 +02005056 case 0x10ec0292:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005057 alc_process_coef_fw(codec, coef0292);
David Henningsson73bdd592013-04-15 15:44:14 +02005058 break;
Kailang Yanga22aa262014-04-23 17:34:28 +08005059 case 0x10ec0293:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005060 alc_process_coef_fw(codec, coef0293);
Kailang Yanga22aa262014-04-23 17:34:28 +08005061 break;
David Henningsson73bdd592013-04-15 15:44:14 +02005062 case 0x10ec0668:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005063 alc_process_coef_fw(codec, coef0688);
David Henningsson73bdd592013-04-15 15:44:14 +02005064 break;
Kailang Yangc2b691e2018-01-17 15:22:55 +08005065 case 0x10ec0215:
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08005066 case 0x10ec0225:
Kailang Yangc2b691e2018-01-17 15:22:55 +08005067 case 0x10ec0285:
Kailang Yang7d727862016-05-24 16:46:07 +08005068 case 0x10ec0295:
Kailang Yangc2b691e2018-01-17 15:22:55 +08005069 case 0x10ec0289:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08005070 case 0x10ec0299:
Kailang Yang5a367672017-07-21 15:23:53 +08005071 val = alc_read_coef_idx(codec, 0x45);
5072 if (val & (1 << 9))
5073 alc_process_coef_fw(codec, coef0225_2);
5074 else
5075 alc_process_coef_fw(codec, coef0225_1);
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08005076 break;
Kailang Yang78f4f7c2016-06-07 11:31:34 +08005077 case 0x10ec0867:
5078 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5079 break;
David Henningsson73bdd592013-04-15 15:44:14 +02005080 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01005081 codec_dbg(codec, "Headset jack set to iPhone-style headset mode.\n");
David Henningsson73bdd592013-04-15 15:44:14 +02005082}
5083
5084/* Nokia type */
5085static void alc_headset_mode_omtp(struct hda_codec *codec)
5086{
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005087 static const struct coef_fw coef0255[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005088 WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
5089 WRITE_COEF(0x1b, 0x0c2b),
5090 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5091 {}
5092 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005093 static const struct coef_fw coef0256[] = {
Kailang Yange69e7e02016-05-30 15:58:28 +08005094 WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
Kailang Yang717f43d2019-05-31 17:16:53 +08005095 WRITE_COEF(0x1b, 0x0e6b),
Kailang Yange69e7e02016-05-30 15:58:28 +08005096 {}
5097 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005098 static const struct coef_fw coef0233[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005099 WRITE_COEF(0x45, 0xe429),
5100 WRITE_COEF(0x1b, 0x0c2b),
5101 WRITE_COEF(0x32, 0x4ea3),
5102 {}
5103 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005104 static const struct coef_fw coef0288[] = {
Kailang Yangf3b70332015-04-08 15:01:17 +08005105 UPDATE_COEF(0x50, 0x2000, 0x2000),
5106 UPDATE_COEF(0x56, 0x0006, 0x0006),
5107 UPDATE_COEF(0x66, 0x0008, 0),
5108 UPDATE_COEF(0x67, 0x2000, 0),
5109 {}
5110 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005111 static const struct coef_fw coef0292[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005112 WRITE_COEF(0x6b, 0xe429),
5113 WRITE_COEF(0x76, 0x0008),
5114 WRITE_COEF(0x18, 0x7388),
5115 {}
5116 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005117 static const struct coef_fw coef0293[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005118 WRITE_COEF(0x45, 0xe429), /* Set to omtp type */
5119 UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
5120 {}
5121 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005122 static const struct coef_fw coef0688[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005123 WRITE_COEF(0x11, 0x0001),
5124 WRITE_COEF(0x15, 0x0d50),
5125 WRITE_COEF(0xc3, 0x0000),
5126 {}
5127 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005128 static const struct coef_fw coef0225[] = {
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08005129 UPDATE_COEF(0x45, 0x3f<<10, 0x39<<10),
Kailang Yang5a367672017-07-21 15:23:53 +08005130 UPDATE_COEF(0x63, 3<<14, 2<<14),
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08005131 {}
5132 };
Takashi Iwai54db6c32014-08-18 15:11:19 +02005133
Takashi Iwai7639a062015-03-03 10:07:24 +01005134 switch (codec->core.vendor_id) {
Kailang Yang9a22a8f52013-11-08 15:54:49 +08005135 case 0x10ec0255:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005136 alc_process_coef_fw(codec, coef0255);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08005137 break;
Kailang Yang736f20a2017-10-20 15:06:34 +08005138 case 0x10ec0236:
Kailang Yange69e7e02016-05-30 15:58:28 +08005139 case 0x10ec0256:
5140 alc_process_coef_fw(codec, coef0256);
5141 break;
Kailang Yang71683c32017-06-20 16:33:50 +08005142 case 0x10ec0234:
5143 case 0x10ec0274:
5144 case 0x10ec0294:
5145 alc_write_coef_idx(codec, 0x45, 0xe689);
5146 break;
Kailang Yang13fd08a2014-05-21 16:49:48 +08005147 case 0x10ec0233:
David Henningsson73bdd592013-04-15 15:44:14 +02005148 case 0x10ec0283:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005149 alc_process_coef_fw(codec, coef0233);
David Henningsson73bdd592013-04-15 15:44:14 +02005150 break;
Kailang Yang1a5bc8d2015-05-12 17:11:10 +08005151 case 0x10ec0298:
5152 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);/* Headset output enable */
Kailang Yang89542932017-07-17 15:03:43 +08005153 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5154 msleep(300);
5155 break;
Kailang Yangf3b70332015-04-08 15:01:17 +08005156 case 0x10ec0286:
5157 case 0x10ec0288:
5158 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5159 msleep(300);
5160 alc_process_coef_fw(codec, coef0288);
5161 break;
David Henningsson73bdd592013-04-15 15:44:14 +02005162 case 0x10ec0292:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005163 alc_process_coef_fw(codec, coef0292);
David Henningsson73bdd592013-04-15 15:44:14 +02005164 break;
Kailang Yanga22aa262014-04-23 17:34:28 +08005165 case 0x10ec0293:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005166 alc_process_coef_fw(codec, coef0293);
Kailang Yanga22aa262014-04-23 17:34:28 +08005167 break;
David Henningsson73bdd592013-04-15 15:44:14 +02005168 case 0x10ec0668:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005169 alc_process_coef_fw(codec, coef0688);
David Henningsson73bdd592013-04-15 15:44:14 +02005170 break;
Kailang Yangc2b691e2018-01-17 15:22:55 +08005171 case 0x10ec0215:
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08005172 case 0x10ec0225:
Kailang Yangc2b691e2018-01-17 15:22:55 +08005173 case 0x10ec0285:
Kailang Yang7d727862016-05-24 16:46:07 +08005174 case 0x10ec0295:
Kailang Yangc2b691e2018-01-17 15:22:55 +08005175 case 0x10ec0289:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08005176 case 0x10ec0299:
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08005177 alc_process_coef_fw(codec, coef0225);
5178 break;
David Henningsson73bdd592013-04-15 15:44:14 +02005179 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01005180 codec_dbg(codec, "Headset jack set to Nokia-style headset mode.\n");
David Henningsson73bdd592013-04-15 15:44:14 +02005181}
5182
5183static void alc_determine_headset_type(struct hda_codec *codec)
5184{
5185 int val;
5186 bool is_ctia = false;
5187 struct alc_spec *spec = codec->spec;
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005188 static const struct coef_fw coef0255[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005189 WRITE_COEF(0x45, 0xd089), /* combo jack auto switch control(Check type)*/
5190 WRITE_COEF(0x49, 0x0149), /* combo jack auto switch control(Vref
5191 conteol) */
5192 {}
5193 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005194 static const struct coef_fw coef0288[] = {
Kailang Yangf3b70332015-04-08 15:01:17 +08005195 UPDATE_COEF(0x4f, 0xfcc0, 0xd400), /* Check Type */
5196 {}
5197 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005198 static const struct coef_fw coef0298[] = {
Kailang Yang89542932017-07-17 15:03:43 +08005199 UPDATE_COEF(0x50, 0x2000, 0x2000),
5200 UPDATE_COEF(0x56, 0x0006, 0x0006),
5201 UPDATE_COEF(0x66, 0x0008, 0),
5202 UPDATE_COEF(0x67, 0x2000, 0),
5203 UPDATE_COEF(0x19, 0x1300, 0x1300),
5204 {}
5205 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005206 static const struct coef_fw coef0293[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005207 UPDATE_COEF(0x4a, 0x000f, 0x0008), /* Combo Jack auto detect */
5208 WRITE_COEF(0x45, 0xD429), /* Set to ctia type */
5209 {}
5210 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005211 static const struct coef_fw coef0688[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005212 WRITE_COEF(0x11, 0x0001),
5213 WRITE_COEF(0xb7, 0x802b),
5214 WRITE_COEF(0x15, 0x0d60),
5215 WRITE_COEF(0xc3, 0x0c00),
5216 {}
5217 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005218 static const struct coef_fw coef0274[] = {
Kailang Yang71683c32017-06-20 16:33:50 +08005219 UPDATE_COEF(0x4a, 0x0010, 0),
5220 UPDATE_COEF(0x4a, 0x8000, 0),
5221 WRITE_COEF(0x45, 0xd289),
5222 UPDATE_COEF(0x49, 0x0300, 0x0300),
5223 {}
5224 };
David Henningsson73bdd592013-04-15 15:44:14 +02005225
Kailang Yang92666d42020-11-19 17:04:21 +08005226 if (spec->no_internal_mic_pin) {
5227 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
5228 return;
5229 }
5230
Takashi Iwai7639a062015-03-03 10:07:24 +01005231 switch (codec->core.vendor_id) {
Kailang Yang9a22a8f52013-11-08 15:54:49 +08005232 case 0x10ec0255:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005233 alc_process_coef_fw(codec, coef0255);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08005234 msleep(300);
5235 val = alc_read_coef_idx(codec, 0x46);
5236 is_ctia = (val & 0x0070) == 0x0070;
5237 break;
Kailang Yang717f43d2019-05-31 17:16:53 +08005238 case 0x10ec0236:
5239 case 0x10ec0256:
5240 alc_write_coef_idx(codec, 0x1b, 0x0e4b);
5241 alc_write_coef_idx(codec, 0x06, 0x6104);
5242 alc_write_coefex_idx(codec, 0x57, 0x3, 0x09a3);
5243
5244 snd_hda_codec_write(codec, 0x21, 0,
5245 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5246 msleep(80);
5247 snd_hda_codec_write(codec, 0x21, 0,
5248 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5249
5250 alc_process_coef_fw(codec, coef0255);
5251 msleep(300);
5252 val = alc_read_coef_idx(codec, 0x46);
5253 is_ctia = (val & 0x0070) == 0x0070;
5254
5255 alc_write_coefex_idx(codec, 0x57, 0x3, 0x0da3);
5256 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5257
5258 snd_hda_codec_write(codec, 0x21, 0,
5259 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5260 msleep(80);
5261 snd_hda_codec_write(codec, 0x21, 0,
5262 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5263 break;
Kailang Yang71683c32017-06-20 16:33:50 +08005264 case 0x10ec0234:
5265 case 0x10ec0274:
5266 case 0x10ec0294:
5267 alc_process_coef_fw(codec, coef0274);
Hui Wangfebf22562021-03-20 17:15:41 +08005268 msleep(850);
Kailang Yang71683c32017-06-20 16:33:50 +08005269 val = alc_read_coef_idx(codec, 0x46);
5270 is_ctia = (val & 0x00f0) == 0x00f0;
5271 break;
Kailang Yang13fd08a2014-05-21 16:49:48 +08005272 case 0x10ec0233:
David Henningsson73bdd592013-04-15 15:44:14 +02005273 case 0x10ec0283:
5274 alc_write_coef_idx(codec, 0x45, 0xd029);
5275 msleep(300);
5276 val = alc_read_coef_idx(codec, 0x46);
5277 is_ctia = (val & 0x0070) == 0x0070;
5278 break;
Kailang Yang1a5bc8d2015-05-12 17:11:10 +08005279 case 0x10ec0298:
Kailang Yang89542932017-07-17 15:03:43 +08005280 snd_hda_codec_write(codec, 0x21, 0,
5281 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5282 msleep(100);
5283 snd_hda_codec_write(codec, 0x21, 0,
5284 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5285 msleep(200);
5286
5287 val = alc_read_coef_idx(codec, 0x50);
5288 if (val & (1 << 12)) {
5289 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
5290 alc_process_coef_fw(codec, coef0288);
5291 msleep(350);
5292 val = alc_read_coef_idx(codec, 0x50);
5293 is_ctia = (val & 0x0070) == 0x0070;
5294 } else {
5295 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
5296 alc_process_coef_fw(codec, coef0288);
5297 msleep(350);
5298 val = alc_read_coef_idx(codec, 0x50);
5299 is_ctia = (val & 0x0070) == 0x0070;
5300 }
5301 alc_process_coef_fw(codec, coef0298);
5302 snd_hda_codec_write(codec, 0x21, 0,
5303 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP);
5304 msleep(75);
5305 snd_hda_codec_write(codec, 0x21, 0,
5306 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5307 break;
Kailang Yangf3b70332015-04-08 15:01:17 +08005308 case 0x10ec0286:
5309 case 0x10ec0288:
5310 alc_process_coef_fw(codec, coef0288);
5311 msleep(350);
5312 val = alc_read_coef_idx(codec, 0x50);
5313 is_ctia = (val & 0x0070) == 0x0070;
5314 break;
David Henningsson73bdd592013-04-15 15:44:14 +02005315 case 0x10ec0292:
5316 alc_write_coef_idx(codec, 0x6b, 0xd429);
5317 msleep(300);
5318 val = alc_read_coef_idx(codec, 0x6c);
5319 is_ctia = (val & 0x001c) == 0x001c;
5320 break;
Kailang Yanga22aa262014-04-23 17:34:28 +08005321 case 0x10ec0293:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005322 alc_process_coef_fw(codec, coef0293);
Kailang Yanga22aa262014-04-23 17:34:28 +08005323 msleep(300);
5324 val = alc_read_coef_idx(codec, 0x46);
5325 is_ctia = (val & 0x0070) == 0x0070;
5326 break;
David Henningsson73bdd592013-04-15 15:44:14 +02005327 case 0x10ec0668:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005328 alc_process_coef_fw(codec, coef0688);
David Henningsson73bdd592013-04-15 15:44:14 +02005329 msleep(300);
5330 val = alc_read_coef_idx(codec, 0xbe);
5331 is_ctia = (val & 0x1c02) == 0x1c02;
5332 break;
Kailang Yangc2b691e2018-01-17 15:22:55 +08005333 case 0x10ec0215:
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08005334 case 0x10ec0225:
Kailang Yangc2b691e2018-01-17 15:22:55 +08005335 case 0x10ec0285:
Kailang Yang7d727862016-05-24 16:46:07 +08005336 case 0x10ec0295:
Kailang Yangc2b691e2018-01-17 15:22:55 +08005337 case 0x10ec0289:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08005338 case 0x10ec0299:
Kailang Yangda911b12018-01-05 16:50:08 +08005339 snd_hda_codec_write(codec, 0x21, 0,
5340 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5341 msleep(80);
5342 snd_hda_codec_write(codec, 0x21, 0,
5343 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5344
Kailang Yang5a367672017-07-21 15:23:53 +08005345 alc_process_coef_fw(codec, alc225_pre_hsmode);
5346 alc_update_coef_idx(codec, 0x67, 0xf000, 0x1000);
5347 val = alc_read_coef_idx(codec, 0x45);
5348 if (val & (1 << 9)) {
5349 alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5350 alc_update_coef_idx(codec, 0x49, 3<<8, 2<<8);
5351 msleep(800);
5352 val = alc_read_coef_idx(codec, 0x46);
5353 is_ctia = (val & 0x00f0) == 0x00f0;
5354 } else {
5355 alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5356 alc_update_coef_idx(codec, 0x49, 3<<8, 1<<8);
5357 msleep(800);
5358 val = alc_read_coef_idx(codec, 0x46);
5359 is_ctia = (val & 0x00f0) == 0x00f0;
5360 }
5361 alc_update_coef_idx(codec, 0x4a, 7<<6, 7<<6);
5362 alc_update_coef_idx(codec, 0x4a, 3<<4, 3<<4);
5363 alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
Kailang Yangda911b12018-01-05 16:50:08 +08005364
5365 snd_hda_codec_write(codec, 0x21, 0,
5366 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5367 msleep(80);
5368 snd_hda_codec_write(codec, 0x21, 0,
5369 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08005370 break;
Kailang Yang78f4f7c2016-06-07 11:31:34 +08005371 case 0x10ec0867:
5372 is_ctia = true;
5373 break;
David Henningsson73bdd592013-04-15 15:44:14 +02005374 }
5375
Takashi Iwai4e76a882014-02-25 12:21:03 +01005376 codec_dbg(codec, "Headset jack detected iPhone-style headset: %s\n",
David Henningsson73bdd592013-04-15 15:44:14 +02005377 is_ctia ? "yes" : "no");
5378 spec->current_headset_type = is_ctia ? ALC_HEADSET_TYPE_CTIA : ALC_HEADSET_TYPE_OMTP;
5379}
5380
5381static void alc_update_headset_mode(struct hda_codec *codec)
5382{
5383 struct alc_spec *spec = codec->spec;
5384
5385 hda_nid_t mux_pin = spec->gen.imux_pins[spec->gen.cur_mux[0]];
Takashi Iwai35a39f92019-02-01 11:19:50 +01005386 hda_nid_t hp_pin = alc_get_hp_pin(spec);
David Henningsson73bdd592013-04-15 15:44:14 +02005387
5388 int new_headset_mode;
5389
5390 if (!snd_hda_jack_detect(codec, hp_pin))
5391 new_headset_mode = ALC_HEADSET_MODE_UNPLUGGED;
5392 else if (mux_pin == spec->headset_mic_pin)
5393 new_headset_mode = ALC_HEADSET_MODE_HEADSET;
5394 else if (mux_pin == spec->headphone_mic_pin)
5395 new_headset_mode = ALC_HEADSET_MODE_MIC;
5396 else
5397 new_headset_mode = ALC_HEADSET_MODE_HEADPHONE;
5398
David Henningsson5959a6b2013-11-12 11:10:57 +01005399 if (new_headset_mode == spec->current_headset_mode) {
5400 snd_hda_gen_update_outputs(codec);
David Henningsson73bdd592013-04-15 15:44:14 +02005401 return;
David Henningsson5959a6b2013-11-12 11:10:57 +01005402 }
David Henningsson73bdd592013-04-15 15:44:14 +02005403
5404 switch (new_headset_mode) {
5405 case ALC_HEADSET_MODE_UNPLUGGED:
5406 alc_headset_mode_unplugged(codec);
Kailang Yangaeac1a02019-05-16 16:10:44 +08005407 spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5408 spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
David Henningsson73bdd592013-04-15 15:44:14 +02005409 spec->gen.hp_jack_present = false;
5410 break;
5411 case ALC_HEADSET_MODE_HEADSET:
5412 if (spec->current_headset_type == ALC_HEADSET_TYPE_UNKNOWN)
5413 alc_determine_headset_type(codec);
5414 if (spec->current_headset_type == ALC_HEADSET_TYPE_CTIA)
5415 alc_headset_mode_ctia(codec);
5416 else if (spec->current_headset_type == ALC_HEADSET_TYPE_OMTP)
5417 alc_headset_mode_omtp(codec);
5418 spec->gen.hp_jack_present = true;
5419 break;
5420 case ALC_HEADSET_MODE_MIC:
5421 alc_headset_mode_mic_in(codec, hp_pin, spec->headphone_mic_pin);
5422 spec->gen.hp_jack_present = false;
5423 break;
5424 case ALC_HEADSET_MODE_HEADPHONE:
5425 alc_headset_mode_default(codec);
5426 spec->gen.hp_jack_present = true;
5427 break;
5428 }
5429 if (new_headset_mode != ALC_HEADSET_MODE_MIC) {
5430 snd_hda_set_pin_ctl_cache(codec, hp_pin,
5431 AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
David Henningsson1f8b46c2015-05-12 14:38:15 +02005432 if (spec->headphone_mic_pin && spec->headphone_mic_pin != hp_pin)
David Henningsson73bdd592013-04-15 15:44:14 +02005433 snd_hda_set_pin_ctl_cache(codec, spec->headphone_mic_pin,
5434 PIN_VREFHIZ);
5435 }
5436 spec->current_headset_mode = new_headset_mode;
5437
5438 snd_hda_gen_update_outputs(codec);
5439}
5440
5441static void alc_update_headset_mode_hook(struct hda_codec *codec,
Takashi Iwai7fe30712014-01-30 17:59:02 +01005442 struct snd_kcontrol *kcontrol,
5443 struct snd_ctl_elem_value *ucontrol)
David Henningsson73bdd592013-04-15 15:44:14 +02005444{
5445 alc_update_headset_mode(codec);
5446}
5447
Takashi Iwai1a4f69d2014-09-11 15:22:46 +02005448static void alc_update_headset_jack_cb(struct hda_codec *codec,
5449 struct hda_jack_callback *jack)
David Henningsson73bdd592013-04-15 15:44:14 +02005450{
David Henningsson73bdd592013-04-15 15:44:14 +02005451 snd_hda_gen_hp_automute(codec, jack);
Hui Wange54f30b2021-03-20 17:15:42 +08005452 alc_update_headset_mode(codec);
David Henningsson73bdd592013-04-15 15:44:14 +02005453}
5454
5455static void alc_probe_headset_mode(struct hda_codec *codec)
5456{
5457 int i;
5458 struct alc_spec *spec = codec->spec;
5459 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5460
5461 /* Find mic pins */
5462 for (i = 0; i < cfg->num_inputs; i++) {
5463 if (cfg->inputs[i].is_headset_mic && !spec->headset_mic_pin)
5464 spec->headset_mic_pin = cfg->inputs[i].pin;
5465 if (cfg->inputs[i].is_headphone_mic && !spec->headphone_mic_pin)
5466 spec->headphone_mic_pin = cfg->inputs[i].pin;
5467 }
5468
Takashi Iwai0bed2aa2018-06-19 12:45:53 +02005469 WARN_ON(spec->gen.cap_sync_hook);
David Henningsson73bdd592013-04-15 15:44:14 +02005470 spec->gen.cap_sync_hook = alc_update_headset_mode_hook;
5471 spec->gen.automute_hook = alc_update_headset_mode;
5472 spec->gen.hp_automute_hook = alc_update_headset_jack_cb;
5473}
5474
5475static void alc_fixup_headset_mode(struct hda_codec *codec,
5476 const struct hda_fixup *fix, int action)
5477{
5478 struct alc_spec *spec = codec->spec;
5479
5480 switch (action) {
5481 case HDA_FIXUP_ACT_PRE_PROBE:
5482 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC | HDA_PINCFG_HEADPHONE_MIC;
5483 break;
5484 case HDA_FIXUP_ACT_PROBE:
5485 alc_probe_headset_mode(codec);
5486 break;
5487 case HDA_FIXUP_ACT_INIT:
Kailang Yangaeac1a02019-05-16 16:10:44 +08005488 if (is_s3_resume(codec) || is_s4_resume(codec)) {
5489 spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5490 spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
5491 }
David Henningsson73bdd592013-04-15 15:44:14 +02005492 alc_update_headset_mode(codec);
5493 break;
5494 }
5495}
5496
5497static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
5498 const struct hda_fixup *fix, int action)
5499{
5500 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5501 struct alc_spec *spec = codec->spec;
5502 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5503 }
5504 else
5505 alc_fixup_headset_mode(codec, fix, action);
5506}
5507
Kailang Yang31278992014-03-03 15:27:22 +08005508static void alc255_set_default_jack_type(struct hda_codec *codec)
5509{
5510 /* Set to iphone type */
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005511 static const struct coef_fw alc255fw[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005512 WRITE_COEF(0x1b, 0x880b),
5513 WRITE_COEF(0x45, 0xd089),
5514 WRITE_COEF(0x1b, 0x080b),
5515 WRITE_COEF(0x46, 0x0004),
5516 WRITE_COEF(0x1b, 0x0c0b),
5517 {}
5518 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005519 static const struct coef_fw alc256fw[] = {
Kailang Yange69e7e02016-05-30 15:58:28 +08005520 WRITE_COEF(0x1b, 0x884b),
5521 WRITE_COEF(0x45, 0xd089),
5522 WRITE_COEF(0x1b, 0x084b),
5523 WRITE_COEF(0x46, 0x0004),
5524 WRITE_COEF(0x1b, 0x0c4b),
5525 {}
5526 };
5527 switch (codec->core.vendor_id) {
5528 case 0x10ec0255:
5529 alc_process_coef_fw(codec, alc255fw);
5530 break;
Kailang Yang736f20a2017-10-20 15:06:34 +08005531 case 0x10ec0236:
Kailang Yange69e7e02016-05-30 15:58:28 +08005532 case 0x10ec0256:
5533 alc_process_coef_fw(codec, alc256fw);
5534 break;
5535 }
Kailang Yang31278992014-03-03 15:27:22 +08005536 msleep(30);
5537}
5538
Kailang Yang9a22a8f52013-11-08 15:54:49 +08005539static void alc_fixup_headset_mode_alc255(struct hda_codec *codec,
5540 const struct hda_fixup *fix, int action)
5541{
5542 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Kailang Yang31278992014-03-03 15:27:22 +08005543 alc255_set_default_jack_type(codec);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08005544 }
5545 alc_fixup_headset_mode(codec, fix, action);
5546}
5547
Kailang Yang31278992014-03-03 15:27:22 +08005548static void alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec,
5549 const struct hda_fixup *fix, int action)
5550{
5551 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5552 struct alc_spec *spec = codec->spec;
5553 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5554 alc255_set_default_jack_type(codec);
5555 }
5556 else
5557 alc_fixup_headset_mode(codec, fix, action);
5558}
5559
Kailang Yange1e62b92015-04-08 16:01:22 +08005560static void alc288_update_headset_jack_cb(struct hda_codec *codec,
5561 struct hda_jack_callback *jack)
5562{
5563 struct alc_spec *spec = codec->spec;
Kailang Yange1e62b92015-04-08 16:01:22 +08005564
5565 alc_update_headset_jack_cb(codec, jack);
5566 /* Headset Mic enable or disable, only for Dell Dino */
Takashi Iwaid44a6862018-06-19 23:04:03 +02005567 alc_update_gpio_data(codec, 0x40, spec->gen.hp_jack_present);
Kailang Yange1e62b92015-04-08 16:01:22 +08005568}
5569
5570static void alc_fixup_headset_mode_dell_alc288(struct hda_codec *codec,
5571 const struct hda_fixup *fix, int action)
5572{
5573 alc_fixup_headset_mode(codec, fix, action);
5574 if (action == HDA_FIXUP_ACT_PROBE) {
5575 struct alc_spec *spec = codec->spec;
Takashi Iwaid44a6862018-06-19 23:04:03 +02005576 /* toggled via hp_automute_hook */
5577 spec->gpio_mask |= 0x40;
5578 spec->gpio_dir |= 0x40;
Kailang Yange1e62b92015-04-08 16:01:22 +08005579 spec->gen.hp_automute_hook = alc288_update_headset_jack_cb;
5580 }
5581}
5582
Hui Wang493a52a2014-01-14 14:07:36 +08005583static void alc_fixup_auto_mute_via_amp(struct hda_codec *codec,
5584 const struct hda_fixup *fix, int action)
5585{
5586 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5587 struct alc_spec *spec = codec->spec;
5588 spec->gen.auto_mute_via_amp = 1;
5589 }
5590}
5591
Takashi Iwai9b745ab2014-03-07 08:37:19 +01005592static void alc_fixup_no_shutup(struct hda_codec *codec,
5593 const struct hda_fixup *fix, int action)
5594{
Takashi Iwaiefe55732018-06-15 11:55:02 +02005595 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai9b745ab2014-03-07 08:37:19 +01005596 struct alc_spec *spec = codec->spec;
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01005597 spec->no_shutup_pins = 1;
Takashi Iwai9b745ab2014-03-07 08:37:19 +01005598 }
5599}
5600
Gabriele Mazzotta5e6db662014-05-20 18:58:26 +02005601static void alc_fixup_disable_aamix(struct hda_codec *codec,
5602 const struct hda_fixup *fix, int action)
5603{
5604 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5605 struct alc_spec *spec = codec->spec;
5606 /* Disable AA-loopback as it causes white noise */
5607 spec->gen.mixer_nid = 0;
5608 }
5609}
5610
Takashi Iwai7f57d802015-09-24 17:36:51 +02005611/* fixup for Thinkpad docks: add dock pins, avoid HP parser fixup */
5612static void alc_fixup_tpt440_dock(struct hda_codec *codec,
5613 const struct hda_fixup *fix, int action)
5614{
5615 static const struct hda_pintbl pincfgs[] = {
5616 { 0x16, 0x21211010 }, /* dock headphone */
5617 { 0x19, 0x21a11010 }, /* dock mic */
5618 { }
5619 };
5620 struct alc_spec *spec = codec->spec;
5621
5622 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Hui Wang871b9062019-08-14 12:09:08 +08005623 spec->reboot_notify = snd_hda_gen_reboot_notify; /* reduce noise */
Takashi Iwai7f57d802015-09-24 17:36:51 +02005624 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
5625 codec->power_save_node = 0; /* avoid click noises */
5626 snd_hda_apply_pincfgs(codec, pincfgs);
5627 }
5628}
5629
Kailang Yang61fcf8e2018-02-02 15:26:46 +08005630static void alc_fixup_tpt470_dock(struct hda_codec *codec,
5631 const struct hda_fixup *fix, int action)
5632{
5633 static const struct hda_pintbl pincfgs[] = {
5634 { 0x17, 0x21211010 }, /* dock headphone */
5635 { 0x19, 0x21a11010 }, /* dock mic */
5636 { }
5637 };
5638 struct alc_spec *spec = codec->spec;
5639
5640 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5641 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
Takashi Iwai71db96d2018-02-26 15:36:38 +01005642 snd_hda_apply_pincfgs(codec, pincfgs);
5643 } else if (action == HDA_FIXUP_ACT_INIT) {
Kailang Yang61fcf8e2018-02-02 15:26:46 +08005644 /* Enable DOCK device */
5645 snd_hda_codec_write(codec, 0x17, 0,
5646 AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
5647 /* Enable DOCK device */
5648 snd_hda_codec_write(codec, 0x19, 0,
5649 AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
Kailang Yang61fcf8e2018-02-02 15:26:46 +08005650 }
5651}
5652
Takashi Iwai399c01a2020-05-26 08:24:06 +02005653static void alc_fixup_tpt470_dacs(struct hda_codec *codec,
5654 const struct hda_fixup *fix, int action)
5655{
5656 /* Assure the speaker pin to be coupled with DAC NID 0x03; otherwise
5657 * the speaker output becomes too low by some reason on Thinkpads with
5658 * ALC298 codec
5659 */
5660 static const hda_nid_t preferred_pairs[] = {
5661 0x14, 0x03, 0x17, 0x02, 0x21, 0x02,
5662 0
5663 };
5664 struct alc_spec *spec = codec->spec;
5665
5666 if (action == HDA_FIXUP_ACT_PRE_PROBE)
5667 spec->gen.preferred_dacs = preferred_pairs;
5668}
5669
Gabriele Mazzotta9476d3692015-04-19 19:00:40 +02005670static void alc_shutup_dell_xps13(struct hda_codec *codec)
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +02005671{
5672 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01005673 int hp_pin = alc_get_hp_pin(spec);
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +02005674
Gabriele Mazzotta9476d3692015-04-19 19:00:40 +02005675 /* Prevent pop noises when headphones are plugged in */
5676 snd_hda_codec_write(codec, hp_pin, 0,
5677 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5678 msleep(20);
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +02005679}
5680
5681static void alc_fixup_dell_xps13(struct hda_codec *codec,
5682 const struct hda_fixup *fix, int action)
5683{
Takashi Iwai3e1b0c42015-04-27 10:43:22 +02005684 struct alc_spec *spec = codec->spec;
5685 struct hda_input_mux *imux = &spec->gen.input_mux;
5686 int i;
Gabriele Mazzottaf38663a2014-08-08 19:34:40 +02005687
Takashi Iwai3e1b0c42015-04-27 10:43:22 +02005688 switch (action) {
5689 case HDA_FIXUP_ACT_PRE_PROBE:
5690 /* mic pin 0x19 must be initialized with Vref Hi-Z, otherwise
5691 * it causes a click noise at start up
5692 */
5693 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
Takashi Iwaiefe55732018-06-15 11:55:02 +02005694 spec->shutup = alc_shutup_dell_xps13;
Takashi Iwai3e1b0c42015-04-27 10:43:22 +02005695 break;
5696 case HDA_FIXUP_ACT_PROBE:
Gabriele Mazzottaf38663a2014-08-08 19:34:40 +02005697 /* Make the internal mic the default input source. */
5698 for (i = 0; i < imux->num_items; i++) {
5699 if (spec->gen.imux_pins[i] == 0x12) {
5700 spec->gen.cur_mux[0] = i;
5701 break;
5702 }
5703 }
Takashi Iwai3e1b0c42015-04-27 10:43:22 +02005704 break;
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +02005705 }
5706}
5707
David Henningsson1f8b46c2015-05-12 14:38:15 +02005708static void alc_fixup_headset_mode_alc662(struct hda_codec *codec,
5709 const struct hda_fixup *fix, int action)
5710{
5711 struct alc_spec *spec = codec->spec;
5712
5713 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5714 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5715 spec->gen.hp_mic = 1; /* Mic-in is same pin as headphone */
David Henningssonb40eda62015-05-28 09:40:23 +02005716
5717 /* Disable boost for mic-in permanently. (This code is only called
5718 from quirks that guarantee that the headphone is at NID 0x1b.) */
5719 snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000);
5720 snd_hda_override_wcaps(codec, 0x1b, get_wcaps(codec, 0x1b) & ~AC_WCAP_IN_AMP);
David Henningsson1f8b46c2015-05-12 14:38:15 +02005721 } else
5722 alc_fixup_headset_mode(codec, fix, action);
5723}
5724
David Henningsson73bdd592013-04-15 15:44:14 +02005725static void alc_fixup_headset_mode_alc668(struct hda_codec *codec,
5726 const struct hda_fixup *fix, int action)
5727{
5728 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
David Henningsson73bdd592013-04-15 15:44:14 +02005729 alc_write_coef_idx(codec, 0xc4, 0x8000);
Takashi Iwai98b24882014-08-18 13:47:50 +02005730 alc_update_coef_idx(codec, 0xc2, ~0xfe, 0);
David Henningsson73bdd592013-04-15 15:44:14 +02005731 snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
5732 }
5733 alc_fixup_headset_mode(codec, fix, action);
5734}
5735
Chih-Chung Changbde7bc62013-08-05 16:38:42 +08005736/* Returns the nid of the external mic input pin, or 0 if it cannot be found. */
5737static int find_ext_mic_pin(struct hda_codec *codec)
5738{
5739 struct alc_spec *spec = codec->spec;
5740 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5741 hda_nid_t nid;
5742 unsigned int defcfg;
5743 int i;
5744
5745 for (i = 0; i < cfg->num_inputs; i++) {
5746 if (cfg->inputs[i].type != AUTO_PIN_MIC)
5747 continue;
5748 nid = cfg->inputs[i].pin;
5749 defcfg = snd_hda_codec_get_pincfg(codec, nid);
5750 if (snd_hda_get_input_pin_attr(defcfg) == INPUT_PIN_ATTR_INT)
5751 continue;
5752 return nid;
5753 }
5754
5755 return 0;
5756}
5757
Dylan Reid08a978d2012-11-18 22:56:40 -08005758static void alc271_hp_gate_mic_jack(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01005759 const struct hda_fixup *fix,
Dylan Reid08a978d2012-11-18 22:56:40 -08005760 int action)
5761{
5762 struct alc_spec *spec = codec->spec;
5763
Takashi Iwai0db75792013-01-23 13:57:20 +01005764 if (action == HDA_FIXUP_ACT_PROBE) {
Chih-Chung Changbde7bc62013-08-05 16:38:42 +08005765 int mic_pin = find_ext_mic_pin(codec);
Takashi Iwai35a39f92019-02-01 11:19:50 +01005766 int hp_pin = alc_get_hp_pin(spec);
Chih-Chung Changbde7bc62013-08-05 16:38:42 +08005767
5768 if (snd_BUG_ON(!mic_pin || !hp_pin))
Takashi Iwai0db75792013-01-23 13:57:20 +01005769 return;
Chih-Chung Changbde7bc62013-08-05 16:38:42 +08005770 snd_hda_jack_set_gating_jack(codec, mic_pin, hp_pin);
Takashi Iwai0db75792013-01-23 13:57:20 +01005771 }
Dylan Reid08a978d2012-11-18 22:56:40 -08005772}
David Henningsson693b6132012-06-22 19:12:10 +02005773
David Henningsson3e0d6112013-04-22 14:30:14 +02005774static void alc269_fixup_limit_int_mic_boost(struct hda_codec *codec,
5775 const struct hda_fixup *fix,
5776 int action)
5777{
5778 struct alc_spec *spec = codec->spec;
5779 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5780 int i;
5781
5782 /* The mic boosts on level 2 and 3 are too noisy
5783 on the internal mic input.
5784 Therefore limit the boost to 0 or 1. */
5785
5786 if (action != HDA_FIXUP_ACT_PROBE)
5787 return;
5788
5789 for (i = 0; i < cfg->num_inputs; i++) {
5790 hda_nid_t nid = cfg->inputs[i].pin;
5791 unsigned int defcfg;
5792 if (cfg->inputs[i].type != AUTO_PIN_MIC)
5793 continue;
5794 defcfg = snd_hda_codec_get_pincfg(codec, nid);
5795 if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
5796 continue;
5797
5798 snd_hda_override_amp_caps(codec, nid, HDA_INPUT,
5799 (0x00 << AC_AMPCAP_OFFSET_SHIFT) |
5800 (0x01 << AC_AMPCAP_NUM_STEPS_SHIFT) |
5801 (0x2f << AC_AMPCAP_STEP_SIZE_SHIFT) |
5802 (0 << AC_AMPCAP_MUTE_SHIFT));
5803 }
5804}
5805
Kailang Yangcd217a62013-08-22 10:15:24 +02005806static void alc283_hp_automute_hook(struct hda_codec *codec,
Takashi Iwai1a4f69d2014-09-11 15:22:46 +02005807 struct hda_jack_callback *jack)
Kailang Yangcd217a62013-08-22 10:15:24 +02005808{
5809 struct alc_spec *spec = codec->spec;
5810 int vref;
5811
5812 msleep(200);
5813 snd_hda_gen_hp_automute(codec, jack);
5814
5815 vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
5816
5817 msleep(600);
5818 snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5819 vref);
5820}
5821
Kailang Yangcd217a62013-08-22 10:15:24 +02005822static void alc283_fixup_chromebook(struct hda_codec *codec,
5823 const struct hda_fixup *fix, int action)
5824{
5825 struct alc_spec *spec = codec->spec;
Kailang Yangcd217a62013-08-22 10:15:24 +02005826
5827 switch (action) {
5828 case HDA_FIXUP_ACT_PRE_PROBE:
Kailang Yang0202e992013-12-02 15:20:15 +08005829 snd_hda_override_wcaps(codec, 0x03, 0);
Takashi Iwaid2e92702013-10-30 07:50:53 +01005830 /* Disable AA-loopback as it causes white noise */
5831 spec->gen.mixer_nid = 0;
Kailang Yang38070212013-11-01 15:57:35 +08005832 break;
5833 case HDA_FIXUP_ACT_INIT:
Kailang Yangde9481c2014-04-07 16:41:52 +08005834 /* MIC2-VREF control */
5835 /* Set to manual mode */
Takashi Iwai98b24882014-08-18 13:47:50 +02005836 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
Kailang Yang0202e992013-12-02 15:20:15 +08005837 /* Enable Line1 input control by verb */
Takashi Iwai98b24882014-08-18 13:47:50 +02005838 alc_update_coef_idx(codec, 0x1a, 0, 1 << 4);
Kailang Yang0202e992013-12-02 15:20:15 +08005839 break;
5840 }
5841}
5842
5843static void alc283_fixup_sense_combo_jack(struct hda_codec *codec,
5844 const struct hda_fixup *fix, int action)
5845{
5846 struct alc_spec *spec = codec->spec;
Kailang Yang0202e992013-12-02 15:20:15 +08005847
5848 switch (action) {
5849 case HDA_FIXUP_ACT_PRE_PROBE:
Kailang Yangcd217a62013-08-22 10:15:24 +02005850 spec->gen.hp_automute_hook = alc283_hp_automute_hook;
5851 break;
5852 case HDA_FIXUP_ACT_INIT:
5853 /* MIC2-VREF control */
5854 /* Set to manual mode */
Takashi Iwai98b24882014-08-18 13:47:50 +02005855 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
Kailang Yangcd217a62013-08-22 10:15:24 +02005856 break;
5857 }
5858}
5859
Takashi Iwai7bba2152013-09-06 15:45:38 +02005860/* mute tablet speaker pin (0x14) via dock plugging in addition */
5861static void asus_tx300_automute(struct hda_codec *codec)
5862{
5863 struct alc_spec *spec = codec->spec;
5864 snd_hda_gen_update_outputs(codec);
5865 if (snd_hda_jack_detect(codec, 0x1b))
5866 spec->gen.mute_bits |= (1ULL << 0x14);
5867}
5868
5869static void alc282_fixup_asus_tx300(struct hda_codec *codec,
5870 const struct hda_fixup *fix, int action)
5871{
5872 struct alc_spec *spec = codec->spec;
Takashi Iwai7bba2152013-09-06 15:45:38 +02005873 static const struct hda_pintbl dock_pins[] = {
5874 { 0x1b, 0x21114000 }, /* dock speaker pin */
5875 {}
5876 };
Takashi Iwai7bba2152013-09-06 15:45:38 +02005877
5878 switch (action) {
5879 case HDA_FIXUP_ACT_PRE_PROBE:
Takashi Iwai1c76aa52018-06-21 16:37:54 +02005880 spec->init_amp = ALC_INIT_DEFAULT;
Takashi Iwaiae065f12018-06-19 23:00:03 +02005881 /* TX300 needs to set up GPIO2 for the speaker amp */
5882 alc_setup_gpio(codec, 0x04);
Takashi Iwai7bba2152013-09-06 15:45:38 +02005883 snd_hda_apply_pincfgs(codec, dock_pins);
5884 spec->gen.auto_mute_via_amp = 1;
5885 spec->gen.automute_hook = asus_tx300_automute;
5886 snd_hda_jack_detect_enable_callback(codec, 0x1b,
Takashi Iwai7bba2152013-09-06 15:45:38 +02005887 snd_hda_gen_hp_automute);
5888 break;
Takashi Iwai5579cd62018-06-19 22:22:41 +02005889 case HDA_FIXUP_ACT_PROBE:
5890 spec->init_amp = ALC_INIT_DEFAULT;
5891 break;
Takashi Iwai7bba2152013-09-06 15:45:38 +02005892 case HDA_FIXUP_ACT_BUILD:
5893 /* this is a bit tricky; give more sane names for the main
5894 * (tablet) speaker and the dock speaker, respectively
5895 */
Takashi Iwai56798e62017-04-11 08:10:52 +02005896 rename_ctl(codec, "Speaker Playback Switch",
5897 "Dock Speaker Playback Switch");
5898 rename_ctl(codec, "Bass Speaker Playback Switch",
5899 "Speaker Playback Switch");
Takashi Iwai7bba2152013-09-06 15:45:38 +02005900 break;
5901 }
5902}
5903
David Henningsson338cae52013-10-07 10:39:59 +02005904static void alc290_fixup_mono_speakers(struct hda_codec *codec,
5905 const struct hda_fixup *fix, int action)
5906{
David Henningsson0f4881d2013-12-20 16:08:13 +01005907 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5908 /* DAC node 0x03 is giving mono output. We therefore want to
5909 make sure 0x14 (front speaker) and 0x15 (headphones) use the
5910 stereo DAC, while leaving 0x17 (bass speaker) for node 0x03. */
Michał Mirosławcaf3c042020-01-03 10:23:48 +01005911 static const hda_nid_t conn1[] = { 0x0c };
5912 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
5913 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
David Henningsson0f4881d2013-12-20 16:08:13 +01005914 }
David Henningsson338cae52013-10-07 10:39:59 +02005915}
5916
Hui Wangdd9aa332016-08-01 10:20:32 +08005917static void alc298_fixup_speaker_volume(struct hda_codec *codec,
5918 const struct hda_fixup *fix, int action)
5919{
5920 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5921 /* The speaker is routed to the Node 0x06 by a mistake, as a result
5922 we can't adjust the speaker's volume since this node does not has
5923 Amp-out capability. we change the speaker's route to:
5924 Node 0x02 (Audio Output) -> Node 0x0c (Audio Mixer) -> Node 0x17 (
5925 Pin Complex), since Node 0x02 has Amp-out caps, we can adjust
5926 speaker's volume now. */
5927
Michał Mirosławcaf3c042020-01-03 10:23:48 +01005928 static const hda_nid_t conn1[] = { 0x0c };
5929 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn1), conn1);
Hui Wangdd9aa332016-08-01 10:20:32 +08005930 }
5931}
5932
Takashi Iwaie312a862018-03-06 12:14:17 +01005933/* disable DAC3 (0x06) selection on NID 0x17 as it has no volume amp control */
5934static void alc295_fixup_disable_dac3(struct hda_codec *codec,
5935 const struct hda_fixup *fix, int action)
5936{
5937 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Michał Mirosławcaf3c042020-01-03 10:23:48 +01005938 static const hda_nid_t conn[] = { 0x02, 0x03 };
5939 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
Takashi Iwaie312a862018-03-06 12:14:17 +01005940 }
5941}
5942
Jaroslav Kyselad2cd7952019-11-29 15:40:27 +01005943/* force NID 0x17 (Bass Speaker) to DAC1 to share it with the main speaker */
5944static void alc285_fixup_speaker2_to_dac1(struct hda_codec *codec,
5945 const struct hda_fixup *fix, int action)
5946{
5947 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Michał Mirosławcaf3c042020-01-03 10:23:48 +01005948 static const hda_nid_t conn[] = { 0x02 };
5949 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
Jaroslav Kyselad2cd7952019-11-29 15:40:27 +01005950 }
5951}
5952
Keith Packard98973f22015-07-15 12:14:39 -07005953/* Hook to update amp GPIO4 for automute */
5954static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec,
5955 struct hda_jack_callback *jack)
5956{
5957 struct alc_spec *spec = codec->spec;
5958
5959 snd_hda_gen_hp_automute(codec, jack);
5960 /* mute_led_polarity is set to 0, so we pass inverted value here */
Kai-Heng Fengdbd13172020-04-30 16:32:51 +08005961 alc_update_gpio_led(codec, 0x10, spec->mute_led_polarity,
5962 !spec->gen.hp_jack_present);
Keith Packard98973f22015-07-15 12:14:39 -07005963}
5964
5965/* Manage GPIOs for HP EliteBook Folio 9480m.
5966 *
5967 * GPIO4 is the headphone amplifier power control
5968 * GPIO3 is the audio output mute indicator LED
5969 */
5970
5971static void alc280_fixup_hp_9480m(struct hda_codec *codec,
5972 const struct hda_fixup *fix,
5973 int action)
5974{
5975 struct alc_spec *spec = codec->spec;
Keith Packard98973f22015-07-15 12:14:39 -07005976
Takashi Iwai01e4a272018-06-19 22:47:30 +02005977 alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
Keith Packard98973f22015-07-15 12:14:39 -07005978 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai01e4a272018-06-19 22:47:30 +02005979 /* amp at GPIO4; toggled via alc280_hp_gpio4_automute_hook() */
5980 spec->gpio_mask |= 0x10;
5981 spec->gpio_dir |= 0x10;
Keith Packard98973f22015-07-15 12:14:39 -07005982 spec->gen.hp_automute_hook = alc280_hp_gpio4_automute_hook;
Keith Packard98973f22015-07-15 12:14:39 -07005983 }
5984}
5985
Takashi Iwaiae065f12018-06-19 23:00:03 +02005986static void alc275_fixup_gpio4_off(struct hda_codec *codec,
5987 const struct hda_fixup *fix,
5988 int action)
5989{
5990 struct alc_spec *spec = codec->spec;
5991
5992 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5993 spec->gpio_mask |= 0x04;
5994 spec->gpio_dir |= 0x04;
5995 /* set data bit low */
5996 }
5997}
5998
Takashi Iwai6a6660d2020-09-03 10:33:00 +02005999/* Quirk for Thinkpad X1 7th and 8th Gen
6000 * The following fixed routing needed
6001 * DAC1 (NID 0x02) -> Speaker (NID 0x14); some eq applied secretly
6002 * DAC2 (NID 0x03) -> Bass (NID 0x17) & Headphone (NID 0x21); sharing a DAC
6003 * DAC3 (NID 0x06) -> Unused, due to the lack of volume amp
6004 */
6005static void alc285_fixup_thinkpad_x1_gen7(struct hda_codec *codec,
6006 const struct hda_fixup *fix, int action)
6007{
6008 static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */
6009 static const hda_nid_t preferred_pairs[] = {
6010 0x14, 0x02, 0x17, 0x03, 0x21, 0x03, 0
6011 };
6012 struct alc_spec *spec = codec->spec;
6013
6014 switch (action) {
6015 case HDA_FIXUP_ACT_PRE_PROBE:
6016 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6017 spec->gen.preferred_dacs = preferred_pairs;
6018 break;
6019 case HDA_FIXUP_ACT_BUILD:
6020 /* The generic parser creates somewhat unintuitive volume ctls
6021 * with the fixed routing above, and the shared DAC2 may be
6022 * confusing for PA.
6023 * Rename those to unique names so that PA doesn't touch them
6024 * and use only Master volume.
6025 */
6026 rename_ctl(codec, "Front Playback Volume", "DAC1 Playback Volume");
6027 rename_ctl(codec, "Bass Speaker Playback Volume", "DAC2 Playback Volume");
6028 break;
6029 }
6030}
6031
Kailang Yangca169cc2017-04-25 16:17:40 +08006032static void alc233_alc662_fixup_lenovo_dual_codecs(struct hda_codec *codec,
6033 const struct hda_fixup *fix,
6034 int action)
6035{
6036 alc_fixup_dual_codecs(codec, fix, action);
6037 switch (action) {
6038 case HDA_FIXUP_ACT_PRE_PROBE:
6039 /* override card longname to provide a unique UCM profile */
6040 strcpy(codec->card->longname, "HDAudio-Lenovo-DualCodecs");
6041 break;
6042 case HDA_FIXUP_ACT_BUILD:
6043 /* rename Capture controls depending on the codec */
6044 rename_ctl(codec, "Capture Volume",
6045 codec->addr == 0 ?
6046 "Rear-Panel Capture Volume" :
6047 "Front-Panel Capture Volume");
6048 rename_ctl(codec, "Capture Switch",
6049 codec->addr == 0 ?
6050 "Rear-Panel Capture Switch" :
6051 "Front-Panel Capture Switch");
6052 break;
6053 }
6054}
6055
Kai-Heng Feng52e4e362020-05-03 23:24:47 +08006056static void alc225_fixup_s3_pop_noise(struct hda_codec *codec,
6057 const struct hda_fixup *fix, int action)
6058{
6059 if (action != HDA_FIXUP_ACT_PRE_PROBE)
6060 return;
6061
6062 codec->power_save_node = 1;
6063}
6064
Kailang Yang92266652017-12-14 15:28:58 +08006065/* Forcibly assign NID 0x03 to HP/LO while NID 0x02 to SPK for EQ */
6066static void alc274_fixup_bind_dacs(struct hda_codec *codec,
6067 const struct hda_fixup *fix, int action)
6068{
6069 struct alc_spec *spec = codec->spec;
Michał Mirosławcaf3c042020-01-03 10:23:48 +01006070 static const hda_nid_t preferred_pairs[] = {
Kailang Yang92266652017-12-14 15:28:58 +08006071 0x21, 0x03, 0x1b, 0x03, 0x16, 0x02,
6072 0
6073 };
6074
6075 if (action != HDA_FIXUP_ACT_PRE_PROBE)
6076 return;
6077
6078 spec->gen.preferred_dacs = preferred_pairs;
Kailang Yang0700d3d2019-04-26 16:13:54 +08006079 spec->gen.auto_mute_via_amp = 1;
6080 codec->power_save_node = 0;
Kailang Yang92266652017-12-14 15:28:58 +08006081}
6082
Takashi Iwaic84bfed2020-11-27 15:11:04 +01006083/* avoid DAC 0x06 for bass speaker 0x17; it has no volume control */
6084static void alc289_fixup_asus_ga401(struct hda_codec *codec,
6085 const struct hda_fixup *fix, int action)
6086{
6087 static const hda_nid_t preferred_pairs[] = {
6088 0x14, 0x02, 0x17, 0x02, 0x21, 0x03, 0
6089 };
6090 struct alc_spec *spec = codec->spec;
6091
6092 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6093 spec->gen.preferred_dacs = preferred_pairs;
6094 spec->gen.obey_preferred_dacs = 1;
6095 }
6096}
6097
Hui Wangc4cfcf62018-11-26 14:17:16 +08006098/* The DAC of NID 0x3 will introduce click/pop noise on headphones, so invalidate it */
6099static void alc285_fixup_invalidate_dacs(struct hda_codec *codec,
6100 const struct hda_fixup *fix, int action)
6101{
6102 if (action != HDA_FIXUP_ACT_PRE_PROBE)
6103 return;
6104
6105 snd_hda_override_wcaps(codec, 0x03, 0);
6106}
6107
Kailang Yang8a8de09c2020-10-27 16:46:38 +08006108static void alc_combo_jack_hp_jd_restart(struct hda_codec *codec)
6109{
6110 switch (codec->core.vendor_id) {
6111 case 0x10ec0274:
6112 case 0x10ec0294:
6113 case 0x10ec0225:
6114 case 0x10ec0295:
6115 case 0x10ec0299:
6116 alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15); /* Reset HP JD */
6117 alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15);
6118 break;
6119 case 0x10ec0235:
6120 case 0x10ec0236:
6121 case 0x10ec0255:
6122 case 0x10ec0256:
6123 alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15); /* Reset HP JD */
6124 alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15);
6125 break;
6126 }
6127}
6128
Kailang Yang8983eb62019-04-03 15:31:49 +08006129static void alc295_fixup_chromebook(struct hda_codec *codec,
6130 const struct hda_fixup *fix, int action)
6131{
Kailang Yangd3ba58b2019-05-06 15:09:42 +08006132 struct alc_spec *spec = codec->spec;
6133
Kailang Yang8983eb62019-04-03 15:31:49 +08006134 switch (action) {
Kailang Yangd3ba58b2019-05-06 15:09:42 +08006135 case HDA_FIXUP_ACT_PRE_PROBE:
6136 spec->ultra_low_power = true;
6137 break;
Kailang Yang8983eb62019-04-03 15:31:49 +08006138 case HDA_FIXUP_ACT_INIT:
Kailang Yang8a8de09c2020-10-27 16:46:38 +08006139 alc_combo_jack_hp_jd_restart(codec);
Kailang Yang8983eb62019-04-03 15:31:49 +08006140 break;
6141 }
6142}
6143
Kailang Yangd1dd4212019-01-09 17:05:24 +08006144static void alc_fixup_disable_mic_vref(struct hda_codec *codec,
6145 const struct hda_fixup *fix, int action)
6146{
6147 if (action == HDA_FIXUP_ACT_PRE_PROBE)
6148 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
6149}
6150
Luke D Jonesc3cdf182020-09-07 20:19:59 +12006151
6152static void alc294_gx502_toggle_output(struct hda_codec *codec,
6153 struct hda_jack_callback *cb)
6154{
6155 /* The Windows driver sets the codec up in a very different way where
6156 * it appears to leave 0x10 = 0x8a20 set. For Linux we need to toggle it
6157 */
6158 if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
6159 alc_write_coef_idx(codec, 0x10, 0x8a20);
6160 else
6161 alc_write_coef_idx(codec, 0x10, 0x0a20);
6162}
6163
6164static void alc294_fixup_gx502_hp(struct hda_codec *codec,
6165 const struct hda_fixup *fix, int action)
6166{
6167 /* Pin 0x21: headphones/headset mic */
6168 if (!is_jack_detectable(codec, 0x21))
6169 return;
6170
6171 switch (action) {
6172 case HDA_FIXUP_ACT_PRE_PROBE:
6173 snd_hda_jack_detect_enable_callback(codec, 0x21,
6174 alc294_gx502_toggle_output);
6175 break;
6176 case HDA_FIXUP_ACT_INIT:
6177 /* Make sure to start in a correct state, i.e. if
6178 * headphones have been plugged in before powering up the system
6179 */
6180 alc294_gx502_toggle_output(codec, NULL);
6181 break;
6182 }
6183}
6184
Kailang Yang56496252020-07-29 15:09:27 +08006185static void alc285_fixup_hp_gpio_amp_init(struct hda_codec *codec,
6186 const struct hda_fixup *fix, int action)
6187{
6188 if (action != HDA_FIXUP_ACT_INIT)
6189 return;
6190
6191 msleep(100);
6192 alc_write_coef_idx(codec, 0x65, 0x0);
6193}
6194
Kailang Yang8a8de09c2020-10-27 16:46:38 +08006195static void alc274_fixup_hp_headset_mic(struct hda_codec *codec,
6196 const struct hda_fixup *fix, int action)
6197{
6198 switch (action) {
6199 case HDA_FIXUP_ACT_INIT:
6200 alc_combo_jack_hp_jd_restart(codec);
6201 break;
6202 }
6203}
6204
Kailang Yang92666d42020-11-19 17:04:21 +08006205static void alc_fixup_no_int_mic(struct hda_codec *codec,
6206 const struct hda_fixup *fix, int action)
6207{
6208 struct alc_spec *spec = codec->spec;
6209
6210 switch (action) {
6211 case HDA_FIXUP_ACT_PRE_PROBE:
6212 /* Mic RING SLEEVE swap for combo jack */
6213 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
6214 spec->no_internal_mic_pin = true;
6215 break;
6216 case HDA_FIXUP_ACT_INIT:
6217 alc_combo_jack_hp_jd_restart(codec);
6218 break;
6219 }
6220}
6221
Takashi Iwaib317b032014-01-08 11:44:21 +01006222/* for hda_fixup_thinkpad_acpi() */
6223#include "thinkpad_helper.c"
David Henningssonb67ae3f2013-11-05 13:11:37 +01006224
Takashi Iwaid5a6cab2018-06-13 12:43:10 +02006225static void alc_fixup_thinkpad_acpi(struct hda_codec *codec,
6226 const struct hda_fixup *fix, int action)
6227{
6228 alc_fixup_no_shutup(codec, fix, action); /* reduce click noise */
6229 hda_fixup_thinkpad_acpi(codec, fix, action);
6230}
6231
Tom Bridenbbf8ff62018-05-29 17:34:20 +01006232/* for alc295_fixup_hp_top_speakers */
6233#include "hp_x360_helper.c"
6234
Takashi Iwai1d045db2011-07-07 18:23:21 +02006235enum {
Kai-Heng Fengf73bbf62020-09-14 15:02:29 +08006236 ALC269_FIXUP_GPIO2,
Takashi Iwai1d045db2011-07-07 18:23:21 +02006237 ALC269_FIXUP_SONY_VAIO,
6238 ALC275_FIXUP_SONY_VAIO_GPIO2,
6239 ALC269_FIXUP_DELL_M101Z,
6240 ALC269_FIXUP_SKU_IGNORE,
6241 ALC269_FIXUP_ASUS_G73JW,
6242 ALC269_FIXUP_LENOVO_EAPD,
6243 ALC275_FIXUP_SONY_HWEQ,
Takashi Iwaie9bd7d52014-05-21 11:06:49 +02006244 ALC275_FIXUP_SONY_DISABLE_AAMIX,
Takashi Iwai1d045db2011-07-07 18:23:21 +02006245 ALC271_FIXUP_DMIC,
Takashi Iwai017f2a12011-07-09 14:42:25 +02006246 ALC269_FIXUP_PCM_44K,
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02006247 ALC269_FIXUP_STEREO_DMIC,
David Henningsson7c478f02013-10-11 10:18:46 +02006248 ALC269_FIXUP_HEADSET_MIC,
Takashi Iwai24519912011-08-16 15:08:49 +02006249 ALC269_FIXUP_QUANTA_MUTE,
6250 ALC269_FIXUP_LIFEBOOK,
David Henningsson2041d562014-06-13 11:15:44 +02006251 ALC269_FIXUP_LIFEBOOK_EXTMIC,
Takashi Iwaicc7016a2015-04-08 20:47:55 +02006252 ALC269_FIXUP_LIFEBOOK_HP_PIN,
Takashi Iwai4df3fd12015-06-29 08:38:02 +02006253 ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT,
Jan-Marek Glogowskifdcc9682018-02-14 11:29:15 +01006254 ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC,
Takashi Iwaia4297b52011-08-23 18:40:12 +02006255 ALC269_FIXUP_AMIC,
6256 ALC269_FIXUP_DMIC,
6257 ALC269VB_FIXUP_AMIC,
6258 ALC269VB_FIXUP_DMIC,
Takashi Iwai08fb0d02013-01-10 17:33:58 +01006259 ALC269_FIXUP_HP_MUTE_LED,
David Henningssond06ac142013-02-18 11:41:55 +01006260 ALC269_FIXUP_HP_MUTE_LED_MIC1,
Takashi Iwai08fb0d02013-01-10 17:33:58 +01006261 ALC269_FIXUP_HP_MUTE_LED_MIC2,
Tom Briden7f783bd2017-03-25 10:12:01 +00006262 ALC269_FIXUP_HP_MUTE_LED_MIC3,
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01006263 ALC269_FIXUP_HP_GPIO_LED,
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08006264 ALC269_FIXUP_HP_GPIO_MIC1_LED,
6265 ALC269_FIXUP_HP_LINE1_MIC1_LED,
David Henningsson693b6132012-06-22 19:12:10 +02006266 ALC269_FIXUP_INV_DMIC,
David Henningsson108cc102012-07-20 10:37:25 +02006267 ALC269_FIXUP_LENOVO_DOCK,
Takashi Iwaib590b382020-05-14 18:05:33 +02006268 ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST,
Takashi Iwai9b745ab2014-03-07 08:37:19 +01006269 ALC269_FIXUP_NO_SHUTUP,
David Henningsson88cfcf82013-10-11 10:18:45 +02006270 ALC286_FIXUP_SONY_MIC_NO_PRESENCE,
David Henningsson108cc102012-07-20 10:37:25 +02006271 ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
David Henningsson73bdd592013-04-15 15:44:14 +02006272 ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
6273 ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
David Henningsson338cae52013-10-07 10:39:59 +02006274 ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
Kailang Yangfcc6c872017-06-29 15:21:27 +08006275 ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
David Henningsson73bdd592013-04-15 15:44:14 +02006276 ALC269_FIXUP_HEADSET_MODE,
6277 ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
Takashi Iwai78197172015-06-27 10:21:13 +02006278 ALC269_FIXUP_ASPIRE_HEADSET_MIC,
David Henningssond240d1d2013-04-15 12:50:02 +02006279 ALC269_FIXUP_ASUS_X101_FUNC,
6280 ALC269_FIXUP_ASUS_X101_VERB,
6281 ALC269_FIXUP_ASUS_X101,
Dylan Reid08a978d2012-11-18 22:56:40 -08006282 ALC271_FIXUP_AMIC_MIC2,
6283 ALC271_FIXUP_HP_GATE_MIC_JACK,
Oleksij Rempelb1e89722013-12-04 20:50:53 +01006284 ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572,
Dylan Reid42397002013-04-05 14:58:22 -07006285 ALC269_FIXUP_ACER_AC700,
David Henningsson3e0d6112013-04-22 14:30:14 +02006286 ALC269_FIXUP_LIMIT_INT_MIC_BOOST,
Oleksij Rempel2cede302013-11-27 17:12:03 +01006287 ALC269VB_FIXUP_ASUS_ZENBOOK,
Takashi Iwai23870832013-11-29 14:13:12 +01006288 ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A,
David Henningsson8e35cd42013-11-06 11:20:01 +01006289 ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED,
Anisse Astier02b504d2013-06-03 11:53:10 +02006290 ALC269VB_FIXUP_ORDISSIMO_EVE2,
Kailang Yangcd217a62013-08-22 10:15:24 +02006291 ALC283_FIXUP_CHROME_BOOK,
Kailang Yang0202e992013-12-02 15:20:15 +08006292 ALC283_FIXUP_SENSE_COMBO_JACK,
Takashi Iwai7bba2152013-09-06 15:45:38 +02006293 ALC282_FIXUP_ASUS_TX300,
Kailang Yang1bb3e062013-09-27 13:10:25 +02006294 ALC283_FIXUP_INT_MIC,
David Henningsson338cae52013-10-07 10:39:59 +02006295 ALC290_FIXUP_MONO_SPEAKERS,
David Henningsson0f4881d2013-12-20 16:08:13 +01006296 ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
6297 ALC290_FIXUP_SUBWOOFER,
6298 ALC290_FIXUP_SUBWOOFER_HSJACK,
David Henningssonb67ae3f2013-11-05 13:11:37 +01006299 ALC269_FIXUP_THINKPAD_ACPI,
David Henningsson56f27012016-01-11 09:33:14 +01006300 ALC269_FIXUP_DMIC_THINKPAD_ACPI,
Chris Chiu5824ce82017-02-28 14:17:11 -06006301 ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
Chris Chiu615966a2017-02-28 14:17:12 -06006302 ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
Kailang Yang9a22a8f52013-11-08 15:54:49 +08006303 ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Kailang Yang31278992014-03-03 15:27:22 +08006304 ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
Kailang Yang9a22a8f52013-11-08 15:54:49 +08006305 ALC255_FIXUP_HEADSET_MODE,
Kailang Yang31278992014-03-03 15:27:22 +08006306 ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,
Kailang Yanga22aa262014-04-23 17:34:28 +08006307 ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
Takashi Iwai1c37c222014-05-06 17:34:42 +02006308 ALC292_FIXUP_TPT440_DOCK,
Takashi Iwai9a811232015-12-09 15:17:43 +01006309 ALC292_FIXUP_TPT440,
Anisse Astierabaa22742016-08-24 09:14:13 +02006310 ALC283_FIXUP_HEADSET_MIC,
Takashi Iwaib3802782018-11-26 17:47:46 +01006311 ALC255_FIXUP_MIC_MUTE_LED,
Takashi Iwai1a22e772014-08-27 08:19:05 +02006312 ALC282_FIXUP_ASPIRE_V5_PINS,
Takashi Iwaic8426b22021-04-07 11:57:30 +02006313 ALC269VB_FIXUP_ASPIRE_E1_COEF,
David Henningsson7a5255f2014-10-30 08:26:01 +01006314 ALC280_FIXUP_HP_GPIO4,
Kailang Yangeaa8e5e2014-11-21 15:49:11 +08006315 ALC286_FIXUP_HP_GPIO_LED,
David Henningsson33f4acd2015-01-07 15:50:13 +01006316 ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY,
TienFu Chenb4b33f92015-01-20 15:06:21 +01006317 ALC280_FIXUP_HP_DOCK_PINS,
Jaroslav Kysela04d54662017-03-09 13:29:13 +01006318 ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED,
Keith Packard98973f22015-07-15 12:14:39 -07006319 ALC280_FIXUP_HP_9480M,
Takashi Iwaic3bb2b52021-02-15 09:25:40 +01006320 ALC245_FIXUP_HP_X360_AMP,
Kailang Yange1e62b92015-04-08 16:01:22 +08006321 ALC288_FIXUP_DELL_HEADSET_MODE,
6322 ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang831bfdf92015-06-26 12:35:17 +08006323 ALC288_FIXUP_DELL_XPS_13,
6324 ALC288_FIXUP_DISABLE_AAMIX,
Takashi Iwai5fab5822020-01-05 09:11:19 +01006325 ALC292_FIXUP_DELL_E7X_AAMIX,
Takashi Iwai8b99aba2015-06-15 11:59:32 +02006326 ALC292_FIXUP_DELL_E7X,
6327 ALC292_FIXUP_DISABLE_AAMIX,
David Henningssonc04017e2015-12-15 14:44:03 +01006328 ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK,
James McDonnell54324222019-09-16 14:53:38 +00006329 ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
Kailang Yang977e6272015-05-18 15:31:20 +08006330 ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang2f726ae2017-03-31 10:31:40 +08006331 ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
Kailang Yang6ed11312015-10-26 15:37:39 +08006332 ALC275_FIXUP_DELL_XPS,
Hui Wang23adc192015-12-08 12:27:18 +08006333 ALC293_FIXUP_LENOVO_SPK_NOISE,
Kailang3694cb22015-12-28 11:35:24 +08006334 ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
Kai-Heng Feng3b43b712016-02-25 15:19:38 +08006335 ALC255_FIXUP_DELL_SPK_NOISE,
Kailang Yangd1dd4212019-01-09 17:05:24 +08006336 ALC225_FIXUP_DISABLE_MIC_VREF,
David Henningsson2ae95572016-02-25 09:37:05 +01006337 ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
Takashi Iwaie312a862018-03-06 12:14:17 +01006338 ALC295_FIXUP_DISABLE_DAC3,
Jaroslav Kyselad2cd7952019-11-29 15:40:27 +01006339 ALC285_FIXUP_SPEAKER2_TO_DAC1,
Takashi Iwaif8839822016-02-25 14:31:59 +01006340 ALC280_FIXUP_HP_HEADSET_MIC,
Hui Wange549d192016-04-01 11:00:15 +08006341 ALC221_FIXUP_HP_FRONT_MIC,
Sven Eckelmannc636b952016-04-11 16:55:26 +02006342 ALC292_FIXUP_TPT460,
Hui Wangdd9aa332016-08-01 10:20:32 +08006343 ALC298_FIXUP_SPK_VOLUME,
Kailang Yangf86de9b2020-10-23 14:46:47 +08006344 ALC298_FIXUP_LENOVO_SPK_VOLUME,
Kai-Heng Fengfd06c772016-08-30 15:36:34 +08006345 ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER,
Gabriele Mazzotta823ff162016-12-24 19:50:01 +01006346 ALC269_FIXUP_ATIV_BOOK_8,
Kailang Yang9eb5d0e2017-01-17 15:40:25 +08006347 ALC221_FIXUP_HP_MIC_NO_PRESENCE,
Chris Chiuc1732ed2017-02-28 14:17:13 -06006348 ALC256_FIXUP_ASUS_HEADSET_MODE,
6349 ALC256_FIXUP_ASUS_MIC,
Chris Chiueeed4cd2017-02-28 14:17:15 -06006350 ALC256_FIXUP_ASUS_AIO_GPIO2,
Chris Chiu216d7ae2017-02-28 14:17:14 -06006351 ALC233_FIXUP_ASUS_MIC_NO_PRESENCE,
6352 ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE,
Kailang Yangca169cc2017-04-25 16:17:40 +08006353 ALC233_FIXUP_LENOVO_MULTI_CODECS,
Jian-Hong Panea5c7eb2019-04-01 11:25:05 +08006354 ALC233_FIXUP_ACER_HEADSET_MIC,
Hui Wangf33f79f2017-07-07 12:08:29 +08006355 ALC294_FIXUP_LENOVO_MIC_LOCATION,
Kailang Yang5f364132017-07-25 16:28:16 +08006356 ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE,
Kai-Heng Feng52e4e362020-05-03 23:24:47 +08006357 ALC225_FIXUP_S3_POP_NOISE,
PeiSen Houb84e8432017-09-01 15:11:56 +08006358 ALC700_FIXUP_INTEL_REFERENCE,
Kailang Yang92266652017-12-14 15:28:58 +08006359 ALC274_FIXUP_DELL_BIND_DACS,
6360 ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
Takashi Iwai399c01a2020-05-26 08:24:06 +02006361 ALC298_FIXUP_TPT470_DOCK_FIX,
Kailang Yang61fcf8e2018-02-02 15:26:46 +08006362 ALC298_FIXUP_TPT470_DOCK,
Kailang Yangae104a22018-02-05 16:07:20 +08006363 ALC255_FIXUP_DUMMY_LINEOUT_VERB,
Kailang Yangf0ba9d62018-03-16 11:46:08 +08006364 ALC255_FIXUP_DELL_HEADSET_MIC,
Ayman Bagabas0fbf21c2019-05-23 05:30:11 -04006365 ALC256_FIXUP_HUAWEI_MACH_WX9_PINS,
Tomas Espeletaa2ef03f2019-08-09 16:37:54 +02006366 ALC298_FIXUP_HUAWEI_MBX_STEREO,
Tom Bridenbbf8ff62018-05-29 17:34:20 +01006367 ALC295_FIXUP_HP_X360,
Kailang Yang8a328ac2018-08-21 16:54:41 +08006368 ALC221_FIXUP_HP_HEADSET_MIC,
Hui Wangc4cfcf62018-11-26 14:17:16 +08006369 ALC285_FIXUP_LENOVO_HEADPHONE_NOISE,
Girija Kumar Kasinadhunie8ed64b2018-11-26 13:40:46 -05006370 ALC295_FIXUP_HP_AUTO_MUTE,
Chris Chiu33aaebd2018-12-05 14:48:53 +08006371 ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
Chris Chiud8ae4582018-12-07 17:17:11 +08006372 ALC294_FIXUP_ASUS_MIC,
Jian-Hong Pan4e051102018-12-07 17:17:12 +08006373 ALC294_FIXUP_ASUS_HEADSET_MIC,
6374 ALC294_FIXUP_ASUS_SPK,
Jeremy Soller89e3a562019-01-30 16:12:31 -07006375 ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
Hui Wangc8c6ee62019-02-14 11:41:33 +08006376 ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
Jian-Hong Pancbc05fd2019-03-13 17:33:24 +08006377 ALC255_FIXUP_ACER_HEADSET_MIC,
Kailang Yang10f5b1b2019-02-21 16:10:22 +08006378 ALC295_FIXUP_CHROME_BOOK,
Kailang Yang8983eb62019-04-03 15:31:49 +08006379 ALC225_FIXUP_HEADSET_JACK,
Kailang Yang136824e2019-03-14 16:22:45 +08006380 ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE,
6381 ALC225_FIXUP_WYSE_AUTO_MUTE,
6382 ALC225_FIXUP_WYSE_DISABLE_MIC_VREF,
Jian-Hong Pan667a8f72019-03-15 17:51:09 +08006383 ALC286_FIXUP_ACER_AIO_HEADSET_MIC,
Daniel Drake8c8967a2019-10-17 16:15:01 +08006384 ALC256_FIXUP_ASUS_HEADSET_MIC,
Jian-Hong Pane1037352019-03-22 11:37:18 +08006385 ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
Bernhard Rosenkraenzere2a829b2019-03-05 00:38:19 +01006386 ALC299_FIXUP_PREDATOR_SPK,
Jan-Marek Glogowskibd9c10b2019-09-15 16:57:28 +02006387 ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE,
Kailang Yange79c2262019-12-19 14:12:15 +08006388 ALC289_FIXUP_DELL_SPK2,
6389 ALC289_FIXUP_DUAL_SPK,
Chris Chiu48e01502019-12-30 11:11:18 +08006390 ALC294_FIXUP_SPK2_TO_DAC1,
6391 ALC294_FIXUP_ASUS_DUAL_SPK,
Takashi Iwai6a6660d2020-09-03 10:33:00 +02006392 ALC285_FIXUP_THINKPAD_X1_GEN7,
Kailang Yang76f7dec2020-02-10 16:30:26 +08006393 ALC285_FIXUP_THINKPAD_HEADSET_JACK,
Jian-Hong Pan8b33a132020-02-25 15:29:21 +08006394 ALC294_FIXUP_ASUS_HPE,
Takashi Iwai1b94e592020-05-12 09:32:03 +02006395 ALC294_FIXUP_ASUS_COEF_1B,
Luke D Jonesc3cdf182020-09-07 20:19:59 +12006396 ALC294_FIXUP_ASUS_GX502_HP,
6397 ALC294_FIXUP_ASUS_GX502_PINS,
6398 ALC294_FIXUP_ASUS_GX502_VERBS,
Kai-Heng Fengf5a88b02020-03-27 12:46:25 +08006399 ALC285_FIXUP_HP_GPIO_LED,
Kailang Yang431e76c2020-04-07 14:40:20 +08006400 ALC285_FIXUP_HP_MUTE_LED,
Jeremy Szue7d66cf2021-03-16 15:46:24 +08006401 ALC236_FIXUP_HP_GPIO_LED,
Kailang Yang24164f42020-04-07 14:52:42 +08006402 ALC236_FIXUP_HP_MUTE_LED,
Mike Pozulp14425f12020-05-09 20:28:37 -07006403 ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
Chris Chiu9e433422020-05-12 14:15:24 +08006404 ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
Jian-Hong Pan8eae7e92020-07-06 15:18:25 +08006405 ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS,
Jian-Hong Pan6e15d122020-07-06 15:18:27 +08006406 ALC269VC_FIXUP_ACER_HEADSET_MIC,
Jian-Hong Pan781c90c2020-07-06 15:18:29 +08006407 ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE,
Armas Spann293a92c2020-07-24 16:08:37 +02006408 ALC289_FIXUP_ASUS_GA401,
Armas Spann4b43d052020-07-24 16:06:16 +02006409 ALC289_FIXUP_ASUS_GA502,
Jian-Hong Panf50a1212020-07-13 14:04:22 +08006410 ALC256_FIXUP_ACER_MIC_NO_PRESENCE,
Kailang Yang56496252020-07-29 15:09:27 +08006411 ALC285_FIXUP_HP_GPIO_AMP_INIT,
Huacai Chenf1ec5be2020-08-02 17:26:40 +08006412 ALC269_FIXUP_CZC_B20,
6413 ALC269_FIXUP_CZC_TMI,
6414 ALC269_FIXUP_CZC_L101,
6415 ALC269_FIXUP_LEMOTE_A1802,
6416 ALC269_FIXUP_LEMOTE_A190X,
Kai-Heng Fenge2d2fde2020-08-07 16:05:12 +08006417 ALC256_FIXUP_INTEL_NUC8_RUGGED,
Werner Sembach73e71612021-03-02 19:04:14 +01006418 ALC256_FIXUP_INTEL_NUC10,
Hui Wangfc19d552020-09-09 10:00:41 +08006419 ALC255_FIXUP_XIAOMI_HEADSET_MIC,
Hui Wang13468bf2020-09-28 16:01:17 +08006420 ALC274_FIXUP_HP_MIC,
Kailang Yang8a8de09c2020-10-27 16:46:38 +08006421 ALC274_FIXUP_HP_HEADSET_MIC,
Kailang Yangef9ce662020-11-03 15:40:35 +08006422 ALC256_FIXUP_ASUS_HPE,
Kailang Yang446b8182020-11-02 15:00:12 +08006423 ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
Kailang Yanga0ccbc52020-11-06 15:20:38 +08006424 ALC287_FIXUP_HP_GPIO_LED,
Kailang Yang9e885772020-11-03 15:30:51 +08006425 ALC256_FIXUP_HP_HEADSET_MIC,
Kailang Yang92666d42020-11-19 17:04:21 +08006426 ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
Chris Chiu34cdf402020-12-16 20:52:00 +08006427 ALC282_FIXUP_ACER_DISABLE_LINEOUT,
Chris Chiu495dc762021-01-14 16:27:28 +08006428 ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST,
Chris Chiud0e18562021-02-26 09:04:40 +08006429 ALC256_FIXUP_ACER_HEADSET_MIC,
Takashi Iwai1d045db2011-07-07 18:23:21 +02006430};
6431
Takashi Iwai1727a772013-01-10 09:52:52 +01006432static const struct hda_fixup alc269_fixups[] = {
Kai-Heng Fengf73bbf62020-09-14 15:02:29 +08006433 [ALC269_FIXUP_GPIO2] = {
6434 .type = HDA_FIXUP_FUNC,
6435 .v.func = alc_fixup_gpio2,
6436 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02006437 [ALC269_FIXUP_SONY_VAIO] = {
Takashi Iwaifd108212013-01-10 10:18:14 +01006438 .type = HDA_FIXUP_PINCTLS,
6439 .v.pins = (const struct hda_pintbl[]) {
6440 {0x19, PIN_VREFGRD},
Takashi Iwai1d045db2011-07-07 18:23:21 +02006441 {}
6442 }
6443 },
6444 [ALC275_FIXUP_SONY_VAIO_GPIO2] = {
Takashi Iwaiae065f12018-06-19 23:00:03 +02006445 .type = HDA_FIXUP_FUNC,
6446 .v.func = alc275_fixup_gpio4_off,
Takashi Iwai1d045db2011-07-07 18:23:21 +02006447 .chained = true,
6448 .chain_id = ALC269_FIXUP_SONY_VAIO
6449 },
6450 [ALC269_FIXUP_DELL_M101Z] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006451 .type = HDA_FIXUP_VERBS,
Takashi Iwai1d045db2011-07-07 18:23:21 +02006452 .v.verbs = (const struct hda_verb[]) {
6453 /* Enables internal speaker */
6454 {0x20, AC_VERB_SET_COEF_INDEX, 13},
6455 {0x20, AC_VERB_SET_PROC_COEF, 0x4040},
6456 {}
6457 }
6458 },
6459 [ALC269_FIXUP_SKU_IGNORE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006460 .type = HDA_FIXUP_FUNC,
Takashi Iwai23d30f22012-05-07 17:17:32 +02006461 .v.func = alc_fixup_sku_ignore,
Takashi Iwai1d045db2011-07-07 18:23:21 +02006462 },
6463 [ALC269_FIXUP_ASUS_G73JW] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006464 .type = HDA_FIXUP_PINS,
6465 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02006466 { 0x17, 0x99130111 }, /* subwoofer */
6467 { }
6468 }
6469 },
6470 [ALC269_FIXUP_LENOVO_EAPD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006471 .type = HDA_FIXUP_VERBS,
Takashi Iwai1d045db2011-07-07 18:23:21 +02006472 .v.verbs = (const struct hda_verb[]) {
6473 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
6474 {}
6475 }
6476 },
6477 [ALC275_FIXUP_SONY_HWEQ] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006478 .type = HDA_FIXUP_FUNC,
Takashi Iwai1d045db2011-07-07 18:23:21 +02006479 .v.func = alc269_fixup_hweq,
6480 .chained = true,
6481 .chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
6482 },
Takashi Iwaie9bd7d52014-05-21 11:06:49 +02006483 [ALC275_FIXUP_SONY_DISABLE_AAMIX] = {
6484 .type = HDA_FIXUP_FUNC,
6485 .v.func = alc_fixup_disable_aamix,
6486 .chained = true,
6487 .chain_id = ALC269_FIXUP_SONY_VAIO
6488 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02006489 [ALC271_FIXUP_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006490 .type = HDA_FIXUP_FUNC,
Takashi Iwai1d045db2011-07-07 18:23:21 +02006491 .v.func = alc271_fixup_dmic,
6492 },
Takashi Iwai017f2a12011-07-09 14:42:25 +02006493 [ALC269_FIXUP_PCM_44K] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006494 .type = HDA_FIXUP_FUNC,
Takashi Iwai017f2a12011-07-09 14:42:25 +02006495 .v.func = alc269_fixup_pcm_44k,
David Henningsson012e7eb2012-08-08 08:43:37 +02006496 .chained = true,
6497 .chain_id = ALC269_FIXUP_QUANTA_MUTE
Takashi Iwai017f2a12011-07-09 14:42:25 +02006498 },
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02006499 [ALC269_FIXUP_STEREO_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006500 .type = HDA_FIXUP_FUNC,
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02006501 .v.func = alc269_fixup_stereo_dmic,
6502 },
David Henningsson7c478f02013-10-11 10:18:46 +02006503 [ALC269_FIXUP_HEADSET_MIC] = {
6504 .type = HDA_FIXUP_FUNC,
6505 .v.func = alc269_fixup_headset_mic,
6506 },
Takashi Iwai24519912011-08-16 15:08:49 +02006507 [ALC269_FIXUP_QUANTA_MUTE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006508 .type = HDA_FIXUP_FUNC,
Takashi Iwai24519912011-08-16 15:08:49 +02006509 .v.func = alc269_fixup_quanta_mute,
6510 },
6511 [ALC269_FIXUP_LIFEBOOK] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006512 .type = HDA_FIXUP_PINS,
6513 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai24519912011-08-16 15:08:49 +02006514 { 0x1a, 0x2101103f }, /* dock line-out */
6515 { 0x1b, 0x23a11040 }, /* dock mic-in */
6516 { }
6517 },
6518 .chained = true,
6519 .chain_id = ALC269_FIXUP_QUANTA_MUTE
6520 },
David Henningsson2041d562014-06-13 11:15:44 +02006521 [ALC269_FIXUP_LIFEBOOK_EXTMIC] = {
6522 .type = HDA_FIXUP_PINS,
6523 .v.pins = (const struct hda_pintbl[]) {
6524 { 0x19, 0x01a1903c }, /* headset mic, with jack detect */
6525 { }
6526 },
6527 },
Takashi Iwaicc7016a2015-04-08 20:47:55 +02006528 [ALC269_FIXUP_LIFEBOOK_HP_PIN] = {
6529 .type = HDA_FIXUP_PINS,
6530 .v.pins = (const struct hda_pintbl[]) {
6531 { 0x21, 0x0221102f }, /* HP out */
6532 { }
6533 },
6534 },
Takashi Iwai4df3fd12015-06-29 08:38:02 +02006535 [ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT] = {
6536 .type = HDA_FIXUP_FUNC,
6537 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
6538 },
Jan-Marek Glogowskifdcc9682018-02-14 11:29:15 +01006539 [ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC] = {
6540 .type = HDA_FIXUP_FUNC,
6541 .v.func = alc269_fixup_pincfg_U7x7_headset_mic,
6542 },
Takashi Iwaia4297b52011-08-23 18:40:12 +02006543 [ALC269_FIXUP_AMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006544 .type = HDA_FIXUP_PINS,
6545 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaia4297b52011-08-23 18:40:12 +02006546 { 0x14, 0x99130110 }, /* speaker */
6547 { 0x15, 0x0121401f }, /* HP out */
6548 { 0x18, 0x01a19c20 }, /* mic */
6549 { 0x19, 0x99a3092f }, /* int-mic */
6550 { }
6551 },
6552 },
6553 [ALC269_FIXUP_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006554 .type = HDA_FIXUP_PINS,
6555 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaia4297b52011-08-23 18:40:12 +02006556 { 0x12, 0x99a3092f }, /* int-mic */
6557 { 0x14, 0x99130110 }, /* speaker */
6558 { 0x15, 0x0121401f }, /* HP out */
6559 { 0x18, 0x01a19c20 }, /* mic */
6560 { }
6561 },
6562 },
6563 [ALC269VB_FIXUP_AMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006564 .type = HDA_FIXUP_PINS,
6565 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaia4297b52011-08-23 18:40:12 +02006566 { 0x14, 0x99130110 }, /* speaker */
6567 { 0x18, 0x01a19c20 }, /* mic */
6568 { 0x19, 0x99a3092f }, /* int-mic */
6569 { 0x21, 0x0121401f }, /* HP out */
6570 { }
6571 },
6572 },
David Henningsson2267ea92012-01-03 08:45:56 +01006573 [ALC269VB_FIXUP_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006574 .type = HDA_FIXUP_PINS,
6575 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaia4297b52011-08-23 18:40:12 +02006576 { 0x12, 0x99a3092f }, /* int-mic */
6577 { 0x14, 0x99130110 }, /* speaker */
6578 { 0x18, 0x01a19c20 }, /* mic */
6579 { 0x21, 0x0121401f }, /* HP out */
6580 { }
6581 },
6582 },
Takashi Iwai08fb0d02013-01-10 17:33:58 +01006583 [ALC269_FIXUP_HP_MUTE_LED] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006584 .type = HDA_FIXUP_FUNC,
Takashi Iwai08fb0d02013-01-10 17:33:58 +01006585 .v.func = alc269_fixup_hp_mute_led,
David Henningsson6d3cd5d2013-01-07 12:03:47 +01006586 },
David Henningssond06ac142013-02-18 11:41:55 +01006587 [ALC269_FIXUP_HP_MUTE_LED_MIC1] = {
6588 .type = HDA_FIXUP_FUNC,
6589 .v.func = alc269_fixup_hp_mute_led_mic1,
6590 },
Takashi Iwai08fb0d02013-01-10 17:33:58 +01006591 [ALC269_FIXUP_HP_MUTE_LED_MIC2] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006592 .type = HDA_FIXUP_FUNC,
Takashi Iwai08fb0d02013-01-10 17:33:58 +01006593 .v.func = alc269_fixup_hp_mute_led_mic2,
Takashi Iwai420b0fe2012-03-12 12:35:27 +01006594 },
Tom Briden7f783bd2017-03-25 10:12:01 +00006595 [ALC269_FIXUP_HP_MUTE_LED_MIC3] = {
6596 .type = HDA_FIXUP_FUNC,
6597 .v.func = alc269_fixup_hp_mute_led_mic3,
Girija Kumar Kasinadhunie8ed64b2018-11-26 13:40:46 -05006598 .chained = true,
6599 .chain_id = ALC295_FIXUP_HP_AUTO_MUTE
Tom Briden7f783bd2017-03-25 10:12:01 +00006600 },
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01006601 [ALC269_FIXUP_HP_GPIO_LED] = {
6602 .type = HDA_FIXUP_FUNC,
6603 .v.func = alc269_fixup_hp_gpio_led,
6604 },
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08006605 [ALC269_FIXUP_HP_GPIO_MIC1_LED] = {
6606 .type = HDA_FIXUP_FUNC,
6607 .v.func = alc269_fixup_hp_gpio_mic1_led,
6608 },
6609 [ALC269_FIXUP_HP_LINE1_MIC1_LED] = {
6610 .type = HDA_FIXUP_FUNC,
6611 .v.func = alc269_fixup_hp_line1_mic1_led,
6612 },
David Henningsson693b6132012-06-22 19:12:10 +02006613 [ALC269_FIXUP_INV_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006614 .type = HDA_FIXUP_FUNC,
David Henningsson9d36a7d2014-10-07 10:18:42 +02006615 .v.func = alc_fixup_inv_dmic,
David Henningsson693b6132012-06-22 19:12:10 +02006616 },
Takashi Iwai9b745ab2014-03-07 08:37:19 +01006617 [ALC269_FIXUP_NO_SHUTUP] = {
6618 .type = HDA_FIXUP_FUNC,
6619 .v.func = alc_fixup_no_shutup,
6620 },
David Henningsson108cc102012-07-20 10:37:25 +02006621 [ALC269_FIXUP_LENOVO_DOCK] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006622 .type = HDA_FIXUP_PINS,
6623 .v.pins = (const struct hda_pintbl[]) {
David Henningsson108cc102012-07-20 10:37:25 +02006624 { 0x19, 0x23a11040 }, /* dock mic */
6625 { 0x1b, 0x2121103f }, /* dock headphone */
6626 { }
6627 },
6628 .chained = true,
6629 .chain_id = ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT
6630 },
Takashi Iwaib590b382020-05-14 18:05:33 +02006631 [ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST] = {
6632 .type = HDA_FIXUP_FUNC,
6633 .v.func = alc269_fixup_limit_int_mic_boost,
6634 .chained = true,
6635 .chain_id = ALC269_FIXUP_LENOVO_DOCK,
6636 },
David Henningsson108cc102012-07-20 10:37:25 +02006637 [ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006638 .type = HDA_FIXUP_FUNC,
David Henningsson108cc102012-07-20 10:37:25 +02006639 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
David Henningsson52129002013-11-19 10:25:53 +01006640 .chained = true,
6641 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
David Henningsson108cc102012-07-20 10:37:25 +02006642 },
David Henningsson73bdd592013-04-15 15:44:14 +02006643 [ALC269_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6644 .type = HDA_FIXUP_PINS,
6645 .v.pins = (const struct hda_pintbl[]) {
6646 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6647 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6648 { }
6649 },
6650 .chained = true,
6651 .chain_id = ALC269_FIXUP_HEADSET_MODE
6652 },
6653 [ALC269_FIXUP_DELL2_MIC_NO_PRESENCE] = {
6654 .type = HDA_FIXUP_PINS,
6655 .v.pins = (const struct hda_pintbl[]) {
6656 { 0x16, 0x21014020 }, /* dock line out */
6657 { 0x19, 0x21a19030 }, /* dock mic */
6658 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6659 { }
6660 },
6661 .chained = true,
6662 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
6663 },
David Henningsson338cae52013-10-07 10:39:59 +02006664 [ALC269_FIXUP_DELL3_MIC_NO_PRESENCE] = {
6665 .type = HDA_FIXUP_PINS,
6666 .v.pins = (const struct hda_pintbl[]) {
6667 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6668 { }
6669 },
6670 .chained = true,
6671 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
6672 },
Kailang Yangfcc6c872017-06-29 15:21:27 +08006673 [ALC269_FIXUP_DELL4_MIC_NO_PRESENCE] = {
6674 .type = HDA_FIXUP_PINS,
6675 .v.pins = (const struct hda_pintbl[]) {
6676 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6677 { 0x1b, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6678 { }
6679 },
6680 .chained = true,
6681 .chain_id = ALC269_FIXUP_HEADSET_MODE
6682 },
David Henningsson73bdd592013-04-15 15:44:14 +02006683 [ALC269_FIXUP_HEADSET_MODE] = {
6684 .type = HDA_FIXUP_FUNC,
6685 .v.func = alc_fixup_headset_mode,
Hui Wang6676f302014-11-18 17:57:41 +08006686 .chained = true,
Takashi Iwaib3802782018-11-26 17:47:46 +01006687 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
David Henningsson73bdd592013-04-15 15:44:14 +02006688 },
6689 [ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
6690 .type = HDA_FIXUP_FUNC,
6691 .v.func = alc_fixup_headset_mode_no_hp_mic,
6692 },
Takashi Iwai78197172015-06-27 10:21:13 +02006693 [ALC269_FIXUP_ASPIRE_HEADSET_MIC] = {
6694 .type = HDA_FIXUP_PINS,
6695 .v.pins = (const struct hda_pintbl[]) {
6696 { 0x19, 0x01a1913c }, /* headset mic w/o jack detect */
6697 { }
6698 },
6699 .chained = true,
6700 .chain_id = ALC269_FIXUP_HEADSET_MODE,
6701 },
David Henningsson88cfcf82013-10-11 10:18:45 +02006702 [ALC286_FIXUP_SONY_MIC_NO_PRESENCE] = {
6703 .type = HDA_FIXUP_PINS,
6704 .v.pins = (const struct hda_pintbl[]) {
6705 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6706 { }
6707 },
David Henningssonfbc78ad2013-10-11 13:46:04 +02006708 .chained = true,
6709 .chain_id = ALC269_FIXUP_HEADSET_MIC
David Henningsson88cfcf82013-10-11 10:18:45 +02006710 },
Ayman Bagabas0fbf21c2019-05-23 05:30:11 -04006711 [ALC256_FIXUP_HUAWEI_MACH_WX9_PINS] = {
Ayman Bagabas8ac51bb2018-12-12 18:07:57 -05006712 .type = HDA_FIXUP_PINS,
6713 .v.pins = (const struct hda_pintbl[]) {
6714 {0x12, 0x90a60130},
6715 {0x13, 0x40000000},
6716 {0x14, 0x90170110},
6717 {0x18, 0x411111f0},
6718 {0x19, 0x04a11040},
6719 {0x1a, 0x411111f0},
6720 {0x1b, 0x90170112},
6721 {0x1d, 0x40759a05},
6722 {0x1e, 0x411111f0},
6723 {0x21, 0x04211020},
6724 { }
6725 },
Ayman Bagabase2744fd2018-12-12 18:07:59 -05006726 .chained = true,
6727 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
Ayman Bagabas8ac51bb2018-12-12 18:07:57 -05006728 },
Tomas Espeletaa2ef03f2019-08-09 16:37:54 +02006729 [ALC298_FIXUP_HUAWEI_MBX_STEREO] = {
6730 .type = HDA_FIXUP_FUNC,
6731 .v.func = alc298_fixup_huawei_mbx_stereo,
6732 .chained = true,
6733 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
6734 },
David Henningssond240d1d2013-04-15 12:50:02 +02006735 [ALC269_FIXUP_ASUS_X101_FUNC] = {
6736 .type = HDA_FIXUP_FUNC,
6737 .v.func = alc269_fixup_x101_headset_mic,
6738 },
6739 [ALC269_FIXUP_ASUS_X101_VERB] = {
6740 .type = HDA_FIXUP_VERBS,
6741 .v.verbs = (const struct hda_verb[]) {
6742 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6743 {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
6744 {0x20, AC_VERB_SET_PROC_COEF, 0x0310},
6745 { }
6746 },
6747 .chained = true,
6748 .chain_id = ALC269_FIXUP_ASUS_X101_FUNC
6749 },
6750 [ALC269_FIXUP_ASUS_X101] = {
6751 .type = HDA_FIXUP_PINS,
6752 .v.pins = (const struct hda_pintbl[]) {
6753 { 0x18, 0x04a1182c }, /* Headset mic */
6754 { }
6755 },
6756 .chained = true,
6757 .chain_id = ALC269_FIXUP_ASUS_X101_VERB
6758 },
Dylan Reid08a978d2012-11-18 22:56:40 -08006759 [ALC271_FIXUP_AMIC_MIC2] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006760 .type = HDA_FIXUP_PINS,
6761 .v.pins = (const struct hda_pintbl[]) {
Dylan Reid08a978d2012-11-18 22:56:40 -08006762 { 0x14, 0x99130110 }, /* speaker */
6763 { 0x19, 0x01a19c20 }, /* mic */
6764 { 0x1b, 0x99a7012f }, /* int-mic */
6765 { 0x21, 0x0121401f }, /* HP out */
6766 { }
6767 },
6768 },
6769 [ALC271_FIXUP_HP_GATE_MIC_JACK] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006770 .type = HDA_FIXUP_FUNC,
Dylan Reid08a978d2012-11-18 22:56:40 -08006771 .v.func = alc271_hp_gate_mic_jack,
6772 .chained = true,
6773 .chain_id = ALC271_FIXUP_AMIC_MIC2,
6774 },
Oleksij Rempelb1e89722013-12-04 20:50:53 +01006775 [ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572] = {
6776 .type = HDA_FIXUP_FUNC,
6777 .v.func = alc269_fixup_limit_int_mic_boost,
6778 .chained = true,
6779 .chain_id = ALC271_FIXUP_HP_GATE_MIC_JACK,
6780 },
Dylan Reid42397002013-04-05 14:58:22 -07006781 [ALC269_FIXUP_ACER_AC700] = {
6782 .type = HDA_FIXUP_PINS,
6783 .v.pins = (const struct hda_pintbl[]) {
6784 { 0x12, 0x99a3092f }, /* int-mic */
6785 { 0x14, 0x99130110 }, /* speaker */
6786 { 0x18, 0x03a11c20 }, /* mic */
6787 { 0x1e, 0x0346101e }, /* SPDIF1 */
6788 { 0x21, 0x0321101f }, /* HP out */
6789 { }
6790 },
6791 .chained = true,
6792 .chain_id = ALC271_FIXUP_DMIC,
6793 },
David Henningsson3e0d6112013-04-22 14:30:14 +02006794 [ALC269_FIXUP_LIMIT_INT_MIC_BOOST] = {
6795 .type = HDA_FIXUP_FUNC,
6796 .v.func = alc269_fixup_limit_int_mic_boost,
David Henningsson27937692013-11-18 11:51:47 +01006797 .chained = true,
6798 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
David Henningsson3e0d6112013-04-22 14:30:14 +02006799 },
Oleksij Rempel2cede302013-11-27 17:12:03 +01006800 [ALC269VB_FIXUP_ASUS_ZENBOOK] = {
6801 .type = HDA_FIXUP_FUNC,
6802 .v.func = alc269_fixup_limit_int_mic_boost,
6803 .chained = true,
6804 .chain_id = ALC269VB_FIXUP_DMIC,
6805 },
Takashi Iwai23870832013-11-29 14:13:12 +01006806 [ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A] = {
6807 .type = HDA_FIXUP_VERBS,
6808 .v.verbs = (const struct hda_verb[]) {
6809 /* class-D output amp +5dB */
6810 { 0x20, AC_VERB_SET_COEF_INDEX, 0x12 },
6811 { 0x20, AC_VERB_SET_PROC_COEF, 0x2800 },
6812 {}
6813 },
6814 .chained = true,
6815 .chain_id = ALC269VB_FIXUP_ASUS_ZENBOOK,
6816 },
David Henningsson8e35cd42013-11-06 11:20:01 +01006817 [ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED] = {
6818 .type = HDA_FIXUP_FUNC,
6819 .v.func = alc269_fixup_limit_int_mic_boost,
6820 .chained = true,
6821 .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC1,
6822 },
Anisse Astier02b504d2013-06-03 11:53:10 +02006823 [ALC269VB_FIXUP_ORDISSIMO_EVE2] = {
6824 .type = HDA_FIXUP_PINS,
6825 .v.pins = (const struct hda_pintbl[]) {
6826 { 0x12, 0x99a3092f }, /* int-mic */
6827 { 0x18, 0x03a11d20 }, /* mic */
6828 { 0x19, 0x411111f0 }, /* Unused bogus pin */
6829 { }
6830 },
6831 },
Kailang Yangcd217a62013-08-22 10:15:24 +02006832 [ALC283_FIXUP_CHROME_BOOK] = {
6833 .type = HDA_FIXUP_FUNC,
6834 .v.func = alc283_fixup_chromebook,
6835 },
Kailang Yang0202e992013-12-02 15:20:15 +08006836 [ALC283_FIXUP_SENSE_COMBO_JACK] = {
6837 .type = HDA_FIXUP_FUNC,
6838 .v.func = alc283_fixup_sense_combo_jack,
6839 .chained = true,
6840 .chain_id = ALC283_FIXUP_CHROME_BOOK,
6841 },
Takashi Iwai7bba2152013-09-06 15:45:38 +02006842 [ALC282_FIXUP_ASUS_TX300] = {
6843 .type = HDA_FIXUP_FUNC,
6844 .v.func = alc282_fixup_asus_tx300,
6845 },
Kailang Yang1bb3e062013-09-27 13:10:25 +02006846 [ALC283_FIXUP_INT_MIC] = {
6847 .type = HDA_FIXUP_VERBS,
6848 .v.verbs = (const struct hda_verb[]) {
6849 {0x20, AC_VERB_SET_COEF_INDEX, 0x1a},
6850 {0x20, AC_VERB_SET_PROC_COEF, 0x0011},
6851 { }
6852 },
6853 .chained = true,
6854 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
6855 },
David Henningsson0f4881d2013-12-20 16:08:13 +01006856 [ALC290_FIXUP_SUBWOOFER_HSJACK] = {
6857 .type = HDA_FIXUP_PINS,
6858 .v.pins = (const struct hda_pintbl[]) {
6859 { 0x17, 0x90170112 }, /* subwoofer */
6860 { }
6861 },
6862 .chained = true,
6863 .chain_id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
6864 },
6865 [ALC290_FIXUP_SUBWOOFER] = {
6866 .type = HDA_FIXUP_PINS,
6867 .v.pins = (const struct hda_pintbl[]) {
6868 { 0x17, 0x90170112 }, /* subwoofer */
6869 { }
6870 },
6871 .chained = true,
6872 .chain_id = ALC290_FIXUP_MONO_SPEAKERS,
6873 },
David Henningsson338cae52013-10-07 10:39:59 +02006874 [ALC290_FIXUP_MONO_SPEAKERS] = {
6875 .type = HDA_FIXUP_FUNC,
6876 .v.func = alc290_fixup_mono_speakers,
David Henningsson0f4881d2013-12-20 16:08:13 +01006877 },
6878 [ALC290_FIXUP_MONO_SPEAKERS_HSJACK] = {
6879 .type = HDA_FIXUP_FUNC,
6880 .v.func = alc290_fixup_mono_speakers,
David Henningsson338cae52013-10-07 10:39:59 +02006881 .chained = true,
6882 .chain_id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
6883 },
David Henningssonb67ae3f2013-11-05 13:11:37 +01006884 [ALC269_FIXUP_THINKPAD_ACPI] = {
6885 .type = HDA_FIXUP_FUNC,
Takashi Iwaid5a6cab2018-06-13 12:43:10 +02006886 .v.func = alc_fixup_thinkpad_acpi,
Takashi Iwai09da1112016-09-08 12:15:02 +02006887 .chained = true,
6888 .chain_id = ALC269_FIXUP_SKU_IGNORE,
David Henningssonb67ae3f2013-11-05 13:11:37 +01006889 },
David Henningsson56f27012016-01-11 09:33:14 +01006890 [ALC269_FIXUP_DMIC_THINKPAD_ACPI] = {
6891 .type = HDA_FIXUP_FUNC,
6892 .v.func = alc_fixup_inv_dmic,
6893 .chained = true,
6894 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
6895 },
Chris Chiu5824ce82017-02-28 14:17:11 -06006896 [ALC255_FIXUP_ACER_MIC_NO_PRESENCE] = {
Hui Wang17d30462019-06-14 16:44:12 +08006897 .type = HDA_FIXUP_PINS,
6898 .v.pins = (const struct hda_pintbl[]) {
6899 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6900 { }
Chris Chiu5824ce82017-02-28 14:17:11 -06006901 },
6902 .chained = true,
Hui Wang17d30462019-06-14 16:44:12 +08006903 .chain_id = ALC255_FIXUP_HEADSET_MODE
Chris Chiu5824ce82017-02-28 14:17:11 -06006904 },
Chris Chiu615966a2017-02-28 14:17:12 -06006905 [ALC255_FIXUP_ASUS_MIC_NO_PRESENCE] = {
6906 .type = HDA_FIXUP_PINS,
6907 .v.pins = (const struct hda_pintbl[]) {
6908 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6909 { }
6910 },
6911 .chained = true,
6912 .chain_id = ALC255_FIXUP_HEADSET_MODE
6913 },
Kailang Yang9a22a8f52013-11-08 15:54:49 +08006914 [ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6915 .type = HDA_FIXUP_PINS,
6916 .v.pins = (const struct hda_pintbl[]) {
6917 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6918 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6919 { }
6920 },
6921 .chained = true,
6922 .chain_id = ALC255_FIXUP_HEADSET_MODE
6923 },
Kailang Yang31278992014-03-03 15:27:22 +08006924 [ALC255_FIXUP_DELL2_MIC_NO_PRESENCE] = {
6925 .type = HDA_FIXUP_PINS,
6926 .v.pins = (const struct hda_pintbl[]) {
6927 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6928 { }
6929 },
6930 .chained = true,
6931 .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
6932 },
Kailang Yang9a22a8f52013-11-08 15:54:49 +08006933 [ALC255_FIXUP_HEADSET_MODE] = {
6934 .type = HDA_FIXUP_FUNC,
6935 .v.func = alc_fixup_headset_mode_alc255,
Hui Wang4a83d422014-11-18 17:57:40 +08006936 .chained = true,
Takashi Iwaib3802782018-11-26 17:47:46 +01006937 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
Kailang Yang9a22a8f52013-11-08 15:54:49 +08006938 },
Kailang Yang31278992014-03-03 15:27:22 +08006939 [ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
6940 .type = HDA_FIXUP_FUNC,
6941 .v.func = alc_fixup_headset_mode_alc255_no_hp_mic,
6942 },
Kailang Yanga22aa262014-04-23 17:34:28 +08006943 [ALC293_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6944 .type = HDA_FIXUP_PINS,
6945 .v.pins = (const struct hda_pintbl[]) {
6946 { 0x18, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6947 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6948 { }
6949 },
6950 .chained = true,
6951 .chain_id = ALC269_FIXUP_HEADSET_MODE
6952 },
Takashi Iwai1c37c222014-05-06 17:34:42 +02006953 [ALC292_FIXUP_TPT440_DOCK] = {
David Henningssonec56af62015-06-24 10:46:33 +02006954 .type = HDA_FIXUP_FUNC,
Takashi Iwai7f57d802015-09-24 17:36:51 +02006955 .v.func = alc_fixup_tpt440_dock,
Takashi Iwai1c37c222014-05-06 17:34:42 +02006956 .chained = true,
6957 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
6958 },
Takashi Iwai9a811232015-12-09 15:17:43 +01006959 [ALC292_FIXUP_TPT440] = {
6960 .type = HDA_FIXUP_FUNC,
Takashi Iwai157f0b72015-12-10 23:30:43 +01006961 .v.func = alc_fixup_disable_aamix,
Takashi Iwai9a811232015-12-09 15:17:43 +01006962 .chained = true,
6963 .chain_id = ALC292_FIXUP_TPT440_DOCK,
6964 },
Anisse Astierabaa22742016-08-24 09:14:13 +02006965 [ALC283_FIXUP_HEADSET_MIC] = {
Daniel Drake9dc12862014-07-22 10:58:29 +01006966 .type = HDA_FIXUP_PINS,
6967 .v.pins = (const struct hda_pintbl[]) {
6968 { 0x19, 0x04a110f0 },
6969 { },
6970 },
6971 },
Takashi Iwaib3802782018-11-26 17:47:46 +01006972 [ALC255_FIXUP_MIC_MUTE_LED] = {
Hui Wang00ef9942014-07-31 11:52:38 +08006973 .type = HDA_FIXUP_FUNC,
Takashi Iwai8a503552020-06-18 13:08:32 +02006974 .v.func = alc_fixup_micmute_led,
Hui Wang00ef9942014-07-31 11:52:38 +08006975 },
Takashi Iwai1a22e772014-08-27 08:19:05 +02006976 [ALC282_FIXUP_ASPIRE_V5_PINS] = {
6977 .type = HDA_FIXUP_PINS,
6978 .v.pins = (const struct hda_pintbl[]) {
6979 { 0x12, 0x90a60130 },
6980 { 0x14, 0x90170110 },
6981 { 0x17, 0x40000008 },
6982 { 0x18, 0x411111f0 },
Mateusz Sylwestrzak04206942015-07-19 17:38:56 +02006983 { 0x19, 0x01a1913c },
Takashi Iwai1a22e772014-08-27 08:19:05 +02006984 { 0x1a, 0x411111f0 },
6985 { 0x1b, 0x411111f0 },
6986 { 0x1d, 0x40f89b2d },
6987 { 0x1e, 0x411111f0 },
6988 { 0x21, 0x0321101f },
6989 { },
6990 },
6991 },
Takashi Iwaic8426b22021-04-07 11:57:30 +02006992 [ALC269VB_FIXUP_ASPIRE_E1_COEF] = {
6993 .type = HDA_FIXUP_FUNC,
6994 .v.func = alc269vb_fixup_aspire_e1_coef,
6995 },
David Henningsson7a5255f2014-10-30 08:26:01 +01006996 [ALC280_FIXUP_HP_GPIO4] = {
6997 .type = HDA_FIXUP_FUNC,
6998 .v.func = alc280_fixup_hp_gpio4,
6999 },
Kailang Yangeaa8e5e2014-11-21 15:49:11 +08007000 [ALC286_FIXUP_HP_GPIO_LED] = {
7001 .type = HDA_FIXUP_FUNC,
7002 .v.func = alc286_fixup_hp_gpio_led,
7003 },
David Henningsson33f4acd2015-01-07 15:50:13 +01007004 [ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY] = {
7005 .type = HDA_FIXUP_FUNC,
7006 .v.func = alc280_fixup_hp_gpio2_mic_hotkey,
7007 },
TienFu Chenb4b33f92015-01-20 15:06:21 +01007008 [ALC280_FIXUP_HP_DOCK_PINS] = {
7009 .type = HDA_FIXUP_PINS,
7010 .v.pins = (const struct hda_pintbl[]) {
7011 { 0x1b, 0x21011020 }, /* line-out */
7012 { 0x1a, 0x01a1903c }, /* headset mic */
7013 { 0x18, 0x2181103f }, /* line-in */
7014 { },
7015 },
7016 .chained = true,
7017 .chain_id = ALC280_FIXUP_HP_GPIO4
7018 },
Jaroslav Kysela04d54662017-03-09 13:29:13 +01007019 [ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED] = {
7020 .type = HDA_FIXUP_PINS,
7021 .v.pins = (const struct hda_pintbl[]) {
7022 { 0x1b, 0x21011020 }, /* line-out */
7023 { 0x18, 0x2181103f }, /* line-in */
7024 { },
7025 },
7026 .chained = true,
7027 .chain_id = ALC269_FIXUP_HP_GPIO_MIC1_LED
7028 },
Keith Packard98973f22015-07-15 12:14:39 -07007029 [ALC280_FIXUP_HP_9480M] = {
7030 .type = HDA_FIXUP_FUNC,
7031 .v.func = alc280_fixup_hp_9480m,
7032 },
Takashi Iwaic3bb2b52021-02-15 09:25:40 +01007033 [ALC245_FIXUP_HP_X360_AMP] = {
7034 .type = HDA_FIXUP_FUNC,
7035 .v.func = alc245_fixup_hp_x360_amp,
7036 },
Kailang Yange1e62b92015-04-08 16:01:22 +08007037 [ALC288_FIXUP_DELL_HEADSET_MODE] = {
7038 .type = HDA_FIXUP_FUNC,
7039 .v.func = alc_fixup_headset_mode_dell_alc288,
7040 .chained = true,
Takashi Iwaib3802782018-11-26 17:47:46 +01007041 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
Kailang Yange1e62b92015-04-08 16:01:22 +08007042 },
7043 [ALC288_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7044 .type = HDA_FIXUP_PINS,
7045 .v.pins = (const struct hda_pintbl[]) {
7046 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7047 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7048 { }
7049 },
7050 .chained = true,
7051 .chain_id = ALC288_FIXUP_DELL_HEADSET_MODE
7052 },
Hui Wang831bfdf92015-06-26 12:35:17 +08007053 [ALC288_FIXUP_DISABLE_AAMIX] = {
7054 .type = HDA_FIXUP_FUNC,
7055 .v.func = alc_fixup_disable_aamix,
7056 .chained = true,
Takashi Iwaid44a6862018-06-19 23:04:03 +02007057 .chain_id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE
Hui Wang831bfdf92015-06-26 12:35:17 +08007058 },
7059 [ALC288_FIXUP_DELL_XPS_13] = {
7060 .type = HDA_FIXUP_FUNC,
7061 .v.func = alc_fixup_dell_xps13,
7062 .chained = true,
7063 .chain_id = ALC288_FIXUP_DISABLE_AAMIX
7064 },
Takashi Iwai8b99aba2015-06-15 11:59:32 +02007065 [ALC292_FIXUP_DISABLE_AAMIX] = {
7066 .type = HDA_FIXUP_FUNC,
7067 .v.func = alc_fixup_disable_aamix,
Hui Wang831bfdf92015-06-26 12:35:17 +08007068 .chained = true,
7069 .chain_id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE
Takashi Iwai8b99aba2015-06-15 11:59:32 +02007070 },
David Henningssonc04017e2015-12-15 14:44:03 +01007071 [ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK] = {
7072 .type = HDA_FIXUP_FUNC,
7073 .v.func = alc_fixup_disable_aamix,
7074 .chained = true,
7075 .chain_id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE
7076 },
Takashi Iwai5fab5822020-01-05 09:11:19 +01007077 [ALC292_FIXUP_DELL_E7X_AAMIX] = {
Takashi Iwai8b99aba2015-06-15 11:59:32 +02007078 .type = HDA_FIXUP_FUNC,
7079 .v.func = alc_fixup_dell_xps13,
7080 .chained = true,
7081 .chain_id = ALC292_FIXUP_DISABLE_AAMIX
7082 },
Takashi Iwai5fab5822020-01-05 09:11:19 +01007083 [ALC292_FIXUP_DELL_E7X] = {
7084 .type = HDA_FIXUP_FUNC,
Takashi Iwai8a503552020-06-18 13:08:32 +02007085 .v.func = alc_fixup_micmute_led,
Takashi Iwai5fab5822020-01-05 09:11:19 +01007086 /* micmute fixup must be applied at last */
7087 .chained_before = true,
7088 .chain_id = ALC292_FIXUP_DELL_E7X_AAMIX,
7089 },
James McDonnell54324222019-09-16 14:53:38 +00007090 [ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE] = {
7091 .type = HDA_FIXUP_PINS,
7092 .v.pins = (const struct hda_pintbl[]) {
7093 { 0x18, 0x01a1913c }, /* headset mic w/o jack detect */
7094 { }
7095 },
7096 .chained_before = true,
7097 .chain_id = ALC269_FIXUP_HEADSET_MODE,
7098 },
Kailang Yang977e6272015-05-18 15:31:20 +08007099 [ALC298_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7100 .type = HDA_FIXUP_PINS,
7101 .v.pins = (const struct hda_pintbl[]) {
7102 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7103 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7104 { }
7105 },
7106 .chained = true,
7107 .chain_id = ALC269_FIXUP_HEADSET_MODE
7108 },
Hui Wang2f726ae2017-03-31 10:31:40 +08007109 [ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE] = {
7110 .type = HDA_FIXUP_PINS,
7111 .v.pins = (const struct hda_pintbl[]) {
7112 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7113 { }
7114 },
7115 .chained = true,
7116 .chain_id = ALC269_FIXUP_HEADSET_MODE
7117 },
Kailang Yang6ed11312015-10-26 15:37:39 +08007118 [ALC275_FIXUP_DELL_XPS] = {
7119 .type = HDA_FIXUP_VERBS,
7120 .v.verbs = (const struct hda_verb[]) {
7121 /* Enables internal speaker */
7122 {0x20, AC_VERB_SET_COEF_INDEX, 0x1f},
7123 {0x20, AC_VERB_SET_PROC_COEF, 0x00c0},
7124 {0x20, AC_VERB_SET_COEF_INDEX, 0x30},
7125 {0x20, AC_VERB_SET_PROC_COEF, 0x00b1},
7126 {}
7127 }
7128 },
Hui Wang23adc192015-12-08 12:27:18 +08007129 [ALC293_FIXUP_LENOVO_SPK_NOISE] = {
7130 .type = HDA_FIXUP_FUNC,
7131 .v.func = alc_fixup_disable_aamix,
7132 .chained = true,
7133 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
7134 },
Kailang3694cb22015-12-28 11:35:24 +08007135 [ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY] = {
7136 .type = HDA_FIXUP_FUNC,
7137 .v.func = alc233_fixup_lenovo_line2_mic_hotkey,
7138 },
Kai-Heng Feng3b43b712016-02-25 15:19:38 +08007139 [ALC255_FIXUP_DELL_SPK_NOISE] = {
7140 .type = HDA_FIXUP_FUNC,
7141 .v.func = alc_fixup_disable_aamix,
7142 .chained = true,
7143 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
7144 },
Kailang Yangd1dd4212019-01-09 17:05:24 +08007145 [ALC225_FIXUP_DISABLE_MIC_VREF] = {
7146 .type = HDA_FIXUP_FUNC,
7147 .v.func = alc_fixup_disable_mic_vref,
7148 .chained = true,
7149 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
7150 },
David Henningsson2ae95572016-02-25 09:37:05 +01007151 [ALC225_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7152 .type = HDA_FIXUP_VERBS,
7153 .v.verbs = (const struct hda_verb[]) {
7154 /* Disable pass-through path for FRONT 14h */
7155 { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
7156 { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
7157 {}
7158 },
7159 .chained = true,
Kailang Yangd1dd4212019-01-09 17:05:24 +08007160 .chain_id = ALC225_FIXUP_DISABLE_MIC_VREF
David Henningsson2ae95572016-02-25 09:37:05 +01007161 },
Takashi Iwaif8839822016-02-25 14:31:59 +01007162 [ALC280_FIXUP_HP_HEADSET_MIC] = {
7163 .type = HDA_FIXUP_FUNC,
7164 .v.func = alc_fixup_disable_aamix,
7165 .chained = true,
7166 .chain_id = ALC269_FIXUP_HEADSET_MIC,
7167 },
Hui Wange549d192016-04-01 11:00:15 +08007168 [ALC221_FIXUP_HP_FRONT_MIC] = {
7169 .type = HDA_FIXUP_PINS,
7170 .v.pins = (const struct hda_pintbl[]) {
7171 { 0x19, 0x02a19020 }, /* Front Mic */
7172 { }
7173 },
7174 },
Sven Eckelmannc636b952016-04-11 16:55:26 +02007175 [ALC292_FIXUP_TPT460] = {
7176 .type = HDA_FIXUP_FUNC,
7177 .v.func = alc_fixup_tpt440_dock,
7178 .chained = true,
7179 .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE,
7180 },
Hui Wangdd9aa332016-08-01 10:20:32 +08007181 [ALC298_FIXUP_SPK_VOLUME] = {
7182 .type = HDA_FIXUP_FUNC,
7183 .v.func = alc298_fixup_speaker_volume,
Hui Wang59ec4b52016-08-04 15:28:04 +08007184 .chained = true,
Hui Wang2f726ae2017-03-31 10:31:40 +08007185 .chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
Hui Wangdd9aa332016-08-01 10:20:32 +08007186 },
Kailang Yangf86de9b2020-10-23 14:46:47 +08007187 [ALC298_FIXUP_LENOVO_SPK_VOLUME] = {
7188 .type = HDA_FIXUP_FUNC,
7189 .v.func = alc298_fixup_speaker_volume,
7190 },
Takashi Iwaie312a862018-03-06 12:14:17 +01007191 [ALC295_FIXUP_DISABLE_DAC3] = {
7192 .type = HDA_FIXUP_FUNC,
7193 .v.func = alc295_fixup_disable_dac3,
7194 },
Jaroslav Kyselad2cd7952019-11-29 15:40:27 +01007195 [ALC285_FIXUP_SPEAKER2_TO_DAC1] = {
7196 .type = HDA_FIXUP_FUNC,
7197 .v.func = alc285_fixup_speaker2_to_dac1,
Hui Wangc37c0ab2020-02-19 13:23:06 +08007198 .chained = true,
7199 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
Jaroslav Kyselad2cd7952019-11-29 15:40:27 +01007200 },
Kai-Heng Fengfd06c772016-08-30 15:36:34 +08007201 [ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {
7202 .type = HDA_FIXUP_PINS,
7203 .v.pins = (const struct hda_pintbl[]) {
7204 { 0x1b, 0x90170151 },
7205 { }
7206 },
7207 .chained = true,
7208 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
7209 },
Gabriele Mazzotta823ff162016-12-24 19:50:01 +01007210 [ALC269_FIXUP_ATIV_BOOK_8] = {
7211 .type = HDA_FIXUP_FUNC,
7212 .v.func = alc_fixup_auto_mute_via_amp,
7213 .chained = true,
7214 .chain_id = ALC269_FIXUP_NO_SHUTUP
7215 },
Kailang Yang9eb5d0e2017-01-17 15:40:25 +08007216 [ALC221_FIXUP_HP_MIC_NO_PRESENCE] = {
7217 .type = HDA_FIXUP_PINS,
7218 .v.pins = (const struct hda_pintbl[]) {
7219 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7220 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7221 { }
7222 },
7223 .chained = true,
7224 .chain_id = ALC269_FIXUP_HEADSET_MODE
7225 },
Chris Chiuc1732ed2017-02-28 14:17:13 -06007226 [ALC256_FIXUP_ASUS_HEADSET_MODE] = {
7227 .type = HDA_FIXUP_FUNC,
7228 .v.func = alc_fixup_headset_mode,
7229 },
7230 [ALC256_FIXUP_ASUS_MIC] = {
7231 .type = HDA_FIXUP_PINS,
7232 .v.pins = (const struct hda_pintbl[]) {
7233 { 0x13, 0x90a60160 }, /* use as internal mic */
7234 { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
7235 { }
7236 },
7237 .chained = true,
7238 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7239 },
Chris Chiueeed4cd2017-02-28 14:17:15 -06007240 [ALC256_FIXUP_ASUS_AIO_GPIO2] = {
Takashi Iwaiae065f12018-06-19 23:00:03 +02007241 .type = HDA_FIXUP_FUNC,
7242 /* Set up GPIO2 for the speaker amp */
7243 .v.func = alc_fixup_gpio4,
Chris Chiueeed4cd2017-02-28 14:17:15 -06007244 },
Chris Chiu216d7ae2017-02-28 14:17:14 -06007245 [ALC233_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7246 .type = HDA_FIXUP_PINS,
7247 .v.pins = (const struct hda_pintbl[]) {
7248 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7249 { }
7250 },
7251 .chained = true,
7252 .chain_id = ALC269_FIXUP_HEADSET_MIC
7253 },
7254 [ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE] = {
7255 .type = HDA_FIXUP_VERBS,
7256 .v.verbs = (const struct hda_verb[]) {
7257 /* Enables internal speaker */
7258 {0x20, AC_VERB_SET_COEF_INDEX, 0x40},
7259 {0x20, AC_VERB_SET_PROC_COEF, 0x8800},
7260 {}
7261 },
7262 .chained = true,
7263 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
7264 },
Kailang Yangca169cc2017-04-25 16:17:40 +08007265 [ALC233_FIXUP_LENOVO_MULTI_CODECS] = {
7266 .type = HDA_FIXUP_FUNC,
7267 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
Kai-Heng Fengf73bbf62020-09-14 15:02:29 +08007268 .chained = true,
7269 .chain_id = ALC269_FIXUP_GPIO2
Kailang Yangca169cc2017-04-25 16:17:40 +08007270 },
Jian-Hong Panea5c7eb2019-04-01 11:25:05 +08007271 [ALC233_FIXUP_ACER_HEADSET_MIC] = {
7272 .type = HDA_FIXUP_VERBS,
7273 .v.verbs = (const struct hda_verb[]) {
7274 { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
7275 { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
7276 { }
7277 },
7278 .chained = true,
7279 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
7280 },
Hui Wangf33f79f2017-07-07 12:08:29 +08007281 [ALC294_FIXUP_LENOVO_MIC_LOCATION] = {
7282 .type = HDA_FIXUP_PINS,
7283 .v.pins = (const struct hda_pintbl[]) {
7284 /* Change the mic location from front to right, otherwise there are
7285 two front mics with the same name, pulseaudio can't handle them.
7286 This is just a temporary workaround, after applying this fixup,
7287 there will be one "Front Mic" and one "Mic" in this machine.
7288 */
7289 { 0x1a, 0x04a19040 },
7290 { }
7291 },
7292 },
Kailang Yang5f364132017-07-25 16:28:16 +08007293 [ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE] = {
7294 .type = HDA_FIXUP_PINS,
7295 .v.pins = (const struct hda_pintbl[]) {
7296 { 0x16, 0x0101102f }, /* Rear Headset HP */
7297 { 0x19, 0x02a1913c }, /* use as Front headset mic, without its own jack detect */
7298 { 0x1a, 0x01a19030 }, /* Rear Headset MIC */
7299 { 0x1b, 0x02011020 },
7300 { }
7301 },
7302 .chained = true,
Kai-Heng Feng52e4e362020-05-03 23:24:47 +08007303 .chain_id = ALC225_FIXUP_S3_POP_NOISE
7304 },
7305 [ALC225_FIXUP_S3_POP_NOISE] = {
7306 .type = HDA_FIXUP_FUNC,
7307 .v.func = alc225_fixup_s3_pop_noise,
7308 .chained = true,
Kailang Yang5f364132017-07-25 16:28:16 +08007309 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7310 },
PeiSen Houb84e8432017-09-01 15:11:56 +08007311 [ALC700_FIXUP_INTEL_REFERENCE] = {
7312 .type = HDA_FIXUP_VERBS,
7313 .v.verbs = (const struct hda_verb[]) {
7314 /* Enables internal speaker */
7315 {0x20, AC_VERB_SET_COEF_INDEX, 0x45},
7316 {0x20, AC_VERB_SET_PROC_COEF, 0x5289},
7317 {0x20, AC_VERB_SET_COEF_INDEX, 0x4A},
7318 {0x20, AC_VERB_SET_PROC_COEF, 0x001b},
7319 {0x58, AC_VERB_SET_COEF_INDEX, 0x00},
7320 {0x58, AC_VERB_SET_PROC_COEF, 0x3888},
7321 {0x20, AC_VERB_SET_COEF_INDEX, 0x6f},
7322 {0x20, AC_VERB_SET_PROC_COEF, 0x2c0b},
7323 {}
7324 }
7325 },
Kailang Yang92266652017-12-14 15:28:58 +08007326 [ALC274_FIXUP_DELL_BIND_DACS] = {
7327 .type = HDA_FIXUP_FUNC,
7328 .v.func = alc274_fixup_bind_dacs,
7329 .chained = true,
7330 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
7331 },
7332 [ALC274_FIXUP_DELL_AIO_LINEOUT_VERB] = {
7333 .type = HDA_FIXUP_PINS,
7334 .v.pins = (const struct hda_pintbl[]) {
7335 { 0x1b, 0x0401102f },
7336 { }
7337 },
7338 .chained = true,
7339 .chain_id = ALC274_FIXUP_DELL_BIND_DACS
7340 },
Takashi Iwai399c01a2020-05-26 08:24:06 +02007341 [ALC298_FIXUP_TPT470_DOCK_FIX] = {
Kailang Yang61fcf8e2018-02-02 15:26:46 +08007342 .type = HDA_FIXUP_FUNC,
7343 .v.func = alc_fixup_tpt470_dock,
7344 .chained = true,
7345 .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE
7346 },
Takashi Iwai399c01a2020-05-26 08:24:06 +02007347 [ALC298_FIXUP_TPT470_DOCK] = {
7348 .type = HDA_FIXUP_FUNC,
7349 .v.func = alc_fixup_tpt470_dacs,
7350 .chained = true,
7351 .chain_id = ALC298_FIXUP_TPT470_DOCK_FIX
7352 },
Kailang Yangae104a22018-02-05 16:07:20 +08007353 [ALC255_FIXUP_DUMMY_LINEOUT_VERB] = {
7354 .type = HDA_FIXUP_PINS,
7355 .v.pins = (const struct hda_pintbl[]) {
7356 { 0x14, 0x0201101f },
7357 { }
7358 },
7359 .chained = true,
7360 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
7361 },
Kailang Yangf0ba9d62018-03-16 11:46:08 +08007362 [ALC255_FIXUP_DELL_HEADSET_MIC] = {
7363 .type = HDA_FIXUP_PINS,
7364 .v.pins = (const struct hda_pintbl[]) {
7365 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7366 { }
7367 },
Hui Wang3ce0d5a2018-04-19 13:29:04 +08007368 .chained = true,
7369 .chain_id = ALC269_FIXUP_HEADSET_MIC
Kailang Yangf0ba9d62018-03-16 11:46:08 +08007370 },
Tom Bridenbbf8ff62018-05-29 17:34:20 +01007371 [ALC295_FIXUP_HP_X360] = {
7372 .type = HDA_FIXUP_FUNC,
7373 .v.func = alc295_fixup_hp_top_speakers,
7374 .chained = true,
7375 .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC3
Kailang Yang8a328ac2018-08-21 16:54:41 +08007376 },
7377 [ALC221_FIXUP_HP_HEADSET_MIC] = {
7378 .type = HDA_FIXUP_PINS,
7379 .v.pins = (const struct hda_pintbl[]) {
7380 { 0x19, 0x0181313f},
7381 { }
7382 },
7383 .chained = true,
7384 .chain_id = ALC269_FIXUP_HEADSET_MIC
7385 },
Hui Wangc4cfcf62018-11-26 14:17:16 +08007386 [ALC285_FIXUP_LENOVO_HEADPHONE_NOISE] = {
7387 .type = HDA_FIXUP_FUNC,
7388 .v.func = alc285_fixup_invalidate_dacs,
Hui Wang6ba189c2018-12-09 09:16:43 +08007389 .chained = true,
7390 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
Hui Wangc4cfcf62018-11-26 14:17:16 +08007391 },
Girija Kumar Kasinadhunie8ed64b2018-11-26 13:40:46 -05007392 [ALC295_FIXUP_HP_AUTO_MUTE] = {
7393 .type = HDA_FIXUP_FUNC,
7394 .v.func = alc_fixup_auto_mute_via_amp,
7395 },
Chris Chiu33aaebd2018-12-05 14:48:53 +08007396 [ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE] = {
7397 .type = HDA_FIXUP_PINS,
7398 .v.pins = (const struct hda_pintbl[]) {
7399 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7400 { }
7401 },
7402 .chained = true,
7403 .chain_id = ALC269_FIXUP_HEADSET_MIC
7404 },
Chris Chiud8ae4582018-12-07 17:17:11 +08007405 [ALC294_FIXUP_ASUS_MIC] = {
7406 .type = HDA_FIXUP_PINS,
7407 .v.pins = (const struct hda_pintbl[]) {
7408 { 0x13, 0x90a60160 }, /* use as internal mic */
7409 { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
7410 { }
7411 },
7412 .chained = true,
Kailang Yangef9ddb92020-07-10 15:31:11 +08007413 .chain_id = ALC269_FIXUP_HEADSET_MIC
Chris Chiud8ae4582018-12-07 17:17:11 +08007414 },
Jian-Hong Pan4e051102018-12-07 17:17:12 +08007415 [ALC294_FIXUP_ASUS_HEADSET_MIC] = {
7416 .type = HDA_FIXUP_PINS,
7417 .v.pins = (const struct hda_pintbl[]) {
Jian-Hong Pan82b01142018-12-27 16:46:31 +08007418 { 0x19, 0x01a1103c }, /* use as headset mic */
Jian-Hong Pan4e051102018-12-07 17:17:12 +08007419 { }
7420 },
7421 .chained = true,
Kailang Yangef9ddb92020-07-10 15:31:11 +08007422 .chain_id = ALC269_FIXUP_HEADSET_MIC
Jian-Hong Pan4e051102018-12-07 17:17:12 +08007423 },
7424 [ALC294_FIXUP_ASUS_SPK] = {
7425 .type = HDA_FIXUP_VERBS,
7426 .v.verbs = (const struct hda_verb[]) {
7427 /* Set EAPD high */
7428 { 0x20, AC_VERB_SET_COEF_INDEX, 0x40 },
7429 { 0x20, AC_VERB_SET_PROC_COEF, 0x8800 },
Kailang Yang473fbe132020-07-16 14:42:33 +08007430 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
7431 { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
Jian-Hong Pan4e051102018-12-07 17:17:12 +08007432 { }
7433 },
7434 .chained = true,
7435 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
7436 },
Jaroslav Kyselac8a9afa2019-03-14 09:21:08 +01007437 [ALC295_FIXUP_CHROME_BOOK] = {
Kailang Yange8547472018-11-28 15:32:45 +08007438 .type = HDA_FIXUP_FUNC,
Jaroslav Kyselac8a9afa2019-03-14 09:21:08 +01007439 .v.func = alc295_fixup_chromebook,
Kailang Yang8983eb62019-04-03 15:31:49 +08007440 .chained = true,
7441 .chain_id = ALC225_FIXUP_HEADSET_JACK
7442 },
7443 [ALC225_FIXUP_HEADSET_JACK] = {
7444 .type = HDA_FIXUP_FUNC,
7445 .v.func = alc_fixup_headset_jack,
Kailang Yange8547472018-11-28 15:32:45 +08007446 },
Jeremy Soller89e3a562019-01-30 16:12:31 -07007447 [ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
7448 .type = HDA_FIXUP_PINS,
7449 .v.pins = (const struct hda_pintbl[]) {
7450 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7451 { }
7452 },
7453 .chained = true,
7454 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7455 },
Hui Wangc8c6ee62019-02-14 11:41:33 +08007456 [ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE] = {
7457 .type = HDA_FIXUP_VERBS,
7458 .v.verbs = (const struct hda_verb[]) {
7459 /* Disable PCBEEP-IN passthrough */
7460 { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
7461 { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
7462 { }
7463 },
7464 .chained = true,
7465 .chain_id = ALC285_FIXUP_LENOVO_HEADPHONE_NOISE
7466 },
Jian-Hong Pancbc05fd2019-03-13 17:33:24 +08007467 [ALC255_FIXUP_ACER_HEADSET_MIC] = {
7468 .type = HDA_FIXUP_PINS,
7469 .v.pins = (const struct hda_pintbl[]) {
7470 { 0x19, 0x03a11130 },
7471 { 0x1a, 0x90a60140 }, /* use as internal mic */
7472 { }
7473 },
7474 .chained = true,
7475 .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
7476 },
Kailang Yang136824e2019-03-14 16:22:45 +08007477 [ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE] = {
7478 .type = HDA_FIXUP_PINS,
7479 .v.pins = (const struct hda_pintbl[]) {
7480 { 0x16, 0x01011020 }, /* Rear Line out */
7481 { 0x19, 0x01a1913c }, /* use as Front headset mic, without its own jack detect */
7482 { }
7483 },
7484 .chained = true,
7485 .chain_id = ALC225_FIXUP_WYSE_AUTO_MUTE
7486 },
7487 [ALC225_FIXUP_WYSE_AUTO_MUTE] = {
7488 .type = HDA_FIXUP_FUNC,
7489 .v.func = alc_fixup_auto_mute_via_amp,
7490 .chained = true,
7491 .chain_id = ALC225_FIXUP_WYSE_DISABLE_MIC_VREF
7492 },
7493 [ALC225_FIXUP_WYSE_DISABLE_MIC_VREF] = {
7494 .type = HDA_FIXUP_FUNC,
7495 .v.func = alc_fixup_disable_mic_vref,
7496 .chained = true,
7497 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7498 },
Jian-Hong Pan667a8f72019-03-15 17:51:09 +08007499 [ALC286_FIXUP_ACER_AIO_HEADSET_MIC] = {
7500 .type = HDA_FIXUP_VERBS,
7501 .v.verbs = (const struct hda_verb[]) {
7502 { 0x20, AC_VERB_SET_COEF_INDEX, 0x4f },
7503 { 0x20, AC_VERB_SET_PROC_COEF, 0x5029 },
7504 { }
7505 },
7506 .chained = true,
7507 .chain_id = ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE
7508 },
Daniel Drake8c8967a2019-10-17 16:15:01 +08007509 [ALC256_FIXUP_ASUS_HEADSET_MIC] = {
7510 .type = HDA_FIXUP_PINS,
7511 .v.pins = (const struct hda_pintbl[]) {
7512 { 0x19, 0x03a11020 }, /* headset mic with jack detect */
7513 { }
7514 },
7515 .chained = true,
7516 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7517 },
Jian-Hong Pane1037352019-03-22 11:37:18 +08007518 [ALC256_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7519 .type = HDA_FIXUP_PINS,
7520 .v.pins = (const struct hda_pintbl[]) {
7521 { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
7522 { }
7523 },
7524 .chained = true,
7525 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7526 },
Bernhard Rosenkraenzere2a829b2019-03-05 00:38:19 +01007527 [ALC299_FIXUP_PREDATOR_SPK] = {
7528 .type = HDA_FIXUP_PINS,
7529 .v.pins = (const struct hda_pintbl[]) {
7530 { 0x21, 0x90170150 }, /* use as headset mic, without its own jack detect */
7531 { }
7532 }
7533 },
Jan-Marek Glogowskibd9c10b2019-09-15 16:57:28 +02007534 [ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE] = {
7535 .type = HDA_FIXUP_PINS,
7536 .v.pins = (const struct hda_pintbl[]) {
7537 { 0x19, 0x04a11040 },
7538 { 0x21, 0x04211020 },
7539 { }
7540 },
7541 .chained = true,
7542 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7543 },
Kailang Yange79c2262019-12-19 14:12:15 +08007544 [ALC289_FIXUP_DELL_SPK2] = {
7545 .type = HDA_FIXUP_PINS,
7546 .v.pins = (const struct hda_pintbl[]) {
7547 { 0x17, 0x90170130 }, /* bass spk */
7548 { }
7549 },
7550 .chained = true,
7551 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE
7552 },
7553 [ALC289_FIXUP_DUAL_SPK] = {
7554 .type = HDA_FIXUP_FUNC,
7555 .v.func = alc285_fixup_speaker2_to_dac1,
7556 .chained = true,
7557 .chain_id = ALC289_FIXUP_DELL_SPK2
7558 },
Chris Chiu48e01502019-12-30 11:11:18 +08007559 [ALC294_FIXUP_SPK2_TO_DAC1] = {
7560 .type = HDA_FIXUP_FUNC,
7561 .v.func = alc285_fixup_speaker2_to_dac1,
7562 .chained = true,
7563 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
7564 },
7565 [ALC294_FIXUP_ASUS_DUAL_SPK] = {
Jian-Hong Pan436e2552019-11-25 17:34:06 +08007566 .type = HDA_FIXUP_FUNC,
7567 /* The GPIO must be pulled to initialize the AMP */
7568 .v.func = alc_fixup_gpio4,
7569 .chained = true,
Chris Chiu48e01502019-12-30 11:11:18 +08007570 .chain_id = ALC294_FIXUP_SPK2_TO_DAC1
Jian-Hong Pan436e2552019-11-25 17:34:06 +08007571 },
Takashi Iwai6a6660d2020-09-03 10:33:00 +02007572 [ALC285_FIXUP_THINKPAD_X1_GEN7] = {
7573 .type = HDA_FIXUP_FUNC,
7574 .v.func = alc285_fixup_thinkpad_x1_gen7,
7575 .chained = true,
7576 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
7577 },
Kailang Yang76f7dec2020-02-10 16:30:26 +08007578 [ALC285_FIXUP_THINKPAD_HEADSET_JACK] = {
7579 .type = HDA_FIXUP_FUNC,
7580 .v.func = alc_fixup_headset_jack,
7581 .chained = true,
Takashi Iwai6a6660d2020-09-03 10:33:00 +02007582 .chain_id = ALC285_FIXUP_THINKPAD_X1_GEN7
Kailang Yang76f7dec2020-02-10 16:30:26 +08007583 },
Jian-Hong Pan8b33a132020-02-25 15:29:21 +08007584 [ALC294_FIXUP_ASUS_HPE] = {
7585 .type = HDA_FIXUP_VERBS,
7586 .v.verbs = (const struct hda_verb[]) {
7587 /* Set EAPD high */
7588 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
7589 { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
7590 { }
7591 },
7592 .chained = true,
7593 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
7594 },
Luke D Jonesc3cdf182020-09-07 20:19:59 +12007595 [ALC294_FIXUP_ASUS_GX502_PINS] = {
7596 .type = HDA_FIXUP_PINS,
7597 .v.pins = (const struct hda_pintbl[]) {
7598 { 0x19, 0x03a11050 }, /* front HP mic */
7599 { 0x1a, 0x01a11830 }, /* rear external mic */
7600 { 0x21, 0x03211020 }, /* front HP out */
7601 { }
7602 },
7603 .chained = true,
7604 .chain_id = ALC294_FIXUP_ASUS_GX502_VERBS
7605 },
7606 [ALC294_FIXUP_ASUS_GX502_VERBS] = {
7607 .type = HDA_FIXUP_VERBS,
7608 .v.verbs = (const struct hda_verb[]) {
7609 /* set 0x15 to HP-OUT ctrl */
7610 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
7611 /* unmute the 0x15 amp */
7612 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
7613 { }
7614 },
7615 .chained = true,
7616 .chain_id = ALC294_FIXUP_ASUS_GX502_HP
7617 },
7618 [ALC294_FIXUP_ASUS_GX502_HP] = {
7619 .type = HDA_FIXUP_FUNC,
7620 .v.func = alc294_fixup_gx502_hp,
7621 },
Takashi Iwai1b94e592020-05-12 09:32:03 +02007622 [ALC294_FIXUP_ASUS_COEF_1B] = {
7623 .type = HDA_FIXUP_VERBS,
7624 .v.verbs = (const struct hda_verb[]) {
7625 /* Set bit 10 to correct noisy output after reboot from
7626 * Windows 10 (due to pop noise reduction?)
7627 */
7628 { 0x20, AC_VERB_SET_COEF_INDEX, 0x1b },
7629 { 0x20, AC_VERB_SET_PROC_COEF, 0x4e4b },
7630 { }
7631 },
7632 },
Kai-Heng Fengf5a88b02020-03-27 12:46:25 +08007633 [ALC285_FIXUP_HP_GPIO_LED] = {
7634 .type = HDA_FIXUP_FUNC,
7635 .v.func = alc285_fixup_hp_gpio_led,
7636 },
Kailang Yang431e76c2020-04-07 14:40:20 +08007637 [ALC285_FIXUP_HP_MUTE_LED] = {
7638 .type = HDA_FIXUP_FUNC,
7639 .v.func = alc285_fixup_hp_mute_led,
7640 },
Jeremy Szue7d66cf2021-03-16 15:46:24 +08007641 [ALC236_FIXUP_HP_GPIO_LED] = {
7642 .type = HDA_FIXUP_FUNC,
7643 .v.func = alc236_fixup_hp_gpio_led,
7644 },
Kailang Yang24164f42020-04-07 14:52:42 +08007645 [ALC236_FIXUP_HP_MUTE_LED] = {
7646 .type = HDA_FIXUP_FUNC,
7647 .v.func = alc236_fixup_hp_mute_led,
7648 },
Mike Pozulp14425f12020-05-09 20:28:37 -07007649 [ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
7650 .type = HDA_FIXUP_VERBS,
7651 .v.verbs = (const struct hda_verb[]) {
7652 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc5 },
7653 { }
7654 },
7655 },
Chris Chiu9e433422020-05-12 14:15:24 +08007656 [ALC295_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7657 .type = HDA_FIXUP_PINS,
7658 .v.pins = (const struct hda_pintbl[]) {
7659 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7660 { }
7661 },
7662 .chained = true,
7663 .chain_id = ALC269_FIXUP_HEADSET_MODE
7664 },
Jian-Hong Pan8eae7e92020-07-06 15:18:25 +08007665 [ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS] = {
7666 .type = HDA_FIXUP_PINS,
7667 .v.pins = (const struct hda_pintbl[]) {
7668 { 0x14, 0x90100120 }, /* use as internal speaker */
7669 { 0x18, 0x02a111f0 }, /* use as headset mic, without its own jack detect */
7670 { 0x1a, 0x01011020 }, /* use as line out */
7671 { },
7672 },
7673 .chained = true,
7674 .chain_id = ALC269_FIXUP_HEADSET_MIC
7675 },
Jian-Hong Pan6e15d122020-07-06 15:18:27 +08007676 [ALC269VC_FIXUP_ACER_HEADSET_MIC] = {
7677 .type = HDA_FIXUP_PINS,
7678 .v.pins = (const struct hda_pintbl[]) {
7679 { 0x18, 0x02a11030 }, /* use as headset mic */
7680 { }
7681 },
7682 .chained = true,
7683 .chain_id = ALC269_FIXUP_HEADSET_MIC
7684 },
Jian-Hong Pan781c90c2020-07-06 15:18:29 +08007685 [ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE] = {
7686 .type = HDA_FIXUP_PINS,
7687 .v.pins = (const struct hda_pintbl[]) {
7688 { 0x18, 0x01a11130 }, /* use as headset mic, without its own jack detect */
7689 { }
7690 },
7691 .chained = true,
7692 .chain_id = ALC269_FIXUP_HEADSET_MIC
7693 },
Armas Spann293a92c2020-07-24 16:08:37 +02007694 [ALC289_FIXUP_ASUS_GA401] = {
Takashi Iwaic84bfed2020-11-27 15:11:04 +01007695 .type = HDA_FIXUP_FUNC,
7696 .v.func = alc289_fixup_asus_ga401,
7697 .chained = true,
7698 .chain_id = ALC289_FIXUP_ASUS_GA502,
Armas Spannff536642020-07-11 13:05:57 +02007699 },
Armas Spann4b43d052020-07-24 16:06:16 +02007700 [ALC289_FIXUP_ASUS_GA502] = {
7701 .type = HDA_FIXUP_PINS,
7702 .v.pins = (const struct hda_pintbl[]) {
7703 { 0x19, 0x03a11020 }, /* headset mic with jack detect */
7704 { }
7705 },
7706 },
Jian-Hong Panf50a1212020-07-13 14:04:22 +08007707 [ALC256_FIXUP_ACER_MIC_NO_PRESENCE] = {
7708 .type = HDA_FIXUP_PINS,
7709 .v.pins = (const struct hda_pintbl[]) {
7710 { 0x19, 0x02a11120 }, /* use as headset mic, without its own jack detect */
7711 { }
7712 },
7713 .chained = true,
7714 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7715 },
Kailang Yang56496252020-07-29 15:09:27 +08007716 [ALC285_FIXUP_HP_GPIO_AMP_INIT] = {
7717 .type = HDA_FIXUP_FUNC,
7718 .v.func = alc285_fixup_hp_gpio_amp_init,
7719 .chained = true,
7720 .chain_id = ALC285_FIXUP_HP_GPIO_LED
7721 },
Huacai Chenf1ec5be2020-08-02 17:26:40 +08007722 [ALC269_FIXUP_CZC_B20] = {
7723 .type = HDA_FIXUP_PINS,
7724 .v.pins = (const struct hda_pintbl[]) {
7725 { 0x12, 0x411111f0 },
7726 { 0x14, 0x90170110 }, /* speaker */
7727 { 0x15, 0x032f1020 }, /* HP out */
7728 { 0x17, 0x411111f0 },
7729 { 0x18, 0x03ab1040 }, /* mic */
7730 { 0x19, 0xb7a7013f },
7731 { 0x1a, 0x0181305f },
7732 { 0x1b, 0x411111f0 },
7733 { 0x1d, 0x411111f0 },
7734 { 0x1e, 0x411111f0 },
7735 { }
7736 },
7737 .chain_id = ALC269_FIXUP_DMIC,
7738 },
7739 [ALC269_FIXUP_CZC_TMI] = {
7740 .type = HDA_FIXUP_PINS,
7741 .v.pins = (const struct hda_pintbl[]) {
7742 { 0x12, 0x4000c000 },
7743 { 0x14, 0x90170110 }, /* speaker */
7744 { 0x15, 0x0421401f }, /* HP out */
7745 { 0x17, 0x411111f0 },
7746 { 0x18, 0x04a19020 }, /* mic */
7747 { 0x19, 0x411111f0 },
7748 { 0x1a, 0x411111f0 },
7749 { 0x1b, 0x411111f0 },
7750 { 0x1d, 0x40448505 },
7751 { 0x1e, 0x411111f0 },
7752 { 0x20, 0x8000ffff },
7753 { }
7754 },
7755 .chain_id = ALC269_FIXUP_DMIC,
7756 },
7757 [ALC269_FIXUP_CZC_L101] = {
7758 .type = HDA_FIXUP_PINS,
7759 .v.pins = (const struct hda_pintbl[]) {
7760 { 0x12, 0x40000000 },
7761 { 0x14, 0x01014010 }, /* speaker */
7762 { 0x15, 0x411111f0 }, /* HP out */
7763 { 0x16, 0x411111f0 },
7764 { 0x18, 0x01a19020 }, /* mic */
7765 { 0x19, 0x02a19021 },
7766 { 0x1a, 0x0181302f },
7767 { 0x1b, 0x0221401f },
7768 { 0x1c, 0x411111f0 },
7769 { 0x1d, 0x4044c601 },
7770 { 0x1e, 0x411111f0 },
7771 { }
7772 },
7773 .chain_id = ALC269_FIXUP_DMIC,
7774 },
7775 [ALC269_FIXUP_LEMOTE_A1802] = {
7776 .type = HDA_FIXUP_PINS,
7777 .v.pins = (const struct hda_pintbl[]) {
7778 { 0x12, 0x40000000 },
7779 { 0x14, 0x90170110 }, /* speaker */
7780 { 0x17, 0x411111f0 },
7781 { 0x18, 0x03a19040 }, /* mic1 */
7782 { 0x19, 0x90a70130 }, /* mic2 */
7783 { 0x1a, 0x411111f0 },
7784 { 0x1b, 0x411111f0 },
7785 { 0x1d, 0x40489d2d },
7786 { 0x1e, 0x411111f0 },
7787 { 0x20, 0x0003ffff },
7788 { 0x21, 0x03214020 },
7789 { }
7790 },
7791 .chain_id = ALC269_FIXUP_DMIC,
7792 },
7793 [ALC269_FIXUP_LEMOTE_A190X] = {
7794 .type = HDA_FIXUP_PINS,
7795 .v.pins = (const struct hda_pintbl[]) {
7796 { 0x14, 0x99130110 }, /* speaker */
7797 { 0x15, 0x0121401f }, /* HP out */
7798 { 0x18, 0x01a19c20 }, /* rear mic */
7799 { 0x19, 0x99a3092f }, /* front mic */
7800 { 0x1b, 0x0201401f }, /* front lineout */
7801 { }
7802 },
7803 .chain_id = ALC269_FIXUP_DMIC,
7804 },
Kai-Heng Fenge2d2fde2020-08-07 16:05:12 +08007805 [ALC256_FIXUP_INTEL_NUC8_RUGGED] = {
7806 .type = HDA_FIXUP_PINS,
7807 .v.pins = (const struct hda_pintbl[]) {
7808 { 0x1b, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7809 { }
7810 },
7811 .chained = true,
7812 .chain_id = ALC269_FIXUP_HEADSET_MODE
7813 },
Werner Sembach73e71612021-03-02 19:04:14 +01007814 [ALC256_FIXUP_INTEL_NUC10] = {
7815 .type = HDA_FIXUP_PINS,
7816 .v.pins = (const struct hda_pintbl[]) {
7817 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7818 { }
7819 },
7820 .chained = true,
7821 .chain_id = ALC269_FIXUP_HEADSET_MODE
7822 },
Hui Wangfc19d552020-09-09 10:00:41 +08007823 [ALC255_FIXUP_XIAOMI_HEADSET_MIC] = {
7824 .type = HDA_FIXUP_VERBS,
7825 .v.verbs = (const struct hda_verb[]) {
7826 { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
7827 { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
7828 { }
7829 },
7830 .chained = true,
Takashi Iwaic84bfed2020-11-27 15:11:04 +01007831 .chain_id = ALC289_FIXUP_ASUS_GA502
Hui Wangfc19d552020-09-09 10:00:41 +08007832 },
Hui Wang13468bf2020-09-28 16:01:17 +08007833 [ALC274_FIXUP_HP_MIC] = {
7834 .type = HDA_FIXUP_VERBS,
7835 .v.verbs = (const struct hda_verb[]) {
7836 { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
7837 { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
7838 { }
7839 },
7840 },
Kailang Yang8a8de09c2020-10-27 16:46:38 +08007841 [ALC274_FIXUP_HP_HEADSET_MIC] = {
7842 .type = HDA_FIXUP_FUNC,
7843 .v.func = alc274_fixup_hp_headset_mic,
7844 .chained = true,
7845 .chain_id = ALC274_FIXUP_HP_MIC
7846 },
Kailang Yangef9ce662020-11-03 15:40:35 +08007847 [ALC256_FIXUP_ASUS_HPE] = {
7848 .type = HDA_FIXUP_VERBS,
7849 .v.verbs = (const struct hda_verb[]) {
7850 /* Set EAPD high */
7851 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
7852 { 0x20, AC_VERB_SET_PROC_COEF, 0x7778 },
7853 { }
7854 },
7855 .chained = true,
7856 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
7857 },
Kailang Yang446b8182020-11-02 15:00:12 +08007858 [ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK] = {
7859 .type = HDA_FIXUP_FUNC,
7860 .v.func = alc_fixup_headset_jack,
7861 .chained = true,
7862 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
7863 },
Kailang Yanga0ccbc52020-11-06 15:20:38 +08007864 [ALC287_FIXUP_HP_GPIO_LED] = {
7865 .type = HDA_FIXUP_FUNC,
7866 .v.func = alc287_fixup_hp_gpio_led,
7867 },
Kailang Yang9e885772020-11-03 15:30:51 +08007868 [ALC256_FIXUP_HP_HEADSET_MIC] = {
7869 .type = HDA_FIXUP_FUNC,
7870 .v.func = alc274_fixup_hp_headset_mic,
7871 },
Kailang Yang92666d42020-11-19 17:04:21 +08007872 [ALC236_FIXUP_DELL_AIO_HEADSET_MIC] = {
7873 .type = HDA_FIXUP_FUNC,
7874 .v.func = alc_fixup_no_int_mic,
7875 .chained = true,
7876 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
7877 },
Chris Chiu34cdf402020-12-16 20:52:00 +08007878 [ALC282_FIXUP_ACER_DISABLE_LINEOUT] = {
7879 .type = HDA_FIXUP_PINS,
7880 .v.pins = (const struct hda_pintbl[]) {
7881 { 0x1b, 0x411111f0 },
7882 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7883 { },
7884 },
7885 .chained = true,
7886 .chain_id = ALC269_FIXUP_HEADSET_MODE
7887 },
Chris Chiu495dc762021-01-14 16:27:28 +08007888 [ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST] = {
7889 .type = HDA_FIXUP_FUNC,
7890 .v.func = alc269_fixup_limit_int_mic_boost,
7891 .chained = true,
7892 .chain_id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
7893 },
Chris Chiud0e18562021-02-26 09:04:40 +08007894 [ALC256_FIXUP_ACER_HEADSET_MIC] = {
7895 .type = HDA_FIXUP_PINS,
7896 .v.pins = (const struct hda_pintbl[]) {
7897 { 0x19, 0x02a1113c }, /* use as headset mic, without its own jack detect */
7898 { 0x1a, 0x90a1092f }, /* use as internal mic */
7899 { }
7900 },
7901 .chained = true,
7902 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7903 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02007904};
7905
7906static const struct snd_pci_quirk alc269_fixup_tbl[] = {
Marius Knausta6b92b62014-03-03 01:48:58 +01007907 SND_PCI_QUIRK(0x1025, 0x0283, "Acer TravelMate 8371", ALC269_FIXUP_INV_DMIC),
David Henningsson693b6132012-06-22 19:12:10 +02007908 SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC),
7909 SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC),
David Henningssonaaedfb42013-08-16 14:09:02 +02007910 SND_PCI_QUIRK(0x1025, 0x047c, "Acer AC700", ALC269_FIXUP_ACER_AC700),
Takashi Iwai78197172015-06-27 10:21:13 +02007911 SND_PCI_QUIRK(0x1025, 0x072d, "Acer Aspire V5-571G", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
7912 SND_PCI_QUIRK(0x1025, 0x080d, "Acer Aspire V5-122P", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
David Henningssonaaedfb42013-08-16 14:09:02 +02007913 SND_PCI_QUIRK(0x1025, 0x0740, "Acer AO725", ALC271_FIXUP_HP_GATE_MIC_JACK),
7914 SND_PCI_QUIRK(0x1025, 0x0742, "Acer AO756", ALC271_FIXUP_HP_GATE_MIC_JACK),
Simon South02322ac2016-03-02 23:10:44 -05007915 SND_PCI_QUIRK(0x1025, 0x0762, "Acer Aspire E1-472", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
Oleksij Rempelb1e89722013-12-04 20:50:53 +01007916 SND_PCI_QUIRK(0x1025, 0x0775, "Acer Aspire E1-572", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
Takashi Iwai1a22e772014-08-27 08:19:05 +02007917 SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS),
Takashi Iwaic8426b22021-04-07 11:57:30 +02007918 SND_PCI_QUIRK(0x1025, 0x0840, "Acer Aspire E1", ALC269VB_FIXUP_ASPIRE_E1_COEF),
Chris Chiu13be30f2020-12-22 23:04:59 +08007919 SND_PCI_QUIRK(0x1025, 0x101c, "Acer Veriton N2510G", ALC269_FIXUP_LIFEBOOK),
Chris Chiu705b65f2018-12-05 14:48:54 +08007920 SND_PCI_QUIRK(0x1025, 0x102b, "Acer Aspire C24-860", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE),
Jian-Hong Pan6e15d122020-07-06 15:18:27 +08007921 SND_PCI_QUIRK(0x1025, 0x1065, "Acer Aspire C20-820", ALC269VC_FIXUP_ACER_HEADSET_MIC),
Takashi Iwaib9c2fa52015-11-19 16:39:50 +01007922 SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK),
Chris Chiu495dc762021-01-14 16:27:28 +08007923 SND_PCI_QUIRK(0x1025, 0x1094, "Acer Aspire E5-575T", ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST),
Chris Chiuc7531e32019-03-21 17:17:31 +08007924 SND_PCI_QUIRK(0x1025, 0x1099, "Acer Aspire E5-523G", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
7925 SND_PCI_QUIRK(0x1025, 0x110e, "Acer Aspire ES1-432", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
Chris Chiu13be30f2020-12-22 23:04:59 +08007926 SND_PCI_QUIRK(0x1025, 0x1166, "Acer Veriton N4640G", ALC269_FIXUP_LIFEBOOK),
7927 SND_PCI_QUIRK(0x1025, 0x1167, "Acer Veriton N6640G", ALC269_FIXUP_LIFEBOOK),
Bernhard Rosenkraenzere2a829b2019-03-05 00:38:19 +01007928 SND_PCI_QUIRK(0x1025, 0x1246, "Acer Predator Helios 500", ALC299_FIXUP_PREDATOR_SPK),
Jian-Hong Pan8eae7e92020-07-06 15:18:25 +08007929 SND_PCI_QUIRK(0x1025, 0x1247, "Acer vCopperbox", ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS),
Jian-Hong Pan781c90c2020-07-06 15:18:29 +08007930 SND_PCI_QUIRK(0x1025, 0x1248, "Acer Veriton N4660G", ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE),
Chris Chiud0e18562021-02-26 09:04:40 +08007931 SND_PCI_QUIRK(0x1025, 0x1269, "Acer SWIFT SF314-54", ALC256_FIXUP_ACER_HEADSET_MIC),
Jian-Hong Pan667a8f72019-03-15 17:51:09 +08007932 SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
7933 SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
7934 SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
Chris Chiud0e18562021-02-26 09:04:40 +08007935 SND_PCI_QUIRK(0x1025, 0x129c, "Acer SWIFT SF314-55", ALC256_FIXUP_ACER_HEADSET_MIC),
Jian-Hong Pan2733cce2019-03-21 16:39:04 +08007936 SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
Jian-Hong Panea5c7eb2019-04-01 11:25:05 +08007937 SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", ALC233_FIXUP_ACER_HEADSET_MIC),
Jian-Hong Pancbc05fd2019-03-13 17:33:24 +08007938 SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC),
Jian-Hong Panf50a1212020-07-13 14:04:22 +08007939 SND_PCI_QUIRK(0x1025, 0x1430, "Acer TravelMate B311R-31", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
David Henningssonaaedfb42013-08-16 14:09:02 +02007940 SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
Kailang Yang6ed11312015-10-26 15:37:39 +08007941 SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS),
Takashi Iwai86f799b2015-11-14 17:46:31 +01007942 SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X),
Takashi Iwaicf521032016-01-15 12:59:25 +01007943 SND_PCI_QUIRK(0x1028, 0x05be, "Dell Latitude E6540", ALC292_FIXUP_DELL_E7X),
Takashi Iwai8b99aba2015-06-15 11:59:32 +02007944 SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X),
7945 SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X),
David Henningsson0f4881d2013-12-20 16:08:13 +01007946 SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER),
David Henningsson73bdd592013-04-15 15:44:14 +02007947 SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
7948 SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
7949 SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
David Henningsson0f4881d2013-12-20 16:08:13 +01007950 SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
7951 SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
Takashi Iwai98070572016-01-12 21:06:39 +01007952 SND_PCI_QUIRK(0x1028, 0x062c, "Dell Latitude E5550", ALC292_FIXUP_DELL_E7X),
Takashi Iwai42755542015-06-29 10:56:53 +02007953 SND_PCI_QUIRK(0x1028, 0x062e, "Dell Latitude E7450", ALC292_FIXUP_DELL_E7X),
David Henningsson0f4881d2013-12-20 16:08:13 +01007954 SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),
Kailang Yanga22aa262014-04-23 17:34:28 +08007955 SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
7956 SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
Hui Wang831bfdf92015-06-26 12:35:17 +08007957 SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13),
Bastien Noceraafecb142016-04-18 11:10:42 +02007958 SND_PCI_QUIRK(0x1028, 0x0669, "Dell Optiplex 9020m", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
Takashi Iwai3a05d122015-07-29 09:04:52 +02007959 SND_PCI_QUIRK(0x1028, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK),
Kailang Yang8b724152014-12-17 17:08:59 +08007960 SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
Kailang Yangb7343042014-12-02 14:50:45 +08007961 SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
7962 SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
David Henningssonc04017e2015-12-15 14:44:03 +01007963 SND_PCI_QUIRK(0x1028, 0x06db, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
7964 SND_PCI_QUIRK(0x1028, 0x06dd, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
7965 SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
7966 SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
7967 SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
Kai-Heng Fengfd06c772016-08-30 15:36:34 +08007968 SND_PCI_QUIRK(0x1028, 0x0706, "Dell Inspiron 7559", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
Kai-Heng Feng3b43b712016-02-25 15:19:38 +08007969 SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE),
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01007970 SND_PCI_QUIRK(0x1028, 0x0738, "Dell Precision 5820", ALC269_FIXUP_NO_SHUTUP),
Kai-Heng Feng709ae622018-10-04 11:39:42 +08007971 SND_PCI_QUIRK(0x1028, 0x075c, "Dell XPS 27 7760", ALC298_FIXUP_SPK_VOLUME),
Hui Wangdd9aa332016-08-01 10:20:32 +08007972 SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME),
Takashi Iwaie312a862018-03-06 12:14:17 +01007973 SND_PCI_QUIRK(0x1028, 0x07b0, "Dell Precision 7520", ALC295_FIXUP_DISABLE_DAC3),
Takashi Iwai493de342017-02-28 17:27:57 +01007974 SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
Kailang Yang5f364132017-07-25 16:28:16 +08007975 SND_PCI_QUIRK(0x1028, 0x080c, "Dell WYSE", ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE),
Kailang Yang40e2c4e2018-02-02 15:13:09 +08007976 SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
7977 SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
Kailang Yangf0ba9d62018-03-16 11:46:08 +08007978 SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
7979 SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
Kailang Yangae104a22018-02-05 16:07:20 +08007980 SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB),
Kailang Yang136824e2019-03-14 16:22:45 +08007981 SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE),
Kailang Yangda484d02019-03-14 15:50:59 +08007982 SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE),
Kailang Yangc2a7c55a2019-01-03 15:53:39 +08007983 SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
Kailang Yange79c2262019-12-19 14:12:15 +08007984 SND_PCI_QUIRK(0x1028, 0x097e, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
7985 SND_PCI_QUIRK(0x1028, 0x097d, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
Kailang Yang78def222020-02-20 15:21:54 +08007986 SND_PCI_QUIRK(0x1028, 0x098d, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
7987 SND_PCI_QUIRK(0x1028, 0x09bf, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
Kailang Yang92666d42020-11-19 17:04:21 +08007988 SND_PCI_QUIRK(0x1028, 0x0a2e, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
7989 SND_PCI_QUIRK(0x1028, 0x0a30, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
Kailang Yangc1e89522020-12-23 15:34:57 +08007990 SND_PCI_QUIRK(0x1028, 0x0a58, "Dell", ALC255_FIXUP_DELL_HEADSET_MIC),
Kailang Yanga22aa262014-04-23 17:34:28 +08007991 SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
7992 SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
Takashi Iwai08fb0d02013-01-10 17:33:58 +01007993 SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01007994 SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),
David Henningsson8e35cd42013-11-06 11:20:01 +01007995 SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED),
David Henningsson33f4acd2015-01-07 15:50:13 +01007996 SND_PCI_QUIRK(0x103c, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY),
Kailang Yangc60666b2014-02-21 16:23:35 +08007997 /* ALC282 */
Hui Wang7976eb42015-02-13 11:14:41 +08007998 SND_PCI_QUIRK(0x103c, 0x21f9, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yang8a02b162014-06-13 17:16:31 +08007999 SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yang8a02b162014-06-13 17:16:31 +08008000 SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08008001 SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
8002 SND_PCI_QUIRK(0x103c, 0x2237, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
8003 SND_PCI_QUIRK(0x103c, 0x2238, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
8004 SND_PCI_QUIRK(0x103c, 0x2239, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08008005 SND_PCI_QUIRK(0x103c, 0x224b, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
Kailang Yangc60666b2014-02-21 16:23:35 +08008006 SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08008007 SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8008 SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yang8a02b162014-06-13 17:16:31 +08008009 SND_PCI_QUIRK(0x103c, 0x226e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangeaa8e5e2014-11-21 15:49:11 +08008010 SND_PCI_QUIRK(0x103c, 0x2271, "HP", ALC286_FIXUP_HP_GPIO_LED),
TienFu Chenb4b33f92015-01-20 15:06:21 +01008011 SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC280_FIXUP_HP_DOCK_PINS),
TienFu Chen3271cb22015-02-10 09:09:41 +01008012 SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC280_FIXUP_HP_DOCK_PINS),
Kailang Yangc60666b2014-02-21 16:23:35 +08008013 SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08008014 SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8015 SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8016 SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08008017 SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Keith Packard98973f22015-07-15 12:14:39 -07008018 SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC280_FIXUP_HP_9480M),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08008019 SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8020 SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yangc60666b2014-02-21 16:23:35 +08008021 /* ALC290 */
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08008022 SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08008023 SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08008024 SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08008025 SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8026 SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8027 SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8028 SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8029 SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08008030 SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Jaroslav Kysela04d54662017-03-09 13:29:13 +01008031 SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED),
Kailang Yangc60666b2014-02-21 16:23:35 +08008032 SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08008033 SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8034 SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8035 SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08008036 SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
8037 SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08008038 SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yangc60666b2014-02-21 16:23:35 +08008039 SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08008040 SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08008041 SND_PCI_QUIRK(0x103c, 0x228b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08008042 SND_PCI_QUIRK(0x103c, 0x228e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8043 SND_PCI_QUIRK(0x103c, 0x22c5, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08008044 SND_PCI_QUIRK(0x103c, 0x22c7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8045 SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08008046 SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yang8a02b162014-06-13 17:16:31 +08008047 SND_PCI_QUIRK(0x103c, 0x2334, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8048 SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8049 SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
8050 SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Takashi Iwaif8839822016-02-25 14:31:59 +01008051 SND_PCI_QUIRK(0x103c, 0x221c, "HP EliteBook 755 G2", ALC280_FIXUP_HP_HEADSET_MIC),
Jaroslav Kysela167897f2019-03-13 13:40:15 +01008052 SND_PCI_QUIRK(0x103c, 0x802e, "HP Z240 SFF", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
8053 SND_PCI_QUIRK(0x103c, 0x802f, "HP Z240", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
Takashi Iwai563785e2018-11-12 09:43:12 +01008054 SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
Hui Wange549d192016-04-01 11:00:15 +08008055 SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC),
Tom Bridenbbf8ff62018-05-29 17:34:20 +01008056 SND_PCI_QUIRK(0x103c, 0x827e, "HP x360", ALC295_FIXUP_HP_X360),
Takashi Iwaiaeedad22020-11-28 10:00:15 +01008057 SND_PCI_QUIRK(0x103c, 0x827f, "HP x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
Jaroslav Kysela167897f2019-03-13 13:40:15 +01008058 SND_PCI_QUIRK(0x103c, 0x82bf, "HP G3 mini", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
8059 SND_PCI_QUIRK(0x103c, 0x82c0, "HP G3 mini premium", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
Alexandru Gagniuc56e40eb2018-08-04 11:44:44 -05008060 SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
Takashi Iwai190d0382019-08-13 17:39:56 +02008061 SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
Sam Bazleyd33cd422019-09-01 03:31:30 +01008062 SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
Kai-Heng Fengb2c22912020-06-17 18:29:02 +08008063 SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED),
Kai-Heng Fenga5980982020-12-30 20:56:35 +08008064 SND_PCI_QUIRK(0x103c, 0x8724, "HP EliteBook 850 G7", ALC285_FIXUP_HP_GPIO_LED),
Kai-Heng Fengb2c22912020-06-17 18:29:02 +08008065 SND_PCI_QUIRK(0x103c, 0x8729, "HP", ALC285_FIXUP_HP_GPIO_LED),
Kailang Yang56496252020-07-29 15:09:27 +08008066 SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_AMP_INIT),
Qiu Wenbo08befca2020-10-02 20:44:54 +08008067 SND_PCI_QUIRK(0x103c, 0x8760, "HP", ALC285_FIXUP_HP_MUTE_LED),
Kailang Yang431e76c2020-04-07 14:40:20 +08008068 SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED),
Kailang Yang24164f42020-04-07 14:52:42 +08008069 SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED),
Jeremy Szu91bc1562021-01-06 21:05:46 +08008070 SND_PCI_QUIRK(0x103c, 0x8780, "HP ZBook Fury 17 G7 Mobile Workstation",
8071 ALC285_FIXUP_HP_GPIO_AMP_INIT),
8072 SND_PCI_QUIRK(0x103c, 0x8783, "HP ZBook Fury 15 G7 Mobile Workstation",
8073 ALC285_FIXUP_HP_GPIO_AMP_INIT),
Manuel Jiménez48422952020-12-29 15:38:56 +01008074 SND_PCI_QUIRK(0x103c, 0x87c8, "HP", ALC287_FIXUP_HP_GPIO_LED),
Jeremy Szue7d66cf2021-03-16 15:46:24 +08008075 SND_PCI_QUIRK(0x103c, 0x87e5, "HP ProBook 440 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
Jeremy Szu417eadf2021-03-30 19:44:27 +08008076 SND_PCI_QUIRK(0x103c, 0x87f2, "HP ProBook 640 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
Kailang Yanga0ccbc52020-11-06 15:20:38 +08008077 SND_PCI_QUIRK(0x103c, 0x87f4, "HP", ALC287_FIXUP_HP_GPIO_LED),
8078 SND_PCI_QUIRK(0x103c, 0x87f5, "HP", ALC287_FIXUP_HP_GPIO_LED),
Takashi Iwaic3bb2b52021-02-15 09:25:40 +01008079 SND_PCI_QUIRK(0x103c, 0x87f7, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
Jeremy Szu53b861b2021-03-16 17:42:35 +08008080 SND_PCI_QUIRK(0x103c, 0x8846, "HP EliteBook 850 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
Jeremy Szuca688332021-03-16 14:54:50 +08008081 SND_PCI_QUIRK(0x103c, 0x884c, "HP EliteBook 840 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
Chris Chiuc1732ed2017-02-28 14:17:13 -06008082 SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
Takashi Iwai7bba2152013-09-06 15:45:38 +02008083 SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
David Henningsson3e0d6112013-04-22 14:30:14 +02008084 SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Wandrille RONCE9cf65332018-12-19 14:52:44 +01008085 SND_PCI_QUIRK(0x1043, 0x10a1, "ASUS UX391UA", ALC294_FIXUP_ASUS_SPK),
Chris Chiuc1732ed2017-02-28 14:17:13 -06008086 SND_PCI_QUIRK(0x1043, 0x10c0, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
Takashi Iwai4eab0ea2017-06-06 12:33:17 +02008087 SND_PCI_QUIRK(0x1043, 0x10d0, "ASUS X540LA/X540LJ", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
David Henningsson3e0d6112013-04-22 14:30:14 +02008088 SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Takashi Iwai4eab0ea2017-06-06 12:33:17 +02008089 SND_PCI_QUIRK(0x1043, 0x11c0, "ASUS X556UR", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
Chris Chiu5cfca592020-12-07 15:27:55 +08008090 SND_PCI_QUIRK(0x1043, 0x1271, "ASUS X430UN", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
Takashi Iwai4eab0ea2017-06-06 12:33:17 +02008091 SND_PCI_QUIRK(0x1043, 0x1290, "ASUS X441SA", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
8092 SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
Chris Chiuc1732ed2017-02-28 14:17:13 -06008093 SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC),
8094 SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),
8095 SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
Oleksij Rempel2cede302013-11-27 17:12:03 +01008096 SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
Takashi Iwai23870832013-11-29 14:13:12 +01008097 SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
David Henningsson3e0d6112013-04-22 14:30:14 +02008098 SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
Chris Chiu48e01502019-12-30 11:11:18 +08008099 SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_DUAL_SPK),
Daniel Drake8c8967a2019-10-17 16:15:01 +08008100 SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC),
Adam Barber4963d662020-04-10 17:00:32 +08008101 SND_PCI_QUIRK(0x1043, 0x18f1, "Asus FX505DT", ALC256_FIXUP_ASUS_HEADSET_MIC),
Kailang Yang158ae2f2020-07-16 15:21:59 +08008102 SND_PCI_QUIRK(0x1043, 0x194e, "ASUS UX563FD", ALC294_FIXUP_ASUS_HPE),
Jian-Hong Pan5de3b942021-01-22 13:47:06 +08008103 SND_PCI_QUIRK(0x1043, 0x1982, "ASUS B1400CEPE", ALC256_FIXUP_ASUS_HPE),
Jian-Hong Pan8b33a132020-02-25 15:29:21 +08008104 SND_PCI_QUIRK(0x1043, 0x19ce, "ASUS B9450FA", ALC294_FIXUP_ASUS_HPE),
Jian-Hong Pan7900e812020-05-12 14:15:28 +08008105 SND_PCI_QUIRK(0x1043, 0x19e1, "ASUS UX581LV", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE),
Takashi Iwai017f2a12011-07-09 14:42:25 +02008106 SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
Chris Chiu28e8af82017-06-05 15:05:30 -06008107 SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC),
Takashi Iwai1b94e592020-05-12 09:32:03 +02008108 SND_PCI_QUIRK(0x1043, 0x1b11, "ASUS UX431DA", ALC294_FIXUP_ASUS_COEF_1B),
David Henningsson693b6132012-06-22 19:12:10 +02008109 SND_PCI_QUIRK(0x1043, 0x1b13, "Asus U41SV", ALC269_FIXUP_INV_DMIC),
Chris Chiu615966a2017-02-28 14:17:12 -06008110 SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
Takashi Iwai4eab0ea2017-06-06 12:33:17 +02008111 SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Chris Chiu7e413522020-12-09 12:57:30 +08008112 SND_PCI_QUIRK(0x1043, 0x125e, "ASUS Q524UQK", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
Chris Chiuc1732ed2017-02-28 14:17:13 -06008113 SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
Kailang Yangef9ce662020-11-03 15:40:35 +08008114 SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE),
Armas Spann4b43d052020-07-24 16:06:16 +02008115 SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502),
Armas Spann293a92c2020-07-24 16:08:37 +02008116 SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401),
Luke D Jonesc3cdf182020-09-07 20:19:59 +12008117 SND_PCI_QUIRK(0x1043, 0x1881, "ASUS Zephyrus S/M", ALC294_FIXUP_ASUS_GX502_PINS),
Chris Chiueeed4cd2017-02-28 14:17:15 -06008118 SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02008119 SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
8120 SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
8121 SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
8122 SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
David Henningssond240d1d2013-04-15 12:50:02 +02008123 SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
Takashi Iwaif88abaa2014-02-07 12:07:59 +01008124 SND_PCI_QUIRK(0x104d, 0x90b5, "Sony VAIO Pro 11", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
David Henningsson88cfcf82013-10-11 10:18:45 +02008125 SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
Takashi Iwai1d045db2011-07-07 18:23:21 +02008126 SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
8127 SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
8128 SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
Takashi Iwaie9bd7d52014-05-21 11:06:49 +02008129 SND_PCI_QUIRK(0x104d, 0x9099, "Sony VAIO S13", ALC275_FIXUP_SONY_DISABLE_AAMIX),
Takashi Iwai24519912011-08-16 15:08:49 +02008130 SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),
Takashi Iwai4df3fd12015-06-29 08:38:02 +02008131 SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT),
Takashi Iwaicc7016a2015-04-08 20:47:55 +02008132 SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN),
Takashi Iwai88776f32015-05-01 09:20:34 +02008133 SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN),
Jan-Marek Glogowskifdcc9682018-02-14 11:29:15 +01008134 SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC),
David Henningsson2041d562014-06-13 11:15:44 +02008135 SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),
PeiSen Houb84e8432017-09-01 15:11:56 +08008136 SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE),
PeiSen Hou6fa38ef2020-07-27 13:56:47 +02008137 SND_PCI_QUIRK(0x10ec, 0x1230, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
PeiSen Houce2e79b2020-12-31 11:57:28 +01008138 SND_PCI_QUIRK(0x10ec, 0x1252, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
8139 SND_PCI_QUIRK(0x10ec, 0x1254, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
YOKOTA Hiroshi0fca97a2018-07-01 18:30:01 +09008140 SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-SZ6", ALC269_FIXUP_HEADSET_MODE),
David Henningssona33cc482014-10-07 10:18:41 +02008141 SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
Mike Pozulp14425f12020-05-09 20:28:37 -07008142 SND_PCI_QUIRK(0x144d, 0xc169, "Samsung Notebook 9 Pen (NP930SBE-K01US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
8143 SND_PCI_QUIRK(0x144d, 0xc176, "Samsung Notebook 9 Pro (NP930MBE-K04US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
Mike Pozulpf70fff82020-08-13 21:53:44 -07008144 SND_PCI_QUIRK(0x144d, 0xc189, "Samsung Galaxy Flex Book (NT950QCG-X716)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
Adrien Crivelli8bcea6c2020-08-26 17:40:14 +09008145 SND_PCI_QUIRK(0x144d, 0xc18a, "Samsung Galaxy Book Ion (NP930XCJ-K01US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
8146 SND_PCI_QUIRK(0x144d, 0xc830, "Samsung Galaxy Book Ion (NT950XCJ-X716A)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
Gabriele Mazzotta823ff162016-12-24 19:50:01 +01008147 SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
Joonho Wohn568e4e82020-07-18 17:23:15 +09008148 SND_PCI_QUIRK(0x144d, 0xc812, "Samsung Notebook Pen S (NT950SBE-X58)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
Anisse Astierabaa22742016-08-24 09:14:13 +02008149 SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
8150 SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),
Anisse Astier8cd65272018-11-23 17:59:11 +01008151 SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC),
Chris Chiu6ca653e2020-12-22 23:04:58 +08008152 SND_PCI_QUIRK(0x152d, 0x1082, "Quanta NL3", ALC269_FIXUP_LIFEBOOK),
PeiSen Houb5acfe12020-11-11 08:58:59 +01008153 SND_PCI_QUIRK(0x1558, 0x1323, "Clevo N130ZU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
Jeremy Soller89e3a562019-01-30 16:12:31 -07008154 SND_PCI_QUIRK(0x1558, 0x1325, "System76 Darter Pro (darp5)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
PeiSen Houb5acfe12020-11-11 08:58:59 +01008155 SND_PCI_QUIRK(0x1558, 0x1401, "Clevo L140[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8156 SND_PCI_QUIRK(0x1558, 0x1403, "Clevo N140CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8157 SND_PCI_QUIRK(0x1558, 0x1404, "Clevo N150CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8158 SND_PCI_QUIRK(0x1558, 0x14a1, "Clevo L141MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8159 SND_PCI_QUIRK(0x1558, 0x4018, "Clevo NV40M[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8160 SND_PCI_QUIRK(0x1558, 0x4019, "Clevo NV40MZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8161 SND_PCI_QUIRK(0x1558, 0x4020, "Clevo NV40MB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8162 SND_PCI_QUIRK(0x1558, 0x40a1, "Clevo NL40GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8163 SND_PCI_QUIRK(0x1558, 0x40c1, "Clevo NL40[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8164 SND_PCI_QUIRK(0x1558, 0x40d1, "Clevo NL41DU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8165 SND_PCI_QUIRK(0x1558, 0x50a3, "Clevo NJ51GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8166 SND_PCI_QUIRK(0x1558, 0x50b3, "Clevo NK50S[BEZ]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8167 SND_PCI_QUIRK(0x1558, 0x50b6, "Clevo NK50S5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8168 SND_PCI_QUIRK(0x1558, 0x50b8, "Clevo NK50SZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8169 SND_PCI_QUIRK(0x1558, 0x50d5, "Clevo NP50D5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8170 SND_PCI_QUIRK(0x1558, 0x50f0, "Clevo NH50A[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8171 SND_PCI_QUIRK(0x1558, 0x50f3, "Clevo NH58DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8172 SND_PCI_QUIRK(0x1558, 0x5101, "Clevo S510WU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8173 SND_PCI_QUIRK(0x1558, 0x5157, "Clevo W517GU1", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8174 SND_PCI_QUIRK(0x1558, 0x51a1, "Clevo NS50MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8175 SND_PCI_QUIRK(0x1558, 0x70a1, "Clevo NB70T[HJK]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8176 SND_PCI_QUIRK(0x1558, 0x70b3, "Clevo NK70SB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8177 SND_PCI_QUIRK(0x1558, 0x8228, "Clevo NR40BU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8178 SND_PCI_QUIRK(0x1558, 0x8520, "Clevo NH50D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8179 SND_PCI_QUIRK(0x1558, 0x8521, "Clevo NH77D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8180 SND_PCI_QUIRK(0x1558, 0x8535, "Clevo NH50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8181 SND_PCI_QUIRK(0x1558, 0x8536, "Clevo NH79D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
Jeremy Soller80a50522019-05-07 17:11:08 -04008182 SND_PCI_QUIRK(0x1558, 0x8550, "System76 Gazelle (gaze14)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
Jeremy Soller891afcf2019-05-10 10:15:07 -04008183 SND_PCI_QUIRK(0x1558, 0x8551, "System76 Gazelle (gaze14)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8184 SND_PCI_QUIRK(0x1558, 0x8560, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
8185 SND_PCI_QUIRK(0x1558, 0x8561, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
Eckhart Mohr48698c92021-03-02 17:25:22 +01008186 SND_PCI_QUIRK(0x1558, 0x8562, "Clevo NH[5|7][0-9]RZ[Q]", ALC269_FIXUP_DMIC),
PeiSen Houb5acfe12020-11-11 08:58:59 +01008187 SND_PCI_QUIRK(0x1558, 0x8668, "Clevo NP50B[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8188 SND_PCI_QUIRK(0x1558, 0x8680, "Clevo NJ50LU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8189 SND_PCI_QUIRK(0x1558, 0x8686, "Clevo NH50[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8190 SND_PCI_QUIRK(0x1558, 0x8a20, "Clevo NH55DCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8191 SND_PCI_QUIRK(0x1558, 0x8a51, "Clevo NH70RCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8192 SND_PCI_QUIRK(0x1558, 0x8d50, "Clevo NH55RCQ-M", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8193 SND_PCI_QUIRK(0x1558, 0x951d, "Clevo N950T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8194 SND_PCI_QUIRK(0x1558, 0x961d, "Clevo N960S[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8195 SND_PCI_QUIRK(0x1558, 0x971d, "Clevo N970T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8196 SND_PCI_QUIRK(0x1558, 0xa500, "Clevo NL53RU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
Kailang Yangca169cc2017-04-25 16:17:40 +08008197 SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
Hui Wangef0b3202020-04-27 11:00:39 +08008198 SND_PCI_QUIRK(0x17aa, 0x1048, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
Takashi Iwai1d045db2011-07-07 18:23:21 +02008199 SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
8200 SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
8201 SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
8202 SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
8203 SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
Takashi Iwaib590b382020-05-14 18:05:33 +02008204 SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST),
Felix Kaechelec8415a42012-08-06 23:02:01 +02008205 SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK),
Stefán Freyr84f98fd2012-10-19 22:46:00 +02008206 SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),
Philipp A. Mohrenweiser4407be62012-08-06 13:14:18 +02008207 SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),
David Henningsson108cc102012-07-20 10:37:25 +02008208 SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK),
David Henningssonaaedfb42013-08-16 14:09:02 +02008209 SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK),
Takashi Iwai9a811232015-12-09 15:17:43 +01008210 SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440),
Takashi Iwai1c37c222014-05-06 17:34:42 +02008211 SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK),
Takashi Iwaia12137e2014-06-27 12:14:35 +02008212 SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK),
Rick Sherman59a51a62015-08-18 21:04:30 -05008213 SND_PCI_QUIRK(0x17aa, 0x2211, "Thinkpad W541", ALC292_FIXUP_TPT440_DOCK),
Takashi Iwai6d169412014-10-07 17:27:02 +02008214 SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK),
Lukas Bossard7c215392014-10-29 18:31:07 +01008215 SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK),
David Henningssona4a9e082013-08-16 14:09:01 +02008216 SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Takashi Iwaib6903c02015-12-10 12:20:20 +01008217 SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK),
Laura Abbottd05ea7d2015-10-02 11:09:54 -07008218 SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK),
Yves-Alexis Perezc0278662015-04-11 09:31:35 +02008219 SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK),
Kailang Yang61fcf8e2018-02-02 15:26:46 +08008220 SND_PCI_QUIRK(0x17aa, 0x222d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
8221 SND_PCI_QUIRK(0x17aa, 0x222e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
Torsten Hilbrichdab38e42016-06-07 13:14:21 +02008222 SND_PCI_QUIRK(0x17aa, 0x2231, "Thinkpad T560", ALC292_FIXUP_TPT460),
Sven Eckelmannc636b952016-04-11 16:55:26 +02008223 SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460),
Kailang Yang61fcf8e2018-02-02 15:26:46 +08008224 SND_PCI_QUIRK(0x17aa, 0x2245, "Thinkpad T470", ALC298_FIXUP_TPT470_DOCK),
8225 SND_PCI_QUIRK(0x17aa, 0x2246, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
8226 SND_PCI_QUIRK(0x17aa, 0x2247, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
Dennis Wassenberge4c07b32018-03-08 13:17:54 +01008227 SND_PCI_QUIRK(0x17aa, 0x2249, "Thinkpad", ALC292_FIXUP_TPT460),
Kailang Yang61fcf8e2018-02-02 15:26:46 +08008228 SND_PCI_QUIRK(0x17aa, 0x224b, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
8229 SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
8230 SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
Benjamin Berg85981df2018-02-14 13:29:39 +01008231 SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Benjamin Poirier9774dc22020-07-03 17:00:04 +09008232 SND_PCI_QUIRK(0x17aa, 0x2292, "Thinkpad X1 Carbon 7th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
Hans de Goedeca707b32020-04-02 19:43:11 +02008233 SND_PCI_QUIRK(0x17aa, 0x22be, "Thinkpad X1 Carbon 8th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
Kailang Yang446b8182020-11-02 15:00:12 +08008234 SND_PCI_QUIRK(0x17aa, 0x22c1, "Thinkpad P1 Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
8235 SND_PCI_QUIRK(0x17aa, 0x22c2, "Thinkpad X1 Extreme Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
Kailang3694cb22015-12-28 11:35:24 +08008236 SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
Hui Wang6ef2f682016-03-11 12:04:02 +08008237 SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
Hui Wangf33f79f2017-07-07 12:08:29 +08008238 SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
Dennis Wassenbergbef33e12019-06-28 10:54:53 +02008239 SND_PCI_QUIRK(0x17aa, 0x3111, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
Hui Wange41fc8c2018-06-25 14:40:56 +08008240 SND_PCI_QUIRK(0x17aa, 0x312a, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
Kailang Yang65811832018-04-25 17:07:27 +08008241 SND_PCI_QUIRK(0x17aa, 0x312f, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
Hui Wang8da5bbf2017-12-22 11:17:46 +08008242 SND_PCI_QUIRK(0x17aa, 0x313c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
Hui Wang2a36c162019-09-04 13:53:27 +08008243 SND_PCI_QUIRK(0x17aa, 0x3151, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
Aaron Ma8a6c55d2019-10-24 19:44:39 +08008244 SND_PCI_QUIRK(0x17aa, 0x3176, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
8245 SND_PCI_QUIRK(0x17aa, 0x3178, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
Kailang Yangf86de9b2020-10-23 14:46:47 +08008246 SND_PCI_QUIRK(0x17aa, 0x3818, "Lenovo C940", ALC298_FIXUP_LENOVO_SPK_VOLUME),
David Henningsson56f27012016-01-11 09:33:14 +01008247 SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
Takashi Iwaifedb2242014-11-13 07:11:38 +01008248 SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
Michał Wadowski56df90b2019-05-14 16:58:00 +02008249 SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
David Henningssona4a9e082013-08-16 14:09:01 +02008250 SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Kailang Yang1bb3e062013-09-27 13:10:25 +02008251 SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC),
Takashi Iwaic497d9f2014-10-08 12:14:40 +02008252 SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK),
David Henningssoncd5302c2013-08-19 12:22:33 +02008253 SND_PCI_QUIRK(0x17aa, 0x5026, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Jo-Philipp Wichf2aa1112015-04-13 12:47:26 +02008254 SND_PCI_QUIRK(0x17aa, 0x5034, "Thinkpad T450", ALC292_FIXUP_TPT440_DOCK),
Sebastian Wicki80b311d2015-03-23 17:23:11 +01008255 SND_PCI_QUIRK(0x17aa, 0x5036, "Thinkpad T450s", ALC292_FIXUP_TPT440_DOCK),
Ansgar Hegerfeld09ea9972015-05-14 12:31:32 +02008256 SND_PCI_QUIRK(0x17aa, 0x503c, "Thinkpad L450", ALC292_FIXUP_TPT440_DOCK),
Conrad Kostecki037e1192016-04-26 10:08:10 +02008257 SND_PCI_QUIRK(0x17aa, 0x504a, "ThinkPad X260", ALC292_FIXUP_TPT440_DOCK),
Hui Wang23adc192015-12-08 12:27:18 +08008258 SND_PCI_QUIRK(0x17aa, 0x504b, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
Jaroslav Kysela0f087ee2016-06-24 15:13:16 +02008259 SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460),
Torsten Hilbrich9cd25742016-07-05 10:40:22 +02008260 SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460),
Jaroslav Kysela0f087ee2016-06-24 15:13:16 +02008261 SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460),
Kailang Yang61fcf8e2018-02-02 15:26:46 +08008262 SND_PCI_QUIRK(0x17aa, 0x505d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
8263 SND_PCI_QUIRK(0x17aa, 0x505f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
8264 SND_PCI_QUIRK(0x17aa, 0x5062, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
David Henningssoncd5302c2013-08-19 12:22:33 +02008265 SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Kailang Yang61fcf8e2018-02-02 15:26:46 +08008266 SND_PCI_QUIRK(0x17aa, 0x511e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
8267 SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
David Henningsson012e7eb2012-08-08 08:43:37 +02008268 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
Takashi Iwai1d045db2011-07-07 18:23:21 +02008269 SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
Ayman Bagabas0fbf21c2019-05-23 05:30:11 -04008270 SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS),
Huacai Chenf1ec5be2020-08-02 17:26:40 +08008271 SND_PCI_QUIRK(0x1b35, 0x1235, "CZC B20", ALC269_FIXUP_CZC_B20),
8272 SND_PCI_QUIRK(0x1b35, 0x1236, "CZC TMI", ALC269_FIXUP_CZC_TMI),
8273 SND_PCI_QUIRK(0x1b35, 0x1237, "CZC L101", ALC269_FIXUP_CZC_L101),
Anisse Astier02b504d2013-06-03 11:53:10 +02008274 SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */
Hui Wangfc19d552020-09-09 10:00:41 +08008275 SND_PCI_QUIRK(0x1d72, 0x1602, "RedmiBook", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
Xiaoliang Yub95bc122021-03-16 00:49:00 +08008276 SND_PCI_QUIRK(0x1d72, 0x1701, "XiaomiNotebook Pro", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE),
Hui Wang695d1ec2019-11-21 10:54:27 +08008277 SND_PCI_QUIRK(0x1d72, 0x1901, "RedmiBook 14", ALC256_FIXUP_ASUS_HEADSET_MIC),
Xiaoliang Yue1c86212021-03-13 07:54:53 +08008278 SND_PCI_QUIRK(0x1d72, 0x1947, "RedmiBook Air", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
Jan-Marek Glogowskibd9c10b2019-09-15 16:57:28 +02008279 SND_PCI_QUIRK(0x10ec, 0x118c, "Medion EE4254 MD62100", ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE),
Huacai Chenf1ec5be2020-08-02 17:26:40 +08008280 SND_PCI_QUIRK(0x1c06, 0x2013, "Lemote A1802", ALC269_FIXUP_LEMOTE_A1802),
8281 SND_PCI_QUIRK(0x1c06, 0x2015, "Lemote A190X", ALC269_FIXUP_LEMOTE_A190X),
Kai-Heng Fenge2d2fde2020-08-07 16:05:12 +08008282 SND_PCI_QUIRK(0x8086, 0x2080, "Intel NUC 8 Rugged", ALC256_FIXUP_INTEL_NUC8_RUGGED),
Werner Sembach73e71612021-03-02 19:04:14 +01008283 SND_PCI_QUIRK(0x8086, 0x2081, "Intel NUC 10", ALC256_FIXUP_INTEL_NUC10),
Takashi Iwaia4297b52011-08-23 18:40:12 +02008284
Takashi Iwaia7f3eed2012-02-16 13:03:18 +01008285#if 0
Takashi Iwaia4297b52011-08-23 18:40:12 +02008286 /* Below is a quirk table taken from the old code.
8287 * Basically the device should work as is without the fixup table.
8288 * If BIOS doesn't give a proper info, enable the corresponding
8289 * fixup entry.
Jesper Juhl7d7eb9e2012-04-12 22:11:25 +02008290 */
Takashi Iwaia4297b52011-08-23 18:40:12 +02008291 SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
8292 ALC269_FIXUP_AMIC),
8293 SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC),
Takashi Iwaia4297b52011-08-23 18:40:12 +02008294 SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC),
8295 SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC),
8296 SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC),
8297 SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269_FIXUP_AMIC),
8298 SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269_FIXUP_AMIC),
8299 SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269_FIXUP_AMIC),
8300 SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_FIXUP_AMIC),
8301 SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269_FIXUP_AMIC),
8302 SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_FIXUP_AMIC),
8303 SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_FIXUP_AMIC),
8304 SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_FIXUP_AMIC),
8305 SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_FIXUP_AMIC),
8306 SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_FIXUP_AMIC),
8307 SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_FIXUP_AMIC),
8308 SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_FIXUP_AMIC),
8309 SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_FIXUP_AMIC),
8310 SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_FIXUP_AMIC),
8311 SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_FIXUP_AMIC),
8312 SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_FIXUP_AMIC),
8313 SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_FIXUP_AMIC),
8314 SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_FIXUP_AMIC),
8315 SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_FIXUP_AMIC),
8316 SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_FIXUP_AMIC),
8317 SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_FIXUP_AMIC),
8318 SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_FIXUP_AMIC),
8319 SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_FIXUP_AMIC),
8320 SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_FIXUP_AMIC),
8321 SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_FIXUP_AMIC),
8322 SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_FIXUP_AMIC),
8323 SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_FIXUP_AMIC),
8324 SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_FIXUP_AMIC),
8325 SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_FIXUP_AMIC),
8326 SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_FIXUP_AMIC),
8327 SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_FIXUP_DMIC),
8328 SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_FIXUP_AMIC),
8329 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_AMIC),
8330 SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_FIXUP_DMIC),
8331 SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_FIXUP_DMIC),
8332#endif
8333 {}
8334};
8335
David Henningsson214eef72014-07-22 14:09:35 +02008336static const struct snd_pci_quirk alc269_fixup_vendor_tbl[] = {
8337 SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
8338 SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED),
8339 SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
8340 SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", ALC269_FIXUP_THINKPAD_ACPI),
Ayman Bagabas0fbf21c2019-05-23 05:30:11 -04008341 SND_PCI_QUIRK_VENDOR(0x19e5, "Huawei Matebook", ALC255_FIXUP_MIC_MUTE_LED),
David Henningsson214eef72014-07-22 14:09:35 +02008342 {}
8343};
8344
Takashi Iwai1727a772013-01-10 09:52:52 +01008345static const struct hda_model_fixup alc269_fixup_models[] = {
Takashi Iwaia4297b52011-08-23 18:40:12 +02008346 {.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"},
8347 {.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"},
Takashi Iwai6e72aa52012-06-25 10:52:25 +02008348 {.id = ALC269_FIXUP_STEREO_DMIC, .name = "alc269-dmic"},
8349 {.id = ALC271_FIXUP_DMIC, .name = "alc271-dmic"},
8350 {.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"},
David Henningsson7c478f02013-10-11 10:18:46 +02008351 {.id = ALC269_FIXUP_HEADSET_MIC, .name = "headset-mic"},
Takashi Iwaib0169512015-05-19 10:20:13 +02008352 {.id = ALC269_FIXUP_HEADSET_MODE, .name = "headset-mode"},
8353 {.id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, .name = "headset-mode-no-hp-mic"},
David Henningsson108cc102012-07-20 10:37:25 +02008354 {.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
Takashi Iwaib590b382020-05-14 18:05:33 +02008355 {.id = ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST, .name = "lenovo-dock-limit-boost"},
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01008356 {.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
Jaroslav Kysela04d54662017-03-09 13:29:13 +01008357 {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic1-led"},
David Henningssone32aa852013-06-17 11:04:02 +02008358 {.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
8359 {.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02008360 {.id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, .name = "dell-headset3"},
8361 {.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, .name = "dell-headset4"},
Kailang Yangbe8ef162014-04-08 15:19:49 +08008362 {.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},
Kailang Yang0202e992013-12-02 15:20:15 +08008363 {.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"},
Takashi Iwai1c37c222014-05-06 17:34:42 +02008364 {.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
Takashi Iwai9a811232015-12-09 15:17:43 +01008365 {.id = ALC292_FIXUP_TPT440, .name = "tpt440"},
Sven Eckelmannc636b952016-04-11 16:55:26 +02008366 {.id = ALC292_FIXUP_TPT460, .name = "tpt460"},
Takashi Iwai399c01a2020-05-26 08:24:06 +02008367 {.id = ALC298_FIXUP_TPT470_DOCK_FIX, .name = "tpt470-dock-fix"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02008368 {.id = ALC298_FIXUP_TPT470_DOCK, .name = "tpt470-dock"},
Takashi Iwaiba90d6a2017-05-22 16:38:47 +02008369 {.id = ALC233_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
Takashi Iwai28d1d6d2017-10-18 14:01:58 +02008370 {.id = ALC700_FIXUP_INTEL_REFERENCE, .name = "alc700-ref"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02008371 {.id = ALC269_FIXUP_SONY_VAIO, .name = "vaio"},
8372 {.id = ALC269_FIXUP_DELL_M101Z, .name = "dell-m101z"},
8373 {.id = ALC269_FIXUP_ASUS_G73JW, .name = "asus-g73jw"},
8374 {.id = ALC269_FIXUP_LENOVO_EAPD, .name = "lenovo-eapd"},
8375 {.id = ALC275_FIXUP_SONY_HWEQ, .name = "sony-hweq"},
8376 {.id = ALC269_FIXUP_PCM_44K, .name = "pcm44k"},
8377 {.id = ALC269_FIXUP_LIFEBOOK, .name = "lifebook"},
8378 {.id = ALC269_FIXUP_LIFEBOOK_EXTMIC, .name = "lifebook-extmic"},
8379 {.id = ALC269_FIXUP_LIFEBOOK_HP_PIN, .name = "lifebook-hp-pin"},
8380 {.id = ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC, .name = "lifebook-u7x7"},
8381 {.id = ALC269VB_FIXUP_AMIC, .name = "alc269vb-amic"},
8382 {.id = ALC269VB_FIXUP_DMIC, .name = "alc269vb-dmic"},
8383 {.id = ALC269_FIXUP_HP_MUTE_LED_MIC1, .name = "hp-mute-led-mic1"},
8384 {.id = ALC269_FIXUP_HP_MUTE_LED_MIC2, .name = "hp-mute-led-mic2"},
8385 {.id = ALC269_FIXUP_HP_MUTE_LED_MIC3, .name = "hp-mute-led-mic3"},
8386 {.id = ALC269_FIXUP_HP_GPIO_MIC1_LED, .name = "hp-gpio-mic1"},
8387 {.id = ALC269_FIXUP_HP_LINE1_MIC1_LED, .name = "hp-line1-mic1"},
8388 {.id = ALC269_FIXUP_NO_SHUTUP, .name = "noshutup"},
8389 {.id = ALC286_FIXUP_SONY_MIC_NO_PRESENCE, .name = "sony-nomic"},
8390 {.id = ALC269_FIXUP_ASPIRE_HEADSET_MIC, .name = "aspire-headset-mic"},
8391 {.id = ALC269_FIXUP_ASUS_X101, .name = "asus-x101"},
8392 {.id = ALC271_FIXUP_HP_GATE_MIC_JACK, .name = "acer-ao7xx"},
8393 {.id = ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572, .name = "acer-aspire-e1"},
8394 {.id = ALC269_FIXUP_ACER_AC700, .name = "acer-ac700"},
8395 {.id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST, .name = "limit-mic-boost"},
8396 {.id = ALC269VB_FIXUP_ASUS_ZENBOOK, .name = "asus-zenbook"},
8397 {.id = ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A, .name = "asus-zenbook-ux31a"},
8398 {.id = ALC269VB_FIXUP_ORDISSIMO_EVE2, .name = "ordissimo"},
8399 {.id = ALC282_FIXUP_ASUS_TX300, .name = "asus-tx300"},
8400 {.id = ALC283_FIXUP_INT_MIC, .name = "alc283-int-mic"},
8401 {.id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK, .name = "mono-speakers"},
8402 {.id = ALC290_FIXUP_SUBWOOFER_HSJACK, .name = "alc290-subwoofer"},
8403 {.id = ALC269_FIXUP_THINKPAD_ACPI, .name = "thinkpad"},
8404 {.id = ALC269_FIXUP_DMIC_THINKPAD_ACPI, .name = "dmic-thinkpad"},
8405 {.id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE, .name = "alc255-acer"},
8406 {.id = ALC255_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc255-asus"},
8407 {.id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc255-dell1"},
8408 {.id = ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "alc255-dell2"},
8409 {.id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc293-dell1"},
8410 {.id = ALC283_FIXUP_HEADSET_MIC, .name = "alc283-headset"},
Takashi Iwaib3802782018-11-26 17:47:46 +01008411 {.id = ALC255_FIXUP_MIC_MUTE_LED, .name = "alc255-dell-mute"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02008412 {.id = ALC282_FIXUP_ASPIRE_V5_PINS, .name = "aspire-v5"},
Takashi Iwaic8426b22021-04-07 11:57:30 +02008413 {.id = ALC269VB_FIXUP_ASPIRE_E1_COEF, .name = "aspire-e1-coef"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02008414 {.id = ALC280_FIXUP_HP_GPIO4, .name = "hp-gpio4"},
8415 {.id = ALC286_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
8416 {.id = ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY, .name = "hp-gpio2-hotkey"},
8417 {.id = ALC280_FIXUP_HP_DOCK_PINS, .name = "hp-dock-pins"},
8418 {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic"},
8419 {.id = ALC280_FIXUP_HP_9480M, .name = "hp-9480m"},
8420 {.id = ALC288_FIXUP_DELL_HEADSET_MODE, .name = "alc288-dell-headset"},
8421 {.id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc288-dell1"},
8422 {.id = ALC288_FIXUP_DELL_XPS_13, .name = "alc288-dell-xps13"},
8423 {.id = ALC292_FIXUP_DELL_E7X, .name = "dell-e7x"},
8424 {.id = ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK, .name = "alc293-dell"},
8425 {.id = ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc298-dell1"},
8426 {.id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, .name = "alc298-dell-aio"},
8427 {.id = ALC275_FIXUP_DELL_XPS, .name = "alc275-dell-xps"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02008428 {.id = ALC293_FIXUP_LENOVO_SPK_NOISE, .name = "lenovo-spk-noise"},
8429 {.id = ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, .name = "lenovo-hotkey"},
8430 {.id = ALC255_FIXUP_DELL_SPK_NOISE, .name = "dell-spk-noise"},
Kailang Yang82aa0d72019-01-11 17:15:53 +08008431 {.id = ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc225-dell1"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02008432 {.id = ALC295_FIXUP_DISABLE_DAC3, .name = "alc295-disable-dac3"},
Jaroslav Kyselad2cd7952019-11-29 15:40:27 +01008433 {.id = ALC285_FIXUP_SPEAKER2_TO_DAC1, .name = "alc285-speaker2-to-dac1"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02008434 {.id = ALC280_FIXUP_HP_HEADSET_MIC, .name = "alc280-hp-headset"},
8435 {.id = ALC221_FIXUP_HP_FRONT_MIC, .name = "alc221-hp-mic"},
8436 {.id = ALC298_FIXUP_SPK_VOLUME, .name = "alc298-spk-volume"},
8437 {.id = ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER, .name = "dell-inspiron-7559"},
8438 {.id = ALC269_FIXUP_ATIV_BOOK_8, .name = "ativ-book"},
8439 {.id = ALC221_FIXUP_HP_MIC_NO_PRESENCE, .name = "alc221-hp-mic"},
8440 {.id = ALC256_FIXUP_ASUS_HEADSET_MODE, .name = "alc256-asus-headset"},
8441 {.id = ALC256_FIXUP_ASUS_MIC, .name = "alc256-asus-mic"},
8442 {.id = ALC256_FIXUP_ASUS_AIO_GPIO2, .name = "alc256-asus-aio"},
8443 {.id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc233-asus"},
8444 {.id = ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE, .name = "alc233-eapd"},
8445 {.id = ALC294_FIXUP_LENOVO_MIC_LOCATION, .name = "alc294-lenovo-mic"},
8446 {.id = ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE, .name = "alc225-wyse"},
8447 {.id = ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, .name = "alc274-dell-aio"},
8448 {.id = ALC255_FIXUP_DUMMY_LINEOUT_VERB, .name = "alc255-dummy-lineout"},
8449 {.id = ALC255_FIXUP_DELL_HEADSET_MIC, .name = "alc255-dell-headset"},
8450 {.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"},
Kailang Yang8983eb62019-04-03 15:31:49 +08008451 {.id = ALC225_FIXUP_HEADSET_JACK, .name = "alc-headset-jack"},
8452 {.id = ALC295_FIXUP_CHROME_BOOK, .name = "alc-chrome-book"},
Bernhard Rosenkraenzere2a829b2019-03-05 00:38:19 +01008453 {.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"},
Tomas Espeletaa2ef03f2019-08-09 16:37:54 +02008454 {.id = ALC298_FIXUP_HUAWEI_MBX_STEREO, .name = "huawei-mbx-stereo"},
Jan-Marek Glogowskibd9c10b2019-09-15 16:57:28 +02008455 {.id = ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, .name = "alc256-medion-headset"},
Mike Pozulp23dc9582020-08-16 21:32:17 -07008456 {.id = ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET, .name = "alc298-samsung-headphone"},
Hui Wangfc19d552020-09-09 10:00:41 +08008457 {.id = ALC255_FIXUP_XIAOMI_HEADSET_MIC, .name = "alc255-xiaomi-headset"},
Hui Wang13468bf2020-09-28 16:01:17 +08008458 {.id = ALC274_FIXUP_HP_MIC, .name = "alc274-hp-mic-detect"},
Takashi Iwaic3bb2b52021-02-15 09:25:40 +01008459 {.id = ALC245_FIXUP_HP_X360_AMP, .name = "alc245-hp-x360-amp"},
Takashi Iwai1d045db2011-07-07 18:23:21 +02008460 {}
8461};
Kailang Yangcfc5a842016-02-03 15:20:39 +08008462#define ALC225_STANDARD_PINS \
Kailang Yangcfc5a842016-02-03 15:20:39 +08008463 {0x21, 0x04211020}
Takashi Iwai1d045db2011-07-07 18:23:21 +02008464
Hui Wange8191a82015-04-24 13:39:59 +08008465#define ALC256_STANDARD_PINS \
8466 {0x12, 0x90a60140}, \
8467 {0x14, 0x90170110}, \
Hui Wange8191a82015-04-24 13:39:59 +08008468 {0x21, 0x02211020}
8469
David Henningssonfea185e2014-09-03 10:23:04 +02008470#define ALC282_STANDARD_PINS \
Hui Wang11580292015-08-03 11:03:49 +08008471 {0x14, 0x90170110}
Kailang Yange1e62b92015-04-08 16:01:22 +08008472
David Henningssonfea185e2014-09-03 10:23:04 +02008473#define ALC290_STANDARD_PINS \
Hui Wang11580292015-08-03 11:03:49 +08008474 {0x12, 0x99a30130}
David Henningssonfea185e2014-09-03 10:23:04 +02008475
8476#define ALC292_STANDARD_PINS \
8477 {0x14, 0x90170110}, \
Hui Wang11580292015-08-03 11:03:49 +08008478 {0x15, 0x0221401f}
Kailang Yang977e6272015-05-18 15:31:20 +08008479
Hui Wang3f6409702016-09-11 11:26:16 +08008480#define ALC295_STANDARD_PINS \
8481 {0x12, 0xb7a60130}, \
8482 {0x14, 0x90170110}, \
Hui Wang3f6409702016-09-11 11:26:16 +08008483 {0x21, 0x04211020}
8484
Woodrow Shen703867e2015-08-05 12:34:12 +08008485#define ALC298_STANDARD_PINS \
8486 {0x12, 0x90a60130}, \
8487 {0x21, 0x03211020}
8488
Hui Wange1918932014-05-26 16:22:44 +08008489static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
Kailang Yang8a328ac2018-08-21 16:54:41 +08008490 SND_HDA_PIN_QUIRK(0x10ec0221, 0x103c, "HP Workstation", ALC221_FIXUP_HP_HEADSET_MIC,
8491 {0x14, 0x01014020},
8492 {0x17, 0x90170110},
8493 {0x18, 0x02a11030},
8494 {0x19, 0x0181303F},
8495 {0x21, 0x0221102f}),
Chris Chiu5824ce82017-02-28 14:17:11 -06008496 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1025, "Acer", ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
8497 {0x12, 0x90a601c0},
8498 {0x14, 0x90171120},
8499 {0x21, 0x02211030}),
Chris Chiu615966a2017-02-28 14:17:12 -06008500 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
8501 {0x14, 0x90170110},
8502 {0x1b, 0x90a70130},
8503 {0x21, 0x03211020}),
8504 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
8505 {0x1a, 0x90a70130},
8506 {0x1b, 0x90170110},
8507 {0x21, 0x03211020}),
David Henningsson2ae95572016-02-25 09:37:05 +01008508 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
Kailang Yangcfc5a842016-02-03 15:20:39 +08008509 ALC225_STANDARD_PINS,
Hui Wang8a132092016-07-08 14:26:57 +08008510 {0x12, 0xb7a60130},
Kailang Yangcfc5a842016-02-03 15:20:39 +08008511 {0x14, 0x901701a0}),
David Henningsson2ae95572016-02-25 09:37:05 +01008512 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
Kailang Yangcfc5a842016-02-03 15:20:39 +08008513 ALC225_STANDARD_PINS,
Hui Wang8a132092016-07-08 14:26:57 +08008514 {0x12, 0xb7a60130},
Kailang Yangcfc5a842016-02-03 15:20:39 +08008515 {0x14, 0x901701b0}),
Hui Wang8a132092016-07-08 14:26:57 +08008516 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
8517 ALC225_STANDARD_PINS,
8518 {0x12, 0xb7a60150},
8519 {0x14, 0x901701a0}),
8520 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
8521 ALC225_STANDARD_PINS,
8522 {0x12, 0xb7a60150},
8523 {0x14, 0x901701b0}),
8524 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
8525 ALC225_STANDARD_PINS,
8526 {0x12, 0xb7a60130},
8527 {0x1b, 0x90170110}),
Kai-Heng Feng0ce48e12017-11-20 02:29:13 -05008528 SND_HDA_PIN_QUIRK(0x10ec0233, 0x8086, "Intel NUC Skull Canyon", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
8529 {0x1b, 0x01111010},
8530 {0x1e, 0x01451130},
8531 {0x21, 0x02211020}),
Hui Wang986376b2018-05-30 12:33:07 +08008532 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
8533 {0x12, 0x90a60140},
8534 {0x14, 0x90170110},
8535 {0x19, 0x02a11030},
8536 {0x21, 0x02211020}),
Hui Wange41fc8c2018-06-25 14:40:56 +08008537 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
8538 {0x14, 0x90170110},
8539 {0x19, 0x02a11030},
8540 {0x1a, 0x02a11040},
8541 {0x1b, 0x01014020},
8542 {0x21, 0x0221101f}),
Hui Wangc6b17f12018-07-06 15:14:11 +08008543 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
8544 {0x14, 0x90170110},
Hui Wangd06fb562018-10-10 11:57:25 +08008545 {0x19, 0x02a11030},
8546 {0x1a, 0x02a11040},
8547 {0x1b, 0x01011020},
8548 {0x21, 0x0221101f}),
8549 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
8550 {0x14, 0x90170110},
Hui Wangc6b17f12018-07-06 15:14:11 +08008551 {0x19, 0x02a11020},
8552 {0x1a, 0x02a11030},
8553 {0x21, 0x0221101f}),
Kailang Yang92666d42020-11-19 17:04:21 +08008554 SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
8555 {0x21, 0x02211010}),
Kailang Yang9e885772020-11-03 15:30:51 +08008556 SND_HDA_PIN_QUIRK(0x10ec0236, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
8557 {0x14, 0x90170110},
8558 {0x19, 0x02a11020},
8559 {0x21, 0x02211030}),
Hui Wangc77900e2014-09-03 11:31:07 +08008560 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
Hui Wangc77900e2014-09-03 11:31:07 +08008561 {0x14, 0x90170110},
Hui Wangc77900e2014-09-03 11:31:07 +08008562 {0x21, 0x02211020}),
David Henningsson76c21322014-06-24 14:46:54 +02008563 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang86c72d12016-05-25 12:12:32 +08008564 {0x14, 0x90170130},
8565 {0x21, 0x02211040}),
8566 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningsson76c21322014-06-24 14:46:54 +02008567 {0x12, 0x90a60140},
8568 {0x14, 0x90170110},
David Henningsson76c21322014-06-24 14:46:54 +02008569 {0x21, 0x02211020}),
8570 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8571 {0x12, 0x90a60160},
8572 {0x14, 0x90170120},
David Henningsson76c21322014-06-24 14:46:54 +02008573 {0x21, 0x02211030}),
8574 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang392c9da2016-09-26 10:59:38 +08008575 {0x14, 0x90170110},
8576 {0x1b, 0x02011020},
8577 {0x21, 0x0221101f}),
8578 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang6aecd872016-10-20 14:03:33 +08008579 {0x14, 0x90170110},
8580 {0x1b, 0x01011020},
8581 {0x21, 0x0221101f}),
8582 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningssoncba59972015-07-22 10:00:25 +02008583 {0x14, 0x90170130},
David Henningssoncba59972015-07-22 10:00:25 +02008584 {0x1b, 0x01014020},
David Henningssoncba59972015-07-22 10:00:25 +02008585 {0x21, 0x0221103f}),
8586 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang59ec4b52016-08-04 15:28:04 +08008587 {0x14, 0x90170130},
Hui Wang6aecd872016-10-20 14:03:33 +08008588 {0x1b, 0x01011020},
8589 {0x21, 0x0221103f}),
8590 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8591 {0x14, 0x90170130},
Hui Wang59ec4b52016-08-04 15:28:04 +08008592 {0x1b, 0x02011020},
8593 {0x21, 0x0221103f}),
8594 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Woodrow Shene9c28e12015-07-25 10:36:16 +08008595 {0x14, 0x90170150},
Woodrow Shene9c28e12015-07-25 10:36:16 +08008596 {0x1b, 0x02011020},
Woodrow Shene9c28e12015-07-25 10:36:16 +08008597 {0x21, 0x0221105f}),
8598 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Woodrow Shene9c28e12015-07-25 10:36:16 +08008599 {0x14, 0x90170110},
Woodrow Shene9c28e12015-07-25 10:36:16 +08008600 {0x1b, 0x01014020},
Woodrow Shene9c28e12015-07-25 10:36:16 +08008601 {0x21, 0x0221101f}),
8602 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningsson76c21322014-06-24 14:46:54 +02008603 {0x12, 0x90a60160},
8604 {0x14, 0x90170120},
8605 {0x17, 0x90170140},
David Henningsson76c21322014-06-24 14:46:54 +02008606 {0x21, 0x0321102f}),
8607 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8608 {0x12, 0x90a60160},
8609 {0x14, 0x90170130},
David Henningsson76c21322014-06-24 14:46:54 +02008610 {0x21, 0x02211040}),
8611 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8612 {0x12, 0x90a60160},
8613 {0x14, 0x90170140},
David Henningsson76c21322014-06-24 14:46:54 +02008614 {0x21, 0x02211050}),
8615 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8616 {0x12, 0x90a60170},
8617 {0x14, 0x90170120},
David Henningsson76c21322014-06-24 14:46:54 +02008618 {0x21, 0x02211030}),
8619 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8620 {0x12, 0x90a60170},
8621 {0x14, 0x90170130},
David Henningsson76c21322014-06-24 14:46:54 +02008622 {0x21, 0x02211040}),
Hui Wang70658b92015-03-06 14:03:57 +08008623 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang70658b92015-03-06 14:03:57 +08008624 {0x12, 0x90a60170},
Hui Wang0a1f90a2016-01-13 11:51:38 +08008625 {0x14, 0x90171130},
8626 {0x21, 0x02211040}),
8627 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8628 {0x12, 0x90a60170},
Hui Wang70658b92015-03-06 14:03:57 +08008629 {0x14, 0x90170140},
Hui Wang70658b92015-03-06 14:03:57 +08008630 {0x21, 0x02211050}),
David Henningsson9b5a4e32015-05-11 14:04:14 +02008631 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5548", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningsson9b5a4e32015-05-11 14:04:14 +02008632 {0x12, 0x90a60180},
8633 {0x14, 0x90170130},
David Henningsson9b5a4e32015-05-11 14:04:14 +02008634 {0x21, 0x02211040}),
AceLan Kaof90d83b2016-06-03 14:45:25 +08008635 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5565", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8636 {0x12, 0x90a60180},
8637 {0x14, 0x90170120},
8638 {0x21, 0x02211030}),
Hui Wang989dbe42016-11-23 16:05:38 +08008639 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8640 {0x1b, 0x01011020},
8641 {0x21, 0x02211010}),
Chris Chiuc1732ed2017-02-28 14:17:13 -06008642 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
8643 {0x14, 0x90170110},
8644 {0x1b, 0x90a70130},
8645 {0x21, 0x04211020}),
8646 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
8647 {0x14, 0x90170110},
8648 {0x1b, 0x90a70130},
8649 {0x21, 0x03211020}),
Jian-Hong Pane1037352019-03-22 11:37:18 +08008650 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
Chris Chiua806ef12019-03-22 11:37:20 +08008651 {0x12, 0x90a60130},
8652 {0x14, 0x90170110},
8653 {0x21, 0x03211020}),
8654 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
Jian-Hong Pan6ac371a2019-03-22 11:37:22 +08008655 {0x12, 0x90a60130},
8656 {0x14, 0x90170110},
8657 {0x21, 0x04211020}),
8658 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
Jian-Hong Pane1037352019-03-22 11:37:18 +08008659 {0x1a, 0x90a70130},
8660 {0x1b, 0x90170110},
8661 {0x21, 0x03211020}),
Kailang Yang9e885772020-11-03 15:30:51 +08008662 SND_HDA_PIN_QUIRK(0x10ec0256, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
8663 {0x14, 0x90170110},
8664 {0x19, 0x02a11020},
8665 {0x21, 0x0221101f}),
Kailang Yang8a8de09c2020-10-27 16:46:38 +08008666 SND_HDA_PIN_QUIRK(0x10ec0274, 0x103c, "HP", ALC274_FIXUP_HP_HEADSET_MIC,
8667 {0x17, 0x90170110},
8668 {0x19, 0x03a11030},
8669 {0x21, 0x03211020}),
David Henningssoncf51eb92014-10-30 08:26:02 +01008670 SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
8671 {0x12, 0x90a60130},
David Henningssoncf51eb92014-10-30 08:26:02 +01008672 {0x14, 0x90170110},
8673 {0x15, 0x0421101f},
Hui Wang11580292015-08-03 11:03:49 +08008674 {0x1a, 0x04a11020}),
Hui Wang02796612014-09-03 11:31:11 +08008675 SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED,
8676 {0x12, 0x90a60140},
Hui Wang02796612014-09-03 11:31:11 +08008677 {0x14, 0x90170110},
8678 {0x15, 0x0421101f},
Hui Wang02796612014-09-03 11:31:11 +08008679 {0x18, 0x02811030},
Hui Wang02796612014-09-03 11:31:11 +08008680 {0x1a, 0x04a1103f},
Hui Wang11580292015-08-03 11:03:49 +08008681 {0x1b, 0x02011020}),
David Henningsson42304472014-07-22 11:42:17 +02008682 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP 15 Touchsmart", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008683 ALC282_STANDARD_PINS,
David Henningsson42304472014-07-22 11:42:17 +02008684 {0x12, 0x99a30130},
David Henningsson42304472014-07-22 11:42:17 +02008685 {0x19, 0x03a11020},
David Henningsson42304472014-07-22 11:42:17 +02008686 {0x21, 0x0321101f}),
Hui Wang2c609992014-09-03 11:31:08 +08008687 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008688 ALC282_STANDARD_PINS,
Hui Wang2c609992014-09-03 11:31:08 +08008689 {0x12, 0x99a30130},
Hui Wang2c609992014-09-03 11:31:08 +08008690 {0x19, 0x03a11020},
Hui Wang2c609992014-09-03 11:31:08 +08008691 {0x21, 0x03211040}),
8692 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008693 ALC282_STANDARD_PINS,
Hui Wang2c609992014-09-03 11:31:08 +08008694 {0x12, 0x99a30130},
Hui Wang2c609992014-09-03 11:31:08 +08008695 {0x19, 0x03a11030},
Hui Wang2c609992014-09-03 11:31:08 +08008696 {0x21, 0x03211020}),
8697 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008698 ALC282_STANDARD_PINS,
Hui Wang2c609992014-09-03 11:31:08 +08008699 {0x12, 0x99a30130},
Hui Wang2c609992014-09-03 11:31:08 +08008700 {0x19, 0x04a11020},
Hui Wang2c609992014-09-03 11:31:08 +08008701 {0x21, 0x0421101f}),
Hui Wang200afc02014-09-03 11:31:10 +08008702 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED,
David Henningssonaec856d2014-09-03 10:23:05 +02008703 ALC282_STANDARD_PINS,
Hui Wang200afc02014-09-03 11:31:10 +08008704 {0x12, 0x90a60140},
Hui Wang200afc02014-09-03 11:31:10 +08008705 {0x19, 0x04a11030},
Hui Wang200afc02014-09-03 11:31:10 +08008706 {0x21, 0x04211020}),
Chris Chiu34cdf402020-12-16 20:52:00 +08008707 SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
8708 ALC282_STANDARD_PINS,
8709 {0x12, 0x90a609c0},
8710 {0x18, 0x03a11830},
8711 {0x19, 0x04a19831},
8712 {0x1a, 0x0481303f},
8713 {0x1b, 0x04211020},
8714 {0x21, 0x0321101f}),
8715 SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
8716 ALC282_STANDARD_PINS,
8717 {0x12, 0x90a60940},
8718 {0x18, 0x03a11830},
8719 {0x19, 0x04a19831},
8720 {0x1a, 0x0481303f},
8721 {0x1b, 0x04211020},
8722 {0x21, 0x0321101f}),
David Henningsson76c21322014-06-24 14:46:54 +02008723 SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02008724 ALC282_STANDARD_PINS,
David Henningsson76c21322014-06-24 14:46:54 +02008725 {0x12, 0x90a60130},
David Henningsson76c21322014-06-24 14:46:54 +02008726 {0x21, 0x0321101f}),
8727 SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
8728 {0x12, 0x90a60160},
8729 {0x14, 0x90170120},
David Henningsson76c21322014-06-24 14:46:54 +02008730 {0x21, 0x02211030}),
Hui Wangbc262172014-09-03 11:31:05 +08008731 SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02008732 ALC282_STANDARD_PINS,
Hui Wangbc262172014-09-03 11:31:05 +08008733 {0x12, 0x90a60130},
Hui Wangbc262172014-09-03 11:31:05 +08008734 {0x19, 0x03a11020},
Hui Wangbc262172014-09-03 11:31:05 +08008735 {0x21, 0x0321101f}),
Kailang Yang607184c2020-12-11 14:17:09 +08008736 SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
8737 {0x14, 0x90170110},
8738 {0x19, 0x04a11040},
8739 {0x21, 0x04211020}),
Hui Wangc8c6ee62019-02-14 11:41:33 +08008740 SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
Hui Wangc4cfcf62018-11-26 14:17:16 +08008741 {0x12, 0x90a60130},
8742 {0x14, 0x90170110},
8743 {0x19, 0x04a11040},
8744 {0x21, 0x04211020}),
Hui Wangc72b9bf2020-12-05 13:11:30 +08008745 SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_HEADSET_JACK,
8746 {0x14, 0x90170110},
8747 {0x17, 0x90170111},
8748 {0x19, 0x03a11030},
8749 {0x21, 0x03211020}),
Chris Chiu33aaebd2018-12-05 14:48:53 +08008750 SND_HDA_PIN_QUIRK(0x10ec0286, 0x1025, "Acer", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
8751 {0x12, 0x90a60130},
8752 {0x17, 0x90170110},
8753 {0x21, 0x02211020}),
Takashi Iwaid44a6862018-06-19 23:04:03 +02008754 SND_HDA_PIN_QUIRK(0x10ec0288, 0x1028, "Dell", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
Kailang Yange1e62b92015-04-08 16:01:22 +08008755 {0x12, 0x90a60120},
Kailang Yange1e62b92015-04-08 16:01:22 +08008756 {0x14, 0x90170110},
Kailang Yange1e62b92015-04-08 16:01:22 +08008757 {0x21, 0x0321101f}),
Hui Wange4442bc2014-09-03 11:31:09 +08008758 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008759 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08008760 {0x15, 0x04211040},
Hui Wange4442bc2014-09-03 11:31:09 +08008761 {0x18, 0x90170112},
Hui Wang11580292015-08-03 11:03:49 +08008762 {0x1a, 0x04a11020}),
Hui Wange4442bc2014-09-03 11:31:09 +08008763 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008764 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08008765 {0x15, 0x04211040},
Hui Wange4442bc2014-09-03 11:31:09 +08008766 {0x18, 0x90170110},
Hui Wang11580292015-08-03 11:03:49 +08008767 {0x1a, 0x04a11020}),
Hui Wange4442bc2014-09-03 11:31:09 +08008768 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008769 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08008770 {0x15, 0x0421101f},
Hui Wang11580292015-08-03 11:03:49 +08008771 {0x1a, 0x04a11020}),
Hui Wange4442bc2014-09-03 11:31:09 +08008772 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008773 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08008774 {0x15, 0x04211020},
Hui Wang11580292015-08-03 11:03:49 +08008775 {0x1a, 0x04a11040}),
Hui Wange4442bc2014-09-03 11:31:09 +08008776 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008777 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08008778 {0x14, 0x90170110},
8779 {0x15, 0x04211020},
Hui Wang11580292015-08-03 11:03:49 +08008780 {0x1a, 0x04a11040}),
Hui Wange4442bc2014-09-03 11:31:09 +08008781 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008782 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08008783 {0x14, 0x90170110},
8784 {0x15, 0x04211020},
Hui Wang11580292015-08-03 11:03:49 +08008785 {0x1a, 0x04a11020}),
Hui Wange4442bc2014-09-03 11:31:09 +08008786 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008787 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08008788 {0x14, 0x90170110},
8789 {0x15, 0x0421101f},
Hui Wang11580292015-08-03 11:03:49 +08008790 {0x1a, 0x04a11020}),
Hui Wange8818fa2014-09-03 11:31:04 +08008791 SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02008792 ALC292_STANDARD_PINS,
Hui Wange8818fa2014-09-03 11:31:04 +08008793 {0x12, 0x90a60140},
Hui Wange8818fa2014-09-03 11:31:04 +08008794 {0x16, 0x01014020},
Hui Wang11580292015-08-03 11:03:49 +08008795 {0x19, 0x01a19030}),
Hui Wange8818fa2014-09-03 11:31:04 +08008796 SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02008797 ALC292_STANDARD_PINS,
Hui Wange8818fa2014-09-03 11:31:04 +08008798 {0x12, 0x90a60140},
Hui Wange8818fa2014-09-03 11:31:04 +08008799 {0x16, 0x01014020},
8800 {0x18, 0x02a19031},
Hui Wang11580292015-08-03 11:03:49 +08008801 {0x19, 0x01a1903e}),
David Henningsson76c21322014-06-24 14:46:54 +02008802 SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02008803 ALC292_STANDARD_PINS,
Hui Wang11580292015-08-03 11:03:49 +08008804 {0x12, 0x90a60140}),
David Henningsson76c21322014-06-24 14:46:54 +02008805 SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02008806 ALC292_STANDARD_PINS,
David Henningsson76c21322014-06-24 14:46:54 +02008807 {0x13, 0x90a60140},
David Henningsson76c21322014-06-24 14:46:54 +02008808 {0x16, 0x21014020},
Hui Wang11580292015-08-03 11:03:49 +08008809 {0x19, 0x21a19030}),
David Henningssone03fdbd2014-06-27 08:41:59 +02008810 SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02008811 ALC292_STANDARD_PINS,
Hui Wang11580292015-08-03 11:03:49 +08008812 {0x13, 0x90a60140}),
Jian-Hong Paneeacd802020-11-24 17:20:25 +08008813 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_HPE,
8814 {0x17, 0x90170110},
8815 {0x21, 0x04211020}),
Chris Chiud8ae4582018-12-07 17:17:11 +08008816 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_MIC,
8817 {0x14, 0x90170110},
8818 {0x1b, 0x90a70130},
8819 {0x21, 0x04211020}),
Jian-Hong Pan0bea4cc2018-12-07 17:17:13 +08008820 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
8821 {0x12, 0x90a60130},
8822 {0x17, 0x90170110},
Jian-Hong Pan8bb37a22019-02-21 17:00:18 +08008823 {0x21, 0x03211020}),
8824 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
8825 {0x12, 0x90a60130},
8826 {0x17, 0x90170110},
Jian-Hong Pan0bea4cc2018-12-07 17:17:13 +08008827 {0x21, 0x04211020}),
Takashi Iwai3887c262019-04-30 15:10:01 +02008828 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
8829 {0x12, 0x90a60130},
8830 {0x17, 0x90170110},
8831 {0x21, 0x03211020}),
Chris Chiu9e433422020-05-12 14:15:24 +08008832 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
Jian-Hong Panad97d662020-05-12 14:15:26 +08008833 {0x12, 0x90a60120},
8834 {0x17, 0x90170110},
8835 {0x21, 0x04211030}),
8836 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
Chris Chiu9e433422020-05-12 14:15:24 +08008837 {0x12, 0x90a60130},
8838 {0x17, 0x90170110},
8839 {0x21, 0x03211020}),
8840 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
8841 {0x12, 0x90a60130},
8842 {0x17, 0x90170110},
8843 {0x21, 0x03211020}),
Kailang Yangfbc57122019-07-15 10:41:50 +08008844 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
Kailang Yang0a29c572019-04-24 16:34:25 +08008845 {0x14, 0x90170110},
8846 {0x21, 0x04211020}),
Kailang Yangfbc57122019-07-15 10:41:50 +08008847 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
8848 {0x14, 0x90170110},
8849 {0x21, 0x04211030}),
Hui Wang3f6409702016-09-11 11:26:16 +08008850 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wangf771d5b2016-10-18 10:59:09 +08008851 ALC295_STANDARD_PINS,
8852 {0x17, 0x21014020},
8853 {0x18, 0x21a19030}),
8854 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
8855 ALC295_STANDARD_PINS,
8856 {0x17, 0x21014040},
8857 {0x18, 0x21a19050}),
Hui Wang3f307832017-03-23 10:00:25 +08008858 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
8859 ALC295_STANDARD_PINS),
Kailang Yang977e6272015-05-18 15:31:20 +08008860 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
Woodrow Shen703867e2015-08-05 12:34:12 +08008861 ALC298_STANDARD_PINS,
Takashi Iwai9f502ff2015-08-05 12:09:45 +02008862 {0x17, 0x90170110}),
8863 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
8864 ALC298_STANDARD_PINS,
Woodrow Shen703867e2015-08-05 12:34:12 +08008865 {0x17, 0x90170140}),
8866 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
8867 ALC298_STANDARD_PINS,
Takashi Iwai9f502ff2015-08-05 12:09:45 +02008868 {0x17, 0x90170150}),
Kai-Heng Feng9f1bc2c42017-02-16 15:26:54 +08008869 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_SPK_VOLUME,
8870 {0x12, 0xb7a60140},
8871 {0x13, 0xb7a60150},
8872 {0x17, 0x90170110},
8873 {0x1a, 0x03011020},
8874 {0x21, 0x03211030}),
James McDonnell54324222019-09-16 14:53:38 +00008875 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
8876 {0x12, 0xb7a60140},
8877 {0x17, 0x90170110},
8878 {0x1a, 0x03a11030},
8879 {0x21, 0x03211020}),
Kailang Yangfcc6c872017-06-29 15:21:27 +08008880 SND_HDA_PIN_QUIRK(0x10ec0299, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
8881 ALC225_STANDARD_PINS,
8882 {0x12, 0xb7a60130},
Kailang Yangfcc6c872017-06-29 15:21:27 +08008883 {0x17, 0x90170110}),
Hui Wang573fcbf2020-06-08 19:55:41 +08008884 SND_HDA_PIN_QUIRK(0x10ec0623, 0x17aa, "Lenovo", ALC283_FIXUP_HEADSET_MIC,
8885 {0x14, 0x01014010},
8886 {0x17, 0x90170120},
8887 {0x18, 0x02a11030},
8888 {0x19, 0x02a1103f},
8889 {0x21, 0x0221101f}),
Hui Wange1918932014-05-26 16:22:44 +08008890 {}
8891};
Takashi Iwai1d045db2011-07-07 18:23:21 +02008892
Hui Wang7c0a6932019-08-16 14:27:40 +08008893/* This is the fallback pin_fixup_tbl for alc269 family, to make the tbl match
8894 * more machines, don't need to match all valid pins, just need to match
8895 * all the pins defined in the tbl. Just because of this reason, it is possible
8896 * that a single machine matches multiple tbls, so there is one limitation:
8897 * at most one tbl is allowed to define for the same vendor and same codec
8898 */
8899static const struct snd_hda_pin_quirk alc269_fallback_pin_fixup_tbl[] = {
8900 SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
8901 {0x19, 0x40000000},
8902 {0x1b, 0x40000000}),
Hui Wangaed8c7f2019-11-21 10:26:43 +08008903 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8904 {0x19, 0x40000000},
8905 {0x1a, 0x40000000}),
Hui Wangd64ebdb2019-11-21 10:26:44 +08008906 SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8907 {0x19, 0x40000000},
8908 {0x1a, 0x40000000}),
Hui Wang5815bdf2019-12-11 13:13:21 +08008909 SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
8910 {0x19, 0x40000000},
8911 {0x1a, 0x40000000}),
Hui Wang7c0a6932019-08-16 14:27:40 +08008912 {}
8913};
8914
Takashi Iwai546bb672012-03-07 08:37:19 +01008915static void alc269_fill_coef(struct hda_codec *codec)
Takashi Iwai1d045db2011-07-07 18:23:21 +02008916{
Kailang Yang526af6e2012-03-07 08:25:20 +01008917 struct alc_spec *spec = codec->spec;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008918 int val;
8919
Kailang Yang526af6e2012-03-07 08:25:20 +01008920 if (spec->codec_variant != ALC269_TYPE_ALC269VB)
Takashi Iwai546bb672012-03-07 08:37:19 +01008921 return;
Kailang Yang526af6e2012-03-07 08:25:20 +01008922
Takashi Iwai1bb7e432011-10-17 16:50:59 +02008923 if ((alc_get_coef0(codec) & 0x00ff) < 0x015) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02008924 alc_write_coef_idx(codec, 0xf, 0x960b);
8925 alc_write_coef_idx(codec, 0xe, 0x8817);
8926 }
8927
Takashi Iwai1bb7e432011-10-17 16:50:59 +02008928 if ((alc_get_coef0(codec) & 0x00ff) == 0x016) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02008929 alc_write_coef_idx(codec, 0xf, 0x960b);
8930 alc_write_coef_idx(codec, 0xe, 0x8814);
8931 }
8932
Takashi Iwai1bb7e432011-10-17 16:50:59 +02008933 if ((alc_get_coef0(codec) & 0x00ff) == 0x017) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02008934 /* Power up output pin */
Takashi Iwai98b24882014-08-18 13:47:50 +02008935 alc_update_coef_idx(codec, 0x04, 0, 1<<11);
Takashi Iwai1d045db2011-07-07 18:23:21 +02008936 }
8937
Takashi Iwai1bb7e432011-10-17 16:50:59 +02008938 if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02008939 val = alc_read_coef_idx(codec, 0xd);
Takashi Iwaif3ee07d2014-08-15 17:35:00 +02008940 if (val != -1 && (val & 0x0c00) >> 10 != 0x1) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02008941 /* Capless ramp up clock control */
8942 alc_write_coef_idx(codec, 0xd, val | (1<<10));
8943 }
8944 val = alc_read_coef_idx(codec, 0x17);
Takashi Iwaif3ee07d2014-08-15 17:35:00 +02008945 if (val != -1 && (val & 0x01c0) >> 6 != 0x4) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02008946 /* Class D power on reset */
8947 alc_write_coef_idx(codec, 0x17, val | (1<<7));
8948 }
8949 }
8950
Takashi Iwai98b24882014-08-18 13:47:50 +02008951 /* HP */
8952 alc_update_coef_idx(codec, 0x4, 0, 1<<11);
Takashi Iwai1d045db2011-07-07 18:23:21 +02008953}
8954
8955/*
8956 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02008957static int patch_alc269(struct hda_codec *codec)
8958{
8959 struct alc_spec *spec;
Takashi Iwai3de95172012-05-07 18:03:15 +02008960 int err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008961
Takashi Iwai3de95172012-05-07 18:03:15 +02008962 err = alc_alloc_spec(codec, 0x0b);
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008963 if (err < 0)
Takashi Iwai3de95172012-05-07 18:03:15 +02008964 return err;
8965
8966 spec = codec->spec;
Takashi Iwai08c189f2012-12-19 15:22:24 +01008967 spec->gen.shared_mic_vref_pin = 0x18;
Kailang Yang317d9312019-05-23 14:43:04 +08008968 codec->power_save_node = 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008969
Takashi Iwai225068a2015-05-29 10:42:14 +02008970#ifdef CONFIG_PM
8971 codec->patch_ops.suspend = alc269_suspend;
8972 codec->patch_ops.resume = alc269_resume;
8973#endif
Kailang Yangc2d6af52017-06-21 14:50:54 +08008974 spec->shutup = alc_default_shutup;
8975 spec->init_hook = alc_default_init;
Takashi Iwai225068a2015-05-29 10:42:14 +02008976
Takashi Iwai7639a062015-03-03 10:07:24 +01008977 switch (codec->core.vendor_id) {
Kailang Yang065380f2013-01-10 10:25:48 +01008978 case 0x10ec0269:
Takashi Iwai1d045db2011-07-07 18:23:21 +02008979 spec->codec_variant = ALC269_TYPE_ALC269VA;
Takashi Iwai1bb7e432011-10-17 16:50:59 +02008980 switch (alc_get_coef0(codec) & 0x00f0) {
8981 case 0x0010:
Takashi Iwai5100cd02014-02-15 10:03:19 +01008982 if (codec->bus->pci &&
8983 codec->bus->pci->subsystem_vendor == 0x1025 &&
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008984 spec->cdefine.platform_type == 1)
Takashi Iwai20ca0c32011-10-17 16:00:35 +02008985 err = alc_codec_rename(codec, "ALC271X");
Takashi Iwai1d045db2011-07-07 18:23:21 +02008986 spec->codec_variant = ALC269_TYPE_ALC269VB;
Takashi Iwai1bb7e432011-10-17 16:50:59 +02008987 break;
8988 case 0x0020:
Takashi Iwai5100cd02014-02-15 10:03:19 +01008989 if (codec->bus->pci &&
8990 codec->bus->pci->subsystem_vendor == 0x17aa &&
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008991 codec->bus->pci->subsystem_device == 0x21f3)
Takashi Iwai20ca0c32011-10-17 16:00:35 +02008992 err = alc_codec_rename(codec, "ALC3202");
Takashi Iwai1d045db2011-07-07 18:23:21 +02008993 spec->codec_variant = ALC269_TYPE_ALC269VC;
Takashi Iwai1bb7e432011-10-17 16:50:59 +02008994 break;
Kailang Yangadcc70b2012-05-25 08:08:38 +02008995 case 0x0030:
8996 spec->codec_variant = ALC269_TYPE_ALC269VD;
8997 break;
Takashi Iwai1bb7e432011-10-17 16:50:59 +02008998 default:
Takashi Iwai1d045db2011-07-07 18:23:21 +02008999 alc_fix_pll_init(codec, 0x20, 0x04, 15);
Takashi Iwai1bb7e432011-10-17 16:50:59 +02009000 }
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02009001 if (err < 0)
9002 goto error;
Kailang Yangc2d6af52017-06-21 14:50:54 +08009003 spec->shutup = alc269_shutup;
Takashi Iwai546bb672012-03-07 08:37:19 +01009004 spec->init_hook = alc269_fill_coef;
Takashi Iwai1d045db2011-07-07 18:23:21 +02009005 alc269_fill_coef(codec);
Kailang Yang065380f2013-01-10 10:25:48 +01009006 break;
9007
9008 case 0x10ec0280:
9009 case 0x10ec0290:
9010 spec->codec_variant = ALC269_TYPE_ALC280;
9011 break;
9012 case 0x10ec0282:
Kailang Yang065380f2013-01-10 10:25:48 +01009013 spec->codec_variant = ALC269_TYPE_ALC282;
Kailang Yang7b5c7a02014-03-18 16:15:54 +08009014 spec->shutup = alc282_shutup;
9015 spec->init_hook = alc282_init;
Kailang Yang065380f2013-01-10 10:25:48 +01009016 break;
Kailang Yang2af02be2013-08-22 10:03:50 +02009017 case 0x10ec0233:
9018 case 0x10ec0283:
9019 spec->codec_variant = ALC269_TYPE_ALC283;
9020 spec->shutup = alc283_shutup;
9021 spec->init_hook = alc283_init;
9022 break;
Kailang Yang065380f2013-01-10 10:25:48 +01009023 case 0x10ec0284:
9024 case 0x10ec0292:
9025 spec->codec_variant = ALC269_TYPE_ALC284;
9026 break;
Kailang Yang161ebf22013-10-24 11:36:33 +02009027 case 0x10ec0293:
Kailang Yang4731d5d2017-06-30 15:22:57 +08009028 spec->codec_variant = ALC269_TYPE_ALC293;
Kailang Yang161ebf22013-10-24 11:36:33 +02009029 break;
Kailang Yang7fc7d042013-04-25 11:04:43 +02009030 case 0x10ec0286:
Kailang Yang7c665932014-04-14 15:09:44 +08009031 case 0x10ec0288:
Kailang Yang7fc7d042013-04-25 11:04:43 +02009032 spec->codec_variant = ALC269_TYPE_ALC286;
9033 break;
Kailang Yang506b62c2014-12-18 17:07:44 +08009034 case 0x10ec0298:
9035 spec->codec_variant = ALC269_TYPE_ALC298;
9036 break;
Kailang Yangea04a1d2018-04-25 15:31:52 +08009037 case 0x10ec0235:
Kailang Yang1d04c9d2013-10-24 11:35:18 +02009038 case 0x10ec0255:
9039 spec->codec_variant = ALC269_TYPE_ALC255;
Kailang Yangab3b8e52018-04-25 16:05:27 +08009040 spec->shutup = alc256_shutup;
9041 spec->init_hook = alc256_init;
Kailang Yang1d04c9d2013-10-24 11:35:18 +02009042 break;
Kailang Yang736f20a2017-10-20 15:06:34 +08009043 case 0x10ec0236:
Kailang Yang4344aec2014-12-17 17:39:05 +08009044 case 0x10ec0256:
9045 spec->codec_variant = ALC269_TYPE_ALC256;
Kailang Yang4a219ef2017-06-16 16:54:35 +08009046 spec->shutup = alc256_shutup;
9047 spec->init_hook = alc256_init;
David Henningsson7d1b6e22015-04-21 10:48:46 +02009048 spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */
Kailang Yang4344aec2014-12-17 17:39:05 +08009049 break;
Kailang Yangf429e7e2017-12-05 15:38:24 +08009050 case 0x10ec0257:
9051 spec->codec_variant = ALC269_TYPE_ALC257;
Kailang Yang88d42b22018-03-14 16:08:57 +08009052 spec->shutup = alc256_shutup;
9053 spec->init_hook = alc256_init;
Kailang Yangf429e7e2017-12-05 15:38:24 +08009054 spec->gen.mixer_nid = 0;
9055 break;
Kailang Yang0a6f0602017-06-30 16:00:48 +08009056 case 0x10ec0215:
Kailang Yang7fbdcd82020-04-23 14:18:31 +08009057 case 0x10ec0245:
Kailang Yang0a6f0602017-06-30 16:00:48 +08009058 case 0x10ec0285:
Kailang Yang630e3612020-05-27 14:10:26 +08009059 case 0x10ec0287:
Kailang Yang0a6f0602017-06-30 16:00:48 +08009060 case 0x10ec0289:
9061 spec->codec_variant = ALC269_TYPE_ALC215;
Kailang Yang1b6832be2018-01-17 15:32:03 +08009062 spec->shutup = alc225_shutup;
9063 spec->init_hook = alc225_init;
Kailang Yang0a6f0602017-06-30 16:00:48 +08009064 spec->gen.mixer_nid = 0;
9065 break;
Kailang Yang42314302016-02-03 15:03:50 +08009066 case 0x10ec0225:
Kailang Yang7d727862016-05-24 16:46:07 +08009067 case 0x10ec0295:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08009068 case 0x10ec0299:
Kailang Yang42314302016-02-03 15:03:50 +08009069 spec->codec_variant = ALC269_TYPE_ALC225;
Kailang Yangda911b12018-01-05 16:50:08 +08009070 spec->shutup = alc225_shutup;
9071 spec->init_hook = alc225_init;
Takashi Iwaic1350bf2017-12-27 09:03:45 +01009072 spec->gen.mixer_nid = 0; /* no loopback on ALC225, ALC295 and ALC299 */
Kailang Yang42314302016-02-03 15:03:50 +08009073 break;
Kailang Yangdcd4f0d2016-05-04 15:50:18 +08009074 case 0x10ec0234:
9075 case 0x10ec0274:
9076 case 0x10ec0294:
9077 spec->codec_variant = ALC269_TYPE_ALC294;
Hui Wang532a7782017-06-26 12:30:32 +08009078 spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */
Kailang Yang71683c32017-06-20 16:33:50 +08009079 alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */
Kailang Yang693abe12019-01-29 15:38:21 +08009080 spec->init_hook = alc294_init;
Kailang Yangdcd4f0d2016-05-04 15:50:18 +08009081 break;
Kailang Yang1078bef2018-11-08 16:36:15 +08009082 case 0x10ec0300:
9083 spec->codec_variant = ALC269_TYPE_ALC300;
9084 spec->gen.mixer_nid = 0; /* no loopback on ALC300 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02009085 break;
Kailang Yangf0778872019-10-24 15:13:32 +08009086 case 0x10ec0623:
9087 spec->codec_variant = ALC269_TYPE_ALC623;
9088 break;
Kailang Yang6fbae352016-05-30 16:44:20 +08009089 case 0x10ec0700:
9090 case 0x10ec0701:
9091 case 0x10ec0703:
Kailang Yang83629532019-05-02 16:03:26 +08009092 case 0x10ec0711:
Kailang Yang6fbae352016-05-30 16:44:20 +08009093 spec->codec_variant = ALC269_TYPE_ALC700;
9094 spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */
Kailang Yang2d7fe612017-11-22 15:21:32 +08009095 alc_update_coef_idx(codec, 0x4a, 1 << 15, 0); /* Combo jack auto trigger control */
Kailang Yang693abe12019-01-29 15:38:21 +08009096 spec->init_hook = alc294_init;
Kailang Yang6fbae352016-05-30 16:44:20 +08009097 break;
9098
Takashi Iwai1d045db2011-07-07 18:23:21 +02009099 }
9100
Kailang Yangad60d502013-06-28 12:03:01 +02009101 if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) {
Kailang Yang97a26572013-11-29 00:35:26 -05009102 spec->has_alc5505_dsp = 1;
Kailang Yangad60d502013-06-28 12:03:01 +02009103 spec->init_hook = alc5505_dsp_init;
9104 }
9105
Takashi Iwaic9af7532019-05-10 11:01:43 +02009106 alc_pre_init(codec);
9107
Takashi Iwaiefe55732018-06-15 11:55:02 +02009108 snd_hda_pick_fixup(codec, alc269_fixup_models,
9109 alc269_fixup_tbl, alc269_fixups);
Hui Wang0fc1e442019-08-16 14:27:39 +08009110 snd_hda_pick_pin_fixup(codec, alc269_pin_fixup_tbl, alc269_fixups, true);
Hui Wang7c0a6932019-08-16 14:27:40 +08009111 snd_hda_pick_pin_fixup(codec, alc269_fallback_pin_fixup_tbl, alc269_fixups, false);
Takashi Iwaiefe55732018-06-15 11:55:02 +02009112 snd_hda_pick_fixup(codec, NULL, alc269_fixup_vendor_tbl,
9113 alc269_fixups);
9114 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
9115
9116 alc_auto_parse_customize_define(codec);
9117
9118 if (has_cdefine_beep(codec))
9119 spec->gen.beep_nid = 0x01;
9120
Takashi Iwaia4297b52011-08-23 18:40:12 +02009121 /* automatic parse from the BIOS config */
9122 err = alc269_parse_auto_config(codec);
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02009123 if (err < 0)
9124 goto error;
Takashi Iwai1d045db2011-07-07 18:23:21 +02009125
Takashi Iwaifea80fa2018-06-20 12:52:46 +02009126 if (!spec->gen.no_analog && spec->gen.beep_nid && spec->gen.mixer_nid) {
9127 err = set_beep_amp(spec, spec->gen.mixer_nid, 0x04, HDA_INPUT);
9128 if (err < 0)
9129 goto error;
9130 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02009131
Takashi Iwai1727a772013-01-10 09:52:52 +01009132 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01009133
Takashi Iwai1d045db2011-07-07 18:23:21 +02009134 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02009135
9136 error:
9137 alc_free(codec);
9138 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02009139}
9140
9141/*
9142 * ALC861
9143 */
9144
Takashi Iwai1d045db2011-07-07 18:23:21 +02009145static int alc861_parse_auto_config(struct hda_codec *codec)
9146{
Takashi Iwai1d045db2011-07-07 18:23:21 +02009147 static const hda_nid_t alc861_ignore[] = { 0x1d, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02009148 static const hda_nid_t alc861_ssids[] = { 0x0e, 0x0f, 0x0b, 0 };
9149 return alc_parse_auto_config(codec, alc861_ignore, alc861_ssids);
Takashi Iwai1d045db2011-07-07 18:23:21 +02009150}
9151
Takashi Iwai1d045db2011-07-07 18:23:21 +02009152/* Pin config fixes */
9153enum {
Takashi Iwaie652f4c2012-02-13 11:56:25 +01009154 ALC861_FIXUP_FSC_AMILO_PI1505,
9155 ALC861_FIXUP_AMP_VREF_0F,
9156 ALC861_FIXUP_NO_JACK_DETECT,
9157 ALC861_FIXUP_ASUS_A6RP,
Takashi Iwai6ddf0fd2013-11-29 12:47:34 +01009158 ALC660_FIXUP_ASUS_W7J,
Takashi Iwai1d045db2011-07-07 18:23:21 +02009159};
9160
Takashi Iwai31150f22012-01-30 10:54:08 +01009161/* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */
9162static void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01009163 const struct hda_fixup *fix, int action)
Takashi Iwai31150f22012-01-30 10:54:08 +01009164{
9165 struct alc_spec *spec = codec->spec;
9166 unsigned int val;
9167
Takashi Iwai1727a772013-01-10 09:52:52 +01009168 if (action != HDA_FIXUP_ACT_INIT)
Takashi Iwai31150f22012-01-30 10:54:08 +01009169 return;
Takashi Iwaid3f02d62013-01-10 10:12:22 +01009170 val = snd_hda_codec_get_pin_target(codec, 0x0f);
Takashi Iwai31150f22012-01-30 10:54:08 +01009171 if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)))
9172 val |= AC_PINCTL_IN_EN;
9173 val |= AC_PINCTL_VREF_50;
Takashi Iwaicdd03ce2012-04-20 12:34:50 +02009174 snd_hda_set_pin_ctl(codec, 0x0f, val);
Takashi Iwai08c189f2012-12-19 15:22:24 +01009175 spec->gen.keep_vref_in_automute = 1;
Takashi Iwai31150f22012-01-30 10:54:08 +01009176}
9177
Takashi Iwaie652f4c2012-02-13 11:56:25 +01009178/* suppress the jack-detection */
9179static void alc_fixup_no_jack_detect(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01009180 const struct hda_fixup *fix, int action)
Takashi Iwaie652f4c2012-02-13 11:56:25 +01009181{
Takashi Iwai1727a772013-01-10 09:52:52 +01009182 if (action == HDA_FIXUP_ACT_PRE_PROBE)
Takashi Iwaie652f4c2012-02-13 11:56:25 +01009183 codec->no_jack_detect = 1;
Jesper Juhl7d7eb9e2012-04-12 22:11:25 +02009184}
Takashi Iwaie652f4c2012-02-13 11:56:25 +01009185
Takashi Iwai1727a772013-01-10 09:52:52 +01009186static const struct hda_fixup alc861_fixups[] = {
Takashi Iwaie652f4c2012-02-13 11:56:25 +01009187 [ALC861_FIXUP_FSC_AMILO_PI1505] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009188 .type = HDA_FIXUP_PINS,
9189 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02009190 { 0x0b, 0x0221101f }, /* HP */
9191 { 0x0f, 0x90170310 }, /* speaker */
9192 { }
9193 }
9194 },
Takashi Iwaie652f4c2012-02-13 11:56:25 +01009195 [ALC861_FIXUP_AMP_VREF_0F] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009196 .type = HDA_FIXUP_FUNC,
Takashi Iwai31150f22012-01-30 10:54:08 +01009197 .v.func = alc861_fixup_asus_amp_vref_0f,
Takashi Iwai3b25eb62012-01-25 09:55:46 +01009198 },
Takashi Iwaie652f4c2012-02-13 11:56:25 +01009199 [ALC861_FIXUP_NO_JACK_DETECT] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009200 .type = HDA_FIXUP_FUNC,
Takashi Iwaie652f4c2012-02-13 11:56:25 +01009201 .v.func = alc_fixup_no_jack_detect,
9202 },
9203 [ALC861_FIXUP_ASUS_A6RP] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009204 .type = HDA_FIXUP_FUNC,
Takashi Iwaie652f4c2012-02-13 11:56:25 +01009205 .v.func = alc861_fixup_asus_amp_vref_0f,
9206 .chained = true,
9207 .chain_id = ALC861_FIXUP_NO_JACK_DETECT,
Takashi Iwai6ddf0fd2013-11-29 12:47:34 +01009208 },
9209 [ALC660_FIXUP_ASUS_W7J] = {
9210 .type = HDA_FIXUP_VERBS,
9211 .v.verbs = (const struct hda_verb[]) {
9212 /* ASUS W7J needs a magic pin setup on unused NID 0x10
9213 * for enabling outputs
9214 */
9215 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
9216 { }
9217 },
Takashi Iwaie652f4c2012-02-13 11:56:25 +01009218 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02009219};
9220
9221static const struct snd_pci_quirk alc861_fixup_tbl[] = {
Takashi Iwai6ddf0fd2013-11-29 12:47:34 +01009222 SND_PCI_QUIRK(0x1043, 0x1253, "ASUS W7J", ALC660_FIXUP_ASUS_W7J),
Takashi Iwaie7ca2372013-12-02 15:27:19 +01009223 SND_PCI_QUIRK(0x1043, 0x1263, "ASUS Z35HL", ALC660_FIXUP_ASUS_W7J),
Takashi Iwaie652f4c2012-02-13 11:56:25 +01009224 SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP),
9225 SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", ALC861_FIXUP_AMP_VREF_0F),
9226 SND_PCI_QUIRK(0x1462, 0x7254, "HP DX2200", ALC861_FIXUP_NO_JACK_DETECT),
9227 SND_PCI_QUIRK(0x1584, 0x2b01, "Haier W18", ALC861_FIXUP_AMP_VREF_0F),
9228 SND_PCI_QUIRK(0x1584, 0x0000, "Uniwill ECS M31EI", ALC861_FIXUP_AMP_VREF_0F),
9229 SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", ALC861_FIXUP_FSC_AMILO_PI1505),
Takashi Iwai1d045db2011-07-07 18:23:21 +02009230 {}
9231};
9232
9233/*
9234 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02009235static int patch_alc861(struct hda_codec *codec)
9236{
9237 struct alc_spec *spec;
Takashi Iwai1d045db2011-07-07 18:23:21 +02009238 int err;
9239
Takashi Iwai3de95172012-05-07 18:03:15 +02009240 err = alc_alloc_spec(codec, 0x15);
9241 if (err < 0)
9242 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02009243
Takashi Iwai3de95172012-05-07 18:03:15 +02009244 spec = codec->spec;
Takashi Iwai2722b532019-08-22 09:55:37 +02009245 if (has_cdefine_beep(codec))
9246 spec->gen.beep_nid = 0x23;
Takashi Iwai1d045db2011-07-07 18:23:21 +02009247
Takashi Iwai225068a2015-05-29 10:42:14 +02009248#ifdef CONFIG_PM
9249 spec->power_hook = alc_power_eapd;
9250#endif
9251
Takashi Iwaic9af7532019-05-10 11:01:43 +02009252 alc_pre_init(codec);
9253
Takashi Iwai1727a772013-01-10 09:52:52 +01009254 snd_hda_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);
9255 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai1d045db2011-07-07 18:23:21 +02009256
Takashi Iwaicb4e4822011-08-23 17:34:25 +02009257 /* automatic parse from the BIOS config */
9258 err = alc861_parse_auto_config(codec);
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02009259 if (err < 0)
9260 goto error;
Takashi Iwai1d045db2011-07-07 18:23:21 +02009261
Takashi Iwaifea80fa2018-06-20 12:52:46 +02009262 if (!spec->gen.no_analog) {
9263 err = set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
9264 if (err < 0)
9265 goto error;
9266 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02009267
Takashi Iwai1727a772013-01-10 09:52:52 +01009268 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01009269
Takashi Iwai1d045db2011-07-07 18:23:21 +02009270 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02009271
9272 error:
9273 alc_free(codec);
9274 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02009275}
9276
9277/*
9278 * ALC861-VD support
9279 *
9280 * Based on ALC882
9281 *
9282 * In addition, an independent DAC
9283 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02009284static int alc861vd_parse_auto_config(struct hda_codec *codec)
9285{
Takashi Iwai1d045db2011-07-07 18:23:21 +02009286 static const hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02009287 static const hda_nid_t alc861vd_ssids[] = { 0x15, 0x1b, 0x14, 0 };
9288 return alc_parse_auto_config(codec, alc861vd_ignore, alc861vd_ssids);
Takashi Iwai1d045db2011-07-07 18:23:21 +02009289}
9290
Takashi Iwai1d045db2011-07-07 18:23:21 +02009291enum {
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02009292 ALC660VD_FIX_ASUS_GPIO1,
9293 ALC861VD_FIX_DALLAS,
Takashi Iwai1d045db2011-07-07 18:23:21 +02009294};
9295
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02009296/* exclude VREF80 */
9297static void alc861vd_fixup_dallas(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01009298 const struct hda_fixup *fix, int action)
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02009299{
Takashi Iwai1727a772013-01-10 09:52:52 +01009300 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwaib78562b2012-12-17 20:06:49 +01009301 snd_hda_override_pin_caps(codec, 0x18, 0x00000734);
9302 snd_hda_override_pin_caps(codec, 0x19, 0x0000073c);
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02009303 }
9304}
9305
Takashi Iwaidf73d832018-06-19 23:05:47 +02009306/* reset GPIO1 */
9307static void alc660vd_fixup_asus_gpio1(struct hda_codec *codec,
9308 const struct hda_fixup *fix, int action)
9309{
9310 struct alc_spec *spec = codec->spec;
9311
9312 if (action == HDA_FIXUP_ACT_PRE_PROBE)
9313 spec->gpio_mask |= 0x02;
9314 alc_fixup_gpio(codec, action, 0x01);
9315}
9316
Takashi Iwai1727a772013-01-10 09:52:52 +01009317static const struct hda_fixup alc861vd_fixups[] = {
Takashi Iwai1d045db2011-07-07 18:23:21 +02009318 [ALC660VD_FIX_ASUS_GPIO1] = {
Takashi Iwaidf73d832018-06-19 23:05:47 +02009319 .type = HDA_FIXUP_FUNC,
9320 .v.func = alc660vd_fixup_asus_gpio1,
Takashi Iwai1d045db2011-07-07 18:23:21 +02009321 },
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02009322 [ALC861VD_FIX_DALLAS] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009323 .type = HDA_FIXUP_FUNC,
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02009324 .v.func = alc861vd_fixup_dallas,
9325 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02009326};
9327
9328static const struct snd_pci_quirk alc861vd_fixup_tbl[] = {
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02009329 SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_FIX_DALLAS),
Takashi Iwai1d045db2011-07-07 18:23:21 +02009330 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02009331 SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_FIX_DALLAS),
Takashi Iwai1d045db2011-07-07 18:23:21 +02009332 {}
9333};
9334
Takashi Iwai1d045db2011-07-07 18:23:21 +02009335/*
9336 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02009337static int patch_alc861vd(struct hda_codec *codec)
9338{
9339 struct alc_spec *spec;
Takashi Iwaicb4e4822011-08-23 17:34:25 +02009340 int err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02009341
Takashi Iwai3de95172012-05-07 18:03:15 +02009342 err = alc_alloc_spec(codec, 0x0b);
9343 if (err < 0)
9344 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02009345
Takashi Iwai3de95172012-05-07 18:03:15 +02009346 spec = codec->spec;
Takashi Iwai2722b532019-08-22 09:55:37 +02009347 if (has_cdefine_beep(codec))
9348 spec->gen.beep_nid = 0x23;
Takashi Iwai1d045db2011-07-07 18:23:21 +02009349
Takashi Iwai225068a2015-05-29 10:42:14 +02009350 spec->shutup = alc_eapd_shutup;
9351
Takashi Iwaic9af7532019-05-10 11:01:43 +02009352 alc_pre_init(codec);
9353
Takashi Iwai1727a772013-01-10 09:52:52 +01009354 snd_hda_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);
9355 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai1d045db2011-07-07 18:23:21 +02009356
Takashi Iwaicb4e4822011-08-23 17:34:25 +02009357 /* automatic parse from the BIOS config */
9358 err = alc861vd_parse_auto_config(codec);
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02009359 if (err < 0)
9360 goto error;
Takashi Iwai1d045db2011-07-07 18:23:21 +02009361
Takashi Iwaifea80fa2018-06-20 12:52:46 +02009362 if (!spec->gen.no_analog) {
9363 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
9364 if (err < 0)
9365 goto error;
9366 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02009367
Takashi Iwai1727a772013-01-10 09:52:52 +01009368 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01009369
Takashi Iwai1d045db2011-07-07 18:23:21 +02009370 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02009371
9372 error:
9373 alc_free(codec);
9374 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02009375}
9376
9377/*
9378 * ALC662 support
9379 *
9380 * ALC662 is almost identical with ALC880 but has cleaner and more flexible
9381 * configuration. Each pin widget can choose any input DACs and a mixer.
9382 * Each ADC is connected from a mixer of all inputs. This makes possible
9383 * 6-channel independent captures.
9384 *
9385 * In addition, an independent DAC for the multi-playback (not used in this
9386 * driver yet).
9387 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02009388
9389/*
9390 * BIOS auto configuration
9391 */
9392
Kailang Yangbc9f98a2007-04-12 13:06:07 +02009393static int alc662_parse_auto_config(struct hda_codec *codec)
9394{
Takashi Iwai4c6d72d2011-05-02 11:30:18 +02009395 static const hda_nid_t alc662_ignore[] = { 0x1d, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02009396 static const hda_nid_t alc663_ssids[] = { 0x15, 0x1b, 0x14, 0x21 };
9397 static const hda_nid_t alc662_ssids[] = { 0x15, 0x1b, 0x14, 0 };
9398 const hda_nid_t *ssids;
Takashi Iwaiee979a142008-09-02 15:42:20 +02009399
Takashi Iwai7639a062015-03-03 10:07:24 +01009400 if (codec->core.vendor_id == 0x10ec0272 || codec->core.vendor_id == 0x10ec0663 ||
9401 codec->core.vendor_id == 0x10ec0665 || codec->core.vendor_id == 0x10ec0670 ||
9402 codec->core.vendor_id == 0x10ec0671)
Takashi Iwai3e6179b2011-07-08 16:55:13 +02009403 ssids = alc663_ssids;
Kailang Yang6227cdc2010-02-25 08:36:52 +01009404 else
Takashi Iwai3e6179b2011-07-08 16:55:13 +02009405 ssids = alc662_ssids;
9406 return alc_parse_auto_config(codec, alc662_ignore, ssids);
Kailang Yangbc9f98a2007-04-12 13:06:07 +02009407}
9408
Todd Broch6be79482010-12-07 16:51:05 -08009409static void alc272_fixup_mario(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01009410 const struct hda_fixup *fix, int action)
Takashi Iwai6fc398c2011-01-13 14:36:37 +01009411{
Takashi Iwai9bb1f062013-01-10 17:14:29 +01009412 if (action != HDA_FIXUP_ACT_PRE_PROBE)
Takashi Iwai6fc398c2011-01-13 14:36:37 +01009413 return;
Todd Broch6be79482010-12-07 16:51:05 -08009414 if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
9415 (0x3b << AC_AMPCAP_OFFSET_SHIFT) |
9416 (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |
9417 (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |
9418 (0 << AC_AMPCAP_MUTE_SHIFT)))
Takashi Iwai4e76a882014-02-25 12:21:03 +01009419 codec_warn(codec, "failed to override amp caps for NID 0x2\n");
Todd Broch6be79482010-12-07 16:51:05 -08009420}
9421
Takashi Iwai8e383952013-10-30 17:41:12 +01009422static const struct snd_pcm_chmap_elem asus_pcm_2_1_chmaps[] = {
9423 { .channels = 2,
9424 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
9425 { .channels = 4,
9426 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
9427 SNDRV_CHMAP_NA, SNDRV_CHMAP_LFE } }, /* LFE only on right */
9428 { }
9429};
9430
9431/* override the 2.1 chmap */
Takashi Iwaieb9ca3a2013-11-28 15:24:34 +01009432static void alc_fixup_bass_chmap(struct hda_codec *codec,
Takashi Iwai8e383952013-10-30 17:41:12 +01009433 const struct hda_fixup *fix, int action)
9434{
9435 if (action == HDA_FIXUP_ACT_BUILD) {
9436 struct alc_spec *spec = codec->spec;
Takashi Iwaibbbc7e82015-02-27 17:43:19 +01009437 spec->gen.pcm_rec[0]->stream[0].chmap = asus_pcm_2_1_chmaps;
Takashi Iwai8e383952013-10-30 17:41:12 +01009438 }
9439}
9440
Takashi Iwaibf686652014-01-13 16:18:25 +01009441/* avoid D3 for keeping GPIO up */
9442static unsigned int gpio_led_power_filter(struct hda_codec *codec,
9443 hda_nid_t nid,
9444 unsigned int power_state)
9445{
9446 struct alc_spec *spec = codec->spec;
Takashi Iwaid261eec2018-06-19 22:32:29 +02009447 if (nid == codec->core.afg && power_state == AC_PWRST_D3 && spec->gpio_data)
Takashi Iwaibf686652014-01-13 16:18:25 +01009448 return AC_PWRST_D0;
9449 return power_state;
9450}
9451
Takashi Iwai3e887f32014-01-10 17:50:58 +01009452static void alc662_fixup_led_gpio1(struct hda_codec *codec,
9453 const struct hda_fixup *fix, int action)
9454{
9455 struct alc_spec *spec = codec->spec;
Takashi Iwai3e887f32014-01-10 17:50:58 +01009456
Takashi Iwai01e4a272018-06-19 22:47:30 +02009457 alc_fixup_hp_gpio_led(codec, action, 0x01, 0);
Takashi Iwai3e887f32014-01-10 17:50:58 +01009458 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai0f32fd192014-11-19 12:16:14 +01009459 spec->mute_led_polarity = 1;
Takashi Iwaibf686652014-01-13 16:18:25 +01009460 codec->power_filter = gpio_led_power_filter;
Takashi Iwai3e887f32014-01-10 17:50:58 +01009461 }
9462}
9463
Kailang Yangc6790c82016-11-25 16:15:17 +08009464static void alc662_usi_automute_hook(struct hda_codec *codec,
9465 struct hda_jack_callback *jack)
9466{
9467 struct alc_spec *spec = codec->spec;
9468 int vref;
9469 msleep(200);
9470 snd_hda_gen_hp_automute(codec, jack);
9471
9472 vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
9473 msleep(100);
9474 snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
9475 vref);
9476}
9477
9478static void alc662_fixup_usi_headset_mic(struct hda_codec *codec,
9479 const struct hda_fixup *fix, int action)
9480{
9481 struct alc_spec *spec = codec->spec;
9482 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
9483 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
9484 spec->gen.hp_automute_hook = alc662_usi_automute_hook;
9485 }
9486}
9487
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02009488static void alc662_aspire_ethos_mute_speakers(struct hda_codec *codec,
9489 struct hda_jack_callback *cb)
9490{
9491 /* surround speakers at 0x1b already get muted automatically when
9492 * headphones are plugged in, but we have to mute/unmute the remaining
9493 * channels manually:
9494 * 0x15 - front left/front right
9495 * 0x18 - front center/ LFE
9496 */
9497 if (snd_hda_jack_detect_state(codec, 0x1b) == HDA_JACK_PRESENT) {
9498 snd_hda_set_pin_ctl_cache(codec, 0x15, 0);
9499 snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
9500 } else {
9501 snd_hda_set_pin_ctl_cache(codec, 0x15, PIN_OUT);
9502 snd_hda_set_pin_ctl_cache(codec, 0x18, PIN_OUT);
9503 }
9504}
9505
9506static void alc662_fixup_aspire_ethos_hp(struct hda_codec *codec,
9507 const struct hda_fixup *fix, int action)
9508{
9509 /* Pin 0x1b: shared headphones jack and surround speakers */
9510 if (!is_jack_detectable(codec, 0x1b))
9511 return;
9512
9513 switch (action) {
9514 case HDA_FIXUP_ACT_PRE_PROBE:
9515 snd_hda_jack_detect_enable_callback(codec, 0x1b,
9516 alc662_aspire_ethos_mute_speakers);
Takashi Iwai336820c2019-11-28 21:26:30 +01009517 /* subwoofer needs an extra GPIO setting to become audible */
9518 alc_setup_gpio(codec, 0x02);
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02009519 break;
9520 case HDA_FIXUP_ACT_INIT:
9521 /* Make sure to start in a correct state, i.e. if
9522 * headphones have been plugged in before powering up the system
9523 */
9524 alc662_aspire_ethos_mute_speakers(codec, NULL);
9525 break;
9526 }
9527}
9528
Kailang Yang5af290282020-01-17 14:04:01 +08009529static void alc671_fixup_hp_headset_mic2(struct hda_codec *codec,
9530 const struct hda_fixup *fix, int action)
9531{
9532 struct alc_spec *spec = codec->spec;
9533
9534 static const struct hda_pintbl pincfgs[] = {
9535 { 0x19, 0x02a11040 }, /* use as headset mic, with its own jack detect */
9536 { 0x1b, 0x0181304f },
9537 { }
9538 };
9539
9540 switch (action) {
9541 case HDA_FIXUP_ACT_PRE_PROBE:
9542 spec->gen.mixer_nid = 0;
9543 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
9544 snd_hda_apply_pincfgs(codec, pincfgs);
9545 break;
9546 case HDA_FIXUP_ACT_INIT:
9547 alc_write_coef_idx(codec, 0x19, 0xa054);
9548 break;
9549 }
9550}
9551
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01009552static const struct coef_fw alc668_coefs[] = {
Kailang Yangf3f91852014-10-24 15:43:46 +08009553 WRITE_COEF(0x01, 0xbebe), WRITE_COEF(0x02, 0xaaaa), WRITE_COEF(0x03, 0x0),
9554 WRITE_COEF(0x04, 0x0180), WRITE_COEF(0x06, 0x0), WRITE_COEF(0x07, 0x0f80),
9555 WRITE_COEF(0x08, 0x0031), WRITE_COEF(0x0a, 0x0060), WRITE_COEF(0x0b, 0x0),
9556 WRITE_COEF(0x0c, 0x7cf7), WRITE_COEF(0x0d, 0x1080), WRITE_COEF(0x0e, 0x7f7f),
9557 WRITE_COEF(0x0f, 0xcccc), WRITE_COEF(0x10, 0xddcc), WRITE_COEF(0x11, 0x0001),
9558 WRITE_COEF(0x13, 0x0), WRITE_COEF(0x14, 0x2aa0), WRITE_COEF(0x17, 0xa940),
9559 WRITE_COEF(0x19, 0x0), WRITE_COEF(0x1a, 0x0), WRITE_COEF(0x1b, 0x0),
9560 WRITE_COEF(0x1c, 0x0), WRITE_COEF(0x1d, 0x0), WRITE_COEF(0x1e, 0x7418),
9561 WRITE_COEF(0x1f, 0x0804), WRITE_COEF(0x20, 0x4200), WRITE_COEF(0x21, 0x0468),
9562 WRITE_COEF(0x22, 0x8ccc), WRITE_COEF(0x23, 0x0250), WRITE_COEF(0x24, 0x7418),
9563 WRITE_COEF(0x27, 0x0), WRITE_COEF(0x28, 0x8ccc), WRITE_COEF(0x2a, 0xff00),
9564 WRITE_COEF(0x2b, 0x8000), WRITE_COEF(0xa7, 0xff00), WRITE_COEF(0xa8, 0x8000),
9565 WRITE_COEF(0xaa, 0x2e17), WRITE_COEF(0xab, 0xa0c0), WRITE_COEF(0xac, 0x0),
9566 WRITE_COEF(0xad, 0x0), WRITE_COEF(0xae, 0x2ac6), WRITE_COEF(0xaf, 0xa480),
9567 WRITE_COEF(0xb0, 0x0), WRITE_COEF(0xb1, 0x0), WRITE_COEF(0xb2, 0x0),
9568 WRITE_COEF(0xb3, 0x0), WRITE_COEF(0xb4, 0x0), WRITE_COEF(0xb5, 0x1040),
9569 WRITE_COEF(0xb6, 0xd697), WRITE_COEF(0xb7, 0x902b), WRITE_COEF(0xb8, 0xd697),
9570 WRITE_COEF(0xb9, 0x902b), WRITE_COEF(0xba, 0xb8ba), WRITE_COEF(0xbb, 0xaaab),
9571 WRITE_COEF(0xbc, 0xaaaf), WRITE_COEF(0xbd, 0x6aaa), WRITE_COEF(0xbe, 0x1c02),
9572 WRITE_COEF(0xc0, 0x00ff), WRITE_COEF(0xc1, 0x0fa6),
9573 {}
9574};
9575
9576static void alc668_restore_default_value(struct hda_codec *codec)
9577{
9578 alc_process_coef_fw(codec, alc668_coefs);
9579}
9580
David Henningsson6cb3b702010-09-09 08:51:44 +02009581enum {
Daniel T Chen2df03512010-10-10 22:39:28 -04009582 ALC662_FIXUP_ASPIRE,
Takashi Iwai3e887f32014-01-10 17:50:58 +01009583 ALC662_FIXUP_LED_GPIO1,
David Henningsson6cb3b702010-09-09 08:51:44 +02009584 ALC662_FIXUP_IDEAPAD,
Todd Broch6be79482010-12-07 16:51:05 -08009585 ALC272_FIXUP_MARIO,
Huacai Chenf1ec5be2020-08-02 17:26:40 +08009586 ALC662_FIXUP_CZC_ET26,
Anisse Astierd2ebd472011-01-20 12:36:21 +01009587 ALC662_FIXUP_CZC_P10T,
David Henningsson94024cd2011-04-29 14:10:55 +02009588 ALC662_FIXUP_SKU_IGNORE,
Takashi Iwaie59ea3e2011-06-29 17:21:00 +02009589 ALC662_FIXUP_HP_RP5800,
Takashi Iwai53c334a2011-08-23 18:27:14 +02009590 ALC662_FIXUP_ASUS_MODE1,
9591 ALC662_FIXUP_ASUS_MODE2,
9592 ALC662_FIXUP_ASUS_MODE3,
9593 ALC662_FIXUP_ASUS_MODE4,
9594 ALC662_FIXUP_ASUS_MODE5,
9595 ALC662_FIXUP_ASUS_MODE6,
9596 ALC662_FIXUP_ASUS_MODE7,
9597 ALC662_FIXUP_ASUS_MODE8,
Takashi Iwai1565cc32012-02-13 12:03:25 +01009598 ALC662_FIXUP_NO_JACK_DETECT,
David Henningssonedfe3bf2012-06-12 13:15:12 +02009599 ALC662_FIXUP_ZOTAC_Z68,
Takashi Iwai125821a2012-06-22 14:30:29 +02009600 ALC662_FIXUP_INV_DMIC,
David Henningsson1f8b46c2015-05-12 14:38:15 +02009601 ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
David Henningsson73bdd592013-04-15 15:44:14 +02009602 ALC668_FIXUP_DELL_MIC_NO_PRESENCE,
David Henningsson1f8b46c2015-05-12 14:38:15 +02009603 ALC662_FIXUP_HEADSET_MODE,
David Henningsson73bdd592013-04-15 15:44:14 +02009604 ALC668_FIXUP_HEADSET_MODE,
David Henningsson8e54b4a2014-02-07 09:31:07 +01009605 ALC662_FIXUP_BASS_MODE4_CHMAP,
David Henningsson61a75f12014-02-07 09:31:08 +01009606 ALC662_FIXUP_BASS_16,
Takashi Iwaia30c9aa2013-11-21 08:00:20 +01009607 ALC662_FIXUP_BASS_1A,
David Henningsson8e54b4a2014-02-07 09:31:07 +01009608 ALC662_FIXUP_BASS_CHMAP,
Hui Wang493a52a2014-01-14 14:07:36 +08009609 ALC668_FIXUP_AUTO_MUTE,
Gabriele Mazzotta5e6db662014-05-20 18:58:26 +02009610 ALC668_FIXUP_DELL_DISABLE_AAMIX,
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +02009611 ALC668_FIXUP_DELL_XPS13,
Bobi Mihalca9d4dc582016-03-23 13:26:11 +02009612 ALC662_FIXUP_ASUS_Nx50,
Mikhail Paulyshkafc7438b2017-04-21 08:52:42 +02009613 ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
Yura Pakhuchiy3231e202016-05-07 23:53:36 +07009614 ALC668_FIXUP_ASUS_Nx51,
Takashi Iwai5b7c5e12018-10-09 14:20:17 +02009615 ALC668_FIXUP_MIC_COEF,
Takashi Iwai11ba6112018-10-07 09:44:17 +02009616 ALC668_FIXUP_ASUS_G751,
Kailang Yang78f4f7c2016-06-07 11:31:34 +08009617 ALC891_FIXUP_HEADSET_MODE,
9618 ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
Shrirang Bagul9b51fe32016-08-01 13:16:17 +08009619 ALC662_FIXUP_ACER_VERITON,
Takashi Iwai1a3f0992016-10-20 12:14:51 +02009620 ALC892_FIXUP_ASROCK_MOBO,
Kailang Yangc6790c82016-11-25 16:15:17 +08009621 ALC662_FIXUP_USI_FUNC,
9622 ALC662_FIXUP_USI_HEADSET_MODE,
Kailang Yangca169cc2017-04-25 16:17:40 +08009623 ALC662_FIXUP_LENOVO_MULTI_CODECS,
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02009624 ALC669_FIXUP_ACER_ASPIRE_ETHOS,
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02009625 ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET,
Kailang Yang5af290282020-01-17 14:04:01 +08009626 ALC671_FIXUP_HP_HEADSET_MIC2,
Jian-Hong Pand858c702020-03-17 16:28:07 +08009627 ALC662_FIXUP_ACER_X2660G_HEADSET_MODE,
Jian-Hong Pana1244582020-03-17 16:28:09 +08009628 ALC662_FIXUP_ACER_NITRO_HEADSET_MODE,
David Henningsson6cb3b702010-09-09 08:51:44 +02009629};
9630
Takashi Iwai1727a772013-01-10 09:52:52 +01009631static const struct hda_fixup alc662_fixups[] = {
Daniel T Chen2df03512010-10-10 22:39:28 -04009632 [ALC662_FIXUP_ASPIRE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009633 .type = HDA_FIXUP_PINS,
9634 .v.pins = (const struct hda_pintbl[]) {
Daniel T Chen2df03512010-10-10 22:39:28 -04009635 { 0x15, 0x99130112 }, /* subwoofer */
9636 { }
9637 }
9638 },
Takashi Iwai3e887f32014-01-10 17:50:58 +01009639 [ALC662_FIXUP_LED_GPIO1] = {
9640 .type = HDA_FIXUP_FUNC,
9641 .v.func = alc662_fixup_led_gpio1,
9642 },
David Henningsson6cb3b702010-09-09 08:51:44 +02009643 [ALC662_FIXUP_IDEAPAD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009644 .type = HDA_FIXUP_PINS,
9645 .v.pins = (const struct hda_pintbl[]) {
David Henningsson6cb3b702010-09-09 08:51:44 +02009646 { 0x17, 0x99130112 }, /* subwoofer */
9647 { }
Takashi Iwai3e887f32014-01-10 17:50:58 +01009648 },
9649 .chained = true,
9650 .chain_id = ALC662_FIXUP_LED_GPIO1,
David Henningsson6cb3b702010-09-09 08:51:44 +02009651 },
Todd Broch6be79482010-12-07 16:51:05 -08009652 [ALC272_FIXUP_MARIO] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009653 .type = HDA_FIXUP_FUNC,
Takashi Iwaib5bfbc62011-01-13 14:22:32 +01009654 .v.func = alc272_fixup_mario,
Anisse Astierd2ebd472011-01-20 12:36:21 +01009655 },
Huacai Chenf1ec5be2020-08-02 17:26:40 +08009656 [ALC662_FIXUP_CZC_ET26] = {
9657 .type = HDA_FIXUP_PINS,
9658 .v.pins = (const struct hda_pintbl[]) {
9659 {0x12, 0x403cc000},
9660 {0x14, 0x90170110}, /* speaker */
9661 {0x15, 0x411111f0},
9662 {0x16, 0x411111f0},
9663 {0x18, 0x01a19030}, /* mic */
9664 {0x19, 0x90a7013f}, /* int-mic */
9665 {0x1a, 0x01014020},
9666 {0x1b, 0x0121401f},
9667 {0x1c, 0x411111f0},
9668 {0x1d, 0x411111f0},
9669 {0x1e, 0x40478e35},
9670 {}
9671 },
9672 .chained = true,
9673 .chain_id = ALC662_FIXUP_SKU_IGNORE
9674 },
Anisse Astierd2ebd472011-01-20 12:36:21 +01009675 [ALC662_FIXUP_CZC_P10T] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009676 .type = HDA_FIXUP_VERBS,
Anisse Astierd2ebd472011-01-20 12:36:21 +01009677 .v.verbs = (const struct hda_verb[]) {
9678 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
9679 {}
9680 }
9681 },
David Henningsson94024cd2011-04-29 14:10:55 +02009682 [ALC662_FIXUP_SKU_IGNORE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009683 .type = HDA_FIXUP_FUNC,
Takashi Iwai23d30f22012-05-07 17:17:32 +02009684 .v.func = alc_fixup_sku_ignore,
Takashi Iwaic6b35872011-03-28 12:05:31 +02009685 },
Takashi Iwaie59ea3e2011-06-29 17:21:00 +02009686 [ALC662_FIXUP_HP_RP5800] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009687 .type = HDA_FIXUP_PINS,
9688 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaie59ea3e2011-06-29 17:21:00 +02009689 { 0x14, 0x0221201f }, /* HP out */
9690 { }
9691 },
9692 .chained = true,
9693 .chain_id = ALC662_FIXUP_SKU_IGNORE
9694 },
Takashi Iwai53c334a2011-08-23 18:27:14 +02009695 [ALC662_FIXUP_ASUS_MODE1] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009696 .type = HDA_FIXUP_PINS,
9697 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02009698 { 0x14, 0x99130110 }, /* speaker */
9699 { 0x18, 0x01a19c20 }, /* mic */
9700 { 0x19, 0x99a3092f }, /* int-mic */
9701 { 0x21, 0x0121401f }, /* HP out */
9702 { }
9703 },
9704 .chained = true,
9705 .chain_id = ALC662_FIXUP_SKU_IGNORE
9706 },
9707 [ALC662_FIXUP_ASUS_MODE2] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009708 .type = HDA_FIXUP_PINS,
9709 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai2996bdb2011-08-18 16:02:24 +02009710 { 0x14, 0x99130110 }, /* speaker */
9711 { 0x18, 0x01a19820 }, /* mic */
9712 { 0x19, 0x99a3092f }, /* int-mic */
9713 { 0x1b, 0x0121401f }, /* HP out */
9714 { }
9715 },
Takashi Iwai53c334a2011-08-23 18:27:14 +02009716 .chained = true,
9717 .chain_id = ALC662_FIXUP_SKU_IGNORE
9718 },
9719 [ALC662_FIXUP_ASUS_MODE3] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009720 .type = HDA_FIXUP_PINS,
9721 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02009722 { 0x14, 0x99130110 }, /* speaker */
9723 { 0x15, 0x0121441f }, /* HP */
9724 { 0x18, 0x01a19840 }, /* mic */
9725 { 0x19, 0x99a3094f }, /* int-mic */
9726 { 0x21, 0x01211420 }, /* HP2 */
9727 { }
9728 },
9729 .chained = true,
9730 .chain_id = ALC662_FIXUP_SKU_IGNORE
9731 },
9732 [ALC662_FIXUP_ASUS_MODE4] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009733 .type = HDA_FIXUP_PINS,
9734 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02009735 { 0x14, 0x99130110 }, /* speaker */
9736 { 0x16, 0x99130111 }, /* speaker */
9737 { 0x18, 0x01a19840 }, /* mic */
9738 { 0x19, 0x99a3094f }, /* int-mic */
9739 { 0x21, 0x0121441f }, /* HP */
9740 { }
9741 },
9742 .chained = true,
9743 .chain_id = ALC662_FIXUP_SKU_IGNORE
9744 },
9745 [ALC662_FIXUP_ASUS_MODE5] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009746 .type = HDA_FIXUP_PINS,
9747 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02009748 { 0x14, 0x99130110 }, /* speaker */
9749 { 0x15, 0x0121441f }, /* HP */
9750 { 0x16, 0x99130111 }, /* speaker */
9751 { 0x18, 0x01a19840 }, /* mic */
9752 { 0x19, 0x99a3094f }, /* int-mic */
9753 { }
9754 },
9755 .chained = true,
9756 .chain_id = ALC662_FIXUP_SKU_IGNORE
9757 },
9758 [ALC662_FIXUP_ASUS_MODE6] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009759 .type = HDA_FIXUP_PINS,
9760 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02009761 { 0x14, 0x99130110 }, /* speaker */
9762 { 0x15, 0x01211420 }, /* HP2 */
9763 { 0x18, 0x01a19840 }, /* mic */
9764 { 0x19, 0x99a3094f }, /* int-mic */
9765 { 0x1b, 0x0121441f }, /* HP */
9766 { }
9767 },
9768 .chained = true,
9769 .chain_id = ALC662_FIXUP_SKU_IGNORE
9770 },
9771 [ALC662_FIXUP_ASUS_MODE7] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009772 .type = HDA_FIXUP_PINS,
9773 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02009774 { 0x14, 0x99130110 }, /* speaker */
9775 { 0x17, 0x99130111 }, /* speaker */
9776 { 0x18, 0x01a19840 }, /* mic */
9777 { 0x19, 0x99a3094f }, /* int-mic */
9778 { 0x1b, 0x01214020 }, /* HP */
9779 { 0x21, 0x0121401f }, /* HP */
9780 { }
9781 },
9782 .chained = true,
9783 .chain_id = ALC662_FIXUP_SKU_IGNORE
9784 },
9785 [ALC662_FIXUP_ASUS_MODE8] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009786 .type = HDA_FIXUP_PINS,
9787 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02009788 { 0x14, 0x99130110 }, /* speaker */
9789 { 0x12, 0x99a30970 }, /* int-mic */
9790 { 0x15, 0x01214020 }, /* HP */
9791 { 0x17, 0x99130111 }, /* speaker */
9792 { 0x18, 0x01a19840 }, /* mic */
9793 { 0x21, 0x0121401f }, /* HP */
9794 { }
9795 },
9796 .chained = true,
9797 .chain_id = ALC662_FIXUP_SKU_IGNORE
Takashi Iwai2996bdb2011-08-18 16:02:24 +02009798 },
Takashi Iwai1565cc32012-02-13 12:03:25 +01009799 [ALC662_FIXUP_NO_JACK_DETECT] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009800 .type = HDA_FIXUP_FUNC,
Takashi Iwai1565cc32012-02-13 12:03:25 +01009801 .v.func = alc_fixup_no_jack_detect,
9802 },
David Henningssonedfe3bf2012-06-12 13:15:12 +02009803 [ALC662_FIXUP_ZOTAC_Z68] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009804 .type = HDA_FIXUP_PINS,
9805 .v.pins = (const struct hda_pintbl[]) {
David Henningssonedfe3bf2012-06-12 13:15:12 +02009806 { 0x1b, 0x02214020 }, /* Front HP */
9807 { }
9808 }
9809 },
Takashi Iwai125821a2012-06-22 14:30:29 +02009810 [ALC662_FIXUP_INV_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009811 .type = HDA_FIXUP_FUNC,
David Henningsson9d36a7d2014-10-07 10:18:42 +02009812 .v.func = alc_fixup_inv_dmic,
Takashi Iwai125821a2012-06-22 14:30:29 +02009813 },
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +02009814 [ALC668_FIXUP_DELL_XPS13] = {
9815 .type = HDA_FIXUP_FUNC,
9816 .v.func = alc_fixup_dell_xps13,
9817 .chained = true,
9818 .chain_id = ALC668_FIXUP_DELL_DISABLE_AAMIX
9819 },
Gabriele Mazzotta5e6db662014-05-20 18:58:26 +02009820 [ALC668_FIXUP_DELL_DISABLE_AAMIX] = {
9821 .type = HDA_FIXUP_FUNC,
9822 .v.func = alc_fixup_disable_aamix,
9823 .chained = true,
9824 .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
9825 },
Hui Wang493a52a2014-01-14 14:07:36 +08009826 [ALC668_FIXUP_AUTO_MUTE] = {
9827 .type = HDA_FIXUP_FUNC,
9828 .v.func = alc_fixup_auto_mute_via_amp,
9829 .chained = true,
9830 .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
9831 },
David Henningsson1f8b46c2015-05-12 14:38:15 +02009832 [ALC662_FIXUP_DELL_MIC_NO_PRESENCE] = {
9833 .type = HDA_FIXUP_PINS,
9834 .v.pins = (const struct hda_pintbl[]) {
9835 { 0x19, 0x03a1113c }, /* use as headset mic, without its own jack detect */
9836 /* headphone mic by setting pin control of 0x1b (headphone out) to in + vref_50 */
9837 { }
9838 },
9839 .chained = true,
9840 .chain_id = ALC662_FIXUP_HEADSET_MODE
9841 },
9842 [ALC662_FIXUP_HEADSET_MODE] = {
9843 .type = HDA_FIXUP_FUNC,
9844 .v.func = alc_fixup_headset_mode_alc662,
9845 },
David Henningsson73bdd592013-04-15 15:44:14 +02009846 [ALC668_FIXUP_DELL_MIC_NO_PRESENCE] = {
9847 .type = HDA_FIXUP_PINS,
9848 .v.pins = (const struct hda_pintbl[]) {
9849 { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
9850 { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
9851 { }
9852 },
9853 .chained = true,
9854 .chain_id = ALC668_FIXUP_HEADSET_MODE
9855 },
9856 [ALC668_FIXUP_HEADSET_MODE] = {
9857 .type = HDA_FIXUP_FUNC,
9858 .v.func = alc_fixup_headset_mode_alc668,
9859 },
David Henningsson8e54b4a2014-02-07 09:31:07 +01009860 [ALC662_FIXUP_BASS_MODE4_CHMAP] = {
Takashi Iwai8e383952013-10-30 17:41:12 +01009861 .type = HDA_FIXUP_FUNC,
Takashi Iwaieb9ca3a2013-11-28 15:24:34 +01009862 .v.func = alc_fixup_bass_chmap,
Takashi Iwai8e383952013-10-30 17:41:12 +01009863 .chained = true,
9864 .chain_id = ALC662_FIXUP_ASUS_MODE4
9865 },
David Henningsson61a75f12014-02-07 09:31:08 +01009866 [ALC662_FIXUP_BASS_16] = {
9867 .type = HDA_FIXUP_PINS,
9868 .v.pins = (const struct hda_pintbl[]) {
9869 {0x16, 0x80106111}, /* bass speaker */
9870 {}
9871 },
9872 .chained = true,
9873 .chain_id = ALC662_FIXUP_BASS_CHMAP,
9874 },
Takashi Iwaia30c9aa2013-11-21 08:00:20 +01009875 [ALC662_FIXUP_BASS_1A] = {
9876 .type = HDA_FIXUP_PINS,
9877 .v.pins = (const struct hda_pintbl[]) {
9878 {0x1a, 0x80106111}, /* bass speaker */
9879 {}
9880 },
David Henningsson8e54b4a2014-02-07 09:31:07 +01009881 .chained = true,
9882 .chain_id = ALC662_FIXUP_BASS_CHMAP,
Takashi Iwaia30c9aa2013-11-21 08:00:20 +01009883 },
David Henningsson8e54b4a2014-02-07 09:31:07 +01009884 [ALC662_FIXUP_BASS_CHMAP] = {
Takashi Iwaia30c9aa2013-11-21 08:00:20 +01009885 .type = HDA_FIXUP_FUNC,
Takashi Iwaieb9ca3a2013-11-28 15:24:34 +01009886 .v.func = alc_fixup_bass_chmap,
Takashi Iwaia30c9aa2013-11-21 08:00:20 +01009887 },
Bobi Mihalca9d4dc582016-03-23 13:26:11 +02009888 [ALC662_FIXUP_ASUS_Nx50] = {
9889 .type = HDA_FIXUP_FUNC,
9890 .v.func = alc_fixup_auto_mute_via_amp,
9891 .chained = true,
9892 .chain_id = ALC662_FIXUP_BASS_1A
9893 },
Mikhail Paulyshkafc7438b2017-04-21 08:52:42 +02009894 [ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE] = {
9895 .type = HDA_FIXUP_FUNC,
9896 .v.func = alc_fixup_headset_mode_alc668,
9897 .chain_id = ALC662_FIXUP_BASS_CHMAP
9898 },
Yura Pakhuchiy3231e202016-05-07 23:53:36 +07009899 [ALC668_FIXUP_ASUS_Nx51] = {
9900 .type = HDA_FIXUP_PINS,
9901 .v.pins = (const struct hda_pintbl[]) {
Mikhail Paulyshkafc7438b2017-04-21 08:52:42 +02009902 { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
9903 { 0x1a, 0x90170151 }, /* bass speaker */
9904 { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
Yura Pakhuchiy3231e202016-05-07 23:53:36 +07009905 {}
9906 },
9907 .chained = true,
Mikhail Paulyshkafc7438b2017-04-21 08:52:42 +02009908 .chain_id = ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
Yura Pakhuchiy3231e202016-05-07 23:53:36 +07009909 },
Takashi Iwai5b7c5e12018-10-09 14:20:17 +02009910 [ALC668_FIXUP_MIC_COEF] = {
Takashi Iwai11ba6112018-10-07 09:44:17 +02009911 .type = HDA_FIXUP_VERBS,
9912 .v.verbs = (const struct hda_verb[]) {
9913 { 0x20, AC_VERB_SET_COEF_INDEX, 0xc3 },
9914 { 0x20, AC_VERB_SET_PROC_COEF, 0x4000 },
9915 {}
9916 },
9917 },
Takashi Iwai5b7c5e12018-10-09 14:20:17 +02009918 [ALC668_FIXUP_ASUS_G751] = {
9919 .type = HDA_FIXUP_PINS,
9920 .v.pins = (const struct hda_pintbl[]) {
9921 { 0x16, 0x0421101f }, /* HP */
9922 {}
9923 },
9924 .chained = true,
9925 .chain_id = ALC668_FIXUP_MIC_COEF
9926 },
Kailang Yang78f4f7c2016-06-07 11:31:34 +08009927 [ALC891_FIXUP_HEADSET_MODE] = {
9928 .type = HDA_FIXUP_FUNC,
9929 .v.func = alc_fixup_headset_mode,
9930 },
9931 [ALC891_FIXUP_DELL_MIC_NO_PRESENCE] = {
9932 .type = HDA_FIXUP_PINS,
9933 .v.pins = (const struct hda_pintbl[]) {
9934 { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
9935 { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
9936 { }
9937 },
9938 .chained = true,
9939 .chain_id = ALC891_FIXUP_HEADSET_MODE
9940 },
Shrirang Bagul9b51fe32016-08-01 13:16:17 +08009941 [ALC662_FIXUP_ACER_VERITON] = {
9942 .type = HDA_FIXUP_PINS,
9943 .v.pins = (const struct hda_pintbl[]) {
9944 { 0x15, 0x50170120 }, /* no internal speaker */
9945 { }
9946 }
9947 },
Takashi Iwai1a3f0992016-10-20 12:14:51 +02009948 [ALC892_FIXUP_ASROCK_MOBO] = {
9949 .type = HDA_FIXUP_PINS,
9950 .v.pins = (const struct hda_pintbl[]) {
9951 { 0x15, 0x40f000f0 }, /* disabled */
9952 { 0x16, 0x40f000f0 }, /* disabled */
Takashi Iwai1a3f0992016-10-20 12:14:51 +02009953 { }
9954 }
9955 },
Kailang Yangc6790c82016-11-25 16:15:17 +08009956 [ALC662_FIXUP_USI_FUNC] = {
9957 .type = HDA_FIXUP_FUNC,
9958 .v.func = alc662_fixup_usi_headset_mic,
9959 },
9960 [ALC662_FIXUP_USI_HEADSET_MODE] = {
9961 .type = HDA_FIXUP_PINS,
9962 .v.pins = (const struct hda_pintbl[]) {
9963 { 0x19, 0x02a1913c }, /* use as headset mic, without its own jack detect */
9964 { 0x18, 0x01a1903d },
9965 { }
9966 },
9967 .chained = true,
9968 .chain_id = ALC662_FIXUP_USI_FUNC
9969 },
Kailang Yangca169cc2017-04-25 16:17:40 +08009970 [ALC662_FIXUP_LENOVO_MULTI_CODECS] = {
9971 .type = HDA_FIXUP_FUNC,
9972 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
9973 },
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02009974 [ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET] = {
9975 .type = HDA_FIXUP_FUNC,
9976 .v.func = alc662_fixup_aspire_ethos_hp,
9977 },
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02009978 [ALC669_FIXUP_ACER_ASPIRE_ETHOS] = {
9979 .type = HDA_FIXUP_PINS,
9980 .v.pins = (const struct hda_pintbl[]) {
9981 { 0x15, 0x92130110 }, /* front speakers */
9982 { 0x18, 0x99130111 }, /* center/subwoofer */
9983 { 0x1b, 0x11130012 }, /* surround plus jack for HP */
9984 { }
9985 },
9986 .chained = true,
Takashi Iwai336820c2019-11-28 21:26:30 +01009987 .chain_id = ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02009988 },
Kailang Yang5af290282020-01-17 14:04:01 +08009989 [ALC671_FIXUP_HP_HEADSET_MIC2] = {
9990 .type = HDA_FIXUP_FUNC,
9991 .v.func = alc671_fixup_hp_headset_mic2,
9992 },
Jian-Hong Pand858c702020-03-17 16:28:07 +08009993 [ALC662_FIXUP_ACER_X2660G_HEADSET_MODE] = {
9994 .type = HDA_FIXUP_PINS,
9995 .v.pins = (const struct hda_pintbl[]) {
9996 { 0x1a, 0x02a1113c }, /* use as headset mic, without its own jack detect */
9997 { }
9998 },
9999 .chained = true,
10000 .chain_id = ALC662_FIXUP_USI_FUNC
10001 },
Jian-Hong Pana1244582020-03-17 16:28:09 +080010002 [ALC662_FIXUP_ACER_NITRO_HEADSET_MODE] = {
10003 .type = HDA_FIXUP_PINS,
10004 .v.pins = (const struct hda_pintbl[]) {
10005 { 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */
10006 { 0x1b, 0x0221144f },
10007 { }
10008 },
10009 .chained = true,
10010 .chain_id = ALC662_FIXUP_USI_FUNC
10011 },
David Henningsson6cb3b702010-09-09 08:51:44 +020010012};
10013
Takashi Iwaia9111322011-05-02 11:30:18 +020010014static const struct snd_pci_quirk alc662_fixup_tbl[] = {
Takashi Iwai53c334a2011-08-23 18:27:14 +020010015 SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2),
Takashi Iwaid3d38352013-08-19 20:05:50 +020010016 SND_PCI_QUIRK(0x1025, 0x022f, "Acer Aspire One", ALC662_FIXUP_INV_DMIC),
David Henningsson02f6ff92015-12-07 11:29:31 +010010017 SND_PCI_QUIRK(0x1025, 0x0241, "Packard Bell DOTS", ALC662_FIXUP_INV_DMIC),
David Henningssona6c47a82011-02-10 15:39:19 +010010018 SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
David Henningsson94024cd2011-04-29 14:10:55 +020010019 SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),
Takashi Iwai125821a2012-06-22 14:30:29 +020010020 SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC),
Takashi Iwai18019282013-08-16 08:17:05 +020010021 SND_PCI_QUIRK(0x1025, 0x034a, "Gateway LT27", ALC662_FIXUP_INV_DMIC),
Daniel T Chen2df03512010-10-10 22:39:28 -040010022 SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
Jian-Hong Pana1244582020-03-17 16:28:09 +080010023 SND_PCI_QUIRK(0x1025, 0x123c, "Acer Nitro N50-600", ALC662_FIXUP_ACER_NITRO_HEADSET_MODE),
Jian-Hong Pand858c702020-03-17 16:28:07 +080010024 SND_PCI_QUIRK(0x1025, 0x124e, "Acer 2660G", ALC662_FIXUP_ACER_X2660G_HEADSET_MODE),
David Henningsson73bdd592013-04-15 15:44:14 +020010025 SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
10026 SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
Takashi Iwaic5d019c2014-07-22 17:33:32 +020010027 SND_PCI_QUIRK(0x1028, 0x05fe, "Dell XPS 15", ALC668_FIXUP_DELL_XPS13),
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +020010028 SND_PCI_QUIRK(0x1028, 0x060a, "Dell XPS 13", ALC668_FIXUP_DELL_XPS13),
Niranjan Sivakumar467e1432015-09-05 18:20:35 +020010029 SND_PCI_QUIRK(0x1028, 0x060d, "Dell M3800", ALC668_FIXUP_DELL_XPS13),
David Henningsson09d20142013-11-20 11:43:30 +010010030 SND_PCI_QUIRK(0x1028, 0x0625, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
David Henningssonad8ff99e2013-11-07 09:28:59 +010010031 SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
Kailang Yang8dc9abb2014-04-16 15:53:12 +080010032 SND_PCI_QUIRK(0x1028, 0x0696, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
10033 SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
Kailang Yang6a98e342014-10-27 16:20:30 +080010034 SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
Takashi Iwaie59ea3e2011-06-29 17:21:00 +020010035 SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
Jeremy Szu148ebf542020-10-08 18:56:44 +080010036 SND_PCI_QUIRK(0x103c, 0x873e, "HP", ALC671_FIXUP_HP_HEADSET_MIC2),
Kaho Ng2da2dc92016-05-09 00:27:49 +080010037 SND_PCI_QUIRK(0x1043, 0x1080, "Asus UX501VW", ALC668_FIXUP_HEADSET_MODE),
Bobi Mihalca83a9efb2016-03-23 13:32:33 +020010038 SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_ASUS_Nx50),
Takashi Iwaidb8948e2016-01-18 09:17:30 +010010039 SND_PCI_QUIRK(0x1043, 0x13df, "Asus N550JX", ALC662_FIXUP_BASS_1A),
Bobi Mihalca9d4dc582016-03-23 13:26:11 +020010040 SND_PCI_QUIRK(0x1043, 0x129d, "Asus N750", ALC662_FIXUP_ASUS_Nx50),
Takashi Iwai11ba6112018-10-07 09:44:17 +020010041 SND_PCI_QUIRK(0x1043, 0x12ff, "ASUS G751", ALC668_FIXUP_ASUS_G751),
David Henningsson8e54b4a2014-02-07 09:31:07 +010010042 SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
David Henningsson61a75f12014-02-07 09:31:08 +010010043 SND_PCI_QUIRK(0x1043, 0x15a7, "ASUS UX51VZH", ALC662_FIXUP_BASS_16),
Yura Pakhuchiy3231e202016-05-07 23:53:36 +070010044 SND_PCI_QUIRK(0x1043, 0x177d, "ASUS N551", ALC668_FIXUP_ASUS_Nx51),
10045 SND_PCI_QUIRK(0x1043, 0x17bd, "ASUS N751", ALC668_FIXUP_ASUS_Nx51),
Takashi Iwaic7efff92017-01-04 21:38:16 +010010046 SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71SL", ALC662_FIXUP_ASUS_MODE8),
David Henningsson61a75f12014-02-07 09:31:08 +010010047 SND_PCI_QUIRK(0x1043, 0x1b73, "ASUS N55SF", ALC662_FIXUP_BASS_16),
David Henningsson8e54b4a2014-02-07 09:31:07 +010010048 SND_PCI_QUIRK(0x1043, 0x1bf3, "ASUS N76VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
Takashi Iwai1565cc32012-02-13 12:03:25 +010010049 SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),
Takashi Iwai53c334a2011-08-23 18:27:14 +020010050 SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
Daniel T Chena0e90ac2010-11-20 10:20:35 -050010051 SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
Kailang Yangc6790c82016-11-25 16:15:17 +080010052 SND_PCI_QUIRK(0x14cd, 0x5003, "USI", ALC662_FIXUP_USI_HEADSET_MODE),
Kailang Yangca169cc2017-04-25 16:17:40 +080010053 SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC662_FIXUP_LENOVO_MULTI_CODECS),
Valentine Sinitsynd4118582010-10-01 22:24:08 +060010054 SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
David Henningsson6cb3b702010-09-09 08:51:44 +020010055 SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
Takashi Iwai1a3f0992016-10-20 12:14:51 +020010056 SND_PCI_QUIRK(0x1849, 0x5892, "ASRock B150M", ALC892_FIXUP_ASROCK_MOBO),
David Henningssonedfe3bf2012-06-12 13:15:12 +020010057 SND_PCI_QUIRK(0x19da, 0xa130, "Zotac Z68", ALC662_FIXUP_ZOTAC_Z68),
Shrirang Bagul9b51fe32016-08-01 13:16:17 +080010058 SND_PCI_QUIRK(0x1b0a, 0x01b8, "ACER Veriton", ALC662_FIXUP_ACER_VERITON),
Huacai Chenf1ec5be2020-08-02 17:26:40 +080010059 SND_PCI_QUIRK(0x1b35, 0x1234, "CZC ET26", ALC662_FIXUP_CZC_ET26),
Anisse Astierd2ebd472011-01-20 12:36:21 +010010060 SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +020010061 SND_PCI_QUIRK(0x1025, 0x0566, "Acer Aspire Ethos 8951G", ALC669_FIXUP_ACER_ASPIRE_ETHOS),
Takashi Iwai53c334a2011-08-23 18:27:14 +020010062
10063#if 0
10064 /* Below is a quirk table taken from the old code.
10065 * Basically the device should work as is without the fixup table.
10066 * If BIOS doesn't give a proper info, enable the corresponding
10067 * fixup entry.
Jesper Juhl7d7eb9e2012-04-12 22:11:25 +020010068 */
Takashi Iwai53c334a2011-08-23 18:27:14 +020010069 SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1),
10070 SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3),
10071 SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1),
10072 SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC662_FIXUP_ASUS_MODE3),
10073 SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
10074 SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
10075 SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
10076 SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC662_FIXUP_ASUS_MODE1),
10077 SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC662_FIXUP_ASUS_MODE1),
10078 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
10079 SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC662_FIXUP_ASUS_MODE7),
10080 SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC662_FIXUP_ASUS_MODE7),
10081 SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC662_FIXUP_ASUS_MODE8),
10082 SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC662_FIXUP_ASUS_MODE3),
10083 SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC662_FIXUP_ASUS_MODE1),
10084 SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
10085 SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_FIXUP_ASUS_MODE2),
10086 SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC662_FIXUP_ASUS_MODE1),
10087 SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
10088 SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
10089 SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
10090 SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
10091 SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC662_FIXUP_ASUS_MODE1),
10092 SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC662_FIXUP_ASUS_MODE3),
10093 SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_FIXUP_ASUS_MODE2),
10094 SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
10095 SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC662_FIXUP_ASUS_MODE5),
10096 SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
10097 SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
10098 SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC662_FIXUP_ASUS_MODE1),
10099 SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
10100 SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
10101 SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC662_FIXUP_ASUS_MODE3),
10102 SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC662_FIXUP_ASUS_MODE3),
10103 SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC662_FIXUP_ASUS_MODE1),
10104 SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC662_FIXUP_ASUS_MODE1),
10105 SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC662_FIXUP_ASUS_MODE1),
10106 SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC662_FIXUP_ASUS_MODE1),
10107 SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC662_FIXUP_ASUS_MODE1),
10108 SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
10109 SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_FIXUP_ASUS_MODE2),
10110 SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC662_FIXUP_ASUS_MODE1),
10111 SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
10112 SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC662_FIXUP_ASUS_MODE3),
10113 SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC662_FIXUP_ASUS_MODE1),
10114 SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC662_FIXUP_ASUS_MODE1),
10115 SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC662_FIXUP_ASUS_MODE1),
10116 SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_FIXUP_ASUS_MODE2),
10117 SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
10118 SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE4),
10119#endif
David Henningsson6cb3b702010-09-09 08:51:44 +020010120 {}
10121};
10122
Takashi Iwai1727a772013-01-10 09:52:52 +010010123static const struct hda_model_fixup alc662_fixup_models[] = {
Takashi Iwaiaa3841b2018-06-26 07:42:40 +020010124 {.id = ALC662_FIXUP_ASPIRE, .name = "aspire"},
10125 {.id = ALC662_FIXUP_IDEAPAD, .name = "ideapad"},
Todd Broch6be79482010-12-07 16:51:05 -080010126 {.id = ALC272_FIXUP_MARIO, .name = "mario"},
Takashi Iwaiaa3841b2018-06-26 07:42:40 +020010127 {.id = ALC662_FIXUP_HP_RP5800, .name = "hp-rp5800"},
Takashi Iwai53c334a2011-08-23 18:27:14 +020010128 {.id = ALC662_FIXUP_ASUS_MODE1, .name = "asus-mode1"},
10129 {.id = ALC662_FIXUP_ASUS_MODE2, .name = "asus-mode2"},
10130 {.id = ALC662_FIXUP_ASUS_MODE3, .name = "asus-mode3"},
10131 {.id = ALC662_FIXUP_ASUS_MODE4, .name = "asus-mode4"},
10132 {.id = ALC662_FIXUP_ASUS_MODE5, .name = "asus-mode5"},
10133 {.id = ALC662_FIXUP_ASUS_MODE6, .name = "asus-mode6"},
10134 {.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},
10135 {.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},
Takashi Iwaiaa3841b2018-06-26 07:42:40 +020010136 {.id = ALC662_FIXUP_ZOTAC_Z68, .name = "zotac-z68"},
Takashi Iwai6e72aa52012-06-25 10:52:25 +020010137 {.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"},
Takashi Iwaiaa3841b2018-06-26 07:42:40 +020010138 {.id = ALC662_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc662-headset-multi"},
David Henningssone32aa852013-06-17 11:04:02 +020010139 {.id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
Takashi Iwaiaa3841b2018-06-26 07:42:40 +020010140 {.id = ALC662_FIXUP_HEADSET_MODE, .name = "alc662-headset"},
10141 {.id = ALC668_FIXUP_HEADSET_MODE, .name = "alc668-headset"},
10142 {.id = ALC662_FIXUP_BASS_16, .name = "bass16"},
10143 {.id = ALC662_FIXUP_BASS_1A, .name = "bass1a"},
10144 {.id = ALC668_FIXUP_AUTO_MUTE, .name = "automute"},
10145 {.id = ALC668_FIXUP_DELL_XPS13, .name = "dell-xps13"},
10146 {.id = ALC662_FIXUP_ASUS_Nx50, .name = "asus-nx50"},
10147 {.id = ALC668_FIXUP_ASUS_Nx51, .name = "asus-nx51"},
Takashi Iwai40c51672018-10-07 09:47:39 +020010148 {.id = ALC668_FIXUP_ASUS_G751, .name = "asus-g751"},
Takashi Iwaiaa3841b2018-06-26 07:42:40 +020010149 {.id = ALC891_FIXUP_HEADSET_MODE, .name = "alc891-headset"},
10150 {.id = ALC891_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc891-headset-multi"},
10151 {.id = ALC662_FIXUP_ACER_VERITON, .name = "acer-veriton"},
10152 {.id = ALC892_FIXUP_ASROCK_MOBO, .name = "asrock-mobo"},
10153 {.id = ALC662_FIXUP_USI_HEADSET_MODE, .name = "usi-headset"},
Takashi Iwaiba90d6a2017-05-22 16:38:47 +020010154 {.id = ALC662_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +020010155 {.id = ALC669_FIXUP_ACER_ASPIRE_ETHOS, .name = "aspire-ethos"},
Todd Broch6be79482010-12-07 16:51:05 -080010156 {}
10157};
David Henningsson6cb3b702010-09-09 08:51:44 +020010158
Hui Wang532895c2014-05-29 15:59:19 +080010159static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = {
Kailang Yang78f4f7c2016-06-07 11:31:34 +080010160 SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
10161 {0x17, 0x02211010},
10162 {0x18, 0x01a19030},
10163 {0x1a, 0x01813040},
10164 {0x21, 0x01014020}),
Hui Wang4b4e0e32019-07-16 15:21:34 +080010165 SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
10166 {0x16, 0x01813030},
10167 {0x17, 0x02211010},
10168 {0x18, 0x01a19040},
10169 {0x21, 0x01014020}),
David Henningsson1f8b46c2015-05-12 14:38:15 +020010170 SND_HDA_PIN_QUIRK(0x10ec0662, 0x1028, "Dell", ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
David Henningsson1f8b46c2015-05-12 14:38:15 +020010171 {0x14, 0x01014010},
David Henningsson1f8b46c2015-05-12 14:38:15 +020010172 {0x18, 0x01a19020},
David Henningsson1f8b46c2015-05-12 14:38:15 +020010173 {0x1a, 0x0181302f},
Hui Wang11580292015-08-03 11:03:49 +080010174 {0x1b, 0x0221401f}),
David Henningsson76c21322014-06-24 14:46:54 +020010175 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
10176 {0x12, 0x99a30130},
10177 {0x14, 0x90170110},
10178 {0x15, 0x0321101f},
Hui Wang11580292015-08-03 11:03:49 +080010179 {0x16, 0x03011020}),
David Henningsson76c21322014-06-24 14:46:54 +020010180 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
10181 {0x12, 0x99a30140},
10182 {0x14, 0x90170110},
10183 {0x15, 0x0321101f},
Hui Wang11580292015-08-03 11:03:49 +080010184 {0x16, 0x03011020}),
David Henningsson76c21322014-06-24 14:46:54 +020010185 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
10186 {0x12, 0x99a30150},
10187 {0x14, 0x90170110},
10188 {0x15, 0x0321101f},
Hui Wang11580292015-08-03 11:03:49 +080010189 {0x16, 0x03011020}),
David Henningsson76c21322014-06-24 14:46:54 +020010190 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
David Henningsson76c21322014-06-24 14:46:54 +020010191 {0x14, 0x90170110},
10192 {0x15, 0x0321101f},
Hui Wang11580292015-08-03 11:03:49 +080010193 {0x16, 0x03011020}),
David Henningsson76c21322014-06-24 14:46:54 +020010194 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell XPS 15", ALC668_FIXUP_AUTO_MUTE,
10195 {0x12, 0x90a60130},
10196 {0x14, 0x90170110},
Hui Wang11580292015-08-03 11:03:49 +080010197 {0x15, 0x0321101f}),
Kailang Yang5af290282020-01-17 14:04:01 +080010198 SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
10199 {0x14, 0x01014010},
10200 {0x17, 0x90170150},
Kailang Yangf2adbae2020-02-05 15:40:01 +080010201 {0x19, 0x02a11060},
Kailang Yang5af290282020-01-17 14:04:01 +080010202 {0x1b, 0x01813030},
10203 {0x21, 0x02211020}),
10204 SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
10205 {0x14, 0x01014010},
10206 {0x18, 0x01a19040},
10207 {0x1b, 0x01813030},
10208 {0x21, 0x02211020}),
10209 SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
10210 {0x14, 0x01014020},
10211 {0x17, 0x90170110},
10212 {0x18, 0x01a19050},
10213 {0x1b, 0x01813040},
10214 {0x21, 0x02211030}),
Hui Wang532895c2014-05-29 15:59:19 +080010215 {}
10216};
10217
Takashi Iwai1d045db2011-07-07 18:23:21 +020010218/*
10219 */
Kailang Yangbc9f98a2007-04-12 13:06:07 +020010220static int patch_alc662(struct hda_codec *codec)
10221{
10222 struct alc_spec *spec;
Takashi Iwai3de95172012-05-07 18:03:15 +020010223 int err;
Kailang Yangbc9f98a2007-04-12 13:06:07 +020010224
Takashi Iwai3de95172012-05-07 18:03:15 +020010225 err = alc_alloc_spec(codec, 0x0b);
10226 if (err < 0)
10227 return err;
Kailang Yangbc9f98a2007-04-12 13:06:07 +020010228
Takashi Iwai3de95172012-05-07 18:03:15 +020010229 spec = codec->spec;
Takashi Iwai1f0f4b82011-06-27 10:52:59 +020010230
Takashi Iwai225068a2015-05-29 10:42:14 +020010231 spec->shutup = alc_eapd_shutup;
10232
Takashi Iwai53c334a2011-08-23 18:27:14 +020010233 /* handle multiple HPs as is */
10234 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
10235
Takashi Iwai2c3bf9a2008-06-04 12:39:38 +020010236 alc_fix_pll_init(codec, 0x20, 0x04, 15);
10237
Takashi Iwai7639a062015-03-03 10:07:24 +010010238 switch (codec->core.vendor_id) {
Kailang Yangf3f91852014-10-24 15:43:46 +080010239 case 0x10ec0668:
10240 spec->init_hook = alc668_restore_default_value;
10241 break;
Kailang Yangf3f91852014-10-24 15:43:46 +080010242 }
Kailang Yang8663ff72012-06-29 09:35:52 +020010243
Takashi Iwaic9af7532019-05-10 11:01:43 +020010244 alc_pre_init(codec);
10245
Takashi Iwai1727a772013-01-10 09:52:52 +010010246 snd_hda_pick_fixup(codec, alc662_fixup_models,
Takashi Iwai8e5a0502012-06-21 15:49:33 +020010247 alc662_fixup_tbl, alc662_fixups);
Hui Wang0fc1e442019-08-16 14:27:39 +080010248 snd_hda_pick_pin_fixup(codec, alc662_pin_fixup_tbl, alc662_fixups, true);
Takashi Iwai1727a772013-01-10 09:52:52 +010010249 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai8e5a0502012-06-21 15:49:33 +020010250
10251 alc_auto_parse_customize_define(codec);
10252
Takashi Iwai7504b6c2013-03-18 11:25:51 +010010253 if (has_cdefine_beep(codec))
10254 spec->gen.beep_nid = 0x01;
10255
Takashi Iwai1bb7e432011-10-17 16:50:59 +020010256 if ((alc_get_coef0(codec) & (1 << 14)) &&
Takashi Iwai5100cd02014-02-15 10:03:19 +010010257 codec->bus->pci && codec->bus->pci->subsystem_vendor == 0x1025 &&
Takashi Iwaie16fb6d2011-10-17 16:39:09 +020010258 spec->cdefine.platform_type == 1) {
Wei Yongjun6134b1a2013-04-18 11:12:59 +080010259 err = alc_codec_rename(codec, "ALC272X");
10260 if (err < 0)
Takashi Iwaie16fb6d2011-10-17 16:39:09 +020010261 goto error;
Takashi Iwai20ca0c32011-10-17 16:00:35 +020010262 }
Kailang Yang274693f2009-12-03 10:07:50 +010010263
Takashi Iwaib9c51062011-08-24 18:08:07 +020010264 /* automatic parse from the BIOS config */
10265 err = alc662_parse_auto_config(codec);
Takashi Iwaie16fb6d2011-10-17 16:39:09 +020010266 if (err < 0)
10267 goto error;
Kailang Yangbc9f98a2007-04-12 13:06:07 +020010268
Takashi Iwai7504b6c2013-03-18 11:25:51 +010010269 if (!spec->gen.no_analog && spec->gen.beep_nid) {
Takashi Iwai7639a062015-03-03 10:07:24 +010010270 switch (codec->core.vendor_id) {
Kailang Yangda00c242010-03-19 11:23:45 +010010271 case 0x10ec0662:
Takashi Iwaifea80fa2018-06-20 12:52:46 +020010272 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
Kailang Yangda00c242010-03-19 11:23:45 +010010273 break;
10274 case 0x10ec0272:
10275 case 0x10ec0663:
10276 case 0x10ec0665:
Kailang Yang9ad54542013-11-26 15:41:40 +080010277 case 0x10ec0668:
Takashi Iwaifea80fa2018-06-20 12:52:46 +020010278 err = set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
Kailang Yangda00c242010-03-19 11:23:45 +010010279 break;
10280 case 0x10ec0273:
Takashi Iwaifea80fa2018-06-20 12:52:46 +020010281 err = set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
Kailang Yangda00c242010-03-19 11:23:45 +010010282 break;
10283 }
Takashi Iwaifea80fa2018-06-20 12:52:46 +020010284 if (err < 0)
10285 goto error;
Kailang Yangcec27c82010-02-04 14:18:18 +010010286 }
Takashi Iwai2134ea42008-01-10 16:53:55 +010010287
Takashi Iwai1727a772013-01-10 09:52:52 +010010288 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +010010289
Kailang Yangbc9f98a2007-04-12 13:06:07 +020010290 return 0;
Kailang Yangbc9f98a2007-04-12 13:06:07 +020010291
Takashi Iwaie16fb6d2011-10-17 16:39:09 +020010292 error:
10293 alc_free(codec);
10294 return err;
Kailang Yangb478b992011-05-18 11:51:15 +020010295}
10296
Kailang Yangbc9f98a2007-04-12 13:06:07 +020010297/*
Kailang Yangd1eb57f2010-06-23 16:25:26 +020010298 * ALC680 support
10299 */
Kailang Yangd1eb57f2010-06-23 16:25:26 +020010300
Kailang Yangd1eb57f2010-06-23 16:25:26 +020010301static int alc680_parse_auto_config(struct hda_codec *codec)
10302{
Takashi Iwai3e6179b2011-07-08 16:55:13 +020010303 return alc_parse_auto_config(codec, NULL, NULL);
Kailang Yangd1eb57f2010-06-23 16:25:26 +020010304}
10305
Kailang Yangd1eb57f2010-06-23 16:25:26 +020010306/*
Kailang Yangd1eb57f2010-06-23 16:25:26 +020010307 */
Kailang Yangd1eb57f2010-06-23 16:25:26 +020010308static int patch_alc680(struct hda_codec *codec)
10309{
Kailang Yangd1eb57f2010-06-23 16:25:26 +020010310 int err;
10311
Takashi Iwai1f0f4b82011-06-27 10:52:59 +020010312 /* ALC680 has no aa-loopback mixer */
Takashi Iwai3de95172012-05-07 18:03:15 +020010313 err = alc_alloc_spec(codec, 0);
10314 if (err < 0)
10315 return err;
Takashi Iwai1f0f4b82011-06-27 10:52:59 +020010316
Takashi Iwai1ebec5f2011-08-15 13:21:48 +020010317 /* automatic parse from the BIOS config */
10318 err = alc680_parse_auto_config(codec);
10319 if (err < 0) {
10320 alc_free(codec);
10321 return err;
Kailang Yangd1eb57f2010-06-23 16:25:26 +020010322 }
10323
Kailang Yangd1eb57f2010-06-23 16:25:26 +020010324 return 0;
10325}
10326
10327/*
Linus Torvalds1da177e2005-04-16 15:20:36 -070010328 * patch entries
10329 */
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010330static const struct hda_device_id snd_hda_id_realtek[] = {
Kailang Yang0a6f0602017-06-30 16:00:48 +080010331 HDA_CODEC_ENTRY(0x10ec0215, "ALC215", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010332 HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269),
Hui Wang2a36c162019-09-04 13:53:27 +080010333 HDA_CODEC_ENTRY(0x10ec0222, "ALC222", patch_alc269),
Kailang Yang42314302016-02-03 15:03:50 +080010334 HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010335 HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269),
10336 HDA_CODEC_ENTRY(0x10ec0233, "ALC233", patch_alc269),
Kailang Yangdcd4f0d2016-05-04 15:50:18 +080010337 HDA_CODEC_ENTRY(0x10ec0234, "ALC234", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010338 HDA_CODEC_ENTRY(0x10ec0235, "ALC233", patch_alc269),
Kailang Yang736f20a2017-10-20 15:06:34 +080010339 HDA_CODEC_ENTRY(0x10ec0236, "ALC236", patch_alc269),
Kailang Yang7fbdcd82020-04-23 14:18:31 +080010340 HDA_CODEC_ENTRY(0x10ec0245, "ALC245", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010341 HDA_CODEC_ENTRY(0x10ec0255, "ALC255", patch_alc269),
10342 HDA_CODEC_ENTRY(0x10ec0256, "ALC256", patch_alc269),
Kailang Yangf429e7e2017-12-05 15:38:24 +080010343 HDA_CODEC_ENTRY(0x10ec0257, "ALC257", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010344 HDA_CODEC_ENTRY(0x10ec0260, "ALC260", patch_alc260),
10345 HDA_CODEC_ENTRY(0x10ec0262, "ALC262", patch_alc262),
10346 HDA_CODEC_ENTRY(0x10ec0267, "ALC267", patch_alc268),
10347 HDA_CODEC_ENTRY(0x10ec0268, "ALC268", patch_alc268),
10348 HDA_CODEC_ENTRY(0x10ec0269, "ALC269", patch_alc269),
10349 HDA_CODEC_ENTRY(0x10ec0270, "ALC270", patch_alc269),
10350 HDA_CODEC_ENTRY(0x10ec0272, "ALC272", patch_alc662),
Kailang Yangdcd4f0d2016-05-04 15:50:18 +080010351 HDA_CODEC_ENTRY(0x10ec0274, "ALC274", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010352 HDA_CODEC_ENTRY(0x10ec0275, "ALC275", patch_alc269),
10353 HDA_CODEC_ENTRY(0x10ec0276, "ALC276", patch_alc269),
10354 HDA_CODEC_ENTRY(0x10ec0280, "ALC280", patch_alc269),
10355 HDA_CODEC_ENTRY(0x10ec0282, "ALC282", patch_alc269),
10356 HDA_CODEC_ENTRY(0x10ec0283, "ALC283", patch_alc269),
10357 HDA_CODEC_ENTRY(0x10ec0284, "ALC284", patch_alc269),
Kailang Yang0a6f0602017-06-30 16:00:48 +080010358 HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010359 HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269),
Kailang Yang630e3612020-05-27 14:10:26 +080010360 HDA_CODEC_ENTRY(0x10ec0287, "ALC287", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010361 HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269),
Kailang Yang0a6f0602017-06-30 16:00:48 +080010362 HDA_CODEC_ENTRY(0x10ec0289, "ALC289", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010363 HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269),
10364 HDA_CODEC_ENTRY(0x10ec0292, "ALC292", patch_alc269),
10365 HDA_CODEC_ENTRY(0x10ec0293, "ALC293", patch_alc269),
Kailang Yangdcd4f0d2016-05-04 15:50:18 +080010366 HDA_CODEC_ENTRY(0x10ec0294, "ALC294", patch_alc269),
Kailang Yang7d727862016-05-24 16:46:07 +080010367 HDA_CODEC_ENTRY(0x10ec0295, "ALC295", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010368 HDA_CODEC_ENTRY(0x10ec0298, "ALC298", patch_alc269),
Kailang Yang28f1f9b2017-01-04 14:49:07 +080010369 HDA_CODEC_ENTRY(0x10ec0299, "ALC299", patch_alc269),
Kailang Yang1078bef2018-11-08 16:36:15 +080010370 HDA_CODEC_ENTRY(0x10ec0300, "ALC300", patch_alc269),
Kailang Yangf0778872019-10-24 15:13:32 +080010371 HDA_CODEC_ENTRY(0x10ec0623, "ALC623", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010372 HDA_CODEC_REV_ENTRY(0x10ec0861, 0x100340, "ALC660", patch_alc861),
10373 HDA_CODEC_ENTRY(0x10ec0660, "ALC660-VD", patch_alc861vd),
10374 HDA_CODEC_ENTRY(0x10ec0861, "ALC861", patch_alc861),
10375 HDA_CODEC_ENTRY(0x10ec0862, "ALC861-VD", patch_alc861vd),
10376 HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100002, "ALC662 rev2", patch_alc882),
10377 HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100101, "ALC662 rev1", patch_alc662),
10378 HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100300, "ALC662 rev3", patch_alc662),
10379 HDA_CODEC_ENTRY(0x10ec0663, "ALC663", patch_alc662),
10380 HDA_CODEC_ENTRY(0x10ec0665, "ALC665", patch_alc662),
10381 HDA_CODEC_ENTRY(0x10ec0667, "ALC667", patch_alc662),
10382 HDA_CODEC_ENTRY(0x10ec0668, "ALC668", patch_alc662),
10383 HDA_CODEC_ENTRY(0x10ec0670, "ALC670", patch_alc662),
10384 HDA_CODEC_ENTRY(0x10ec0671, "ALC671", patch_alc662),
10385 HDA_CODEC_ENTRY(0x10ec0680, "ALC680", patch_alc680),
Kailang Yang6fbae352016-05-30 16:44:20 +080010386 HDA_CODEC_ENTRY(0x10ec0700, "ALC700", patch_alc269),
10387 HDA_CODEC_ENTRY(0x10ec0701, "ALC701", patch_alc269),
10388 HDA_CODEC_ENTRY(0x10ec0703, "ALC703", patch_alc269),
Kailang Yang83629532019-05-02 16:03:26 +080010389 HDA_CODEC_ENTRY(0x10ec0711, "ALC711", patch_alc269),
Kailang Yang78f4f7c2016-06-07 11:31:34 +080010390 HDA_CODEC_ENTRY(0x10ec0867, "ALC891", patch_alc662),
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010391 HDA_CODEC_ENTRY(0x10ec0880, "ALC880", patch_alc880),
10392 HDA_CODEC_ENTRY(0x10ec0882, "ALC882", patch_alc882),
10393 HDA_CODEC_ENTRY(0x10ec0883, "ALC883", patch_alc882),
10394 HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100101, "ALC889A", patch_alc882),
10395 HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100103, "ALC889A", patch_alc882),
10396 HDA_CODEC_ENTRY(0x10ec0885, "ALC885", patch_alc882),
10397 HDA_CODEC_ENTRY(0x10ec0887, "ALC887", patch_alc882),
10398 HDA_CODEC_REV_ENTRY(0x10ec0888, 0x100101, "ALC1200", patch_alc882),
10399 HDA_CODEC_ENTRY(0x10ec0888, "ALC888", patch_alc882),
10400 HDA_CODEC_ENTRY(0x10ec0889, "ALC889", patch_alc882),
10401 HDA_CODEC_ENTRY(0x10ec0892, "ALC892", patch_alc662),
Kailang Yange5782a52020-11-27 14:39:23 +080010402 HDA_CODEC_ENTRY(0x10ec0897, "ALC897", patch_alc662),
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010403 HDA_CODEC_ENTRY(0x10ec0899, "ALC898", patch_alc882),
10404 HDA_CODEC_ENTRY(0x10ec0900, "ALC1150", patch_alc882),
Kailang Yang6d9ffcf2020-01-03 16:24:06 +080010405 HDA_CODEC_ENTRY(0x10ec0b00, "ALCS1200A", patch_alc882),
Kailang Yang65553b12017-07-11 15:15:47 +080010406 HDA_CODEC_ENTRY(0x10ec1168, "ALC1220", patch_alc882),
Kailang Yanga535ad52017-01-16 16:59:26 +080010407 HDA_CODEC_ENTRY(0x10ec1220, "ALC1220", patch_alc882),
Linus Torvalds1da177e2005-04-16 15:20:36 -070010408 {} /* terminator */
10409};
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010410MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_realtek);
Takashi Iwai1289e9e2008-11-27 15:47:11 +010010411
10412MODULE_LICENSE("GPL");
10413MODULE_DESCRIPTION("Realtek HD-audio codec");
10414
Takashi Iwaid8a766a2015-02-17 15:25:37 +010010415static struct hda_codec_driver realtek_driver = {
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010416 .id = snd_hda_id_realtek,
Takashi Iwai1289e9e2008-11-27 15:47:11 +010010417};
10418
Takashi Iwaid8a766a2015-02-17 15:25:37 +010010419module_hda_codec_driver(realtek_driver);