blob: e9ea2e3fc811e2df64b185763feed315561a442a [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,
Takashi Iwai177943a32011-11-09 12:55:18 +01001908 ALC882_FIXUP_EAPD,
Takashi Iwai7a6069b2011-11-09 15:22:01 +01001909 ALC883_FIXUP_EAPD,
Takashi Iwai8812c4f2011-11-09 17:39:15 +01001910 ALC883_FIXUP_ACER_EAPD,
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001911 ALC882_FIXUP_GPIO1,
1912 ALC882_FIXUP_GPIO2,
Takashi Iwaieb844d52011-11-09 18:03:07 +01001913 ALC882_FIXUP_GPIO3,
Takashi Iwai68ef0562011-11-09 18:24:44 +01001914 ALC889_FIXUP_COEF,
1915 ALC882_FIXUP_ASUS_W2JC,
Takashi Iwaic3e837b2011-11-10 16:01:47 +01001916 ALC882_FIXUP_ACER_ASPIRE_4930G,
1917 ALC882_FIXUP_ACER_ASPIRE_8930G,
1918 ALC882_FIXUP_ASPIRE_8930G_VERBS,
Takashi Iwai56710872011-11-14 17:42:11 +01001919 ALC885_FIXUP_MACPRO_GPIO,
Takashi Iwai02a237b2012-02-13 15:25:07 +01001920 ALC889_FIXUP_DAC_ROUTE,
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001921 ALC889_FIXUP_MBP_VREF,
1922 ALC889_FIXUP_IMAC91_VREF,
Adrien Vergée7729a42014-01-24 14:56:14 -05001923 ALC889_FIXUP_MBA11_VREF,
Takashi Iwai0756f092013-12-04 13:59:45 +01001924 ALC889_FIXUP_MBA21_VREF,
Takashi Iwaic20f31e2014-02-03 11:02:10 +01001925 ALC889_FIXUP_MP11_VREF,
Mario Kleiner9f660a12015-12-22 00:45:43 +01001926 ALC889_FIXUP_MP41_VREF,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02001927 ALC882_FIXUP_INV_DMIC,
Takashi Iwaie427c232012-07-29 10:04:08 +02001928 ALC882_FIXUP_NO_PRIMARY_HP,
Takashi Iwai1f0bbf02013-11-28 15:21:21 +01001929 ALC887_FIXUP_ASUS_BASS,
Takashi Iwaieb9ca3a2013-11-28 15:24:34 +01001930 ALC887_FIXUP_BASS_CHMAP,
Takashi Iwai7beb3a62017-04-10 18:05:52 +02001931 ALC1220_FIXUP_GB_DUAL_CODECS,
Peisen0202f5c2017-10-26 10:35:36 +08001932 ALC1220_FIXUP_CLEVO_P950,
Richard Sailer80690a22019-04-02 15:52:04 +02001933 ALC1220_FIXUP_CLEVO_PB51ED,
1934 ALC1220_FIXUP_CLEVO_PB51ED_PINS,
Jian-Hong Panca184352020-10-07 13:22:25 +08001935 ALC887_FIXUP_ASUS_AUDIO,
1936 ALC887_FIXUP_ASUS_HMIC,
Takashi Iwai1d045db2011-07-07 18:23:21 +02001937};
1938
Takashi Iwai68ef0562011-11-09 18:24:44 +01001939static void alc889_fixup_coef(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01001940 const struct hda_fixup *fix, int action)
Takashi Iwai68ef0562011-11-09 18:24:44 +01001941{
Takashi Iwai1727a772013-01-10 09:52:52 +01001942 if (action != HDA_FIXUP_ACT_INIT)
Takashi Iwai68ef0562011-11-09 18:24:44 +01001943 return;
Kailang Yang1df88742014-10-29 16:10:13 +08001944 alc_update_coef_idx(codec, 7, 0, 0x2030);
Takashi Iwai68ef0562011-11-09 18:24:44 +01001945}
1946
Takashi Iwai56710872011-11-14 17:42:11 +01001947/* set up GPIO at initialization */
1948static void alc885_fixup_macpro_gpio(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01001949 const struct hda_fixup *fix, int action)
Takashi Iwai56710872011-11-14 17:42:11 +01001950{
Takashi Iwai215c8502018-06-19 22:34:26 +02001951 struct alc_spec *spec = codec->spec;
1952
1953 spec->gpio_write_delay = true;
1954 alc_fixup_gpio3(codec, fix, action);
Takashi Iwai56710872011-11-14 17:42:11 +01001955}
1956
Takashi Iwai02a237b2012-02-13 15:25:07 +01001957/* Fix the connection of some pins for ALC889:
1958 * At least, Acer Aspire 5935 shows the connections to DAC3/4 don't
1959 * work correctly (bko#42740)
1960 */
1961static void alc889_fixup_dac_route(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01001962 const struct hda_fixup *fix, int action)
Takashi Iwai02a237b2012-02-13 15:25:07 +01001963{
Takashi Iwai1727a772013-01-10 09:52:52 +01001964 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwaief8d60f2012-02-17 10:12:38 +01001965 /* fake the connections during parsing the tree */
Michał Mirosławcaf3c042020-01-03 10:23:48 +01001966 static const hda_nid_t conn1[] = { 0x0c, 0x0d };
1967 static const hda_nid_t conn2[] = { 0x0e, 0x0f };
1968 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
1969 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
1970 snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn2), conn2);
1971 snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn2), conn2);
Takashi Iwai1727a772013-01-10 09:52:52 +01001972 } else if (action == HDA_FIXUP_ACT_PROBE) {
Takashi Iwaief8d60f2012-02-17 10:12:38 +01001973 /* restore the connections */
Michał Mirosławcaf3c042020-01-03 10:23:48 +01001974 static const hda_nid_t conn[] = { 0x0c, 0x0d, 0x0e, 0x0f, 0x26 };
1975 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
1976 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn), conn);
1977 snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn), conn);
1978 snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn), conn);
Takashi Iwai02a237b2012-02-13 15:25:07 +01001979 }
1980}
1981
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001982/* Set VREF on HP pin */
1983static void alc889_fixup_mbp_vref(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01001984 const struct hda_fixup *fix, int action)
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001985{
Michał Mirosławcaf3c042020-01-03 10:23:48 +01001986 static const hda_nid_t nids[] = { 0x14, 0x15, 0x19 };
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001987 struct alc_spec *spec = codec->spec;
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001988 int i;
1989
Takashi Iwai1727a772013-01-10 09:52:52 +01001990 if (action != HDA_FIXUP_ACT_INIT)
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001991 return;
1992 for (i = 0; i < ARRAY_SIZE(nids); i++) {
1993 unsigned int val = snd_hda_codec_get_pincfg(codec, nids[i]);
1994 if (get_defcfg_device(val) != AC_JACK_HP_OUT)
1995 continue;
Takashi Iwaid3f02d62013-01-10 10:12:22 +01001996 val = snd_hda_codec_get_pin_target(codec, nids[i]);
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01001997 val |= AC_PINCTL_VREF_80;
Takashi Iwaicdd03ce2012-04-20 12:34:50 +02001998 snd_hda_set_pin_ctl(codec, nids[i], val);
Takashi Iwai08c189f2012-12-19 15:22:24 +01001999 spec->gen.keep_vref_in_automute = 1;
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002000 break;
2001 }
2002}
2003
Takashi Iwai0756f092013-12-04 13:59:45 +01002004static void alc889_fixup_mac_pins(struct hda_codec *codec,
2005 const hda_nid_t *nids, int num_nids)
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002006{
2007 struct alc_spec *spec = codec->spec;
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002008 int i;
2009
Takashi Iwai0756f092013-12-04 13:59:45 +01002010 for (i = 0; i < num_nids; i++) {
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002011 unsigned int val;
Takashi Iwaid3f02d62013-01-10 10:12:22 +01002012 val = snd_hda_codec_get_pin_target(codec, nids[i]);
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002013 val |= AC_PINCTL_VREF_50;
Takashi Iwaicdd03ce2012-04-20 12:34:50 +02002014 snd_hda_set_pin_ctl(codec, nids[i], val);
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002015 }
Takashi Iwai08c189f2012-12-19 15:22:24 +01002016 spec->gen.keep_vref_in_automute = 1;
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002017}
2018
Takashi Iwai0756f092013-12-04 13:59:45 +01002019/* Set VREF on speaker pins on imac91 */
2020static void alc889_fixup_imac91_vref(struct hda_codec *codec,
2021 const struct hda_fixup *fix, int action)
2022{
Michał Mirosławcaf3c042020-01-03 10:23:48 +01002023 static const hda_nid_t nids[] = { 0x18, 0x1a };
Takashi Iwai0756f092013-12-04 13:59:45 +01002024
2025 if (action == HDA_FIXUP_ACT_INIT)
2026 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2027}
2028
Adrien Vergée7729a42014-01-24 14:56:14 -05002029/* Set VREF on speaker pins on mba11 */
2030static void alc889_fixup_mba11_vref(struct hda_codec *codec,
2031 const struct hda_fixup *fix, int action)
2032{
Michał Mirosławcaf3c042020-01-03 10:23:48 +01002033 static const hda_nid_t nids[] = { 0x18 };
Adrien Vergée7729a42014-01-24 14:56:14 -05002034
2035 if (action == HDA_FIXUP_ACT_INIT)
2036 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2037}
2038
Takashi Iwai0756f092013-12-04 13:59:45 +01002039/* Set VREF on speaker pins on mba21 */
2040static void alc889_fixup_mba21_vref(struct hda_codec *codec,
2041 const struct hda_fixup *fix, int action)
2042{
Michał Mirosławcaf3c042020-01-03 10:23:48 +01002043 static const hda_nid_t nids[] = { 0x18, 0x19 };
Takashi Iwai0756f092013-12-04 13:59:45 +01002044
2045 if (action == HDA_FIXUP_ACT_INIT)
2046 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2047}
2048
Takashi Iwaie427c232012-07-29 10:04:08 +02002049/* Don't take HP output as primary
Fernando Luis Vázquez Caod9111492013-02-12 16:49:46 +09002050 * Strangely, the speaker output doesn't work on Vaio Z and some Vaio
2051 * all-in-one desktop PCs (for example VGC-LN51JGB) through DAC 0x05
Takashi Iwaie427c232012-07-29 10:04:08 +02002052 */
2053static void alc882_fixup_no_primary_hp(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01002054 const struct hda_fixup *fix, int action)
Takashi Iwaie427c232012-07-29 10:04:08 +02002055{
2056 struct alc_spec *spec = codec->spec;
Takashi Iwaida96fb52013-07-29 16:54:36 +02002057 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai08c189f2012-12-19 15:22:24 +01002058 spec->gen.no_primary_hp = 1;
Takashi Iwaida96fb52013-07-29 16:54:36 +02002059 spec->gen.no_multi_io = 1;
2060 }
Takashi Iwaie427c232012-07-29 10:04:08 +02002061}
2062
Takashi Iwaieb9ca3a2013-11-28 15:24:34 +01002063static void alc_fixup_bass_chmap(struct hda_codec *codec,
2064 const struct hda_fixup *fix, int action);
2065
Takashi Iwai7beb3a62017-04-10 18:05:52 +02002066/* For dual-codec configuration, we need to disable some features to avoid
2067 * conflicts of kctls and PCM streams
2068 */
2069static void alc_fixup_dual_codecs(struct hda_codec *codec,
2070 const struct hda_fixup *fix, int action)
2071{
2072 struct alc_spec *spec = codec->spec;
2073
2074 if (action != HDA_FIXUP_ACT_PRE_PROBE)
2075 return;
2076 /* disable vmaster */
2077 spec->gen.suppress_vmaster = 1;
2078 /* auto-mute and auto-mic switch don't work with multiple codecs */
2079 spec->gen.suppress_auto_mute = 1;
2080 spec->gen.suppress_auto_mic = 1;
2081 /* disable aamix as well */
2082 spec->gen.mixer_nid = 0;
2083 /* add location prefix to avoid conflicts */
2084 codec->force_pin_prefix = 1;
2085}
2086
2087static void rename_ctl(struct hda_codec *codec, const char *oldname,
2088 const char *newname)
2089{
2090 struct snd_kcontrol *kctl;
2091
2092 kctl = snd_hda_find_mixer_ctl(codec, oldname);
2093 if (kctl)
2094 strcpy(kctl->id.name, newname);
2095}
2096
2097static void alc1220_fixup_gb_dual_codecs(struct hda_codec *codec,
2098 const struct hda_fixup *fix,
2099 int action)
2100{
2101 alc_fixup_dual_codecs(codec, fix, action);
2102 switch (action) {
2103 case HDA_FIXUP_ACT_PRE_PROBE:
2104 /* override card longname to provide a unique UCM profile */
2105 strcpy(codec->card->longname, "HDAudio-Gigabyte-ALC1220DualCodecs");
2106 break;
2107 case HDA_FIXUP_ACT_BUILD:
2108 /* rename Capture controls depending on the codec */
2109 rename_ctl(codec, "Capture Volume",
2110 codec->addr == 0 ?
2111 "Rear-Panel Capture Volume" :
2112 "Front-Panel Capture Volume");
2113 rename_ctl(codec, "Capture Switch",
2114 codec->addr == 0 ?
2115 "Rear-Panel Capture Switch" :
2116 "Front-Panel Capture Switch");
2117 break;
2118 }
2119}
2120
Peisen0202f5c2017-10-26 10:35:36 +08002121static void alc1220_fixup_clevo_p950(struct hda_codec *codec,
2122 const struct hda_fixup *fix,
2123 int action)
2124{
Michał Mirosławcaf3c042020-01-03 10:23:48 +01002125 static const hda_nid_t conn1[] = { 0x0c };
Peisen0202f5c2017-10-26 10:35:36 +08002126
2127 if (action != HDA_FIXUP_ACT_PRE_PROBE)
2128 return;
2129
2130 alc_update_coef_idx(codec, 0x7, 0, 0x3c3);
2131 /* We therefore want to make sure 0x14 (front headphone) and
2132 * 0x1b (speakers) use the stereo DAC 0x02
2133 */
Michał Mirosławcaf3c042020-01-03 10:23:48 +01002134 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2135 snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
Peisen0202f5c2017-10-26 10:35:36 +08002136}
2137
Jeremy Soller7f665b12019-02-13 10:56:19 -07002138static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
2139 const struct hda_fixup *fix, int action);
2140
Richard Sailer80690a22019-04-02 15:52:04 +02002141static void alc1220_fixup_clevo_pb51ed(struct hda_codec *codec,
Jeremy Soller7f665b12019-02-13 10:56:19 -07002142 const struct hda_fixup *fix,
2143 int action)
2144{
2145 alc1220_fixup_clevo_p950(codec, fix, action);
2146 alc_fixup_headset_mode_no_hp_mic(codec, fix, action);
2147}
2148
Jian-Hong Panca184352020-10-07 13:22:25 +08002149static void alc887_asus_hp_automute_hook(struct hda_codec *codec,
2150 struct hda_jack_callback *jack)
2151{
2152 struct alc_spec *spec = codec->spec;
2153 unsigned int vref;
2154
2155 snd_hda_gen_hp_automute(codec, jack);
2156
2157 if (spec->gen.hp_jack_present)
2158 vref = AC_PINCTL_VREF_80;
2159 else
2160 vref = AC_PINCTL_VREF_HIZ;
2161 snd_hda_set_pin_ctl(codec, 0x19, PIN_HP | vref);
2162}
2163
2164static void alc887_fixup_asus_jack(struct hda_codec *codec,
2165 const struct hda_fixup *fix, int action)
2166{
2167 struct alc_spec *spec = codec->spec;
2168 if (action != HDA_FIXUP_ACT_PROBE)
2169 return;
2170 snd_hda_set_pin_ctl_cache(codec, 0x1b, PIN_HP);
2171 spec->gen.hp_automute_hook = alc887_asus_hp_automute_hook;
2172}
2173
Takashi Iwai1727a772013-01-10 09:52:52 +01002174static const struct hda_fixup alc882_fixups[] = {
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002175 [ALC882_FIXUP_ABIT_AW9D_MAX] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002176 .type = HDA_FIXUP_PINS,
2177 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02002178 { 0x15, 0x01080104 }, /* side */
2179 { 0x16, 0x01011012 }, /* rear */
2180 { 0x17, 0x01016011 }, /* clfe */
2181 { }
2182 }
2183 },
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002184 [ALC882_FIXUP_LENOVO_Y530] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002185 .type = HDA_FIXUP_PINS,
2186 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02002187 { 0x15, 0x99130112 }, /* rear int speakers */
2188 { 0x16, 0x99130111 }, /* subwoofer */
2189 { }
2190 }
2191 },
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002192 [ALC882_FIXUP_PB_M5210] = {
Takashi Iwaifd108212013-01-10 10:18:14 +01002193 .type = HDA_FIXUP_PINCTLS,
2194 .v.pins = (const struct hda_pintbl[]) {
2195 { 0x19, PIN_VREF50 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02002196 {}
2197 }
2198 },
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002199 [ALC882_FIXUP_ACER_ASPIRE_7736] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002200 .type = HDA_FIXUP_FUNC,
Takashi Iwai23d30f22012-05-07 17:17:32 +02002201 .v.func = alc_fixup_sku_ignore,
Takashi Iwai1d045db2011-07-07 18:23:21 +02002202 },
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002203 [ALC882_FIXUP_ASUS_W90V] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002204 .type = HDA_FIXUP_PINS,
2205 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai5cdf7452011-10-26 23:04:08 +02002206 { 0x16, 0x99130110 }, /* fix sequence for CLFE */
2207 { }
2208 }
2209 },
Marton Balint8f239212012-03-05 21:33:23 +01002210 [ALC889_FIXUP_CD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002211 .type = HDA_FIXUP_PINS,
2212 .v.pins = (const struct hda_pintbl[]) {
Marton Balint8f239212012-03-05 21:33:23 +01002213 { 0x1c, 0x993301f0 }, /* CD */
2214 { }
2215 }
2216 },
David Henningssonb2c53e22014-01-01 14:01:34 +01002217 [ALC889_FIXUP_FRONT_HP_NO_PRESENCE] = {
2218 .type = HDA_FIXUP_PINS,
2219 .v.pins = (const struct hda_pintbl[]) {
2220 { 0x1b, 0x02214120 }, /* Front HP jack is flaky, disable jack detect */
2221 { }
2222 },
2223 .chained = true,
2224 .chain_id = ALC889_FIXUP_CD,
2225 },
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002226 [ALC889_FIXUP_VAIO_TT] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002227 .type = HDA_FIXUP_PINS,
2228 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002229 { 0x17, 0x90170111 }, /* hidden surround speaker */
2230 { }
2231 }
2232 },
Takashi Iwai0e7cc2e2011-11-09 12:42:48 +01002233 [ALC888_FIXUP_EEE1601] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002234 .type = HDA_FIXUP_VERBS,
Takashi Iwai0e7cc2e2011-11-09 12:42:48 +01002235 .v.verbs = (const struct hda_verb[]) {
2236 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2237 { 0x20, AC_VERB_SET_PROC_COEF, 0x0838 },
2238 { }
2239 }
Takashi Iwai177943a32011-11-09 12:55:18 +01002240 },
2241 [ALC882_FIXUP_EAPD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002242 .type = HDA_FIXUP_VERBS,
Takashi Iwai177943a32011-11-09 12:55:18 +01002243 .v.verbs = (const struct hda_verb[]) {
2244 /* change to EAPD mode */
2245 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2246 { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
2247 { }
2248 }
2249 },
Takashi Iwai7a6069b2011-11-09 15:22:01 +01002250 [ALC883_FIXUP_EAPD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002251 .type = HDA_FIXUP_VERBS,
Takashi Iwai7a6069b2011-11-09 15:22:01 +01002252 .v.verbs = (const struct hda_verb[]) {
2253 /* change to EAPD mode */
2254 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2255 { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2256 { }
2257 }
2258 },
Takashi Iwai8812c4f2011-11-09 17:39:15 +01002259 [ALC883_FIXUP_ACER_EAPD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002260 .type = HDA_FIXUP_VERBS,
Takashi Iwai8812c4f2011-11-09 17:39:15 +01002261 .v.verbs = (const struct hda_verb[]) {
2262 /* eanable EAPD on Acer laptops */
2263 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2264 { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2265 { }
2266 }
2267 },
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002268 [ALC882_FIXUP_GPIO1] = {
Takashi Iwai5579cd62018-06-19 22:22:41 +02002269 .type = HDA_FIXUP_FUNC,
2270 .v.func = alc_fixup_gpio1,
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002271 },
2272 [ALC882_FIXUP_GPIO2] = {
Takashi Iwai5579cd62018-06-19 22:22:41 +02002273 .type = HDA_FIXUP_FUNC,
2274 .v.func = alc_fixup_gpio2,
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002275 },
Takashi Iwaieb844d52011-11-09 18:03:07 +01002276 [ALC882_FIXUP_GPIO3] = {
Takashi Iwai5579cd62018-06-19 22:22:41 +02002277 .type = HDA_FIXUP_FUNC,
2278 .v.func = alc_fixup_gpio3,
Takashi Iwaieb844d52011-11-09 18:03:07 +01002279 },
Takashi Iwai68ef0562011-11-09 18:24:44 +01002280 [ALC882_FIXUP_ASUS_W2JC] = {
Takashi Iwai5579cd62018-06-19 22:22:41 +02002281 .type = HDA_FIXUP_FUNC,
2282 .v.func = alc_fixup_gpio1,
Takashi Iwai68ef0562011-11-09 18:24:44 +01002283 .chained = true,
2284 .chain_id = ALC882_FIXUP_EAPD,
2285 },
2286 [ALC889_FIXUP_COEF] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002287 .type = HDA_FIXUP_FUNC,
Takashi Iwai68ef0562011-11-09 18:24:44 +01002288 .v.func = alc889_fixup_coef,
2289 },
Takashi Iwaic3e837b2011-11-10 16:01:47 +01002290 [ALC882_FIXUP_ACER_ASPIRE_4930G] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002291 .type = HDA_FIXUP_PINS,
2292 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaic3e837b2011-11-10 16:01:47 +01002293 { 0x16, 0x99130111 }, /* CLFE speaker */
2294 { 0x17, 0x99130112 }, /* surround speaker */
2295 { }
Takashi Iwai038d4fe2012-04-11 17:18:12 +02002296 },
2297 .chained = true,
2298 .chain_id = ALC882_FIXUP_GPIO1,
Takashi Iwaic3e837b2011-11-10 16:01:47 +01002299 },
2300 [ALC882_FIXUP_ACER_ASPIRE_8930G] = {
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 { 0x1b, 0x99130112 }, /* surround speaker */
2305 { }
2306 },
2307 .chained = true,
2308 .chain_id = ALC882_FIXUP_ASPIRE_8930G_VERBS,
2309 },
2310 [ALC882_FIXUP_ASPIRE_8930G_VERBS] = {
2311 /* additional init verbs for Acer Aspire 8930G */
Takashi Iwai1727a772013-01-10 09:52:52 +01002312 .type = HDA_FIXUP_VERBS,
Takashi Iwaic3e837b2011-11-10 16:01:47 +01002313 .v.verbs = (const struct hda_verb[]) {
2314 /* Enable all DACs */
2315 /* DAC DISABLE/MUTE 1? */
2316 /* setting bits 1-5 disables DAC nids 0x02-0x06
2317 * apparently. Init=0x38 */
2318 { 0x20, AC_VERB_SET_COEF_INDEX, 0x03 },
2319 { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2320 /* DAC DISABLE/MUTE 2? */
2321 /* some bit here disables the other DACs.
2322 * Init=0x4900 */
2323 { 0x20, AC_VERB_SET_COEF_INDEX, 0x08 },
2324 { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2325 /* DMIC fix
2326 * This laptop has a stereo digital microphone.
2327 * The mics are only 1cm apart which makes the stereo
2328 * useless. However, either the mic or the ALC889
2329 * makes the signal become a difference/sum signal
2330 * instead of standard stereo, which is annoying.
2331 * So instead we flip this bit which makes the
2332 * codec replicate the sum signal to both channels,
2333 * turning it into a normal mono mic.
2334 */
2335 /* DMIC_CONTROL? Init value = 0x0001 */
2336 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2337 { 0x20, AC_VERB_SET_PROC_COEF, 0x0003 },
2338 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2339 { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2340 { }
Takashi Iwai038d4fe2012-04-11 17:18:12 +02002341 },
2342 .chained = true,
2343 .chain_id = ALC882_FIXUP_GPIO1,
Takashi Iwaic3e837b2011-11-10 16:01:47 +01002344 },
Takashi Iwai56710872011-11-14 17:42:11 +01002345 [ALC885_FIXUP_MACPRO_GPIO] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002346 .type = HDA_FIXUP_FUNC,
Takashi Iwai56710872011-11-14 17:42:11 +01002347 .v.func = alc885_fixup_macpro_gpio,
2348 },
Takashi Iwai02a237b2012-02-13 15:25:07 +01002349 [ALC889_FIXUP_DAC_ROUTE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002350 .type = HDA_FIXUP_FUNC,
Takashi Iwai02a237b2012-02-13 15:25:07 +01002351 .v.func = alc889_fixup_dac_route,
2352 },
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002353 [ALC889_FIXUP_MBP_VREF] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002354 .type = HDA_FIXUP_FUNC,
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002355 .v.func = alc889_fixup_mbp_vref,
2356 .chained = true,
2357 .chain_id = ALC882_FIXUP_GPIO1,
2358 },
2359 [ALC889_FIXUP_IMAC91_VREF] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002360 .type = HDA_FIXUP_FUNC,
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002361 .v.func = alc889_fixup_imac91_vref,
2362 .chained = true,
2363 .chain_id = ALC882_FIXUP_GPIO1,
2364 },
Adrien Vergée7729a42014-01-24 14:56:14 -05002365 [ALC889_FIXUP_MBA11_VREF] = {
2366 .type = HDA_FIXUP_FUNC,
2367 .v.func = alc889_fixup_mba11_vref,
2368 .chained = true,
2369 .chain_id = ALC889_FIXUP_MBP_VREF,
2370 },
Takashi Iwai0756f092013-12-04 13:59:45 +01002371 [ALC889_FIXUP_MBA21_VREF] = {
2372 .type = HDA_FIXUP_FUNC,
2373 .v.func = alc889_fixup_mba21_vref,
2374 .chained = true,
2375 .chain_id = ALC889_FIXUP_MBP_VREF,
2376 },
Takashi Iwaic20f31e2014-02-03 11:02:10 +01002377 [ALC889_FIXUP_MP11_VREF] = {
2378 .type = HDA_FIXUP_FUNC,
2379 .v.func = alc889_fixup_mba11_vref,
2380 .chained = true,
2381 .chain_id = ALC885_FIXUP_MACPRO_GPIO,
2382 },
Mario Kleiner9f660a12015-12-22 00:45:43 +01002383 [ALC889_FIXUP_MP41_VREF] = {
2384 .type = HDA_FIXUP_FUNC,
2385 .v.func = alc889_fixup_mbp_vref,
2386 .chained = true,
2387 .chain_id = ALC885_FIXUP_MACPRO_GPIO,
2388 },
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002389 [ALC882_FIXUP_INV_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002390 .type = HDA_FIXUP_FUNC,
David Henningsson9d36a7d2014-10-07 10:18:42 +02002391 .v.func = alc_fixup_inv_dmic,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002392 },
Takashi Iwaie427c232012-07-29 10:04:08 +02002393 [ALC882_FIXUP_NO_PRIMARY_HP] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002394 .type = HDA_FIXUP_FUNC,
Takashi Iwaie427c232012-07-29 10:04:08 +02002395 .v.func = alc882_fixup_no_primary_hp,
2396 },
Takashi Iwai1f0bbf02013-11-28 15:21:21 +01002397 [ALC887_FIXUP_ASUS_BASS] = {
2398 .type = HDA_FIXUP_PINS,
2399 .v.pins = (const struct hda_pintbl[]) {
2400 {0x16, 0x99130130}, /* bass speaker */
2401 {}
2402 },
Takashi Iwaieb9ca3a2013-11-28 15:24:34 +01002403 .chained = true,
2404 .chain_id = ALC887_FIXUP_BASS_CHMAP,
2405 },
2406 [ALC887_FIXUP_BASS_CHMAP] = {
2407 .type = HDA_FIXUP_FUNC,
2408 .v.func = alc_fixup_bass_chmap,
Takashi Iwai1f0bbf02013-11-28 15:21:21 +01002409 },
Takashi Iwai7beb3a62017-04-10 18:05:52 +02002410 [ALC1220_FIXUP_GB_DUAL_CODECS] = {
2411 .type = HDA_FIXUP_FUNC,
2412 .v.func = alc1220_fixup_gb_dual_codecs,
2413 },
Peisen0202f5c2017-10-26 10:35:36 +08002414 [ALC1220_FIXUP_CLEVO_P950] = {
2415 .type = HDA_FIXUP_FUNC,
2416 .v.func = alc1220_fixup_clevo_p950,
2417 },
Richard Sailer80690a22019-04-02 15:52:04 +02002418 [ALC1220_FIXUP_CLEVO_PB51ED] = {
Jeremy Soller7f665b12019-02-13 10:56:19 -07002419 .type = HDA_FIXUP_FUNC,
Richard Sailer80690a22019-04-02 15:52:04 +02002420 .v.func = alc1220_fixup_clevo_pb51ed,
Jeremy Soller7f665b12019-02-13 10:56:19 -07002421 },
Richard Sailer80690a22019-04-02 15:52:04 +02002422 [ALC1220_FIXUP_CLEVO_PB51ED_PINS] = {
Jeremy Soller7f665b12019-02-13 10:56:19 -07002423 .type = HDA_FIXUP_PINS,
2424 .v.pins = (const struct hda_pintbl[]) {
2425 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
2426 {}
2427 },
2428 .chained = true,
Richard Sailer80690a22019-04-02 15:52:04 +02002429 .chain_id = ALC1220_FIXUP_CLEVO_PB51ED,
Jeremy Soller7f665b12019-02-13 10:56:19 -07002430 },
Jian-Hong Panca184352020-10-07 13:22:25 +08002431 [ALC887_FIXUP_ASUS_AUDIO] = {
2432 .type = HDA_FIXUP_PINS,
2433 .v.pins = (const struct hda_pintbl[]) {
2434 { 0x15, 0x02a14150 }, /* use as headset mic, without its own jack detect */
2435 { 0x19, 0x22219420 },
2436 {}
2437 },
2438 },
2439 [ALC887_FIXUP_ASUS_HMIC] = {
2440 .type = HDA_FIXUP_FUNC,
2441 .v.func = alc887_fixup_asus_jack,
2442 .chained = true,
2443 .chain_id = ALC887_FIXUP_ASUS_AUDIO,
2444 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02002445};
2446
2447static const struct snd_pci_quirk alc882_fixup_tbl[] = {
Takashi Iwai8812c4f2011-11-09 17:39:15 +01002448 SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD),
2449 SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
Takashi Iwaib5d724b2015-06-02 19:57:08 +02002450 SND_PCI_QUIRK(0x1025, 0x0107, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
Takashi Iwai8812c4f2011-11-09 17:39:15 +01002451 SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD),
2452 SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2453 SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD),
2454 SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_FIXUP_ACER_EAPD),
Takashi Iwaic3e837b2011-11-10 16:01:47 +01002455 SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
2456 ALC882_FIXUP_ACER_ASPIRE_4930G),
2457 SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
2458 ALC882_FIXUP_ACER_ASPIRE_4930G),
2459 SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
2460 ALC882_FIXUP_ACER_ASPIRE_8930G),
2461 SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
2462 ALC882_FIXUP_ACER_ASPIRE_8930G),
2463 SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
2464 ALC882_FIXUP_ACER_ASPIRE_4930G),
2465 SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
2466 ALC882_FIXUP_ACER_ASPIRE_4930G),
2467 SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
2468 ALC882_FIXUP_ACER_ASPIRE_4930G),
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002469 SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
Takashi Iwaif5c53d82012-05-07 10:07:33 +02002470 SND_PCI_QUIRK(0x1025, 0x021e, "Acer Aspire 5739G",
2471 ALC882_FIXUP_ACER_ASPIRE_4930G),
Takashi Iwai02a237b2012-02-13 15:25:07 +01002472 SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),
Takashi Iwaife97da12012-04-12 08:00:19 +02002473 SND_PCI_QUIRK(0x1025, 0x026b, "Acer Aspire 8940G", ALC882_FIXUP_ACER_ASPIRE_8930G),
Takashi Iwaiac9b1cd2011-11-09 17:45:55 +01002474 SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736),
Takashi Iwai177943a32011-11-09 12:55:18 +01002475 SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD),
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002476 SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),
Takashi Iwai68ef0562011-11-09 18:24:44 +01002477 SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_FIXUP_ASUS_W2JC),
Jian-Hong Panca184352020-10-07 13:22:25 +08002478 SND_PCI_QUIRK(0x1043, 0x2390, "Asus D700SA", ALC887_FIXUP_ASUS_HMIC),
Takashi Iwai0e7cc2e2011-11-09 12:42:48 +01002479 SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601),
Takashi Iwai1f0bbf02013-11-28 15:21:21 +01002480 SND_PCI_QUIRK(0x1043, 0x84bc, "ASUS ET2700", ALC887_FIXUP_ASUS_BASS),
Takashi Iwai85bcf962016-12-06 16:20:36 +01002481 SND_PCI_QUIRK(0x1043, 0x8691, "ASUS ROG Ranger VIII", ALC882_FIXUP_GPIO3),
Takashi Iwaiac9b1cd2011-11-09 17:45:55 +01002482 SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT),
Takashi Iwaie427c232012-07-29 10:04:08 +02002483 SND_PCI_QUIRK(0x104d, 0x905a, "Sony Vaio Z", ALC882_FIXUP_NO_PRIMARY_HP),
Sergei A. Trusov3f3c3712017-08-02 20:23:48 +10002484 SND_PCI_QUIRK(0x104d, 0x9060, "Sony Vaio VPCL14M1R", ALC882_FIXUP_NO_PRIMARY_HP),
Fernando Luis Vázquez Cao12e31a72013-02-12 16:47:44 +09002485 SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP),
Takashi Iwaic44d9b12016-02-07 09:38:26 +01002486 SND_PCI_QUIRK(0x104d, 0x9044, "Sony VAIO AiO", ALC882_FIXUP_NO_PRIMARY_HP),
Takashi Iwai56710872011-11-14 17:42:11 +01002487
2488 /* All Apple entries are in codec SSIDs */
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002489 SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF),
2490 SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC889_FIXUP_MBP_VREF),
2491 SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
Takashi Iwaic20f31e2014-02-03 11:02:10 +01002492 SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC889_FIXUP_MP11_VREF),
Takashi Iwai56710872011-11-14 17:42:11 +01002493 SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_FIXUP_MACPRO_GPIO),
2494 SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_FIXUP_MACPRO_GPIO),
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002495 SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC889_FIXUP_MBP_VREF),
2496 SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889_FIXUP_MBP_VREF),
Takashi Iwai56710872011-11-14 17:42:11 +01002497 SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD),
Adrien Vergée7729a42014-01-24 14:56:14 -05002498 SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC889_FIXUP_MBA11_VREF),
Takashi Iwai0756f092013-12-04 13:59:45 +01002499 SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBA21_VREF),
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002500 SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889_FIXUP_MBP_VREF),
2501 SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
Takashi Iwai56710872011-11-14 17:42:11 +01002502 SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO),
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002503 SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF),
2504 SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF),
2505 SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF),
Mario Kleiner9f660a12015-12-22 00:45:43 +01002506 SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 4,1/5,1", ALC889_FIXUP_MP41_VREF),
Takashi Iwai05193632012-11-12 10:07:36 +01002507 SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF),
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002508 SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),
2509 SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),
Takashi Iwai649ccd02015-07-30 22:30:29 +02002510 SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_MBA11_VREF),
Takashi Iwai56710872011-11-14 17:42:11 +01002511
Takashi Iwai7a6069b2011-11-09 15:22:01 +01002512 SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),
David Henningssonb2c53e22014-01-01 14:01:34 +01002513 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE),
Takashi Iwai7beb3a62017-04-10 18:05:52 +02002514 SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
Christian Lachner0d45e862020-02-23 10:24:16 +01002515 SND_PCI_QUIRK(0x1458, 0xa0cd, "Gigabyte X570 Aorus Master", ALC1220_FIXUP_CLEVO_P950),
Christian Lachnerd9e8fe02020-05-18 07:38:44 +02002516 SND_PCI_QUIRK(0x1458, 0xa0ce, "Gigabyte X570 Aorus Xtreme", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwaia0b03952020-06-16 15:21:50 +02002517 SND_PCI_QUIRK(0x1462, 0x11f7, "MSI-GE63", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwaia655e2b2020-02-17 16:19:47 +01002518 SND_PCI_QUIRK(0x1462, 0x1228, "MSI-GP63", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwai09926202020-12-20 09:09:43 +01002519 SND_PCI_QUIRK(0x1462, 0x1229, "MSI-GP73", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwai1d3aa4a2020-04-08 15:56:45 +02002520 SND_PCI_QUIRK(0x1462, 0x1275, "MSI-GL63", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwai7dafba32020-02-12 09:10:47 +01002521 SND_PCI_QUIRK(0x1462, 0x1276, "MSI-GL73", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwaicc5049a2020-02-18 09:09:15 +01002522 SND_PCI_QUIRK(0x1462, 0x1293, "MSI-GP65", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwaid2c3b142017-06-01 09:35:30 +02002523 SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),
Takashi Iwai63691582017-05-22 16:32:46 +02002524 SND_PCI_QUIRK(0x1462, 0xda57, "MSI Z270-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
Takashi Iwaid2c3b142017-06-01 09:35:30 +02002525 SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
Takashi Iwai5c0ebfb2011-11-07 17:59:13 +01002526 SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
Peisen0202f5c2017-10-26 10:35:36 +08002527 SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),
PeiSen Houb5acfe12020-11-11 08:58:59 +01002528 SND_PCI_QUIRK(0x1558, 0x9506, "Clevo P955HQ", ALC1220_FIXUP_CLEVO_P950),
2529 SND_PCI_QUIRK(0x1558, 0x950A, "Clevo P955H[PR]", ALC1220_FIXUP_CLEVO_P950),
Takashi Iwaif3d737b2018-07-17 17:08:32 +02002530 SND_PCI_QUIRK(0x1558, 0x95e1, "Clevo P95xER", ALC1220_FIXUP_CLEVO_P950),
Jeremy Soller2f0d5202018-05-07 09:28:45 -06002531 SND_PCI_QUIRK(0x1558, 0x95e2, "Clevo P950ER", ALC1220_FIXUP_CLEVO_P950),
PeiSen Houb5acfe12020-11-11 08:58:59 +01002532 SND_PCI_QUIRK(0x1558, 0x95e3, "Clevo P955[ER]T", ALC1220_FIXUP_CLEVO_P950),
2533 SND_PCI_QUIRK(0x1558, 0x95e4, "Clevo P955ER", ALC1220_FIXUP_CLEVO_P950),
2534 SND_PCI_QUIRK(0x1558, 0x95e5, "Clevo P955EE6", ALC1220_FIXUP_CLEVO_P950),
2535 SND_PCI_QUIRK(0x1558, 0x95e6, "Clevo P950R[CDF]", ALC1220_FIXUP_CLEVO_P950),
Richard Sailer503d90b2019-06-19 13:33:11 +02002536 SND_PCI_QUIRK(0x1558, 0x96e1, "Clevo P960[ER][CDFN]-K", ALC1220_FIXUP_CLEVO_P950),
2537 SND_PCI_QUIRK(0x1558, 0x97e1, "Clevo P970[ER][CDFN]", ALC1220_FIXUP_CLEVO_P950),
PeiSen Houb5acfe12020-11-11 08:58:59 +01002538 SND_PCI_QUIRK(0x1558, 0x97e2, "Clevo P970RC-M", ALC1220_FIXUP_CLEVO_P950),
PeiSen Hou259eb822020-05-19 08:50:12 +02002539 SND_PCI_QUIRK(0x1558, 0x50d3, "Clevo PC50[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
PeiSen Houb5acfe12020-11-11 08:58:59 +01002540 SND_PCI_QUIRK(0x1558, 0x65d1, "Clevo PB51[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2541 SND_PCI_QUIRK(0x1558, 0x65d2, "Clevo PB51R[CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2542 SND_PCI_QUIRK(0x1558, 0x65e1, "Clevo PB51[ED][DF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2543 SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2544 SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
PeiSen Hou259eb822020-05-19 08:50:12 +02002545 SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2546 SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
Takashi Iwai7a6069b2011-11-09 15:22:01 +01002547 SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
2548 SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),
Takashi Iwaiac9b1cd2011-11-09 17:45:55 +01002549 SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),
Takashi Iwai68ef0562011-11-09 18:24:44 +01002550 SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_FIXUP_COEF),
Takashi Iwai1d045db2011-07-07 18:23:21 +02002551 {}
2552};
2553
Takashi Iwai1727a772013-01-10 09:52:52 +01002554static const struct hda_model_fixup alc882_fixup_models[] = {
Takashi Iwai772c2912018-06-26 17:17:53 +02002555 {.id = ALC882_FIXUP_ABIT_AW9D_MAX, .name = "abit-aw9d"},
2556 {.id = ALC882_FIXUP_LENOVO_Y530, .name = "lenovo-y530"},
2557 {.id = ALC882_FIXUP_ACER_ASPIRE_7736, .name = "acer-aspire-7736"},
2558 {.id = ALC882_FIXUP_ASUS_W90V, .name = "asus-w90v"},
2559 {.id = ALC889_FIXUP_CD, .name = "cd"},
2560 {.id = ALC889_FIXUP_FRONT_HP_NO_PRESENCE, .name = "no-front-hp"},
2561 {.id = ALC889_FIXUP_VAIO_TT, .name = "vaio-tt"},
2562 {.id = ALC888_FIXUP_EEE1601, .name = "eee1601"},
2563 {.id = ALC882_FIXUP_EAPD, .name = "alc882-eapd"},
2564 {.id = ALC883_FIXUP_EAPD, .name = "alc883-eapd"},
2565 {.id = ALC882_FIXUP_GPIO1, .name = "gpio1"},
2566 {.id = ALC882_FIXUP_GPIO2, .name = "gpio2"},
2567 {.id = ALC882_FIXUP_GPIO3, .name = "gpio3"},
2568 {.id = ALC889_FIXUP_COEF, .name = "alc889-coef"},
2569 {.id = ALC882_FIXUP_ASUS_W2JC, .name = "asus-w2jc"},
Takashi Iwai912093b2012-04-11 14:03:41 +02002570 {.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name = "acer-aspire-4930g"},
2571 {.id = ALC882_FIXUP_ACER_ASPIRE_8930G, .name = "acer-aspire-8930g"},
2572 {.id = ALC883_FIXUP_ACER_EAPD, .name = "acer-aspire"},
Takashi Iwai772c2912018-06-26 17:17:53 +02002573 {.id = ALC885_FIXUP_MACPRO_GPIO, .name = "macpro-gpio"},
2574 {.id = ALC889_FIXUP_DAC_ROUTE, .name = "dac-route"},
2575 {.id = ALC889_FIXUP_MBP_VREF, .name = "mbp-vref"},
2576 {.id = ALC889_FIXUP_IMAC91_VREF, .name = "imac91-vref"},
2577 {.id = ALC889_FIXUP_MBA11_VREF, .name = "mba11-vref"},
2578 {.id = ALC889_FIXUP_MBA21_VREF, .name = "mba21-vref"},
2579 {.id = ALC889_FIXUP_MP11_VREF, .name = "mp11-vref"},
2580 {.id = ALC889_FIXUP_MP41_VREF, .name = "mp41-vref"},
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002581 {.id = ALC882_FIXUP_INV_DMIC, .name = "inv-dmic"},
Takashi Iwaie427c232012-07-29 10:04:08 +02002582 {.id = ALC882_FIXUP_NO_PRIMARY_HP, .name = "no-primary-hp"},
Takashi Iwai772c2912018-06-26 17:17:53 +02002583 {.id = ALC887_FIXUP_ASUS_BASS, .name = "asus-bass"},
Takashi Iwaiba90d6a2017-05-22 16:38:47 +02002584 {.id = ALC1220_FIXUP_GB_DUAL_CODECS, .name = "dual-codecs"},
Takashi Iwai772c2912018-06-26 17:17:53 +02002585 {.id = ALC1220_FIXUP_CLEVO_P950, .name = "clevo-p950"},
Takashi Iwai912093b2012-04-11 14:03:41 +02002586 {}
2587};
2588
Takashi Iwai1d045db2011-07-07 18:23:21 +02002589/*
2590 * BIOS auto configuration
2591 */
2592/* almost identical with ALC880 parser... */
2593static int alc882_parse_auto_config(struct hda_codec *codec)
2594{
Takashi Iwai1d045db2011-07-07 18:23:21 +02002595 static const hda_nid_t alc882_ignore[] = { 0x1d, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02002596 static const hda_nid_t alc882_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2597 return alc_parse_auto_config(codec, alc882_ignore, alc882_ssids);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002598}
2599
Takashi Iwai1d045db2011-07-07 18:23:21 +02002600/*
2601 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02002602static int patch_alc882(struct hda_codec *codec)
2603{
2604 struct alc_spec *spec;
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002605 int err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002606
Takashi Iwai3de95172012-05-07 18:03:15 +02002607 err = alc_alloc_spec(codec, 0x0b);
2608 if (err < 0)
2609 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002610
Takashi Iwai3de95172012-05-07 18:03:15 +02002611 spec = codec->spec;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002612
Takashi Iwai7639a062015-03-03 10:07:24 +01002613 switch (codec->core.vendor_id) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02002614 case 0x10ec0882:
2615 case 0x10ec0885:
Takashi Iwaiacf08082014-09-02 07:21:56 +02002616 case 0x10ec0900:
Kailang Yang6d9ffcf2020-01-03 16:24:06 +08002617 case 0x10ec0b00:
Kailang Yanga535ad52017-01-16 16:59:26 +08002618 case 0x10ec1220:
Takashi Iwai1d045db2011-07-07 18:23:21 +02002619 break;
2620 default:
2621 /* ALC883 and variants */
2622 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2623 break;
2624 }
2625
Takashi Iwaic9af7532019-05-10 11:01:43 +02002626 alc_pre_init(codec);
2627
Takashi Iwai1727a772013-01-10 09:52:52 +01002628 snd_hda_pick_fixup(codec, alc882_fixup_models, alc882_fixup_tbl,
Takashi Iwai912093b2012-04-11 14:03:41 +02002629 alc882_fixups);
Takashi Iwai1727a772013-01-10 09:52:52 +01002630 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002631
2632 alc_auto_parse_customize_define(codec);
2633
Takashi Iwai7504b6c2013-03-18 11:25:51 +01002634 if (has_cdefine_beep(codec))
2635 spec->gen.beep_nid = 0x01;
2636
Takashi Iwai1a97b7f2012-02-21 11:11:48 +01002637 /* automatic parse from the BIOS config */
2638 err = alc882_parse_auto_config(codec);
2639 if (err < 0)
2640 goto error;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002641
Takashi Iwaifea80fa2018-06-20 12:52:46 +02002642 if (!spec->gen.no_analog && spec->gen.beep_nid) {
2643 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2644 if (err < 0)
2645 goto error;
2646 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02002647
Takashi Iwai1727a772013-01-10 09:52:52 +01002648 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01002649
Takashi Iwai1d045db2011-07-07 18:23:21 +02002650 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02002651
2652 error:
2653 alc_free(codec);
2654 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002655}
2656
2657
2658/*
2659 * ALC262 support
2660 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02002661static int alc262_parse_auto_config(struct hda_codec *codec)
2662{
Takashi Iwai1d045db2011-07-07 18:23:21 +02002663 static const hda_nid_t alc262_ignore[] = { 0x1d, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02002664 static const hda_nid_t alc262_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2665 return alc_parse_auto_config(codec, alc262_ignore, alc262_ssids);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002666}
2667
2668/*
2669 * Pin config fixes
2670 */
2671enum {
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002672 ALC262_FIXUP_FSC_H270,
Takashi Iwai7513e6d2013-01-18 15:41:34 +01002673 ALC262_FIXUP_FSC_S7110,
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002674 ALC262_FIXUP_HP_Z200,
2675 ALC262_FIXUP_TYAN,
Takashi Iwaic4701502011-11-07 14:20:07 +01002676 ALC262_FIXUP_LENOVO_3000,
Takashi Iwaib42590b2011-11-07 14:41:01 +01002677 ALC262_FIXUP_BENQ,
2678 ALC262_FIXUP_BENQ_T31,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002679 ALC262_FIXUP_INV_DMIC,
Mengdong Linb5c66112013-11-29 00:35:35 -05002680 ALC262_FIXUP_INTEL_BAYLEYBAY,
Takashi Iwai1d045db2011-07-07 18:23:21 +02002681};
2682
Takashi Iwai1727a772013-01-10 09:52:52 +01002683static const struct hda_fixup alc262_fixups[] = {
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002684 [ALC262_FIXUP_FSC_H270] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002685 .type = HDA_FIXUP_PINS,
2686 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02002687 { 0x14, 0x99130110 }, /* speaker */
2688 { 0x15, 0x0221142f }, /* front HP */
2689 { 0x1b, 0x0121141f }, /* rear HP */
2690 { }
2691 }
2692 },
Takashi Iwai7513e6d2013-01-18 15:41:34 +01002693 [ALC262_FIXUP_FSC_S7110] = {
2694 .type = HDA_FIXUP_PINS,
2695 .v.pins = (const struct hda_pintbl[]) {
2696 { 0x15, 0x90170110 }, /* speaker */
2697 { }
2698 },
2699 .chained = true,
2700 .chain_id = ALC262_FIXUP_BENQ,
2701 },
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002702 [ALC262_FIXUP_HP_Z200] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002703 .type = HDA_FIXUP_PINS,
2704 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02002705 { 0x16, 0x99130120 }, /* internal speaker */
2706 { }
2707 }
2708 },
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002709 [ALC262_FIXUP_TYAN] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002710 .type = HDA_FIXUP_PINS,
2711 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002712 { 0x14, 0x1993e1f0 }, /* int AUX */
2713 { }
2714 }
2715 },
Takashi Iwaic4701502011-11-07 14:20:07 +01002716 [ALC262_FIXUP_LENOVO_3000] = {
Takashi Iwaifd108212013-01-10 10:18:14 +01002717 .type = HDA_FIXUP_PINCTLS,
2718 .v.pins = (const struct hda_pintbl[]) {
2719 { 0x19, PIN_VREF50 },
Takashi Iwaib42590b2011-11-07 14:41:01 +01002720 {}
2721 },
2722 .chained = true,
2723 .chain_id = ALC262_FIXUP_BENQ,
2724 },
2725 [ALC262_FIXUP_BENQ] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002726 .type = HDA_FIXUP_VERBS,
Takashi Iwaib42590b2011-11-07 14:41:01 +01002727 .v.verbs = (const struct hda_verb[]) {
Takashi Iwaic4701502011-11-07 14:20:07 +01002728 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2729 { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2730 {}
2731 }
2732 },
Takashi Iwaib42590b2011-11-07 14:41:01 +01002733 [ALC262_FIXUP_BENQ_T31] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002734 .type = HDA_FIXUP_VERBS,
Takashi Iwaib42590b2011-11-07 14:41:01 +01002735 .v.verbs = (const struct hda_verb[]) {
2736 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2737 { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2738 {}
2739 }
2740 },
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002741 [ALC262_FIXUP_INV_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002742 .type = HDA_FIXUP_FUNC,
David Henningsson9d36a7d2014-10-07 10:18:42 +02002743 .v.func = alc_fixup_inv_dmic,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002744 },
Mengdong Linb5c66112013-11-29 00:35:35 -05002745 [ALC262_FIXUP_INTEL_BAYLEYBAY] = {
2746 .type = HDA_FIXUP_FUNC,
2747 .v.func = alc_fixup_no_depop_delay,
2748 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02002749};
2750
2751static const struct snd_pci_quirk alc262_fixup_tbl[] = {
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002752 SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", ALC262_FIXUP_HP_Z200),
Takashi Iwai7513e6d2013-01-18 15:41:34 +01002753 SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu Lifebook S7110", ALC262_FIXUP_FSC_S7110),
Takashi Iwai3dcd3be2011-11-07 14:59:40 +01002754 SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ),
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002755 SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN),
Takashi Iwai275ec0c2018-06-22 12:17:45 +02002756 SND_PCI_QUIRK(0x1734, 0x1141, "FSC ESPRIMO U9210", ALC262_FIXUP_FSC_H270),
Takashi Iwaiea4e7af2011-11-07 12:23:55 +01002757 SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270),
Takashi Iwaic4701502011-11-07 14:20:07 +01002758 SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000),
Takashi Iwaib42590b2011-11-07 14:41:01 +01002759 SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ),
2760 SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_FIXUP_BENQ_T31),
Mengdong Linb5c66112013-11-29 00:35:35 -05002761 SND_PCI_QUIRK(0x8086, 0x7270, "BayleyBay", ALC262_FIXUP_INTEL_BAYLEYBAY),
Takashi Iwai1d045db2011-07-07 18:23:21 +02002762 {}
2763};
2764
Takashi Iwai1727a772013-01-10 09:52:52 +01002765static const struct hda_model_fixup alc262_fixup_models[] = {
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002766 {.id = ALC262_FIXUP_INV_DMIC, .name = "inv-dmic"},
Takashi Iwaie43c44d2018-06-26 17:02:08 +02002767 {.id = ALC262_FIXUP_FSC_H270, .name = "fsc-h270"},
2768 {.id = ALC262_FIXUP_FSC_S7110, .name = "fsc-s7110"},
2769 {.id = ALC262_FIXUP_HP_Z200, .name = "hp-z200"},
2770 {.id = ALC262_FIXUP_TYAN, .name = "tyan"},
2771 {.id = ALC262_FIXUP_LENOVO_3000, .name = "lenovo-3000"},
2772 {.id = ALC262_FIXUP_BENQ, .name = "benq"},
2773 {.id = ALC262_FIXUP_BENQ_T31, .name = "benq-t31"},
2774 {.id = ALC262_FIXUP_INTEL_BAYLEYBAY, .name = "bayleybay"},
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002775 {}
2776};
Takashi Iwai1d045db2011-07-07 18:23:21 +02002777
Takashi Iwai1d045db2011-07-07 18:23:21 +02002778/*
2779 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02002780static int patch_alc262(struct hda_codec *codec)
2781{
2782 struct alc_spec *spec;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002783 int err;
2784
Takashi Iwai3de95172012-05-07 18:03:15 +02002785 err = alc_alloc_spec(codec, 0x0b);
2786 if (err < 0)
2787 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002788
Takashi Iwai3de95172012-05-07 18:03:15 +02002789 spec = codec->spec;
Takashi Iwai08c189f2012-12-19 15:22:24 +01002790 spec->gen.shared_mic_vref_pin = 0x18;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002791
Takashi Iwai225068a2015-05-29 10:42:14 +02002792 spec->shutup = alc_eapd_shutup;
2793
Takashi Iwai1d045db2011-07-07 18:23:21 +02002794#if 0
2795 /* pshou 07/11/05 set a zero PCM sample to DAC when FIFO is
2796 * under-run
2797 */
Takashi Iwai98b24882014-08-18 13:47:50 +02002798 alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x80);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002799#endif
Takashi Iwai1d045db2011-07-07 18:23:21 +02002800 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2801
Takashi Iwaic9af7532019-05-10 11:01:43 +02002802 alc_pre_init(codec);
2803
Takashi Iwai1727a772013-01-10 09:52:52 +01002804 snd_hda_pick_fixup(codec, alc262_fixup_models, alc262_fixup_tbl,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002805 alc262_fixups);
Takashi Iwai1727a772013-01-10 09:52:52 +01002806 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002807
Takashi Iwaiaf741c12012-05-07 18:09:48 +02002808 alc_auto_parse_customize_define(codec);
2809
Takashi Iwai7504b6c2013-03-18 11:25:51 +01002810 if (has_cdefine_beep(codec))
2811 spec->gen.beep_nid = 0x01;
2812
Takashi Iwai42399f72011-11-07 17:18:44 +01002813 /* automatic parse from the BIOS config */
2814 err = alc262_parse_auto_config(codec);
2815 if (err < 0)
2816 goto error;
Takashi Iwai3e6179b2011-07-08 16:55:13 +02002817
Takashi Iwaifea80fa2018-06-20 12:52:46 +02002818 if (!spec->gen.no_analog && spec->gen.beep_nid) {
2819 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2820 if (err < 0)
2821 goto error;
2822 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02002823
Takashi Iwai1727a772013-01-10 09:52:52 +01002824 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01002825
Takashi Iwai1d045db2011-07-07 18:23:21 +02002826 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02002827
2828 error:
2829 alc_free(codec);
2830 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002831}
2832
2833/*
2834 * ALC268
2835 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02002836/* bind Beep switches of both NID 0x0f and 0x10 */
Takashi Iwaia7177772017-05-10 12:04:08 +02002837static int alc268_beep_switch_put(struct snd_kcontrol *kcontrol,
2838 struct snd_ctl_elem_value *ucontrol)
2839{
2840 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2841 unsigned long pval;
2842 int err;
2843
2844 mutex_lock(&codec->control_mutex);
2845 pval = kcontrol->private_value;
2846 kcontrol->private_value = (pval & ~0xff) | 0x0f;
2847 err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2848 if (err >= 0) {
2849 kcontrol->private_value = (pval & ~0xff) | 0x10;
2850 err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2851 }
2852 kcontrol->private_value = pval;
2853 mutex_unlock(&codec->control_mutex);
2854 return err;
2855}
Takashi Iwai1d045db2011-07-07 18:23:21 +02002856
2857static const struct snd_kcontrol_new alc268_beep_mixer[] = {
2858 HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
Takashi Iwaia7177772017-05-10 12:04:08 +02002859 {
2860 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2861 .name = "Beep Playback Switch",
2862 .subdevice = HDA_SUBDEV_AMP_FLAG,
2863 .info = snd_hda_mixer_amp_switch_info,
2864 .get = snd_hda_mixer_amp_switch_get,
2865 .put = alc268_beep_switch_put,
2866 .private_value = HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT)
2867 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02002868};
2869
2870/* set PCBEEP vol = 0, mute connections */
2871static const struct hda_verb alc268_beep_init_verbs[] = {
2872 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2873 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2874 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2875 { }
2876};
2877
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002878enum {
2879 ALC268_FIXUP_INV_DMIC,
Takashi Iwaicb766402012-10-20 10:55:21 +02002880 ALC268_FIXUP_HP_EAPD,
Takashi Iwai24eff322013-11-04 18:21:08 +01002881 ALC268_FIXUP_SPDIF,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002882};
2883
Takashi Iwai1727a772013-01-10 09:52:52 +01002884static const struct hda_fixup alc268_fixups[] = {
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002885 [ALC268_FIXUP_INV_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002886 .type = HDA_FIXUP_FUNC,
David Henningsson9d36a7d2014-10-07 10:18:42 +02002887 .v.func = alc_fixup_inv_dmic,
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002888 },
Takashi Iwaicb766402012-10-20 10:55:21 +02002889 [ALC268_FIXUP_HP_EAPD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01002890 .type = HDA_FIXUP_VERBS,
Takashi Iwaicb766402012-10-20 10:55:21 +02002891 .v.verbs = (const struct hda_verb[]) {
2892 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 0},
2893 {}
2894 }
2895 },
Takashi Iwai24eff322013-11-04 18:21:08 +01002896 [ALC268_FIXUP_SPDIF] = {
2897 .type = HDA_FIXUP_PINS,
2898 .v.pins = (const struct hda_pintbl[]) {
2899 { 0x1e, 0x014b1180 }, /* enable SPDIF out */
2900 {}
2901 }
2902 },
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002903};
2904
Takashi Iwai1727a772013-01-10 09:52:52 +01002905static const struct hda_model_fixup alc268_fixup_models[] = {
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002906 {.id = ALC268_FIXUP_INV_DMIC, .name = "inv-dmic"},
Takashi Iwaicb766402012-10-20 10:55:21 +02002907 {.id = ALC268_FIXUP_HP_EAPD, .name = "hp-eapd"},
Takashi Iwai03bf11c2018-06-26 16:56:41 +02002908 {.id = ALC268_FIXUP_SPDIF, .name = "spdif"},
Takashi Iwaicb766402012-10-20 10:55:21 +02002909 {}
2910};
2911
2912static const struct snd_pci_quirk alc268_fixup_tbl[] = {
Takashi Iwai24eff322013-11-04 18:21:08 +01002913 SND_PCI_QUIRK(0x1025, 0x0139, "Acer TravelMate 6293", ALC268_FIXUP_SPDIF),
David Henningssonfcd8f3b2013-01-28 05:45:47 +01002914 SND_PCI_QUIRK(0x1025, 0x015b, "Acer AOA 150 (ZG5)", ALC268_FIXUP_INV_DMIC),
Takashi Iwaicb766402012-10-20 10:55:21 +02002915 /* below is codec SSID since multiple Toshiba laptops have the
2916 * same PCI SSID 1179:ff00
2917 */
2918 SND_PCI_QUIRK(0x1179, 0xff06, "Toshiba P200", ALC268_FIXUP_HP_EAPD),
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002919 {}
2920};
2921
Takashi Iwai1d045db2011-07-07 18:23:21 +02002922/*
2923 * BIOS auto configuration
2924 */
2925static int alc268_parse_auto_config(struct hda_codec *codec)
2926{
Takashi Iwai3e6179b2011-07-08 16:55:13 +02002927 static const hda_nid_t alc268_ssids[] = { 0x15, 0x1b, 0x14, 0 };
Takashi Iwai7504b6c2013-03-18 11:25:51 +01002928 return alc_parse_auto_config(codec, NULL, alc268_ssids);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002929}
2930
Takashi Iwai1d045db2011-07-07 18:23:21 +02002931/*
2932 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02002933static int patch_alc268(struct hda_codec *codec)
2934{
2935 struct alc_spec *spec;
Takashi Iwaia5cb4632018-06-20 12:50:11 +02002936 int i, err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002937
Takashi Iwai1d045db2011-07-07 18:23:21 +02002938 /* ALC268 has no aa-loopback mixer */
Takashi Iwai3de95172012-05-07 18:03:15 +02002939 err = alc_alloc_spec(codec, 0);
2940 if (err < 0)
2941 return err;
2942
2943 spec = codec->spec;
Takashi Iwai2722b532019-08-22 09:55:37 +02002944 if (has_cdefine_beep(codec))
2945 spec->gen.beep_nid = 0x01;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002946
Takashi Iwai225068a2015-05-29 10:42:14 +02002947 spec->shutup = alc_eapd_shutup;
2948
Takashi Iwaic9af7532019-05-10 11:01:43 +02002949 alc_pre_init(codec);
2950
Takashi Iwai1727a772013-01-10 09:52:52 +01002951 snd_hda_pick_fixup(codec, alc268_fixup_models, alc268_fixup_tbl, alc268_fixups);
2952 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002953
Takashi Iwai6ebb8052011-08-16 15:15:40 +02002954 /* automatic parse from the BIOS config */
2955 err = alc268_parse_auto_config(codec);
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02002956 if (err < 0)
2957 goto error;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002958
Takashi Iwai7504b6c2013-03-18 11:25:51 +01002959 if (err > 0 && !spec->gen.no_analog &&
2960 spec->gen.autocfg.speaker_pins[0] != 0x1d) {
Takashi Iwaia5cb4632018-06-20 12:50:11 +02002961 for (i = 0; i < ARRAY_SIZE(alc268_beep_mixer); i++) {
2962 if (!snd_hda_gen_add_kctl(&spec->gen, NULL,
2963 &alc268_beep_mixer[i])) {
2964 err = -ENOMEM;
2965 goto error;
2966 }
2967 }
Takashi Iwai7504b6c2013-03-18 11:25:51 +01002968 snd_hda_add_verbs(codec, alc268_beep_init_verbs);
Takashi Iwai1d045db2011-07-07 18:23:21 +02002969 if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
2970 /* override the amp caps for beep generator */
2971 snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
2972 (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
2973 (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
2974 (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
2975 (0 << AC_AMPCAP_MUTE_SHIFT));
2976 }
2977
Takashi Iwai1727a772013-01-10 09:52:52 +01002978 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai6e72aa52012-06-25 10:52:25 +02002979
Takashi Iwai1d045db2011-07-07 18:23:21 +02002980 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02002981
2982 error:
2983 alc_free(codec);
2984 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02002985}
2986
2987/*
2988 * ALC269
2989 */
Takashi Iwai08c189f2012-12-19 15:22:24 +01002990
Takashi Iwai1d045db2011-07-07 18:23:21 +02002991static const struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
Takashi Iwai1d045db2011-07-07 18:23:21 +02002992 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
Takashi Iwai1d045db2011-07-07 18:23:21 +02002993};
2994
2995static const struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
Takashi Iwai1d045db2011-07-07 18:23:21 +02002996 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
Takashi Iwai1d045db2011-07-07 18:23:21 +02002997};
2998
Takashi Iwai1d045db2011-07-07 18:23:21 +02002999/* different alc269-variants */
3000enum {
3001 ALC269_TYPE_ALC269VA,
3002 ALC269_TYPE_ALC269VB,
3003 ALC269_TYPE_ALC269VC,
Kailang Yangadcc70b2012-05-25 08:08:38 +02003004 ALC269_TYPE_ALC269VD,
Kailang Yang065380f2013-01-10 10:25:48 +01003005 ALC269_TYPE_ALC280,
3006 ALC269_TYPE_ALC282,
Kailang Yang2af02be2013-08-22 10:03:50 +02003007 ALC269_TYPE_ALC283,
Kailang Yang065380f2013-01-10 10:25:48 +01003008 ALC269_TYPE_ALC284,
Kailang Yang4731d5d2017-06-30 15:22:57 +08003009 ALC269_TYPE_ALC293,
Kailang Yang7fc7d042013-04-25 11:04:43 +02003010 ALC269_TYPE_ALC286,
Kailang Yang506b62c2014-12-18 17:07:44 +08003011 ALC269_TYPE_ALC298,
Kailang Yang1d04c9d2013-10-24 11:35:18 +02003012 ALC269_TYPE_ALC255,
Kailang Yang4344aec2014-12-17 17:39:05 +08003013 ALC269_TYPE_ALC256,
Kailang Yangf429e7e2017-12-05 15:38:24 +08003014 ALC269_TYPE_ALC257,
Kailang Yang0a6f0602017-06-30 16:00:48 +08003015 ALC269_TYPE_ALC215,
Kailang Yang42314302016-02-03 15:03:50 +08003016 ALC269_TYPE_ALC225,
Kailang Yangdcd4f0d2016-05-04 15:50:18 +08003017 ALC269_TYPE_ALC294,
Kailang Yang1078bef2018-11-08 16:36:15 +08003018 ALC269_TYPE_ALC300,
Kailang Yangf0778872019-10-24 15:13:32 +08003019 ALC269_TYPE_ALC623,
Kailang Yang6fbae352016-05-30 16:44:20 +08003020 ALC269_TYPE_ALC700,
Takashi Iwai1d045db2011-07-07 18:23:21 +02003021};
3022
3023/*
3024 * BIOS auto configuration
3025 */
3026static int alc269_parse_auto_config(struct hda_codec *codec)
3027{
Takashi Iwai1d045db2011-07-07 18:23:21 +02003028 static const hda_nid_t alc269_ignore[] = { 0x1d, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02003029 static const hda_nid_t alc269_ssids[] = { 0, 0x1b, 0x14, 0x21 };
3030 static const hda_nid_t alc269va_ssids[] = { 0x15, 0x1b, 0x14, 0 };
3031 struct alc_spec *spec = codec->spec;
Kailang Yangadcc70b2012-05-25 08:08:38 +02003032 const hda_nid_t *ssids;
3033
3034 switch (spec->codec_variant) {
3035 case ALC269_TYPE_ALC269VA:
3036 case ALC269_TYPE_ALC269VC:
Kailang Yang065380f2013-01-10 10:25:48 +01003037 case ALC269_TYPE_ALC280:
3038 case ALC269_TYPE_ALC284:
Kailang Yang4731d5d2017-06-30 15:22:57 +08003039 case ALC269_TYPE_ALC293:
Kailang Yangadcc70b2012-05-25 08:08:38 +02003040 ssids = alc269va_ssids;
3041 break;
3042 case ALC269_TYPE_ALC269VB:
3043 case ALC269_TYPE_ALC269VD:
Kailang Yang065380f2013-01-10 10:25:48 +01003044 case ALC269_TYPE_ALC282:
Kailang Yang2af02be2013-08-22 10:03:50 +02003045 case ALC269_TYPE_ALC283:
Kailang Yang7fc7d042013-04-25 11:04:43 +02003046 case ALC269_TYPE_ALC286:
Kailang Yang506b62c2014-12-18 17:07:44 +08003047 case ALC269_TYPE_ALC298:
Kailang Yang1d04c9d2013-10-24 11:35:18 +02003048 case ALC269_TYPE_ALC255:
Kailang Yang4344aec2014-12-17 17:39:05 +08003049 case ALC269_TYPE_ALC256:
Kailang Yangf429e7e2017-12-05 15:38:24 +08003050 case ALC269_TYPE_ALC257:
Kailang Yang0a6f0602017-06-30 16:00:48 +08003051 case ALC269_TYPE_ALC215:
Kailang Yang42314302016-02-03 15:03:50 +08003052 case ALC269_TYPE_ALC225:
Kailang Yangdcd4f0d2016-05-04 15:50:18 +08003053 case ALC269_TYPE_ALC294:
Kailang Yang1078bef2018-11-08 16:36:15 +08003054 case ALC269_TYPE_ALC300:
Kailang Yangf0778872019-10-24 15:13:32 +08003055 case ALC269_TYPE_ALC623:
Kailang Yang6fbae352016-05-30 16:44:20 +08003056 case ALC269_TYPE_ALC700:
Kailang Yangadcc70b2012-05-25 08:08:38 +02003057 ssids = alc269_ssids;
3058 break;
3059 default:
3060 ssids = alc269_ssids;
3061 break;
3062 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02003063
Takashi Iwai3e6179b2011-07-08 16:55:13 +02003064 return alc_parse_auto_config(codec, alc269_ignore, ssids);
Takashi Iwai1d045db2011-07-07 18:23:21 +02003065}
3066
Hui Wang476c02e2020-03-29 16:20:18 +08003067static const struct hda_jack_keymap alc_headset_btn_keymap[] = {
3068 { SND_JACK_BTN_0, KEY_PLAYPAUSE },
3069 { SND_JACK_BTN_1, KEY_VOICECOMMAND },
3070 { SND_JACK_BTN_2, KEY_VOLUMEUP },
3071 { SND_JACK_BTN_3, KEY_VOLUMEDOWN },
3072 {}
3073};
3074
3075static void alc_headset_btn_callback(struct hda_codec *codec,
3076 struct hda_jack_callback *jack)
3077{
3078 int report = 0;
3079
3080 if (jack->unsol_res & (7 << 13))
3081 report |= SND_JACK_BTN_0;
3082
3083 if (jack->unsol_res & (1 << 16 | 3 << 8))
3084 report |= SND_JACK_BTN_1;
3085
3086 /* Volume up key */
3087 if (jack->unsol_res & (7 << 23))
3088 report |= SND_JACK_BTN_2;
3089
3090 /* Volume down key */
3091 if (jack->unsol_res & (7 << 10))
3092 report |= SND_JACK_BTN_3;
3093
3094 jack->jack->button_state = report;
3095}
3096
3097static void alc_disable_headset_jack_key(struct hda_codec *codec)
3098{
3099 struct alc_spec *spec = codec->spec;
3100
3101 if (!spec->has_hs_key)
3102 return;
3103
3104 switch (codec->core.vendor_id) {
3105 case 0x10ec0215:
3106 case 0x10ec0225:
3107 case 0x10ec0285:
Hui Wangc72b9bf2020-12-05 13:11:30 +08003108 case 0x10ec0287:
Hui Wang476c02e2020-03-29 16:20:18 +08003109 case 0x10ec0295:
3110 case 0x10ec0289:
3111 case 0x10ec0299:
3112 alc_write_coef_idx(codec, 0x48, 0x0);
3113 alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3114 alc_update_coef_idx(codec, 0x44, 0x0045 << 8, 0x0);
3115 break;
3116 case 0x10ec0236:
3117 case 0x10ec0256:
3118 alc_write_coef_idx(codec, 0x48, 0x0);
3119 alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3120 break;
3121 }
3122}
3123
3124static void alc_enable_headset_jack_key(struct hda_codec *codec)
3125{
3126 struct alc_spec *spec = codec->spec;
3127
3128 if (!spec->has_hs_key)
3129 return;
3130
3131 switch (codec->core.vendor_id) {
3132 case 0x10ec0215:
3133 case 0x10ec0225:
3134 case 0x10ec0285:
Hui Wangc72b9bf2020-12-05 13:11:30 +08003135 case 0x10ec0287:
Hui Wang476c02e2020-03-29 16:20:18 +08003136 case 0x10ec0295:
3137 case 0x10ec0289:
3138 case 0x10ec0299:
3139 alc_write_coef_idx(codec, 0x48, 0xd011);
3140 alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3141 alc_update_coef_idx(codec, 0x44, 0x007f << 8, 0x0045 << 8);
3142 break;
3143 case 0x10ec0236:
3144 case 0x10ec0256:
3145 alc_write_coef_idx(codec, 0x48, 0xd011);
3146 alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3147 break;
3148 }
3149}
3150
3151static void alc_fixup_headset_jack(struct hda_codec *codec,
3152 const struct hda_fixup *fix, int action)
3153{
3154 struct alc_spec *spec = codec->spec;
3155
3156 switch (action) {
3157 case HDA_FIXUP_ACT_PRE_PROBE:
3158 spec->has_hs_key = 1;
3159 snd_hda_jack_detect_enable_callback(codec, 0x55,
3160 alc_headset_btn_callback);
3161 snd_hda_jack_add_kctl(codec, 0x55, "Headset Jack", false,
3162 SND_JACK_HEADSET, alc_headset_btn_keymap);
3163 break;
3164 case HDA_FIXUP_ACT_INIT:
3165 alc_enable_headset_jack_key(codec);
3166 break;
3167 }
3168}
3169
Kailang Yang1387e2d2012-11-08 10:23:18 +01003170static void alc269vb_toggle_power_output(struct hda_codec *codec, int power_up)
Takashi Iwai1d045db2011-07-07 18:23:21 +02003171{
Takashi Iwai98b24882014-08-18 13:47:50 +02003172 alc_update_coef_idx(codec, 0x04, 1 << 11, power_up ? (1 << 11) : 0);
Takashi Iwai1d045db2011-07-07 18:23:21 +02003173}
3174
3175static void alc269_shutup(struct hda_codec *codec)
3176{
Kailang Yangadcc70b2012-05-25 08:08:38 +02003177 struct alc_spec *spec = codec->spec;
3178
Kailang Yang1387e2d2012-11-08 10:23:18 +01003179 if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3180 alc269vb_toggle_power_output(codec, 0);
3181 if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
3182 (alc_get_coef0(codec) & 0x00ff) == 0x018) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02003183 msleep(150);
3184 }
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003185 alc_shutup_pins(codec);
Takashi Iwai1d045db2011-07-07 18:23:21 +02003186}
3187
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01003188static const struct coef_fw alc282_coefs[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02003189 WRITE_COEF(0x03, 0x0002), /* Power Down Control */
Kailang Yang32fa7e42014-10-24 16:26:01 +08003190 UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
Takashi Iwai54db6c32014-08-18 15:11:19 +02003191 WRITE_COEF(0x07, 0x0200), /* DMIC control */
3192 UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
3193 UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
3194 WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
3195 WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
3196 WRITE_COEF(0x0e, 0x6e00), /* LDO1/2/3, DAC/ADC */
3197 UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
3198 UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
3199 WRITE_COEF(0x6f, 0x0), /* Class D test 4 */
3200 UPDATE_COEF(0x0c, 0xfe00, 0), /* IO power down directly */
3201 WRITE_COEF(0x34, 0xa0c0), /* ANC */
3202 UPDATE_COEF(0x16, 0x0008, 0), /* AGC MUX */
3203 UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
3204 UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
3205 WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
3206 WRITE_COEF(0x63, 0x2902), /* PLL */
3207 WRITE_COEF(0x68, 0xa080), /* capless control 2 */
3208 WRITE_COEF(0x69, 0x3400), /* capless control 3 */
3209 WRITE_COEF(0x6a, 0x2f3e), /* capless control 4 */
3210 WRITE_COEF(0x6b, 0x0), /* capless control 5 */
3211 UPDATE_COEF(0x6d, 0x0fff, 0x0900), /* class D test 2 */
3212 WRITE_COEF(0x6e, 0x110a), /* class D test 3 */
3213 UPDATE_COEF(0x70, 0x00f8, 0x00d8), /* class D test 5 */
3214 WRITE_COEF(0x71, 0x0014), /* class D test 6 */
3215 WRITE_COEF(0x72, 0xc2ba), /* classD OCP */
3216 UPDATE_COEF(0x77, 0x0f80, 0), /* classD pure DC test */
3217 WRITE_COEF(0x6c, 0xfc06), /* Class D amp control */
3218 {}
3219};
3220
Kailang Yangcb149cb2014-03-18 16:45:32 +08003221static void alc282_restore_default_value(struct hda_codec *codec)
3222{
Takashi Iwai54db6c32014-08-18 15:11:19 +02003223 alc_process_coef_fw(codec, alc282_coefs);
Kailang Yangcb149cb2014-03-18 16:45:32 +08003224}
3225
Kailang Yang7b5c7a02014-03-18 16:15:54 +08003226static void alc282_init(struct hda_codec *codec)
3227{
3228 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003229 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang7b5c7a02014-03-18 16:15:54 +08003230 bool hp_pin_sense;
3231 int coef78;
3232
Kailang Yangcb149cb2014-03-18 16:45:32 +08003233 alc282_restore_default_value(codec);
3234
Kailang Yang7b5c7a02014-03-18 16:15:54 +08003235 if (!hp_pin)
3236 return;
3237 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3238 coef78 = alc_read_coef_idx(codec, 0x78);
3239
3240 /* Index 0x78 Direct Drive HP AMP LPM Control 1 */
3241 /* Headphone capless set to high power mode */
3242 alc_write_coef_idx(codec, 0x78, 0x9004);
3243
3244 if (hp_pin_sense)
3245 msleep(2);
3246
3247 snd_hda_codec_write(codec, hp_pin, 0,
3248 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3249
3250 if (hp_pin_sense)
3251 msleep(85);
3252
3253 snd_hda_codec_write(codec, hp_pin, 0,
3254 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3255
3256 if (hp_pin_sense)
3257 msleep(100);
3258
3259 /* Headphone capless set to normal mode */
3260 alc_write_coef_idx(codec, 0x78, coef78);
3261}
3262
3263static void alc282_shutup(struct hda_codec *codec)
3264{
3265 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003266 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang7b5c7a02014-03-18 16:15:54 +08003267 bool hp_pin_sense;
3268 int coef78;
3269
3270 if (!hp_pin) {
3271 alc269_shutup(codec);
3272 return;
3273 }
3274
3275 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3276 coef78 = alc_read_coef_idx(codec, 0x78);
3277 alc_write_coef_idx(codec, 0x78, 0x9004);
3278
3279 if (hp_pin_sense)
3280 msleep(2);
3281
3282 snd_hda_codec_write(codec, hp_pin, 0,
3283 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3284
3285 if (hp_pin_sense)
3286 msleep(85);
3287
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003288 if (!spec->no_shutup_pins)
3289 snd_hda_codec_write(codec, hp_pin, 0,
3290 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
Kailang Yang7b5c7a02014-03-18 16:15:54 +08003291
3292 if (hp_pin_sense)
3293 msleep(100);
3294
3295 alc_auto_setup_eapd(codec, false);
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003296 alc_shutup_pins(codec);
Kailang Yang7b5c7a02014-03-18 16:15:54 +08003297 alc_write_coef_idx(codec, 0x78, coef78);
3298}
3299
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01003300static const struct coef_fw alc283_coefs[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02003301 WRITE_COEF(0x03, 0x0002), /* Power Down Control */
Kailang Yang56779862014-10-24 16:17:51 +08003302 UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
Takashi Iwai54db6c32014-08-18 15:11:19 +02003303 WRITE_COEF(0x07, 0x0200), /* DMIC control */
3304 UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
3305 UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
3306 WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
3307 WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
3308 WRITE_COEF(0x0e, 0x6fc0), /* LDO1/2/3, DAC/ADC */
3309 UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
3310 UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
3311 WRITE_COEF(0x3a, 0x0), /* Class D test 4 */
3312 UPDATE_COEF(0x0c, 0xfe00, 0x0), /* IO power down directly */
3313 WRITE_COEF(0x22, 0xa0c0), /* ANC */
3314 UPDATE_COEFEX(0x53, 0x01, 0x000f, 0x0008), /* AGC MUX */
3315 UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
3316 UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
3317 WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
3318 WRITE_COEF(0x2e, 0x2902), /* PLL */
3319 WRITE_COEF(0x33, 0xa080), /* capless control 2 */
3320 WRITE_COEF(0x34, 0x3400), /* capless control 3 */
3321 WRITE_COEF(0x35, 0x2f3e), /* capless control 4 */
3322 WRITE_COEF(0x36, 0x0), /* capless control 5 */
3323 UPDATE_COEF(0x38, 0x0fff, 0x0900), /* class D test 2 */
3324 WRITE_COEF(0x39, 0x110a), /* class D test 3 */
3325 UPDATE_COEF(0x3b, 0x00f8, 0x00d8), /* class D test 5 */
3326 WRITE_COEF(0x3c, 0x0014), /* class D test 6 */
3327 WRITE_COEF(0x3d, 0xc2ba), /* classD OCP */
3328 UPDATE_COEF(0x42, 0x0f80, 0x0), /* classD pure DC test */
3329 WRITE_COEF(0x49, 0x0), /* test mode */
3330 UPDATE_COEF(0x40, 0xf800, 0x9800), /* Class D DC enable */
3331 UPDATE_COEF(0x42, 0xf000, 0x2000), /* DC offset */
3332 WRITE_COEF(0x37, 0xfc06), /* Class D amp control */
Kailang Yang56779862014-10-24 16:17:51 +08003333 UPDATE_COEF(0x1b, 0x8000, 0), /* HP JD control */
Takashi Iwai54db6c32014-08-18 15:11:19 +02003334 {}
3335};
3336
Kailang Yang6bd55b02014-03-17 13:51:27 +08003337static void alc283_restore_default_value(struct hda_codec *codec)
3338{
Takashi Iwai54db6c32014-08-18 15:11:19 +02003339 alc_process_coef_fw(codec, alc283_coefs);
Kailang Yang6bd55b02014-03-17 13:51:27 +08003340}
3341
Kailang Yang2af02be2013-08-22 10:03:50 +02003342static void alc283_init(struct hda_codec *codec)
3343{
3344 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003345 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang2af02be2013-08-22 10:03:50 +02003346 bool hp_pin_sense;
Kailang Yang2af02be2013-08-22 10:03:50 +02003347
Kailang Yang6bd55b02014-03-17 13:51:27 +08003348 alc283_restore_default_value(codec);
3349
Kailang Yang2af02be2013-08-22 10:03:50 +02003350 if (!hp_pin)
3351 return;
Kailang Yanga59d7192015-04-08 16:34:00 +08003352
3353 msleep(30);
Kailang Yang2af02be2013-08-22 10:03:50 +02003354 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3355
3356 /* Index 0x43 Direct Drive HP AMP LPM Control 1 */
3357 /* Headphone capless set to high power mode */
3358 alc_write_coef_idx(codec, 0x43, 0x9004);
3359
3360 snd_hda_codec_write(codec, hp_pin, 0,
3361 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3362
3363 if (hp_pin_sense)
3364 msleep(85);
3365
3366 snd_hda_codec_write(codec, hp_pin, 0,
3367 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3368
3369 if (hp_pin_sense)
3370 msleep(85);
3371 /* Index 0x46 Combo jack auto switch control 2 */
3372 /* 3k pull low control for Headset jack. */
Takashi Iwai98b24882014-08-18 13:47:50 +02003373 alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
Kailang Yang2af02be2013-08-22 10:03:50 +02003374 /* Headphone capless set to normal mode */
3375 alc_write_coef_idx(codec, 0x43, 0x9614);
3376}
3377
3378static void alc283_shutup(struct hda_codec *codec)
3379{
3380 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003381 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang2af02be2013-08-22 10:03:50 +02003382 bool hp_pin_sense;
Kailang Yang2af02be2013-08-22 10:03:50 +02003383
3384 if (!hp_pin) {
3385 alc269_shutup(codec);
3386 return;
3387 }
3388
3389 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3390
3391 alc_write_coef_idx(codec, 0x43, 0x9004);
3392
Harsha Priyab450b172014-10-09 11:04:56 +00003393 /*depop hp during suspend*/
3394 alc_write_coef_idx(codec, 0x06, 0x2100);
3395
Kailang Yang2af02be2013-08-22 10:03:50 +02003396 snd_hda_codec_write(codec, hp_pin, 0,
3397 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3398
3399 if (hp_pin_sense)
Kailang Yang88011c092013-10-24 15:45:24 +02003400 msleep(100);
Kailang Yang2af02be2013-08-22 10:03:50 +02003401
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003402 if (!spec->no_shutup_pins)
3403 snd_hda_codec_write(codec, hp_pin, 0,
3404 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
Kailang Yang2af02be2013-08-22 10:03:50 +02003405
Takashi Iwai98b24882014-08-18 13:47:50 +02003406 alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
Kailang Yang2af02be2013-08-22 10:03:50 +02003407
3408 if (hp_pin_sense)
Kailang Yang88011c092013-10-24 15:45:24 +02003409 msleep(100);
Kailang Yang0435b3f2014-04-08 17:14:14 +08003410 alc_auto_setup_eapd(codec, false);
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003411 alc_shutup_pins(codec);
Kailang Yang2af02be2013-08-22 10:03:50 +02003412 alc_write_coef_idx(codec, 0x43, 0x9614);
3413}
3414
Kailang Yang4a219ef2017-06-16 16:54:35 +08003415static void alc256_init(struct hda_codec *codec)
3416{
3417 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003418 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang4a219ef2017-06-16 16:54:35 +08003419 bool hp_pin_sense;
3420
3421 if (!hp_pin)
Kailang Yang6447c962019-05-08 16:27:03 +08003422 hp_pin = 0x21;
Kailang Yang4a219ef2017-06-16 16:54:35 +08003423
3424 msleep(30);
3425
3426 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3427
3428 if (hp_pin_sense)
3429 msleep(2);
3430
3431 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
Kailang Yang6447c962019-05-08 16:27:03 +08003432 if (spec->ultra_low_power) {
3433 alc_update_coef_idx(codec, 0x03, 1<<1, 1<<1);
3434 alc_update_coef_idx(codec, 0x08, 3<<2, 3<<2);
3435 alc_update_coef_idx(codec, 0x08, 7<<4, 0);
3436 alc_update_coef_idx(codec, 0x3b, 1<<15, 0);
3437 alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3438 msleep(30);
3439 }
Kailang Yang4a219ef2017-06-16 16:54:35 +08003440
3441 snd_hda_codec_write(codec, hp_pin, 0,
3442 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3443
Kailang Yang6447c962019-05-08 16:27:03 +08003444 if (hp_pin_sense || spec->ultra_low_power)
Kailang Yang4a219ef2017-06-16 16:54:35 +08003445 msleep(85);
3446
3447 snd_hda_codec_write(codec, hp_pin, 0,
3448 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3449
Kailang Yang6447c962019-05-08 16:27:03 +08003450 if (hp_pin_sense || spec->ultra_low_power)
Kailang Yang4a219ef2017-06-16 16:54:35 +08003451 msleep(100);
3452
3453 alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
3454 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
Kailang Yang88d42b22018-03-14 16:08:57 +08003455 alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15); /* Clear bit */
3456 alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15);
Thomas Hebbc4473742020-03-30 12:09:38 -04003457 /*
3458 * Expose headphone mic (or possibly Line In on some machines) instead
3459 * of PC Beep on 1Ah, and disable 1Ah loopback for all outputs. See
3460 * Documentation/sound/hd-audio/realtek-pc-beep.rst for details of
3461 * this register.
3462 */
3463 alc_write_coef_idx(codec, 0x36, 0x5757);
Kailang Yang4a219ef2017-06-16 16:54:35 +08003464}
3465
3466static void alc256_shutup(struct hda_codec *codec)
3467{
3468 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003469 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang4a219ef2017-06-16 16:54:35 +08003470 bool hp_pin_sense;
3471
Kailang Yang6447c962019-05-08 16:27:03 +08003472 if (!hp_pin)
3473 hp_pin = 0x21;
Kailang Yang4a219ef2017-06-16 16:54:35 +08003474
3475 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3476
3477 if (hp_pin_sense)
3478 msleep(2);
3479
3480 snd_hda_codec_write(codec, hp_pin, 0,
3481 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3482
Kailang Yang6447c962019-05-08 16:27:03 +08003483 if (hp_pin_sense || spec->ultra_low_power)
Kailang Yang4a219ef2017-06-16 16:54:35 +08003484 msleep(85);
3485
Takashi Iwai1c9609e2018-01-19 14:18:34 +01003486 /* 3k pull low control for Headset jack. */
3487 /* NOTE: call this before clearing the pin, otherwise codec stalls */
Hui Wang3f742492020-09-14 14:51:18 +08003488 /* If disable 3k pulldown control for alc257, the Mic detection will not work correctly
3489 * when booting with headset plugged. So skip setting it for the codec alc257
3490 */
3491 if (codec->core.vendor_id != 0x10ec0257)
3492 alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
Takashi Iwai1c9609e2018-01-19 14:18:34 +01003493
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003494 if (!spec->no_shutup_pins)
3495 snd_hda_codec_write(codec, hp_pin, 0,
3496 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
Kailang Yang4a219ef2017-06-16 16:54:35 +08003497
Kailang Yang6447c962019-05-08 16:27:03 +08003498 if (hp_pin_sense || spec->ultra_low_power)
Kailang Yang4a219ef2017-06-16 16:54:35 +08003499 msleep(100);
3500
3501 alc_auto_setup_eapd(codec, false);
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003502 alc_shutup_pins(codec);
Kailang Yang6447c962019-05-08 16:27:03 +08003503 if (spec->ultra_low_power) {
3504 msleep(50);
3505 alc_update_coef_idx(codec, 0x03, 1<<1, 0);
3506 alc_update_coef_idx(codec, 0x08, 7<<4, 7<<4);
3507 alc_update_coef_idx(codec, 0x08, 3<<2, 0);
3508 alc_update_coef_idx(codec, 0x3b, 1<<15, 1<<15);
3509 alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3510 msleep(30);
3511 }
Kailang Yang4a219ef2017-06-16 16:54:35 +08003512}
3513
Kailang Yangda911b12018-01-05 16:50:08 +08003514static void alc225_init(struct hda_codec *codec)
3515{
3516 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003517 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yangda911b12018-01-05 16:50:08 +08003518 bool hp1_pin_sense, hp2_pin_sense;
3519
3520 if (!hp_pin)
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003521 hp_pin = 0x21;
Kailang Yangda911b12018-01-05 16:50:08 +08003522 msleep(30);
3523
3524 hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3525 hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3526
3527 if (hp1_pin_sense || hp2_pin_sense)
3528 msleep(2);
3529
3530 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003531 if (spec->ultra_low_power) {
3532 alc_update_coef_idx(codec, 0x08, 0x0f << 2, 3<<2);
3533 alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3534 alc_update_coef_idx(codec, 0x33, 1<<11, 0);
3535 msleep(30);
3536 }
Kailang Yangda911b12018-01-05 16:50:08 +08003537
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003538 if (hp1_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003539 snd_hda_codec_write(codec, hp_pin, 0,
3540 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3541 if (hp2_pin_sense)
3542 snd_hda_codec_write(codec, 0x16, 0,
3543 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3544
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003545 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003546 msleep(85);
3547
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003548 if (hp1_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003549 snd_hda_codec_write(codec, hp_pin, 0,
3550 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3551 if (hp2_pin_sense)
3552 snd_hda_codec_write(codec, 0x16, 0,
3553 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3554
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003555 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003556 msleep(100);
3557
3558 alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3559 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
3560}
3561
3562static void alc225_shutup(struct hda_codec *codec)
3563{
3564 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003565 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yangda911b12018-01-05 16:50:08 +08003566 bool hp1_pin_sense, hp2_pin_sense;
3567
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003568 if (!hp_pin)
3569 hp_pin = 0x21;
Hui Wang476c02e2020-03-29 16:20:18 +08003570
3571 alc_disable_headset_jack_key(codec);
Kailang Yangda911b12018-01-05 16:50:08 +08003572 /* 3k pull low control for Headset jack. */
3573 alc_update_coef_idx(codec, 0x4a, 0, 3 << 10);
3574
3575 hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3576 hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3577
3578 if (hp1_pin_sense || hp2_pin_sense)
3579 msleep(2);
3580
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003581 if (hp1_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003582 snd_hda_codec_write(codec, hp_pin, 0,
3583 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3584 if (hp2_pin_sense)
3585 snd_hda_codec_write(codec, 0x16, 0,
3586 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3587
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003588 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003589 msleep(85);
3590
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003591 if (hp1_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003592 snd_hda_codec_write(codec, hp_pin, 0,
3593 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3594 if (hp2_pin_sense)
3595 snd_hda_codec_write(codec, 0x16, 0,
3596 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3597
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003598 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
Kailang Yangda911b12018-01-05 16:50:08 +08003599 msleep(100);
3600
3601 alc_auto_setup_eapd(codec, false);
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003602 alc_shutup_pins(codec);
Kailang Yangd3ba58b2019-05-06 15:09:42 +08003603 if (spec->ultra_low_power) {
3604 msleep(50);
3605 alc_update_coef_idx(codec, 0x08, 0x0f << 2, 0x0c << 2);
3606 alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3607 alc_update_coef_idx(codec, 0x33, 1<<11, 1<<11);
3608 alc_update_coef_idx(codec, 0x4a, 3<<4, 2<<4);
3609 msleep(30);
3610 }
Hui Wang476c02e2020-03-29 16:20:18 +08003611
3612 alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3613 alc_enable_headset_jack_key(codec);
Kailang Yangda911b12018-01-05 16:50:08 +08003614}
3615
Kailang Yangc2d6af52017-06-21 14:50:54 +08003616static void alc_default_init(struct hda_codec *codec)
3617{
3618 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003619 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yangc2d6af52017-06-21 14:50:54 +08003620 bool hp_pin_sense;
3621
3622 if (!hp_pin)
3623 return;
3624
3625 msleep(30);
3626
3627 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3628
3629 if (hp_pin_sense)
3630 msleep(2);
3631
3632 snd_hda_codec_write(codec, hp_pin, 0,
3633 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3634
3635 if (hp_pin_sense)
3636 msleep(85);
3637
3638 snd_hda_codec_write(codec, hp_pin, 0,
3639 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3640
3641 if (hp_pin_sense)
3642 msleep(100);
3643}
3644
3645static void alc_default_shutup(struct hda_codec *codec)
3646{
3647 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003648 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yangc2d6af52017-06-21 14:50:54 +08003649 bool hp_pin_sense;
3650
3651 if (!hp_pin) {
3652 alc269_shutup(codec);
3653 return;
3654 }
3655
3656 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3657
3658 if (hp_pin_sense)
3659 msleep(2);
3660
3661 snd_hda_codec_write(codec, hp_pin, 0,
3662 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3663
3664 if (hp_pin_sense)
3665 msleep(85);
3666
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003667 if (!spec->no_shutup_pins)
3668 snd_hda_codec_write(codec, hp_pin, 0,
3669 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
Kailang Yangc2d6af52017-06-21 14:50:54 +08003670
3671 if (hp_pin_sense)
3672 msleep(100);
3673
3674 alc_auto_setup_eapd(codec, false);
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003675 alc_shutup_pins(codec);
Kailang Yangc2d6af52017-06-21 14:50:54 +08003676}
3677
Kailang Yang693abe12019-01-29 15:38:21 +08003678static void alc294_hp_init(struct hda_codec *codec)
3679{
3680 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01003681 hda_nid_t hp_pin = alc_get_hp_pin(spec);
Kailang Yang693abe12019-01-29 15:38:21 +08003682 int i, val;
3683
3684 if (!hp_pin)
3685 return;
3686
3687 snd_hda_codec_write(codec, hp_pin, 0,
3688 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3689
3690 msleep(100);
3691
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01003692 if (!spec->no_shutup_pins)
3693 snd_hda_codec_write(codec, hp_pin, 0,
3694 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
Kailang Yang693abe12019-01-29 15:38:21 +08003695
3696 alc_update_coef_idx(codec, 0x6f, 0x000f, 0);/* Set HP depop to manual mode */
3697 alc_update_coefex_idx(codec, 0x58, 0x00, 0x8000, 0x8000); /* HP depop procedure start */
3698
3699 /* Wait for depop procedure finish */
3700 val = alc_read_coefex_idx(codec, 0x58, 0x01);
3701 for (i = 0; i < 20 && val & 0x0080; i++) {
3702 msleep(50);
3703 val = alc_read_coefex_idx(codec, 0x58, 0x01);
3704 }
3705 /* Set HP depop to auto mode */
3706 alc_update_coef_idx(codec, 0x6f, 0x000f, 0x000b);
3707 msleep(50);
3708}
3709
3710static void alc294_init(struct hda_codec *codec)
3711{
3712 struct alc_spec *spec = codec->spec;
3713
Takashi Iwaif6ef4e02019-01-29 14:14:51 +01003714 /* required only at boot or S4 resume time */
3715 if (!spec->done_hp_init ||
3716 codec->core.dev.power.power_state.event == PM_EVENT_RESTORE) {
Kailang Yang693abe12019-01-29 15:38:21 +08003717 alc294_hp_init(codec);
3718 spec->done_hp_init = true;
3719 }
3720 alc_default_init(codec);
3721}
3722
Kailang Yangad60d502013-06-28 12:03:01 +02003723static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg,
3724 unsigned int val)
3725{
3726 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3727 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val & 0xffff); /* LSB */
3728 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val >> 16); /* MSB */
3729}
3730
3731static int alc5505_coef_get(struct hda_codec *codec, unsigned int index_reg)
3732{
3733 unsigned int val;
3734
3735 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3736 val = snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3737 & 0xffff;
3738 val |= snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3739 << 16;
3740 return val;
3741}
3742
3743static void alc5505_dsp_halt(struct hda_codec *codec)
3744{
3745 unsigned int val;
3746
3747 alc5505_coef_set(codec, 0x3000, 0x000c); /* DSP CPU stop */
3748 alc5505_coef_set(codec, 0x880c, 0x0008); /* DDR enter self refresh */
3749 alc5505_coef_set(codec, 0x61c0, 0x11110080); /* Clock control for PLL and CPU */
3750 alc5505_coef_set(codec, 0x6230, 0xfc0d4011); /* Disable Input OP */
3751 alc5505_coef_set(codec, 0x61b4, 0x040a2b03); /* Stop PLL2 */
3752 alc5505_coef_set(codec, 0x61b0, 0x00005b17); /* Stop PLL1 */
3753 alc5505_coef_set(codec, 0x61b8, 0x04133303); /* Stop PLL3 */
3754 val = alc5505_coef_get(codec, 0x6220);
3755 alc5505_coef_set(codec, 0x6220, (val | 0x3000)); /* switch Ringbuffer clock to DBUS clock */
3756}
3757
3758static void alc5505_dsp_back_from_halt(struct hda_codec *codec)
3759{
3760 alc5505_coef_set(codec, 0x61b8, 0x04133302);
3761 alc5505_coef_set(codec, 0x61b0, 0x00005b16);
3762 alc5505_coef_set(codec, 0x61b4, 0x040a2b02);
3763 alc5505_coef_set(codec, 0x6230, 0xf80d4011);
3764 alc5505_coef_set(codec, 0x6220, 0x2002010f);
3765 alc5505_coef_set(codec, 0x880c, 0x00000004);
3766}
3767
3768static void alc5505_dsp_init(struct hda_codec *codec)
3769{
3770 unsigned int val;
3771
3772 alc5505_dsp_halt(codec);
3773 alc5505_dsp_back_from_halt(codec);
3774 alc5505_coef_set(codec, 0x61b0, 0x5b14); /* PLL1 control */
3775 alc5505_coef_set(codec, 0x61b0, 0x5b16);
3776 alc5505_coef_set(codec, 0x61b4, 0x04132b00); /* PLL2 control */
3777 alc5505_coef_set(codec, 0x61b4, 0x04132b02);
3778 alc5505_coef_set(codec, 0x61b8, 0x041f3300); /* PLL3 control*/
3779 alc5505_coef_set(codec, 0x61b8, 0x041f3302);
3780 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_CODEC_RESET, 0); /* Function reset */
3781 alc5505_coef_set(codec, 0x61b8, 0x041b3302);
3782 alc5505_coef_set(codec, 0x61b8, 0x04173302);
3783 alc5505_coef_set(codec, 0x61b8, 0x04163302);
3784 alc5505_coef_set(codec, 0x8800, 0x348b328b); /* DRAM control */
3785 alc5505_coef_set(codec, 0x8808, 0x00020022); /* DRAM control */
3786 alc5505_coef_set(codec, 0x8818, 0x00000400); /* DRAM control */
3787
3788 val = alc5505_coef_get(codec, 0x6200) >> 16; /* Read revision ID */
3789 if (val <= 3)
3790 alc5505_coef_set(codec, 0x6220, 0x2002010f); /* I/O PAD Configuration */
3791 else
3792 alc5505_coef_set(codec, 0x6220, 0x6002018f);
3793
3794 alc5505_coef_set(codec, 0x61ac, 0x055525f0); /**/
3795 alc5505_coef_set(codec, 0x61c0, 0x12230080); /* Clock control */
3796 alc5505_coef_set(codec, 0x61b4, 0x040e2b02); /* PLL2 control */
3797 alc5505_coef_set(codec, 0x61bc, 0x010234f8); /* OSC Control */
3798 alc5505_coef_set(codec, 0x880c, 0x00000004); /* DRAM Function control */
3799 alc5505_coef_set(codec, 0x880c, 0x00000003);
3800 alc5505_coef_set(codec, 0x880c, 0x00000010);
Takashi Iwaicd63a5f2013-07-05 12:13:59 +02003801
3802#ifdef HALT_REALTEK_ALC5505
3803 alc5505_dsp_halt(codec);
3804#endif
Kailang Yangad60d502013-06-28 12:03:01 +02003805}
3806
Takashi Iwaicd63a5f2013-07-05 12:13:59 +02003807#ifdef HALT_REALTEK_ALC5505
Pierre-Louis Bossart8a718212020-01-11 15:47:35 -06003808#define alc5505_dsp_suspend(codec) do { } while (0) /* NOP */
3809#define alc5505_dsp_resume(codec) do { } while (0) /* NOP */
Takashi Iwaicd63a5f2013-07-05 12:13:59 +02003810#else
3811#define alc5505_dsp_suspend(codec) alc5505_dsp_halt(codec)
3812#define alc5505_dsp_resume(codec) alc5505_dsp_back_from_halt(codec)
3813#endif
3814
Takashi Iwai2a439522011-07-26 09:52:50 +02003815#ifdef CONFIG_PM
Kailang Yangad60d502013-06-28 12:03:01 +02003816static int alc269_suspend(struct hda_codec *codec)
3817{
3818 struct alc_spec *spec = codec->spec;
3819
3820 if (spec->has_alc5505_dsp)
Takashi Iwaicd63a5f2013-07-05 12:13:59 +02003821 alc5505_dsp_suspend(codec);
Kailang Yangad60d502013-06-28 12:03:01 +02003822 return alc_suspend(codec);
3823}
3824
Takashi Iwai1d045db2011-07-07 18:23:21 +02003825static int alc269_resume(struct hda_codec *codec)
3826{
Kailang Yangadcc70b2012-05-25 08:08:38 +02003827 struct alc_spec *spec = codec->spec;
3828
Kailang Yang1387e2d2012-11-08 10:23:18 +01003829 if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3830 alc269vb_toggle_power_output(codec, 0);
3831 if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
Kailang Yangadcc70b2012-05-25 08:08:38 +02003832 (alc_get_coef0(codec) & 0x00ff) == 0x018) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02003833 msleep(150);
3834 }
3835
3836 codec->patch_ops.init(codec);
3837
Kailang Yang1387e2d2012-11-08 10:23:18 +01003838 if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3839 alc269vb_toggle_power_output(codec, 1);
3840 if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
Kailang Yangadcc70b2012-05-25 08:08:38 +02003841 (alc_get_coef0(codec) & 0x00ff) == 0x017) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02003842 msleep(200);
3843 }
3844
Takashi Iwai1a462be2020-01-09 10:01:04 +01003845 snd_hda_regmap_sync(codec);
Takashi Iwai1d045db2011-07-07 18:23:21 +02003846 hda_call_check_power_status(codec, 0x01);
Hui Wangf4753712014-08-19 12:07:03 +08003847
3848 /* on some machine, the BIOS will clear the codec gpio data when enter
3849 * suspend, and won't restore the data after resume, so we restore it
3850 * in the driver.
3851 */
Takashi Iwaid261eec2018-06-19 22:32:29 +02003852 if (spec->gpio_data)
3853 alc_write_gpio_data(codec);
Hui Wangf4753712014-08-19 12:07:03 +08003854
Kailang Yangad60d502013-06-28 12:03:01 +02003855 if (spec->has_alc5505_dsp)
Takashi Iwaicd63a5f2013-07-05 12:13:59 +02003856 alc5505_dsp_resume(codec);
Kailang Yangc5177c82013-07-24 14:39:49 +02003857
Takashi Iwai1d045db2011-07-07 18:23:21 +02003858 return 0;
3859}
Takashi Iwai2a439522011-07-26 09:52:50 +02003860#endif /* CONFIG_PM */
Takashi Iwai1d045db2011-07-07 18:23:21 +02003861
David Henningsson108cc102012-07-20 10:37:25 +02003862static void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01003863 const struct hda_fixup *fix, int action)
David Henningsson108cc102012-07-20 10:37:25 +02003864{
3865 struct alc_spec *spec = codec->spec;
3866
Takashi Iwai1727a772013-01-10 09:52:52 +01003867 if (action == HDA_FIXUP_ACT_PRE_PROBE)
David Henningsson108cc102012-07-20 10:37:25 +02003868 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
3869}
3870
Jan-Marek Glogowskifdcc9682018-02-14 11:29:15 +01003871static void alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec *codec,
3872 const struct hda_fixup *fix,
3873 int action)
3874{
3875 unsigned int cfg_headphone = snd_hda_codec_get_pincfg(codec, 0x21);
3876 unsigned int cfg_headset_mic = snd_hda_codec_get_pincfg(codec, 0x19);
3877
3878 if (cfg_headphone && cfg_headset_mic == 0x411111f0)
3879 snd_hda_codec_set_pincfg(codec, 0x19,
3880 (cfg_headphone & ~AC_DEFCFG_DEVICE) |
3881 (AC_JACK_MIC_IN << AC_DEFCFG_DEVICE_SHIFT));
3882}
3883
Takashi Iwai1d045db2011-07-07 18:23:21 +02003884static void alc269_fixup_hweq(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01003885 const struct hda_fixup *fix, int action)
Takashi Iwai1d045db2011-07-07 18:23:21 +02003886{
Takashi Iwai98b24882014-08-18 13:47:50 +02003887 if (action == HDA_FIXUP_ACT_INIT)
3888 alc_update_coef_idx(codec, 0x1e, 0, 0x80);
Takashi Iwai1d045db2011-07-07 18:23:21 +02003889}
3890
David Henningsson7c478f02013-10-11 10:18:46 +02003891static void alc269_fixup_headset_mic(struct hda_codec *codec,
3892 const struct hda_fixup *fix, int action)
3893{
3894 struct alc_spec *spec = codec->spec;
3895
3896 if (action == HDA_FIXUP_ACT_PRE_PROBE)
3897 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
3898}
3899
Takashi Iwai1d045db2011-07-07 18:23:21 +02003900static void alc271_fixup_dmic(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01003901 const struct hda_fixup *fix, int action)
Takashi Iwai1d045db2011-07-07 18:23:21 +02003902{
3903 static const struct hda_verb verbs[] = {
3904 {0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
3905 {0x20, AC_VERB_SET_PROC_COEF, 0x4000},
3906 {}
3907 };
3908 unsigned int cfg;
3909
Takashi Iwai7639a062015-03-03 10:07:24 +01003910 if (strcmp(codec->core.chip_name, "ALC271X") &&
3911 strcmp(codec->core.chip_name, "ALC269VB"))
Takashi Iwai1d045db2011-07-07 18:23:21 +02003912 return;
3913 cfg = snd_hda_codec_get_pincfg(codec, 0x12);
3914 if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED)
3915 snd_hda_sequence_write(codec, verbs);
3916}
3917
Takashi Iwai017f2a12011-07-09 14:42:25 +02003918static void alc269_fixup_pcm_44k(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01003919 const struct hda_fixup *fix, int action)
Takashi Iwai017f2a12011-07-09 14:42:25 +02003920{
3921 struct alc_spec *spec = codec->spec;
3922
Takashi Iwai1727a772013-01-10 09:52:52 +01003923 if (action != HDA_FIXUP_ACT_PROBE)
Takashi Iwai017f2a12011-07-09 14:42:25 +02003924 return;
3925
3926 /* Due to a hardware problem on Lenovo Ideadpad, we need to
3927 * fix the sample rate of analog I/O to 44.1kHz
3928 */
Takashi Iwai08c189f2012-12-19 15:22:24 +01003929 spec->gen.stream_analog_playback = &alc269_44k_pcm_analog_playback;
3930 spec->gen.stream_analog_capture = &alc269_44k_pcm_analog_capture;
Takashi Iwai017f2a12011-07-09 14:42:25 +02003931}
3932
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02003933static void alc269_fixup_stereo_dmic(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01003934 const struct hda_fixup *fix, int action)
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02003935{
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02003936 /* The digital-mic unit sends PDM (differential signal) instead of
3937 * the standard PCM, thus you can't record a valid mono stream as is.
3938 * Below is a workaround specific to ALC269 to control the dmic
3939 * signal source as mono.
3940 */
Takashi Iwai98b24882014-08-18 13:47:50 +02003941 if (action == HDA_FIXUP_ACT_INIT)
3942 alc_update_coef_idx(codec, 0x07, 0, 0x80);
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02003943}
3944
Takashi Iwai24519912011-08-16 15:08:49 +02003945static void alc269_quanta_automute(struct hda_codec *codec)
3946{
Takashi Iwai08c189f2012-12-19 15:22:24 +01003947 snd_hda_gen_update_outputs(codec);
Takashi Iwai24519912011-08-16 15:08:49 +02003948
Takashi Iwai1687ccc2014-08-18 13:49:35 +02003949 alc_write_coef_idx(codec, 0x0c, 0x680);
3950 alc_write_coef_idx(codec, 0x0c, 0x480);
Takashi Iwai24519912011-08-16 15:08:49 +02003951}
3952
3953static void alc269_fixup_quanta_mute(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01003954 const struct hda_fixup *fix, int action)
Takashi Iwai24519912011-08-16 15:08:49 +02003955{
3956 struct alc_spec *spec = codec->spec;
Takashi Iwai1727a772013-01-10 09:52:52 +01003957 if (action != HDA_FIXUP_ACT_PROBE)
Takashi Iwai24519912011-08-16 15:08:49 +02003958 return;
Takashi Iwai08c189f2012-12-19 15:22:24 +01003959 spec->gen.automute_hook = alc269_quanta_automute;
Takashi Iwai24519912011-08-16 15:08:49 +02003960}
3961
David Henningssond240d1d2013-04-15 12:50:02 +02003962static void alc269_x101_hp_automute_hook(struct hda_codec *codec,
Takashi Iwai1a4f69d2014-09-11 15:22:46 +02003963 struct hda_jack_callback *jack)
David Henningssond240d1d2013-04-15 12:50:02 +02003964{
3965 struct alc_spec *spec = codec->spec;
3966 int vref;
3967 msleep(200);
3968 snd_hda_gen_hp_automute(codec, jack);
3969
3970 vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
3971 msleep(100);
3972 snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
3973 vref);
3974 msleep(500);
3975 snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
3976 vref);
3977}
3978
Tomas Espeletaa2ef03f2019-08-09 16:37:54 +02003979/*
3980 * Magic sequence to make Huawei Matebook X right speaker working (bko#197801)
3981 */
3982struct hda_alc298_mbxinit {
3983 unsigned char value_0x23;
3984 unsigned char value_0x25;
3985};
3986
3987static void alc298_huawei_mbx_stereo_seq(struct hda_codec *codec,
3988 const struct hda_alc298_mbxinit *initval,
3989 bool first)
3990{
3991 snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x0);
3992 alc_write_coef_idx(codec, 0x26, 0xb000);
3993
3994 if (first)
3995 snd_hda_codec_write(codec, 0x21, 0, AC_VERB_GET_PIN_SENSE, 0x0);
3996
3997 snd_hda_codec_write(codec, 0x6, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
3998 alc_write_coef_idx(codec, 0x26, 0xf000);
3999 alc_write_coef_idx(codec, 0x23, initval->value_0x23);
4000
4001 if (initval->value_0x23 != 0x1e)
4002 alc_write_coef_idx(codec, 0x25, initval->value_0x25);
4003
4004 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
4005 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
4006}
4007
4008static void alc298_fixup_huawei_mbx_stereo(struct hda_codec *codec,
4009 const struct hda_fixup *fix,
4010 int action)
4011{
4012 /* Initialization magic */
4013 static const struct hda_alc298_mbxinit dac_init[] = {
4014 {0x0c, 0x00}, {0x0d, 0x00}, {0x0e, 0x00}, {0x0f, 0x00},
4015 {0x10, 0x00}, {0x1a, 0x40}, {0x1b, 0x82}, {0x1c, 0x00},
4016 {0x1d, 0x00}, {0x1e, 0x00}, {0x1f, 0x00},
4017 {0x20, 0xc2}, {0x21, 0xc8}, {0x22, 0x26}, {0x23, 0x24},
4018 {0x27, 0xff}, {0x28, 0xff}, {0x29, 0xff}, {0x2a, 0x8f},
4019 {0x2b, 0x02}, {0x2c, 0x48}, {0x2d, 0x34}, {0x2e, 0x00},
4020 {0x2f, 0x00},
4021 {0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00},
4022 {0x34, 0x00}, {0x35, 0x01}, {0x36, 0x93}, {0x37, 0x0c},
4023 {0x38, 0x00}, {0x39, 0x00}, {0x3a, 0xf8}, {0x38, 0x80},
4024 {}
4025 };
4026 const struct hda_alc298_mbxinit *seq;
4027
4028 if (action != HDA_FIXUP_ACT_INIT)
4029 return;
4030
4031 /* Start */
4032 snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x00);
4033 snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
4034 alc_write_coef_idx(codec, 0x26, 0xf000);
4035 alc_write_coef_idx(codec, 0x22, 0x31);
4036 alc_write_coef_idx(codec, 0x23, 0x0b);
4037 alc_write_coef_idx(codec, 0x25, 0x00);
4038 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
4039 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
4040
4041 for (seq = dac_init; seq->value_0x23; seq++)
4042 alc298_huawei_mbx_stereo_seq(codec, seq, seq == dac_init);
4043}
4044
David Henningssond240d1d2013-04-15 12:50:02 +02004045static void alc269_fixup_x101_headset_mic(struct hda_codec *codec,
4046 const struct hda_fixup *fix, int action)
4047{
4048 struct alc_spec *spec = codec->spec;
4049 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4050 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
4051 spec->gen.hp_automute_hook = alc269_x101_hp_automute_hook;
4052 }
4053}
4054
Takashi Iwai766538a2020-06-18 13:08:41 +02004055static void alc_update_vref_led(struct hda_codec *codec, hda_nid_t pin,
4056 bool polarity, bool on)
David Henningsson6d3cd5d2013-01-07 12:03:47 +01004057{
Takashi Iwai08fb0d02013-01-10 17:33:58 +01004058 unsigned int pinval;
4059
Takashi Iwai766538a2020-06-18 13:08:41 +02004060 if (!pin)
4061 return;
4062 if (polarity)
4063 on = !on;
4064 pinval = snd_hda_codec_get_pin_target(codec, pin);
Takashi Iwai415d5552014-04-03 11:51:21 +02004065 pinval &= ~AC_PINCTL_VREFEN;
Takashi Iwai766538a2020-06-18 13:08:41 +02004066 pinval |= on ? AC_PINCTL_VREF_80 : AC_PINCTL_VREF_HIZ;
4067 /* temporarily power up/down for setting VREF */
4068 snd_hda_power_up_pm(codec);
4069 snd_hda_set_pin_ctl_cache(codec, pin, pinval);
4070 snd_hda_power_down_pm(codec);
4071}
Takashi Iwai1d045db2011-07-07 18:23:21 +02004072
David Henningsson6d3cd5d2013-01-07 12:03:47 +01004073/* update mute-LED according to the speaker mute state via mic VREF pin */
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004074static int vref_mute_led_set(struct led_classdev *led_cdev,
4075 enum led_brightness brightness)
David Henningsson6d3cd5d2013-01-07 12:03:47 +01004076{
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004077 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
Takashi Iwai08fb0d02013-01-10 17:33:58 +01004078 struct alc_spec *spec = codec->spec;
Takashi Iwai08fb0d02013-01-10 17:33:58 +01004079
Takashi Iwai766538a2020-06-18 13:08:41 +02004080 alc_update_vref_led(codec, spec->mute_led_nid,
4081 spec->mute_led_polarity, brightness);
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004082 return 0;
David Henningsson6d3cd5d2013-01-07 12:03:47 +01004083}
4084
David Henningssond5b6b652013-11-06 10:50:44 +01004085/* Make sure the led works even in runtime suspend */
4086static unsigned int led_power_filter(struct hda_codec *codec,
4087 hda_nid_t nid,
4088 unsigned int power_state)
4089{
4090 struct alc_spec *spec = codec->spec;
4091
Hui Wang50dd9052014-07-08 17:56:15 +08004092 if (power_state != AC_PWRST_D3 || nid == 0 ||
4093 (nid != spec->mute_led_nid && nid != spec->cap_mute_led_nid))
David Henningssond5b6b652013-11-06 10:50:44 +01004094 return power_state;
4095
4096 /* Set pin ctl again, it might have just been set to 0 */
4097 snd_hda_set_pin_ctl(codec, nid,
4098 snd_hda_codec_get_pin_target(codec, nid));
4099
Takashi Iwaicffd3962015-04-09 10:30:25 +02004100 return snd_hda_gen_path_power_filter(codec, nid, power_state);
David Henningssond5b6b652013-11-06 10:50:44 +01004101}
4102
Takashi Iwai08fb0d02013-01-10 17:33:58 +01004103static void alc269_fixup_hp_mute_led(struct hda_codec *codec,
4104 const struct hda_fixup *fix, int action)
David Henningsson6d3cd5d2013-01-07 12:03:47 +01004105{
4106 struct alc_spec *spec = codec->spec;
Takashi Iwai08fb0d02013-01-10 17:33:58 +01004107 const struct dmi_device *dev = NULL;
4108
4109 if (action != HDA_FIXUP_ACT_PRE_PROBE)
4110 return;
4111
4112 while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) {
4113 int pol, pin;
4114 if (sscanf(dev->name, "HP_Mute_LED_%d_%x", &pol, &pin) != 2)
4115 continue;
4116 if (pin < 0x0a || pin >= 0x10)
4117 break;
4118 spec->mute_led_polarity = pol;
4119 spec->mute_led_nid = pin - 0x0a + 0x18;
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004120 snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
David Henningssond5b6b652013-11-06 10:50:44 +01004121 codec->power_filter = led_power_filter;
Takashi Iwai4e76a882014-02-25 12:21:03 +01004122 codec_dbg(codec,
4123 "Detected mute LED for %x:%d\n", spec->mute_led_nid,
Takashi Iwai08fb0d02013-01-10 17:33:58 +01004124 spec->mute_led_polarity);
David Henningsson6d3cd5d2013-01-07 12:03:47 +01004125 break;
4126 }
4127}
4128
Takashi Iwai85c467d2018-05-29 11:38:38 +02004129static void alc269_fixup_hp_mute_led_micx(struct hda_codec *codec,
4130 const struct hda_fixup *fix,
4131 int action, hda_nid_t pin)
David Henningssond06ac142013-02-18 11:41:55 +01004132{
4133 struct alc_spec *spec = codec->spec;
Takashi Iwai85c467d2018-05-29 11:38:38 +02004134
David Henningssond06ac142013-02-18 11:41:55 +01004135 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4136 spec->mute_led_polarity = 0;
Takashi Iwai85c467d2018-05-29 11:38:38 +02004137 spec->mute_led_nid = pin;
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004138 snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
David Henningssond5b6b652013-11-06 10:50:44 +01004139 codec->power_filter = led_power_filter;
David Henningssond06ac142013-02-18 11:41:55 +01004140 }
4141}
4142
Takashi Iwai85c467d2018-05-29 11:38:38 +02004143static void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec,
4144 const struct hda_fixup *fix, int action)
4145{
4146 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x18);
4147}
4148
Takashi Iwai08fb0d02013-01-10 17:33:58 +01004149static void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec,
4150 const struct hda_fixup *fix, int action)
Takashi Iwai420b0fe2012-03-12 12:35:27 +01004151{
Takashi Iwai85c467d2018-05-29 11:38:38 +02004152 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x19);
Takashi Iwai420b0fe2012-03-12 12:35:27 +01004153}
4154
Tom Briden7f783bd2017-03-25 10:12:01 +00004155static void alc269_fixup_hp_mute_led_mic3(struct hda_codec *codec,
4156 const struct hda_fixup *fix, int action)
4157{
Takashi Iwai85c467d2018-05-29 11:38:38 +02004158 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1b);
Tom Briden7f783bd2017-03-25 10:12:01 +00004159}
4160
Takashi Iwai0f32fd192014-11-19 12:16:14 +01004161/* update LED status via GPIO */
4162static void alc_update_gpio_led(struct hda_codec *codec, unsigned int mask,
Kai-Heng Fengdbd13172020-04-30 16:32:51 +08004163 int polarity, bool enabled)
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01004164{
Kai-Heng Fengdbd13172020-04-30 16:32:51 +08004165 if (polarity)
Takashi Iwai0f32fd192014-11-19 12:16:14 +01004166 enabled = !enabled;
Takashi Iwaid261eec2018-06-19 22:32:29 +02004167 alc_update_gpio_data(codec, mask, !enabled); /* muted -> LED on */
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01004168}
4169
Takashi Iwai0f32fd192014-11-19 12:16:14 +01004170/* turn on/off mute LED via GPIO per vmaster hook */
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004171static int gpio_mute_led_set(struct led_classdev *led_cdev,
4172 enum led_brightness brightness)
Takashi Iwai0f32fd192014-11-19 12:16:14 +01004173{
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004174 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
Takashi Iwai0f32fd192014-11-19 12:16:14 +01004175 struct alc_spec *spec = codec->spec;
4176
Kai-Heng Fengdbd13172020-04-30 16:32:51 +08004177 alc_update_gpio_led(codec, spec->gpio_mute_led_mask,
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004178 spec->mute_led_polarity, !brightness);
4179 return 0;
Takashi Iwai0f32fd192014-11-19 12:16:14 +01004180}
4181
4182/* turn on/off mic-mute LED via GPIO per capture hook */
Kai-Heng Feng87dc3642020-04-30 21:52:07 +08004183static int micmute_led_set(struct led_classdev *led_cdev,
4184 enum led_brightness brightness)
4185{
4186 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4187 struct alc_spec *spec = codec->spec;
4188
4189 alc_update_gpio_led(codec, spec->gpio_mic_led_mask,
Hui Wang40469062020-08-11 20:24:30 +08004190 spec->micmute_led_polarity, !brightness);
Kai-Heng Feng87dc3642020-04-30 21:52:07 +08004191 return 0;
4192}
4193
Takashi Iwai01e4a272018-06-19 22:47:30 +02004194/* setup mute and mic-mute GPIO bits, add hooks appropriately */
4195static void alc_fixup_hp_gpio_led(struct hda_codec *codec,
4196 int action,
4197 unsigned int mute_mask,
4198 unsigned int micmute_mask)
4199{
4200 struct alc_spec *spec = codec->spec;
4201
4202 alc_fixup_gpio(codec, action, mute_mask | micmute_mask);
4203
4204 if (action != HDA_FIXUP_ACT_PRE_PROBE)
4205 return;
4206 if (mute_mask) {
4207 spec->gpio_mute_led_mask = mute_mask;
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004208 snd_hda_gen_add_mute_led_cdev(codec, gpio_mute_led_set);
Takashi Iwai01e4a272018-06-19 22:47:30 +02004209 }
4210 if (micmute_mask) {
4211 spec->gpio_mic_led_mask = micmute_mask;
Takashi Iwai7cdf8c42020-06-18 13:08:31 +02004212 snd_hda_gen_add_micmute_led_cdev(codec, micmute_led_set);
Takashi Iwai01e4a272018-06-19 22:47:30 +02004213 }
4214}
4215
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01004216static void alc269_fixup_hp_gpio_led(struct hda_codec *codec,
4217 const struct hda_fixup *fix, int action)
4218{
Takashi Iwai01e4a272018-06-19 22:47:30 +02004219 alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01004220}
4221
Kai-Heng Fengf5a88b02020-03-27 12:46:25 +08004222static void alc285_fixup_hp_gpio_led(struct hda_codec *codec,
4223 const struct hda_fixup *fix, int action)
4224{
Kai-Heng Feng3e0650a2020-04-30 16:32:52 +08004225 alc_fixup_hp_gpio_led(codec, action, 0x04, 0x01);
Kai-Heng Fengf5a88b02020-03-27 12:46:25 +08004226}
4227
Kailang Yangeaa8e5e2014-11-21 15:49:11 +08004228static void alc286_fixup_hp_gpio_led(struct hda_codec *codec,
4229 const struct hda_fixup *fix, int action)
4230{
Takashi Iwai01e4a272018-06-19 22:47:30 +02004231 alc_fixup_hp_gpio_led(codec, action, 0x02, 0x20);
Takashi Iwai1d045db2011-07-07 18:23:21 +02004232}
4233
Kailang Yanga0ccbc52020-11-06 15:20:38 +08004234static void alc287_fixup_hp_gpio_led(struct hda_codec *codec,
4235 const struct hda_fixup *fix, int action)
4236{
4237 alc_fixup_hp_gpio_led(codec, action, 0x10, 0);
4238}
4239
Takashi Iwai8a503552020-06-18 13:08:32 +02004240/* turn on/off mic-mute LED per capture hook via VREF change */
4241static int vref_micmute_led_set(struct led_classdev *led_cdev,
4242 enum led_brightness brightness)
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004243{
Takashi Iwai8a503552020-06-18 13:08:32 +02004244 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004245 struct alc_spec *spec = codec->spec;
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004246
Takashi Iwai766538a2020-06-18 13:08:41 +02004247 alc_update_vref_led(codec, spec->cap_mute_led_nid,
4248 spec->micmute_led_polarity, brightness);
Takashi Iwai8a503552020-06-18 13:08:32 +02004249 return 0;
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004250}
4251
4252static void alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec,
4253 const struct hda_fixup *fix, int action)
4254{
4255 struct alc_spec *spec = codec->spec;
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004256
Takashi Iwai01e4a272018-06-19 22:47:30 +02004257 alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004258 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai01e4a272018-06-19 22:47:30 +02004259 /* Like hp_gpio_mic1_led, but also needs GPIO4 low to
4260 * enable headphone amp
4261 */
4262 spec->gpio_mask |= 0x10;
4263 spec->gpio_dir |= 0x10;
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004264 spec->cap_mute_led_nid = 0x18;
Takashi Iwai8a503552020-06-18 13:08:32 +02004265 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
Hui Wang50dd9052014-07-08 17:56:15 +08004266 codec->power_filter = led_power_filter;
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004267 }
4268}
4269
David Henningsson7a5255f2014-10-30 08:26:01 +01004270static void alc280_fixup_hp_gpio4(struct hda_codec *codec,
4271 const struct hda_fixup *fix, int action)
4272{
David Henningsson7a5255f2014-10-30 08:26:01 +01004273 struct alc_spec *spec = codec->spec;
David Henningsson7a5255f2014-10-30 08:26:01 +01004274
Takashi Iwai01e4a272018-06-19 22:47:30 +02004275 alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
David Henningsson7a5255f2014-10-30 08:26:01 +01004276 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
David Henningsson7a5255f2014-10-30 08:26:01 +01004277 spec->cap_mute_led_nid = 0x18;
Takashi Iwai8a503552020-06-18 13:08:32 +02004278 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
David Henningsson7a5255f2014-10-30 08:26:01 +01004279 codec->power_filter = led_power_filter;
4280 }
4281}
4282
Takashi Iwai766538a2020-06-18 13:08:41 +02004283static void alc_update_coef_led(struct hda_codec *codec,
4284 struct alc_coef_led *led,
4285 bool polarity, bool on)
Kailang Yang431e76c2020-04-07 14:40:20 +08004286{
Takashi Iwai766538a2020-06-18 13:08:41 +02004287 if (polarity)
4288 on = !on;
4289 /* temporarily power up/down for setting COEF bit */
4290 alc_update_coef_idx(codec, led->idx, led->mask,
4291 on ? led->on : led->off);
4292}
4293
Kailang Yang431e76c2020-04-07 14:40:20 +08004294/* update mute-LED according to the speaker mute state via COEF bit */
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004295static int coef_mute_led_set(struct led_classdev *led_cdev,
4296 enum led_brightness brightness)
Kailang Yang431e76c2020-04-07 14:40:20 +08004297{
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004298 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
Kailang Yang431e76c2020-04-07 14:40:20 +08004299 struct alc_spec *spec = codec->spec;
4300
Takashi Iwai766538a2020-06-18 13:08:41 +02004301 alc_update_coef_led(codec, &spec->mute_led_coef,
4302 spec->mute_led_polarity, brightness);
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004303 return 0;
Kailang Yang431e76c2020-04-07 14:40:20 +08004304}
4305
4306static void alc285_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4307 const struct hda_fixup *fix,
4308 int action)
4309{
4310 struct alc_spec *spec = codec->spec;
4311
4312 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4313 spec->mute_led_polarity = 0;
Takashi Iwai766538a2020-06-18 13:08:41 +02004314 spec->mute_led_coef.idx = 0x0b;
4315 spec->mute_led_coef.mask = 1 << 3;
4316 spec->mute_led_coef.on = 1 << 3;
4317 spec->mute_led_coef.off = 0;
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004318 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
Kailang Yang431e76c2020-04-07 14:40:20 +08004319 }
4320}
4321
Kailang Yang24164f42020-04-07 14:52:42 +08004322static void alc236_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4323 const struct hda_fixup *fix,
4324 int action)
4325{
4326 struct alc_spec *spec = codec->spec;
4327
4328 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4329 spec->mute_led_polarity = 0;
Takashi Iwai766538a2020-06-18 13:08:41 +02004330 spec->mute_led_coef.idx = 0x34;
4331 spec->mute_led_coef.mask = 1 << 5;
4332 spec->mute_led_coef.on = 0;
4333 spec->mute_led_coef.off = 1 << 5;
Takashi Iwai8d3d1ec2020-06-18 13:08:38 +02004334 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
Kailang Yang24164f42020-04-07 14:52:42 +08004335 }
4336}
4337
Kailang Yang431e76c2020-04-07 14:40:20 +08004338/* turn on/off mic-mute LED per capture hook by coef bit */
Takashi Iwai8a503552020-06-18 13:08:32 +02004339static int coef_micmute_led_set(struct led_classdev *led_cdev,
4340 enum led_brightness brightness)
Kailang Yang431e76c2020-04-07 14:40:20 +08004341{
Takashi Iwai8a503552020-06-18 13:08:32 +02004342 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
Kailang Yang431e76c2020-04-07 14:40:20 +08004343 struct alc_spec *spec = codec->spec;
4344
Takashi Iwai766538a2020-06-18 13:08:41 +02004345 alc_update_coef_led(codec, &spec->mic_led_coef,
4346 spec->micmute_led_polarity, brightness);
Takashi Iwai8a503552020-06-18 13:08:32 +02004347 return 0;
Kailang Yang431e76c2020-04-07 14:40:20 +08004348}
4349
4350static void alc285_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4351 const struct hda_fixup *fix, int action)
4352{
4353 struct alc_spec *spec = codec->spec;
4354
4355 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai766538a2020-06-18 13:08:41 +02004356 spec->mic_led_coef.idx = 0x19;
4357 spec->mic_led_coef.mask = 1 << 13;
4358 spec->mic_led_coef.on = 1 << 13;
4359 spec->mic_led_coef.off = 0;
Takashi Iwai8a503552020-06-18 13:08:32 +02004360 snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
Kailang Yang431e76c2020-04-07 14:40:20 +08004361 }
4362}
4363
Kailang Yang24164f42020-04-07 14:52:42 +08004364static void alc236_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4365 const struct hda_fixup *fix, int action)
4366{
4367 struct alc_spec *spec = codec->spec;
4368
4369 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai766538a2020-06-18 13:08:41 +02004370 spec->mic_led_coef.idx = 0x35;
4371 spec->mic_led_coef.mask = 3 << 2;
4372 spec->mic_led_coef.on = 2 << 2;
4373 spec->mic_led_coef.off = 1 << 2;
Takashi Iwai8a503552020-06-18 13:08:32 +02004374 snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
Kailang Yang24164f42020-04-07 14:52:42 +08004375 }
4376}
4377
Kailang Yang431e76c2020-04-07 14:40:20 +08004378static void alc285_fixup_hp_mute_led(struct hda_codec *codec,
4379 const struct hda_fixup *fix, int action)
4380{
4381 alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
4382 alc285_fixup_hp_coef_micmute_led(codec, fix, action);
4383}
4384
Kailang Yang24164f42020-04-07 14:52:42 +08004385static void alc236_fixup_hp_mute_led(struct hda_codec *codec,
4386 const struct hda_fixup *fix, int action)
4387{
4388 alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
4389 alc236_fixup_hp_coef_micmute_led(codec, fix, action);
4390}
4391
Takashi Iwai6a30aba2018-04-27 17:17:35 +02004392#if IS_REACHABLE(CONFIG_INPUT)
David Henningsson33f4acd2015-01-07 15:50:13 +01004393static void gpio2_mic_hotkey_event(struct hda_codec *codec,
4394 struct hda_jack_callback *event)
4395{
4396 struct alc_spec *spec = codec->spec;
4397
4398 /* GPIO2 just toggles on a keypress/keyrelease cycle. Therefore
4399 send both key on and key off event for every interrupt. */
Hui Wangc7b60a82015-12-28 11:35:25 +08004400 input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 1);
David Henningsson33f4acd2015-01-07 15:50:13 +01004401 input_sync(spec->kb_dev);
Hui Wangc7b60a82015-12-28 11:35:25 +08004402 input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 0);
David Henningsson33f4acd2015-01-07 15:50:13 +01004403 input_sync(spec->kb_dev);
4404}
David Henningsson33f4acd2015-01-07 15:50:13 +01004405
Kailang3694cb22015-12-28 11:35:24 +08004406static int alc_register_micmute_input_device(struct hda_codec *codec)
4407{
4408 struct alc_spec *spec = codec->spec;
Hui Wangc7b60a82015-12-28 11:35:25 +08004409 int i;
Kailang3694cb22015-12-28 11:35:24 +08004410
4411 spec->kb_dev = input_allocate_device();
4412 if (!spec->kb_dev) {
4413 codec_err(codec, "Out of memory (input_allocate_device)\n");
4414 return -ENOMEM;
4415 }
Hui Wangc7b60a82015-12-28 11:35:25 +08004416
4417 spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX] = KEY_MICMUTE;
4418
Kailang3694cb22015-12-28 11:35:24 +08004419 spec->kb_dev->name = "Microphone Mute Button";
4420 spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY);
Hui Wangc7b60a82015-12-28 11:35:25 +08004421 spec->kb_dev->keycodesize = sizeof(spec->alc_mute_keycode_map[0]);
4422 spec->kb_dev->keycodemax = ARRAY_SIZE(spec->alc_mute_keycode_map);
4423 spec->kb_dev->keycode = spec->alc_mute_keycode_map;
4424 for (i = 0; i < ARRAY_SIZE(spec->alc_mute_keycode_map); i++)
4425 set_bit(spec->alc_mute_keycode_map[i], spec->kb_dev->keybit);
Kailang3694cb22015-12-28 11:35:24 +08004426
4427 if (input_register_device(spec->kb_dev)) {
4428 codec_err(codec, "input_register_device failed\n");
4429 input_free_device(spec->kb_dev);
4430 spec->kb_dev = NULL;
4431 return -ENOMEM;
4432 }
4433
4434 return 0;
4435}
4436
Takashi Iwai01e4a272018-06-19 22:47:30 +02004437/* GPIO1 = set according to SKU external amp
4438 * GPIO2 = mic mute hotkey
4439 * GPIO3 = mute LED
4440 * GPIO4 = mic mute LED
4441 */
David Henningsson33f4acd2015-01-07 15:50:13 +01004442static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec,
4443 const struct hda_fixup *fix, int action)
4444{
David Henningsson33f4acd2015-01-07 15:50:13 +01004445 struct alc_spec *spec = codec->spec;
4446
Takashi Iwai01e4a272018-06-19 22:47:30 +02004447 alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
David Henningsson33f4acd2015-01-07 15:50:13 +01004448 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai1c76aa52018-06-21 16:37:54 +02004449 spec->init_amp = ALC_INIT_DEFAULT;
Kailang3694cb22015-12-28 11:35:24 +08004450 if (alc_register_micmute_input_device(codec) != 0)
David Henningsson33f4acd2015-01-07 15:50:13 +01004451 return;
David Henningsson33f4acd2015-01-07 15:50:13 +01004452
Takashi Iwai01e4a272018-06-19 22:47:30 +02004453 spec->gpio_mask |= 0x06;
4454 spec->gpio_dir |= 0x02;
4455 spec->gpio_data |= 0x02;
Takashi Iwai7639a062015-03-03 10:07:24 +01004456 snd_hda_codec_write_cache(codec, codec->core.afg, 0,
David Henningsson33f4acd2015-01-07 15:50:13 +01004457 AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x04);
Takashi Iwai7639a062015-03-03 10:07:24 +01004458 snd_hda_jack_detect_enable_callback(codec, codec->core.afg,
David Henningsson33f4acd2015-01-07 15:50:13 +01004459 gpio2_mic_hotkey_event);
David Henningsson33f4acd2015-01-07 15:50:13 +01004460 return;
4461 }
4462
4463 if (!spec->kb_dev)
4464 return;
4465
4466 switch (action) {
David Henningsson33f4acd2015-01-07 15:50:13 +01004467 case HDA_FIXUP_ACT_FREE:
4468 input_unregister_device(spec->kb_dev);
David Henningsson33f4acd2015-01-07 15:50:13 +01004469 spec->kb_dev = NULL;
4470 }
David Henningsson33f4acd2015-01-07 15:50:13 +01004471}
4472
Takashi Iwai01e4a272018-06-19 22:47:30 +02004473/* Line2 = mic mute hotkey
4474 * GPIO2 = mic mute LED
4475 */
Kailang3694cb22015-12-28 11:35:24 +08004476static void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec,
4477 const struct hda_fixup *fix, int action)
4478{
Kailang3694cb22015-12-28 11:35:24 +08004479 struct alc_spec *spec = codec->spec;
4480
Takashi Iwai01e4a272018-06-19 22:47:30 +02004481 alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
Kailang3694cb22015-12-28 11:35:24 +08004482 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai1c76aa52018-06-21 16:37:54 +02004483 spec->init_amp = ALC_INIT_DEFAULT;
Kailang3694cb22015-12-28 11:35:24 +08004484 if (alc_register_micmute_input_device(codec) != 0)
4485 return;
4486
Kailang3694cb22015-12-28 11:35:24 +08004487 snd_hda_jack_detect_enable_callback(codec, 0x1b,
4488 gpio2_mic_hotkey_event);
Kailang3694cb22015-12-28 11:35:24 +08004489 return;
4490 }
4491
4492 if (!spec->kb_dev)
4493 return;
4494
4495 switch (action) {
Kailang3694cb22015-12-28 11:35:24 +08004496 case HDA_FIXUP_ACT_FREE:
4497 input_unregister_device(spec->kb_dev);
4498 spec->kb_dev = NULL;
4499 }
4500}
Takashi Iwaic4696522018-01-15 10:44:35 +01004501#else /* INPUT */
4502#define alc280_fixup_hp_gpio2_mic_hotkey NULL
4503#define alc233_fixup_lenovo_line2_mic_hotkey NULL
4504#endif /* INPUT */
Kailang3694cb22015-12-28 11:35:24 +08004505
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004506static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec,
4507 const struct hda_fixup *fix, int action)
4508{
4509 struct alc_spec *spec = codec->spec;
4510
Takashi Iwai1bce62a2018-06-19 23:15:59 +02004511 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1a);
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004512 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004513 spec->cap_mute_led_nid = 0x18;
Takashi Iwai8a503552020-06-18 13:08:32 +02004514 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08004515 }
4516}
4517
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004518static const struct coef_fw alc225_pre_hsmode[] = {
Kailang Yang5a367672017-07-21 15:23:53 +08004519 UPDATE_COEF(0x4a, 1<<8, 0),
4520 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0),
4521 UPDATE_COEF(0x63, 3<<14, 3<<14),
4522 UPDATE_COEF(0x4a, 3<<4, 2<<4),
4523 UPDATE_COEF(0x4a, 3<<10, 3<<10),
4524 UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10),
4525 UPDATE_COEF(0x4a, 3<<10, 0),
4526 {}
4527};
4528
David Henningsson73bdd592013-04-15 15:44:14 +02004529static void alc_headset_mode_unplugged(struct hda_codec *codec)
4530{
Kailang Yang92666d42020-11-19 17:04:21 +08004531 struct alc_spec *spec = codec->spec;
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004532 static const struct coef_fw coef0255[] = {
Kailang Yang717f43d2019-05-31 17:16:53 +08004533 WRITE_COEF(0x1b, 0x0c0b), /* LDO and MISC control */
Takashi Iwai54db6c32014-08-18 15:11:19 +02004534 WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
4535 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
4536 WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
4537 WRITE_COEFEX(0x57, 0x03, 0x8aa6), /* Direct Drive HP Amp control */
4538 {}
4539 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004540 static const struct coef_fw coef0256[] = {
Kailang Yange69e7e02016-05-30 15:58:28 +08004541 WRITE_COEF(0x1b, 0x0c4b), /* LDO and MISC control */
Kailang Yang717f43d2019-05-31 17:16:53 +08004542 WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
4543 WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
4544 WRITE_COEFEX(0x57, 0x03, 0x09a3), /* Direct Drive HP Amp control */
4545 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
Kailang Yange69e7e02016-05-30 15:58:28 +08004546 {}
4547 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004548 static const struct coef_fw coef0233[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004549 WRITE_COEF(0x1b, 0x0c0b),
4550 WRITE_COEF(0x45, 0xc429),
4551 UPDATE_COEF(0x35, 0x4000, 0),
4552 WRITE_COEF(0x06, 0x2104),
4553 WRITE_COEF(0x1a, 0x0001),
4554 WRITE_COEF(0x26, 0x0004),
4555 WRITE_COEF(0x32, 0x42a3),
4556 {}
4557 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004558 static const struct coef_fw coef0288[] = {
Kailang Yangf3b70332015-04-08 15:01:17 +08004559 UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
4560 UPDATE_COEF(0x50, 0x2000, 0x2000),
4561 UPDATE_COEF(0x56, 0x0006, 0x0006),
4562 UPDATE_COEF(0x66, 0x0008, 0),
4563 UPDATE_COEF(0x67, 0x2000, 0),
4564 {}
4565 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004566 static const struct coef_fw coef0298[] = {
Kailang Yang89542932017-07-17 15:03:43 +08004567 UPDATE_COEF(0x19, 0x1300, 0x0300),
4568 {}
4569 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004570 static const struct coef_fw coef0292[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004571 WRITE_COEF(0x76, 0x000e),
4572 WRITE_COEF(0x6c, 0x2400),
4573 WRITE_COEF(0x18, 0x7308),
4574 WRITE_COEF(0x6b, 0xc429),
4575 {}
4576 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004577 static const struct coef_fw coef0293[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004578 UPDATE_COEF(0x10, 7<<8, 6<<8), /* SET Line1 JD to 0 */
4579 UPDATE_COEFEX(0x57, 0x05, 1<<15|1<<13, 0x0), /* SET charge pump by verb */
4580 UPDATE_COEFEX(0x57, 0x03, 1<<10, 1<<10), /* SET EN_OSW to 1 */
4581 UPDATE_COEF(0x1a, 1<<3, 1<<3), /* Combo JD gating with LINE1-VREFO */
4582 WRITE_COEF(0x45, 0xc429), /* Set to TRS type */
4583 UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
4584 {}
4585 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004586 static const struct coef_fw coef0668[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004587 WRITE_COEF(0x15, 0x0d40),
4588 WRITE_COEF(0xb7, 0x802b),
4589 {}
4590 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004591 static const struct coef_fw coef0225[] = {
Kailang Yang5a367672017-07-21 15:23:53 +08004592 UPDATE_COEF(0x63, 3<<14, 0),
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004593 {}
4594 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004595 static const struct coef_fw coef0274[] = {
Kailang Yang71683c32017-06-20 16:33:50 +08004596 UPDATE_COEF(0x4a, 0x0100, 0),
4597 UPDATE_COEFEX(0x57, 0x05, 0x4000, 0),
4598 UPDATE_COEF(0x6b, 0xf000, 0x5000),
4599 UPDATE_COEF(0x4a, 0x0010, 0),
4600 UPDATE_COEF(0x4a, 0x0c00, 0x0c00),
4601 WRITE_COEF(0x45, 0x5289),
4602 UPDATE_COEF(0x4a, 0x0c00, 0),
4603 {}
4604 };
Takashi Iwai54db6c32014-08-18 15:11:19 +02004605
Kailang Yang92666d42020-11-19 17:04:21 +08004606 if (spec->no_internal_mic_pin) {
4607 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
4608 return;
4609 }
4610
Takashi Iwai7639a062015-03-03 10:07:24 +01004611 switch (codec->core.vendor_id) {
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004612 case 0x10ec0255:
Kailang Yange69e7e02016-05-30 15:58:28 +08004613 alc_process_coef_fw(codec, coef0255);
4614 break;
Kailang Yang736f20a2017-10-20 15:06:34 +08004615 case 0x10ec0236:
Kailang Yang7081adf2015-03-30 17:05:37 +08004616 case 0x10ec0256:
Kailang Yange69e7e02016-05-30 15:58:28 +08004617 alc_process_coef_fw(codec, coef0256);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004618 break;
Kailang Yang71683c32017-06-20 16:33:50 +08004619 case 0x10ec0234:
4620 case 0x10ec0274:
4621 case 0x10ec0294:
4622 alc_process_coef_fw(codec, coef0274);
4623 break;
Kailang Yang13fd08a2014-05-21 16:49:48 +08004624 case 0x10ec0233:
David Henningsson73bdd592013-04-15 15:44:14 +02004625 case 0x10ec0283:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004626 alc_process_coef_fw(codec, coef0233);
David Henningsson73bdd592013-04-15 15:44:14 +02004627 break;
Kailang Yangf3b70332015-04-08 15:01:17 +08004628 case 0x10ec0286:
4629 case 0x10ec0288:
Kailang Yang89542932017-07-17 15:03:43 +08004630 alc_process_coef_fw(codec, coef0288);
4631 break;
Kailang Yang1a5bc8d2015-05-12 17:11:10 +08004632 case 0x10ec0298:
Kailang Yang89542932017-07-17 15:03:43 +08004633 alc_process_coef_fw(codec, coef0298);
Kailang Yangf3b70332015-04-08 15:01:17 +08004634 alc_process_coef_fw(codec, coef0288);
4635 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004636 case 0x10ec0292:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004637 alc_process_coef_fw(codec, coef0292);
David Henningsson73bdd592013-04-15 15:44:14 +02004638 break;
Kailang Yanga22aa262014-04-23 17:34:28 +08004639 case 0x10ec0293:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004640 alc_process_coef_fw(codec, coef0293);
Kailang Yanga22aa262014-04-23 17:34:28 +08004641 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004642 case 0x10ec0668:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004643 alc_process_coef_fw(codec, coef0668);
David Henningsson73bdd592013-04-15 15:44:14 +02004644 break;
Kailang Yangc2b691e2018-01-17 15:22:55 +08004645 case 0x10ec0215:
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004646 case 0x10ec0225:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004647 case 0x10ec0285:
Kailang Yang7d727862016-05-24 16:46:07 +08004648 case 0x10ec0295:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004649 case 0x10ec0289:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08004650 case 0x10ec0299:
Kailang Yang4d4b0c52019-01-09 16:23:37 +08004651 alc_process_coef_fw(codec, alc225_pre_hsmode);
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004652 alc_process_coef_fw(codec, coef0225);
4653 break;
Kailang Yang78f4f7c2016-06-07 11:31:34 +08004654 case 0x10ec0867:
4655 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
4656 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004657 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01004658 codec_dbg(codec, "Headset jack set to unplugged mode.\n");
David Henningsson73bdd592013-04-15 15:44:14 +02004659}
4660
4661
4662static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
4663 hda_nid_t mic_pin)
4664{
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004665 static const struct coef_fw coef0255[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004666 WRITE_COEFEX(0x57, 0x03, 0x8aa6),
4667 WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
4668 {}
4669 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004670 static const struct coef_fw coef0256[] = {
Kailang Yang717f43d2019-05-31 17:16:53 +08004671 UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14), /* Direct Drive HP Amp control(Set to verb control)*/
4672 WRITE_COEFEX(0x57, 0x03, 0x09a3),
4673 WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
4674 {}
4675 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004676 static const struct coef_fw coef0233[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004677 UPDATE_COEF(0x35, 0, 1<<14),
4678 WRITE_COEF(0x06, 0x2100),
4679 WRITE_COEF(0x1a, 0x0021),
4680 WRITE_COEF(0x26, 0x008c),
4681 {}
4682 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004683 static const struct coef_fw coef0288[] = {
Kailang Yang89542932017-07-17 15:03:43 +08004684 UPDATE_COEF(0x4f, 0x00c0, 0),
Kailang Yangf3b70332015-04-08 15:01:17 +08004685 UPDATE_COEF(0x50, 0x2000, 0),
4686 UPDATE_COEF(0x56, 0x0006, 0),
4687 UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
4688 UPDATE_COEF(0x66, 0x0008, 0x0008),
4689 UPDATE_COEF(0x67, 0x2000, 0x2000),
4690 {}
4691 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004692 static const struct coef_fw coef0292[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004693 WRITE_COEF(0x19, 0xa208),
4694 WRITE_COEF(0x2e, 0xacf0),
4695 {}
4696 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004697 static const struct coef_fw coef0293[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004698 UPDATE_COEFEX(0x57, 0x05, 0, 1<<15|1<<13), /* SET charge pump by verb */
4699 UPDATE_COEFEX(0x57, 0x03, 1<<10, 0), /* SET EN_OSW to 0 */
4700 UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
4701 {}
4702 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004703 static const struct coef_fw coef0688[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004704 WRITE_COEF(0xb7, 0x802b),
4705 WRITE_COEF(0xb5, 0x1040),
4706 UPDATE_COEF(0xc3, 0, 1<<12),
4707 {}
4708 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004709 static const struct coef_fw coef0225[] = {
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004710 UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14),
4711 UPDATE_COEF(0x4a, 3<<4, 2<<4),
4712 UPDATE_COEF(0x63, 3<<14, 0),
4713 {}
4714 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004715 static const struct coef_fw coef0274[] = {
Kailang Yang71683c32017-06-20 16:33:50 +08004716 UPDATE_COEFEX(0x57, 0x05, 0x4000, 0x4000),
4717 UPDATE_COEF(0x4a, 0x0010, 0),
4718 UPDATE_COEF(0x6b, 0xf000, 0),
4719 {}
4720 };
Takashi Iwai54db6c32014-08-18 15:11:19 +02004721
Takashi Iwai7639a062015-03-03 10:07:24 +01004722 switch (codec->core.vendor_id) {
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004723 case 0x10ec0255:
4724 alc_write_coef_idx(codec, 0x45, 0xc489);
4725 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
Takashi Iwai54db6c32014-08-18 15:11:19 +02004726 alc_process_coef_fw(codec, coef0255);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004727 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4728 break;
Kailang Yang717f43d2019-05-31 17:16:53 +08004729 case 0x10ec0236:
4730 case 0x10ec0256:
4731 alc_write_coef_idx(codec, 0x45, 0xc489);
4732 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4733 alc_process_coef_fw(codec, coef0256);
4734 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4735 break;
Kailang Yang71683c32017-06-20 16:33:50 +08004736 case 0x10ec0234:
4737 case 0x10ec0274:
4738 case 0x10ec0294:
4739 alc_write_coef_idx(codec, 0x45, 0x4689);
4740 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4741 alc_process_coef_fw(codec, coef0274);
4742 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4743 break;
Kailang Yang13fd08a2014-05-21 16:49:48 +08004744 case 0x10ec0233:
David Henningsson73bdd592013-04-15 15:44:14 +02004745 case 0x10ec0283:
4746 alc_write_coef_idx(codec, 0x45, 0xc429);
4747 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
Takashi Iwai54db6c32014-08-18 15:11:19 +02004748 alc_process_coef_fw(codec, coef0233);
David Henningsson73bdd592013-04-15 15:44:14 +02004749 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4750 break;
Kailang Yangf3b70332015-04-08 15:01:17 +08004751 case 0x10ec0286:
4752 case 0x10ec0288:
Kailang Yang1a5bc8d2015-05-12 17:11:10 +08004753 case 0x10ec0298:
Kailang Yangf3b70332015-04-08 15:01:17 +08004754 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4755 alc_process_coef_fw(codec, coef0288);
4756 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4757 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004758 case 0x10ec0292:
4759 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
Takashi Iwai54db6c32014-08-18 15:11:19 +02004760 alc_process_coef_fw(codec, coef0292);
David Henningsson73bdd592013-04-15 15:44:14 +02004761 break;
Kailang Yanga22aa262014-04-23 17:34:28 +08004762 case 0x10ec0293:
4763 /* Set to TRS mode */
4764 alc_write_coef_idx(codec, 0x45, 0xc429);
4765 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
Takashi Iwai54db6c32014-08-18 15:11:19 +02004766 alc_process_coef_fw(codec, coef0293);
Kailang Yanga22aa262014-04-23 17:34:28 +08004767 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4768 break;
Kailang Yang78f4f7c2016-06-07 11:31:34 +08004769 case 0x10ec0867:
4770 alc_update_coefex_idx(codec, 0x57, 0x5, 0, 1<<14);
Gustavo A. R. Silvac0dbbda2020-07-08 15:32:36 -05004771 fallthrough;
Kailang Yang9eb5d0e2017-01-17 15:40:25 +08004772 case 0x10ec0221:
David Henningsson1f8b46c2015-05-12 14:38:15 +02004773 case 0x10ec0662:
4774 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4775 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4776 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004777 case 0x10ec0668:
4778 alc_write_coef_idx(codec, 0x11, 0x0001);
4779 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
Takashi Iwai54db6c32014-08-18 15:11:19 +02004780 alc_process_coef_fw(codec, coef0688);
David Henningsson73bdd592013-04-15 15:44:14 +02004781 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4782 break;
Kailang Yangc2b691e2018-01-17 15:22:55 +08004783 case 0x10ec0215:
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004784 case 0x10ec0225:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004785 case 0x10ec0285:
Kailang Yang7d727862016-05-24 16:46:07 +08004786 case 0x10ec0295:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004787 case 0x10ec0289:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08004788 case 0x10ec0299:
Kailang Yang5a367672017-07-21 15:23:53 +08004789 alc_process_coef_fw(codec, alc225_pre_hsmode);
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004790 alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x31<<10);
4791 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4792 alc_process_coef_fw(codec, coef0225);
4793 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4794 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004795 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01004796 codec_dbg(codec, "Headset jack set to mic-in mode.\n");
David Henningsson73bdd592013-04-15 15:44:14 +02004797}
4798
4799static void alc_headset_mode_default(struct hda_codec *codec)
4800{
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004801 static const struct coef_fw coef0225[] = {
Kailang Yang5a367672017-07-21 15:23:53 +08004802 UPDATE_COEF(0x45, 0x3f<<10, 0x30<<10),
4803 UPDATE_COEF(0x45, 0x3f<<10, 0x31<<10),
4804 UPDATE_COEF(0x49, 3<<8, 0<<8),
4805 UPDATE_COEF(0x4a, 3<<4, 3<<4),
4806 UPDATE_COEF(0x63, 3<<14, 0),
4807 UPDATE_COEF(0x67, 0xf000, 0x3000),
David Henningsson2ae95572016-02-25 09:37:05 +01004808 {}
4809 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004810 static const struct coef_fw coef0255[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004811 WRITE_COEF(0x45, 0xc089),
4812 WRITE_COEF(0x45, 0xc489),
4813 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
4814 WRITE_COEF(0x49, 0x0049),
4815 {}
4816 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004817 static const struct coef_fw coef0256[] = {
Kailang Yang717f43d2019-05-31 17:16:53 +08004818 WRITE_COEF(0x45, 0xc489),
4819 WRITE_COEFEX(0x57, 0x03, 0x0da3),
4820 WRITE_COEF(0x49, 0x0049),
4821 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
4822 WRITE_COEF(0x06, 0x6100),
4823 {}
4824 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004825 static const struct coef_fw coef0233[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004826 WRITE_COEF(0x06, 0x2100),
4827 WRITE_COEF(0x32, 0x4ea3),
4828 {}
4829 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004830 static const struct coef_fw coef0288[] = {
Kailang Yangf3b70332015-04-08 15:01:17 +08004831 UPDATE_COEF(0x4f, 0xfcc0, 0xc400), /* Set to TRS type */
4832 UPDATE_COEF(0x50, 0x2000, 0x2000),
4833 UPDATE_COEF(0x56, 0x0006, 0x0006),
4834 UPDATE_COEF(0x66, 0x0008, 0),
4835 UPDATE_COEF(0x67, 0x2000, 0),
4836 {}
4837 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004838 static const struct coef_fw coef0292[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004839 WRITE_COEF(0x76, 0x000e),
4840 WRITE_COEF(0x6c, 0x2400),
4841 WRITE_COEF(0x6b, 0xc429),
4842 WRITE_COEF(0x18, 0x7308),
4843 {}
4844 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004845 static const struct coef_fw coef0293[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004846 UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
4847 WRITE_COEF(0x45, 0xC429), /* Set to TRS type */
4848 UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
4849 {}
4850 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004851 static const struct coef_fw coef0688[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004852 WRITE_COEF(0x11, 0x0041),
4853 WRITE_COEF(0x15, 0x0d40),
4854 WRITE_COEF(0xb7, 0x802b),
4855 {}
4856 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004857 static const struct coef_fw coef0274[] = {
Kailang Yang71683c32017-06-20 16:33:50 +08004858 WRITE_COEF(0x45, 0x4289),
4859 UPDATE_COEF(0x4a, 0x0010, 0x0010),
4860 UPDATE_COEF(0x6b, 0x0f00, 0),
4861 UPDATE_COEF(0x49, 0x0300, 0x0300),
4862 {}
4863 };
Takashi Iwai54db6c32014-08-18 15:11:19 +02004864
Takashi Iwai7639a062015-03-03 10:07:24 +01004865 switch (codec->core.vendor_id) {
Kailang Yangc2b691e2018-01-17 15:22:55 +08004866 case 0x10ec0215:
David Henningsson2ae95572016-02-25 09:37:05 +01004867 case 0x10ec0225:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004868 case 0x10ec0285:
Kailang Yang7d727862016-05-24 16:46:07 +08004869 case 0x10ec0295:
Kailang Yangc2b691e2018-01-17 15:22:55 +08004870 case 0x10ec0289:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08004871 case 0x10ec0299:
Kailang Yang5a367672017-07-21 15:23:53 +08004872 alc_process_coef_fw(codec, alc225_pre_hsmode);
David Henningsson2ae95572016-02-25 09:37:05 +01004873 alc_process_coef_fw(codec, coef0225);
4874 break;
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004875 case 0x10ec0255:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004876 alc_process_coef_fw(codec, coef0255);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004877 break;
Kailang Yang717f43d2019-05-31 17:16:53 +08004878 case 0x10ec0236:
4879 case 0x10ec0256:
4880 alc_write_coef_idx(codec, 0x1b, 0x0e4b);
4881 alc_write_coef_idx(codec, 0x45, 0xc089);
4882 msleep(50);
4883 alc_process_coef_fw(codec, coef0256);
4884 break;
Kailang Yang71683c32017-06-20 16:33:50 +08004885 case 0x10ec0234:
4886 case 0x10ec0274:
4887 case 0x10ec0294:
4888 alc_process_coef_fw(codec, coef0274);
4889 break;
Kailang Yang13fd08a2014-05-21 16:49:48 +08004890 case 0x10ec0233:
David Henningsson73bdd592013-04-15 15:44:14 +02004891 case 0x10ec0283:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004892 alc_process_coef_fw(codec, coef0233);
David Henningsson73bdd592013-04-15 15:44:14 +02004893 break;
Kailang Yangf3b70332015-04-08 15:01:17 +08004894 case 0x10ec0286:
4895 case 0x10ec0288:
Kailang Yang1a5bc8d2015-05-12 17:11:10 +08004896 case 0x10ec0298:
Kailang Yangf3b70332015-04-08 15:01:17 +08004897 alc_process_coef_fw(codec, coef0288);
4898 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004899 case 0x10ec0292:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004900 alc_process_coef_fw(codec, coef0292);
David Henningsson73bdd592013-04-15 15:44:14 +02004901 break;
Kailang Yanga22aa262014-04-23 17:34:28 +08004902 case 0x10ec0293:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004903 alc_process_coef_fw(codec, coef0293);
Kailang Yanga22aa262014-04-23 17:34:28 +08004904 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004905 case 0x10ec0668:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004906 alc_process_coef_fw(codec, coef0688);
David Henningsson73bdd592013-04-15 15:44:14 +02004907 break;
Kailang Yang78f4f7c2016-06-07 11:31:34 +08004908 case 0x10ec0867:
4909 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
4910 break;
David Henningsson73bdd592013-04-15 15:44:14 +02004911 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01004912 codec_dbg(codec, "Headset jack set to headphone (default) mode.\n");
David Henningsson73bdd592013-04-15 15:44:14 +02004913}
4914
4915/* Iphone type */
4916static void alc_headset_mode_ctia(struct hda_codec *codec)
4917{
Kailang Yang89542932017-07-17 15:03:43 +08004918 int val;
4919
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004920 static const struct coef_fw coef0255[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004921 WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
4922 WRITE_COEF(0x1b, 0x0c2b),
4923 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
4924 {}
4925 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004926 static const struct coef_fw coef0256[] = {
Kailang Yange69e7e02016-05-30 15:58:28 +08004927 WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
Kailang Yang717f43d2019-05-31 17:16:53 +08004928 WRITE_COEF(0x1b, 0x0e6b),
Kailang Yange69e7e02016-05-30 15:58:28 +08004929 {}
4930 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004931 static const struct coef_fw coef0233[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004932 WRITE_COEF(0x45, 0xd429),
4933 WRITE_COEF(0x1b, 0x0c2b),
4934 WRITE_COEF(0x32, 0x4ea3),
4935 {}
4936 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004937 static const struct coef_fw coef0288[] = {
Kailang Yangf3b70332015-04-08 15:01:17 +08004938 UPDATE_COEF(0x50, 0x2000, 0x2000),
4939 UPDATE_COEF(0x56, 0x0006, 0x0006),
4940 UPDATE_COEF(0x66, 0x0008, 0),
4941 UPDATE_COEF(0x67, 0x2000, 0),
4942 {}
4943 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004944 static const struct coef_fw coef0292[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004945 WRITE_COEF(0x6b, 0xd429),
4946 WRITE_COEF(0x76, 0x0008),
4947 WRITE_COEF(0x18, 0x7388),
4948 {}
4949 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004950 static const struct coef_fw coef0293[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004951 WRITE_COEF(0x45, 0xd429), /* Set to ctia type */
4952 UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
4953 {}
4954 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004955 static const struct coef_fw coef0688[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02004956 WRITE_COEF(0x11, 0x0001),
4957 WRITE_COEF(0x15, 0x0d60),
4958 WRITE_COEF(0xc3, 0x0000),
4959 {}
4960 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004961 static const struct coef_fw coef0225_1[] = {
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004962 UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
Kailang Yang5a367672017-07-21 15:23:53 +08004963 UPDATE_COEF(0x63, 3<<14, 2<<14),
4964 {}
4965 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01004966 static const struct coef_fw coef0225_2[] = {
Kailang Yang5a367672017-07-21 15:23:53 +08004967 UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
4968 UPDATE_COEF(0x63, 3<<14, 1<<14),
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08004969 {}
4970 };
Takashi Iwai54db6c32014-08-18 15:11:19 +02004971
Takashi Iwai7639a062015-03-03 10:07:24 +01004972 switch (codec->core.vendor_id) {
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004973 case 0x10ec0255:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004974 alc_process_coef_fw(codec, coef0255);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08004975 break;
Kailang Yang736f20a2017-10-20 15:06:34 +08004976 case 0x10ec0236:
Kailang Yange69e7e02016-05-30 15:58:28 +08004977 case 0x10ec0256:
4978 alc_process_coef_fw(codec, coef0256);
4979 break;
Kailang Yang71683c32017-06-20 16:33:50 +08004980 case 0x10ec0234:
4981 case 0x10ec0274:
4982 case 0x10ec0294:
4983 alc_write_coef_idx(codec, 0x45, 0xd689);
4984 break;
Kailang Yang13fd08a2014-05-21 16:49:48 +08004985 case 0x10ec0233:
David Henningsson73bdd592013-04-15 15:44:14 +02004986 case 0x10ec0283:
Takashi Iwai54db6c32014-08-18 15:11:19 +02004987 alc_process_coef_fw(codec, coef0233);
David Henningsson73bdd592013-04-15 15:44:14 +02004988 break;
Kailang Yang1a5bc8d2015-05-12 17:11:10 +08004989 case 0x10ec0298:
Kailang Yang89542932017-07-17 15:03:43 +08004990 val = alc_read_coef_idx(codec, 0x50);
4991 if (val & (1 << 12)) {
4992 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
4993 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
4994 msleep(300);
4995 } else {
4996 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
4997 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
4998 msleep(300);
4999 }
5000 break;
Kailang Yangf3b70332015-04-08 15:01:17 +08005001 case 0x10ec0286:
5002 case 0x10ec0288:
5003 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5004 msleep(300);
5005 alc_process_coef_fw(codec, coef0288);
5006 break;
David Henningsson73bdd592013-04-15 15:44:14 +02005007 case 0x10ec0292:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005008 alc_process_coef_fw(codec, coef0292);
David Henningsson73bdd592013-04-15 15:44:14 +02005009 break;
Kailang Yanga22aa262014-04-23 17:34:28 +08005010 case 0x10ec0293:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005011 alc_process_coef_fw(codec, coef0293);
Kailang Yanga22aa262014-04-23 17:34:28 +08005012 break;
David Henningsson73bdd592013-04-15 15:44:14 +02005013 case 0x10ec0668:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005014 alc_process_coef_fw(codec, coef0688);
David Henningsson73bdd592013-04-15 15:44:14 +02005015 break;
Kailang Yangc2b691e2018-01-17 15:22:55 +08005016 case 0x10ec0215:
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08005017 case 0x10ec0225:
Kailang Yangc2b691e2018-01-17 15:22:55 +08005018 case 0x10ec0285:
Kailang Yang7d727862016-05-24 16:46:07 +08005019 case 0x10ec0295:
Kailang Yangc2b691e2018-01-17 15:22:55 +08005020 case 0x10ec0289:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08005021 case 0x10ec0299:
Kailang Yang5a367672017-07-21 15:23:53 +08005022 val = alc_read_coef_idx(codec, 0x45);
5023 if (val & (1 << 9))
5024 alc_process_coef_fw(codec, coef0225_2);
5025 else
5026 alc_process_coef_fw(codec, coef0225_1);
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08005027 break;
Kailang Yang78f4f7c2016-06-07 11:31:34 +08005028 case 0x10ec0867:
5029 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5030 break;
David Henningsson73bdd592013-04-15 15:44:14 +02005031 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01005032 codec_dbg(codec, "Headset jack set to iPhone-style headset mode.\n");
David Henningsson73bdd592013-04-15 15:44:14 +02005033}
5034
5035/* Nokia type */
5036static void alc_headset_mode_omtp(struct hda_codec *codec)
5037{
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005038 static const struct coef_fw coef0255[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005039 WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
5040 WRITE_COEF(0x1b, 0x0c2b),
5041 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5042 {}
5043 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005044 static const struct coef_fw coef0256[] = {
Kailang Yange69e7e02016-05-30 15:58:28 +08005045 WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
Kailang Yang717f43d2019-05-31 17:16:53 +08005046 WRITE_COEF(0x1b, 0x0e6b),
Kailang Yange69e7e02016-05-30 15:58:28 +08005047 {}
5048 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005049 static const struct coef_fw coef0233[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005050 WRITE_COEF(0x45, 0xe429),
5051 WRITE_COEF(0x1b, 0x0c2b),
5052 WRITE_COEF(0x32, 0x4ea3),
5053 {}
5054 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005055 static const struct coef_fw coef0288[] = {
Kailang Yangf3b70332015-04-08 15:01:17 +08005056 UPDATE_COEF(0x50, 0x2000, 0x2000),
5057 UPDATE_COEF(0x56, 0x0006, 0x0006),
5058 UPDATE_COEF(0x66, 0x0008, 0),
5059 UPDATE_COEF(0x67, 0x2000, 0),
5060 {}
5061 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005062 static const struct coef_fw coef0292[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005063 WRITE_COEF(0x6b, 0xe429),
5064 WRITE_COEF(0x76, 0x0008),
5065 WRITE_COEF(0x18, 0x7388),
5066 {}
5067 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005068 static const struct coef_fw coef0293[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005069 WRITE_COEF(0x45, 0xe429), /* Set to omtp type */
5070 UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
5071 {}
5072 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005073 static const struct coef_fw coef0688[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005074 WRITE_COEF(0x11, 0x0001),
5075 WRITE_COEF(0x15, 0x0d50),
5076 WRITE_COEF(0xc3, 0x0000),
5077 {}
5078 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005079 static const struct coef_fw coef0225[] = {
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08005080 UPDATE_COEF(0x45, 0x3f<<10, 0x39<<10),
Kailang Yang5a367672017-07-21 15:23:53 +08005081 UPDATE_COEF(0x63, 3<<14, 2<<14),
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08005082 {}
5083 };
Takashi Iwai54db6c32014-08-18 15:11:19 +02005084
Takashi Iwai7639a062015-03-03 10:07:24 +01005085 switch (codec->core.vendor_id) {
Kailang Yang9a22a8f52013-11-08 15:54:49 +08005086 case 0x10ec0255:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005087 alc_process_coef_fw(codec, coef0255);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08005088 break;
Kailang Yang736f20a2017-10-20 15:06:34 +08005089 case 0x10ec0236:
Kailang Yange69e7e02016-05-30 15:58:28 +08005090 case 0x10ec0256:
5091 alc_process_coef_fw(codec, coef0256);
5092 break;
Kailang Yang71683c32017-06-20 16:33:50 +08005093 case 0x10ec0234:
5094 case 0x10ec0274:
5095 case 0x10ec0294:
5096 alc_write_coef_idx(codec, 0x45, 0xe689);
5097 break;
Kailang Yang13fd08a2014-05-21 16:49:48 +08005098 case 0x10ec0233:
David Henningsson73bdd592013-04-15 15:44:14 +02005099 case 0x10ec0283:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005100 alc_process_coef_fw(codec, coef0233);
David Henningsson73bdd592013-04-15 15:44:14 +02005101 break;
Kailang Yang1a5bc8d2015-05-12 17:11:10 +08005102 case 0x10ec0298:
5103 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);/* Headset output enable */
Kailang Yang89542932017-07-17 15:03:43 +08005104 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5105 msleep(300);
5106 break;
Kailang Yangf3b70332015-04-08 15:01:17 +08005107 case 0x10ec0286:
5108 case 0x10ec0288:
5109 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5110 msleep(300);
5111 alc_process_coef_fw(codec, coef0288);
5112 break;
David Henningsson73bdd592013-04-15 15:44:14 +02005113 case 0x10ec0292:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005114 alc_process_coef_fw(codec, coef0292);
David Henningsson73bdd592013-04-15 15:44:14 +02005115 break;
Kailang Yanga22aa262014-04-23 17:34:28 +08005116 case 0x10ec0293:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005117 alc_process_coef_fw(codec, coef0293);
Kailang Yanga22aa262014-04-23 17:34:28 +08005118 break;
David Henningsson73bdd592013-04-15 15:44:14 +02005119 case 0x10ec0668:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005120 alc_process_coef_fw(codec, coef0688);
David Henningsson73bdd592013-04-15 15:44:14 +02005121 break;
Kailang Yangc2b691e2018-01-17 15:22:55 +08005122 case 0x10ec0215:
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08005123 case 0x10ec0225:
Kailang Yangc2b691e2018-01-17 15:22:55 +08005124 case 0x10ec0285:
Kailang Yang7d727862016-05-24 16:46:07 +08005125 case 0x10ec0295:
Kailang Yangc2b691e2018-01-17 15:22:55 +08005126 case 0x10ec0289:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08005127 case 0x10ec0299:
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08005128 alc_process_coef_fw(codec, coef0225);
5129 break;
David Henningsson73bdd592013-04-15 15:44:14 +02005130 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01005131 codec_dbg(codec, "Headset jack set to Nokia-style headset mode.\n");
David Henningsson73bdd592013-04-15 15:44:14 +02005132}
5133
5134static void alc_determine_headset_type(struct hda_codec *codec)
5135{
5136 int val;
5137 bool is_ctia = false;
5138 struct alc_spec *spec = codec->spec;
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005139 static const struct coef_fw coef0255[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005140 WRITE_COEF(0x45, 0xd089), /* combo jack auto switch control(Check type)*/
5141 WRITE_COEF(0x49, 0x0149), /* combo jack auto switch control(Vref
5142 conteol) */
5143 {}
5144 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005145 static const struct coef_fw coef0288[] = {
Kailang Yangf3b70332015-04-08 15:01:17 +08005146 UPDATE_COEF(0x4f, 0xfcc0, 0xd400), /* Check Type */
5147 {}
5148 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005149 static const struct coef_fw coef0298[] = {
Kailang Yang89542932017-07-17 15:03:43 +08005150 UPDATE_COEF(0x50, 0x2000, 0x2000),
5151 UPDATE_COEF(0x56, 0x0006, 0x0006),
5152 UPDATE_COEF(0x66, 0x0008, 0),
5153 UPDATE_COEF(0x67, 0x2000, 0),
5154 UPDATE_COEF(0x19, 0x1300, 0x1300),
5155 {}
5156 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005157 static const struct coef_fw coef0293[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005158 UPDATE_COEF(0x4a, 0x000f, 0x0008), /* Combo Jack auto detect */
5159 WRITE_COEF(0x45, 0xD429), /* Set to ctia type */
5160 {}
5161 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005162 static const struct coef_fw coef0688[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005163 WRITE_COEF(0x11, 0x0001),
5164 WRITE_COEF(0xb7, 0x802b),
5165 WRITE_COEF(0x15, 0x0d60),
5166 WRITE_COEF(0xc3, 0x0c00),
5167 {}
5168 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005169 static const struct coef_fw coef0274[] = {
Kailang Yang71683c32017-06-20 16:33:50 +08005170 UPDATE_COEF(0x4a, 0x0010, 0),
5171 UPDATE_COEF(0x4a, 0x8000, 0),
5172 WRITE_COEF(0x45, 0xd289),
5173 UPDATE_COEF(0x49, 0x0300, 0x0300),
5174 {}
5175 };
David Henningsson73bdd592013-04-15 15:44:14 +02005176
Kailang Yang92666d42020-11-19 17:04:21 +08005177 if (spec->no_internal_mic_pin) {
5178 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
5179 return;
5180 }
5181
Takashi Iwai7639a062015-03-03 10:07:24 +01005182 switch (codec->core.vendor_id) {
Kailang Yang9a22a8f52013-11-08 15:54:49 +08005183 case 0x10ec0255:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005184 alc_process_coef_fw(codec, coef0255);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08005185 msleep(300);
5186 val = alc_read_coef_idx(codec, 0x46);
5187 is_ctia = (val & 0x0070) == 0x0070;
5188 break;
Kailang Yang717f43d2019-05-31 17:16:53 +08005189 case 0x10ec0236:
5190 case 0x10ec0256:
5191 alc_write_coef_idx(codec, 0x1b, 0x0e4b);
5192 alc_write_coef_idx(codec, 0x06, 0x6104);
5193 alc_write_coefex_idx(codec, 0x57, 0x3, 0x09a3);
5194
5195 snd_hda_codec_write(codec, 0x21, 0,
5196 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5197 msleep(80);
5198 snd_hda_codec_write(codec, 0x21, 0,
5199 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5200
5201 alc_process_coef_fw(codec, coef0255);
5202 msleep(300);
5203 val = alc_read_coef_idx(codec, 0x46);
5204 is_ctia = (val & 0x0070) == 0x0070;
5205
5206 alc_write_coefex_idx(codec, 0x57, 0x3, 0x0da3);
5207 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5208
5209 snd_hda_codec_write(codec, 0x21, 0,
5210 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5211 msleep(80);
5212 snd_hda_codec_write(codec, 0x21, 0,
5213 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5214 break;
Kailang Yang71683c32017-06-20 16:33:50 +08005215 case 0x10ec0234:
5216 case 0x10ec0274:
5217 case 0x10ec0294:
5218 alc_process_coef_fw(codec, coef0274);
5219 msleep(80);
5220 val = alc_read_coef_idx(codec, 0x46);
5221 is_ctia = (val & 0x00f0) == 0x00f0;
5222 break;
Kailang Yang13fd08a2014-05-21 16:49:48 +08005223 case 0x10ec0233:
David Henningsson73bdd592013-04-15 15:44:14 +02005224 case 0x10ec0283:
5225 alc_write_coef_idx(codec, 0x45, 0xd029);
5226 msleep(300);
5227 val = alc_read_coef_idx(codec, 0x46);
5228 is_ctia = (val & 0x0070) == 0x0070;
5229 break;
Kailang Yang1a5bc8d2015-05-12 17:11:10 +08005230 case 0x10ec0298:
Kailang Yang89542932017-07-17 15:03:43 +08005231 snd_hda_codec_write(codec, 0x21, 0,
5232 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5233 msleep(100);
5234 snd_hda_codec_write(codec, 0x21, 0,
5235 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5236 msleep(200);
5237
5238 val = alc_read_coef_idx(codec, 0x50);
5239 if (val & (1 << 12)) {
5240 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
5241 alc_process_coef_fw(codec, coef0288);
5242 msleep(350);
5243 val = alc_read_coef_idx(codec, 0x50);
5244 is_ctia = (val & 0x0070) == 0x0070;
5245 } else {
5246 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
5247 alc_process_coef_fw(codec, coef0288);
5248 msleep(350);
5249 val = alc_read_coef_idx(codec, 0x50);
5250 is_ctia = (val & 0x0070) == 0x0070;
5251 }
5252 alc_process_coef_fw(codec, coef0298);
5253 snd_hda_codec_write(codec, 0x21, 0,
5254 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP);
5255 msleep(75);
5256 snd_hda_codec_write(codec, 0x21, 0,
5257 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5258 break;
Kailang Yangf3b70332015-04-08 15:01:17 +08005259 case 0x10ec0286:
5260 case 0x10ec0288:
5261 alc_process_coef_fw(codec, coef0288);
5262 msleep(350);
5263 val = alc_read_coef_idx(codec, 0x50);
5264 is_ctia = (val & 0x0070) == 0x0070;
5265 break;
David Henningsson73bdd592013-04-15 15:44:14 +02005266 case 0x10ec0292:
5267 alc_write_coef_idx(codec, 0x6b, 0xd429);
5268 msleep(300);
5269 val = alc_read_coef_idx(codec, 0x6c);
5270 is_ctia = (val & 0x001c) == 0x001c;
5271 break;
Kailang Yanga22aa262014-04-23 17:34:28 +08005272 case 0x10ec0293:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005273 alc_process_coef_fw(codec, coef0293);
Kailang Yanga22aa262014-04-23 17:34:28 +08005274 msleep(300);
5275 val = alc_read_coef_idx(codec, 0x46);
5276 is_ctia = (val & 0x0070) == 0x0070;
5277 break;
David Henningsson73bdd592013-04-15 15:44:14 +02005278 case 0x10ec0668:
Takashi Iwai54db6c32014-08-18 15:11:19 +02005279 alc_process_coef_fw(codec, coef0688);
David Henningsson73bdd592013-04-15 15:44:14 +02005280 msleep(300);
5281 val = alc_read_coef_idx(codec, 0xbe);
5282 is_ctia = (val & 0x1c02) == 0x1c02;
5283 break;
Kailang Yangc2b691e2018-01-17 15:22:55 +08005284 case 0x10ec0215:
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08005285 case 0x10ec0225:
Kailang Yangc2b691e2018-01-17 15:22:55 +08005286 case 0x10ec0285:
Kailang Yang7d727862016-05-24 16:46:07 +08005287 case 0x10ec0295:
Kailang Yangc2b691e2018-01-17 15:22:55 +08005288 case 0x10ec0289:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08005289 case 0x10ec0299:
Kailang Yangda911b12018-01-05 16:50:08 +08005290 snd_hda_codec_write(codec, 0x21, 0,
5291 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5292 msleep(80);
5293 snd_hda_codec_write(codec, 0x21, 0,
5294 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5295
Kailang Yang5a367672017-07-21 15:23:53 +08005296 alc_process_coef_fw(codec, alc225_pre_hsmode);
5297 alc_update_coef_idx(codec, 0x67, 0xf000, 0x1000);
5298 val = alc_read_coef_idx(codec, 0x45);
5299 if (val & (1 << 9)) {
5300 alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5301 alc_update_coef_idx(codec, 0x49, 3<<8, 2<<8);
5302 msleep(800);
5303 val = alc_read_coef_idx(codec, 0x46);
5304 is_ctia = (val & 0x00f0) == 0x00f0;
5305 } else {
5306 alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5307 alc_update_coef_idx(codec, 0x49, 3<<8, 1<<8);
5308 msleep(800);
5309 val = alc_read_coef_idx(codec, 0x46);
5310 is_ctia = (val & 0x00f0) == 0x00f0;
5311 }
5312 alc_update_coef_idx(codec, 0x4a, 7<<6, 7<<6);
5313 alc_update_coef_idx(codec, 0x4a, 3<<4, 3<<4);
5314 alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
Kailang Yangda911b12018-01-05 16:50:08 +08005315
5316 snd_hda_codec_write(codec, 0x21, 0,
5317 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5318 msleep(80);
5319 snd_hda_codec_write(codec, 0x21, 0,
5320 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
Kailang Yang4cc9b9d2016-02-03 15:09:35 +08005321 break;
Kailang Yang78f4f7c2016-06-07 11:31:34 +08005322 case 0x10ec0867:
5323 is_ctia = true;
5324 break;
David Henningsson73bdd592013-04-15 15:44:14 +02005325 }
5326
Takashi Iwai4e76a882014-02-25 12:21:03 +01005327 codec_dbg(codec, "Headset jack detected iPhone-style headset: %s\n",
David Henningsson73bdd592013-04-15 15:44:14 +02005328 is_ctia ? "yes" : "no");
5329 spec->current_headset_type = is_ctia ? ALC_HEADSET_TYPE_CTIA : ALC_HEADSET_TYPE_OMTP;
5330}
5331
5332static void alc_update_headset_mode(struct hda_codec *codec)
5333{
5334 struct alc_spec *spec = codec->spec;
5335
5336 hda_nid_t mux_pin = spec->gen.imux_pins[spec->gen.cur_mux[0]];
Takashi Iwai35a39f92019-02-01 11:19:50 +01005337 hda_nid_t hp_pin = alc_get_hp_pin(spec);
David Henningsson73bdd592013-04-15 15:44:14 +02005338
5339 int new_headset_mode;
5340
5341 if (!snd_hda_jack_detect(codec, hp_pin))
5342 new_headset_mode = ALC_HEADSET_MODE_UNPLUGGED;
5343 else if (mux_pin == spec->headset_mic_pin)
5344 new_headset_mode = ALC_HEADSET_MODE_HEADSET;
5345 else if (mux_pin == spec->headphone_mic_pin)
5346 new_headset_mode = ALC_HEADSET_MODE_MIC;
5347 else
5348 new_headset_mode = ALC_HEADSET_MODE_HEADPHONE;
5349
David Henningsson5959a6b2013-11-12 11:10:57 +01005350 if (new_headset_mode == spec->current_headset_mode) {
5351 snd_hda_gen_update_outputs(codec);
David Henningsson73bdd592013-04-15 15:44:14 +02005352 return;
David Henningsson5959a6b2013-11-12 11:10:57 +01005353 }
David Henningsson73bdd592013-04-15 15:44:14 +02005354
5355 switch (new_headset_mode) {
5356 case ALC_HEADSET_MODE_UNPLUGGED:
5357 alc_headset_mode_unplugged(codec);
Kailang Yangaeac1a02019-05-16 16:10:44 +08005358 spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5359 spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
David Henningsson73bdd592013-04-15 15:44:14 +02005360 spec->gen.hp_jack_present = false;
5361 break;
5362 case ALC_HEADSET_MODE_HEADSET:
5363 if (spec->current_headset_type == ALC_HEADSET_TYPE_UNKNOWN)
5364 alc_determine_headset_type(codec);
5365 if (spec->current_headset_type == ALC_HEADSET_TYPE_CTIA)
5366 alc_headset_mode_ctia(codec);
5367 else if (spec->current_headset_type == ALC_HEADSET_TYPE_OMTP)
5368 alc_headset_mode_omtp(codec);
5369 spec->gen.hp_jack_present = true;
5370 break;
5371 case ALC_HEADSET_MODE_MIC:
5372 alc_headset_mode_mic_in(codec, hp_pin, spec->headphone_mic_pin);
5373 spec->gen.hp_jack_present = false;
5374 break;
5375 case ALC_HEADSET_MODE_HEADPHONE:
5376 alc_headset_mode_default(codec);
5377 spec->gen.hp_jack_present = true;
5378 break;
5379 }
5380 if (new_headset_mode != ALC_HEADSET_MODE_MIC) {
5381 snd_hda_set_pin_ctl_cache(codec, hp_pin,
5382 AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
David Henningsson1f8b46c2015-05-12 14:38:15 +02005383 if (spec->headphone_mic_pin && spec->headphone_mic_pin != hp_pin)
David Henningsson73bdd592013-04-15 15:44:14 +02005384 snd_hda_set_pin_ctl_cache(codec, spec->headphone_mic_pin,
5385 PIN_VREFHIZ);
5386 }
5387 spec->current_headset_mode = new_headset_mode;
5388
5389 snd_hda_gen_update_outputs(codec);
5390}
5391
5392static void alc_update_headset_mode_hook(struct hda_codec *codec,
Takashi Iwai7fe30712014-01-30 17:59:02 +01005393 struct snd_kcontrol *kcontrol,
5394 struct snd_ctl_elem_value *ucontrol)
David Henningsson73bdd592013-04-15 15:44:14 +02005395{
5396 alc_update_headset_mode(codec);
5397}
5398
Takashi Iwai1a4f69d2014-09-11 15:22:46 +02005399static void alc_update_headset_jack_cb(struct hda_codec *codec,
5400 struct hda_jack_callback *jack)
David Henningsson73bdd592013-04-15 15:44:14 +02005401{
David Henningsson73bdd592013-04-15 15:44:14 +02005402 snd_hda_gen_hp_automute(codec, jack);
5403}
5404
5405static void alc_probe_headset_mode(struct hda_codec *codec)
5406{
5407 int i;
5408 struct alc_spec *spec = codec->spec;
5409 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5410
5411 /* Find mic pins */
5412 for (i = 0; i < cfg->num_inputs; i++) {
5413 if (cfg->inputs[i].is_headset_mic && !spec->headset_mic_pin)
5414 spec->headset_mic_pin = cfg->inputs[i].pin;
5415 if (cfg->inputs[i].is_headphone_mic && !spec->headphone_mic_pin)
5416 spec->headphone_mic_pin = cfg->inputs[i].pin;
5417 }
5418
Takashi Iwai0bed2aa2018-06-19 12:45:53 +02005419 WARN_ON(spec->gen.cap_sync_hook);
David Henningsson73bdd592013-04-15 15:44:14 +02005420 spec->gen.cap_sync_hook = alc_update_headset_mode_hook;
5421 spec->gen.automute_hook = alc_update_headset_mode;
5422 spec->gen.hp_automute_hook = alc_update_headset_jack_cb;
5423}
5424
5425static void alc_fixup_headset_mode(struct hda_codec *codec,
5426 const struct hda_fixup *fix, int action)
5427{
5428 struct alc_spec *spec = codec->spec;
5429
5430 switch (action) {
5431 case HDA_FIXUP_ACT_PRE_PROBE:
5432 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC | HDA_PINCFG_HEADPHONE_MIC;
5433 break;
5434 case HDA_FIXUP_ACT_PROBE:
5435 alc_probe_headset_mode(codec);
5436 break;
5437 case HDA_FIXUP_ACT_INIT:
Kailang Yangaeac1a02019-05-16 16:10:44 +08005438 if (is_s3_resume(codec) || is_s4_resume(codec)) {
5439 spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5440 spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
5441 }
David Henningsson73bdd592013-04-15 15:44:14 +02005442 alc_update_headset_mode(codec);
5443 break;
5444 }
5445}
5446
5447static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
5448 const struct hda_fixup *fix, int action)
5449{
5450 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5451 struct alc_spec *spec = codec->spec;
5452 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5453 }
5454 else
5455 alc_fixup_headset_mode(codec, fix, action);
5456}
5457
Kailang Yang31278992014-03-03 15:27:22 +08005458static void alc255_set_default_jack_type(struct hda_codec *codec)
5459{
5460 /* Set to iphone type */
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005461 static const struct coef_fw alc255fw[] = {
Takashi Iwai54db6c32014-08-18 15:11:19 +02005462 WRITE_COEF(0x1b, 0x880b),
5463 WRITE_COEF(0x45, 0xd089),
5464 WRITE_COEF(0x1b, 0x080b),
5465 WRITE_COEF(0x46, 0x0004),
5466 WRITE_COEF(0x1b, 0x0c0b),
5467 {}
5468 };
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01005469 static const struct coef_fw alc256fw[] = {
Kailang Yange69e7e02016-05-30 15:58:28 +08005470 WRITE_COEF(0x1b, 0x884b),
5471 WRITE_COEF(0x45, 0xd089),
5472 WRITE_COEF(0x1b, 0x084b),
5473 WRITE_COEF(0x46, 0x0004),
5474 WRITE_COEF(0x1b, 0x0c4b),
5475 {}
5476 };
5477 switch (codec->core.vendor_id) {
5478 case 0x10ec0255:
5479 alc_process_coef_fw(codec, alc255fw);
5480 break;
Kailang Yang736f20a2017-10-20 15:06:34 +08005481 case 0x10ec0236:
Kailang Yange69e7e02016-05-30 15:58:28 +08005482 case 0x10ec0256:
5483 alc_process_coef_fw(codec, alc256fw);
5484 break;
5485 }
Kailang Yang31278992014-03-03 15:27:22 +08005486 msleep(30);
5487}
5488
Kailang Yang9a22a8f52013-11-08 15:54:49 +08005489static void alc_fixup_headset_mode_alc255(struct hda_codec *codec,
5490 const struct hda_fixup *fix, int action)
5491{
5492 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Kailang Yang31278992014-03-03 15:27:22 +08005493 alc255_set_default_jack_type(codec);
Kailang Yang9a22a8f52013-11-08 15:54:49 +08005494 }
5495 alc_fixup_headset_mode(codec, fix, action);
5496}
5497
Kailang Yang31278992014-03-03 15:27:22 +08005498static void alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec,
5499 const struct hda_fixup *fix, int action)
5500{
5501 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5502 struct alc_spec *spec = codec->spec;
5503 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5504 alc255_set_default_jack_type(codec);
5505 }
5506 else
5507 alc_fixup_headset_mode(codec, fix, action);
5508}
5509
Kailang Yange1e62b92015-04-08 16:01:22 +08005510static void alc288_update_headset_jack_cb(struct hda_codec *codec,
5511 struct hda_jack_callback *jack)
5512{
5513 struct alc_spec *spec = codec->spec;
Kailang Yange1e62b92015-04-08 16:01:22 +08005514
5515 alc_update_headset_jack_cb(codec, jack);
5516 /* Headset Mic enable or disable, only for Dell Dino */
Takashi Iwaid44a6862018-06-19 23:04:03 +02005517 alc_update_gpio_data(codec, 0x40, spec->gen.hp_jack_present);
Kailang Yange1e62b92015-04-08 16:01:22 +08005518}
5519
5520static void alc_fixup_headset_mode_dell_alc288(struct hda_codec *codec,
5521 const struct hda_fixup *fix, int action)
5522{
5523 alc_fixup_headset_mode(codec, fix, action);
5524 if (action == HDA_FIXUP_ACT_PROBE) {
5525 struct alc_spec *spec = codec->spec;
Takashi Iwaid44a6862018-06-19 23:04:03 +02005526 /* toggled via hp_automute_hook */
5527 spec->gpio_mask |= 0x40;
5528 spec->gpio_dir |= 0x40;
Kailang Yange1e62b92015-04-08 16:01:22 +08005529 spec->gen.hp_automute_hook = alc288_update_headset_jack_cb;
5530 }
5531}
5532
Hui Wang493a52a2014-01-14 14:07:36 +08005533static void alc_fixup_auto_mute_via_amp(struct hda_codec *codec,
5534 const struct hda_fixup *fix, int action)
5535{
5536 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5537 struct alc_spec *spec = codec->spec;
5538 spec->gen.auto_mute_via_amp = 1;
5539 }
5540}
5541
Takashi Iwai9b745ab2014-03-07 08:37:19 +01005542static void alc_fixup_no_shutup(struct hda_codec *codec,
5543 const struct hda_fixup *fix, int action)
5544{
Takashi Iwaiefe55732018-06-15 11:55:02 +02005545 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai9b745ab2014-03-07 08:37:19 +01005546 struct alc_spec *spec = codec->spec;
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01005547 spec->no_shutup_pins = 1;
Takashi Iwai9b745ab2014-03-07 08:37:19 +01005548 }
5549}
5550
Gabriele Mazzotta5e6db662014-05-20 18:58:26 +02005551static void alc_fixup_disable_aamix(struct hda_codec *codec,
5552 const struct hda_fixup *fix, int action)
5553{
5554 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5555 struct alc_spec *spec = codec->spec;
5556 /* Disable AA-loopback as it causes white noise */
5557 spec->gen.mixer_nid = 0;
5558 }
5559}
5560
Takashi Iwai7f57d802015-09-24 17:36:51 +02005561/* fixup for Thinkpad docks: add dock pins, avoid HP parser fixup */
5562static void alc_fixup_tpt440_dock(struct hda_codec *codec,
5563 const struct hda_fixup *fix, int action)
5564{
5565 static const struct hda_pintbl pincfgs[] = {
5566 { 0x16, 0x21211010 }, /* dock headphone */
5567 { 0x19, 0x21a11010 }, /* dock mic */
5568 { }
5569 };
5570 struct alc_spec *spec = codec->spec;
5571
5572 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Hui Wang871b9062019-08-14 12:09:08 +08005573 spec->reboot_notify = snd_hda_gen_reboot_notify; /* reduce noise */
Takashi Iwai7f57d802015-09-24 17:36:51 +02005574 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
5575 codec->power_save_node = 0; /* avoid click noises */
5576 snd_hda_apply_pincfgs(codec, pincfgs);
5577 }
5578}
5579
Kailang Yang61fcf8e2018-02-02 15:26:46 +08005580static void alc_fixup_tpt470_dock(struct hda_codec *codec,
5581 const struct hda_fixup *fix, int action)
5582{
5583 static const struct hda_pintbl pincfgs[] = {
5584 { 0x17, 0x21211010 }, /* dock headphone */
5585 { 0x19, 0x21a11010 }, /* dock mic */
5586 { }
5587 };
5588 struct alc_spec *spec = codec->spec;
5589
5590 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5591 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
Takashi Iwai71db96d2018-02-26 15:36:38 +01005592 snd_hda_apply_pincfgs(codec, pincfgs);
5593 } else if (action == HDA_FIXUP_ACT_INIT) {
Kailang Yang61fcf8e2018-02-02 15:26:46 +08005594 /* Enable DOCK device */
5595 snd_hda_codec_write(codec, 0x17, 0,
5596 AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
5597 /* Enable DOCK device */
5598 snd_hda_codec_write(codec, 0x19, 0,
5599 AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
Kailang Yang61fcf8e2018-02-02 15:26:46 +08005600 }
5601}
5602
Takashi Iwai399c01a2020-05-26 08:24:06 +02005603static void alc_fixup_tpt470_dacs(struct hda_codec *codec,
5604 const struct hda_fixup *fix, int action)
5605{
5606 /* Assure the speaker pin to be coupled with DAC NID 0x03; otherwise
5607 * the speaker output becomes too low by some reason on Thinkpads with
5608 * ALC298 codec
5609 */
5610 static const hda_nid_t preferred_pairs[] = {
5611 0x14, 0x03, 0x17, 0x02, 0x21, 0x02,
5612 0
5613 };
5614 struct alc_spec *spec = codec->spec;
5615
5616 if (action == HDA_FIXUP_ACT_PRE_PROBE)
5617 spec->gen.preferred_dacs = preferred_pairs;
5618}
5619
Gabriele Mazzotta9476d3692015-04-19 19:00:40 +02005620static void alc_shutup_dell_xps13(struct hda_codec *codec)
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +02005621{
5622 struct alc_spec *spec = codec->spec;
Takashi Iwai35a39f92019-02-01 11:19:50 +01005623 int hp_pin = alc_get_hp_pin(spec);
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +02005624
Gabriele Mazzotta9476d3692015-04-19 19:00:40 +02005625 /* Prevent pop noises when headphones are plugged in */
5626 snd_hda_codec_write(codec, hp_pin, 0,
5627 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5628 msleep(20);
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +02005629}
5630
5631static void alc_fixup_dell_xps13(struct hda_codec *codec,
5632 const struct hda_fixup *fix, int action)
5633{
Takashi Iwai3e1b0c42015-04-27 10:43:22 +02005634 struct alc_spec *spec = codec->spec;
5635 struct hda_input_mux *imux = &spec->gen.input_mux;
5636 int i;
Gabriele Mazzottaf38663a2014-08-08 19:34:40 +02005637
Takashi Iwai3e1b0c42015-04-27 10:43:22 +02005638 switch (action) {
5639 case HDA_FIXUP_ACT_PRE_PROBE:
5640 /* mic pin 0x19 must be initialized with Vref Hi-Z, otherwise
5641 * it causes a click noise at start up
5642 */
5643 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
Takashi Iwaiefe55732018-06-15 11:55:02 +02005644 spec->shutup = alc_shutup_dell_xps13;
Takashi Iwai3e1b0c42015-04-27 10:43:22 +02005645 break;
5646 case HDA_FIXUP_ACT_PROBE:
Gabriele Mazzottaf38663a2014-08-08 19:34:40 +02005647 /* Make the internal mic the default input source. */
5648 for (i = 0; i < imux->num_items; i++) {
5649 if (spec->gen.imux_pins[i] == 0x12) {
5650 spec->gen.cur_mux[0] = i;
5651 break;
5652 }
5653 }
Takashi Iwai3e1b0c42015-04-27 10:43:22 +02005654 break;
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +02005655 }
5656}
5657
David Henningsson1f8b46c2015-05-12 14:38:15 +02005658static void alc_fixup_headset_mode_alc662(struct hda_codec *codec,
5659 const struct hda_fixup *fix, int action)
5660{
5661 struct alc_spec *spec = codec->spec;
5662
5663 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5664 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5665 spec->gen.hp_mic = 1; /* Mic-in is same pin as headphone */
David Henningssonb40eda62015-05-28 09:40:23 +02005666
5667 /* Disable boost for mic-in permanently. (This code is only called
5668 from quirks that guarantee that the headphone is at NID 0x1b.) */
5669 snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000);
5670 snd_hda_override_wcaps(codec, 0x1b, get_wcaps(codec, 0x1b) & ~AC_WCAP_IN_AMP);
David Henningsson1f8b46c2015-05-12 14:38:15 +02005671 } else
5672 alc_fixup_headset_mode(codec, fix, action);
5673}
5674
David Henningsson73bdd592013-04-15 15:44:14 +02005675static void alc_fixup_headset_mode_alc668(struct hda_codec *codec,
5676 const struct hda_fixup *fix, int action)
5677{
5678 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
David Henningsson73bdd592013-04-15 15:44:14 +02005679 alc_write_coef_idx(codec, 0xc4, 0x8000);
Takashi Iwai98b24882014-08-18 13:47:50 +02005680 alc_update_coef_idx(codec, 0xc2, ~0xfe, 0);
David Henningsson73bdd592013-04-15 15:44:14 +02005681 snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
5682 }
5683 alc_fixup_headset_mode(codec, fix, action);
5684}
5685
Chih-Chung Changbde7bc62013-08-05 16:38:42 +08005686/* Returns the nid of the external mic input pin, or 0 if it cannot be found. */
5687static int find_ext_mic_pin(struct hda_codec *codec)
5688{
5689 struct alc_spec *spec = codec->spec;
5690 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5691 hda_nid_t nid;
5692 unsigned int defcfg;
5693 int i;
5694
5695 for (i = 0; i < cfg->num_inputs; i++) {
5696 if (cfg->inputs[i].type != AUTO_PIN_MIC)
5697 continue;
5698 nid = cfg->inputs[i].pin;
5699 defcfg = snd_hda_codec_get_pincfg(codec, nid);
5700 if (snd_hda_get_input_pin_attr(defcfg) == INPUT_PIN_ATTR_INT)
5701 continue;
5702 return nid;
5703 }
5704
5705 return 0;
5706}
5707
Dylan Reid08a978d2012-11-18 22:56:40 -08005708static void alc271_hp_gate_mic_jack(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01005709 const struct hda_fixup *fix,
Dylan Reid08a978d2012-11-18 22:56:40 -08005710 int action)
5711{
5712 struct alc_spec *spec = codec->spec;
5713
Takashi Iwai0db75792013-01-23 13:57:20 +01005714 if (action == HDA_FIXUP_ACT_PROBE) {
Chih-Chung Changbde7bc62013-08-05 16:38:42 +08005715 int mic_pin = find_ext_mic_pin(codec);
Takashi Iwai35a39f92019-02-01 11:19:50 +01005716 int hp_pin = alc_get_hp_pin(spec);
Chih-Chung Changbde7bc62013-08-05 16:38:42 +08005717
5718 if (snd_BUG_ON(!mic_pin || !hp_pin))
Takashi Iwai0db75792013-01-23 13:57:20 +01005719 return;
Chih-Chung Changbde7bc62013-08-05 16:38:42 +08005720 snd_hda_jack_set_gating_jack(codec, mic_pin, hp_pin);
Takashi Iwai0db75792013-01-23 13:57:20 +01005721 }
Dylan Reid08a978d2012-11-18 22:56:40 -08005722}
David Henningsson693b6132012-06-22 19:12:10 +02005723
David Henningsson3e0d6112013-04-22 14:30:14 +02005724static void alc269_fixup_limit_int_mic_boost(struct hda_codec *codec,
5725 const struct hda_fixup *fix,
5726 int action)
5727{
5728 struct alc_spec *spec = codec->spec;
5729 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5730 int i;
5731
5732 /* The mic boosts on level 2 and 3 are too noisy
5733 on the internal mic input.
5734 Therefore limit the boost to 0 or 1. */
5735
5736 if (action != HDA_FIXUP_ACT_PROBE)
5737 return;
5738
5739 for (i = 0; i < cfg->num_inputs; i++) {
5740 hda_nid_t nid = cfg->inputs[i].pin;
5741 unsigned int defcfg;
5742 if (cfg->inputs[i].type != AUTO_PIN_MIC)
5743 continue;
5744 defcfg = snd_hda_codec_get_pincfg(codec, nid);
5745 if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
5746 continue;
5747
5748 snd_hda_override_amp_caps(codec, nid, HDA_INPUT,
5749 (0x00 << AC_AMPCAP_OFFSET_SHIFT) |
5750 (0x01 << AC_AMPCAP_NUM_STEPS_SHIFT) |
5751 (0x2f << AC_AMPCAP_STEP_SIZE_SHIFT) |
5752 (0 << AC_AMPCAP_MUTE_SHIFT));
5753 }
5754}
5755
Kailang Yangcd217a62013-08-22 10:15:24 +02005756static void alc283_hp_automute_hook(struct hda_codec *codec,
Takashi Iwai1a4f69d2014-09-11 15:22:46 +02005757 struct hda_jack_callback *jack)
Kailang Yangcd217a62013-08-22 10:15:24 +02005758{
5759 struct alc_spec *spec = codec->spec;
5760 int vref;
5761
5762 msleep(200);
5763 snd_hda_gen_hp_automute(codec, jack);
5764
5765 vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
5766
5767 msleep(600);
5768 snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5769 vref);
5770}
5771
Kailang Yangcd217a62013-08-22 10:15:24 +02005772static void alc283_fixup_chromebook(struct hda_codec *codec,
5773 const struct hda_fixup *fix, int action)
5774{
5775 struct alc_spec *spec = codec->spec;
Kailang Yangcd217a62013-08-22 10:15:24 +02005776
5777 switch (action) {
5778 case HDA_FIXUP_ACT_PRE_PROBE:
Kailang Yang0202e992013-12-02 15:20:15 +08005779 snd_hda_override_wcaps(codec, 0x03, 0);
Takashi Iwaid2e92702013-10-30 07:50:53 +01005780 /* Disable AA-loopback as it causes white noise */
5781 spec->gen.mixer_nid = 0;
Kailang Yang38070212013-11-01 15:57:35 +08005782 break;
5783 case HDA_FIXUP_ACT_INIT:
Kailang Yangde9481c2014-04-07 16:41:52 +08005784 /* MIC2-VREF control */
5785 /* Set to manual mode */
Takashi Iwai98b24882014-08-18 13:47:50 +02005786 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
Kailang Yang0202e992013-12-02 15:20:15 +08005787 /* Enable Line1 input control by verb */
Takashi Iwai98b24882014-08-18 13:47:50 +02005788 alc_update_coef_idx(codec, 0x1a, 0, 1 << 4);
Kailang Yang0202e992013-12-02 15:20:15 +08005789 break;
5790 }
5791}
5792
5793static void alc283_fixup_sense_combo_jack(struct hda_codec *codec,
5794 const struct hda_fixup *fix, int action)
5795{
5796 struct alc_spec *spec = codec->spec;
Kailang Yang0202e992013-12-02 15:20:15 +08005797
5798 switch (action) {
5799 case HDA_FIXUP_ACT_PRE_PROBE:
Kailang Yangcd217a62013-08-22 10:15:24 +02005800 spec->gen.hp_automute_hook = alc283_hp_automute_hook;
5801 break;
5802 case HDA_FIXUP_ACT_INIT:
5803 /* MIC2-VREF control */
5804 /* Set to manual mode */
Takashi Iwai98b24882014-08-18 13:47:50 +02005805 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
Kailang Yangcd217a62013-08-22 10:15:24 +02005806 break;
5807 }
5808}
5809
Takashi Iwai7bba2152013-09-06 15:45:38 +02005810/* mute tablet speaker pin (0x14) via dock plugging in addition */
5811static void asus_tx300_automute(struct hda_codec *codec)
5812{
5813 struct alc_spec *spec = codec->spec;
5814 snd_hda_gen_update_outputs(codec);
5815 if (snd_hda_jack_detect(codec, 0x1b))
5816 spec->gen.mute_bits |= (1ULL << 0x14);
5817}
5818
5819static void alc282_fixup_asus_tx300(struct hda_codec *codec,
5820 const struct hda_fixup *fix, int action)
5821{
5822 struct alc_spec *spec = codec->spec;
Takashi Iwai7bba2152013-09-06 15:45:38 +02005823 static const struct hda_pintbl dock_pins[] = {
5824 { 0x1b, 0x21114000 }, /* dock speaker pin */
5825 {}
5826 };
Takashi Iwai7bba2152013-09-06 15:45:38 +02005827
5828 switch (action) {
5829 case HDA_FIXUP_ACT_PRE_PROBE:
Takashi Iwai1c76aa52018-06-21 16:37:54 +02005830 spec->init_amp = ALC_INIT_DEFAULT;
Takashi Iwaiae065f12018-06-19 23:00:03 +02005831 /* TX300 needs to set up GPIO2 for the speaker amp */
5832 alc_setup_gpio(codec, 0x04);
Takashi Iwai7bba2152013-09-06 15:45:38 +02005833 snd_hda_apply_pincfgs(codec, dock_pins);
5834 spec->gen.auto_mute_via_amp = 1;
5835 spec->gen.automute_hook = asus_tx300_automute;
5836 snd_hda_jack_detect_enable_callback(codec, 0x1b,
Takashi Iwai7bba2152013-09-06 15:45:38 +02005837 snd_hda_gen_hp_automute);
5838 break;
Takashi Iwai5579cd62018-06-19 22:22:41 +02005839 case HDA_FIXUP_ACT_PROBE:
5840 spec->init_amp = ALC_INIT_DEFAULT;
5841 break;
Takashi Iwai7bba2152013-09-06 15:45:38 +02005842 case HDA_FIXUP_ACT_BUILD:
5843 /* this is a bit tricky; give more sane names for the main
5844 * (tablet) speaker and the dock speaker, respectively
5845 */
Takashi Iwai56798e62017-04-11 08:10:52 +02005846 rename_ctl(codec, "Speaker Playback Switch",
5847 "Dock Speaker Playback Switch");
5848 rename_ctl(codec, "Bass Speaker Playback Switch",
5849 "Speaker Playback Switch");
Takashi Iwai7bba2152013-09-06 15:45:38 +02005850 break;
5851 }
5852}
5853
David Henningsson338cae52013-10-07 10:39:59 +02005854static void alc290_fixup_mono_speakers(struct hda_codec *codec,
5855 const struct hda_fixup *fix, int action)
5856{
David Henningsson0f4881d2013-12-20 16:08:13 +01005857 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5858 /* DAC node 0x03 is giving mono output. We therefore want to
5859 make sure 0x14 (front speaker) and 0x15 (headphones) use the
5860 stereo DAC, while leaving 0x17 (bass speaker) for node 0x03. */
Michał Mirosławcaf3c042020-01-03 10:23:48 +01005861 static const hda_nid_t conn1[] = { 0x0c };
5862 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
5863 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
David Henningsson0f4881d2013-12-20 16:08:13 +01005864 }
David Henningsson338cae52013-10-07 10:39:59 +02005865}
5866
Hui Wangdd9aa332016-08-01 10:20:32 +08005867static void alc298_fixup_speaker_volume(struct hda_codec *codec,
5868 const struct hda_fixup *fix, int action)
5869{
5870 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5871 /* The speaker is routed to the Node 0x06 by a mistake, as a result
5872 we can't adjust the speaker's volume since this node does not has
5873 Amp-out capability. we change the speaker's route to:
5874 Node 0x02 (Audio Output) -> Node 0x0c (Audio Mixer) -> Node 0x17 (
5875 Pin Complex), since Node 0x02 has Amp-out caps, we can adjust
5876 speaker's volume now. */
5877
Michał Mirosławcaf3c042020-01-03 10:23:48 +01005878 static const hda_nid_t conn1[] = { 0x0c };
5879 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn1), conn1);
Hui Wangdd9aa332016-08-01 10:20:32 +08005880 }
5881}
5882
Takashi Iwaie312a862018-03-06 12:14:17 +01005883/* disable DAC3 (0x06) selection on NID 0x17 as it has no volume amp control */
5884static void alc295_fixup_disable_dac3(struct hda_codec *codec,
5885 const struct hda_fixup *fix, int action)
5886{
5887 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Michał Mirosławcaf3c042020-01-03 10:23:48 +01005888 static const hda_nid_t conn[] = { 0x02, 0x03 };
5889 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
Takashi Iwaie312a862018-03-06 12:14:17 +01005890 }
5891}
5892
Jaroslav Kyselad2cd7952019-11-29 15:40:27 +01005893/* force NID 0x17 (Bass Speaker) to DAC1 to share it with the main speaker */
5894static void alc285_fixup_speaker2_to_dac1(struct hda_codec *codec,
5895 const struct hda_fixup *fix, int action)
5896{
5897 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Michał Mirosławcaf3c042020-01-03 10:23:48 +01005898 static const hda_nid_t conn[] = { 0x02 };
5899 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
Jaroslav Kyselad2cd7952019-11-29 15:40:27 +01005900 }
5901}
5902
Keith Packard98973f22015-07-15 12:14:39 -07005903/* Hook to update amp GPIO4 for automute */
5904static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec,
5905 struct hda_jack_callback *jack)
5906{
5907 struct alc_spec *spec = codec->spec;
5908
5909 snd_hda_gen_hp_automute(codec, jack);
5910 /* mute_led_polarity is set to 0, so we pass inverted value here */
Kai-Heng Fengdbd13172020-04-30 16:32:51 +08005911 alc_update_gpio_led(codec, 0x10, spec->mute_led_polarity,
5912 !spec->gen.hp_jack_present);
Keith Packard98973f22015-07-15 12:14:39 -07005913}
5914
5915/* Manage GPIOs for HP EliteBook Folio 9480m.
5916 *
5917 * GPIO4 is the headphone amplifier power control
5918 * GPIO3 is the audio output mute indicator LED
5919 */
5920
5921static void alc280_fixup_hp_9480m(struct hda_codec *codec,
5922 const struct hda_fixup *fix,
5923 int action)
5924{
5925 struct alc_spec *spec = codec->spec;
Keith Packard98973f22015-07-15 12:14:39 -07005926
Takashi Iwai01e4a272018-06-19 22:47:30 +02005927 alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
Keith Packard98973f22015-07-15 12:14:39 -07005928 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai01e4a272018-06-19 22:47:30 +02005929 /* amp at GPIO4; toggled via alc280_hp_gpio4_automute_hook() */
5930 spec->gpio_mask |= 0x10;
5931 spec->gpio_dir |= 0x10;
Keith Packard98973f22015-07-15 12:14:39 -07005932 spec->gen.hp_automute_hook = alc280_hp_gpio4_automute_hook;
Keith Packard98973f22015-07-15 12:14:39 -07005933 }
5934}
5935
Takashi Iwaiae065f12018-06-19 23:00:03 +02005936static void alc275_fixup_gpio4_off(struct hda_codec *codec,
5937 const struct hda_fixup *fix,
5938 int action)
5939{
5940 struct alc_spec *spec = codec->spec;
5941
5942 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5943 spec->gpio_mask |= 0x04;
5944 spec->gpio_dir |= 0x04;
5945 /* set data bit low */
5946 }
5947}
5948
Takashi Iwai6a6660d2020-09-03 10:33:00 +02005949/* Quirk for Thinkpad X1 7th and 8th Gen
5950 * The following fixed routing needed
5951 * DAC1 (NID 0x02) -> Speaker (NID 0x14); some eq applied secretly
5952 * DAC2 (NID 0x03) -> Bass (NID 0x17) & Headphone (NID 0x21); sharing a DAC
5953 * DAC3 (NID 0x06) -> Unused, due to the lack of volume amp
5954 */
5955static void alc285_fixup_thinkpad_x1_gen7(struct hda_codec *codec,
5956 const struct hda_fixup *fix, int action)
5957{
5958 static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */
5959 static const hda_nid_t preferred_pairs[] = {
5960 0x14, 0x02, 0x17, 0x03, 0x21, 0x03, 0
5961 };
5962 struct alc_spec *spec = codec->spec;
5963
5964 switch (action) {
5965 case HDA_FIXUP_ACT_PRE_PROBE:
5966 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
5967 spec->gen.preferred_dacs = preferred_pairs;
5968 break;
5969 case HDA_FIXUP_ACT_BUILD:
5970 /* The generic parser creates somewhat unintuitive volume ctls
5971 * with the fixed routing above, and the shared DAC2 may be
5972 * confusing for PA.
5973 * Rename those to unique names so that PA doesn't touch them
5974 * and use only Master volume.
5975 */
5976 rename_ctl(codec, "Front Playback Volume", "DAC1 Playback Volume");
5977 rename_ctl(codec, "Bass Speaker Playback Volume", "DAC2 Playback Volume");
5978 break;
5979 }
5980}
5981
Kailang Yangca169cc2017-04-25 16:17:40 +08005982static void alc233_alc662_fixup_lenovo_dual_codecs(struct hda_codec *codec,
5983 const struct hda_fixup *fix,
5984 int action)
5985{
5986 alc_fixup_dual_codecs(codec, fix, action);
5987 switch (action) {
5988 case HDA_FIXUP_ACT_PRE_PROBE:
5989 /* override card longname to provide a unique UCM profile */
5990 strcpy(codec->card->longname, "HDAudio-Lenovo-DualCodecs");
5991 break;
5992 case HDA_FIXUP_ACT_BUILD:
5993 /* rename Capture controls depending on the codec */
5994 rename_ctl(codec, "Capture Volume",
5995 codec->addr == 0 ?
5996 "Rear-Panel Capture Volume" :
5997 "Front-Panel Capture Volume");
5998 rename_ctl(codec, "Capture Switch",
5999 codec->addr == 0 ?
6000 "Rear-Panel Capture Switch" :
6001 "Front-Panel Capture Switch");
6002 break;
6003 }
6004}
6005
Kai-Heng Feng52e4e362020-05-03 23:24:47 +08006006static void alc225_fixup_s3_pop_noise(struct hda_codec *codec,
6007 const struct hda_fixup *fix, int action)
6008{
6009 if (action != HDA_FIXUP_ACT_PRE_PROBE)
6010 return;
6011
6012 codec->power_save_node = 1;
6013}
6014
Kailang Yang92266652017-12-14 15:28:58 +08006015/* Forcibly assign NID 0x03 to HP/LO while NID 0x02 to SPK for EQ */
6016static void alc274_fixup_bind_dacs(struct hda_codec *codec,
6017 const struct hda_fixup *fix, int action)
6018{
6019 struct alc_spec *spec = codec->spec;
Michał Mirosławcaf3c042020-01-03 10:23:48 +01006020 static const hda_nid_t preferred_pairs[] = {
Kailang Yang92266652017-12-14 15:28:58 +08006021 0x21, 0x03, 0x1b, 0x03, 0x16, 0x02,
6022 0
6023 };
6024
6025 if (action != HDA_FIXUP_ACT_PRE_PROBE)
6026 return;
6027
6028 spec->gen.preferred_dacs = preferred_pairs;
Kailang Yang0700d3d2019-04-26 16:13:54 +08006029 spec->gen.auto_mute_via_amp = 1;
6030 codec->power_save_node = 0;
Kailang Yang92266652017-12-14 15:28:58 +08006031}
6032
Takashi Iwaic84bfed2020-11-27 15:11:04 +01006033/* avoid DAC 0x06 for bass speaker 0x17; it has no volume control */
6034static void alc289_fixup_asus_ga401(struct hda_codec *codec,
6035 const struct hda_fixup *fix, int action)
6036{
6037 static const hda_nid_t preferred_pairs[] = {
6038 0x14, 0x02, 0x17, 0x02, 0x21, 0x03, 0
6039 };
6040 struct alc_spec *spec = codec->spec;
6041
6042 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6043 spec->gen.preferred_dacs = preferred_pairs;
6044 spec->gen.obey_preferred_dacs = 1;
6045 }
6046}
6047
Hui Wangc4cfcf62018-11-26 14:17:16 +08006048/* The DAC of NID 0x3 will introduce click/pop noise on headphones, so invalidate it */
6049static void alc285_fixup_invalidate_dacs(struct hda_codec *codec,
6050 const struct hda_fixup *fix, int action)
6051{
6052 if (action != HDA_FIXUP_ACT_PRE_PROBE)
6053 return;
6054
6055 snd_hda_override_wcaps(codec, 0x03, 0);
6056}
6057
Kailang Yang8a8de09c2020-10-27 16:46:38 +08006058static void alc_combo_jack_hp_jd_restart(struct hda_codec *codec)
6059{
6060 switch (codec->core.vendor_id) {
6061 case 0x10ec0274:
6062 case 0x10ec0294:
6063 case 0x10ec0225:
6064 case 0x10ec0295:
6065 case 0x10ec0299:
6066 alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15); /* Reset HP JD */
6067 alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15);
6068 break;
6069 case 0x10ec0235:
6070 case 0x10ec0236:
6071 case 0x10ec0255:
6072 case 0x10ec0256:
6073 alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15); /* Reset HP JD */
6074 alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15);
6075 break;
6076 }
6077}
6078
Kailang Yang8983eb62019-04-03 15:31:49 +08006079static void alc295_fixup_chromebook(struct hda_codec *codec,
6080 const struct hda_fixup *fix, int action)
6081{
Kailang Yangd3ba58b2019-05-06 15:09:42 +08006082 struct alc_spec *spec = codec->spec;
6083
Kailang Yang8983eb62019-04-03 15:31:49 +08006084 switch (action) {
Kailang Yangd3ba58b2019-05-06 15:09:42 +08006085 case HDA_FIXUP_ACT_PRE_PROBE:
6086 spec->ultra_low_power = true;
6087 break;
Kailang Yang8983eb62019-04-03 15:31:49 +08006088 case HDA_FIXUP_ACT_INIT:
Kailang Yang8a8de09c2020-10-27 16:46:38 +08006089 alc_combo_jack_hp_jd_restart(codec);
Kailang Yang8983eb62019-04-03 15:31:49 +08006090 break;
6091 }
6092}
6093
Kailang Yangd1dd4212019-01-09 17:05:24 +08006094static void alc_fixup_disable_mic_vref(struct hda_codec *codec,
6095 const struct hda_fixup *fix, int action)
6096{
6097 if (action == HDA_FIXUP_ACT_PRE_PROBE)
6098 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
6099}
6100
Luke D Jonesc3cdf182020-09-07 20:19:59 +12006101
6102static void alc294_gx502_toggle_output(struct hda_codec *codec,
6103 struct hda_jack_callback *cb)
6104{
6105 /* The Windows driver sets the codec up in a very different way where
6106 * it appears to leave 0x10 = 0x8a20 set. For Linux we need to toggle it
6107 */
6108 if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
6109 alc_write_coef_idx(codec, 0x10, 0x8a20);
6110 else
6111 alc_write_coef_idx(codec, 0x10, 0x0a20);
6112}
6113
6114static void alc294_fixup_gx502_hp(struct hda_codec *codec,
6115 const struct hda_fixup *fix, int action)
6116{
6117 /* Pin 0x21: headphones/headset mic */
6118 if (!is_jack_detectable(codec, 0x21))
6119 return;
6120
6121 switch (action) {
6122 case HDA_FIXUP_ACT_PRE_PROBE:
6123 snd_hda_jack_detect_enable_callback(codec, 0x21,
6124 alc294_gx502_toggle_output);
6125 break;
6126 case HDA_FIXUP_ACT_INIT:
6127 /* Make sure to start in a correct state, i.e. if
6128 * headphones have been plugged in before powering up the system
6129 */
6130 alc294_gx502_toggle_output(codec, NULL);
6131 break;
6132 }
6133}
6134
Kailang Yang56496252020-07-29 15:09:27 +08006135static void alc285_fixup_hp_gpio_amp_init(struct hda_codec *codec,
6136 const struct hda_fixup *fix, int action)
6137{
6138 if (action != HDA_FIXUP_ACT_INIT)
6139 return;
6140
6141 msleep(100);
6142 alc_write_coef_idx(codec, 0x65, 0x0);
6143}
6144
Kailang Yang8a8de09c2020-10-27 16:46:38 +08006145static void alc274_fixup_hp_headset_mic(struct hda_codec *codec,
6146 const struct hda_fixup *fix, int action)
6147{
6148 switch (action) {
6149 case HDA_FIXUP_ACT_INIT:
6150 alc_combo_jack_hp_jd_restart(codec);
6151 break;
6152 }
6153}
6154
Kailang Yang92666d42020-11-19 17:04:21 +08006155static void alc_fixup_no_int_mic(struct hda_codec *codec,
6156 const struct hda_fixup *fix, int action)
6157{
6158 struct alc_spec *spec = codec->spec;
6159
6160 switch (action) {
6161 case HDA_FIXUP_ACT_PRE_PROBE:
6162 /* Mic RING SLEEVE swap for combo jack */
6163 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
6164 spec->no_internal_mic_pin = true;
6165 break;
6166 case HDA_FIXUP_ACT_INIT:
6167 alc_combo_jack_hp_jd_restart(codec);
6168 break;
6169 }
6170}
6171
Takashi Iwaib317b032014-01-08 11:44:21 +01006172/* for hda_fixup_thinkpad_acpi() */
6173#include "thinkpad_helper.c"
David Henningssonb67ae3f2013-11-05 13:11:37 +01006174
Takashi Iwaid5a6cab2018-06-13 12:43:10 +02006175static void alc_fixup_thinkpad_acpi(struct hda_codec *codec,
6176 const struct hda_fixup *fix, int action)
6177{
6178 alc_fixup_no_shutup(codec, fix, action); /* reduce click noise */
6179 hda_fixup_thinkpad_acpi(codec, fix, action);
6180}
6181
Tom Bridenbbf8ff62018-05-29 17:34:20 +01006182/* for alc295_fixup_hp_top_speakers */
6183#include "hp_x360_helper.c"
6184
Takashi Iwai1d045db2011-07-07 18:23:21 +02006185enum {
Kai-Heng Fengf73bbf62020-09-14 15:02:29 +08006186 ALC269_FIXUP_GPIO2,
Takashi Iwai1d045db2011-07-07 18:23:21 +02006187 ALC269_FIXUP_SONY_VAIO,
6188 ALC275_FIXUP_SONY_VAIO_GPIO2,
6189 ALC269_FIXUP_DELL_M101Z,
6190 ALC269_FIXUP_SKU_IGNORE,
6191 ALC269_FIXUP_ASUS_G73JW,
6192 ALC269_FIXUP_LENOVO_EAPD,
6193 ALC275_FIXUP_SONY_HWEQ,
Takashi Iwaie9bd7d52014-05-21 11:06:49 +02006194 ALC275_FIXUP_SONY_DISABLE_AAMIX,
Takashi Iwai1d045db2011-07-07 18:23:21 +02006195 ALC271_FIXUP_DMIC,
Takashi Iwai017f2a12011-07-09 14:42:25 +02006196 ALC269_FIXUP_PCM_44K,
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02006197 ALC269_FIXUP_STEREO_DMIC,
David Henningsson7c478f02013-10-11 10:18:46 +02006198 ALC269_FIXUP_HEADSET_MIC,
Takashi Iwai24519912011-08-16 15:08:49 +02006199 ALC269_FIXUP_QUANTA_MUTE,
6200 ALC269_FIXUP_LIFEBOOK,
David Henningsson2041d562014-06-13 11:15:44 +02006201 ALC269_FIXUP_LIFEBOOK_EXTMIC,
Takashi Iwaicc7016a2015-04-08 20:47:55 +02006202 ALC269_FIXUP_LIFEBOOK_HP_PIN,
Takashi Iwai4df3fd12015-06-29 08:38:02 +02006203 ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT,
Jan-Marek Glogowskifdcc9682018-02-14 11:29:15 +01006204 ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC,
Takashi Iwaia4297b52011-08-23 18:40:12 +02006205 ALC269_FIXUP_AMIC,
6206 ALC269_FIXUP_DMIC,
6207 ALC269VB_FIXUP_AMIC,
6208 ALC269VB_FIXUP_DMIC,
Takashi Iwai08fb0d02013-01-10 17:33:58 +01006209 ALC269_FIXUP_HP_MUTE_LED,
David Henningssond06ac142013-02-18 11:41:55 +01006210 ALC269_FIXUP_HP_MUTE_LED_MIC1,
Takashi Iwai08fb0d02013-01-10 17:33:58 +01006211 ALC269_FIXUP_HP_MUTE_LED_MIC2,
Tom Briden7f783bd2017-03-25 10:12:01 +00006212 ALC269_FIXUP_HP_MUTE_LED_MIC3,
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01006213 ALC269_FIXUP_HP_GPIO_LED,
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08006214 ALC269_FIXUP_HP_GPIO_MIC1_LED,
6215 ALC269_FIXUP_HP_LINE1_MIC1_LED,
David Henningsson693b6132012-06-22 19:12:10 +02006216 ALC269_FIXUP_INV_DMIC,
David Henningsson108cc102012-07-20 10:37:25 +02006217 ALC269_FIXUP_LENOVO_DOCK,
Takashi Iwaib590b382020-05-14 18:05:33 +02006218 ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST,
Takashi Iwai9b745ab2014-03-07 08:37:19 +01006219 ALC269_FIXUP_NO_SHUTUP,
David Henningsson88cfcf82013-10-11 10:18:45 +02006220 ALC286_FIXUP_SONY_MIC_NO_PRESENCE,
David Henningsson108cc102012-07-20 10:37:25 +02006221 ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
David Henningsson73bdd592013-04-15 15:44:14 +02006222 ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
6223 ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
David Henningsson338cae52013-10-07 10:39:59 +02006224 ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
Kailang Yangfcc6c872017-06-29 15:21:27 +08006225 ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
David Henningsson73bdd592013-04-15 15:44:14 +02006226 ALC269_FIXUP_HEADSET_MODE,
6227 ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
Takashi Iwai78197172015-06-27 10:21:13 +02006228 ALC269_FIXUP_ASPIRE_HEADSET_MIC,
David Henningssond240d1d2013-04-15 12:50:02 +02006229 ALC269_FIXUP_ASUS_X101_FUNC,
6230 ALC269_FIXUP_ASUS_X101_VERB,
6231 ALC269_FIXUP_ASUS_X101,
Dylan Reid08a978d2012-11-18 22:56:40 -08006232 ALC271_FIXUP_AMIC_MIC2,
6233 ALC271_FIXUP_HP_GATE_MIC_JACK,
Oleksij Rempelb1e89722013-12-04 20:50:53 +01006234 ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572,
Dylan Reid42397002013-04-05 14:58:22 -07006235 ALC269_FIXUP_ACER_AC700,
David Henningsson3e0d6112013-04-22 14:30:14 +02006236 ALC269_FIXUP_LIMIT_INT_MIC_BOOST,
Oleksij Rempel2cede302013-11-27 17:12:03 +01006237 ALC269VB_FIXUP_ASUS_ZENBOOK,
Takashi Iwai23870832013-11-29 14:13:12 +01006238 ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A,
David Henningsson8e35cd42013-11-06 11:20:01 +01006239 ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED,
Anisse Astier02b504d2013-06-03 11:53:10 +02006240 ALC269VB_FIXUP_ORDISSIMO_EVE2,
Kailang Yangcd217a62013-08-22 10:15:24 +02006241 ALC283_FIXUP_CHROME_BOOK,
Kailang Yang0202e992013-12-02 15:20:15 +08006242 ALC283_FIXUP_SENSE_COMBO_JACK,
Takashi Iwai7bba2152013-09-06 15:45:38 +02006243 ALC282_FIXUP_ASUS_TX300,
Kailang Yang1bb3e062013-09-27 13:10:25 +02006244 ALC283_FIXUP_INT_MIC,
David Henningsson338cae52013-10-07 10:39:59 +02006245 ALC290_FIXUP_MONO_SPEAKERS,
David Henningsson0f4881d2013-12-20 16:08:13 +01006246 ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
6247 ALC290_FIXUP_SUBWOOFER,
6248 ALC290_FIXUP_SUBWOOFER_HSJACK,
David Henningssonb67ae3f2013-11-05 13:11:37 +01006249 ALC269_FIXUP_THINKPAD_ACPI,
David Henningsson56f27012016-01-11 09:33:14 +01006250 ALC269_FIXUP_DMIC_THINKPAD_ACPI,
Chris Chiu5824ce82017-02-28 14:17:11 -06006251 ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
Chris Chiu615966a2017-02-28 14:17:12 -06006252 ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
Kailang Yang9a22a8f52013-11-08 15:54:49 +08006253 ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Kailang Yang31278992014-03-03 15:27:22 +08006254 ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
Kailang Yang9a22a8f52013-11-08 15:54:49 +08006255 ALC255_FIXUP_HEADSET_MODE,
Kailang Yang31278992014-03-03 15:27:22 +08006256 ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,
Kailang Yanga22aa262014-04-23 17:34:28 +08006257 ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
Takashi Iwai1c37c222014-05-06 17:34:42 +02006258 ALC292_FIXUP_TPT440_DOCK,
Takashi Iwai9a811232015-12-09 15:17:43 +01006259 ALC292_FIXUP_TPT440,
Anisse Astierabaa22742016-08-24 09:14:13 +02006260 ALC283_FIXUP_HEADSET_MIC,
Takashi Iwaib3802782018-11-26 17:47:46 +01006261 ALC255_FIXUP_MIC_MUTE_LED,
Takashi Iwai1a22e772014-08-27 08:19:05 +02006262 ALC282_FIXUP_ASPIRE_V5_PINS,
David Henningsson7a5255f2014-10-30 08:26:01 +01006263 ALC280_FIXUP_HP_GPIO4,
Kailang Yangeaa8e5e2014-11-21 15:49:11 +08006264 ALC286_FIXUP_HP_GPIO_LED,
David Henningsson33f4acd2015-01-07 15:50:13 +01006265 ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY,
TienFu Chenb4b33f92015-01-20 15:06:21 +01006266 ALC280_FIXUP_HP_DOCK_PINS,
Jaroslav Kysela04d54662017-03-09 13:29:13 +01006267 ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED,
Keith Packard98973f22015-07-15 12:14:39 -07006268 ALC280_FIXUP_HP_9480M,
Kailang Yange1e62b92015-04-08 16:01:22 +08006269 ALC288_FIXUP_DELL_HEADSET_MODE,
6270 ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang831bfdf92015-06-26 12:35:17 +08006271 ALC288_FIXUP_DELL_XPS_13,
6272 ALC288_FIXUP_DISABLE_AAMIX,
Takashi Iwai5fab5822020-01-05 09:11:19 +01006273 ALC292_FIXUP_DELL_E7X_AAMIX,
Takashi Iwai8b99aba2015-06-15 11:59:32 +02006274 ALC292_FIXUP_DELL_E7X,
6275 ALC292_FIXUP_DISABLE_AAMIX,
David Henningssonc04017e2015-12-15 14:44:03 +01006276 ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK,
James McDonnell54324222019-09-16 14:53:38 +00006277 ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
Kailang Yang977e6272015-05-18 15:31:20 +08006278 ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang2f726ae2017-03-31 10:31:40 +08006279 ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
Kailang Yang6ed11312015-10-26 15:37:39 +08006280 ALC275_FIXUP_DELL_XPS,
Hui Wang23adc192015-12-08 12:27:18 +08006281 ALC293_FIXUP_LENOVO_SPK_NOISE,
Kailang3694cb22015-12-28 11:35:24 +08006282 ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
Kai-Heng Feng3b43b712016-02-25 15:19:38 +08006283 ALC255_FIXUP_DELL_SPK_NOISE,
Kailang Yangd1dd4212019-01-09 17:05:24 +08006284 ALC225_FIXUP_DISABLE_MIC_VREF,
David Henningsson2ae95572016-02-25 09:37:05 +01006285 ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
Takashi Iwaie312a862018-03-06 12:14:17 +01006286 ALC295_FIXUP_DISABLE_DAC3,
Jaroslav Kyselad2cd7952019-11-29 15:40:27 +01006287 ALC285_FIXUP_SPEAKER2_TO_DAC1,
Takashi Iwaif8839822016-02-25 14:31:59 +01006288 ALC280_FIXUP_HP_HEADSET_MIC,
Hui Wange549d192016-04-01 11:00:15 +08006289 ALC221_FIXUP_HP_FRONT_MIC,
Sven Eckelmannc636b952016-04-11 16:55:26 +02006290 ALC292_FIXUP_TPT460,
Hui Wangdd9aa332016-08-01 10:20:32 +08006291 ALC298_FIXUP_SPK_VOLUME,
Kai-Heng Fengfd06c772016-08-30 15:36:34 +08006292 ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER,
Gabriele Mazzotta823ff162016-12-24 19:50:01 +01006293 ALC269_FIXUP_ATIV_BOOK_8,
Kailang Yang9eb5d0e2017-01-17 15:40:25 +08006294 ALC221_FIXUP_HP_MIC_NO_PRESENCE,
Chris Chiuc1732ed2017-02-28 14:17:13 -06006295 ALC256_FIXUP_ASUS_HEADSET_MODE,
6296 ALC256_FIXUP_ASUS_MIC,
Chris Chiueeed4cd2017-02-28 14:17:15 -06006297 ALC256_FIXUP_ASUS_AIO_GPIO2,
Chris Chiu216d7ae2017-02-28 14:17:14 -06006298 ALC233_FIXUP_ASUS_MIC_NO_PRESENCE,
6299 ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE,
Kailang Yangca169cc2017-04-25 16:17:40 +08006300 ALC233_FIXUP_LENOVO_MULTI_CODECS,
Jian-Hong Panea5c7eb2019-04-01 11:25:05 +08006301 ALC233_FIXUP_ACER_HEADSET_MIC,
Hui Wangf33f79f2017-07-07 12:08:29 +08006302 ALC294_FIXUP_LENOVO_MIC_LOCATION,
Kailang Yang5f364132017-07-25 16:28:16 +08006303 ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE,
Kai-Heng Feng52e4e362020-05-03 23:24:47 +08006304 ALC225_FIXUP_S3_POP_NOISE,
PeiSen Houb84e8432017-09-01 15:11:56 +08006305 ALC700_FIXUP_INTEL_REFERENCE,
Kailang Yang92266652017-12-14 15:28:58 +08006306 ALC274_FIXUP_DELL_BIND_DACS,
6307 ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
Takashi Iwai399c01a2020-05-26 08:24:06 +02006308 ALC298_FIXUP_TPT470_DOCK_FIX,
Kailang Yang61fcf8e2018-02-02 15:26:46 +08006309 ALC298_FIXUP_TPT470_DOCK,
Kailang Yangae104a22018-02-05 16:07:20 +08006310 ALC255_FIXUP_DUMMY_LINEOUT_VERB,
Kailang Yangf0ba9d62018-03-16 11:46:08 +08006311 ALC255_FIXUP_DELL_HEADSET_MIC,
Ayman Bagabas0fbf21c2019-05-23 05:30:11 -04006312 ALC256_FIXUP_HUAWEI_MACH_WX9_PINS,
Tomas Espeletaa2ef03f2019-08-09 16:37:54 +02006313 ALC298_FIXUP_HUAWEI_MBX_STEREO,
Tom Bridenbbf8ff62018-05-29 17:34:20 +01006314 ALC295_FIXUP_HP_X360,
Kailang Yang8a328ac2018-08-21 16:54:41 +08006315 ALC221_FIXUP_HP_HEADSET_MIC,
Hui Wangc4cfcf62018-11-26 14:17:16 +08006316 ALC285_FIXUP_LENOVO_HEADPHONE_NOISE,
Girija Kumar Kasinadhunie8ed64b2018-11-26 13:40:46 -05006317 ALC295_FIXUP_HP_AUTO_MUTE,
Chris Chiu33aaebd2018-12-05 14:48:53 +08006318 ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
Chris Chiud8ae4582018-12-07 17:17:11 +08006319 ALC294_FIXUP_ASUS_MIC,
Jian-Hong Pan4e051102018-12-07 17:17:12 +08006320 ALC294_FIXUP_ASUS_HEADSET_MIC,
6321 ALC294_FIXUP_ASUS_SPK,
Jeremy Soller89e3a562019-01-30 16:12:31 -07006322 ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
Hui Wangc8c6ee62019-02-14 11:41:33 +08006323 ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
Jian-Hong Pancbc05fd2019-03-13 17:33:24 +08006324 ALC255_FIXUP_ACER_HEADSET_MIC,
Kailang Yang10f5b1b2019-02-21 16:10:22 +08006325 ALC295_FIXUP_CHROME_BOOK,
Kailang Yang8983eb62019-04-03 15:31:49 +08006326 ALC225_FIXUP_HEADSET_JACK,
Kailang Yang136824e2019-03-14 16:22:45 +08006327 ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE,
6328 ALC225_FIXUP_WYSE_AUTO_MUTE,
6329 ALC225_FIXUP_WYSE_DISABLE_MIC_VREF,
Jian-Hong Pan667a8f72019-03-15 17:51:09 +08006330 ALC286_FIXUP_ACER_AIO_HEADSET_MIC,
Daniel Drake8c8967a2019-10-17 16:15:01 +08006331 ALC256_FIXUP_ASUS_HEADSET_MIC,
Jian-Hong Pane1037352019-03-22 11:37:18 +08006332 ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
Bernhard Rosenkraenzere2a829b2019-03-05 00:38:19 +01006333 ALC299_FIXUP_PREDATOR_SPK,
Jan-Marek Glogowskibd9c10b2019-09-15 16:57:28 +02006334 ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE,
Kailang Yange79c2262019-12-19 14:12:15 +08006335 ALC289_FIXUP_DELL_SPK2,
6336 ALC289_FIXUP_DUAL_SPK,
Chris Chiu48e01502019-12-30 11:11:18 +08006337 ALC294_FIXUP_SPK2_TO_DAC1,
6338 ALC294_FIXUP_ASUS_DUAL_SPK,
Takashi Iwai6a6660d2020-09-03 10:33:00 +02006339 ALC285_FIXUP_THINKPAD_X1_GEN7,
Kailang Yang76f7dec2020-02-10 16:30:26 +08006340 ALC285_FIXUP_THINKPAD_HEADSET_JACK,
Jian-Hong Pan8b33a132020-02-25 15:29:21 +08006341 ALC294_FIXUP_ASUS_HPE,
Takashi Iwai1b94e592020-05-12 09:32:03 +02006342 ALC294_FIXUP_ASUS_COEF_1B,
Luke D Jonesc3cdf182020-09-07 20:19:59 +12006343 ALC294_FIXUP_ASUS_GX502_HP,
6344 ALC294_FIXUP_ASUS_GX502_PINS,
6345 ALC294_FIXUP_ASUS_GX502_VERBS,
Kai-Heng Fengf5a88b02020-03-27 12:46:25 +08006346 ALC285_FIXUP_HP_GPIO_LED,
Kailang Yang431e76c2020-04-07 14:40:20 +08006347 ALC285_FIXUP_HP_MUTE_LED,
Kailang Yang24164f42020-04-07 14:52:42 +08006348 ALC236_FIXUP_HP_MUTE_LED,
Mike Pozulp14425f12020-05-09 20:28:37 -07006349 ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
Chris Chiu9e433422020-05-12 14:15:24 +08006350 ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
Jian-Hong Pan8eae7e92020-07-06 15:18:25 +08006351 ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS,
Jian-Hong Pan6e15d122020-07-06 15:18:27 +08006352 ALC269VC_FIXUP_ACER_HEADSET_MIC,
Jian-Hong Pan781c90c2020-07-06 15:18:29 +08006353 ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE,
Armas Spann293a92c2020-07-24 16:08:37 +02006354 ALC289_FIXUP_ASUS_GA401,
Armas Spann4b43d052020-07-24 16:06:16 +02006355 ALC289_FIXUP_ASUS_GA502,
Jian-Hong Panf50a1212020-07-13 14:04:22 +08006356 ALC256_FIXUP_ACER_MIC_NO_PRESENCE,
Kailang Yang56496252020-07-29 15:09:27 +08006357 ALC285_FIXUP_HP_GPIO_AMP_INIT,
Huacai Chenf1ec5be2020-08-02 17:26:40 +08006358 ALC269_FIXUP_CZC_B20,
6359 ALC269_FIXUP_CZC_TMI,
6360 ALC269_FIXUP_CZC_L101,
6361 ALC269_FIXUP_LEMOTE_A1802,
6362 ALC269_FIXUP_LEMOTE_A190X,
Kai-Heng Fenge2d2fde2020-08-07 16:05:12 +08006363 ALC256_FIXUP_INTEL_NUC8_RUGGED,
Hui Wangfc19d552020-09-09 10:00:41 +08006364 ALC255_FIXUP_XIAOMI_HEADSET_MIC,
Hui Wang13468bf2020-09-28 16:01:17 +08006365 ALC274_FIXUP_HP_MIC,
Kailang Yang8a8de09c2020-10-27 16:46:38 +08006366 ALC274_FIXUP_HP_HEADSET_MIC,
Kailang Yangef9ce662020-11-03 15:40:35 +08006367 ALC256_FIXUP_ASUS_HPE,
Kailang Yang446b8182020-11-02 15:00:12 +08006368 ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
Kailang Yanga0ccbc52020-11-06 15:20:38 +08006369 ALC287_FIXUP_HP_GPIO_LED,
Kailang Yang9e885772020-11-03 15:30:51 +08006370 ALC256_FIXUP_HP_HEADSET_MIC,
Kailang Yang92666d42020-11-19 17:04:21 +08006371 ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
Chris Chiu34cdf402020-12-16 20:52:00 +08006372 ALC282_FIXUP_ACER_DISABLE_LINEOUT,
Takashi Iwai1d045db2011-07-07 18:23:21 +02006373};
6374
Takashi Iwai1727a772013-01-10 09:52:52 +01006375static const struct hda_fixup alc269_fixups[] = {
Kai-Heng Fengf73bbf62020-09-14 15:02:29 +08006376 [ALC269_FIXUP_GPIO2] = {
6377 .type = HDA_FIXUP_FUNC,
6378 .v.func = alc_fixup_gpio2,
6379 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02006380 [ALC269_FIXUP_SONY_VAIO] = {
Takashi Iwaifd108212013-01-10 10:18:14 +01006381 .type = HDA_FIXUP_PINCTLS,
6382 .v.pins = (const struct hda_pintbl[]) {
6383 {0x19, PIN_VREFGRD},
Takashi Iwai1d045db2011-07-07 18:23:21 +02006384 {}
6385 }
6386 },
6387 [ALC275_FIXUP_SONY_VAIO_GPIO2] = {
Takashi Iwaiae065f12018-06-19 23:00:03 +02006388 .type = HDA_FIXUP_FUNC,
6389 .v.func = alc275_fixup_gpio4_off,
Takashi Iwai1d045db2011-07-07 18:23:21 +02006390 .chained = true,
6391 .chain_id = ALC269_FIXUP_SONY_VAIO
6392 },
6393 [ALC269_FIXUP_DELL_M101Z] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006394 .type = HDA_FIXUP_VERBS,
Takashi Iwai1d045db2011-07-07 18:23:21 +02006395 .v.verbs = (const struct hda_verb[]) {
6396 /* Enables internal speaker */
6397 {0x20, AC_VERB_SET_COEF_INDEX, 13},
6398 {0x20, AC_VERB_SET_PROC_COEF, 0x4040},
6399 {}
6400 }
6401 },
6402 [ALC269_FIXUP_SKU_IGNORE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006403 .type = HDA_FIXUP_FUNC,
Takashi Iwai23d30f22012-05-07 17:17:32 +02006404 .v.func = alc_fixup_sku_ignore,
Takashi Iwai1d045db2011-07-07 18:23:21 +02006405 },
6406 [ALC269_FIXUP_ASUS_G73JW] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006407 .type = HDA_FIXUP_PINS,
6408 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02006409 { 0x17, 0x99130111 }, /* subwoofer */
6410 { }
6411 }
6412 },
6413 [ALC269_FIXUP_LENOVO_EAPD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006414 .type = HDA_FIXUP_VERBS,
Takashi Iwai1d045db2011-07-07 18:23:21 +02006415 .v.verbs = (const struct hda_verb[]) {
6416 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
6417 {}
6418 }
6419 },
6420 [ALC275_FIXUP_SONY_HWEQ] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006421 .type = HDA_FIXUP_FUNC,
Takashi Iwai1d045db2011-07-07 18:23:21 +02006422 .v.func = alc269_fixup_hweq,
6423 .chained = true,
6424 .chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
6425 },
Takashi Iwaie9bd7d52014-05-21 11:06:49 +02006426 [ALC275_FIXUP_SONY_DISABLE_AAMIX] = {
6427 .type = HDA_FIXUP_FUNC,
6428 .v.func = alc_fixup_disable_aamix,
6429 .chained = true,
6430 .chain_id = ALC269_FIXUP_SONY_VAIO
6431 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02006432 [ALC271_FIXUP_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006433 .type = HDA_FIXUP_FUNC,
Takashi Iwai1d045db2011-07-07 18:23:21 +02006434 .v.func = alc271_fixup_dmic,
6435 },
Takashi Iwai017f2a12011-07-09 14:42:25 +02006436 [ALC269_FIXUP_PCM_44K] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006437 .type = HDA_FIXUP_FUNC,
Takashi Iwai017f2a12011-07-09 14:42:25 +02006438 .v.func = alc269_fixup_pcm_44k,
David Henningsson012e7eb2012-08-08 08:43:37 +02006439 .chained = true,
6440 .chain_id = ALC269_FIXUP_QUANTA_MUTE
Takashi Iwai017f2a12011-07-09 14:42:25 +02006441 },
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02006442 [ALC269_FIXUP_STEREO_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006443 .type = HDA_FIXUP_FUNC,
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02006444 .v.func = alc269_fixup_stereo_dmic,
6445 },
David Henningsson7c478f02013-10-11 10:18:46 +02006446 [ALC269_FIXUP_HEADSET_MIC] = {
6447 .type = HDA_FIXUP_FUNC,
6448 .v.func = alc269_fixup_headset_mic,
6449 },
Takashi Iwai24519912011-08-16 15:08:49 +02006450 [ALC269_FIXUP_QUANTA_MUTE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006451 .type = HDA_FIXUP_FUNC,
Takashi Iwai24519912011-08-16 15:08:49 +02006452 .v.func = alc269_fixup_quanta_mute,
6453 },
6454 [ALC269_FIXUP_LIFEBOOK] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006455 .type = HDA_FIXUP_PINS,
6456 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai24519912011-08-16 15:08:49 +02006457 { 0x1a, 0x2101103f }, /* dock line-out */
6458 { 0x1b, 0x23a11040 }, /* dock mic-in */
6459 { }
6460 },
6461 .chained = true,
6462 .chain_id = ALC269_FIXUP_QUANTA_MUTE
6463 },
David Henningsson2041d562014-06-13 11:15:44 +02006464 [ALC269_FIXUP_LIFEBOOK_EXTMIC] = {
6465 .type = HDA_FIXUP_PINS,
6466 .v.pins = (const struct hda_pintbl[]) {
6467 { 0x19, 0x01a1903c }, /* headset mic, with jack detect */
6468 { }
6469 },
6470 },
Takashi Iwaicc7016a2015-04-08 20:47:55 +02006471 [ALC269_FIXUP_LIFEBOOK_HP_PIN] = {
6472 .type = HDA_FIXUP_PINS,
6473 .v.pins = (const struct hda_pintbl[]) {
6474 { 0x21, 0x0221102f }, /* HP out */
6475 { }
6476 },
6477 },
Takashi Iwai4df3fd12015-06-29 08:38:02 +02006478 [ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT] = {
6479 .type = HDA_FIXUP_FUNC,
6480 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
6481 },
Jan-Marek Glogowskifdcc9682018-02-14 11:29:15 +01006482 [ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC] = {
6483 .type = HDA_FIXUP_FUNC,
6484 .v.func = alc269_fixup_pincfg_U7x7_headset_mic,
6485 },
Takashi Iwaia4297b52011-08-23 18:40:12 +02006486 [ALC269_FIXUP_AMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006487 .type = HDA_FIXUP_PINS,
6488 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaia4297b52011-08-23 18:40:12 +02006489 { 0x14, 0x99130110 }, /* speaker */
6490 { 0x15, 0x0121401f }, /* HP out */
6491 { 0x18, 0x01a19c20 }, /* mic */
6492 { 0x19, 0x99a3092f }, /* int-mic */
6493 { }
6494 },
6495 },
6496 [ALC269_FIXUP_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006497 .type = HDA_FIXUP_PINS,
6498 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaia4297b52011-08-23 18:40:12 +02006499 { 0x12, 0x99a3092f }, /* int-mic */
6500 { 0x14, 0x99130110 }, /* speaker */
6501 { 0x15, 0x0121401f }, /* HP out */
6502 { 0x18, 0x01a19c20 }, /* mic */
6503 { }
6504 },
6505 },
6506 [ALC269VB_FIXUP_AMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006507 .type = HDA_FIXUP_PINS,
6508 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaia4297b52011-08-23 18:40:12 +02006509 { 0x14, 0x99130110 }, /* speaker */
6510 { 0x18, 0x01a19c20 }, /* mic */
6511 { 0x19, 0x99a3092f }, /* int-mic */
6512 { 0x21, 0x0121401f }, /* HP out */
6513 { }
6514 },
6515 },
David Henningsson2267ea92012-01-03 08:45:56 +01006516 [ALC269VB_FIXUP_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006517 .type = HDA_FIXUP_PINS,
6518 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaia4297b52011-08-23 18:40:12 +02006519 { 0x12, 0x99a3092f }, /* int-mic */
6520 { 0x14, 0x99130110 }, /* speaker */
6521 { 0x18, 0x01a19c20 }, /* mic */
6522 { 0x21, 0x0121401f }, /* HP out */
6523 { }
6524 },
6525 },
Takashi Iwai08fb0d02013-01-10 17:33:58 +01006526 [ALC269_FIXUP_HP_MUTE_LED] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006527 .type = HDA_FIXUP_FUNC,
Takashi Iwai08fb0d02013-01-10 17:33:58 +01006528 .v.func = alc269_fixup_hp_mute_led,
David Henningsson6d3cd5d2013-01-07 12:03:47 +01006529 },
David Henningssond06ac142013-02-18 11:41:55 +01006530 [ALC269_FIXUP_HP_MUTE_LED_MIC1] = {
6531 .type = HDA_FIXUP_FUNC,
6532 .v.func = alc269_fixup_hp_mute_led_mic1,
6533 },
Takashi Iwai08fb0d02013-01-10 17:33:58 +01006534 [ALC269_FIXUP_HP_MUTE_LED_MIC2] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006535 .type = HDA_FIXUP_FUNC,
Takashi Iwai08fb0d02013-01-10 17:33:58 +01006536 .v.func = alc269_fixup_hp_mute_led_mic2,
Takashi Iwai420b0fe2012-03-12 12:35:27 +01006537 },
Tom Briden7f783bd2017-03-25 10:12:01 +00006538 [ALC269_FIXUP_HP_MUTE_LED_MIC3] = {
6539 .type = HDA_FIXUP_FUNC,
6540 .v.func = alc269_fixup_hp_mute_led_mic3,
Girija Kumar Kasinadhunie8ed64b2018-11-26 13:40:46 -05006541 .chained = true,
6542 .chain_id = ALC295_FIXUP_HP_AUTO_MUTE
Tom Briden7f783bd2017-03-25 10:12:01 +00006543 },
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01006544 [ALC269_FIXUP_HP_GPIO_LED] = {
6545 .type = HDA_FIXUP_FUNC,
6546 .v.func = alc269_fixup_hp_gpio_led,
6547 },
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08006548 [ALC269_FIXUP_HP_GPIO_MIC1_LED] = {
6549 .type = HDA_FIXUP_FUNC,
6550 .v.func = alc269_fixup_hp_gpio_mic1_led,
6551 },
6552 [ALC269_FIXUP_HP_LINE1_MIC1_LED] = {
6553 .type = HDA_FIXUP_FUNC,
6554 .v.func = alc269_fixup_hp_line1_mic1_led,
6555 },
David Henningsson693b6132012-06-22 19:12:10 +02006556 [ALC269_FIXUP_INV_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006557 .type = HDA_FIXUP_FUNC,
David Henningsson9d36a7d2014-10-07 10:18:42 +02006558 .v.func = alc_fixup_inv_dmic,
David Henningsson693b6132012-06-22 19:12:10 +02006559 },
Takashi Iwai9b745ab2014-03-07 08:37:19 +01006560 [ALC269_FIXUP_NO_SHUTUP] = {
6561 .type = HDA_FIXUP_FUNC,
6562 .v.func = alc_fixup_no_shutup,
6563 },
David Henningsson108cc102012-07-20 10:37:25 +02006564 [ALC269_FIXUP_LENOVO_DOCK] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006565 .type = HDA_FIXUP_PINS,
6566 .v.pins = (const struct hda_pintbl[]) {
David Henningsson108cc102012-07-20 10:37:25 +02006567 { 0x19, 0x23a11040 }, /* dock mic */
6568 { 0x1b, 0x2121103f }, /* dock headphone */
6569 { }
6570 },
6571 .chained = true,
6572 .chain_id = ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT
6573 },
Takashi Iwaib590b382020-05-14 18:05:33 +02006574 [ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST] = {
6575 .type = HDA_FIXUP_FUNC,
6576 .v.func = alc269_fixup_limit_int_mic_boost,
6577 .chained = true,
6578 .chain_id = ALC269_FIXUP_LENOVO_DOCK,
6579 },
David Henningsson108cc102012-07-20 10:37:25 +02006580 [ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006581 .type = HDA_FIXUP_FUNC,
David Henningsson108cc102012-07-20 10:37:25 +02006582 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
David Henningsson52129002013-11-19 10:25:53 +01006583 .chained = true,
6584 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
David Henningsson108cc102012-07-20 10:37:25 +02006585 },
David Henningsson73bdd592013-04-15 15:44:14 +02006586 [ALC269_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6587 .type = HDA_FIXUP_PINS,
6588 .v.pins = (const struct hda_pintbl[]) {
6589 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6590 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6591 { }
6592 },
6593 .chained = true,
6594 .chain_id = ALC269_FIXUP_HEADSET_MODE
6595 },
6596 [ALC269_FIXUP_DELL2_MIC_NO_PRESENCE] = {
6597 .type = HDA_FIXUP_PINS,
6598 .v.pins = (const struct hda_pintbl[]) {
6599 { 0x16, 0x21014020 }, /* dock line out */
6600 { 0x19, 0x21a19030 }, /* dock mic */
6601 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6602 { }
6603 },
6604 .chained = true,
6605 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
6606 },
David Henningsson338cae52013-10-07 10:39:59 +02006607 [ALC269_FIXUP_DELL3_MIC_NO_PRESENCE] = {
6608 .type = HDA_FIXUP_PINS,
6609 .v.pins = (const struct hda_pintbl[]) {
6610 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6611 { }
6612 },
6613 .chained = true,
6614 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
6615 },
Kailang Yangfcc6c872017-06-29 15:21:27 +08006616 [ALC269_FIXUP_DELL4_MIC_NO_PRESENCE] = {
6617 .type = HDA_FIXUP_PINS,
6618 .v.pins = (const struct hda_pintbl[]) {
6619 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6620 { 0x1b, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6621 { }
6622 },
6623 .chained = true,
6624 .chain_id = ALC269_FIXUP_HEADSET_MODE
6625 },
David Henningsson73bdd592013-04-15 15:44:14 +02006626 [ALC269_FIXUP_HEADSET_MODE] = {
6627 .type = HDA_FIXUP_FUNC,
6628 .v.func = alc_fixup_headset_mode,
Hui Wang6676f302014-11-18 17:57:41 +08006629 .chained = true,
Takashi Iwaib3802782018-11-26 17:47:46 +01006630 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
David Henningsson73bdd592013-04-15 15:44:14 +02006631 },
6632 [ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
6633 .type = HDA_FIXUP_FUNC,
6634 .v.func = alc_fixup_headset_mode_no_hp_mic,
6635 },
Takashi Iwai78197172015-06-27 10:21:13 +02006636 [ALC269_FIXUP_ASPIRE_HEADSET_MIC] = {
6637 .type = HDA_FIXUP_PINS,
6638 .v.pins = (const struct hda_pintbl[]) {
6639 { 0x19, 0x01a1913c }, /* headset mic w/o jack detect */
6640 { }
6641 },
6642 .chained = true,
6643 .chain_id = ALC269_FIXUP_HEADSET_MODE,
6644 },
David Henningsson88cfcf82013-10-11 10:18:45 +02006645 [ALC286_FIXUP_SONY_MIC_NO_PRESENCE] = {
6646 .type = HDA_FIXUP_PINS,
6647 .v.pins = (const struct hda_pintbl[]) {
6648 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6649 { }
6650 },
David Henningssonfbc78ad2013-10-11 13:46:04 +02006651 .chained = true,
6652 .chain_id = ALC269_FIXUP_HEADSET_MIC
David Henningsson88cfcf82013-10-11 10:18:45 +02006653 },
Ayman Bagabas0fbf21c2019-05-23 05:30:11 -04006654 [ALC256_FIXUP_HUAWEI_MACH_WX9_PINS] = {
Ayman Bagabas8ac51bb2018-12-12 18:07:57 -05006655 .type = HDA_FIXUP_PINS,
6656 .v.pins = (const struct hda_pintbl[]) {
6657 {0x12, 0x90a60130},
6658 {0x13, 0x40000000},
6659 {0x14, 0x90170110},
6660 {0x18, 0x411111f0},
6661 {0x19, 0x04a11040},
6662 {0x1a, 0x411111f0},
6663 {0x1b, 0x90170112},
6664 {0x1d, 0x40759a05},
6665 {0x1e, 0x411111f0},
6666 {0x21, 0x04211020},
6667 { }
6668 },
Ayman Bagabase2744fd2018-12-12 18:07:59 -05006669 .chained = true,
6670 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
Ayman Bagabas8ac51bb2018-12-12 18:07:57 -05006671 },
Tomas Espeletaa2ef03f2019-08-09 16:37:54 +02006672 [ALC298_FIXUP_HUAWEI_MBX_STEREO] = {
6673 .type = HDA_FIXUP_FUNC,
6674 .v.func = alc298_fixup_huawei_mbx_stereo,
6675 .chained = true,
6676 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
6677 },
David Henningssond240d1d2013-04-15 12:50:02 +02006678 [ALC269_FIXUP_ASUS_X101_FUNC] = {
6679 .type = HDA_FIXUP_FUNC,
6680 .v.func = alc269_fixup_x101_headset_mic,
6681 },
6682 [ALC269_FIXUP_ASUS_X101_VERB] = {
6683 .type = HDA_FIXUP_VERBS,
6684 .v.verbs = (const struct hda_verb[]) {
6685 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6686 {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
6687 {0x20, AC_VERB_SET_PROC_COEF, 0x0310},
6688 { }
6689 },
6690 .chained = true,
6691 .chain_id = ALC269_FIXUP_ASUS_X101_FUNC
6692 },
6693 [ALC269_FIXUP_ASUS_X101] = {
6694 .type = HDA_FIXUP_PINS,
6695 .v.pins = (const struct hda_pintbl[]) {
6696 { 0x18, 0x04a1182c }, /* Headset mic */
6697 { }
6698 },
6699 .chained = true,
6700 .chain_id = ALC269_FIXUP_ASUS_X101_VERB
6701 },
Dylan Reid08a978d2012-11-18 22:56:40 -08006702 [ALC271_FIXUP_AMIC_MIC2] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006703 .type = HDA_FIXUP_PINS,
6704 .v.pins = (const struct hda_pintbl[]) {
Dylan Reid08a978d2012-11-18 22:56:40 -08006705 { 0x14, 0x99130110 }, /* speaker */
6706 { 0x19, 0x01a19c20 }, /* mic */
6707 { 0x1b, 0x99a7012f }, /* int-mic */
6708 { 0x21, 0x0121401f }, /* HP out */
6709 { }
6710 },
6711 },
6712 [ALC271_FIXUP_HP_GATE_MIC_JACK] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01006713 .type = HDA_FIXUP_FUNC,
Dylan Reid08a978d2012-11-18 22:56:40 -08006714 .v.func = alc271_hp_gate_mic_jack,
6715 .chained = true,
6716 .chain_id = ALC271_FIXUP_AMIC_MIC2,
6717 },
Oleksij Rempelb1e89722013-12-04 20:50:53 +01006718 [ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572] = {
6719 .type = HDA_FIXUP_FUNC,
6720 .v.func = alc269_fixup_limit_int_mic_boost,
6721 .chained = true,
6722 .chain_id = ALC271_FIXUP_HP_GATE_MIC_JACK,
6723 },
Dylan Reid42397002013-04-05 14:58:22 -07006724 [ALC269_FIXUP_ACER_AC700] = {
6725 .type = HDA_FIXUP_PINS,
6726 .v.pins = (const struct hda_pintbl[]) {
6727 { 0x12, 0x99a3092f }, /* int-mic */
6728 { 0x14, 0x99130110 }, /* speaker */
6729 { 0x18, 0x03a11c20 }, /* mic */
6730 { 0x1e, 0x0346101e }, /* SPDIF1 */
6731 { 0x21, 0x0321101f }, /* HP out */
6732 { }
6733 },
6734 .chained = true,
6735 .chain_id = ALC271_FIXUP_DMIC,
6736 },
David Henningsson3e0d6112013-04-22 14:30:14 +02006737 [ALC269_FIXUP_LIMIT_INT_MIC_BOOST] = {
6738 .type = HDA_FIXUP_FUNC,
6739 .v.func = alc269_fixup_limit_int_mic_boost,
David Henningsson27937692013-11-18 11:51:47 +01006740 .chained = true,
6741 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
David Henningsson3e0d6112013-04-22 14:30:14 +02006742 },
Oleksij Rempel2cede302013-11-27 17:12:03 +01006743 [ALC269VB_FIXUP_ASUS_ZENBOOK] = {
6744 .type = HDA_FIXUP_FUNC,
6745 .v.func = alc269_fixup_limit_int_mic_boost,
6746 .chained = true,
6747 .chain_id = ALC269VB_FIXUP_DMIC,
6748 },
Takashi Iwai23870832013-11-29 14:13:12 +01006749 [ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A] = {
6750 .type = HDA_FIXUP_VERBS,
6751 .v.verbs = (const struct hda_verb[]) {
6752 /* class-D output amp +5dB */
6753 { 0x20, AC_VERB_SET_COEF_INDEX, 0x12 },
6754 { 0x20, AC_VERB_SET_PROC_COEF, 0x2800 },
6755 {}
6756 },
6757 .chained = true,
6758 .chain_id = ALC269VB_FIXUP_ASUS_ZENBOOK,
6759 },
David Henningsson8e35cd42013-11-06 11:20:01 +01006760 [ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED] = {
6761 .type = HDA_FIXUP_FUNC,
6762 .v.func = alc269_fixup_limit_int_mic_boost,
6763 .chained = true,
6764 .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC1,
6765 },
Anisse Astier02b504d2013-06-03 11:53:10 +02006766 [ALC269VB_FIXUP_ORDISSIMO_EVE2] = {
6767 .type = HDA_FIXUP_PINS,
6768 .v.pins = (const struct hda_pintbl[]) {
6769 { 0x12, 0x99a3092f }, /* int-mic */
6770 { 0x18, 0x03a11d20 }, /* mic */
6771 { 0x19, 0x411111f0 }, /* Unused bogus pin */
6772 { }
6773 },
6774 },
Kailang Yangcd217a62013-08-22 10:15:24 +02006775 [ALC283_FIXUP_CHROME_BOOK] = {
6776 .type = HDA_FIXUP_FUNC,
6777 .v.func = alc283_fixup_chromebook,
6778 },
Kailang Yang0202e992013-12-02 15:20:15 +08006779 [ALC283_FIXUP_SENSE_COMBO_JACK] = {
6780 .type = HDA_FIXUP_FUNC,
6781 .v.func = alc283_fixup_sense_combo_jack,
6782 .chained = true,
6783 .chain_id = ALC283_FIXUP_CHROME_BOOK,
6784 },
Takashi Iwai7bba2152013-09-06 15:45:38 +02006785 [ALC282_FIXUP_ASUS_TX300] = {
6786 .type = HDA_FIXUP_FUNC,
6787 .v.func = alc282_fixup_asus_tx300,
6788 },
Kailang Yang1bb3e062013-09-27 13:10:25 +02006789 [ALC283_FIXUP_INT_MIC] = {
6790 .type = HDA_FIXUP_VERBS,
6791 .v.verbs = (const struct hda_verb[]) {
6792 {0x20, AC_VERB_SET_COEF_INDEX, 0x1a},
6793 {0x20, AC_VERB_SET_PROC_COEF, 0x0011},
6794 { }
6795 },
6796 .chained = true,
6797 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
6798 },
David Henningsson0f4881d2013-12-20 16:08:13 +01006799 [ALC290_FIXUP_SUBWOOFER_HSJACK] = {
6800 .type = HDA_FIXUP_PINS,
6801 .v.pins = (const struct hda_pintbl[]) {
6802 { 0x17, 0x90170112 }, /* subwoofer */
6803 { }
6804 },
6805 .chained = true,
6806 .chain_id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
6807 },
6808 [ALC290_FIXUP_SUBWOOFER] = {
6809 .type = HDA_FIXUP_PINS,
6810 .v.pins = (const struct hda_pintbl[]) {
6811 { 0x17, 0x90170112 }, /* subwoofer */
6812 { }
6813 },
6814 .chained = true,
6815 .chain_id = ALC290_FIXUP_MONO_SPEAKERS,
6816 },
David Henningsson338cae52013-10-07 10:39:59 +02006817 [ALC290_FIXUP_MONO_SPEAKERS] = {
6818 .type = HDA_FIXUP_FUNC,
6819 .v.func = alc290_fixup_mono_speakers,
David Henningsson0f4881d2013-12-20 16:08:13 +01006820 },
6821 [ALC290_FIXUP_MONO_SPEAKERS_HSJACK] = {
6822 .type = HDA_FIXUP_FUNC,
6823 .v.func = alc290_fixup_mono_speakers,
David Henningsson338cae52013-10-07 10:39:59 +02006824 .chained = true,
6825 .chain_id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
6826 },
David Henningssonb67ae3f2013-11-05 13:11:37 +01006827 [ALC269_FIXUP_THINKPAD_ACPI] = {
6828 .type = HDA_FIXUP_FUNC,
Takashi Iwaid5a6cab2018-06-13 12:43:10 +02006829 .v.func = alc_fixup_thinkpad_acpi,
Takashi Iwai09da1112016-09-08 12:15:02 +02006830 .chained = true,
6831 .chain_id = ALC269_FIXUP_SKU_IGNORE,
David Henningssonb67ae3f2013-11-05 13:11:37 +01006832 },
David Henningsson56f27012016-01-11 09:33:14 +01006833 [ALC269_FIXUP_DMIC_THINKPAD_ACPI] = {
6834 .type = HDA_FIXUP_FUNC,
6835 .v.func = alc_fixup_inv_dmic,
6836 .chained = true,
6837 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
6838 },
Chris Chiu5824ce82017-02-28 14:17:11 -06006839 [ALC255_FIXUP_ACER_MIC_NO_PRESENCE] = {
Hui Wang17d30462019-06-14 16:44:12 +08006840 .type = HDA_FIXUP_PINS,
6841 .v.pins = (const struct hda_pintbl[]) {
6842 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6843 { }
Chris Chiu5824ce82017-02-28 14:17:11 -06006844 },
6845 .chained = true,
Hui Wang17d30462019-06-14 16:44:12 +08006846 .chain_id = ALC255_FIXUP_HEADSET_MODE
Chris Chiu5824ce82017-02-28 14:17:11 -06006847 },
Chris Chiu615966a2017-02-28 14:17:12 -06006848 [ALC255_FIXUP_ASUS_MIC_NO_PRESENCE] = {
6849 .type = HDA_FIXUP_PINS,
6850 .v.pins = (const struct hda_pintbl[]) {
6851 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6852 { }
6853 },
6854 .chained = true,
6855 .chain_id = ALC255_FIXUP_HEADSET_MODE
6856 },
Kailang Yang9a22a8f52013-11-08 15:54:49 +08006857 [ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6858 .type = HDA_FIXUP_PINS,
6859 .v.pins = (const struct hda_pintbl[]) {
6860 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6861 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6862 { }
6863 },
6864 .chained = true,
6865 .chain_id = ALC255_FIXUP_HEADSET_MODE
6866 },
Kailang Yang31278992014-03-03 15:27:22 +08006867 [ALC255_FIXUP_DELL2_MIC_NO_PRESENCE] = {
6868 .type = HDA_FIXUP_PINS,
6869 .v.pins = (const struct hda_pintbl[]) {
6870 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6871 { }
6872 },
6873 .chained = true,
6874 .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
6875 },
Kailang Yang9a22a8f52013-11-08 15:54:49 +08006876 [ALC255_FIXUP_HEADSET_MODE] = {
6877 .type = HDA_FIXUP_FUNC,
6878 .v.func = alc_fixup_headset_mode_alc255,
Hui Wang4a83d422014-11-18 17:57:40 +08006879 .chained = true,
Takashi Iwaib3802782018-11-26 17:47:46 +01006880 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
Kailang Yang9a22a8f52013-11-08 15:54:49 +08006881 },
Kailang Yang31278992014-03-03 15:27:22 +08006882 [ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
6883 .type = HDA_FIXUP_FUNC,
6884 .v.func = alc_fixup_headset_mode_alc255_no_hp_mic,
6885 },
Kailang Yanga22aa262014-04-23 17:34:28 +08006886 [ALC293_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6887 .type = HDA_FIXUP_PINS,
6888 .v.pins = (const struct hda_pintbl[]) {
6889 { 0x18, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6890 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6891 { }
6892 },
6893 .chained = true,
6894 .chain_id = ALC269_FIXUP_HEADSET_MODE
6895 },
Takashi Iwai1c37c222014-05-06 17:34:42 +02006896 [ALC292_FIXUP_TPT440_DOCK] = {
David Henningssonec56af62015-06-24 10:46:33 +02006897 .type = HDA_FIXUP_FUNC,
Takashi Iwai7f57d802015-09-24 17:36:51 +02006898 .v.func = alc_fixup_tpt440_dock,
Takashi Iwai1c37c222014-05-06 17:34:42 +02006899 .chained = true,
6900 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
6901 },
Takashi Iwai9a811232015-12-09 15:17:43 +01006902 [ALC292_FIXUP_TPT440] = {
6903 .type = HDA_FIXUP_FUNC,
Takashi Iwai157f0b72015-12-10 23:30:43 +01006904 .v.func = alc_fixup_disable_aamix,
Takashi Iwai9a811232015-12-09 15:17:43 +01006905 .chained = true,
6906 .chain_id = ALC292_FIXUP_TPT440_DOCK,
6907 },
Anisse Astierabaa22742016-08-24 09:14:13 +02006908 [ALC283_FIXUP_HEADSET_MIC] = {
Daniel Drake9dc12862014-07-22 10:58:29 +01006909 .type = HDA_FIXUP_PINS,
6910 .v.pins = (const struct hda_pintbl[]) {
6911 { 0x19, 0x04a110f0 },
6912 { },
6913 },
6914 },
Takashi Iwaib3802782018-11-26 17:47:46 +01006915 [ALC255_FIXUP_MIC_MUTE_LED] = {
Hui Wang00ef9942014-07-31 11:52:38 +08006916 .type = HDA_FIXUP_FUNC,
Takashi Iwai8a503552020-06-18 13:08:32 +02006917 .v.func = alc_fixup_micmute_led,
Hui Wang00ef9942014-07-31 11:52:38 +08006918 },
Takashi Iwai1a22e772014-08-27 08:19:05 +02006919 [ALC282_FIXUP_ASPIRE_V5_PINS] = {
6920 .type = HDA_FIXUP_PINS,
6921 .v.pins = (const struct hda_pintbl[]) {
6922 { 0x12, 0x90a60130 },
6923 { 0x14, 0x90170110 },
6924 { 0x17, 0x40000008 },
6925 { 0x18, 0x411111f0 },
Mateusz Sylwestrzak04206942015-07-19 17:38:56 +02006926 { 0x19, 0x01a1913c },
Takashi Iwai1a22e772014-08-27 08:19:05 +02006927 { 0x1a, 0x411111f0 },
6928 { 0x1b, 0x411111f0 },
6929 { 0x1d, 0x40f89b2d },
6930 { 0x1e, 0x411111f0 },
6931 { 0x21, 0x0321101f },
6932 { },
6933 },
6934 },
David Henningsson7a5255f2014-10-30 08:26:01 +01006935 [ALC280_FIXUP_HP_GPIO4] = {
6936 .type = HDA_FIXUP_FUNC,
6937 .v.func = alc280_fixup_hp_gpio4,
6938 },
Kailang Yangeaa8e5e2014-11-21 15:49:11 +08006939 [ALC286_FIXUP_HP_GPIO_LED] = {
6940 .type = HDA_FIXUP_FUNC,
6941 .v.func = alc286_fixup_hp_gpio_led,
6942 },
David Henningsson33f4acd2015-01-07 15:50:13 +01006943 [ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY] = {
6944 .type = HDA_FIXUP_FUNC,
6945 .v.func = alc280_fixup_hp_gpio2_mic_hotkey,
6946 },
TienFu Chenb4b33f92015-01-20 15:06:21 +01006947 [ALC280_FIXUP_HP_DOCK_PINS] = {
6948 .type = HDA_FIXUP_PINS,
6949 .v.pins = (const struct hda_pintbl[]) {
6950 { 0x1b, 0x21011020 }, /* line-out */
6951 { 0x1a, 0x01a1903c }, /* headset mic */
6952 { 0x18, 0x2181103f }, /* line-in */
6953 { },
6954 },
6955 .chained = true,
6956 .chain_id = ALC280_FIXUP_HP_GPIO4
6957 },
Jaroslav Kysela04d54662017-03-09 13:29:13 +01006958 [ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED] = {
6959 .type = HDA_FIXUP_PINS,
6960 .v.pins = (const struct hda_pintbl[]) {
6961 { 0x1b, 0x21011020 }, /* line-out */
6962 { 0x18, 0x2181103f }, /* line-in */
6963 { },
6964 },
6965 .chained = true,
6966 .chain_id = ALC269_FIXUP_HP_GPIO_MIC1_LED
6967 },
Keith Packard98973f22015-07-15 12:14:39 -07006968 [ALC280_FIXUP_HP_9480M] = {
6969 .type = HDA_FIXUP_FUNC,
6970 .v.func = alc280_fixup_hp_9480m,
6971 },
Kailang Yange1e62b92015-04-08 16:01:22 +08006972 [ALC288_FIXUP_DELL_HEADSET_MODE] = {
6973 .type = HDA_FIXUP_FUNC,
6974 .v.func = alc_fixup_headset_mode_dell_alc288,
6975 .chained = true,
Takashi Iwaib3802782018-11-26 17:47:46 +01006976 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
Kailang Yange1e62b92015-04-08 16:01:22 +08006977 },
6978 [ALC288_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6979 .type = HDA_FIXUP_PINS,
6980 .v.pins = (const struct hda_pintbl[]) {
6981 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6982 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6983 { }
6984 },
6985 .chained = true,
6986 .chain_id = ALC288_FIXUP_DELL_HEADSET_MODE
6987 },
Hui Wang831bfdf92015-06-26 12:35:17 +08006988 [ALC288_FIXUP_DISABLE_AAMIX] = {
6989 .type = HDA_FIXUP_FUNC,
6990 .v.func = alc_fixup_disable_aamix,
6991 .chained = true,
Takashi Iwaid44a6862018-06-19 23:04:03 +02006992 .chain_id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE
Hui Wang831bfdf92015-06-26 12:35:17 +08006993 },
6994 [ALC288_FIXUP_DELL_XPS_13] = {
6995 .type = HDA_FIXUP_FUNC,
6996 .v.func = alc_fixup_dell_xps13,
6997 .chained = true,
6998 .chain_id = ALC288_FIXUP_DISABLE_AAMIX
6999 },
Takashi Iwai8b99aba2015-06-15 11:59:32 +02007000 [ALC292_FIXUP_DISABLE_AAMIX] = {
7001 .type = HDA_FIXUP_FUNC,
7002 .v.func = alc_fixup_disable_aamix,
Hui Wang831bfdf92015-06-26 12:35:17 +08007003 .chained = true,
7004 .chain_id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE
Takashi Iwai8b99aba2015-06-15 11:59:32 +02007005 },
David Henningssonc04017e2015-12-15 14:44:03 +01007006 [ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK] = {
7007 .type = HDA_FIXUP_FUNC,
7008 .v.func = alc_fixup_disable_aamix,
7009 .chained = true,
7010 .chain_id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE
7011 },
Takashi Iwai5fab5822020-01-05 09:11:19 +01007012 [ALC292_FIXUP_DELL_E7X_AAMIX] = {
Takashi Iwai8b99aba2015-06-15 11:59:32 +02007013 .type = HDA_FIXUP_FUNC,
7014 .v.func = alc_fixup_dell_xps13,
7015 .chained = true,
7016 .chain_id = ALC292_FIXUP_DISABLE_AAMIX
7017 },
Takashi Iwai5fab5822020-01-05 09:11:19 +01007018 [ALC292_FIXUP_DELL_E7X] = {
7019 .type = HDA_FIXUP_FUNC,
Takashi Iwai8a503552020-06-18 13:08:32 +02007020 .v.func = alc_fixup_micmute_led,
Takashi Iwai5fab5822020-01-05 09:11:19 +01007021 /* micmute fixup must be applied at last */
7022 .chained_before = true,
7023 .chain_id = ALC292_FIXUP_DELL_E7X_AAMIX,
7024 },
James McDonnell54324222019-09-16 14:53:38 +00007025 [ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE] = {
7026 .type = HDA_FIXUP_PINS,
7027 .v.pins = (const struct hda_pintbl[]) {
7028 { 0x18, 0x01a1913c }, /* headset mic w/o jack detect */
7029 { }
7030 },
7031 .chained_before = true,
7032 .chain_id = ALC269_FIXUP_HEADSET_MODE,
7033 },
Kailang Yang977e6272015-05-18 15:31:20 +08007034 [ALC298_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7035 .type = HDA_FIXUP_PINS,
7036 .v.pins = (const struct hda_pintbl[]) {
7037 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7038 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7039 { }
7040 },
7041 .chained = true,
7042 .chain_id = ALC269_FIXUP_HEADSET_MODE
7043 },
Hui Wang2f726ae2017-03-31 10:31:40 +08007044 [ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE] = {
7045 .type = HDA_FIXUP_PINS,
7046 .v.pins = (const struct hda_pintbl[]) {
7047 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7048 { }
7049 },
7050 .chained = true,
7051 .chain_id = ALC269_FIXUP_HEADSET_MODE
7052 },
Kailang Yang6ed11312015-10-26 15:37:39 +08007053 [ALC275_FIXUP_DELL_XPS] = {
7054 .type = HDA_FIXUP_VERBS,
7055 .v.verbs = (const struct hda_verb[]) {
7056 /* Enables internal speaker */
7057 {0x20, AC_VERB_SET_COEF_INDEX, 0x1f},
7058 {0x20, AC_VERB_SET_PROC_COEF, 0x00c0},
7059 {0x20, AC_VERB_SET_COEF_INDEX, 0x30},
7060 {0x20, AC_VERB_SET_PROC_COEF, 0x00b1},
7061 {}
7062 }
7063 },
Hui Wang23adc192015-12-08 12:27:18 +08007064 [ALC293_FIXUP_LENOVO_SPK_NOISE] = {
7065 .type = HDA_FIXUP_FUNC,
7066 .v.func = alc_fixup_disable_aamix,
7067 .chained = true,
7068 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
7069 },
Kailang3694cb22015-12-28 11:35:24 +08007070 [ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY] = {
7071 .type = HDA_FIXUP_FUNC,
7072 .v.func = alc233_fixup_lenovo_line2_mic_hotkey,
7073 },
Kai-Heng Feng3b43b712016-02-25 15:19:38 +08007074 [ALC255_FIXUP_DELL_SPK_NOISE] = {
7075 .type = HDA_FIXUP_FUNC,
7076 .v.func = alc_fixup_disable_aamix,
7077 .chained = true,
7078 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
7079 },
Kailang Yangd1dd4212019-01-09 17:05:24 +08007080 [ALC225_FIXUP_DISABLE_MIC_VREF] = {
7081 .type = HDA_FIXUP_FUNC,
7082 .v.func = alc_fixup_disable_mic_vref,
7083 .chained = true,
7084 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
7085 },
David Henningsson2ae95572016-02-25 09:37:05 +01007086 [ALC225_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7087 .type = HDA_FIXUP_VERBS,
7088 .v.verbs = (const struct hda_verb[]) {
7089 /* Disable pass-through path for FRONT 14h */
7090 { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
7091 { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
7092 {}
7093 },
7094 .chained = true,
Kailang Yangd1dd4212019-01-09 17:05:24 +08007095 .chain_id = ALC225_FIXUP_DISABLE_MIC_VREF
David Henningsson2ae95572016-02-25 09:37:05 +01007096 },
Takashi Iwaif8839822016-02-25 14:31:59 +01007097 [ALC280_FIXUP_HP_HEADSET_MIC] = {
7098 .type = HDA_FIXUP_FUNC,
7099 .v.func = alc_fixup_disable_aamix,
7100 .chained = true,
7101 .chain_id = ALC269_FIXUP_HEADSET_MIC,
7102 },
Hui Wange549d192016-04-01 11:00:15 +08007103 [ALC221_FIXUP_HP_FRONT_MIC] = {
7104 .type = HDA_FIXUP_PINS,
7105 .v.pins = (const struct hda_pintbl[]) {
7106 { 0x19, 0x02a19020 }, /* Front Mic */
7107 { }
7108 },
7109 },
Sven Eckelmannc636b952016-04-11 16:55:26 +02007110 [ALC292_FIXUP_TPT460] = {
7111 .type = HDA_FIXUP_FUNC,
7112 .v.func = alc_fixup_tpt440_dock,
7113 .chained = true,
7114 .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE,
7115 },
Hui Wangdd9aa332016-08-01 10:20:32 +08007116 [ALC298_FIXUP_SPK_VOLUME] = {
7117 .type = HDA_FIXUP_FUNC,
7118 .v.func = alc298_fixup_speaker_volume,
Hui Wang59ec4b52016-08-04 15:28:04 +08007119 .chained = true,
Hui Wang2f726ae2017-03-31 10:31:40 +08007120 .chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
Hui Wangdd9aa332016-08-01 10:20:32 +08007121 },
Takashi Iwaie312a862018-03-06 12:14:17 +01007122 [ALC295_FIXUP_DISABLE_DAC3] = {
7123 .type = HDA_FIXUP_FUNC,
7124 .v.func = alc295_fixup_disable_dac3,
7125 },
Jaroslav Kyselad2cd7952019-11-29 15:40:27 +01007126 [ALC285_FIXUP_SPEAKER2_TO_DAC1] = {
7127 .type = HDA_FIXUP_FUNC,
7128 .v.func = alc285_fixup_speaker2_to_dac1,
Hui Wangc37c0ab2020-02-19 13:23:06 +08007129 .chained = true,
7130 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
Jaroslav Kyselad2cd7952019-11-29 15:40:27 +01007131 },
Kai-Heng Fengfd06c772016-08-30 15:36:34 +08007132 [ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {
7133 .type = HDA_FIXUP_PINS,
7134 .v.pins = (const struct hda_pintbl[]) {
7135 { 0x1b, 0x90170151 },
7136 { }
7137 },
7138 .chained = true,
7139 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
7140 },
Gabriele Mazzotta823ff162016-12-24 19:50:01 +01007141 [ALC269_FIXUP_ATIV_BOOK_8] = {
7142 .type = HDA_FIXUP_FUNC,
7143 .v.func = alc_fixup_auto_mute_via_amp,
7144 .chained = true,
7145 .chain_id = ALC269_FIXUP_NO_SHUTUP
7146 },
Kailang Yang9eb5d0e2017-01-17 15:40:25 +08007147 [ALC221_FIXUP_HP_MIC_NO_PRESENCE] = {
7148 .type = HDA_FIXUP_PINS,
7149 .v.pins = (const struct hda_pintbl[]) {
7150 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7151 { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7152 { }
7153 },
7154 .chained = true,
7155 .chain_id = ALC269_FIXUP_HEADSET_MODE
7156 },
Chris Chiuc1732ed2017-02-28 14:17:13 -06007157 [ALC256_FIXUP_ASUS_HEADSET_MODE] = {
7158 .type = HDA_FIXUP_FUNC,
7159 .v.func = alc_fixup_headset_mode,
7160 },
7161 [ALC256_FIXUP_ASUS_MIC] = {
7162 .type = HDA_FIXUP_PINS,
7163 .v.pins = (const struct hda_pintbl[]) {
7164 { 0x13, 0x90a60160 }, /* use as internal mic */
7165 { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
7166 { }
7167 },
7168 .chained = true,
7169 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7170 },
Chris Chiueeed4cd2017-02-28 14:17:15 -06007171 [ALC256_FIXUP_ASUS_AIO_GPIO2] = {
Takashi Iwaiae065f12018-06-19 23:00:03 +02007172 .type = HDA_FIXUP_FUNC,
7173 /* Set up GPIO2 for the speaker amp */
7174 .v.func = alc_fixup_gpio4,
Chris Chiueeed4cd2017-02-28 14:17:15 -06007175 },
Chris Chiu216d7ae2017-02-28 14:17:14 -06007176 [ALC233_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7177 .type = HDA_FIXUP_PINS,
7178 .v.pins = (const struct hda_pintbl[]) {
7179 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7180 { }
7181 },
7182 .chained = true,
7183 .chain_id = ALC269_FIXUP_HEADSET_MIC
7184 },
7185 [ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE] = {
7186 .type = HDA_FIXUP_VERBS,
7187 .v.verbs = (const struct hda_verb[]) {
7188 /* Enables internal speaker */
7189 {0x20, AC_VERB_SET_COEF_INDEX, 0x40},
7190 {0x20, AC_VERB_SET_PROC_COEF, 0x8800},
7191 {}
7192 },
7193 .chained = true,
7194 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
7195 },
Kailang Yangca169cc2017-04-25 16:17:40 +08007196 [ALC233_FIXUP_LENOVO_MULTI_CODECS] = {
7197 .type = HDA_FIXUP_FUNC,
7198 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
Kai-Heng Fengf73bbf62020-09-14 15:02:29 +08007199 .chained = true,
7200 .chain_id = ALC269_FIXUP_GPIO2
Kailang Yangca169cc2017-04-25 16:17:40 +08007201 },
Jian-Hong Panea5c7eb2019-04-01 11:25:05 +08007202 [ALC233_FIXUP_ACER_HEADSET_MIC] = {
7203 .type = HDA_FIXUP_VERBS,
7204 .v.verbs = (const struct hda_verb[]) {
7205 { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
7206 { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
7207 { }
7208 },
7209 .chained = true,
7210 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
7211 },
Hui Wangf33f79f2017-07-07 12:08:29 +08007212 [ALC294_FIXUP_LENOVO_MIC_LOCATION] = {
7213 .type = HDA_FIXUP_PINS,
7214 .v.pins = (const struct hda_pintbl[]) {
7215 /* Change the mic location from front to right, otherwise there are
7216 two front mics with the same name, pulseaudio can't handle them.
7217 This is just a temporary workaround, after applying this fixup,
7218 there will be one "Front Mic" and one "Mic" in this machine.
7219 */
7220 { 0x1a, 0x04a19040 },
7221 { }
7222 },
7223 },
Kailang Yang5f364132017-07-25 16:28:16 +08007224 [ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE] = {
7225 .type = HDA_FIXUP_PINS,
7226 .v.pins = (const struct hda_pintbl[]) {
7227 { 0x16, 0x0101102f }, /* Rear Headset HP */
7228 { 0x19, 0x02a1913c }, /* use as Front headset mic, without its own jack detect */
7229 { 0x1a, 0x01a19030 }, /* Rear Headset MIC */
7230 { 0x1b, 0x02011020 },
7231 { }
7232 },
7233 .chained = true,
Kai-Heng Feng52e4e362020-05-03 23:24:47 +08007234 .chain_id = ALC225_FIXUP_S3_POP_NOISE
7235 },
7236 [ALC225_FIXUP_S3_POP_NOISE] = {
7237 .type = HDA_FIXUP_FUNC,
7238 .v.func = alc225_fixup_s3_pop_noise,
7239 .chained = true,
Kailang Yang5f364132017-07-25 16:28:16 +08007240 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7241 },
PeiSen Houb84e8432017-09-01 15:11:56 +08007242 [ALC700_FIXUP_INTEL_REFERENCE] = {
7243 .type = HDA_FIXUP_VERBS,
7244 .v.verbs = (const struct hda_verb[]) {
7245 /* Enables internal speaker */
7246 {0x20, AC_VERB_SET_COEF_INDEX, 0x45},
7247 {0x20, AC_VERB_SET_PROC_COEF, 0x5289},
7248 {0x20, AC_VERB_SET_COEF_INDEX, 0x4A},
7249 {0x20, AC_VERB_SET_PROC_COEF, 0x001b},
7250 {0x58, AC_VERB_SET_COEF_INDEX, 0x00},
7251 {0x58, AC_VERB_SET_PROC_COEF, 0x3888},
7252 {0x20, AC_VERB_SET_COEF_INDEX, 0x6f},
7253 {0x20, AC_VERB_SET_PROC_COEF, 0x2c0b},
7254 {}
7255 }
7256 },
Kailang Yang92266652017-12-14 15:28:58 +08007257 [ALC274_FIXUP_DELL_BIND_DACS] = {
7258 .type = HDA_FIXUP_FUNC,
7259 .v.func = alc274_fixup_bind_dacs,
7260 .chained = true,
7261 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
7262 },
7263 [ALC274_FIXUP_DELL_AIO_LINEOUT_VERB] = {
7264 .type = HDA_FIXUP_PINS,
7265 .v.pins = (const struct hda_pintbl[]) {
7266 { 0x1b, 0x0401102f },
7267 { }
7268 },
7269 .chained = true,
7270 .chain_id = ALC274_FIXUP_DELL_BIND_DACS
7271 },
Takashi Iwai399c01a2020-05-26 08:24:06 +02007272 [ALC298_FIXUP_TPT470_DOCK_FIX] = {
Kailang Yang61fcf8e2018-02-02 15:26:46 +08007273 .type = HDA_FIXUP_FUNC,
7274 .v.func = alc_fixup_tpt470_dock,
7275 .chained = true,
7276 .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE
7277 },
Takashi Iwai399c01a2020-05-26 08:24:06 +02007278 [ALC298_FIXUP_TPT470_DOCK] = {
7279 .type = HDA_FIXUP_FUNC,
7280 .v.func = alc_fixup_tpt470_dacs,
7281 .chained = true,
7282 .chain_id = ALC298_FIXUP_TPT470_DOCK_FIX
7283 },
Kailang Yangae104a22018-02-05 16:07:20 +08007284 [ALC255_FIXUP_DUMMY_LINEOUT_VERB] = {
7285 .type = HDA_FIXUP_PINS,
7286 .v.pins = (const struct hda_pintbl[]) {
7287 { 0x14, 0x0201101f },
7288 { }
7289 },
7290 .chained = true,
7291 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
7292 },
Kailang Yangf0ba9d62018-03-16 11:46:08 +08007293 [ALC255_FIXUP_DELL_HEADSET_MIC] = {
7294 .type = HDA_FIXUP_PINS,
7295 .v.pins = (const struct hda_pintbl[]) {
7296 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7297 { }
7298 },
Hui Wang3ce0d5a2018-04-19 13:29:04 +08007299 .chained = true,
7300 .chain_id = ALC269_FIXUP_HEADSET_MIC
Kailang Yangf0ba9d62018-03-16 11:46:08 +08007301 },
Tom Bridenbbf8ff62018-05-29 17:34:20 +01007302 [ALC295_FIXUP_HP_X360] = {
7303 .type = HDA_FIXUP_FUNC,
7304 .v.func = alc295_fixup_hp_top_speakers,
7305 .chained = true,
7306 .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC3
Kailang Yang8a328ac2018-08-21 16:54:41 +08007307 },
7308 [ALC221_FIXUP_HP_HEADSET_MIC] = {
7309 .type = HDA_FIXUP_PINS,
7310 .v.pins = (const struct hda_pintbl[]) {
7311 { 0x19, 0x0181313f},
7312 { }
7313 },
7314 .chained = true,
7315 .chain_id = ALC269_FIXUP_HEADSET_MIC
7316 },
Hui Wangc4cfcf62018-11-26 14:17:16 +08007317 [ALC285_FIXUP_LENOVO_HEADPHONE_NOISE] = {
7318 .type = HDA_FIXUP_FUNC,
7319 .v.func = alc285_fixup_invalidate_dacs,
Hui Wang6ba189c2018-12-09 09:16:43 +08007320 .chained = true,
7321 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
Hui Wangc4cfcf62018-11-26 14:17:16 +08007322 },
Girija Kumar Kasinadhunie8ed64b2018-11-26 13:40:46 -05007323 [ALC295_FIXUP_HP_AUTO_MUTE] = {
7324 .type = HDA_FIXUP_FUNC,
7325 .v.func = alc_fixup_auto_mute_via_amp,
7326 },
Chris Chiu33aaebd2018-12-05 14:48:53 +08007327 [ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE] = {
7328 .type = HDA_FIXUP_PINS,
7329 .v.pins = (const struct hda_pintbl[]) {
7330 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7331 { }
7332 },
7333 .chained = true,
7334 .chain_id = ALC269_FIXUP_HEADSET_MIC
7335 },
Chris Chiud8ae4582018-12-07 17:17:11 +08007336 [ALC294_FIXUP_ASUS_MIC] = {
7337 .type = HDA_FIXUP_PINS,
7338 .v.pins = (const struct hda_pintbl[]) {
7339 { 0x13, 0x90a60160 }, /* use as internal mic */
7340 { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
7341 { }
7342 },
7343 .chained = true,
Kailang Yangef9ddb92020-07-10 15:31:11 +08007344 .chain_id = ALC269_FIXUP_HEADSET_MIC
Chris Chiud8ae4582018-12-07 17:17:11 +08007345 },
Jian-Hong Pan4e051102018-12-07 17:17:12 +08007346 [ALC294_FIXUP_ASUS_HEADSET_MIC] = {
7347 .type = HDA_FIXUP_PINS,
7348 .v.pins = (const struct hda_pintbl[]) {
Jian-Hong Pan82b01142018-12-27 16:46:31 +08007349 { 0x19, 0x01a1103c }, /* use as headset mic */
Jian-Hong Pan4e051102018-12-07 17:17:12 +08007350 { }
7351 },
7352 .chained = true,
Kailang Yangef9ddb92020-07-10 15:31:11 +08007353 .chain_id = ALC269_FIXUP_HEADSET_MIC
Jian-Hong Pan4e051102018-12-07 17:17:12 +08007354 },
7355 [ALC294_FIXUP_ASUS_SPK] = {
7356 .type = HDA_FIXUP_VERBS,
7357 .v.verbs = (const struct hda_verb[]) {
7358 /* Set EAPD high */
7359 { 0x20, AC_VERB_SET_COEF_INDEX, 0x40 },
7360 { 0x20, AC_VERB_SET_PROC_COEF, 0x8800 },
Kailang Yang473fbe132020-07-16 14:42:33 +08007361 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
7362 { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
Jian-Hong Pan4e051102018-12-07 17:17:12 +08007363 { }
7364 },
7365 .chained = true,
7366 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
7367 },
Jaroslav Kyselac8a9afa2019-03-14 09:21:08 +01007368 [ALC295_FIXUP_CHROME_BOOK] = {
Kailang Yange8547472018-11-28 15:32:45 +08007369 .type = HDA_FIXUP_FUNC,
Jaroslav Kyselac8a9afa2019-03-14 09:21:08 +01007370 .v.func = alc295_fixup_chromebook,
Kailang Yang8983eb62019-04-03 15:31:49 +08007371 .chained = true,
7372 .chain_id = ALC225_FIXUP_HEADSET_JACK
7373 },
7374 [ALC225_FIXUP_HEADSET_JACK] = {
7375 .type = HDA_FIXUP_FUNC,
7376 .v.func = alc_fixup_headset_jack,
Kailang Yange8547472018-11-28 15:32:45 +08007377 },
Jeremy Soller89e3a562019-01-30 16:12:31 -07007378 [ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
7379 .type = HDA_FIXUP_PINS,
7380 .v.pins = (const struct hda_pintbl[]) {
7381 { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7382 { }
7383 },
7384 .chained = true,
7385 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7386 },
Hui Wangc8c6ee62019-02-14 11:41:33 +08007387 [ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE] = {
7388 .type = HDA_FIXUP_VERBS,
7389 .v.verbs = (const struct hda_verb[]) {
7390 /* Disable PCBEEP-IN passthrough */
7391 { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
7392 { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
7393 { }
7394 },
7395 .chained = true,
7396 .chain_id = ALC285_FIXUP_LENOVO_HEADPHONE_NOISE
7397 },
Jian-Hong Pancbc05fd2019-03-13 17:33:24 +08007398 [ALC255_FIXUP_ACER_HEADSET_MIC] = {
7399 .type = HDA_FIXUP_PINS,
7400 .v.pins = (const struct hda_pintbl[]) {
7401 { 0x19, 0x03a11130 },
7402 { 0x1a, 0x90a60140 }, /* use as internal mic */
7403 { }
7404 },
7405 .chained = true,
7406 .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
7407 },
Kailang Yang136824e2019-03-14 16:22:45 +08007408 [ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE] = {
7409 .type = HDA_FIXUP_PINS,
7410 .v.pins = (const struct hda_pintbl[]) {
7411 { 0x16, 0x01011020 }, /* Rear Line out */
7412 { 0x19, 0x01a1913c }, /* use as Front headset mic, without its own jack detect */
7413 { }
7414 },
7415 .chained = true,
7416 .chain_id = ALC225_FIXUP_WYSE_AUTO_MUTE
7417 },
7418 [ALC225_FIXUP_WYSE_AUTO_MUTE] = {
7419 .type = HDA_FIXUP_FUNC,
7420 .v.func = alc_fixup_auto_mute_via_amp,
7421 .chained = true,
7422 .chain_id = ALC225_FIXUP_WYSE_DISABLE_MIC_VREF
7423 },
7424 [ALC225_FIXUP_WYSE_DISABLE_MIC_VREF] = {
7425 .type = HDA_FIXUP_FUNC,
7426 .v.func = alc_fixup_disable_mic_vref,
7427 .chained = true,
7428 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7429 },
Jian-Hong Pan667a8f72019-03-15 17:51:09 +08007430 [ALC286_FIXUP_ACER_AIO_HEADSET_MIC] = {
7431 .type = HDA_FIXUP_VERBS,
7432 .v.verbs = (const struct hda_verb[]) {
7433 { 0x20, AC_VERB_SET_COEF_INDEX, 0x4f },
7434 { 0x20, AC_VERB_SET_PROC_COEF, 0x5029 },
7435 { }
7436 },
7437 .chained = true,
7438 .chain_id = ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE
7439 },
Daniel Drake8c8967a2019-10-17 16:15:01 +08007440 [ALC256_FIXUP_ASUS_HEADSET_MIC] = {
7441 .type = HDA_FIXUP_PINS,
7442 .v.pins = (const struct hda_pintbl[]) {
7443 { 0x19, 0x03a11020 }, /* headset mic with jack detect */
7444 { }
7445 },
7446 .chained = true,
7447 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7448 },
Jian-Hong Pane1037352019-03-22 11:37:18 +08007449 [ALC256_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7450 .type = HDA_FIXUP_PINS,
7451 .v.pins = (const struct hda_pintbl[]) {
7452 { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
7453 { }
7454 },
7455 .chained = true,
7456 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7457 },
Bernhard Rosenkraenzere2a829b2019-03-05 00:38:19 +01007458 [ALC299_FIXUP_PREDATOR_SPK] = {
7459 .type = HDA_FIXUP_PINS,
7460 .v.pins = (const struct hda_pintbl[]) {
7461 { 0x21, 0x90170150 }, /* use as headset mic, without its own jack detect */
7462 { }
7463 }
7464 },
Jan-Marek Glogowskibd9c10b2019-09-15 16:57:28 +02007465 [ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE] = {
7466 .type = HDA_FIXUP_PINS,
7467 .v.pins = (const struct hda_pintbl[]) {
7468 { 0x19, 0x04a11040 },
7469 { 0x21, 0x04211020 },
7470 { }
7471 },
7472 .chained = true,
7473 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7474 },
Kailang Yange79c2262019-12-19 14:12:15 +08007475 [ALC289_FIXUP_DELL_SPK2] = {
7476 .type = HDA_FIXUP_PINS,
7477 .v.pins = (const struct hda_pintbl[]) {
7478 { 0x17, 0x90170130 }, /* bass spk */
7479 { }
7480 },
7481 .chained = true,
7482 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE
7483 },
7484 [ALC289_FIXUP_DUAL_SPK] = {
7485 .type = HDA_FIXUP_FUNC,
7486 .v.func = alc285_fixup_speaker2_to_dac1,
7487 .chained = true,
7488 .chain_id = ALC289_FIXUP_DELL_SPK2
7489 },
Chris Chiu48e01502019-12-30 11:11:18 +08007490 [ALC294_FIXUP_SPK2_TO_DAC1] = {
7491 .type = HDA_FIXUP_FUNC,
7492 .v.func = alc285_fixup_speaker2_to_dac1,
7493 .chained = true,
7494 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
7495 },
7496 [ALC294_FIXUP_ASUS_DUAL_SPK] = {
Jian-Hong Pan436e2552019-11-25 17:34:06 +08007497 .type = HDA_FIXUP_FUNC,
7498 /* The GPIO must be pulled to initialize the AMP */
7499 .v.func = alc_fixup_gpio4,
7500 .chained = true,
Chris Chiu48e01502019-12-30 11:11:18 +08007501 .chain_id = ALC294_FIXUP_SPK2_TO_DAC1
Jian-Hong Pan436e2552019-11-25 17:34:06 +08007502 },
Takashi Iwai6a6660d2020-09-03 10:33:00 +02007503 [ALC285_FIXUP_THINKPAD_X1_GEN7] = {
7504 .type = HDA_FIXUP_FUNC,
7505 .v.func = alc285_fixup_thinkpad_x1_gen7,
7506 .chained = true,
7507 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
7508 },
Kailang Yang76f7dec2020-02-10 16:30:26 +08007509 [ALC285_FIXUP_THINKPAD_HEADSET_JACK] = {
7510 .type = HDA_FIXUP_FUNC,
7511 .v.func = alc_fixup_headset_jack,
7512 .chained = true,
Takashi Iwai6a6660d2020-09-03 10:33:00 +02007513 .chain_id = ALC285_FIXUP_THINKPAD_X1_GEN7
Kailang Yang76f7dec2020-02-10 16:30:26 +08007514 },
Jian-Hong Pan8b33a132020-02-25 15:29:21 +08007515 [ALC294_FIXUP_ASUS_HPE] = {
7516 .type = HDA_FIXUP_VERBS,
7517 .v.verbs = (const struct hda_verb[]) {
7518 /* Set EAPD high */
7519 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
7520 { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
7521 { }
7522 },
7523 .chained = true,
7524 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
7525 },
Luke D Jonesc3cdf182020-09-07 20:19:59 +12007526 [ALC294_FIXUP_ASUS_GX502_PINS] = {
7527 .type = HDA_FIXUP_PINS,
7528 .v.pins = (const struct hda_pintbl[]) {
7529 { 0x19, 0x03a11050 }, /* front HP mic */
7530 { 0x1a, 0x01a11830 }, /* rear external mic */
7531 { 0x21, 0x03211020 }, /* front HP out */
7532 { }
7533 },
7534 .chained = true,
7535 .chain_id = ALC294_FIXUP_ASUS_GX502_VERBS
7536 },
7537 [ALC294_FIXUP_ASUS_GX502_VERBS] = {
7538 .type = HDA_FIXUP_VERBS,
7539 .v.verbs = (const struct hda_verb[]) {
7540 /* set 0x15 to HP-OUT ctrl */
7541 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
7542 /* unmute the 0x15 amp */
7543 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
7544 { }
7545 },
7546 .chained = true,
7547 .chain_id = ALC294_FIXUP_ASUS_GX502_HP
7548 },
7549 [ALC294_FIXUP_ASUS_GX502_HP] = {
7550 .type = HDA_FIXUP_FUNC,
7551 .v.func = alc294_fixup_gx502_hp,
7552 },
Takashi Iwai1b94e592020-05-12 09:32:03 +02007553 [ALC294_FIXUP_ASUS_COEF_1B] = {
7554 .type = HDA_FIXUP_VERBS,
7555 .v.verbs = (const struct hda_verb[]) {
7556 /* Set bit 10 to correct noisy output after reboot from
7557 * Windows 10 (due to pop noise reduction?)
7558 */
7559 { 0x20, AC_VERB_SET_COEF_INDEX, 0x1b },
7560 { 0x20, AC_VERB_SET_PROC_COEF, 0x4e4b },
7561 { }
7562 },
7563 },
Kai-Heng Fengf5a88b02020-03-27 12:46:25 +08007564 [ALC285_FIXUP_HP_GPIO_LED] = {
7565 .type = HDA_FIXUP_FUNC,
7566 .v.func = alc285_fixup_hp_gpio_led,
7567 },
Kailang Yang431e76c2020-04-07 14:40:20 +08007568 [ALC285_FIXUP_HP_MUTE_LED] = {
7569 .type = HDA_FIXUP_FUNC,
7570 .v.func = alc285_fixup_hp_mute_led,
7571 },
Kailang Yang24164f42020-04-07 14:52:42 +08007572 [ALC236_FIXUP_HP_MUTE_LED] = {
7573 .type = HDA_FIXUP_FUNC,
7574 .v.func = alc236_fixup_hp_mute_led,
7575 },
Mike Pozulp14425f12020-05-09 20:28:37 -07007576 [ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
7577 .type = HDA_FIXUP_VERBS,
7578 .v.verbs = (const struct hda_verb[]) {
7579 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc5 },
7580 { }
7581 },
7582 },
Chris Chiu9e433422020-05-12 14:15:24 +08007583 [ALC295_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7584 .type = HDA_FIXUP_PINS,
7585 .v.pins = (const struct hda_pintbl[]) {
7586 { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7587 { }
7588 },
7589 .chained = true,
7590 .chain_id = ALC269_FIXUP_HEADSET_MODE
7591 },
Jian-Hong Pan8eae7e92020-07-06 15:18:25 +08007592 [ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS] = {
7593 .type = HDA_FIXUP_PINS,
7594 .v.pins = (const struct hda_pintbl[]) {
7595 { 0x14, 0x90100120 }, /* use as internal speaker */
7596 { 0x18, 0x02a111f0 }, /* use as headset mic, without its own jack detect */
7597 { 0x1a, 0x01011020 }, /* use as line out */
7598 { },
7599 },
7600 .chained = true,
7601 .chain_id = ALC269_FIXUP_HEADSET_MIC
7602 },
Jian-Hong Pan6e15d122020-07-06 15:18:27 +08007603 [ALC269VC_FIXUP_ACER_HEADSET_MIC] = {
7604 .type = HDA_FIXUP_PINS,
7605 .v.pins = (const struct hda_pintbl[]) {
7606 { 0x18, 0x02a11030 }, /* use as headset mic */
7607 { }
7608 },
7609 .chained = true,
7610 .chain_id = ALC269_FIXUP_HEADSET_MIC
7611 },
Jian-Hong Pan781c90c2020-07-06 15:18:29 +08007612 [ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE] = {
7613 .type = HDA_FIXUP_PINS,
7614 .v.pins = (const struct hda_pintbl[]) {
7615 { 0x18, 0x01a11130 }, /* use as headset mic, without its own jack detect */
7616 { }
7617 },
7618 .chained = true,
7619 .chain_id = ALC269_FIXUP_HEADSET_MIC
7620 },
Armas Spann293a92c2020-07-24 16:08:37 +02007621 [ALC289_FIXUP_ASUS_GA401] = {
Takashi Iwaic84bfed2020-11-27 15:11:04 +01007622 .type = HDA_FIXUP_FUNC,
7623 .v.func = alc289_fixup_asus_ga401,
7624 .chained = true,
7625 .chain_id = ALC289_FIXUP_ASUS_GA502,
Armas Spannff536642020-07-11 13:05:57 +02007626 },
Armas Spann4b43d052020-07-24 16:06:16 +02007627 [ALC289_FIXUP_ASUS_GA502] = {
7628 .type = HDA_FIXUP_PINS,
7629 .v.pins = (const struct hda_pintbl[]) {
7630 { 0x19, 0x03a11020 }, /* headset mic with jack detect */
7631 { }
7632 },
7633 },
Jian-Hong Panf50a1212020-07-13 14:04:22 +08007634 [ALC256_FIXUP_ACER_MIC_NO_PRESENCE] = {
7635 .type = HDA_FIXUP_PINS,
7636 .v.pins = (const struct hda_pintbl[]) {
7637 { 0x19, 0x02a11120 }, /* use as headset mic, without its own jack detect */
7638 { }
7639 },
7640 .chained = true,
7641 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7642 },
Kailang Yang56496252020-07-29 15:09:27 +08007643 [ALC285_FIXUP_HP_GPIO_AMP_INIT] = {
7644 .type = HDA_FIXUP_FUNC,
7645 .v.func = alc285_fixup_hp_gpio_amp_init,
7646 .chained = true,
7647 .chain_id = ALC285_FIXUP_HP_GPIO_LED
7648 },
Huacai Chenf1ec5be2020-08-02 17:26:40 +08007649 [ALC269_FIXUP_CZC_B20] = {
7650 .type = HDA_FIXUP_PINS,
7651 .v.pins = (const struct hda_pintbl[]) {
7652 { 0x12, 0x411111f0 },
7653 { 0x14, 0x90170110 }, /* speaker */
7654 { 0x15, 0x032f1020 }, /* HP out */
7655 { 0x17, 0x411111f0 },
7656 { 0x18, 0x03ab1040 }, /* mic */
7657 { 0x19, 0xb7a7013f },
7658 { 0x1a, 0x0181305f },
7659 { 0x1b, 0x411111f0 },
7660 { 0x1d, 0x411111f0 },
7661 { 0x1e, 0x411111f0 },
7662 { }
7663 },
7664 .chain_id = ALC269_FIXUP_DMIC,
7665 },
7666 [ALC269_FIXUP_CZC_TMI] = {
7667 .type = HDA_FIXUP_PINS,
7668 .v.pins = (const struct hda_pintbl[]) {
7669 { 0x12, 0x4000c000 },
7670 { 0x14, 0x90170110 }, /* speaker */
7671 { 0x15, 0x0421401f }, /* HP out */
7672 { 0x17, 0x411111f0 },
7673 { 0x18, 0x04a19020 }, /* mic */
7674 { 0x19, 0x411111f0 },
7675 { 0x1a, 0x411111f0 },
7676 { 0x1b, 0x411111f0 },
7677 { 0x1d, 0x40448505 },
7678 { 0x1e, 0x411111f0 },
7679 { 0x20, 0x8000ffff },
7680 { }
7681 },
7682 .chain_id = ALC269_FIXUP_DMIC,
7683 },
7684 [ALC269_FIXUP_CZC_L101] = {
7685 .type = HDA_FIXUP_PINS,
7686 .v.pins = (const struct hda_pintbl[]) {
7687 { 0x12, 0x40000000 },
7688 { 0x14, 0x01014010 }, /* speaker */
7689 { 0x15, 0x411111f0 }, /* HP out */
7690 { 0x16, 0x411111f0 },
7691 { 0x18, 0x01a19020 }, /* mic */
7692 { 0x19, 0x02a19021 },
7693 { 0x1a, 0x0181302f },
7694 { 0x1b, 0x0221401f },
7695 { 0x1c, 0x411111f0 },
7696 { 0x1d, 0x4044c601 },
7697 { 0x1e, 0x411111f0 },
7698 { }
7699 },
7700 .chain_id = ALC269_FIXUP_DMIC,
7701 },
7702 [ALC269_FIXUP_LEMOTE_A1802] = {
7703 .type = HDA_FIXUP_PINS,
7704 .v.pins = (const struct hda_pintbl[]) {
7705 { 0x12, 0x40000000 },
7706 { 0x14, 0x90170110 }, /* speaker */
7707 { 0x17, 0x411111f0 },
7708 { 0x18, 0x03a19040 }, /* mic1 */
7709 { 0x19, 0x90a70130 }, /* mic2 */
7710 { 0x1a, 0x411111f0 },
7711 { 0x1b, 0x411111f0 },
7712 { 0x1d, 0x40489d2d },
7713 { 0x1e, 0x411111f0 },
7714 { 0x20, 0x0003ffff },
7715 { 0x21, 0x03214020 },
7716 { }
7717 },
7718 .chain_id = ALC269_FIXUP_DMIC,
7719 },
7720 [ALC269_FIXUP_LEMOTE_A190X] = {
7721 .type = HDA_FIXUP_PINS,
7722 .v.pins = (const struct hda_pintbl[]) {
7723 { 0x14, 0x99130110 }, /* speaker */
7724 { 0x15, 0x0121401f }, /* HP out */
7725 { 0x18, 0x01a19c20 }, /* rear mic */
7726 { 0x19, 0x99a3092f }, /* front mic */
7727 { 0x1b, 0x0201401f }, /* front lineout */
7728 { }
7729 },
7730 .chain_id = ALC269_FIXUP_DMIC,
7731 },
Kai-Heng Fenge2d2fde2020-08-07 16:05:12 +08007732 [ALC256_FIXUP_INTEL_NUC8_RUGGED] = {
7733 .type = HDA_FIXUP_PINS,
7734 .v.pins = (const struct hda_pintbl[]) {
7735 { 0x1b, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7736 { }
7737 },
7738 .chained = true,
7739 .chain_id = ALC269_FIXUP_HEADSET_MODE
7740 },
Hui Wangfc19d552020-09-09 10:00:41 +08007741 [ALC255_FIXUP_XIAOMI_HEADSET_MIC] = {
7742 .type = HDA_FIXUP_VERBS,
7743 .v.verbs = (const struct hda_verb[]) {
7744 { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
7745 { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
7746 { }
7747 },
7748 .chained = true,
Takashi Iwaic84bfed2020-11-27 15:11:04 +01007749 .chain_id = ALC289_FIXUP_ASUS_GA502
Hui Wangfc19d552020-09-09 10:00:41 +08007750 },
Hui Wang13468bf2020-09-28 16:01:17 +08007751 [ALC274_FIXUP_HP_MIC] = {
7752 .type = HDA_FIXUP_VERBS,
7753 .v.verbs = (const struct hda_verb[]) {
7754 { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
7755 { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
7756 { }
7757 },
7758 },
Kailang Yang8a8de09c2020-10-27 16:46:38 +08007759 [ALC274_FIXUP_HP_HEADSET_MIC] = {
7760 .type = HDA_FIXUP_FUNC,
7761 .v.func = alc274_fixup_hp_headset_mic,
7762 .chained = true,
7763 .chain_id = ALC274_FIXUP_HP_MIC
7764 },
Kailang Yangef9ce662020-11-03 15:40:35 +08007765 [ALC256_FIXUP_ASUS_HPE] = {
7766 .type = HDA_FIXUP_VERBS,
7767 .v.verbs = (const struct hda_verb[]) {
7768 /* Set EAPD high */
7769 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
7770 { 0x20, AC_VERB_SET_PROC_COEF, 0x7778 },
7771 { }
7772 },
7773 .chained = true,
7774 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
7775 },
Kailang Yang446b8182020-11-02 15:00:12 +08007776 [ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK] = {
7777 .type = HDA_FIXUP_FUNC,
7778 .v.func = alc_fixup_headset_jack,
7779 .chained = true,
7780 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
7781 },
Kailang Yanga0ccbc52020-11-06 15:20:38 +08007782 [ALC287_FIXUP_HP_GPIO_LED] = {
7783 .type = HDA_FIXUP_FUNC,
7784 .v.func = alc287_fixup_hp_gpio_led,
7785 },
Kailang Yang9e885772020-11-03 15:30:51 +08007786 [ALC256_FIXUP_HP_HEADSET_MIC] = {
7787 .type = HDA_FIXUP_FUNC,
7788 .v.func = alc274_fixup_hp_headset_mic,
7789 },
Kailang Yang92666d42020-11-19 17:04:21 +08007790 [ALC236_FIXUP_DELL_AIO_HEADSET_MIC] = {
7791 .type = HDA_FIXUP_FUNC,
7792 .v.func = alc_fixup_no_int_mic,
7793 .chained = true,
7794 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
7795 },
Chris Chiu34cdf402020-12-16 20:52:00 +08007796 [ALC282_FIXUP_ACER_DISABLE_LINEOUT] = {
7797 .type = HDA_FIXUP_PINS,
7798 .v.pins = (const struct hda_pintbl[]) {
7799 { 0x1b, 0x411111f0 },
7800 { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7801 { },
7802 },
7803 .chained = true,
7804 .chain_id = ALC269_FIXUP_HEADSET_MODE
7805 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02007806};
7807
7808static const struct snd_pci_quirk alc269_fixup_tbl[] = {
Marius Knausta6b92b62014-03-03 01:48:58 +01007809 SND_PCI_QUIRK(0x1025, 0x0283, "Acer TravelMate 8371", ALC269_FIXUP_INV_DMIC),
David Henningsson693b6132012-06-22 19:12:10 +02007810 SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC),
7811 SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC),
David Henningssonaaedfb42013-08-16 14:09:02 +02007812 SND_PCI_QUIRK(0x1025, 0x047c, "Acer AC700", ALC269_FIXUP_ACER_AC700),
Takashi Iwai78197172015-06-27 10:21:13 +02007813 SND_PCI_QUIRK(0x1025, 0x072d, "Acer Aspire V5-571G", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
7814 SND_PCI_QUIRK(0x1025, 0x080d, "Acer Aspire V5-122P", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
David Henningssonaaedfb42013-08-16 14:09:02 +02007815 SND_PCI_QUIRK(0x1025, 0x0740, "Acer AO725", ALC271_FIXUP_HP_GATE_MIC_JACK),
7816 SND_PCI_QUIRK(0x1025, 0x0742, "Acer AO756", ALC271_FIXUP_HP_GATE_MIC_JACK),
Simon South02322ac2016-03-02 23:10:44 -05007817 SND_PCI_QUIRK(0x1025, 0x0762, "Acer Aspire E1-472", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
Oleksij Rempelb1e89722013-12-04 20:50:53 +01007818 SND_PCI_QUIRK(0x1025, 0x0775, "Acer Aspire E1-572", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
Takashi Iwai1a22e772014-08-27 08:19:05 +02007819 SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS),
Chris Chiu705b65f2018-12-05 14:48:54 +08007820 SND_PCI_QUIRK(0x1025, 0x102b, "Acer Aspire C24-860", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE),
Jian-Hong Pan6e15d122020-07-06 15:18:27 +08007821 SND_PCI_QUIRK(0x1025, 0x1065, "Acer Aspire C20-820", ALC269VC_FIXUP_ACER_HEADSET_MIC),
Takashi Iwaib9c2fa52015-11-19 16:39:50 +01007822 SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK),
Chris Chiuc7531e32019-03-21 17:17:31 +08007823 SND_PCI_QUIRK(0x1025, 0x1099, "Acer Aspire E5-523G", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
7824 SND_PCI_QUIRK(0x1025, 0x110e, "Acer Aspire ES1-432", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
Bernhard Rosenkraenzere2a829b2019-03-05 00:38:19 +01007825 SND_PCI_QUIRK(0x1025, 0x1246, "Acer Predator Helios 500", ALC299_FIXUP_PREDATOR_SPK),
Jian-Hong Pan8eae7e92020-07-06 15:18:25 +08007826 SND_PCI_QUIRK(0x1025, 0x1247, "Acer vCopperbox", ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS),
Jian-Hong Pan781c90c2020-07-06 15:18:29 +08007827 SND_PCI_QUIRK(0x1025, 0x1248, "Acer Veriton N4660G", ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE),
Jian-Hong Pan667a8f72019-03-15 17:51:09 +08007828 SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
7829 SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
7830 SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
Jian-Hong Pan2733cce2019-03-21 16:39:04 +08007831 SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
Jian-Hong Panea5c7eb2019-04-01 11:25:05 +08007832 SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", ALC233_FIXUP_ACER_HEADSET_MIC),
Jian-Hong Pancbc05fd2019-03-13 17:33:24 +08007833 SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC),
Jian-Hong Panf50a1212020-07-13 14:04:22 +08007834 SND_PCI_QUIRK(0x1025, 0x1430, "Acer TravelMate B311R-31", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
David Henningssonaaedfb42013-08-16 14:09:02 +02007835 SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
Kailang Yang6ed11312015-10-26 15:37:39 +08007836 SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS),
Takashi Iwai86f799b2015-11-14 17:46:31 +01007837 SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X),
Takashi Iwaicf521032016-01-15 12:59:25 +01007838 SND_PCI_QUIRK(0x1028, 0x05be, "Dell Latitude E6540", ALC292_FIXUP_DELL_E7X),
Takashi Iwai8b99aba2015-06-15 11:59:32 +02007839 SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X),
7840 SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X),
David Henningsson0f4881d2013-12-20 16:08:13 +01007841 SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER),
David Henningsson73bdd592013-04-15 15:44:14 +02007842 SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
7843 SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
7844 SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
David Henningsson0f4881d2013-12-20 16:08:13 +01007845 SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
7846 SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
Takashi Iwai98070572016-01-12 21:06:39 +01007847 SND_PCI_QUIRK(0x1028, 0x062c, "Dell Latitude E5550", ALC292_FIXUP_DELL_E7X),
Takashi Iwai42755542015-06-29 10:56:53 +02007848 SND_PCI_QUIRK(0x1028, 0x062e, "Dell Latitude E7450", ALC292_FIXUP_DELL_E7X),
David Henningsson0f4881d2013-12-20 16:08:13 +01007849 SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),
Kailang Yanga22aa262014-04-23 17:34:28 +08007850 SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
7851 SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
Hui Wang831bfdf92015-06-26 12:35:17 +08007852 SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13),
Bastien Noceraafecb142016-04-18 11:10:42 +02007853 SND_PCI_QUIRK(0x1028, 0x0669, "Dell Optiplex 9020m", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
Takashi Iwai3a05d122015-07-29 09:04:52 +02007854 SND_PCI_QUIRK(0x1028, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK),
Kailang Yang8b724152014-12-17 17:08:59 +08007855 SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
Kailang Yangb7343042014-12-02 14:50:45 +08007856 SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
7857 SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
David Henningssonc04017e2015-12-15 14:44:03 +01007858 SND_PCI_QUIRK(0x1028, 0x06db, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
7859 SND_PCI_QUIRK(0x1028, 0x06dd, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
7860 SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
7861 SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
7862 SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
Kai-Heng Fengfd06c772016-08-30 15:36:34 +08007863 SND_PCI_QUIRK(0x1028, 0x0706, "Dell Inspiron 7559", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
Kai-Heng Feng3b43b712016-02-25 15:19:38 +08007864 SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE),
Takashi Iwaic0ca5ec2019-02-20 16:15:45 +01007865 SND_PCI_QUIRK(0x1028, 0x0738, "Dell Precision 5820", ALC269_FIXUP_NO_SHUTUP),
Kai-Heng Feng709ae622018-10-04 11:39:42 +08007866 SND_PCI_QUIRK(0x1028, 0x075c, "Dell XPS 27 7760", ALC298_FIXUP_SPK_VOLUME),
Hui Wangdd9aa332016-08-01 10:20:32 +08007867 SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME),
Takashi Iwaie312a862018-03-06 12:14:17 +01007868 SND_PCI_QUIRK(0x1028, 0x07b0, "Dell Precision 7520", ALC295_FIXUP_DISABLE_DAC3),
Takashi Iwai493de342017-02-28 17:27:57 +01007869 SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
Kailang Yang5f364132017-07-25 16:28:16 +08007870 SND_PCI_QUIRK(0x1028, 0x080c, "Dell WYSE", ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE),
Kailang Yang40e2c4e2018-02-02 15:13:09 +08007871 SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
7872 SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
Kailang Yangf0ba9d62018-03-16 11:46:08 +08007873 SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
7874 SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
Kailang Yangae104a22018-02-05 16:07:20 +08007875 SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB),
Kailang Yang136824e2019-03-14 16:22:45 +08007876 SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE),
Kailang Yangda484d02019-03-14 15:50:59 +08007877 SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE),
Kailang Yangc2a7c55a2019-01-03 15:53:39 +08007878 SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
Kailang Yange79c2262019-12-19 14:12:15 +08007879 SND_PCI_QUIRK(0x1028, 0x097e, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
7880 SND_PCI_QUIRK(0x1028, 0x097d, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
Kailang Yang78def222020-02-20 15:21:54 +08007881 SND_PCI_QUIRK(0x1028, 0x098d, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
7882 SND_PCI_QUIRK(0x1028, 0x09bf, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
Kailang Yang92666d42020-11-19 17:04:21 +08007883 SND_PCI_QUIRK(0x1028, 0x0a2e, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
7884 SND_PCI_QUIRK(0x1028, 0x0a30, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
Kailang Yang150927c2020-12-17 16:52:44 +08007885 SND_PCI_QUIRK(0x1028, 0x0a58, "Dell Precision 3650 Tower", ALC255_FIXUP_DELL_HEADSET_MIC),
Kailang Yanga22aa262014-04-23 17:34:28 +08007886 SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
7887 SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
Takashi Iwai08fb0d02013-01-10 17:33:58 +01007888 SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01007889 SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),
David Henningsson8e35cd42013-11-06 11:20:01 +01007890 SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED),
David Henningsson33f4acd2015-01-07 15:50:13 +01007891 SND_PCI_QUIRK(0x103c, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY),
Kailang Yangc60666b2014-02-21 16:23:35 +08007892 /* ALC282 */
Hui Wang7976eb42015-02-13 11:14:41 +08007893 SND_PCI_QUIRK(0x103c, 0x21f9, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yang8a02b162014-06-13 17:16:31 +08007894 SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yang8a02b162014-06-13 17:16:31 +08007895 SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007896 SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
7897 SND_PCI_QUIRK(0x103c, 0x2237, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
7898 SND_PCI_QUIRK(0x103c, 0x2238, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
7899 SND_PCI_QUIRK(0x103c, 0x2239, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007900 SND_PCI_QUIRK(0x103c, 0x224b, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
Kailang Yangc60666b2014-02-21 16:23:35 +08007901 SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08007902 SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7903 SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yang8a02b162014-06-13 17:16:31 +08007904 SND_PCI_QUIRK(0x103c, 0x226e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangeaa8e5e2014-11-21 15:49:11 +08007905 SND_PCI_QUIRK(0x103c, 0x2271, "HP", ALC286_FIXUP_HP_GPIO_LED),
TienFu Chenb4b33f92015-01-20 15:06:21 +01007906 SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC280_FIXUP_HP_DOCK_PINS),
TienFu Chen3271cb22015-02-10 09:09:41 +01007907 SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC280_FIXUP_HP_DOCK_PINS),
Kailang Yangc60666b2014-02-21 16:23:35 +08007908 SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08007909 SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7910 SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7911 SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08007912 SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Keith Packard98973f22015-07-15 12:14:39 -07007913 SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC280_FIXUP_HP_9480M),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007914 SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7915 SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yangc60666b2014-02-21 16:23:35 +08007916 /* ALC290 */
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007917 SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007918 SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007919 SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007920 SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7921 SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7922 SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7923 SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7924 SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007925 SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Jaroslav Kysela04d54662017-03-09 13:29:13 +01007926 SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED),
Kailang Yangc60666b2014-02-21 16:23:35 +08007927 SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08007928 SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7929 SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7930 SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007931 SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7932 SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yang9c5dc3b2014-06-19 16:11:36 +08007933 SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
Kailang Yangc60666b2014-02-21 16:23:35 +08007934 SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08007935 SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08007936 SND_PCI_QUIRK(0x103c, 0x228b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08007937 SND_PCI_QUIRK(0x103c, 0x228e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7938 SND_PCI_QUIRK(0x103c, 0x22c5, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08007939 SND_PCI_QUIRK(0x103c, 0x22c7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7940 SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yangc60666b2014-02-21 16:23:35 +08007941 SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Kailang Yang8a02b162014-06-13 17:16:31 +08007942 SND_PCI_QUIRK(0x103c, 0x2334, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7943 SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7944 SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7945 SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
Takashi Iwaif8839822016-02-25 14:31:59 +01007946 SND_PCI_QUIRK(0x103c, 0x221c, "HP EliteBook 755 G2", ALC280_FIXUP_HP_HEADSET_MIC),
Jaroslav Kysela167897f2019-03-13 13:40:15 +01007947 SND_PCI_QUIRK(0x103c, 0x802e, "HP Z240 SFF", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
7948 SND_PCI_QUIRK(0x103c, 0x802f, "HP Z240", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
Takashi Iwai563785e2018-11-12 09:43:12 +01007949 SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
Hui Wange549d192016-04-01 11:00:15 +08007950 SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC),
Tom Bridenbbf8ff62018-05-29 17:34:20 +01007951 SND_PCI_QUIRK(0x103c, 0x827e, "HP x360", ALC295_FIXUP_HP_X360),
Takashi Iwaiaeedad22020-11-28 10:00:15 +01007952 SND_PCI_QUIRK(0x103c, 0x827f, "HP x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
Jaroslav Kysela167897f2019-03-13 13:40:15 +01007953 SND_PCI_QUIRK(0x103c, 0x82bf, "HP G3 mini", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
7954 SND_PCI_QUIRK(0x103c, 0x82c0, "HP G3 mini premium", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
Alexandru Gagniuc56e40eb2018-08-04 11:44:44 -05007955 SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
Takashi Iwai190d0382019-08-13 17:39:56 +02007956 SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
Sam Bazleyd33cd422019-09-01 03:31:30 +01007957 SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
Kai-Heng Fengb2c22912020-06-17 18:29:02 +08007958 SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED),
7959 SND_PCI_QUIRK(0x103c, 0x8729, "HP", ALC285_FIXUP_HP_GPIO_LED),
Kailang Yang56496252020-07-29 15:09:27 +08007960 SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_AMP_INIT),
Qiu Wenbo08befca2020-10-02 20:44:54 +08007961 SND_PCI_QUIRK(0x103c, 0x8760, "HP", ALC285_FIXUP_HP_MUTE_LED),
Kailang Yang431e76c2020-04-07 14:40:20 +08007962 SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED),
Kailang Yang24164f42020-04-07 14:52:42 +08007963 SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED),
Kailang Yanga0ccbc52020-11-06 15:20:38 +08007964 SND_PCI_QUIRK(0x103c, 0x87f4, "HP", ALC287_FIXUP_HP_GPIO_LED),
7965 SND_PCI_QUIRK(0x103c, 0x87f5, "HP", ALC287_FIXUP_HP_GPIO_LED),
Chris Chiuc1732ed2017-02-28 14:17:13 -06007966 SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
Takashi Iwai7bba2152013-09-06 15:45:38 +02007967 SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
David Henningsson3e0d6112013-04-22 14:30:14 +02007968 SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Wandrille RONCE9cf65332018-12-19 14:52:44 +01007969 SND_PCI_QUIRK(0x1043, 0x10a1, "ASUS UX391UA", ALC294_FIXUP_ASUS_SPK),
Chris Chiuc1732ed2017-02-28 14:17:13 -06007970 SND_PCI_QUIRK(0x1043, 0x10c0, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
Takashi Iwai4eab0ea2017-06-06 12:33:17 +02007971 SND_PCI_QUIRK(0x1043, 0x10d0, "ASUS X540LA/X540LJ", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
David Henningsson3e0d6112013-04-22 14:30:14 +02007972 SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Takashi Iwai4eab0ea2017-06-06 12:33:17 +02007973 SND_PCI_QUIRK(0x1043, 0x11c0, "ASUS X556UR", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
Chris Chiu5cfca592020-12-07 15:27:55 +08007974 SND_PCI_QUIRK(0x1043, 0x1271, "ASUS X430UN", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
Takashi Iwai4eab0ea2017-06-06 12:33:17 +02007975 SND_PCI_QUIRK(0x1043, 0x1290, "ASUS X441SA", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
7976 SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
Chris Chiuc1732ed2017-02-28 14:17:13 -06007977 SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC),
7978 SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),
7979 SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
Oleksij Rempel2cede302013-11-27 17:12:03 +01007980 SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
Takashi Iwai23870832013-11-29 14:13:12 +01007981 SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
David Henningsson3e0d6112013-04-22 14:30:14 +02007982 SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
Chris Chiu48e01502019-12-30 11:11:18 +08007983 SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_DUAL_SPK),
Daniel Drake8c8967a2019-10-17 16:15:01 +08007984 SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC),
Adam Barber4963d662020-04-10 17:00:32 +08007985 SND_PCI_QUIRK(0x1043, 0x18f1, "Asus FX505DT", ALC256_FIXUP_ASUS_HEADSET_MIC),
Kailang Yang158ae2f2020-07-16 15:21:59 +08007986 SND_PCI_QUIRK(0x1043, 0x194e, "ASUS UX563FD", ALC294_FIXUP_ASUS_HPE),
Jian-Hong Pan8b33a132020-02-25 15:29:21 +08007987 SND_PCI_QUIRK(0x1043, 0x19ce, "ASUS B9450FA", ALC294_FIXUP_ASUS_HPE),
Jian-Hong Pan7900e812020-05-12 14:15:28 +08007988 SND_PCI_QUIRK(0x1043, 0x19e1, "ASUS UX581LV", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE),
Takashi Iwai017f2a12011-07-09 14:42:25 +02007989 SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
Chris Chiu28e8af82017-06-05 15:05:30 -06007990 SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC),
Takashi Iwai1b94e592020-05-12 09:32:03 +02007991 SND_PCI_QUIRK(0x1043, 0x1b11, "ASUS UX431DA", ALC294_FIXUP_ASUS_COEF_1B),
David Henningsson693b6132012-06-22 19:12:10 +02007992 SND_PCI_QUIRK(0x1043, 0x1b13, "Asus U41SV", ALC269_FIXUP_INV_DMIC),
Chris Chiu615966a2017-02-28 14:17:12 -06007993 SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
Takashi Iwai4eab0ea2017-06-06 12:33:17 +02007994 SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Chris Chiu7e413522020-12-09 12:57:30 +08007995 SND_PCI_QUIRK(0x1043, 0x125e, "ASUS Q524UQK", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
Chris Chiuc1732ed2017-02-28 14:17:13 -06007996 SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
Kailang Yangef9ce662020-11-03 15:40:35 +08007997 SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE),
Armas Spann4b43d052020-07-24 16:06:16 +02007998 SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502),
Armas Spann293a92c2020-07-24 16:08:37 +02007999 SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401),
Luke D Jonesc3cdf182020-09-07 20:19:59 +12008000 SND_PCI_QUIRK(0x1043, 0x1881, "ASUS Zephyrus S/M", ALC294_FIXUP_ASUS_GX502_PINS),
Chris Chiueeed4cd2017-02-28 14:17:15 -06008001 SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
Takashi Iwaiadabb3e2011-08-03 07:48:37 +02008002 SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
8003 SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
8004 SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
8005 SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
David Henningssond240d1d2013-04-15 12:50:02 +02008006 SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
Takashi Iwaif88abaa2014-02-07 12:07:59 +01008007 SND_PCI_QUIRK(0x104d, 0x90b5, "Sony VAIO Pro 11", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
David Henningsson88cfcf82013-10-11 10:18:45 +02008008 SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
Takashi Iwai1d045db2011-07-07 18:23:21 +02008009 SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
8010 SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
8011 SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
Takashi Iwaie9bd7d52014-05-21 11:06:49 +02008012 SND_PCI_QUIRK(0x104d, 0x9099, "Sony VAIO S13", ALC275_FIXUP_SONY_DISABLE_AAMIX),
Takashi Iwai24519912011-08-16 15:08:49 +02008013 SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),
Takashi Iwai4df3fd12015-06-29 08:38:02 +02008014 SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT),
Takashi Iwaicc7016a2015-04-08 20:47:55 +02008015 SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN),
Takashi Iwai88776f32015-05-01 09:20:34 +02008016 SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN),
Jan-Marek Glogowskifdcc9682018-02-14 11:29:15 +01008017 SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC),
David Henningsson2041d562014-06-13 11:15:44 +02008018 SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),
PeiSen Houb84e8432017-09-01 15:11:56 +08008019 SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE),
PeiSen Hou6fa38ef2020-07-27 13:56:47 +02008020 SND_PCI_QUIRK(0x10ec, 0x1230, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
YOKOTA Hiroshi0fca97a2018-07-01 18:30:01 +09008021 SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-SZ6", ALC269_FIXUP_HEADSET_MODE),
David Henningssona33cc482014-10-07 10:18:41 +02008022 SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
Mike Pozulp14425f12020-05-09 20:28:37 -07008023 SND_PCI_QUIRK(0x144d, 0xc169, "Samsung Notebook 9 Pen (NP930SBE-K01US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
8024 SND_PCI_QUIRK(0x144d, 0xc176, "Samsung Notebook 9 Pro (NP930MBE-K04US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
Mike Pozulpf70fff82020-08-13 21:53:44 -07008025 SND_PCI_QUIRK(0x144d, 0xc189, "Samsung Galaxy Flex Book (NT950QCG-X716)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
Adrien Crivelli8bcea6c2020-08-26 17:40:14 +09008026 SND_PCI_QUIRK(0x144d, 0xc18a, "Samsung Galaxy Book Ion (NP930XCJ-K01US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
8027 SND_PCI_QUIRK(0x144d, 0xc830, "Samsung Galaxy Book Ion (NT950XCJ-X716A)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
Gabriele Mazzotta823ff162016-12-24 19:50:01 +01008028 SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
Joonho Wohn568e4e82020-07-18 17:23:15 +09008029 SND_PCI_QUIRK(0x144d, 0xc812, "Samsung Notebook Pen S (NT950SBE-X58)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
Anisse Astierabaa22742016-08-24 09:14:13 +02008030 SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
8031 SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),
Anisse Astier8cd65272018-11-23 17:59:11 +01008032 SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC),
Chris Chiu6ca653e2020-12-22 23:04:58 +08008033 SND_PCI_QUIRK(0x152d, 0x1082, "Quanta NL3", ALC269_FIXUP_LIFEBOOK),
PeiSen Houb5acfe12020-11-11 08:58:59 +01008034 SND_PCI_QUIRK(0x1558, 0x1323, "Clevo N130ZU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
Jeremy Soller89e3a562019-01-30 16:12:31 -07008035 SND_PCI_QUIRK(0x1558, 0x1325, "System76 Darter Pro (darp5)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
PeiSen Houb5acfe12020-11-11 08:58:59 +01008036 SND_PCI_QUIRK(0x1558, 0x1401, "Clevo L140[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8037 SND_PCI_QUIRK(0x1558, 0x1403, "Clevo N140CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8038 SND_PCI_QUIRK(0x1558, 0x1404, "Clevo N150CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8039 SND_PCI_QUIRK(0x1558, 0x14a1, "Clevo L141MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8040 SND_PCI_QUIRK(0x1558, 0x4018, "Clevo NV40M[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8041 SND_PCI_QUIRK(0x1558, 0x4019, "Clevo NV40MZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8042 SND_PCI_QUIRK(0x1558, 0x4020, "Clevo NV40MB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8043 SND_PCI_QUIRK(0x1558, 0x40a1, "Clevo NL40GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8044 SND_PCI_QUIRK(0x1558, 0x40c1, "Clevo NL40[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8045 SND_PCI_QUIRK(0x1558, 0x40d1, "Clevo NL41DU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8046 SND_PCI_QUIRK(0x1558, 0x50a3, "Clevo NJ51GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8047 SND_PCI_QUIRK(0x1558, 0x50b3, "Clevo NK50S[BEZ]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8048 SND_PCI_QUIRK(0x1558, 0x50b6, "Clevo NK50S5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8049 SND_PCI_QUIRK(0x1558, 0x50b8, "Clevo NK50SZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8050 SND_PCI_QUIRK(0x1558, 0x50d5, "Clevo NP50D5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8051 SND_PCI_QUIRK(0x1558, 0x50f0, "Clevo NH50A[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8052 SND_PCI_QUIRK(0x1558, 0x50f3, "Clevo NH58DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8053 SND_PCI_QUIRK(0x1558, 0x5101, "Clevo S510WU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8054 SND_PCI_QUIRK(0x1558, 0x5157, "Clevo W517GU1", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8055 SND_PCI_QUIRK(0x1558, 0x51a1, "Clevo NS50MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8056 SND_PCI_QUIRK(0x1558, 0x70a1, "Clevo NB70T[HJK]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8057 SND_PCI_QUIRK(0x1558, 0x70b3, "Clevo NK70SB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8058 SND_PCI_QUIRK(0x1558, 0x8228, "Clevo NR40BU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8059 SND_PCI_QUIRK(0x1558, 0x8520, "Clevo NH50D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8060 SND_PCI_QUIRK(0x1558, 0x8521, "Clevo NH77D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8061 SND_PCI_QUIRK(0x1558, 0x8535, "Clevo NH50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8062 SND_PCI_QUIRK(0x1558, 0x8536, "Clevo NH79D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
Jeremy Soller80a50522019-05-07 17:11:08 -04008063 SND_PCI_QUIRK(0x1558, 0x8550, "System76 Gazelle (gaze14)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
Jeremy Soller891afcf2019-05-10 10:15:07 -04008064 SND_PCI_QUIRK(0x1558, 0x8551, "System76 Gazelle (gaze14)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8065 SND_PCI_QUIRK(0x1558, 0x8560, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
8066 SND_PCI_QUIRK(0x1558, 0x8561, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
PeiSen Houb5acfe12020-11-11 08:58:59 +01008067 SND_PCI_QUIRK(0x1558, 0x8668, "Clevo NP50B[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8068 SND_PCI_QUIRK(0x1558, 0x8680, "Clevo NJ50LU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8069 SND_PCI_QUIRK(0x1558, 0x8686, "Clevo NH50[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8070 SND_PCI_QUIRK(0x1558, 0x8a20, "Clevo NH55DCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8071 SND_PCI_QUIRK(0x1558, 0x8a51, "Clevo NH70RCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8072 SND_PCI_QUIRK(0x1558, 0x8d50, "Clevo NH55RCQ-M", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8073 SND_PCI_QUIRK(0x1558, 0x951d, "Clevo N950T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8074 SND_PCI_QUIRK(0x1558, 0x961d, "Clevo N960S[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8075 SND_PCI_QUIRK(0x1558, 0x971d, "Clevo N970T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8076 SND_PCI_QUIRK(0x1558, 0xa500, "Clevo NL53RU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
Kailang Yangca169cc2017-04-25 16:17:40 +08008077 SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
Hui Wangef0b3202020-04-27 11:00:39 +08008078 SND_PCI_QUIRK(0x17aa, 0x1048, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
Takashi Iwai1d045db2011-07-07 18:23:21 +02008079 SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
8080 SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
8081 SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
8082 SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
8083 SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
Takashi Iwaib590b382020-05-14 18:05:33 +02008084 SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST),
Felix Kaechelec8415a42012-08-06 23:02:01 +02008085 SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK),
Stefán Freyr84f98fd2012-10-19 22:46:00 +02008086 SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),
Philipp A. Mohrenweiser4407be62012-08-06 13:14:18 +02008087 SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),
David Henningsson108cc102012-07-20 10:37:25 +02008088 SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK),
David Henningssonaaedfb42013-08-16 14:09:02 +02008089 SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK),
Takashi Iwai9a811232015-12-09 15:17:43 +01008090 SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440),
Takashi Iwai1c37c222014-05-06 17:34:42 +02008091 SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK),
Takashi Iwaia12137e2014-06-27 12:14:35 +02008092 SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK),
Rick Sherman59a51a62015-08-18 21:04:30 -05008093 SND_PCI_QUIRK(0x17aa, 0x2211, "Thinkpad W541", ALC292_FIXUP_TPT440_DOCK),
Takashi Iwai6d169412014-10-07 17:27:02 +02008094 SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK),
Lukas Bossard7c215392014-10-29 18:31:07 +01008095 SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK),
David Henningssona4a9e082013-08-16 14:09:01 +02008096 SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Takashi Iwaib6903c02015-12-10 12:20:20 +01008097 SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK),
Laura Abbottd05ea7d2015-10-02 11:09:54 -07008098 SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK),
Yves-Alexis Perezc0278662015-04-11 09:31:35 +02008099 SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK),
Kailang Yang61fcf8e2018-02-02 15:26:46 +08008100 SND_PCI_QUIRK(0x17aa, 0x222d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
8101 SND_PCI_QUIRK(0x17aa, 0x222e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
Torsten Hilbrichdab38e42016-06-07 13:14:21 +02008102 SND_PCI_QUIRK(0x17aa, 0x2231, "Thinkpad T560", ALC292_FIXUP_TPT460),
Sven Eckelmannc636b952016-04-11 16:55:26 +02008103 SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460),
Kailang Yang61fcf8e2018-02-02 15:26:46 +08008104 SND_PCI_QUIRK(0x17aa, 0x2245, "Thinkpad T470", ALC298_FIXUP_TPT470_DOCK),
8105 SND_PCI_QUIRK(0x17aa, 0x2246, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
8106 SND_PCI_QUIRK(0x17aa, 0x2247, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
Dennis Wassenberge4c07b32018-03-08 13:17:54 +01008107 SND_PCI_QUIRK(0x17aa, 0x2249, "Thinkpad", ALC292_FIXUP_TPT460),
Kailang Yang61fcf8e2018-02-02 15:26:46 +08008108 SND_PCI_QUIRK(0x17aa, 0x224b, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
8109 SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
8110 SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
Benjamin Berg85981df2018-02-14 13:29:39 +01008111 SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Benjamin Poirier9774dc22020-07-03 17:00:04 +09008112 SND_PCI_QUIRK(0x17aa, 0x2292, "Thinkpad X1 Carbon 7th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
Hans de Goedeca707b32020-04-02 19:43:11 +02008113 SND_PCI_QUIRK(0x17aa, 0x22be, "Thinkpad X1 Carbon 8th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
Kailang Yang446b8182020-11-02 15:00:12 +08008114 SND_PCI_QUIRK(0x17aa, 0x22c1, "Thinkpad P1 Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
8115 SND_PCI_QUIRK(0x17aa, 0x22c2, "Thinkpad X1 Extreme Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
Kailang3694cb22015-12-28 11:35:24 +08008116 SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
Hui Wang6ef2f682016-03-11 12:04:02 +08008117 SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
Hui Wangf33f79f2017-07-07 12:08:29 +08008118 SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
Dennis Wassenbergbef33e12019-06-28 10:54:53 +02008119 SND_PCI_QUIRK(0x17aa, 0x3111, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
Hui Wange41fc8c2018-06-25 14:40:56 +08008120 SND_PCI_QUIRK(0x17aa, 0x312a, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
Kailang Yang65811832018-04-25 17:07:27 +08008121 SND_PCI_QUIRK(0x17aa, 0x312f, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
Hui Wang8da5bbf2017-12-22 11:17:46 +08008122 SND_PCI_QUIRK(0x17aa, 0x313c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
Hui Wang2a36c162019-09-04 13:53:27 +08008123 SND_PCI_QUIRK(0x17aa, 0x3151, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
Aaron Ma8a6c55d2019-10-24 19:44:39 +08008124 SND_PCI_QUIRK(0x17aa, 0x3176, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
8125 SND_PCI_QUIRK(0x17aa, 0x3178, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
David Henningsson56f27012016-01-11 09:33:14 +01008126 SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
Takashi Iwaifedb2242014-11-13 07:11:38 +01008127 SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
Michał Wadowski56df90b2019-05-14 16:58:00 +02008128 SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
David Henningssona4a9e082013-08-16 14:09:01 +02008129 SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Kailang Yang1bb3e062013-09-27 13:10:25 +02008130 SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC),
Takashi Iwaic497d9f2014-10-08 12:14:40 +02008131 SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK),
David Henningssoncd5302c2013-08-19 12:22:33 +02008132 SND_PCI_QUIRK(0x17aa, 0x5026, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Jo-Philipp Wichf2aa1112015-04-13 12:47:26 +02008133 SND_PCI_QUIRK(0x17aa, 0x5034, "Thinkpad T450", ALC292_FIXUP_TPT440_DOCK),
Sebastian Wicki80b311d2015-03-23 17:23:11 +01008134 SND_PCI_QUIRK(0x17aa, 0x5036, "Thinkpad T450s", ALC292_FIXUP_TPT440_DOCK),
Ansgar Hegerfeld09ea9972015-05-14 12:31:32 +02008135 SND_PCI_QUIRK(0x17aa, 0x503c, "Thinkpad L450", ALC292_FIXUP_TPT440_DOCK),
Conrad Kostecki037e1192016-04-26 10:08:10 +02008136 SND_PCI_QUIRK(0x17aa, 0x504a, "ThinkPad X260", ALC292_FIXUP_TPT440_DOCK),
Hui Wang23adc192015-12-08 12:27:18 +08008137 SND_PCI_QUIRK(0x17aa, 0x504b, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
Jaroslav Kysela0f087ee2016-06-24 15:13:16 +02008138 SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460),
Torsten Hilbrich9cd25742016-07-05 10:40:22 +02008139 SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460),
Jaroslav Kysela0f087ee2016-06-24 15:13:16 +02008140 SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460),
Kailang Yang61fcf8e2018-02-02 15:26:46 +08008141 SND_PCI_QUIRK(0x17aa, 0x505d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
8142 SND_PCI_QUIRK(0x17aa, 0x505f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
8143 SND_PCI_QUIRK(0x17aa, 0x5062, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
David Henningssoncd5302c2013-08-19 12:22:33 +02008144 SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Kailang Yang61fcf8e2018-02-02 15:26:46 +08008145 SND_PCI_QUIRK(0x17aa, 0x511e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
8146 SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
David Henningsson012e7eb2012-08-08 08:43:37 +02008147 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
Takashi Iwai1d045db2011-07-07 18:23:21 +02008148 SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
Ayman Bagabas0fbf21c2019-05-23 05:30:11 -04008149 SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS),
Huacai Chenf1ec5be2020-08-02 17:26:40 +08008150 SND_PCI_QUIRK(0x1b35, 0x1235, "CZC B20", ALC269_FIXUP_CZC_B20),
8151 SND_PCI_QUIRK(0x1b35, 0x1236, "CZC TMI", ALC269_FIXUP_CZC_TMI),
8152 SND_PCI_QUIRK(0x1b35, 0x1237, "CZC L101", ALC269_FIXUP_CZC_L101),
Anisse Astier02b504d2013-06-03 11:53:10 +02008153 SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */
Hui Wangfc19d552020-09-09 10:00:41 +08008154 SND_PCI_QUIRK(0x1d72, 0x1602, "RedmiBook", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
Hui Wang695d1ec2019-11-21 10:54:27 +08008155 SND_PCI_QUIRK(0x1d72, 0x1901, "RedmiBook 14", ALC256_FIXUP_ASUS_HEADSET_MIC),
Jan-Marek Glogowskibd9c10b2019-09-15 16:57:28 +02008156 SND_PCI_QUIRK(0x10ec, 0x118c, "Medion EE4254 MD62100", ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE),
Huacai Chenf1ec5be2020-08-02 17:26:40 +08008157 SND_PCI_QUIRK(0x1c06, 0x2013, "Lemote A1802", ALC269_FIXUP_LEMOTE_A1802),
8158 SND_PCI_QUIRK(0x1c06, 0x2015, "Lemote A190X", ALC269_FIXUP_LEMOTE_A190X),
Kai-Heng Fenge2d2fde2020-08-07 16:05:12 +08008159 SND_PCI_QUIRK(0x8086, 0x2080, "Intel NUC 8 Rugged", ALC256_FIXUP_INTEL_NUC8_RUGGED),
Takashi Iwaia4297b52011-08-23 18:40:12 +02008160
Takashi Iwaia7f3eed2012-02-16 13:03:18 +01008161#if 0
Takashi Iwaia4297b52011-08-23 18:40:12 +02008162 /* Below is a quirk table taken from the old code.
8163 * Basically the device should work as is without the fixup table.
8164 * If BIOS doesn't give a proper info, enable the corresponding
8165 * fixup entry.
Jesper Juhl7d7eb9e2012-04-12 22:11:25 +02008166 */
Takashi Iwaia4297b52011-08-23 18:40:12 +02008167 SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
8168 ALC269_FIXUP_AMIC),
8169 SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC),
Takashi Iwaia4297b52011-08-23 18:40:12 +02008170 SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC),
8171 SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC),
8172 SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC),
8173 SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269_FIXUP_AMIC),
8174 SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269_FIXUP_AMIC),
8175 SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269_FIXUP_AMIC),
8176 SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_FIXUP_AMIC),
8177 SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269_FIXUP_AMIC),
8178 SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_FIXUP_AMIC),
8179 SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_FIXUP_AMIC),
8180 SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_FIXUP_AMIC),
8181 SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_FIXUP_AMIC),
8182 SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_FIXUP_AMIC),
8183 SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_FIXUP_AMIC),
8184 SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_FIXUP_AMIC),
8185 SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_FIXUP_AMIC),
8186 SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_FIXUP_AMIC),
8187 SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_FIXUP_AMIC),
8188 SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_FIXUP_AMIC),
8189 SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_FIXUP_AMIC),
8190 SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_FIXUP_AMIC),
8191 SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_FIXUP_AMIC),
8192 SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_FIXUP_AMIC),
8193 SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_FIXUP_AMIC),
8194 SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_FIXUP_AMIC),
8195 SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_FIXUP_AMIC),
8196 SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_FIXUP_AMIC),
8197 SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_FIXUP_AMIC),
8198 SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_FIXUP_AMIC),
8199 SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_FIXUP_AMIC),
8200 SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_FIXUP_AMIC),
8201 SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_FIXUP_AMIC),
8202 SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_FIXUP_AMIC),
8203 SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_FIXUP_DMIC),
8204 SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_FIXUP_AMIC),
8205 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_AMIC),
8206 SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_FIXUP_DMIC),
8207 SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_FIXUP_DMIC),
8208#endif
8209 {}
8210};
8211
David Henningsson214eef72014-07-22 14:09:35 +02008212static const struct snd_pci_quirk alc269_fixup_vendor_tbl[] = {
8213 SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
8214 SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED),
8215 SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
8216 SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", ALC269_FIXUP_THINKPAD_ACPI),
Ayman Bagabas0fbf21c2019-05-23 05:30:11 -04008217 SND_PCI_QUIRK_VENDOR(0x19e5, "Huawei Matebook", ALC255_FIXUP_MIC_MUTE_LED),
David Henningsson214eef72014-07-22 14:09:35 +02008218 {}
8219};
8220
Takashi Iwai1727a772013-01-10 09:52:52 +01008221static const struct hda_model_fixup alc269_fixup_models[] = {
Takashi Iwaia4297b52011-08-23 18:40:12 +02008222 {.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"},
8223 {.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"},
Takashi Iwai6e72aa52012-06-25 10:52:25 +02008224 {.id = ALC269_FIXUP_STEREO_DMIC, .name = "alc269-dmic"},
8225 {.id = ALC271_FIXUP_DMIC, .name = "alc271-dmic"},
8226 {.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"},
David Henningsson7c478f02013-10-11 10:18:46 +02008227 {.id = ALC269_FIXUP_HEADSET_MIC, .name = "headset-mic"},
Takashi Iwaib0169512015-05-19 10:20:13 +02008228 {.id = ALC269_FIXUP_HEADSET_MODE, .name = "headset-mode"},
8229 {.id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, .name = "headset-mode-no-hp-mic"},
David Henningsson108cc102012-07-20 10:37:25 +02008230 {.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
Takashi Iwaib590b382020-05-14 18:05:33 +02008231 {.id = ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST, .name = "lenovo-dock-limit-boost"},
Takashi Iwai9f5c6fa2013-03-18 14:15:58 +01008232 {.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
Jaroslav Kysela04d54662017-03-09 13:29:13 +01008233 {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic1-led"},
David Henningssone32aa852013-06-17 11:04:02 +02008234 {.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
8235 {.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02008236 {.id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, .name = "dell-headset3"},
8237 {.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, .name = "dell-headset4"},
Kailang Yangbe8ef162014-04-08 15:19:49 +08008238 {.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},
Kailang Yang0202e992013-12-02 15:20:15 +08008239 {.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"},
Takashi Iwai1c37c222014-05-06 17:34:42 +02008240 {.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
Takashi Iwai9a811232015-12-09 15:17:43 +01008241 {.id = ALC292_FIXUP_TPT440, .name = "tpt440"},
Sven Eckelmannc636b952016-04-11 16:55:26 +02008242 {.id = ALC292_FIXUP_TPT460, .name = "tpt460"},
Takashi Iwai399c01a2020-05-26 08:24:06 +02008243 {.id = ALC298_FIXUP_TPT470_DOCK_FIX, .name = "tpt470-dock-fix"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02008244 {.id = ALC298_FIXUP_TPT470_DOCK, .name = "tpt470-dock"},
Takashi Iwaiba90d6a2017-05-22 16:38:47 +02008245 {.id = ALC233_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
Takashi Iwai28d1d6d2017-10-18 14:01:58 +02008246 {.id = ALC700_FIXUP_INTEL_REFERENCE, .name = "alc700-ref"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02008247 {.id = ALC269_FIXUP_SONY_VAIO, .name = "vaio"},
8248 {.id = ALC269_FIXUP_DELL_M101Z, .name = "dell-m101z"},
8249 {.id = ALC269_FIXUP_ASUS_G73JW, .name = "asus-g73jw"},
8250 {.id = ALC269_FIXUP_LENOVO_EAPD, .name = "lenovo-eapd"},
8251 {.id = ALC275_FIXUP_SONY_HWEQ, .name = "sony-hweq"},
8252 {.id = ALC269_FIXUP_PCM_44K, .name = "pcm44k"},
8253 {.id = ALC269_FIXUP_LIFEBOOK, .name = "lifebook"},
8254 {.id = ALC269_FIXUP_LIFEBOOK_EXTMIC, .name = "lifebook-extmic"},
8255 {.id = ALC269_FIXUP_LIFEBOOK_HP_PIN, .name = "lifebook-hp-pin"},
8256 {.id = ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC, .name = "lifebook-u7x7"},
8257 {.id = ALC269VB_FIXUP_AMIC, .name = "alc269vb-amic"},
8258 {.id = ALC269VB_FIXUP_DMIC, .name = "alc269vb-dmic"},
8259 {.id = ALC269_FIXUP_HP_MUTE_LED_MIC1, .name = "hp-mute-led-mic1"},
8260 {.id = ALC269_FIXUP_HP_MUTE_LED_MIC2, .name = "hp-mute-led-mic2"},
8261 {.id = ALC269_FIXUP_HP_MUTE_LED_MIC3, .name = "hp-mute-led-mic3"},
8262 {.id = ALC269_FIXUP_HP_GPIO_MIC1_LED, .name = "hp-gpio-mic1"},
8263 {.id = ALC269_FIXUP_HP_LINE1_MIC1_LED, .name = "hp-line1-mic1"},
8264 {.id = ALC269_FIXUP_NO_SHUTUP, .name = "noshutup"},
8265 {.id = ALC286_FIXUP_SONY_MIC_NO_PRESENCE, .name = "sony-nomic"},
8266 {.id = ALC269_FIXUP_ASPIRE_HEADSET_MIC, .name = "aspire-headset-mic"},
8267 {.id = ALC269_FIXUP_ASUS_X101, .name = "asus-x101"},
8268 {.id = ALC271_FIXUP_HP_GATE_MIC_JACK, .name = "acer-ao7xx"},
8269 {.id = ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572, .name = "acer-aspire-e1"},
8270 {.id = ALC269_FIXUP_ACER_AC700, .name = "acer-ac700"},
8271 {.id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST, .name = "limit-mic-boost"},
8272 {.id = ALC269VB_FIXUP_ASUS_ZENBOOK, .name = "asus-zenbook"},
8273 {.id = ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A, .name = "asus-zenbook-ux31a"},
8274 {.id = ALC269VB_FIXUP_ORDISSIMO_EVE2, .name = "ordissimo"},
8275 {.id = ALC282_FIXUP_ASUS_TX300, .name = "asus-tx300"},
8276 {.id = ALC283_FIXUP_INT_MIC, .name = "alc283-int-mic"},
8277 {.id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK, .name = "mono-speakers"},
8278 {.id = ALC290_FIXUP_SUBWOOFER_HSJACK, .name = "alc290-subwoofer"},
8279 {.id = ALC269_FIXUP_THINKPAD_ACPI, .name = "thinkpad"},
8280 {.id = ALC269_FIXUP_DMIC_THINKPAD_ACPI, .name = "dmic-thinkpad"},
8281 {.id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE, .name = "alc255-acer"},
8282 {.id = ALC255_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc255-asus"},
8283 {.id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc255-dell1"},
8284 {.id = ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "alc255-dell2"},
8285 {.id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc293-dell1"},
8286 {.id = ALC283_FIXUP_HEADSET_MIC, .name = "alc283-headset"},
Takashi Iwaib3802782018-11-26 17:47:46 +01008287 {.id = ALC255_FIXUP_MIC_MUTE_LED, .name = "alc255-dell-mute"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02008288 {.id = ALC282_FIXUP_ASPIRE_V5_PINS, .name = "aspire-v5"},
8289 {.id = ALC280_FIXUP_HP_GPIO4, .name = "hp-gpio4"},
8290 {.id = ALC286_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
8291 {.id = ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY, .name = "hp-gpio2-hotkey"},
8292 {.id = ALC280_FIXUP_HP_DOCK_PINS, .name = "hp-dock-pins"},
8293 {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic"},
8294 {.id = ALC280_FIXUP_HP_9480M, .name = "hp-9480m"},
8295 {.id = ALC288_FIXUP_DELL_HEADSET_MODE, .name = "alc288-dell-headset"},
8296 {.id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc288-dell1"},
8297 {.id = ALC288_FIXUP_DELL_XPS_13, .name = "alc288-dell-xps13"},
8298 {.id = ALC292_FIXUP_DELL_E7X, .name = "dell-e7x"},
8299 {.id = ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK, .name = "alc293-dell"},
8300 {.id = ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc298-dell1"},
8301 {.id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, .name = "alc298-dell-aio"},
8302 {.id = ALC275_FIXUP_DELL_XPS, .name = "alc275-dell-xps"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02008303 {.id = ALC293_FIXUP_LENOVO_SPK_NOISE, .name = "lenovo-spk-noise"},
8304 {.id = ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, .name = "lenovo-hotkey"},
8305 {.id = ALC255_FIXUP_DELL_SPK_NOISE, .name = "dell-spk-noise"},
Kailang Yang82aa0d72019-01-11 17:15:53 +08008306 {.id = ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc225-dell1"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02008307 {.id = ALC295_FIXUP_DISABLE_DAC3, .name = "alc295-disable-dac3"},
Jaroslav Kyselad2cd7952019-11-29 15:40:27 +01008308 {.id = ALC285_FIXUP_SPEAKER2_TO_DAC1, .name = "alc285-speaker2-to-dac1"},
Takashi Iwaia26d96c2018-06-26 15:09:25 +02008309 {.id = ALC280_FIXUP_HP_HEADSET_MIC, .name = "alc280-hp-headset"},
8310 {.id = ALC221_FIXUP_HP_FRONT_MIC, .name = "alc221-hp-mic"},
8311 {.id = ALC298_FIXUP_SPK_VOLUME, .name = "alc298-spk-volume"},
8312 {.id = ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER, .name = "dell-inspiron-7559"},
8313 {.id = ALC269_FIXUP_ATIV_BOOK_8, .name = "ativ-book"},
8314 {.id = ALC221_FIXUP_HP_MIC_NO_PRESENCE, .name = "alc221-hp-mic"},
8315 {.id = ALC256_FIXUP_ASUS_HEADSET_MODE, .name = "alc256-asus-headset"},
8316 {.id = ALC256_FIXUP_ASUS_MIC, .name = "alc256-asus-mic"},
8317 {.id = ALC256_FIXUP_ASUS_AIO_GPIO2, .name = "alc256-asus-aio"},
8318 {.id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc233-asus"},
8319 {.id = ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE, .name = "alc233-eapd"},
8320 {.id = ALC294_FIXUP_LENOVO_MIC_LOCATION, .name = "alc294-lenovo-mic"},
8321 {.id = ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE, .name = "alc225-wyse"},
8322 {.id = ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, .name = "alc274-dell-aio"},
8323 {.id = ALC255_FIXUP_DUMMY_LINEOUT_VERB, .name = "alc255-dummy-lineout"},
8324 {.id = ALC255_FIXUP_DELL_HEADSET_MIC, .name = "alc255-dell-headset"},
8325 {.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"},
Kailang Yang8983eb62019-04-03 15:31:49 +08008326 {.id = ALC225_FIXUP_HEADSET_JACK, .name = "alc-headset-jack"},
8327 {.id = ALC295_FIXUP_CHROME_BOOK, .name = "alc-chrome-book"},
Bernhard Rosenkraenzere2a829b2019-03-05 00:38:19 +01008328 {.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"},
Tomas Espeletaa2ef03f2019-08-09 16:37:54 +02008329 {.id = ALC298_FIXUP_HUAWEI_MBX_STEREO, .name = "huawei-mbx-stereo"},
Jan-Marek Glogowskibd9c10b2019-09-15 16:57:28 +02008330 {.id = ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, .name = "alc256-medion-headset"},
Mike Pozulp23dc9582020-08-16 21:32:17 -07008331 {.id = ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET, .name = "alc298-samsung-headphone"},
Hui Wangfc19d552020-09-09 10:00:41 +08008332 {.id = ALC255_FIXUP_XIAOMI_HEADSET_MIC, .name = "alc255-xiaomi-headset"},
Hui Wang13468bf2020-09-28 16:01:17 +08008333 {.id = ALC274_FIXUP_HP_MIC, .name = "alc274-hp-mic-detect"},
Takashi Iwai1d045db2011-07-07 18:23:21 +02008334 {}
8335};
Kailang Yangcfc5a842016-02-03 15:20:39 +08008336#define ALC225_STANDARD_PINS \
Kailang Yangcfc5a842016-02-03 15:20:39 +08008337 {0x21, 0x04211020}
Takashi Iwai1d045db2011-07-07 18:23:21 +02008338
Hui Wange8191a82015-04-24 13:39:59 +08008339#define ALC256_STANDARD_PINS \
8340 {0x12, 0x90a60140}, \
8341 {0x14, 0x90170110}, \
Hui Wange8191a82015-04-24 13:39:59 +08008342 {0x21, 0x02211020}
8343
David Henningssonfea185e2014-09-03 10:23:04 +02008344#define ALC282_STANDARD_PINS \
Hui Wang11580292015-08-03 11:03:49 +08008345 {0x14, 0x90170110}
Kailang Yange1e62b92015-04-08 16:01:22 +08008346
David Henningssonfea185e2014-09-03 10:23:04 +02008347#define ALC290_STANDARD_PINS \
Hui Wang11580292015-08-03 11:03:49 +08008348 {0x12, 0x99a30130}
David Henningssonfea185e2014-09-03 10:23:04 +02008349
8350#define ALC292_STANDARD_PINS \
8351 {0x14, 0x90170110}, \
Hui Wang11580292015-08-03 11:03:49 +08008352 {0x15, 0x0221401f}
Kailang Yang977e6272015-05-18 15:31:20 +08008353
Hui Wang3f6409702016-09-11 11:26:16 +08008354#define ALC295_STANDARD_PINS \
8355 {0x12, 0xb7a60130}, \
8356 {0x14, 0x90170110}, \
Hui Wang3f6409702016-09-11 11:26:16 +08008357 {0x21, 0x04211020}
8358
Woodrow Shen703867e2015-08-05 12:34:12 +08008359#define ALC298_STANDARD_PINS \
8360 {0x12, 0x90a60130}, \
8361 {0x21, 0x03211020}
8362
Hui Wange1918932014-05-26 16:22:44 +08008363static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
Kailang Yang8a328ac2018-08-21 16:54:41 +08008364 SND_HDA_PIN_QUIRK(0x10ec0221, 0x103c, "HP Workstation", ALC221_FIXUP_HP_HEADSET_MIC,
8365 {0x14, 0x01014020},
8366 {0x17, 0x90170110},
8367 {0x18, 0x02a11030},
8368 {0x19, 0x0181303F},
8369 {0x21, 0x0221102f}),
Chris Chiu5824ce82017-02-28 14:17:11 -06008370 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1025, "Acer", ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
8371 {0x12, 0x90a601c0},
8372 {0x14, 0x90171120},
8373 {0x21, 0x02211030}),
Chris Chiu615966a2017-02-28 14:17:12 -06008374 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
8375 {0x14, 0x90170110},
8376 {0x1b, 0x90a70130},
8377 {0x21, 0x03211020}),
8378 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
8379 {0x1a, 0x90a70130},
8380 {0x1b, 0x90170110},
8381 {0x21, 0x03211020}),
David Henningsson2ae95572016-02-25 09:37:05 +01008382 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
Kailang Yangcfc5a842016-02-03 15:20:39 +08008383 ALC225_STANDARD_PINS,
Hui Wang8a132092016-07-08 14:26:57 +08008384 {0x12, 0xb7a60130},
Kailang Yangcfc5a842016-02-03 15:20:39 +08008385 {0x14, 0x901701a0}),
David Henningsson2ae95572016-02-25 09:37:05 +01008386 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
Kailang Yangcfc5a842016-02-03 15:20:39 +08008387 ALC225_STANDARD_PINS,
Hui Wang8a132092016-07-08 14:26:57 +08008388 {0x12, 0xb7a60130},
Kailang Yangcfc5a842016-02-03 15:20:39 +08008389 {0x14, 0x901701b0}),
Hui Wang8a132092016-07-08 14:26:57 +08008390 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
8391 ALC225_STANDARD_PINS,
8392 {0x12, 0xb7a60150},
8393 {0x14, 0x901701a0}),
8394 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
8395 ALC225_STANDARD_PINS,
8396 {0x12, 0xb7a60150},
8397 {0x14, 0x901701b0}),
8398 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
8399 ALC225_STANDARD_PINS,
8400 {0x12, 0xb7a60130},
8401 {0x1b, 0x90170110}),
Kai-Heng Feng0ce48e12017-11-20 02:29:13 -05008402 SND_HDA_PIN_QUIRK(0x10ec0233, 0x8086, "Intel NUC Skull Canyon", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
8403 {0x1b, 0x01111010},
8404 {0x1e, 0x01451130},
8405 {0x21, 0x02211020}),
Hui Wang986376b2018-05-30 12:33:07 +08008406 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
8407 {0x12, 0x90a60140},
8408 {0x14, 0x90170110},
8409 {0x19, 0x02a11030},
8410 {0x21, 0x02211020}),
Hui Wange41fc8c2018-06-25 14:40:56 +08008411 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
8412 {0x14, 0x90170110},
8413 {0x19, 0x02a11030},
8414 {0x1a, 0x02a11040},
8415 {0x1b, 0x01014020},
8416 {0x21, 0x0221101f}),
Hui Wangc6b17f12018-07-06 15:14:11 +08008417 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
8418 {0x14, 0x90170110},
Hui Wangd06fb562018-10-10 11:57:25 +08008419 {0x19, 0x02a11030},
8420 {0x1a, 0x02a11040},
8421 {0x1b, 0x01011020},
8422 {0x21, 0x0221101f}),
8423 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
8424 {0x14, 0x90170110},
Hui Wangc6b17f12018-07-06 15:14:11 +08008425 {0x19, 0x02a11020},
8426 {0x1a, 0x02a11030},
8427 {0x21, 0x0221101f}),
Kailang Yang92666d42020-11-19 17:04:21 +08008428 SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
8429 {0x21, 0x02211010}),
Kailang Yang9e885772020-11-03 15:30:51 +08008430 SND_HDA_PIN_QUIRK(0x10ec0236, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
8431 {0x14, 0x90170110},
8432 {0x19, 0x02a11020},
8433 {0x21, 0x02211030}),
Hui Wangc77900e2014-09-03 11:31:07 +08008434 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
Hui Wangc77900e2014-09-03 11:31:07 +08008435 {0x14, 0x90170110},
Hui Wangc77900e2014-09-03 11:31:07 +08008436 {0x21, 0x02211020}),
David Henningsson76c21322014-06-24 14:46:54 +02008437 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang86c72d12016-05-25 12:12:32 +08008438 {0x14, 0x90170130},
8439 {0x21, 0x02211040}),
8440 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningsson76c21322014-06-24 14:46:54 +02008441 {0x12, 0x90a60140},
8442 {0x14, 0x90170110},
David Henningsson76c21322014-06-24 14:46:54 +02008443 {0x21, 0x02211020}),
8444 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8445 {0x12, 0x90a60160},
8446 {0x14, 0x90170120},
David Henningsson76c21322014-06-24 14:46:54 +02008447 {0x21, 0x02211030}),
8448 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang392c9da2016-09-26 10:59:38 +08008449 {0x14, 0x90170110},
8450 {0x1b, 0x02011020},
8451 {0x21, 0x0221101f}),
8452 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang6aecd872016-10-20 14:03:33 +08008453 {0x14, 0x90170110},
8454 {0x1b, 0x01011020},
8455 {0x21, 0x0221101f}),
8456 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningssoncba59972015-07-22 10:00:25 +02008457 {0x14, 0x90170130},
David Henningssoncba59972015-07-22 10:00:25 +02008458 {0x1b, 0x01014020},
David Henningssoncba59972015-07-22 10:00:25 +02008459 {0x21, 0x0221103f}),
8460 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang59ec4b52016-08-04 15:28:04 +08008461 {0x14, 0x90170130},
Hui Wang6aecd872016-10-20 14:03:33 +08008462 {0x1b, 0x01011020},
8463 {0x21, 0x0221103f}),
8464 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8465 {0x14, 0x90170130},
Hui Wang59ec4b52016-08-04 15:28:04 +08008466 {0x1b, 0x02011020},
8467 {0x21, 0x0221103f}),
8468 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Woodrow Shene9c28e12015-07-25 10:36:16 +08008469 {0x14, 0x90170150},
Woodrow Shene9c28e12015-07-25 10:36:16 +08008470 {0x1b, 0x02011020},
Woodrow Shene9c28e12015-07-25 10:36:16 +08008471 {0x21, 0x0221105f}),
8472 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Woodrow Shene9c28e12015-07-25 10:36:16 +08008473 {0x14, 0x90170110},
Woodrow Shene9c28e12015-07-25 10:36:16 +08008474 {0x1b, 0x01014020},
Woodrow Shene9c28e12015-07-25 10:36:16 +08008475 {0x21, 0x0221101f}),
8476 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningsson76c21322014-06-24 14:46:54 +02008477 {0x12, 0x90a60160},
8478 {0x14, 0x90170120},
8479 {0x17, 0x90170140},
David Henningsson76c21322014-06-24 14:46:54 +02008480 {0x21, 0x0321102f}),
8481 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8482 {0x12, 0x90a60160},
8483 {0x14, 0x90170130},
David Henningsson76c21322014-06-24 14:46:54 +02008484 {0x21, 0x02211040}),
8485 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8486 {0x12, 0x90a60160},
8487 {0x14, 0x90170140},
David Henningsson76c21322014-06-24 14:46:54 +02008488 {0x21, 0x02211050}),
8489 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8490 {0x12, 0x90a60170},
8491 {0x14, 0x90170120},
David Henningsson76c21322014-06-24 14:46:54 +02008492 {0x21, 0x02211030}),
8493 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8494 {0x12, 0x90a60170},
8495 {0x14, 0x90170130},
David Henningsson76c21322014-06-24 14:46:54 +02008496 {0x21, 0x02211040}),
Hui Wang70658b92015-03-06 14:03:57 +08008497 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wang70658b92015-03-06 14:03:57 +08008498 {0x12, 0x90a60170},
Hui Wang0a1f90a2016-01-13 11:51:38 +08008499 {0x14, 0x90171130},
8500 {0x21, 0x02211040}),
8501 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8502 {0x12, 0x90a60170},
Hui Wang70658b92015-03-06 14:03:57 +08008503 {0x14, 0x90170140},
Hui Wang70658b92015-03-06 14:03:57 +08008504 {0x21, 0x02211050}),
David Henningsson9b5a4e32015-05-11 14:04:14 +02008505 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5548", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningsson9b5a4e32015-05-11 14:04:14 +02008506 {0x12, 0x90a60180},
8507 {0x14, 0x90170130},
David Henningsson9b5a4e32015-05-11 14:04:14 +02008508 {0x21, 0x02211040}),
AceLan Kaof90d83b2016-06-03 14:45:25 +08008509 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5565", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8510 {0x12, 0x90a60180},
8511 {0x14, 0x90170120},
8512 {0x21, 0x02211030}),
Hui Wang989dbe42016-11-23 16:05:38 +08008513 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8514 {0x1b, 0x01011020},
8515 {0x21, 0x02211010}),
Chris Chiuc1732ed2017-02-28 14:17:13 -06008516 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
8517 {0x14, 0x90170110},
8518 {0x1b, 0x90a70130},
8519 {0x21, 0x04211020}),
8520 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
8521 {0x14, 0x90170110},
8522 {0x1b, 0x90a70130},
8523 {0x21, 0x03211020}),
Jian-Hong Pane1037352019-03-22 11:37:18 +08008524 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
Chris Chiua806ef12019-03-22 11:37:20 +08008525 {0x12, 0x90a60130},
8526 {0x14, 0x90170110},
8527 {0x21, 0x03211020}),
8528 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
Jian-Hong Pan6ac371a2019-03-22 11:37:22 +08008529 {0x12, 0x90a60130},
8530 {0x14, 0x90170110},
8531 {0x21, 0x04211020}),
8532 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
Jian-Hong Pane1037352019-03-22 11:37:18 +08008533 {0x1a, 0x90a70130},
8534 {0x1b, 0x90170110},
8535 {0x21, 0x03211020}),
Kailang Yang9e885772020-11-03 15:30:51 +08008536 SND_HDA_PIN_QUIRK(0x10ec0256, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
8537 {0x14, 0x90170110},
8538 {0x19, 0x02a11020},
8539 {0x21, 0x0221101f}),
Kailang Yang8a8de09c2020-10-27 16:46:38 +08008540 SND_HDA_PIN_QUIRK(0x10ec0274, 0x103c, "HP", ALC274_FIXUP_HP_HEADSET_MIC,
8541 {0x17, 0x90170110},
8542 {0x19, 0x03a11030},
8543 {0x21, 0x03211020}),
David Henningssoncf51eb92014-10-30 08:26:02 +01008544 SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
8545 {0x12, 0x90a60130},
David Henningssoncf51eb92014-10-30 08:26:02 +01008546 {0x14, 0x90170110},
8547 {0x15, 0x0421101f},
Hui Wang11580292015-08-03 11:03:49 +08008548 {0x1a, 0x04a11020}),
Hui Wang02796612014-09-03 11:31:11 +08008549 SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED,
8550 {0x12, 0x90a60140},
Hui Wang02796612014-09-03 11:31:11 +08008551 {0x14, 0x90170110},
8552 {0x15, 0x0421101f},
Hui Wang02796612014-09-03 11:31:11 +08008553 {0x18, 0x02811030},
Hui Wang02796612014-09-03 11:31:11 +08008554 {0x1a, 0x04a1103f},
Hui Wang11580292015-08-03 11:03:49 +08008555 {0x1b, 0x02011020}),
David Henningsson42304472014-07-22 11:42:17 +02008556 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP 15 Touchsmart", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008557 ALC282_STANDARD_PINS,
David Henningsson42304472014-07-22 11:42:17 +02008558 {0x12, 0x99a30130},
David Henningsson42304472014-07-22 11:42:17 +02008559 {0x19, 0x03a11020},
David Henningsson42304472014-07-22 11:42:17 +02008560 {0x21, 0x0321101f}),
Hui Wang2c609992014-09-03 11:31:08 +08008561 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008562 ALC282_STANDARD_PINS,
Hui Wang2c609992014-09-03 11:31:08 +08008563 {0x12, 0x99a30130},
Hui Wang2c609992014-09-03 11:31:08 +08008564 {0x19, 0x03a11020},
Hui Wang2c609992014-09-03 11:31:08 +08008565 {0x21, 0x03211040}),
8566 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008567 ALC282_STANDARD_PINS,
Hui Wang2c609992014-09-03 11:31:08 +08008568 {0x12, 0x99a30130},
Hui Wang2c609992014-09-03 11:31:08 +08008569 {0x19, 0x03a11030},
Hui Wang2c609992014-09-03 11:31:08 +08008570 {0x21, 0x03211020}),
8571 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008572 ALC282_STANDARD_PINS,
Hui Wang2c609992014-09-03 11:31:08 +08008573 {0x12, 0x99a30130},
Hui Wang2c609992014-09-03 11:31:08 +08008574 {0x19, 0x04a11020},
Hui Wang2c609992014-09-03 11:31:08 +08008575 {0x21, 0x0421101f}),
Hui Wang200afc02014-09-03 11:31:10 +08008576 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED,
David Henningssonaec856d2014-09-03 10:23:05 +02008577 ALC282_STANDARD_PINS,
Hui Wang200afc02014-09-03 11:31:10 +08008578 {0x12, 0x90a60140},
Hui Wang200afc02014-09-03 11:31:10 +08008579 {0x19, 0x04a11030},
Hui Wang200afc02014-09-03 11:31:10 +08008580 {0x21, 0x04211020}),
Chris Chiu34cdf402020-12-16 20:52:00 +08008581 SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
8582 ALC282_STANDARD_PINS,
8583 {0x12, 0x90a609c0},
8584 {0x18, 0x03a11830},
8585 {0x19, 0x04a19831},
8586 {0x1a, 0x0481303f},
8587 {0x1b, 0x04211020},
8588 {0x21, 0x0321101f}),
8589 SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
8590 ALC282_STANDARD_PINS,
8591 {0x12, 0x90a60940},
8592 {0x18, 0x03a11830},
8593 {0x19, 0x04a19831},
8594 {0x1a, 0x0481303f},
8595 {0x1b, 0x04211020},
8596 {0x21, 0x0321101f}),
David Henningsson76c21322014-06-24 14:46:54 +02008597 SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02008598 ALC282_STANDARD_PINS,
David Henningsson76c21322014-06-24 14:46:54 +02008599 {0x12, 0x90a60130},
David Henningsson76c21322014-06-24 14:46:54 +02008600 {0x21, 0x0321101f}),
8601 SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
8602 {0x12, 0x90a60160},
8603 {0x14, 0x90170120},
David Henningsson76c21322014-06-24 14:46:54 +02008604 {0x21, 0x02211030}),
Hui Wangbc262172014-09-03 11:31:05 +08008605 SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02008606 ALC282_STANDARD_PINS,
Hui Wangbc262172014-09-03 11:31:05 +08008607 {0x12, 0x90a60130},
Hui Wangbc262172014-09-03 11:31:05 +08008608 {0x19, 0x03a11020},
Hui Wangbc262172014-09-03 11:31:05 +08008609 {0x21, 0x0321101f}),
Kailang Yang607184c2020-12-11 14:17:09 +08008610 SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
8611 {0x14, 0x90170110},
8612 {0x19, 0x04a11040},
8613 {0x21, 0x04211020}),
Hui Wangc8c6ee62019-02-14 11:41:33 +08008614 SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
Hui Wangc4cfcf62018-11-26 14:17:16 +08008615 {0x12, 0x90a60130},
8616 {0x14, 0x90170110},
8617 {0x19, 0x04a11040},
8618 {0x21, 0x04211020}),
Hui Wangc72b9bf2020-12-05 13:11:30 +08008619 SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_HEADSET_JACK,
8620 {0x14, 0x90170110},
8621 {0x17, 0x90170111},
8622 {0x19, 0x03a11030},
8623 {0x21, 0x03211020}),
Chris Chiu33aaebd2018-12-05 14:48:53 +08008624 SND_HDA_PIN_QUIRK(0x10ec0286, 0x1025, "Acer", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
8625 {0x12, 0x90a60130},
8626 {0x17, 0x90170110},
8627 {0x21, 0x02211020}),
Takashi Iwaid44a6862018-06-19 23:04:03 +02008628 SND_HDA_PIN_QUIRK(0x10ec0288, 0x1028, "Dell", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
Kailang Yange1e62b92015-04-08 16:01:22 +08008629 {0x12, 0x90a60120},
Kailang Yange1e62b92015-04-08 16:01:22 +08008630 {0x14, 0x90170110},
Kailang Yange1e62b92015-04-08 16:01:22 +08008631 {0x21, 0x0321101f}),
Hui Wange4442bc2014-09-03 11:31:09 +08008632 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008633 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08008634 {0x15, 0x04211040},
Hui Wange4442bc2014-09-03 11:31:09 +08008635 {0x18, 0x90170112},
Hui Wang11580292015-08-03 11:03:49 +08008636 {0x1a, 0x04a11020}),
Hui Wange4442bc2014-09-03 11:31:09 +08008637 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008638 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08008639 {0x15, 0x04211040},
Hui Wange4442bc2014-09-03 11:31:09 +08008640 {0x18, 0x90170110},
Hui Wang11580292015-08-03 11:03:49 +08008641 {0x1a, 0x04a11020}),
Hui Wange4442bc2014-09-03 11:31:09 +08008642 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008643 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08008644 {0x15, 0x0421101f},
Hui Wang11580292015-08-03 11:03:49 +08008645 {0x1a, 0x04a11020}),
Hui Wange4442bc2014-09-03 11:31:09 +08008646 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008647 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08008648 {0x15, 0x04211020},
Hui Wang11580292015-08-03 11:03:49 +08008649 {0x1a, 0x04a11040}),
Hui Wange4442bc2014-09-03 11:31:09 +08008650 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008651 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08008652 {0x14, 0x90170110},
8653 {0x15, 0x04211020},
Hui Wang11580292015-08-03 11:03:49 +08008654 {0x1a, 0x04a11040}),
Hui Wange4442bc2014-09-03 11:31:09 +08008655 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008656 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08008657 {0x14, 0x90170110},
8658 {0x15, 0x04211020},
Hui Wang11580292015-08-03 11:03:49 +08008659 {0x1a, 0x04a11020}),
Hui Wange4442bc2014-09-03 11:31:09 +08008660 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
David Henningssonaec856d2014-09-03 10:23:05 +02008661 ALC290_STANDARD_PINS,
Hui Wange4442bc2014-09-03 11:31:09 +08008662 {0x14, 0x90170110},
8663 {0x15, 0x0421101f},
Hui Wang11580292015-08-03 11:03:49 +08008664 {0x1a, 0x04a11020}),
Hui Wange8818fa2014-09-03 11:31:04 +08008665 SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02008666 ALC292_STANDARD_PINS,
Hui Wange8818fa2014-09-03 11:31:04 +08008667 {0x12, 0x90a60140},
Hui Wange8818fa2014-09-03 11:31:04 +08008668 {0x16, 0x01014020},
Hui Wang11580292015-08-03 11:03:49 +08008669 {0x19, 0x01a19030}),
Hui Wange8818fa2014-09-03 11:31:04 +08008670 SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02008671 ALC292_STANDARD_PINS,
Hui Wange8818fa2014-09-03 11:31:04 +08008672 {0x12, 0x90a60140},
Hui Wange8818fa2014-09-03 11:31:04 +08008673 {0x16, 0x01014020},
8674 {0x18, 0x02a19031},
Hui Wang11580292015-08-03 11:03:49 +08008675 {0x19, 0x01a1903e}),
David Henningsson76c21322014-06-24 14:46:54 +02008676 SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02008677 ALC292_STANDARD_PINS,
Hui Wang11580292015-08-03 11:03:49 +08008678 {0x12, 0x90a60140}),
David Henningsson76c21322014-06-24 14:46:54 +02008679 SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02008680 ALC292_STANDARD_PINS,
David Henningsson76c21322014-06-24 14:46:54 +02008681 {0x13, 0x90a60140},
David Henningsson76c21322014-06-24 14:46:54 +02008682 {0x16, 0x21014020},
Hui Wang11580292015-08-03 11:03:49 +08008683 {0x19, 0x21a19030}),
David Henningssone03fdbd2014-06-27 08:41:59 +02008684 SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
David Henningssonaec856d2014-09-03 10:23:05 +02008685 ALC292_STANDARD_PINS,
Hui Wang11580292015-08-03 11:03:49 +08008686 {0x13, 0x90a60140}),
Jian-Hong Paneeacd802020-11-24 17:20:25 +08008687 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_HPE,
8688 {0x17, 0x90170110},
8689 {0x21, 0x04211020}),
Chris Chiud8ae4582018-12-07 17:17:11 +08008690 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_MIC,
8691 {0x14, 0x90170110},
8692 {0x1b, 0x90a70130},
8693 {0x21, 0x04211020}),
Jian-Hong Pan0bea4cc2018-12-07 17:17:13 +08008694 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
8695 {0x12, 0x90a60130},
8696 {0x17, 0x90170110},
Jian-Hong Pan8bb37a22019-02-21 17:00:18 +08008697 {0x21, 0x03211020}),
8698 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
8699 {0x12, 0x90a60130},
8700 {0x17, 0x90170110},
Jian-Hong Pan0bea4cc2018-12-07 17:17:13 +08008701 {0x21, 0x04211020}),
Takashi Iwai3887c262019-04-30 15:10:01 +02008702 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
8703 {0x12, 0x90a60130},
8704 {0x17, 0x90170110},
8705 {0x21, 0x03211020}),
Chris Chiu9e433422020-05-12 14:15:24 +08008706 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
Jian-Hong Panad97d662020-05-12 14:15:26 +08008707 {0x12, 0x90a60120},
8708 {0x17, 0x90170110},
8709 {0x21, 0x04211030}),
8710 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
Chris Chiu9e433422020-05-12 14:15:24 +08008711 {0x12, 0x90a60130},
8712 {0x17, 0x90170110},
8713 {0x21, 0x03211020}),
8714 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
8715 {0x12, 0x90a60130},
8716 {0x17, 0x90170110},
8717 {0x21, 0x03211020}),
Kailang Yangfbc57122019-07-15 10:41:50 +08008718 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
Kailang Yang0a29c572019-04-24 16:34:25 +08008719 {0x14, 0x90170110},
8720 {0x21, 0x04211020}),
Kailang Yangfbc57122019-07-15 10:41:50 +08008721 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
8722 {0x14, 0x90170110},
8723 {0x21, 0x04211030}),
Hui Wang3f6409702016-09-11 11:26:16 +08008724 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
Hui Wangf771d5b2016-10-18 10:59:09 +08008725 ALC295_STANDARD_PINS,
8726 {0x17, 0x21014020},
8727 {0x18, 0x21a19030}),
8728 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
8729 ALC295_STANDARD_PINS,
8730 {0x17, 0x21014040},
8731 {0x18, 0x21a19050}),
Hui Wang3f307832017-03-23 10:00:25 +08008732 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
8733 ALC295_STANDARD_PINS),
Kailang Yang977e6272015-05-18 15:31:20 +08008734 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
Woodrow Shen703867e2015-08-05 12:34:12 +08008735 ALC298_STANDARD_PINS,
Takashi Iwai9f502ff2015-08-05 12:09:45 +02008736 {0x17, 0x90170110}),
8737 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
8738 ALC298_STANDARD_PINS,
Woodrow Shen703867e2015-08-05 12:34:12 +08008739 {0x17, 0x90170140}),
8740 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
8741 ALC298_STANDARD_PINS,
Takashi Iwai9f502ff2015-08-05 12:09:45 +02008742 {0x17, 0x90170150}),
Kai-Heng Feng9f1bc2c42017-02-16 15:26:54 +08008743 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_SPK_VOLUME,
8744 {0x12, 0xb7a60140},
8745 {0x13, 0xb7a60150},
8746 {0x17, 0x90170110},
8747 {0x1a, 0x03011020},
8748 {0x21, 0x03211030}),
James McDonnell54324222019-09-16 14:53:38 +00008749 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
8750 {0x12, 0xb7a60140},
8751 {0x17, 0x90170110},
8752 {0x1a, 0x03a11030},
8753 {0x21, 0x03211020}),
Kailang Yangfcc6c872017-06-29 15:21:27 +08008754 SND_HDA_PIN_QUIRK(0x10ec0299, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
8755 ALC225_STANDARD_PINS,
8756 {0x12, 0xb7a60130},
Kailang Yangfcc6c872017-06-29 15:21:27 +08008757 {0x17, 0x90170110}),
Hui Wang573fcbf2020-06-08 19:55:41 +08008758 SND_HDA_PIN_QUIRK(0x10ec0623, 0x17aa, "Lenovo", ALC283_FIXUP_HEADSET_MIC,
8759 {0x14, 0x01014010},
8760 {0x17, 0x90170120},
8761 {0x18, 0x02a11030},
8762 {0x19, 0x02a1103f},
8763 {0x21, 0x0221101f}),
Hui Wange1918932014-05-26 16:22:44 +08008764 {}
8765};
Takashi Iwai1d045db2011-07-07 18:23:21 +02008766
Hui Wang7c0a6932019-08-16 14:27:40 +08008767/* This is the fallback pin_fixup_tbl for alc269 family, to make the tbl match
8768 * more machines, don't need to match all valid pins, just need to match
8769 * all the pins defined in the tbl. Just because of this reason, it is possible
8770 * that a single machine matches multiple tbls, so there is one limitation:
8771 * at most one tbl is allowed to define for the same vendor and same codec
8772 */
8773static const struct snd_hda_pin_quirk alc269_fallback_pin_fixup_tbl[] = {
8774 SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
8775 {0x19, 0x40000000},
8776 {0x1b, 0x40000000}),
Hui Wangaed8c7f2019-11-21 10:26:43 +08008777 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8778 {0x19, 0x40000000},
8779 {0x1a, 0x40000000}),
Hui Wangd64ebdb2019-11-21 10:26:44 +08008780 SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8781 {0x19, 0x40000000},
8782 {0x1a, 0x40000000}),
Hui Wang5815bdf2019-12-11 13:13:21 +08008783 SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
8784 {0x19, 0x40000000},
8785 {0x1a, 0x40000000}),
Hui Wang7c0a6932019-08-16 14:27:40 +08008786 {}
8787};
8788
Takashi Iwai546bb672012-03-07 08:37:19 +01008789static void alc269_fill_coef(struct hda_codec *codec)
Takashi Iwai1d045db2011-07-07 18:23:21 +02008790{
Kailang Yang526af6e2012-03-07 08:25:20 +01008791 struct alc_spec *spec = codec->spec;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008792 int val;
8793
Kailang Yang526af6e2012-03-07 08:25:20 +01008794 if (spec->codec_variant != ALC269_TYPE_ALC269VB)
Takashi Iwai546bb672012-03-07 08:37:19 +01008795 return;
Kailang Yang526af6e2012-03-07 08:25:20 +01008796
Takashi Iwai1bb7e432011-10-17 16:50:59 +02008797 if ((alc_get_coef0(codec) & 0x00ff) < 0x015) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02008798 alc_write_coef_idx(codec, 0xf, 0x960b);
8799 alc_write_coef_idx(codec, 0xe, 0x8817);
8800 }
8801
Takashi Iwai1bb7e432011-10-17 16:50:59 +02008802 if ((alc_get_coef0(codec) & 0x00ff) == 0x016) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02008803 alc_write_coef_idx(codec, 0xf, 0x960b);
8804 alc_write_coef_idx(codec, 0xe, 0x8814);
8805 }
8806
Takashi Iwai1bb7e432011-10-17 16:50:59 +02008807 if ((alc_get_coef0(codec) & 0x00ff) == 0x017) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02008808 /* Power up output pin */
Takashi Iwai98b24882014-08-18 13:47:50 +02008809 alc_update_coef_idx(codec, 0x04, 0, 1<<11);
Takashi Iwai1d045db2011-07-07 18:23:21 +02008810 }
8811
Takashi Iwai1bb7e432011-10-17 16:50:59 +02008812 if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02008813 val = alc_read_coef_idx(codec, 0xd);
Takashi Iwaif3ee07d2014-08-15 17:35:00 +02008814 if (val != -1 && (val & 0x0c00) >> 10 != 0x1) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02008815 /* Capless ramp up clock control */
8816 alc_write_coef_idx(codec, 0xd, val | (1<<10));
8817 }
8818 val = alc_read_coef_idx(codec, 0x17);
Takashi Iwaif3ee07d2014-08-15 17:35:00 +02008819 if (val != -1 && (val & 0x01c0) >> 6 != 0x4) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02008820 /* Class D power on reset */
8821 alc_write_coef_idx(codec, 0x17, val | (1<<7));
8822 }
8823 }
8824
Takashi Iwai98b24882014-08-18 13:47:50 +02008825 /* HP */
8826 alc_update_coef_idx(codec, 0x4, 0, 1<<11);
Takashi Iwai1d045db2011-07-07 18:23:21 +02008827}
8828
8829/*
8830 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02008831static int patch_alc269(struct hda_codec *codec)
8832{
8833 struct alc_spec *spec;
Takashi Iwai3de95172012-05-07 18:03:15 +02008834 int err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008835
Takashi Iwai3de95172012-05-07 18:03:15 +02008836 err = alc_alloc_spec(codec, 0x0b);
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008837 if (err < 0)
Takashi Iwai3de95172012-05-07 18:03:15 +02008838 return err;
8839
8840 spec = codec->spec;
Takashi Iwai08c189f2012-12-19 15:22:24 +01008841 spec->gen.shared_mic_vref_pin = 0x18;
Kailang Yang317d9312019-05-23 14:43:04 +08008842 codec->power_save_node = 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008843
Takashi Iwai225068a2015-05-29 10:42:14 +02008844#ifdef CONFIG_PM
8845 codec->patch_ops.suspend = alc269_suspend;
8846 codec->patch_ops.resume = alc269_resume;
8847#endif
Kailang Yangc2d6af52017-06-21 14:50:54 +08008848 spec->shutup = alc_default_shutup;
8849 spec->init_hook = alc_default_init;
Takashi Iwai225068a2015-05-29 10:42:14 +02008850
Takashi Iwai7639a062015-03-03 10:07:24 +01008851 switch (codec->core.vendor_id) {
Kailang Yang065380f2013-01-10 10:25:48 +01008852 case 0x10ec0269:
Takashi Iwai1d045db2011-07-07 18:23:21 +02008853 spec->codec_variant = ALC269_TYPE_ALC269VA;
Takashi Iwai1bb7e432011-10-17 16:50:59 +02008854 switch (alc_get_coef0(codec) & 0x00f0) {
8855 case 0x0010:
Takashi Iwai5100cd02014-02-15 10:03:19 +01008856 if (codec->bus->pci &&
8857 codec->bus->pci->subsystem_vendor == 0x1025 &&
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008858 spec->cdefine.platform_type == 1)
Takashi Iwai20ca0c32011-10-17 16:00:35 +02008859 err = alc_codec_rename(codec, "ALC271X");
Takashi Iwai1d045db2011-07-07 18:23:21 +02008860 spec->codec_variant = ALC269_TYPE_ALC269VB;
Takashi Iwai1bb7e432011-10-17 16:50:59 +02008861 break;
8862 case 0x0020:
Takashi Iwai5100cd02014-02-15 10:03:19 +01008863 if (codec->bus->pci &&
8864 codec->bus->pci->subsystem_vendor == 0x17aa &&
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008865 codec->bus->pci->subsystem_device == 0x21f3)
Takashi Iwai20ca0c32011-10-17 16:00:35 +02008866 err = alc_codec_rename(codec, "ALC3202");
Takashi Iwai1d045db2011-07-07 18:23:21 +02008867 spec->codec_variant = ALC269_TYPE_ALC269VC;
Takashi Iwai1bb7e432011-10-17 16:50:59 +02008868 break;
Kailang Yangadcc70b2012-05-25 08:08:38 +02008869 case 0x0030:
8870 spec->codec_variant = ALC269_TYPE_ALC269VD;
8871 break;
Takashi Iwai1bb7e432011-10-17 16:50:59 +02008872 default:
Takashi Iwai1d045db2011-07-07 18:23:21 +02008873 alc_fix_pll_init(codec, 0x20, 0x04, 15);
Takashi Iwai1bb7e432011-10-17 16:50:59 +02008874 }
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008875 if (err < 0)
8876 goto error;
Kailang Yangc2d6af52017-06-21 14:50:54 +08008877 spec->shutup = alc269_shutup;
Takashi Iwai546bb672012-03-07 08:37:19 +01008878 spec->init_hook = alc269_fill_coef;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008879 alc269_fill_coef(codec);
Kailang Yang065380f2013-01-10 10:25:48 +01008880 break;
8881
8882 case 0x10ec0280:
8883 case 0x10ec0290:
8884 spec->codec_variant = ALC269_TYPE_ALC280;
8885 break;
8886 case 0x10ec0282:
Kailang Yang065380f2013-01-10 10:25:48 +01008887 spec->codec_variant = ALC269_TYPE_ALC282;
Kailang Yang7b5c7a02014-03-18 16:15:54 +08008888 spec->shutup = alc282_shutup;
8889 spec->init_hook = alc282_init;
Kailang Yang065380f2013-01-10 10:25:48 +01008890 break;
Kailang Yang2af02be2013-08-22 10:03:50 +02008891 case 0x10ec0233:
8892 case 0x10ec0283:
8893 spec->codec_variant = ALC269_TYPE_ALC283;
8894 spec->shutup = alc283_shutup;
8895 spec->init_hook = alc283_init;
8896 break;
Kailang Yang065380f2013-01-10 10:25:48 +01008897 case 0x10ec0284:
8898 case 0x10ec0292:
8899 spec->codec_variant = ALC269_TYPE_ALC284;
8900 break;
Kailang Yang161ebf22013-10-24 11:36:33 +02008901 case 0x10ec0293:
Kailang Yang4731d5d2017-06-30 15:22:57 +08008902 spec->codec_variant = ALC269_TYPE_ALC293;
Kailang Yang161ebf22013-10-24 11:36:33 +02008903 break;
Kailang Yang7fc7d042013-04-25 11:04:43 +02008904 case 0x10ec0286:
Kailang Yang7c665932014-04-14 15:09:44 +08008905 case 0x10ec0288:
Kailang Yang7fc7d042013-04-25 11:04:43 +02008906 spec->codec_variant = ALC269_TYPE_ALC286;
8907 break;
Kailang Yang506b62c2014-12-18 17:07:44 +08008908 case 0x10ec0298:
8909 spec->codec_variant = ALC269_TYPE_ALC298;
8910 break;
Kailang Yangea04a1d2018-04-25 15:31:52 +08008911 case 0x10ec0235:
Kailang Yang1d04c9d2013-10-24 11:35:18 +02008912 case 0x10ec0255:
8913 spec->codec_variant = ALC269_TYPE_ALC255;
Kailang Yangab3b8e52018-04-25 16:05:27 +08008914 spec->shutup = alc256_shutup;
8915 spec->init_hook = alc256_init;
Kailang Yang1d04c9d2013-10-24 11:35:18 +02008916 break;
Kailang Yang736f20a2017-10-20 15:06:34 +08008917 case 0x10ec0236:
Kailang Yang4344aec2014-12-17 17:39:05 +08008918 case 0x10ec0256:
8919 spec->codec_variant = ALC269_TYPE_ALC256;
Kailang Yang4a219ef2017-06-16 16:54:35 +08008920 spec->shutup = alc256_shutup;
8921 spec->init_hook = alc256_init;
David Henningsson7d1b6e22015-04-21 10:48:46 +02008922 spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */
Kailang Yang4344aec2014-12-17 17:39:05 +08008923 break;
Kailang Yangf429e7e2017-12-05 15:38:24 +08008924 case 0x10ec0257:
8925 spec->codec_variant = ALC269_TYPE_ALC257;
Kailang Yang88d42b22018-03-14 16:08:57 +08008926 spec->shutup = alc256_shutup;
8927 spec->init_hook = alc256_init;
Kailang Yangf429e7e2017-12-05 15:38:24 +08008928 spec->gen.mixer_nid = 0;
8929 break;
Kailang Yang0a6f0602017-06-30 16:00:48 +08008930 case 0x10ec0215:
Kailang Yang7fbdcd82020-04-23 14:18:31 +08008931 case 0x10ec0245:
Kailang Yang0a6f0602017-06-30 16:00:48 +08008932 case 0x10ec0285:
Kailang Yang630e3612020-05-27 14:10:26 +08008933 case 0x10ec0287:
Kailang Yang0a6f0602017-06-30 16:00:48 +08008934 case 0x10ec0289:
8935 spec->codec_variant = ALC269_TYPE_ALC215;
Kailang Yang1b6832be2018-01-17 15:32:03 +08008936 spec->shutup = alc225_shutup;
8937 spec->init_hook = alc225_init;
Kailang Yang0a6f0602017-06-30 16:00:48 +08008938 spec->gen.mixer_nid = 0;
8939 break;
Kailang Yang42314302016-02-03 15:03:50 +08008940 case 0x10ec0225:
Kailang Yang7d727862016-05-24 16:46:07 +08008941 case 0x10ec0295:
Kailang Yang28f1f9b2017-01-04 14:49:07 +08008942 case 0x10ec0299:
Kailang Yang42314302016-02-03 15:03:50 +08008943 spec->codec_variant = ALC269_TYPE_ALC225;
Kailang Yangda911b12018-01-05 16:50:08 +08008944 spec->shutup = alc225_shutup;
8945 spec->init_hook = alc225_init;
Takashi Iwaic1350bf2017-12-27 09:03:45 +01008946 spec->gen.mixer_nid = 0; /* no loopback on ALC225, ALC295 and ALC299 */
Kailang Yang42314302016-02-03 15:03:50 +08008947 break;
Kailang Yangdcd4f0d2016-05-04 15:50:18 +08008948 case 0x10ec0234:
8949 case 0x10ec0274:
8950 case 0x10ec0294:
8951 spec->codec_variant = ALC269_TYPE_ALC294;
Hui Wang532a7782017-06-26 12:30:32 +08008952 spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */
Kailang Yang71683c32017-06-20 16:33:50 +08008953 alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */
Kailang Yang693abe12019-01-29 15:38:21 +08008954 spec->init_hook = alc294_init;
Kailang Yangdcd4f0d2016-05-04 15:50:18 +08008955 break;
Kailang Yang1078bef2018-11-08 16:36:15 +08008956 case 0x10ec0300:
8957 spec->codec_variant = ALC269_TYPE_ALC300;
8958 spec->gen.mixer_nid = 0; /* no loopback on ALC300 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02008959 break;
Kailang Yangf0778872019-10-24 15:13:32 +08008960 case 0x10ec0623:
8961 spec->codec_variant = ALC269_TYPE_ALC623;
8962 break;
Kailang Yang6fbae352016-05-30 16:44:20 +08008963 case 0x10ec0700:
8964 case 0x10ec0701:
8965 case 0x10ec0703:
Kailang Yang83629532019-05-02 16:03:26 +08008966 case 0x10ec0711:
Kailang Yang6fbae352016-05-30 16:44:20 +08008967 spec->codec_variant = ALC269_TYPE_ALC700;
8968 spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */
Kailang Yang2d7fe612017-11-22 15:21:32 +08008969 alc_update_coef_idx(codec, 0x4a, 1 << 15, 0); /* Combo jack auto trigger control */
Kailang Yang693abe12019-01-29 15:38:21 +08008970 spec->init_hook = alc294_init;
Kailang Yang6fbae352016-05-30 16:44:20 +08008971 break;
8972
Takashi Iwai1d045db2011-07-07 18:23:21 +02008973 }
8974
Kailang Yangad60d502013-06-28 12:03:01 +02008975 if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) {
Kailang Yang97a26572013-11-29 00:35:26 -05008976 spec->has_alc5505_dsp = 1;
Kailang Yangad60d502013-06-28 12:03:01 +02008977 spec->init_hook = alc5505_dsp_init;
8978 }
8979
Takashi Iwaic9af7532019-05-10 11:01:43 +02008980 alc_pre_init(codec);
8981
Takashi Iwaiefe55732018-06-15 11:55:02 +02008982 snd_hda_pick_fixup(codec, alc269_fixup_models,
8983 alc269_fixup_tbl, alc269_fixups);
Hui Wang0fc1e442019-08-16 14:27:39 +08008984 snd_hda_pick_pin_fixup(codec, alc269_pin_fixup_tbl, alc269_fixups, true);
Hui Wang7c0a6932019-08-16 14:27:40 +08008985 snd_hda_pick_pin_fixup(codec, alc269_fallback_pin_fixup_tbl, alc269_fixups, false);
Takashi Iwaiefe55732018-06-15 11:55:02 +02008986 snd_hda_pick_fixup(codec, NULL, alc269_fixup_vendor_tbl,
8987 alc269_fixups);
8988 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
8989
8990 alc_auto_parse_customize_define(codec);
8991
8992 if (has_cdefine_beep(codec))
8993 spec->gen.beep_nid = 0x01;
8994
Takashi Iwaia4297b52011-08-23 18:40:12 +02008995 /* automatic parse from the BIOS config */
8996 err = alc269_parse_auto_config(codec);
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02008997 if (err < 0)
8998 goto error;
Takashi Iwai1d045db2011-07-07 18:23:21 +02008999
Takashi Iwaifea80fa2018-06-20 12:52:46 +02009000 if (!spec->gen.no_analog && spec->gen.beep_nid && spec->gen.mixer_nid) {
9001 err = set_beep_amp(spec, spec->gen.mixer_nid, 0x04, HDA_INPUT);
9002 if (err < 0)
9003 goto error;
9004 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02009005
Takashi Iwai1727a772013-01-10 09:52:52 +01009006 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01009007
Takashi Iwai1d045db2011-07-07 18:23:21 +02009008 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02009009
9010 error:
9011 alc_free(codec);
9012 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02009013}
9014
9015/*
9016 * ALC861
9017 */
9018
Takashi Iwai1d045db2011-07-07 18:23:21 +02009019static int alc861_parse_auto_config(struct hda_codec *codec)
9020{
Takashi Iwai1d045db2011-07-07 18:23:21 +02009021 static const hda_nid_t alc861_ignore[] = { 0x1d, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02009022 static const hda_nid_t alc861_ssids[] = { 0x0e, 0x0f, 0x0b, 0 };
9023 return alc_parse_auto_config(codec, alc861_ignore, alc861_ssids);
Takashi Iwai1d045db2011-07-07 18:23:21 +02009024}
9025
Takashi Iwai1d045db2011-07-07 18:23:21 +02009026/* Pin config fixes */
9027enum {
Takashi Iwaie652f4c2012-02-13 11:56:25 +01009028 ALC861_FIXUP_FSC_AMILO_PI1505,
9029 ALC861_FIXUP_AMP_VREF_0F,
9030 ALC861_FIXUP_NO_JACK_DETECT,
9031 ALC861_FIXUP_ASUS_A6RP,
Takashi Iwai6ddf0fd2013-11-29 12:47:34 +01009032 ALC660_FIXUP_ASUS_W7J,
Takashi Iwai1d045db2011-07-07 18:23:21 +02009033};
9034
Takashi Iwai31150f22012-01-30 10:54:08 +01009035/* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */
9036static void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01009037 const struct hda_fixup *fix, int action)
Takashi Iwai31150f22012-01-30 10:54:08 +01009038{
9039 struct alc_spec *spec = codec->spec;
9040 unsigned int val;
9041
Takashi Iwai1727a772013-01-10 09:52:52 +01009042 if (action != HDA_FIXUP_ACT_INIT)
Takashi Iwai31150f22012-01-30 10:54:08 +01009043 return;
Takashi Iwaid3f02d62013-01-10 10:12:22 +01009044 val = snd_hda_codec_get_pin_target(codec, 0x0f);
Takashi Iwai31150f22012-01-30 10:54:08 +01009045 if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)))
9046 val |= AC_PINCTL_IN_EN;
9047 val |= AC_PINCTL_VREF_50;
Takashi Iwaicdd03ce2012-04-20 12:34:50 +02009048 snd_hda_set_pin_ctl(codec, 0x0f, val);
Takashi Iwai08c189f2012-12-19 15:22:24 +01009049 spec->gen.keep_vref_in_automute = 1;
Takashi Iwai31150f22012-01-30 10:54:08 +01009050}
9051
Takashi Iwaie652f4c2012-02-13 11:56:25 +01009052/* suppress the jack-detection */
9053static void alc_fixup_no_jack_detect(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01009054 const struct hda_fixup *fix, int action)
Takashi Iwaie652f4c2012-02-13 11:56:25 +01009055{
Takashi Iwai1727a772013-01-10 09:52:52 +01009056 if (action == HDA_FIXUP_ACT_PRE_PROBE)
Takashi Iwaie652f4c2012-02-13 11:56:25 +01009057 codec->no_jack_detect = 1;
Jesper Juhl7d7eb9e2012-04-12 22:11:25 +02009058}
Takashi Iwaie652f4c2012-02-13 11:56:25 +01009059
Takashi Iwai1727a772013-01-10 09:52:52 +01009060static const struct hda_fixup alc861_fixups[] = {
Takashi Iwaie652f4c2012-02-13 11:56:25 +01009061 [ALC861_FIXUP_FSC_AMILO_PI1505] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009062 .type = HDA_FIXUP_PINS,
9063 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai1d045db2011-07-07 18:23:21 +02009064 { 0x0b, 0x0221101f }, /* HP */
9065 { 0x0f, 0x90170310 }, /* speaker */
9066 { }
9067 }
9068 },
Takashi Iwaie652f4c2012-02-13 11:56:25 +01009069 [ALC861_FIXUP_AMP_VREF_0F] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009070 .type = HDA_FIXUP_FUNC,
Takashi Iwai31150f22012-01-30 10:54:08 +01009071 .v.func = alc861_fixup_asus_amp_vref_0f,
Takashi Iwai3b25eb62012-01-25 09:55:46 +01009072 },
Takashi Iwaie652f4c2012-02-13 11:56:25 +01009073 [ALC861_FIXUP_NO_JACK_DETECT] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009074 .type = HDA_FIXUP_FUNC,
Takashi Iwaie652f4c2012-02-13 11:56:25 +01009075 .v.func = alc_fixup_no_jack_detect,
9076 },
9077 [ALC861_FIXUP_ASUS_A6RP] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009078 .type = HDA_FIXUP_FUNC,
Takashi Iwaie652f4c2012-02-13 11:56:25 +01009079 .v.func = alc861_fixup_asus_amp_vref_0f,
9080 .chained = true,
9081 .chain_id = ALC861_FIXUP_NO_JACK_DETECT,
Takashi Iwai6ddf0fd2013-11-29 12:47:34 +01009082 },
9083 [ALC660_FIXUP_ASUS_W7J] = {
9084 .type = HDA_FIXUP_VERBS,
9085 .v.verbs = (const struct hda_verb[]) {
9086 /* ASUS W7J needs a magic pin setup on unused NID 0x10
9087 * for enabling outputs
9088 */
9089 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
9090 { }
9091 },
Takashi Iwaie652f4c2012-02-13 11:56:25 +01009092 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02009093};
9094
9095static const struct snd_pci_quirk alc861_fixup_tbl[] = {
Takashi Iwai6ddf0fd2013-11-29 12:47:34 +01009096 SND_PCI_QUIRK(0x1043, 0x1253, "ASUS W7J", ALC660_FIXUP_ASUS_W7J),
Takashi Iwaie7ca2372013-12-02 15:27:19 +01009097 SND_PCI_QUIRK(0x1043, 0x1263, "ASUS Z35HL", ALC660_FIXUP_ASUS_W7J),
Takashi Iwaie652f4c2012-02-13 11:56:25 +01009098 SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP),
9099 SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", ALC861_FIXUP_AMP_VREF_0F),
9100 SND_PCI_QUIRK(0x1462, 0x7254, "HP DX2200", ALC861_FIXUP_NO_JACK_DETECT),
9101 SND_PCI_QUIRK(0x1584, 0x2b01, "Haier W18", ALC861_FIXUP_AMP_VREF_0F),
9102 SND_PCI_QUIRK(0x1584, 0x0000, "Uniwill ECS M31EI", ALC861_FIXUP_AMP_VREF_0F),
9103 SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", ALC861_FIXUP_FSC_AMILO_PI1505),
Takashi Iwai1d045db2011-07-07 18:23:21 +02009104 {}
9105};
9106
9107/*
9108 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02009109static int patch_alc861(struct hda_codec *codec)
9110{
9111 struct alc_spec *spec;
Takashi Iwai1d045db2011-07-07 18:23:21 +02009112 int err;
9113
Takashi Iwai3de95172012-05-07 18:03:15 +02009114 err = alc_alloc_spec(codec, 0x15);
9115 if (err < 0)
9116 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02009117
Takashi Iwai3de95172012-05-07 18:03:15 +02009118 spec = codec->spec;
Takashi Iwai2722b532019-08-22 09:55:37 +02009119 if (has_cdefine_beep(codec))
9120 spec->gen.beep_nid = 0x23;
Takashi Iwai1d045db2011-07-07 18:23:21 +02009121
Takashi Iwai225068a2015-05-29 10:42:14 +02009122#ifdef CONFIG_PM
9123 spec->power_hook = alc_power_eapd;
9124#endif
9125
Takashi Iwaic9af7532019-05-10 11:01:43 +02009126 alc_pre_init(codec);
9127
Takashi Iwai1727a772013-01-10 09:52:52 +01009128 snd_hda_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);
9129 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai1d045db2011-07-07 18:23:21 +02009130
Takashi Iwaicb4e4822011-08-23 17:34:25 +02009131 /* automatic parse from the BIOS config */
9132 err = alc861_parse_auto_config(codec);
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02009133 if (err < 0)
9134 goto error;
Takashi Iwai1d045db2011-07-07 18:23:21 +02009135
Takashi Iwaifea80fa2018-06-20 12:52:46 +02009136 if (!spec->gen.no_analog) {
9137 err = set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
9138 if (err < 0)
9139 goto error;
9140 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02009141
Takashi Iwai1727a772013-01-10 09:52:52 +01009142 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01009143
Takashi Iwai1d045db2011-07-07 18:23:21 +02009144 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02009145
9146 error:
9147 alc_free(codec);
9148 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02009149}
9150
9151/*
9152 * ALC861-VD support
9153 *
9154 * Based on ALC882
9155 *
9156 * In addition, an independent DAC
9157 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02009158static int alc861vd_parse_auto_config(struct hda_codec *codec)
9159{
Takashi Iwai1d045db2011-07-07 18:23:21 +02009160 static const hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02009161 static const hda_nid_t alc861vd_ssids[] = { 0x15, 0x1b, 0x14, 0 };
9162 return alc_parse_auto_config(codec, alc861vd_ignore, alc861vd_ssids);
Takashi Iwai1d045db2011-07-07 18:23:21 +02009163}
9164
Takashi Iwai1d045db2011-07-07 18:23:21 +02009165enum {
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02009166 ALC660VD_FIX_ASUS_GPIO1,
9167 ALC861VD_FIX_DALLAS,
Takashi Iwai1d045db2011-07-07 18:23:21 +02009168};
9169
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02009170/* exclude VREF80 */
9171static void alc861vd_fixup_dallas(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01009172 const struct hda_fixup *fix, int action)
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02009173{
Takashi Iwai1727a772013-01-10 09:52:52 +01009174 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwaib78562b2012-12-17 20:06:49 +01009175 snd_hda_override_pin_caps(codec, 0x18, 0x00000734);
9176 snd_hda_override_pin_caps(codec, 0x19, 0x0000073c);
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02009177 }
9178}
9179
Takashi Iwaidf73d832018-06-19 23:05:47 +02009180/* reset GPIO1 */
9181static void alc660vd_fixup_asus_gpio1(struct hda_codec *codec,
9182 const struct hda_fixup *fix, int action)
9183{
9184 struct alc_spec *spec = codec->spec;
9185
9186 if (action == HDA_FIXUP_ACT_PRE_PROBE)
9187 spec->gpio_mask |= 0x02;
9188 alc_fixup_gpio(codec, action, 0x01);
9189}
9190
Takashi Iwai1727a772013-01-10 09:52:52 +01009191static const struct hda_fixup alc861vd_fixups[] = {
Takashi Iwai1d045db2011-07-07 18:23:21 +02009192 [ALC660VD_FIX_ASUS_GPIO1] = {
Takashi Iwaidf73d832018-06-19 23:05:47 +02009193 .type = HDA_FIXUP_FUNC,
9194 .v.func = alc660vd_fixup_asus_gpio1,
Takashi Iwai1d045db2011-07-07 18:23:21 +02009195 },
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02009196 [ALC861VD_FIX_DALLAS] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009197 .type = HDA_FIXUP_FUNC,
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02009198 .v.func = alc861vd_fixup_dallas,
9199 },
Takashi Iwai1d045db2011-07-07 18:23:21 +02009200};
9201
9202static const struct snd_pci_quirk alc861vd_fixup_tbl[] = {
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02009203 SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_FIX_DALLAS),
Takashi Iwai1d045db2011-07-07 18:23:21 +02009204 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
Takashi Iwai8fdcb6f2011-08-23 17:28:55 +02009205 SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_FIX_DALLAS),
Takashi Iwai1d045db2011-07-07 18:23:21 +02009206 {}
9207};
9208
Takashi Iwai1d045db2011-07-07 18:23:21 +02009209/*
9210 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02009211static int patch_alc861vd(struct hda_codec *codec)
9212{
9213 struct alc_spec *spec;
Takashi Iwaicb4e4822011-08-23 17:34:25 +02009214 int err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02009215
Takashi Iwai3de95172012-05-07 18:03:15 +02009216 err = alc_alloc_spec(codec, 0x0b);
9217 if (err < 0)
9218 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02009219
Takashi Iwai3de95172012-05-07 18:03:15 +02009220 spec = codec->spec;
Takashi Iwai2722b532019-08-22 09:55:37 +02009221 if (has_cdefine_beep(codec))
9222 spec->gen.beep_nid = 0x23;
Takashi Iwai1d045db2011-07-07 18:23:21 +02009223
Takashi Iwai225068a2015-05-29 10:42:14 +02009224 spec->shutup = alc_eapd_shutup;
9225
Takashi Iwaic9af7532019-05-10 11:01:43 +02009226 alc_pre_init(codec);
9227
Takashi Iwai1727a772013-01-10 09:52:52 +01009228 snd_hda_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);
9229 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai1d045db2011-07-07 18:23:21 +02009230
Takashi Iwaicb4e4822011-08-23 17:34:25 +02009231 /* automatic parse from the BIOS config */
9232 err = alc861vd_parse_auto_config(codec);
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02009233 if (err < 0)
9234 goto error;
Takashi Iwai1d045db2011-07-07 18:23:21 +02009235
Takashi Iwaifea80fa2018-06-20 12:52:46 +02009236 if (!spec->gen.no_analog) {
9237 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
9238 if (err < 0)
9239 goto error;
9240 }
Takashi Iwai1d045db2011-07-07 18:23:21 +02009241
Takashi Iwai1727a772013-01-10 09:52:52 +01009242 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +01009243
Takashi Iwai1d045db2011-07-07 18:23:21 +02009244 return 0;
Takashi Iwaie16fb6d2011-10-17 16:39:09 +02009245
9246 error:
9247 alc_free(codec);
9248 return err;
Takashi Iwai1d045db2011-07-07 18:23:21 +02009249}
9250
9251/*
9252 * ALC662 support
9253 *
9254 * ALC662 is almost identical with ALC880 but has cleaner and more flexible
9255 * configuration. Each pin widget can choose any input DACs and a mixer.
9256 * Each ADC is connected from a mixer of all inputs. This makes possible
9257 * 6-channel independent captures.
9258 *
9259 * In addition, an independent DAC for the multi-playback (not used in this
9260 * driver yet).
9261 */
Takashi Iwai1d045db2011-07-07 18:23:21 +02009262
9263/*
9264 * BIOS auto configuration
9265 */
9266
Kailang Yangbc9f98a2007-04-12 13:06:07 +02009267static int alc662_parse_auto_config(struct hda_codec *codec)
9268{
Takashi Iwai4c6d72d2011-05-02 11:30:18 +02009269 static const hda_nid_t alc662_ignore[] = { 0x1d, 0 };
Takashi Iwai3e6179b2011-07-08 16:55:13 +02009270 static const hda_nid_t alc663_ssids[] = { 0x15, 0x1b, 0x14, 0x21 };
9271 static const hda_nid_t alc662_ssids[] = { 0x15, 0x1b, 0x14, 0 };
9272 const hda_nid_t *ssids;
Takashi Iwaiee979a142008-09-02 15:42:20 +02009273
Takashi Iwai7639a062015-03-03 10:07:24 +01009274 if (codec->core.vendor_id == 0x10ec0272 || codec->core.vendor_id == 0x10ec0663 ||
9275 codec->core.vendor_id == 0x10ec0665 || codec->core.vendor_id == 0x10ec0670 ||
9276 codec->core.vendor_id == 0x10ec0671)
Takashi Iwai3e6179b2011-07-08 16:55:13 +02009277 ssids = alc663_ssids;
Kailang Yang6227cdc2010-02-25 08:36:52 +01009278 else
Takashi Iwai3e6179b2011-07-08 16:55:13 +02009279 ssids = alc662_ssids;
9280 return alc_parse_auto_config(codec, alc662_ignore, ssids);
Kailang Yangbc9f98a2007-04-12 13:06:07 +02009281}
9282
Todd Broch6be79482010-12-07 16:51:05 -08009283static void alc272_fixup_mario(struct hda_codec *codec,
Takashi Iwai1727a772013-01-10 09:52:52 +01009284 const struct hda_fixup *fix, int action)
Takashi Iwai6fc398c2011-01-13 14:36:37 +01009285{
Takashi Iwai9bb1f062013-01-10 17:14:29 +01009286 if (action != HDA_FIXUP_ACT_PRE_PROBE)
Takashi Iwai6fc398c2011-01-13 14:36:37 +01009287 return;
Todd Broch6be79482010-12-07 16:51:05 -08009288 if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
9289 (0x3b << AC_AMPCAP_OFFSET_SHIFT) |
9290 (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |
9291 (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |
9292 (0 << AC_AMPCAP_MUTE_SHIFT)))
Takashi Iwai4e76a882014-02-25 12:21:03 +01009293 codec_warn(codec, "failed to override amp caps for NID 0x2\n");
Todd Broch6be79482010-12-07 16:51:05 -08009294}
9295
Takashi Iwai8e383952013-10-30 17:41:12 +01009296static const struct snd_pcm_chmap_elem asus_pcm_2_1_chmaps[] = {
9297 { .channels = 2,
9298 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
9299 { .channels = 4,
9300 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
9301 SNDRV_CHMAP_NA, SNDRV_CHMAP_LFE } }, /* LFE only on right */
9302 { }
9303};
9304
9305/* override the 2.1 chmap */
Takashi Iwaieb9ca3a2013-11-28 15:24:34 +01009306static void alc_fixup_bass_chmap(struct hda_codec *codec,
Takashi Iwai8e383952013-10-30 17:41:12 +01009307 const struct hda_fixup *fix, int action)
9308{
9309 if (action == HDA_FIXUP_ACT_BUILD) {
9310 struct alc_spec *spec = codec->spec;
Takashi Iwaibbbc7e82015-02-27 17:43:19 +01009311 spec->gen.pcm_rec[0]->stream[0].chmap = asus_pcm_2_1_chmaps;
Takashi Iwai8e383952013-10-30 17:41:12 +01009312 }
9313}
9314
Takashi Iwaibf686652014-01-13 16:18:25 +01009315/* avoid D3 for keeping GPIO up */
9316static unsigned int gpio_led_power_filter(struct hda_codec *codec,
9317 hda_nid_t nid,
9318 unsigned int power_state)
9319{
9320 struct alc_spec *spec = codec->spec;
Takashi Iwaid261eec2018-06-19 22:32:29 +02009321 if (nid == codec->core.afg && power_state == AC_PWRST_D3 && spec->gpio_data)
Takashi Iwaibf686652014-01-13 16:18:25 +01009322 return AC_PWRST_D0;
9323 return power_state;
9324}
9325
Takashi Iwai3e887f32014-01-10 17:50:58 +01009326static void alc662_fixup_led_gpio1(struct hda_codec *codec,
9327 const struct hda_fixup *fix, int action)
9328{
9329 struct alc_spec *spec = codec->spec;
Takashi Iwai3e887f32014-01-10 17:50:58 +01009330
Takashi Iwai01e4a272018-06-19 22:47:30 +02009331 alc_fixup_hp_gpio_led(codec, action, 0x01, 0);
Takashi Iwai3e887f32014-01-10 17:50:58 +01009332 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
Takashi Iwai0f32fd192014-11-19 12:16:14 +01009333 spec->mute_led_polarity = 1;
Takashi Iwaibf686652014-01-13 16:18:25 +01009334 codec->power_filter = gpio_led_power_filter;
Takashi Iwai3e887f32014-01-10 17:50:58 +01009335 }
9336}
9337
Kailang Yangc6790c82016-11-25 16:15:17 +08009338static void alc662_usi_automute_hook(struct hda_codec *codec,
9339 struct hda_jack_callback *jack)
9340{
9341 struct alc_spec *spec = codec->spec;
9342 int vref;
9343 msleep(200);
9344 snd_hda_gen_hp_automute(codec, jack);
9345
9346 vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
9347 msleep(100);
9348 snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
9349 vref);
9350}
9351
9352static void alc662_fixup_usi_headset_mic(struct hda_codec *codec,
9353 const struct hda_fixup *fix, int action)
9354{
9355 struct alc_spec *spec = codec->spec;
9356 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
9357 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
9358 spec->gen.hp_automute_hook = alc662_usi_automute_hook;
9359 }
9360}
9361
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02009362static void alc662_aspire_ethos_mute_speakers(struct hda_codec *codec,
9363 struct hda_jack_callback *cb)
9364{
9365 /* surround speakers at 0x1b already get muted automatically when
9366 * headphones are plugged in, but we have to mute/unmute the remaining
9367 * channels manually:
9368 * 0x15 - front left/front right
9369 * 0x18 - front center/ LFE
9370 */
9371 if (snd_hda_jack_detect_state(codec, 0x1b) == HDA_JACK_PRESENT) {
9372 snd_hda_set_pin_ctl_cache(codec, 0x15, 0);
9373 snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
9374 } else {
9375 snd_hda_set_pin_ctl_cache(codec, 0x15, PIN_OUT);
9376 snd_hda_set_pin_ctl_cache(codec, 0x18, PIN_OUT);
9377 }
9378}
9379
9380static void alc662_fixup_aspire_ethos_hp(struct hda_codec *codec,
9381 const struct hda_fixup *fix, int action)
9382{
9383 /* Pin 0x1b: shared headphones jack and surround speakers */
9384 if (!is_jack_detectable(codec, 0x1b))
9385 return;
9386
9387 switch (action) {
9388 case HDA_FIXUP_ACT_PRE_PROBE:
9389 snd_hda_jack_detect_enable_callback(codec, 0x1b,
9390 alc662_aspire_ethos_mute_speakers);
Takashi Iwai336820c2019-11-28 21:26:30 +01009391 /* subwoofer needs an extra GPIO setting to become audible */
9392 alc_setup_gpio(codec, 0x02);
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02009393 break;
9394 case HDA_FIXUP_ACT_INIT:
9395 /* Make sure to start in a correct state, i.e. if
9396 * headphones have been plugged in before powering up the system
9397 */
9398 alc662_aspire_ethos_mute_speakers(codec, NULL);
9399 break;
9400 }
9401}
9402
Kailang Yang5af290282020-01-17 14:04:01 +08009403static void alc671_fixup_hp_headset_mic2(struct hda_codec *codec,
9404 const struct hda_fixup *fix, int action)
9405{
9406 struct alc_spec *spec = codec->spec;
9407
9408 static const struct hda_pintbl pincfgs[] = {
9409 { 0x19, 0x02a11040 }, /* use as headset mic, with its own jack detect */
9410 { 0x1b, 0x0181304f },
9411 { }
9412 };
9413
9414 switch (action) {
9415 case HDA_FIXUP_ACT_PRE_PROBE:
9416 spec->gen.mixer_nid = 0;
9417 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
9418 snd_hda_apply_pincfgs(codec, pincfgs);
9419 break;
9420 case HDA_FIXUP_ACT_INIT:
9421 alc_write_coef_idx(codec, 0x19, 0xa054);
9422 break;
9423 }
9424}
9425
Takashi Iwai6b0f95c2020-01-05 15:47:18 +01009426static const struct coef_fw alc668_coefs[] = {
Kailang Yangf3f91852014-10-24 15:43:46 +08009427 WRITE_COEF(0x01, 0xbebe), WRITE_COEF(0x02, 0xaaaa), WRITE_COEF(0x03, 0x0),
9428 WRITE_COEF(0x04, 0x0180), WRITE_COEF(0x06, 0x0), WRITE_COEF(0x07, 0x0f80),
9429 WRITE_COEF(0x08, 0x0031), WRITE_COEF(0x0a, 0x0060), WRITE_COEF(0x0b, 0x0),
9430 WRITE_COEF(0x0c, 0x7cf7), WRITE_COEF(0x0d, 0x1080), WRITE_COEF(0x0e, 0x7f7f),
9431 WRITE_COEF(0x0f, 0xcccc), WRITE_COEF(0x10, 0xddcc), WRITE_COEF(0x11, 0x0001),
9432 WRITE_COEF(0x13, 0x0), WRITE_COEF(0x14, 0x2aa0), WRITE_COEF(0x17, 0xa940),
9433 WRITE_COEF(0x19, 0x0), WRITE_COEF(0x1a, 0x0), WRITE_COEF(0x1b, 0x0),
9434 WRITE_COEF(0x1c, 0x0), WRITE_COEF(0x1d, 0x0), WRITE_COEF(0x1e, 0x7418),
9435 WRITE_COEF(0x1f, 0x0804), WRITE_COEF(0x20, 0x4200), WRITE_COEF(0x21, 0x0468),
9436 WRITE_COEF(0x22, 0x8ccc), WRITE_COEF(0x23, 0x0250), WRITE_COEF(0x24, 0x7418),
9437 WRITE_COEF(0x27, 0x0), WRITE_COEF(0x28, 0x8ccc), WRITE_COEF(0x2a, 0xff00),
9438 WRITE_COEF(0x2b, 0x8000), WRITE_COEF(0xa7, 0xff00), WRITE_COEF(0xa8, 0x8000),
9439 WRITE_COEF(0xaa, 0x2e17), WRITE_COEF(0xab, 0xa0c0), WRITE_COEF(0xac, 0x0),
9440 WRITE_COEF(0xad, 0x0), WRITE_COEF(0xae, 0x2ac6), WRITE_COEF(0xaf, 0xa480),
9441 WRITE_COEF(0xb0, 0x0), WRITE_COEF(0xb1, 0x0), WRITE_COEF(0xb2, 0x0),
9442 WRITE_COEF(0xb3, 0x0), WRITE_COEF(0xb4, 0x0), WRITE_COEF(0xb5, 0x1040),
9443 WRITE_COEF(0xb6, 0xd697), WRITE_COEF(0xb7, 0x902b), WRITE_COEF(0xb8, 0xd697),
9444 WRITE_COEF(0xb9, 0x902b), WRITE_COEF(0xba, 0xb8ba), WRITE_COEF(0xbb, 0xaaab),
9445 WRITE_COEF(0xbc, 0xaaaf), WRITE_COEF(0xbd, 0x6aaa), WRITE_COEF(0xbe, 0x1c02),
9446 WRITE_COEF(0xc0, 0x00ff), WRITE_COEF(0xc1, 0x0fa6),
9447 {}
9448};
9449
9450static void alc668_restore_default_value(struct hda_codec *codec)
9451{
9452 alc_process_coef_fw(codec, alc668_coefs);
9453}
9454
David Henningsson6cb3b702010-09-09 08:51:44 +02009455enum {
Daniel T Chen2df03512010-10-10 22:39:28 -04009456 ALC662_FIXUP_ASPIRE,
Takashi Iwai3e887f32014-01-10 17:50:58 +01009457 ALC662_FIXUP_LED_GPIO1,
David Henningsson6cb3b702010-09-09 08:51:44 +02009458 ALC662_FIXUP_IDEAPAD,
Todd Broch6be79482010-12-07 16:51:05 -08009459 ALC272_FIXUP_MARIO,
Huacai Chenf1ec5be2020-08-02 17:26:40 +08009460 ALC662_FIXUP_CZC_ET26,
Anisse Astierd2ebd472011-01-20 12:36:21 +01009461 ALC662_FIXUP_CZC_P10T,
David Henningsson94024cd2011-04-29 14:10:55 +02009462 ALC662_FIXUP_SKU_IGNORE,
Takashi Iwaie59ea3e2011-06-29 17:21:00 +02009463 ALC662_FIXUP_HP_RP5800,
Takashi Iwai53c334a2011-08-23 18:27:14 +02009464 ALC662_FIXUP_ASUS_MODE1,
9465 ALC662_FIXUP_ASUS_MODE2,
9466 ALC662_FIXUP_ASUS_MODE3,
9467 ALC662_FIXUP_ASUS_MODE4,
9468 ALC662_FIXUP_ASUS_MODE5,
9469 ALC662_FIXUP_ASUS_MODE6,
9470 ALC662_FIXUP_ASUS_MODE7,
9471 ALC662_FIXUP_ASUS_MODE8,
Takashi Iwai1565cc32012-02-13 12:03:25 +01009472 ALC662_FIXUP_NO_JACK_DETECT,
David Henningssonedfe3bf2012-06-12 13:15:12 +02009473 ALC662_FIXUP_ZOTAC_Z68,
Takashi Iwai125821a2012-06-22 14:30:29 +02009474 ALC662_FIXUP_INV_DMIC,
David Henningsson1f8b46c2015-05-12 14:38:15 +02009475 ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
David Henningsson73bdd592013-04-15 15:44:14 +02009476 ALC668_FIXUP_DELL_MIC_NO_PRESENCE,
David Henningsson1f8b46c2015-05-12 14:38:15 +02009477 ALC662_FIXUP_HEADSET_MODE,
David Henningsson73bdd592013-04-15 15:44:14 +02009478 ALC668_FIXUP_HEADSET_MODE,
David Henningsson8e54b4a2014-02-07 09:31:07 +01009479 ALC662_FIXUP_BASS_MODE4_CHMAP,
David Henningsson61a75f12014-02-07 09:31:08 +01009480 ALC662_FIXUP_BASS_16,
Takashi Iwaia30c9aa2013-11-21 08:00:20 +01009481 ALC662_FIXUP_BASS_1A,
David Henningsson8e54b4a2014-02-07 09:31:07 +01009482 ALC662_FIXUP_BASS_CHMAP,
Hui Wang493a52a2014-01-14 14:07:36 +08009483 ALC668_FIXUP_AUTO_MUTE,
Gabriele Mazzotta5e6db662014-05-20 18:58:26 +02009484 ALC668_FIXUP_DELL_DISABLE_AAMIX,
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +02009485 ALC668_FIXUP_DELL_XPS13,
Bobi Mihalca9d4dc582016-03-23 13:26:11 +02009486 ALC662_FIXUP_ASUS_Nx50,
Mikhail Paulyshkafc7438b2017-04-21 08:52:42 +02009487 ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
Yura Pakhuchiy3231e202016-05-07 23:53:36 +07009488 ALC668_FIXUP_ASUS_Nx51,
Takashi Iwai5b7c5e12018-10-09 14:20:17 +02009489 ALC668_FIXUP_MIC_COEF,
Takashi Iwai11ba6112018-10-07 09:44:17 +02009490 ALC668_FIXUP_ASUS_G751,
Kailang Yang78f4f7c2016-06-07 11:31:34 +08009491 ALC891_FIXUP_HEADSET_MODE,
9492 ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
Shrirang Bagul9b51fe32016-08-01 13:16:17 +08009493 ALC662_FIXUP_ACER_VERITON,
Takashi Iwai1a3f0992016-10-20 12:14:51 +02009494 ALC892_FIXUP_ASROCK_MOBO,
Kailang Yangc6790c82016-11-25 16:15:17 +08009495 ALC662_FIXUP_USI_FUNC,
9496 ALC662_FIXUP_USI_HEADSET_MODE,
Kailang Yangca169cc2017-04-25 16:17:40 +08009497 ALC662_FIXUP_LENOVO_MULTI_CODECS,
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02009498 ALC669_FIXUP_ACER_ASPIRE_ETHOS,
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02009499 ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET,
Kailang Yang5af290282020-01-17 14:04:01 +08009500 ALC671_FIXUP_HP_HEADSET_MIC2,
Jian-Hong Pand858c702020-03-17 16:28:07 +08009501 ALC662_FIXUP_ACER_X2660G_HEADSET_MODE,
Jian-Hong Pana1244582020-03-17 16:28:09 +08009502 ALC662_FIXUP_ACER_NITRO_HEADSET_MODE,
David Henningsson6cb3b702010-09-09 08:51:44 +02009503};
9504
Takashi Iwai1727a772013-01-10 09:52:52 +01009505static const struct hda_fixup alc662_fixups[] = {
Daniel T Chen2df03512010-10-10 22:39:28 -04009506 [ALC662_FIXUP_ASPIRE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009507 .type = HDA_FIXUP_PINS,
9508 .v.pins = (const struct hda_pintbl[]) {
Daniel T Chen2df03512010-10-10 22:39:28 -04009509 { 0x15, 0x99130112 }, /* subwoofer */
9510 { }
9511 }
9512 },
Takashi Iwai3e887f32014-01-10 17:50:58 +01009513 [ALC662_FIXUP_LED_GPIO1] = {
9514 .type = HDA_FIXUP_FUNC,
9515 .v.func = alc662_fixup_led_gpio1,
9516 },
David Henningsson6cb3b702010-09-09 08:51:44 +02009517 [ALC662_FIXUP_IDEAPAD] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009518 .type = HDA_FIXUP_PINS,
9519 .v.pins = (const struct hda_pintbl[]) {
David Henningsson6cb3b702010-09-09 08:51:44 +02009520 { 0x17, 0x99130112 }, /* subwoofer */
9521 { }
Takashi Iwai3e887f32014-01-10 17:50:58 +01009522 },
9523 .chained = true,
9524 .chain_id = ALC662_FIXUP_LED_GPIO1,
David Henningsson6cb3b702010-09-09 08:51:44 +02009525 },
Todd Broch6be79482010-12-07 16:51:05 -08009526 [ALC272_FIXUP_MARIO] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009527 .type = HDA_FIXUP_FUNC,
Takashi Iwaib5bfbc62011-01-13 14:22:32 +01009528 .v.func = alc272_fixup_mario,
Anisse Astierd2ebd472011-01-20 12:36:21 +01009529 },
Huacai Chenf1ec5be2020-08-02 17:26:40 +08009530 [ALC662_FIXUP_CZC_ET26] = {
9531 .type = HDA_FIXUP_PINS,
9532 .v.pins = (const struct hda_pintbl[]) {
9533 {0x12, 0x403cc000},
9534 {0x14, 0x90170110}, /* speaker */
9535 {0x15, 0x411111f0},
9536 {0x16, 0x411111f0},
9537 {0x18, 0x01a19030}, /* mic */
9538 {0x19, 0x90a7013f}, /* int-mic */
9539 {0x1a, 0x01014020},
9540 {0x1b, 0x0121401f},
9541 {0x1c, 0x411111f0},
9542 {0x1d, 0x411111f0},
9543 {0x1e, 0x40478e35},
9544 {}
9545 },
9546 .chained = true,
9547 .chain_id = ALC662_FIXUP_SKU_IGNORE
9548 },
Anisse Astierd2ebd472011-01-20 12:36:21 +01009549 [ALC662_FIXUP_CZC_P10T] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009550 .type = HDA_FIXUP_VERBS,
Anisse Astierd2ebd472011-01-20 12:36:21 +01009551 .v.verbs = (const struct hda_verb[]) {
9552 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
9553 {}
9554 }
9555 },
David Henningsson94024cd2011-04-29 14:10:55 +02009556 [ALC662_FIXUP_SKU_IGNORE] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009557 .type = HDA_FIXUP_FUNC,
Takashi Iwai23d30f22012-05-07 17:17:32 +02009558 .v.func = alc_fixup_sku_ignore,
Takashi Iwaic6b35872011-03-28 12:05:31 +02009559 },
Takashi Iwaie59ea3e2011-06-29 17:21:00 +02009560 [ALC662_FIXUP_HP_RP5800] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009561 .type = HDA_FIXUP_PINS,
9562 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwaie59ea3e2011-06-29 17:21:00 +02009563 { 0x14, 0x0221201f }, /* HP out */
9564 { }
9565 },
9566 .chained = true,
9567 .chain_id = ALC662_FIXUP_SKU_IGNORE
9568 },
Takashi Iwai53c334a2011-08-23 18:27:14 +02009569 [ALC662_FIXUP_ASUS_MODE1] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009570 .type = HDA_FIXUP_PINS,
9571 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02009572 { 0x14, 0x99130110 }, /* speaker */
9573 { 0x18, 0x01a19c20 }, /* mic */
9574 { 0x19, 0x99a3092f }, /* int-mic */
9575 { 0x21, 0x0121401f }, /* HP out */
9576 { }
9577 },
9578 .chained = true,
9579 .chain_id = ALC662_FIXUP_SKU_IGNORE
9580 },
9581 [ALC662_FIXUP_ASUS_MODE2] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009582 .type = HDA_FIXUP_PINS,
9583 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai2996bdb2011-08-18 16:02:24 +02009584 { 0x14, 0x99130110 }, /* speaker */
9585 { 0x18, 0x01a19820 }, /* mic */
9586 { 0x19, 0x99a3092f }, /* int-mic */
9587 { 0x1b, 0x0121401f }, /* HP out */
9588 { }
9589 },
Takashi Iwai53c334a2011-08-23 18:27:14 +02009590 .chained = true,
9591 .chain_id = ALC662_FIXUP_SKU_IGNORE
9592 },
9593 [ALC662_FIXUP_ASUS_MODE3] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009594 .type = HDA_FIXUP_PINS,
9595 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02009596 { 0x14, 0x99130110 }, /* speaker */
9597 { 0x15, 0x0121441f }, /* HP */
9598 { 0x18, 0x01a19840 }, /* mic */
9599 { 0x19, 0x99a3094f }, /* int-mic */
9600 { 0x21, 0x01211420 }, /* HP2 */
9601 { }
9602 },
9603 .chained = true,
9604 .chain_id = ALC662_FIXUP_SKU_IGNORE
9605 },
9606 [ALC662_FIXUP_ASUS_MODE4] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009607 .type = HDA_FIXUP_PINS,
9608 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02009609 { 0x14, 0x99130110 }, /* speaker */
9610 { 0x16, 0x99130111 }, /* speaker */
9611 { 0x18, 0x01a19840 }, /* mic */
9612 { 0x19, 0x99a3094f }, /* int-mic */
9613 { 0x21, 0x0121441f }, /* HP */
9614 { }
9615 },
9616 .chained = true,
9617 .chain_id = ALC662_FIXUP_SKU_IGNORE
9618 },
9619 [ALC662_FIXUP_ASUS_MODE5] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009620 .type = HDA_FIXUP_PINS,
9621 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02009622 { 0x14, 0x99130110 }, /* speaker */
9623 { 0x15, 0x0121441f }, /* HP */
9624 { 0x16, 0x99130111 }, /* speaker */
9625 { 0x18, 0x01a19840 }, /* mic */
9626 { 0x19, 0x99a3094f }, /* int-mic */
9627 { }
9628 },
9629 .chained = true,
9630 .chain_id = ALC662_FIXUP_SKU_IGNORE
9631 },
9632 [ALC662_FIXUP_ASUS_MODE6] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009633 .type = HDA_FIXUP_PINS,
9634 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02009635 { 0x14, 0x99130110 }, /* speaker */
9636 { 0x15, 0x01211420 }, /* HP2 */
9637 { 0x18, 0x01a19840 }, /* mic */
9638 { 0x19, 0x99a3094f }, /* int-mic */
9639 { 0x1b, 0x0121441f }, /* HP */
9640 { }
9641 },
9642 .chained = true,
9643 .chain_id = ALC662_FIXUP_SKU_IGNORE
9644 },
9645 [ALC662_FIXUP_ASUS_MODE7] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009646 .type = HDA_FIXUP_PINS,
9647 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02009648 { 0x14, 0x99130110 }, /* speaker */
9649 { 0x17, 0x99130111 }, /* speaker */
9650 { 0x18, 0x01a19840 }, /* mic */
9651 { 0x19, 0x99a3094f }, /* int-mic */
9652 { 0x1b, 0x01214020 }, /* HP */
9653 { 0x21, 0x0121401f }, /* HP */
9654 { }
9655 },
9656 .chained = true,
9657 .chain_id = ALC662_FIXUP_SKU_IGNORE
9658 },
9659 [ALC662_FIXUP_ASUS_MODE8] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009660 .type = HDA_FIXUP_PINS,
9661 .v.pins = (const struct hda_pintbl[]) {
Takashi Iwai53c334a2011-08-23 18:27:14 +02009662 { 0x14, 0x99130110 }, /* speaker */
9663 { 0x12, 0x99a30970 }, /* int-mic */
9664 { 0x15, 0x01214020 }, /* HP */
9665 { 0x17, 0x99130111 }, /* speaker */
9666 { 0x18, 0x01a19840 }, /* mic */
9667 { 0x21, 0x0121401f }, /* HP */
9668 { }
9669 },
9670 .chained = true,
9671 .chain_id = ALC662_FIXUP_SKU_IGNORE
Takashi Iwai2996bdb2011-08-18 16:02:24 +02009672 },
Takashi Iwai1565cc32012-02-13 12:03:25 +01009673 [ALC662_FIXUP_NO_JACK_DETECT] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009674 .type = HDA_FIXUP_FUNC,
Takashi Iwai1565cc32012-02-13 12:03:25 +01009675 .v.func = alc_fixup_no_jack_detect,
9676 },
David Henningssonedfe3bf2012-06-12 13:15:12 +02009677 [ALC662_FIXUP_ZOTAC_Z68] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009678 .type = HDA_FIXUP_PINS,
9679 .v.pins = (const struct hda_pintbl[]) {
David Henningssonedfe3bf2012-06-12 13:15:12 +02009680 { 0x1b, 0x02214020 }, /* Front HP */
9681 { }
9682 }
9683 },
Takashi Iwai125821a2012-06-22 14:30:29 +02009684 [ALC662_FIXUP_INV_DMIC] = {
Takashi Iwai1727a772013-01-10 09:52:52 +01009685 .type = HDA_FIXUP_FUNC,
David Henningsson9d36a7d2014-10-07 10:18:42 +02009686 .v.func = alc_fixup_inv_dmic,
Takashi Iwai125821a2012-06-22 14:30:29 +02009687 },
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +02009688 [ALC668_FIXUP_DELL_XPS13] = {
9689 .type = HDA_FIXUP_FUNC,
9690 .v.func = alc_fixup_dell_xps13,
9691 .chained = true,
9692 .chain_id = ALC668_FIXUP_DELL_DISABLE_AAMIX
9693 },
Gabriele Mazzotta5e6db662014-05-20 18:58:26 +02009694 [ALC668_FIXUP_DELL_DISABLE_AAMIX] = {
9695 .type = HDA_FIXUP_FUNC,
9696 .v.func = alc_fixup_disable_aamix,
9697 .chained = true,
9698 .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
9699 },
Hui Wang493a52a2014-01-14 14:07:36 +08009700 [ALC668_FIXUP_AUTO_MUTE] = {
9701 .type = HDA_FIXUP_FUNC,
9702 .v.func = alc_fixup_auto_mute_via_amp,
9703 .chained = true,
9704 .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
9705 },
David Henningsson1f8b46c2015-05-12 14:38:15 +02009706 [ALC662_FIXUP_DELL_MIC_NO_PRESENCE] = {
9707 .type = HDA_FIXUP_PINS,
9708 .v.pins = (const struct hda_pintbl[]) {
9709 { 0x19, 0x03a1113c }, /* use as headset mic, without its own jack detect */
9710 /* headphone mic by setting pin control of 0x1b (headphone out) to in + vref_50 */
9711 { }
9712 },
9713 .chained = true,
9714 .chain_id = ALC662_FIXUP_HEADSET_MODE
9715 },
9716 [ALC662_FIXUP_HEADSET_MODE] = {
9717 .type = HDA_FIXUP_FUNC,
9718 .v.func = alc_fixup_headset_mode_alc662,
9719 },
David Henningsson73bdd592013-04-15 15:44:14 +02009720 [ALC668_FIXUP_DELL_MIC_NO_PRESENCE] = {
9721 .type = HDA_FIXUP_PINS,
9722 .v.pins = (const struct hda_pintbl[]) {
9723 { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
9724 { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
9725 { }
9726 },
9727 .chained = true,
9728 .chain_id = ALC668_FIXUP_HEADSET_MODE
9729 },
9730 [ALC668_FIXUP_HEADSET_MODE] = {
9731 .type = HDA_FIXUP_FUNC,
9732 .v.func = alc_fixup_headset_mode_alc668,
9733 },
David Henningsson8e54b4a2014-02-07 09:31:07 +01009734 [ALC662_FIXUP_BASS_MODE4_CHMAP] = {
Takashi Iwai8e383952013-10-30 17:41:12 +01009735 .type = HDA_FIXUP_FUNC,
Takashi Iwaieb9ca3a2013-11-28 15:24:34 +01009736 .v.func = alc_fixup_bass_chmap,
Takashi Iwai8e383952013-10-30 17:41:12 +01009737 .chained = true,
9738 .chain_id = ALC662_FIXUP_ASUS_MODE4
9739 },
David Henningsson61a75f12014-02-07 09:31:08 +01009740 [ALC662_FIXUP_BASS_16] = {
9741 .type = HDA_FIXUP_PINS,
9742 .v.pins = (const struct hda_pintbl[]) {
9743 {0x16, 0x80106111}, /* bass speaker */
9744 {}
9745 },
9746 .chained = true,
9747 .chain_id = ALC662_FIXUP_BASS_CHMAP,
9748 },
Takashi Iwaia30c9aa2013-11-21 08:00:20 +01009749 [ALC662_FIXUP_BASS_1A] = {
9750 .type = HDA_FIXUP_PINS,
9751 .v.pins = (const struct hda_pintbl[]) {
9752 {0x1a, 0x80106111}, /* bass speaker */
9753 {}
9754 },
David Henningsson8e54b4a2014-02-07 09:31:07 +01009755 .chained = true,
9756 .chain_id = ALC662_FIXUP_BASS_CHMAP,
Takashi Iwaia30c9aa2013-11-21 08:00:20 +01009757 },
David Henningsson8e54b4a2014-02-07 09:31:07 +01009758 [ALC662_FIXUP_BASS_CHMAP] = {
Takashi Iwaia30c9aa2013-11-21 08:00:20 +01009759 .type = HDA_FIXUP_FUNC,
Takashi Iwaieb9ca3a2013-11-28 15:24:34 +01009760 .v.func = alc_fixup_bass_chmap,
Takashi Iwaia30c9aa2013-11-21 08:00:20 +01009761 },
Bobi Mihalca9d4dc582016-03-23 13:26:11 +02009762 [ALC662_FIXUP_ASUS_Nx50] = {
9763 .type = HDA_FIXUP_FUNC,
9764 .v.func = alc_fixup_auto_mute_via_amp,
9765 .chained = true,
9766 .chain_id = ALC662_FIXUP_BASS_1A
9767 },
Mikhail Paulyshkafc7438b2017-04-21 08:52:42 +02009768 [ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE] = {
9769 .type = HDA_FIXUP_FUNC,
9770 .v.func = alc_fixup_headset_mode_alc668,
9771 .chain_id = ALC662_FIXUP_BASS_CHMAP
9772 },
Yura Pakhuchiy3231e202016-05-07 23:53:36 +07009773 [ALC668_FIXUP_ASUS_Nx51] = {
9774 .type = HDA_FIXUP_PINS,
9775 .v.pins = (const struct hda_pintbl[]) {
Mikhail Paulyshkafc7438b2017-04-21 08:52:42 +02009776 { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
9777 { 0x1a, 0x90170151 }, /* bass speaker */
9778 { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
Yura Pakhuchiy3231e202016-05-07 23:53:36 +07009779 {}
9780 },
9781 .chained = true,
Mikhail Paulyshkafc7438b2017-04-21 08:52:42 +02009782 .chain_id = ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
Yura Pakhuchiy3231e202016-05-07 23:53:36 +07009783 },
Takashi Iwai5b7c5e12018-10-09 14:20:17 +02009784 [ALC668_FIXUP_MIC_COEF] = {
Takashi Iwai11ba6112018-10-07 09:44:17 +02009785 .type = HDA_FIXUP_VERBS,
9786 .v.verbs = (const struct hda_verb[]) {
9787 { 0x20, AC_VERB_SET_COEF_INDEX, 0xc3 },
9788 { 0x20, AC_VERB_SET_PROC_COEF, 0x4000 },
9789 {}
9790 },
9791 },
Takashi Iwai5b7c5e12018-10-09 14:20:17 +02009792 [ALC668_FIXUP_ASUS_G751] = {
9793 .type = HDA_FIXUP_PINS,
9794 .v.pins = (const struct hda_pintbl[]) {
9795 { 0x16, 0x0421101f }, /* HP */
9796 {}
9797 },
9798 .chained = true,
9799 .chain_id = ALC668_FIXUP_MIC_COEF
9800 },
Kailang Yang78f4f7c2016-06-07 11:31:34 +08009801 [ALC891_FIXUP_HEADSET_MODE] = {
9802 .type = HDA_FIXUP_FUNC,
9803 .v.func = alc_fixup_headset_mode,
9804 },
9805 [ALC891_FIXUP_DELL_MIC_NO_PRESENCE] = {
9806 .type = HDA_FIXUP_PINS,
9807 .v.pins = (const struct hda_pintbl[]) {
9808 { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
9809 { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
9810 { }
9811 },
9812 .chained = true,
9813 .chain_id = ALC891_FIXUP_HEADSET_MODE
9814 },
Shrirang Bagul9b51fe32016-08-01 13:16:17 +08009815 [ALC662_FIXUP_ACER_VERITON] = {
9816 .type = HDA_FIXUP_PINS,
9817 .v.pins = (const struct hda_pintbl[]) {
9818 { 0x15, 0x50170120 }, /* no internal speaker */
9819 { }
9820 }
9821 },
Takashi Iwai1a3f0992016-10-20 12:14:51 +02009822 [ALC892_FIXUP_ASROCK_MOBO] = {
9823 .type = HDA_FIXUP_PINS,
9824 .v.pins = (const struct hda_pintbl[]) {
9825 { 0x15, 0x40f000f0 }, /* disabled */
9826 { 0x16, 0x40f000f0 }, /* disabled */
Takashi Iwai1a3f0992016-10-20 12:14:51 +02009827 { }
9828 }
9829 },
Kailang Yangc6790c82016-11-25 16:15:17 +08009830 [ALC662_FIXUP_USI_FUNC] = {
9831 .type = HDA_FIXUP_FUNC,
9832 .v.func = alc662_fixup_usi_headset_mic,
9833 },
9834 [ALC662_FIXUP_USI_HEADSET_MODE] = {
9835 .type = HDA_FIXUP_PINS,
9836 .v.pins = (const struct hda_pintbl[]) {
9837 { 0x19, 0x02a1913c }, /* use as headset mic, without its own jack detect */
9838 { 0x18, 0x01a1903d },
9839 { }
9840 },
9841 .chained = true,
9842 .chain_id = ALC662_FIXUP_USI_FUNC
9843 },
Kailang Yangca169cc2017-04-25 16:17:40 +08009844 [ALC662_FIXUP_LENOVO_MULTI_CODECS] = {
9845 .type = HDA_FIXUP_FUNC,
9846 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
9847 },
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02009848 [ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET] = {
9849 .type = HDA_FIXUP_FUNC,
9850 .v.func = alc662_fixup_aspire_ethos_hp,
9851 },
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02009852 [ALC669_FIXUP_ACER_ASPIRE_ETHOS] = {
9853 .type = HDA_FIXUP_PINS,
9854 .v.pins = (const struct hda_pintbl[]) {
9855 { 0x15, 0x92130110 }, /* front speakers */
9856 { 0x18, 0x99130111 }, /* center/subwoofer */
9857 { 0x1b, 0x11130012 }, /* surround plus jack for HP */
9858 { }
9859 },
9860 .chained = true,
Takashi Iwai336820c2019-11-28 21:26:30 +01009861 .chain_id = ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02009862 },
Kailang Yang5af290282020-01-17 14:04:01 +08009863 [ALC671_FIXUP_HP_HEADSET_MIC2] = {
9864 .type = HDA_FIXUP_FUNC,
9865 .v.func = alc671_fixup_hp_headset_mic2,
9866 },
Jian-Hong Pand858c702020-03-17 16:28:07 +08009867 [ALC662_FIXUP_ACER_X2660G_HEADSET_MODE] = {
9868 .type = HDA_FIXUP_PINS,
9869 .v.pins = (const struct hda_pintbl[]) {
9870 { 0x1a, 0x02a1113c }, /* use as headset mic, without its own jack detect */
9871 { }
9872 },
9873 .chained = true,
9874 .chain_id = ALC662_FIXUP_USI_FUNC
9875 },
Jian-Hong Pana1244582020-03-17 16:28:09 +08009876 [ALC662_FIXUP_ACER_NITRO_HEADSET_MODE] = {
9877 .type = HDA_FIXUP_PINS,
9878 .v.pins = (const struct hda_pintbl[]) {
9879 { 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */
9880 { 0x1b, 0x0221144f },
9881 { }
9882 },
9883 .chained = true,
9884 .chain_id = ALC662_FIXUP_USI_FUNC
9885 },
David Henningsson6cb3b702010-09-09 08:51:44 +02009886};
9887
Takashi Iwaia9111322011-05-02 11:30:18 +02009888static const struct snd_pci_quirk alc662_fixup_tbl[] = {
Takashi Iwai53c334a2011-08-23 18:27:14 +02009889 SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2),
Takashi Iwaid3d38352013-08-19 20:05:50 +02009890 SND_PCI_QUIRK(0x1025, 0x022f, "Acer Aspire One", ALC662_FIXUP_INV_DMIC),
David Henningsson02f6ff92015-12-07 11:29:31 +01009891 SND_PCI_QUIRK(0x1025, 0x0241, "Packard Bell DOTS", ALC662_FIXUP_INV_DMIC),
David Henningssona6c47a82011-02-10 15:39:19 +01009892 SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
David Henningsson94024cd2011-04-29 14:10:55 +02009893 SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),
Takashi Iwai125821a2012-06-22 14:30:29 +02009894 SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC),
Takashi Iwai18019282013-08-16 08:17:05 +02009895 SND_PCI_QUIRK(0x1025, 0x034a, "Gateway LT27", ALC662_FIXUP_INV_DMIC),
Daniel T Chen2df03512010-10-10 22:39:28 -04009896 SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
Jian-Hong Pana1244582020-03-17 16:28:09 +08009897 SND_PCI_QUIRK(0x1025, 0x123c, "Acer Nitro N50-600", ALC662_FIXUP_ACER_NITRO_HEADSET_MODE),
Jian-Hong Pand858c702020-03-17 16:28:07 +08009898 SND_PCI_QUIRK(0x1025, 0x124e, "Acer 2660G", ALC662_FIXUP_ACER_X2660G_HEADSET_MODE),
David Henningsson73bdd592013-04-15 15:44:14 +02009899 SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
9900 SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
Takashi Iwaic5d019c2014-07-22 17:33:32 +02009901 SND_PCI_QUIRK(0x1028, 0x05fe, "Dell XPS 15", ALC668_FIXUP_DELL_XPS13),
Gabriele Mazzotta033b0a72014-05-26 17:11:46 +02009902 SND_PCI_QUIRK(0x1028, 0x060a, "Dell XPS 13", ALC668_FIXUP_DELL_XPS13),
Niranjan Sivakumar467e1432015-09-05 18:20:35 +02009903 SND_PCI_QUIRK(0x1028, 0x060d, "Dell M3800", ALC668_FIXUP_DELL_XPS13),
David Henningsson09d20142013-11-20 11:43:30 +01009904 SND_PCI_QUIRK(0x1028, 0x0625, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
David Henningssonad8ff99e2013-11-07 09:28:59 +01009905 SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
Kailang Yang8dc9abb2014-04-16 15:53:12 +08009906 SND_PCI_QUIRK(0x1028, 0x0696, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
9907 SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
Kailang Yang6a98e342014-10-27 16:20:30 +08009908 SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
Takashi Iwaie59ea3e2011-06-29 17:21:00 +02009909 SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
Jeremy Szu148ebf542020-10-08 18:56:44 +08009910 SND_PCI_QUIRK(0x103c, 0x873e, "HP", ALC671_FIXUP_HP_HEADSET_MIC2),
Kaho Ng2da2dc92016-05-09 00:27:49 +08009911 SND_PCI_QUIRK(0x1043, 0x1080, "Asus UX501VW", ALC668_FIXUP_HEADSET_MODE),
Bobi Mihalca83a9efb2016-03-23 13:32:33 +02009912 SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_ASUS_Nx50),
Takashi Iwaidb8948e2016-01-18 09:17:30 +01009913 SND_PCI_QUIRK(0x1043, 0x13df, "Asus N550JX", ALC662_FIXUP_BASS_1A),
Bobi Mihalca9d4dc582016-03-23 13:26:11 +02009914 SND_PCI_QUIRK(0x1043, 0x129d, "Asus N750", ALC662_FIXUP_ASUS_Nx50),
Takashi Iwai11ba6112018-10-07 09:44:17 +02009915 SND_PCI_QUIRK(0x1043, 0x12ff, "ASUS G751", ALC668_FIXUP_ASUS_G751),
David Henningsson8e54b4a2014-02-07 09:31:07 +01009916 SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
David Henningsson61a75f12014-02-07 09:31:08 +01009917 SND_PCI_QUIRK(0x1043, 0x15a7, "ASUS UX51VZH", ALC662_FIXUP_BASS_16),
Yura Pakhuchiy3231e202016-05-07 23:53:36 +07009918 SND_PCI_QUIRK(0x1043, 0x177d, "ASUS N551", ALC668_FIXUP_ASUS_Nx51),
9919 SND_PCI_QUIRK(0x1043, 0x17bd, "ASUS N751", ALC668_FIXUP_ASUS_Nx51),
Takashi Iwaic7efff92017-01-04 21:38:16 +01009920 SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71SL", ALC662_FIXUP_ASUS_MODE8),
David Henningsson61a75f12014-02-07 09:31:08 +01009921 SND_PCI_QUIRK(0x1043, 0x1b73, "ASUS N55SF", ALC662_FIXUP_BASS_16),
David Henningsson8e54b4a2014-02-07 09:31:07 +01009922 SND_PCI_QUIRK(0x1043, 0x1bf3, "ASUS N76VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
Takashi Iwai1565cc32012-02-13 12:03:25 +01009923 SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),
Takashi Iwai53c334a2011-08-23 18:27:14 +02009924 SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
Daniel T Chena0e90ac2010-11-20 10:20:35 -05009925 SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
Kailang Yangc6790c82016-11-25 16:15:17 +08009926 SND_PCI_QUIRK(0x14cd, 0x5003, "USI", ALC662_FIXUP_USI_HEADSET_MODE),
Kailang Yangca169cc2017-04-25 16:17:40 +08009927 SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC662_FIXUP_LENOVO_MULTI_CODECS),
Valentine Sinitsynd4118582010-10-01 22:24:08 +06009928 SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
David Henningsson6cb3b702010-09-09 08:51:44 +02009929 SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
Takashi Iwai1a3f0992016-10-20 12:14:51 +02009930 SND_PCI_QUIRK(0x1849, 0x5892, "ASRock B150M", ALC892_FIXUP_ASROCK_MOBO),
David Henningssonedfe3bf2012-06-12 13:15:12 +02009931 SND_PCI_QUIRK(0x19da, 0xa130, "Zotac Z68", ALC662_FIXUP_ZOTAC_Z68),
Shrirang Bagul9b51fe32016-08-01 13:16:17 +08009932 SND_PCI_QUIRK(0x1b0a, 0x01b8, "ACER Veriton", ALC662_FIXUP_ACER_VERITON),
Huacai Chenf1ec5be2020-08-02 17:26:40 +08009933 SND_PCI_QUIRK(0x1b35, 0x1234, "CZC ET26", ALC662_FIXUP_CZC_ET26),
Anisse Astierd2ebd472011-01-20 12:36:21 +01009934 SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +02009935 SND_PCI_QUIRK(0x1025, 0x0566, "Acer Aspire Ethos 8951G", ALC669_FIXUP_ACER_ASPIRE_ETHOS),
Takashi Iwai53c334a2011-08-23 18:27:14 +02009936
9937#if 0
9938 /* Below is a quirk table taken from the old code.
9939 * Basically the device should work as is without the fixup table.
9940 * If BIOS doesn't give a proper info, enable the corresponding
9941 * fixup entry.
Jesper Juhl7d7eb9e2012-04-12 22:11:25 +02009942 */
Takashi Iwai53c334a2011-08-23 18:27:14 +02009943 SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1),
9944 SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3),
9945 SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1),
9946 SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC662_FIXUP_ASUS_MODE3),
9947 SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
9948 SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9949 SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
9950 SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC662_FIXUP_ASUS_MODE1),
9951 SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC662_FIXUP_ASUS_MODE1),
9952 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9953 SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC662_FIXUP_ASUS_MODE7),
9954 SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC662_FIXUP_ASUS_MODE7),
9955 SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC662_FIXUP_ASUS_MODE8),
9956 SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC662_FIXUP_ASUS_MODE3),
9957 SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC662_FIXUP_ASUS_MODE1),
9958 SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9959 SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_FIXUP_ASUS_MODE2),
9960 SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC662_FIXUP_ASUS_MODE1),
9961 SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9962 SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
9963 SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
9964 SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9965 SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC662_FIXUP_ASUS_MODE1),
9966 SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC662_FIXUP_ASUS_MODE3),
9967 SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_FIXUP_ASUS_MODE2),
9968 SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9969 SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC662_FIXUP_ASUS_MODE5),
9970 SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
9971 SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9972 SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC662_FIXUP_ASUS_MODE1),
9973 SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9974 SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9975 SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC662_FIXUP_ASUS_MODE3),
9976 SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC662_FIXUP_ASUS_MODE3),
9977 SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC662_FIXUP_ASUS_MODE1),
9978 SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC662_FIXUP_ASUS_MODE1),
9979 SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC662_FIXUP_ASUS_MODE1),
9980 SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC662_FIXUP_ASUS_MODE1),
9981 SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC662_FIXUP_ASUS_MODE1),
9982 SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9983 SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_FIXUP_ASUS_MODE2),
9984 SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC662_FIXUP_ASUS_MODE1),
9985 SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
9986 SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC662_FIXUP_ASUS_MODE3),
9987 SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC662_FIXUP_ASUS_MODE1),
9988 SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC662_FIXUP_ASUS_MODE1),
9989 SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC662_FIXUP_ASUS_MODE1),
9990 SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_FIXUP_ASUS_MODE2),
9991 SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
9992 SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE4),
9993#endif
David Henningsson6cb3b702010-09-09 08:51:44 +02009994 {}
9995};
9996
Takashi Iwai1727a772013-01-10 09:52:52 +01009997static const struct hda_model_fixup alc662_fixup_models[] = {
Takashi Iwaiaa3841b2018-06-26 07:42:40 +02009998 {.id = ALC662_FIXUP_ASPIRE, .name = "aspire"},
9999 {.id = ALC662_FIXUP_IDEAPAD, .name = "ideapad"},
Todd Broch6be79482010-12-07 16:51:05 -080010000 {.id = ALC272_FIXUP_MARIO, .name = "mario"},
Takashi Iwaiaa3841b2018-06-26 07:42:40 +020010001 {.id = ALC662_FIXUP_HP_RP5800, .name = "hp-rp5800"},
Takashi Iwai53c334a2011-08-23 18:27:14 +020010002 {.id = ALC662_FIXUP_ASUS_MODE1, .name = "asus-mode1"},
10003 {.id = ALC662_FIXUP_ASUS_MODE2, .name = "asus-mode2"},
10004 {.id = ALC662_FIXUP_ASUS_MODE3, .name = "asus-mode3"},
10005 {.id = ALC662_FIXUP_ASUS_MODE4, .name = "asus-mode4"},
10006 {.id = ALC662_FIXUP_ASUS_MODE5, .name = "asus-mode5"},
10007 {.id = ALC662_FIXUP_ASUS_MODE6, .name = "asus-mode6"},
10008 {.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},
10009 {.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},
Takashi Iwaiaa3841b2018-06-26 07:42:40 +020010010 {.id = ALC662_FIXUP_ZOTAC_Z68, .name = "zotac-z68"},
Takashi Iwai6e72aa52012-06-25 10:52:25 +020010011 {.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"},
Takashi Iwaiaa3841b2018-06-26 07:42:40 +020010012 {.id = ALC662_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc662-headset-multi"},
David Henningssone32aa852013-06-17 11:04:02 +020010013 {.id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
Takashi Iwaiaa3841b2018-06-26 07:42:40 +020010014 {.id = ALC662_FIXUP_HEADSET_MODE, .name = "alc662-headset"},
10015 {.id = ALC668_FIXUP_HEADSET_MODE, .name = "alc668-headset"},
10016 {.id = ALC662_FIXUP_BASS_16, .name = "bass16"},
10017 {.id = ALC662_FIXUP_BASS_1A, .name = "bass1a"},
10018 {.id = ALC668_FIXUP_AUTO_MUTE, .name = "automute"},
10019 {.id = ALC668_FIXUP_DELL_XPS13, .name = "dell-xps13"},
10020 {.id = ALC662_FIXUP_ASUS_Nx50, .name = "asus-nx50"},
10021 {.id = ALC668_FIXUP_ASUS_Nx51, .name = "asus-nx51"},
Takashi Iwai40c51672018-10-07 09:47:39 +020010022 {.id = ALC668_FIXUP_ASUS_G751, .name = "asus-g751"},
Takashi Iwaiaa3841b2018-06-26 07:42:40 +020010023 {.id = ALC891_FIXUP_HEADSET_MODE, .name = "alc891-headset"},
10024 {.id = ALC891_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc891-headset-multi"},
10025 {.id = ALC662_FIXUP_ACER_VERITON, .name = "acer-veriton"},
10026 {.id = ALC892_FIXUP_ASROCK_MOBO, .name = "asrock-mobo"},
10027 {.id = ALC662_FIXUP_USI_HEADSET_MODE, .name = "usi-headset"},
Takashi Iwaiba90d6a2017-05-22 16:38:47 +020010028 {.id = ALC662_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
Sergey Bostandzhyan00066e92019-09-06 11:33:43 +020010029 {.id = ALC669_FIXUP_ACER_ASPIRE_ETHOS, .name = "aspire-ethos"},
Todd Broch6be79482010-12-07 16:51:05 -080010030 {}
10031};
David Henningsson6cb3b702010-09-09 08:51:44 +020010032
Hui Wang532895c2014-05-29 15:59:19 +080010033static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = {
Kailang Yang78f4f7c2016-06-07 11:31:34 +080010034 SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
10035 {0x17, 0x02211010},
10036 {0x18, 0x01a19030},
10037 {0x1a, 0x01813040},
10038 {0x21, 0x01014020}),
Hui Wang4b4e0e32019-07-16 15:21:34 +080010039 SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
10040 {0x16, 0x01813030},
10041 {0x17, 0x02211010},
10042 {0x18, 0x01a19040},
10043 {0x21, 0x01014020}),
David Henningsson1f8b46c2015-05-12 14:38:15 +020010044 SND_HDA_PIN_QUIRK(0x10ec0662, 0x1028, "Dell", ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
David Henningsson1f8b46c2015-05-12 14:38:15 +020010045 {0x14, 0x01014010},
David Henningsson1f8b46c2015-05-12 14:38:15 +020010046 {0x18, 0x01a19020},
David Henningsson1f8b46c2015-05-12 14:38:15 +020010047 {0x1a, 0x0181302f},
Hui Wang11580292015-08-03 11:03:49 +080010048 {0x1b, 0x0221401f}),
David Henningsson76c21322014-06-24 14:46:54 +020010049 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
10050 {0x12, 0x99a30130},
10051 {0x14, 0x90170110},
10052 {0x15, 0x0321101f},
Hui Wang11580292015-08-03 11:03:49 +080010053 {0x16, 0x03011020}),
David Henningsson76c21322014-06-24 14:46:54 +020010054 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
10055 {0x12, 0x99a30140},
10056 {0x14, 0x90170110},
10057 {0x15, 0x0321101f},
Hui Wang11580292015-08-03 11:03:49 +080010058 {0x16, 0x03011020}),
David Henningsson76c21322014-06-24 14:46:54 +020010059 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
10060 {0x12, 0x99a30150},
10061 {0x14, 0x90170110},
10062 {0x15, 0x0321101f},
Hui Wang11580292015-08-03 11:03:49 +080010063 {0x16, 0x03011020}),
David Henningsson76c21322014-06-24 14:46:54 +020010064 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
David Henningsson76c21322014-06-24 14:46:54 +020010065 {0x14, 0x90170110},
10066 {0x15, 0x0321101f},
Hui Wang11580292015-08-03 11:03:49 +080010067 {0x16, 0x03011020}),
David Henningsson76c21322014-06-24 14:46:54 +020010068 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell XPS 15", ALC668_FIXUP_AUTO_MUTE,
10069 {0x12, 0x90a60130},
10070 {0x14, 0x90170110},
Hui Wang11580292015-08-03 11:03:49 +080010071 {0x15, 0x0321101f}),
Kailang Yang5af290282020-01-17 14:04:01 +080010072 SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
10073 {0x14, 0x01014010},
10074 {0x17, 0x90170150},
Kailang Yangf2adbae2020-02-05 15:40:01 +080010075 {0x19, 0x02a11060},
Kailang Yang5af290282020-01-17 14:04:01 +080010076 {0x1b, 0x01813030},
10077 {0x21, 0x02211020}),
10078 SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
10079 {0x14, 0x01014010},
10080 {0x18, 0x01a19040},
10081 {0x1b, 0x01813030},
10082 {0x21, 0x02211020}),
10083 SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
10084 {0x14, 0x01014020},
10085 {0x17, 0x90170110},
10086 {0x18, 0x01a19050},
10087 {0x1b, 0x01813040},
10088 {0x21, 0x02211030}),
Hui Wang532895c2014-05-29 15:59:19 +080010089 {}
10090};
10091
Takashi Iwai1d045db2011-07-07 18:23:21 +020010092/*
10093 */
Kailang Yangbc9f98a2007-04-12 13:06:07 +020010094static int patch_alc662(struct hda_codec *codec)
10095{
10096 struct alc_spec *spec;
Takashi Iwai3de95172012-05-07 18:03:15 +020010097 int err;
Kailang Yangbc9f98a2007-04-12 13:06:07 +020010098
Takashi Iwai3de95172012-05-07 18:03:15 +020010099 err = alc_alloc_spec(codec, 0x0b);
10100 if (err < 0)
10101 return err;
Kailang Yangbc9f98a2007-04-12 13:06:07 +020010102
Takashi Iwai3de95172012-05-07 18:03:15 +020010103 spec = codec->spec;
Takashi Iwai1f0f4b82011-06-27 10:52:59 +020010104
Takashi Iwai225068a2015-05-29 10:42:14 +020010105 spec->shutup = alc_eapd_shutup;
10106
Takashi Iwai53c334a2011-08-23 18:27:14 +020010107 /* handle multiple HPs as is */
10108 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
10109
Takashi Iwai2c3bf9a2008-06-04 12:39:38 +020010110 alc_fix_pll_init(codec, 0x20, 0x04, 15);
10111
Takashi Iwai7639a062015-03-03 10:07:24 +010010112 switch (codec->core.vendor_id) {
Kailang Yangf3f91852014-10-24 15:43:46 +080010113 case 0x10ec0668:
10114 spec->init_hook = alc668_restore_default_value;
10115 break;
Kailang Yangf3f91852014-10-24 15:43:46 +080010116 }
Kailang Yang8663ff72012-06-29 09:35:52 +020010117
Takashi Iwaic9af7532019-05-10 11:01:43 +020010118 alc_pre_init(codec);
10119
Takashi Iwai1727a772013-01-10 09:52:52 +010010120 snd_hda_pick_fixup(codec, alc662_fixup_models,
Takashi Iwai8e5a0502012-06-21 15:49:33 +020010121 alc662_fixup_tbl, alc662_fixups);
Hui Wang0fc1e442019-08-16 14:27:39 +080010122 snd_hda_pick_pin_fixup(codec, alc662_pin_fixup_tbl, alc662_fixups, true);
Takashi Iwai1727a772013-01-10 09:52:52 +010010123 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
Takashi Iwai8e5a0502012-06-21 15:49:33 +020010124
10125 alc_auto_parse_customize_define(codec);
10126
Takashi Iwai7504b6c2013-03-18 11:25:51 +010010127 if (has_cdefine_beep(codec))
10128 spec->gen.beep_nid = 0x01;
10129
Takashi Iwai1bb7e432011-10-17 16:50:59 +020010130 if ((alc_get_coef0(codec) & (1 << 14)) &&
Takashi Iwai5100cd02014-02-15 10:03:19 +010010131 codec->bus->pci && codec->bus->pci->subsystem_vendor == 0x1025 &&
Takashi Iwaie16fb6d2011-10-17 16:39:09 +020010132 spec->cdefine.platform_type == 1) {
Wei Yongjun6134b1a2013-04-18 11:12:59 +080010133 err = alc_codec_rename(codec, "ALC272X");
10134 if (err < 0)
Takashi Iwaie16fb6d2011-10-17 16:39:09 +020010135 goto error;
Takashi Iwai20ca0c32011-10-17 16:00:35 +020010136 }
Kailang Yang274693f2009-12-03 10:07:50 +010010137
Takashi Iwaib9c51062011-08-24 18:08:07 +020010138 /* automatic parse from the BIOS config */
10139 err = alc662_parse_auto_config(codec);
Takashi Iwaie16fb6d2011-10-17 16:39:09 +020010140 if (err < 0)
10141 goto error;
Kailang Yangbc9f98a2007-04-12 13:06:07 +020010142
Takashi Iwai7504b6c2013-03-18 11:25:51 +010010143 if (!spec->gen.no_analog && spec->gen.beep_nid) {
Takashi Iwai7639a062015-03-03 10:07:24 +010010144 switch (codec->core.vendor_id) {
Kailang Yangda00c242010-03-19 11:23:45 +010010145 case 0x10ec0662:
Takashi Iwaifea80fa2018-06-20 12:52:46 +020010146 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
Kailang Yangda00c242010-03-19 11:23:45 +010010147 break;
10148 case 0x10ec0272:
10149 case 0x10ec0663:
10150 case 0x10ec0665:
Kailang Yang9ad54542013-11-26 15:41:40 +080010151 case 0x10ec0668:
Takashi Iwaifea80fa2018-06-20 12:52:46 +020010152 err = set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
Kailang Yangda00c242010-03-19 11:23:45 +010010153 break;
10154 case 0x10ec0273:
Takashi Iwaifea80fa2018-06-20 12:52:46 +020010155 err = set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
Kailang Yangda00c242010-03-19 11:23:45 +010010156 break;
10157 }
Takashi Iwaifea80fa2018-06-20 12:52:46 +020010158 if (err < 0)
10159 goto error;
Kailang Yangcec27c82010-02-04 14:18:18 +010010160 }
Takashi Iwai2134ea42008-01-10 16:53:55 +010010161
Takashi Iwai1727a772013-01-10 09:52:52 +010010162 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
Takashi Iwai589876e2012-02-20 15:47:55 +010010163
Kailang Yangbc9f98a2007-04-12 13:06:07 +020010164 return 0;
Kailang Yangbc9f98a2007-04-12 13:06:07 +020010165
Takashi Iwaie16fb6d2011-10-17 16:39:09 +020010166 error:
10167 alc_free(codec);
10168 return err;
Kailang Yangb478b992011-05-18 11:51:15 +020010169}
10170
Kailang Yangbc9f98a2007-04-12 13:06:07 +020010171/*
Kailang Yangd1eb57f2010-06-23 16:25:26 +020010172 * ALC680 support
10173 */
Kailang Yangd1eb57f2010-06-23 16:25:26 +020010174
Kailang Yangd1eb57f2010-06-23 16:25:26 +020010175static int alc680_parse_auto_config(struct hda_codec *codec)
10176{
Takashi Iwai3e6179b2011-07-08 16:55:13 +020010177 return alc_parse_auto_config(codec, NULL, NULL);
Kailang Yangd1eb57f2010-06-23 16:25:26 +020010178}
10179
Kailang Yangd1eb57f2010-06-23 16:25:26 +020010180/*
Kailang Yangd1eb57f2010-06-23 16:25:26 +020010181 */
Kailang Yangd1eb57f2010-06-23 16:25:26 +020010182static int patch_alc680(struct hda_codec *codec)
10183{
Kailang Yangd1eb57f2010-06-23 16:25:26 +020010184 int err;
10185
Takashi Iwai1f0f4b82011-06-27 10:52:59 +020010186 /* ALC680 has no aa-loopback mixer */
Takashi Iwai3de95172012-05-07 18:03:15 +020010187 err = alc_alloc_spec(codec, 0);
10188 if (err < 0)
10189 return err;
Takashi Iwai1f0f4b82011-06-27 10:52:59 +020010190
Takashi Iwai1ebec5f2011-08-15 13:21:48 +020010191 /* automatic parse from the BIOS config */
10192 err = alc680_parse_auto_config(codec);
10193 if (err < 0) {
10194 alc_free(codec);
10195 return err;
Kailang Yangd1eb57f2010-06-23 16:25:26 +020010196 }
10197
Kailang Yangd1eb57f2010-06-23 16:25:26 +020010198 return 0;
10199}
10200
10201/*
Linus Torvalds1da177e2005-04-16 15:20:36 -070010202 * patch entries
10203 */
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010204static const struct hda_device_id snd_hda_id_realtek[] = {
Kailang Yang0a6f0602017-06-30 16:00:48 +080010205 HDA_CODEC_ENTRY(0x10ec0215, "ALC215", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010206 HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269),
Hui Wang2a36c162019-09-04 13:53:27 +080010207 HDA_CODEC_ENTRY(0x10ec0222, "ALC222", patch_alc269),
Kailang Yang42314302016-02-03 15:03:50 +080010208 HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010209 HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269),
10210 HDA_CODEC_ENTRY(0x10ec0233, "ALC233", patch_alc269),
Kailang Yangdcd4f0d2016-05-04 15:50:18 +080010211 HDA_CODEC_ENTRY(0x10ec0234, "ALC234", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010212 HDA_CODEC_ENTRY(0x10ec0235, "ALC233", patch_alc269),
Kailang Yang736f20a2017-10-20 15:06:34 +080010213 HDA_CODEC_ENTRY(0x10ec0236, "ALC236", patch_alc269),
Kailang Yang7fbdcd82020-04-23 14:18:31 +080010214 HDA_CODEC_ENTRY(0x10ec0245, "ALC245", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010215 HDA_CODEC_ENTRY(0x10ec0255, "ALC255", patch_alc269),
10216 HDA_CODEC_ENTRY(0x10ec0256, "ALC256", patch_alc269),
Kailang Yangf429e7e2017-12-05 15:38:24 +080010217 HDA_CODEC_ENTRY(0x10ec0257, "ALC257", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010218 HDA_CODEC_ENTRY(0x10ec0260, "ALC260", patch_alc260),
10219 HDA_CODEC_ENTRY(0x10ec0262, "ALC262", patch_alc262),
10220 HDA_CODEC_ENTRY(0x10ec0267, "ALC267", patch_alc268),
10221 HDA_CODEC_ENTRY(0x10ec0268, "ALC268", patch_alc268),
10222 HDA_CODEC_ENTRY(0x10ec0269, "ALC269", patch_alc269),
10223 HDA_CODEC_ENTRY(0x10ec0270, "ALC270", patch_alc269),
10224 HDA_CODEC_ENTRY(0x10ec0272, "ALC272", patch_alc662),
Kailang Yangdcd4f0d2016-05-04 15:50:18 +080010225 HDA_CODEC_ENTRY(0x10ec0274, "ALC274", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010226 HDA_CODEC_ENTRY(0x10ec0275, "ALC275", patch_alc269),
10227 HDA_CODEC_ENTRY(0x10ec0276, "ALC276", patch_alc269),
10228 HDA_CODEC_ENTRY(0x10ec0280, "ALC280", patch_alc269),
10229 HDA_CODEC_ENTRY(0x10ec0282, "ALC282", patch_alc269),
10230 HDA_CODEC_ENTRY(0x10ec0283, "ALC283", patch_alc269),
10231 HDA_CODEC_ENTRY(0x10ec0284, "ALC284", patch_alc269),
Kailang Yang0a6f0602017-06-30 16:00:48 +080010232 HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010233 HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269),
Kailang Yang630e3612020-05-27 14:10:26 +080010234 HDA_CODEC_ENTRY(0x10ec0287, "ALC287", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010235 HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269),
Kailang Yang0a6f0602017-06-30 16:00:48 +080010236 HDA_CODEC_ENTRY(0x10ec0289, "ALC289", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010237 HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269),
10238 HDA_CODEC_ENTRY(0x10ec0292, "ALC292", patch_alc269),
10239 HDA_CODEC_ENTRY(0x10ec0293, "ALC293", patch_alc269),
Kailang Yangdcd4f0d2016-05-04 15:50:18 +080010240 HDA_CODEC_ENTRY(0x10ec0294, "ALC294", patch_alc269),
Kailang Yang7d727862016-05-24 16:46:07 +080010241 HDA_CODEC_ENTRY(0x10ec0295, "ALC295", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010242 HDA_CODEC_ENTRY(0x10ec0298, "ALC298", patch_alc269),
Kailang Yang28f1f9b2017-01-04 14:49:07 +080010243 HDA_CODEC_ENTRY(0x10ec0299, "ALC299", patch_alc269),
Kailang Yang1078bef2018-11-08 16:36:15 +080010244 HDA_CODEC_ENTRY(0x10ec0300, "ALC300", patch_alc269),
Kailang Yangf0778872019-10-24 15:13:32 +080010245 HDA_CODEC_ENTRY(0x10ec0623, "ALC623", patch_alc269),
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010246 HDA_CODEC_REV_ENTRY(0x10ec0861, 0x100340, "ALC660", patch_alc861),
10247 HDA_CODEC_ENTRY(0x10ec0660, "ALC660-VD", patch_alc861vd),
10248 HDA_CODEC_ENTRY(0x10ec0861, "ALC861", patch_alc861),
10249 HDA_CODEC_ENTRY(0x10ec0862, "ALC861-VD", patch_alc861vd),
10250 HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100002, "ALC662 rev2", patch_alc882),
10251 HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100101, "ALC662 rev1", patch_alc662),
10252 HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100300, "ALC662 rev3", patch_alc662),
10253 HDA_CODEC_ENTRY(0x10ec0663, "ALC663", patch_alc662),
10254 HDA_CODEC_ENTRY(0x10ec0665, "ALC665", patch_alc662),
10255 HDA_CODEC_ENTRY(0x10ec0667, "ALC667", patch_alc662),
10256 HDA_CODEC_ENTRY(0x10ec0668, "ALC668", patch_alc662),
10257 HDA_CODEC_ENTRY(0x10ec0670, "ALC670", patch_alc662),
10258 HDA_CODEC_ENTRY(0x10ec0671, "ALC671", patch_alc662),
10259 HDA_CODEC_ENTRY(0x10ec0680, "ALC680", patch_alc680),
Kailang Yang6fbae352016-05-30 16:44:20 +080010260 HDA_CODEC_ENTRY(0x10ec0700, "ALC700", patch_alc269),
10261 HDA_CODEC_ENTRY(0x10ec0701, "ALC701", patch_alc269),
10262 HDA_CODEC_ENTRY(0x10ec0703, "ALC703", patch_alc269),
Kailang Yang83629532019-05-02 16:03:26 +080010263 HDA_CODEC_ENTRY(0x10ec0711, "ALC711", patch_alc269),
Kailang Yang78f4f7c2016-06-07 11:31:34 +080010264 HDA_CODEC_ENTRY(0x10ec0867, "ALC891", patch_alc662),
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010265 HDA_CODEC_ENTRY(0x10ec0880, "ALC880", patch_alc880),
10266 HDA_CODEC_ENTRY(0x10ec0882, "ALC882", patch_alc882),
10267 HDA_CODEC_ENTRY(0x10ec0883, "ALC883", patch_alc882),
10268 HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100101, "ALC889A", patch_alc882),
10269 HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100103, "ALC889A", patch_alc882),
10270 HDA_CODEC_ENTRY(0x10ec0885, "ALC885", patch_alc882),
10271 HDA_CODEC_ENTRY(0x10ec0887, "ALC887", patch_alc882),
10272 HDA_CODEC_REV_ENTRY(0x10ec0888, 0x100101, "ALC1200", patch_alc882),
10273 HDA_CODEC_ENTRY(0x10ec0888, "ALC888", patch_alc882),
10274 HDA_CODEC_ENTRY(0x10ec0889, "ALC889", patch_alc882),
10275 HDA_CODEC_ENTRY(0x10ec0892, "ALC892", patch_alc662),
Kailang Yange5782a52020-11-27 14:39:23 +080010276 HDA_CODEC_ENTRY(0x10ec0897, "ALC897", patch_alc662),
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010277 HDA_CODEC_ENTRY(0x10ec0899, "ALC898", patch_alc882),
10278 HDA_CODEC_ENTRY(0x10ec0900, "ALC1150", patch_alc882),
Kailang Yang6d9ffcf2020-01-03 16:24:06 +080010279 HDA_CODEC_ENTRY(0x10ec0b00, "ALCS1200A", patch_alc882),
Kailang Yang65553b12017-07-11 15:15:47 +080010280 HDA_CODEC_ENTRY(0x10ec1168, "ALC1220", patch_alc882),
Kailang Yanga535ad52017-01-16 16:59:26 +080010281 HDA_CODEC_ENTRY(0x10ec1220, "ALC1220", patch_alc882),
Linus Torvalds1da177e2005-04-16 15:20:36 -070010282 {} /* terminator */
10283};
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010284MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_realtek);
Takashi Iwai1289e9e2008-11-27 15:47:11 +010010285
10286MODULE_LICENSE("GPL");
10287MODULE_DESCRIPTION("Realtek HD-audio codec");
10288
Takashi Iwaid8a766a2015-02-17 15:25:37 +010010289static struct hda_codec_driver realtek_driver = {
Takashi Iwaib9a94a92015-10-01 16:20:04 +020010290 .id = snd_hda_id_realtek,
Takashi Iwai1289e9e2008-11-27 15:47:11 +010010291};
10292
Takashi Iwaid8a766a2015-02-17 15:25:37 +010010293module_hda_codec_driver(realtek_driver);