0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #include <linux/init.h>
0014 #include <linux/delay.h>
0015 #include <linux/slab.h>
0016 #include <linux/pci.h>
0017 #include <linux/dmi.h>
0018 #include <linux/module.h>
0019 #include <linux/input.h>
0020 #include <linux/leds.h>
0021 #include <sound/core.h>
0022 #include <sound/jack.h>
0023 #include <sound/hda_codec.h>
0024 #include "hda_local.h"
0025 #include "hda_auto_parser.h"
0026 #include "hda_jack.h"
0027 #include "hda_generic.h"
0028 #include "hda_component.h"
0029
0030
0031 #define HALT_REALTEK_ALC5505
0032
0033
0034 enum {
0035 ALC_INIT_UNDEFINED,
0036 ALC_INIT_NONE,
0037 ALC_INIT_DEFAULT,
0038 };
0039
0040 enum {
0041 ALC_HEADSET_MODE_UNKNOWN,
0042 ALC_HEADSET_MODE_UNPLUGGED,
0043 ALC_HEADSET_MODE_HEADSET,
0044 ALC_HEADSET_MODE_MIC,
0045 ALC_HEADSET_MODE_HEADPHONE,
0046 };
0047
0048 enum {
0049 ALC_HEADSET_TYPE_UNKNOWN,
0050 ALC_HEADSET_TYPE_CTIA,
0051 ALC_HEADSET_TYPE_OMTP,
0052 };
0053
0054 enum {
0055 ALC_KEY_MICMUTE_INDEX,
0056 };
0057
0058 struct alc_customize_define {
0059 unsigned int sku_cfg;
0060 unsigned char port_connectivity;
0061 unsigned char check_sum;
0062 unsigned char customization;
0063 unsigned char external_amp;
0064 unsigned int enable_pcbeep:1;
0065 unsigned int platform_type:1;
0066 unsigned int swap:1;
0067 unsigned int override:1;
0068 unsigned int fixup:1;
0069 };
0070
0071 struct alc_coef_led {
0072 unsigned int idx;
0073 unsigned int mask;
0074 unsigned int on;
0075 unsigned int off;
0076 };
0077
0078 struct alc_spec {
0079 struct hda_gen_spec gen;
0080
0081
0082 struct alc_customize_define cdefine;
0083 unsigned int parse_flags;
0084
0085
0086 unsigned int gpio_mask;
0087 unsigned int gpio_dir;
0088 unsigned int gpio_data;
0089 bool gpio_write_delay;
0090
0091
0092 int mute_led_polarity;
0093 int micmute_led_polarity;
0094 hda_nid_t mute_led_nid;
0095 hda_nid_t cap_mute_led_nid;
0096
0097 unsigned int gpio_mute_led_mask;
0098 unsigned int gpio_mic_led_mask;
0099 struct alc_coef_led mute_led_coef;
0100 struct alc_coef_led mic_led_coef;
0101 struct mutex coef_mutex;
0102
0103 hda_nid_t headset_mic_pin;
0104 hda_nid_t headphone_mic_pin;
0105 int current_headset_mode;
0106 int current_headset_type;
0107
0108
0109 void (*init_hook)(struct hda_codec *codec);
0110 #ifdef CONFIG_PM
0111 void (*power_hook)(struct hda_codec *codec);
0112 #endif
0113 void (*shutup)(struct hda_codec *codec);
0114
0115 int init_amp;
0116 int codec_variant;
0117 unsigned int has_alc5505_dsp:1;
0118 unsigned int no_depop_delay:1;
0119 unsigned int done_hp_init:1;
0120 unsigned int no_shutup_pins:1;
0121 unsigned int ultra_low_power:1;
0122 unsigned int has_hs_key:1;
0123 unsigned int no_internal_mic_pin:1;
0124
0125
0126 hda_nid_t pll_nid;
0127 unsigned int pll_coef_idx, pll_coef_bit;
0128 unsigned int coef0;
0129 struct input_dev *kb_dev;
0130 u8 alc_mute_keycode_map[1];
0131
0132
0133 struct component_match *match;
0134 struct hda_component comps[HDA_MAX_COMPONENTS];
0135 };
0136
0137
0138
0139
0140
0141 static void coef_mutex_lock(struct hda_codec *codec)
0142 {
0143 struct alc_spec *spec = codec->spec;
0144
0145 snd_hda_power_up_pm(codec);
0146 mutex_lock(&spec->coef_mutex);
0147 }
0148
0149 static void coef_mutex_unlock(struct hda_codec *codec)
0150 {
0151 struct alc_spec *spec = codec->spec;
0152
0153 mutex_unlock(&spec->coef_mutex);
0154 snd_hda_power_down_pm(codec);
0155 }
0156
0157 static int __alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
0158 unsigned int coef_idx)
0159 {
0160 unsigned int val;
0161
0162 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
0163 val = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PROC_COEF, 0);
0164 return val;
0165 }
0166
0167 static int alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
0168 unsigned int coef_idx)
0169 {
0170 unsigned int val;
0171
0172 coef_mutex_lock(codec);
0173 val = __alc_read_coefex_idx(codec, nid, coef_idx);
0174 coef_mutex_unlock(codec);
0175 return val;
0176 }
0177
0178 #define alc_read_coef_idx(codec, coef_idx) \
0179 alc_read_coefex_idx(codec, 0x20, coef_idx)
0180
0181 static void __alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
0182 unsigned int coef_idx, unsigned int coef_val)
0183 {
0184 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
0185 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PROC_COEF, coef_val);
0186 }
0187
0188 static void alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
0189 unsigned int coef_idx, unsigned int coef_val)
0190 {
0191 coef_mutex_lock(codec);
0192 __alc_write_coefex_idx(codec, nid, coef_idx, coef_val);
0193 coef_mutex_unlock(codec);
0194 }
0195
0196 #define alc_write_coef_idx(codec, coef_idx, coef_val) \
0197 alc_write_coefex_idx(codec, 0x20, coef_idx, coef_val)
0198
0199 static void __alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
0200 unsigned int coef_idx, unsigned int mask,
0201 unsigned int bits_set)
0202 {
0203 unsigned int val = __alc_read_coefex_idx(codec, nid, coef_idx);
0204
0205 if (val != -1)
0206 __alc_write_coefex_idx(codec, nid, coef_idx,
0207 (val & ~mask) | bits_set);
0208 }
0209
0210 static void alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
0211 unsigned int coef_idx, unsigned int mask,
0212 unsigned int bits_set)
0213 {
0214 coef_mutex_lock(codec);
0215 __alc_update_coefex_idx(codec, nid, coef_idx, mask, bits_set);
0216 coef_mutex_unlock(codec);
0217 }
0218
0219 #define alc_update_coef_idx(codec, coef_idx, mask, bits_set) \
0220 alc_update_coefex_idx(codec, 0x20, coef_idx, mask, bits_set)
0221
0222
0223 static unsigned int alc_get_coef0(struct hda_codec *codec)
0224 {
0225 struct alc_spec *spec = codec->spec;
0226
0227 if (!spec->coef0)
0228 spec->coef0 = alc_read_coef_idx(codec, 0);
0229 return spec->coef0;
0230 }
0231
0232
0233 struct coef_fw {
0234 unsigned char nid;
0235 unsigned char idx;
0236 unsigned short mask;
0237 unsigned short val;
0238 };
0239
0240 #define UPDATE_COEFEX(_nid, _idx, _mask, _val) \
0241 { .nid = (_nid), .idx = (_idx), .mask = (_mask), .val = (_val) }
0242 #define WRITE_COEFEX(_nid, _idx, _val) UPDATE_COEFEX(_nid, _idx, -1, _val)
0243 #define WRITE_COEF(_idx, _val) WRITE_COEFEX(0x20, _idx, _val)
0244 #define UPDATE_COEF(_idx, _mask, _val) UPDATE_COEFEX(0x20, _idx, _mask, _val)
0245
0246 static void alc_process_coef_fw(struct hda_codec *codec,
0247 const struct coef_fw *fw)
0248 {
0249 coef_mutex_lock(codec);
0250 for (; fw->nid; fw++) {
0251 if (fw->mask == (unsigned short)-1)
0252 __alc_write_coefex_idx(codec, fw->nid, fw->idx, fw->val);
0253 else
0254 __alc_update_coefex_idx(codec, fw->nid, fw->idx,
0255 fw->mask, fw->val);
0256 }
0257 coef_mutex_unlock(codec);
0258 }
0259
0260
0261
0262
0263
0264
0265 static void alc_setup_gpio(struct hda_codec *codec, unsigned int mask)
0266 {
0267 struct alc_spec *spec = codec->spec;
0268
0269 spec->gpio_mask |= mask;
0270 spec->gpio_dir |= mask;
0271 spec->gpio_data |= mask;
0272 }
0273
0274 static void alc_write_gpio_data(struct hda_codec *codec)
0275 {
0276 struct alc_spec *spec = codec->spec;
0277
0278 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
0279 spec->gpio_data);
0280 }
0281
0282 static void alc_update_gpio_data(struct hda_codec *codec, unsigned int mask,
0283 bool on)
0284 {
0285 struct alc_spec *spec = codec->spec;
0286 unsigned int oldval = spec->gpio_data;
0287
0288 if (on)
0289 spec->gpio_data |= mask;
0290 else
0291 spec->gpio_data &= ~mask;
0292 if (oldval != spec->gpio_data)
0293 alc_write_gpio_data(codec);
0294 }
0295
0296 static void alc_write_gpio(struct hda_codec *codec)
0297 {
0298 struct alc_spec *spec = codec->spec;
0299
0300 if (!spec->gpio_mask)
0301 return;
0302
0303 snd_hda_codec_write(codec, codec->core.afg, 0,
0304 AC_VERB_SET_GPIO_MASK, spec->gpio_mask);
0305 snd_hda_codec_write(codec, codec->core.afg, 0,
0306 AC_VERB_SET_GPIO_DIRECTION, spec->gpio_dir);
0307 if (spec->gpio_write_delay)
0308 msleep(1);
0309 alc_write_gpio_data(codec);
0310 }
0311
0312 static void alc_fixup_gpio(struct hda_codec *codec, int action,
0313 unsigned int mask)
0314 {
0315 if (action == HDA_FIXUP_ACT_PRE_PROBE)
0316 alc_setup_gpio(codec, mask);
0317 }
0318
0319 static void alc_fixup_gpio1(struct hda_codec *codec,
0320 const struct hda_fixup *fix, int action)
0321 {
0322 alc_fixup_gpio(codec, action, 0x01);
0323 }
0324
0325 static void alc_fixup_gpio2(struct hda_codec *codec,
0326 const struct hda_fixup *fix, int action)
0327 {
0328 alc_fixup_gpio(codec, action, 0x02);
0329 }
0330
0331 static void alc_fixup_gpio3(struct hda_codec *codec,
0332 const struct hda_fixup *fix, int action)
0333 {
0334 alc_fixup_gpio(codec, action, 0x03);
0335 }
0336
0337 static void alc_fixup_gpio4(struct hda_codec *codec,
0338 const struct hda_fixup *fix, int action)
0339 {
0340 alc_fixup_gpio(codec, action, 0x04);
0341 }
0342
0343 static void alc_fixup_micmute_led(struct hda_codec *codec,
0344 const struct hda_fixup *fix, int action)
0345 {
0346 if (action == HDA_FIXUP_ACT_PRE_PROBE)
0347 snd_hda_gen_add_micmute_led_cdev(codec, NULL);
0348 }
0349
0350
0351
0352
0353
0354
0355 static void alc_fix_pll(struct hda_codec *codec)
0356 {
0357 struct alc_spec *spec = codec->spec;
0358
0359 if (spec->pll_nid)
0360 alc_update_coefex_idx(codec, spec->pll_nid, spec->pll_coef_idx,
0361 1 << spec->pll_coef_bit, 0);
0362 }
0363
0364 static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
0365 unsigned int coef_idx, unsigned int coef_bit)
0366 {
0367 struct alc_spec *spec = codec->spec;
0368 spec->pll_nid = nid;
0369 spec->pll_coef_idx = coef_idx;
0370 spec->pll_coef_bit = coef_bit;
0371 alc_fix_pll(codec);
0372 }
0373
0374
0375 static void alc_update_knob_master(struct hda_codec *codec,
0376 struct hda_jack_callback *jack)
0377 {
0378 unsigned int val;
0379 struct snd_kcontrol *kctl;
0380 struct snd_ctl_elem_value *uctl;
0381
0382 kctl = snd_hda_find_mixer_ctl(codec, "Master Playback Volume");
0383 if (!kctl)
0384 return;
0385 uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
0386 if (!uctl)
0387 return;
0388 val = snd_hda_codec_read(codec, jack->nid, 0,
0389 AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
0390 val &= HDA_AMP_VOLMASK;
0391 uctl->value.integer.value[0] = val;
0392 uctl->value.integer.value[1] = val;
0393 kctl->put(kctl, uctl);
0394 kfree(uctl);
0395 }
0396
0397 static void alc880_unsol_event(struct hda_codec *codec, unsigned int res)
0398 {
0399
0400
0401 snd_hda_jack_unsol_event(codec, res >> 2);
0402 }
0403
0404
0405 static void alc_fill_eapd_coef(struct hda_codec *codec)
0406 {
0407 int coef;
0408
0409 coef = alc_get_coef0(codec);
0410
0411 switch (codec->core.vendor_id) {
0412 case 0x10ec0262:
0413 alc_update_coef_idx(codec, 0x7, 0, 1<<5);
0414 break;
0415 case 0x10ec0267:
0416 case 0x10ec0268:
0417 alc_update_coef_idx(codec, 0x7, 0, 1<<13);
0418 break;
0419 case 0x10ec0269:
0420 if ((coef & 0x00f0) == 0x0010)
0421 alc_update_coef_idx(codec, 0xd, 0, 1<<14);
0422 if ((coef & 0x00f0) == 0x0020)
0423 alc_update_coef_idx(codec, 0x4, 1<<15, 0);
0424 if ((coef & 0x00f0) == 0x0030)
0425 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
0426 break;
0427 case 0x10ec0280:
0428 case 0x10ec0284:
0429 case 0x10ec0290:
0430 case 0x10ec0292:
0431 alc_update_coef_idx(codec, 0x4, 1<<15, 0);
0432 break;
0433 case 0x10ec0225:
0434 case 0x10ec0295:
0435 case 0x10ec0299:
0436 alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
0437 fallthrough;
0438 case 0x10ec0215:
0439 case 0x10ec0230:
0440 case 0x10ec0233:
0441 case 0x10ec0235:
0442 case 0x10ec0236:
0443 case 0x10ec0245:
0444 case 0x10ec0255:
0445 case 0x10ec0256:
0446 case 0x19e58326:
0447 case 0x10ec0257:
0448 case 0x10ec0282:
0449 case 0x10ec0283:
0450 case 0x10ec0286:
0451 case 0x10ec0288:
0452 case 0x10ec0285:
0453 case 0x10ec0298:
0454 case 0x10ec0289:
0455 case 0x10ec0300:
0456 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
0457 break;
0458 case 0x10ec0275:
0459 alc_update_coef_idx(codec, 0xe, 0, 1<<0);
0460 break;
0461 case 0x10ec0287:
0462 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
0463 alc_write_coef_idx(codec, 0x8, 0x4ab7);
0464 break;
0465 case 0x10ec0293:
0466 alc_update_coef_idx(codec, 0xa, 1<<13, 0);
0467 break;
0468 case 0x10ec0234:
0469 case 0x10ec0274:
0470 case 0x10ec0294:
0471 case 0x10ec0700:
0472 case 0x10ec0701:
0473 case 0x10ec0703:
0474 case 0x10ec0711:
0475 alc_update_coef_idx(codec, 0x10, 1<<15, 0);
0476 break;
0477 case 0x10ec0662:
0478 if ((coef & 0x00f0) == 0x0030)
0479 alc_update_coef_idx(codec, 0x4, 1<<10, 0);
0480 break;
0481 case 0x10ec0272:
0482 case 0x10ec0273:
0483 case 0x10ec0663:
0484 case 0x10ec0665:
0485 case 0x10ec0670:
0486 case 0x10ec0671:
0487 case 0x10ec0672:
0488 alc_update_coef_idx(codec, 0xd, 0, 1<<14);
0489 break;
0490 case 0x10ec0222:
0491 case 0x10ec0623:
0492 alc_update_coef_idx(codec, 0x19, 1<<13, 0);
0493 break;
0494 case 0x10ec0668:
0495 alc_update_coef_idx(codec, 0x7, 3<<13, 0);
0496 break;
0497 case 0x10ec0867:
0498 alc_update_coef_idx(codec, 0x4, 1<<10, 0);
0499 break;
0500 case 0x10ec0888:
0501 if ((coef & 0x00f0) == 0x0020 || (coef & 0x00f0) == 0x0030)
0502 alc_update_coef_idx(codec, 0x7, 1<<5, 0);
0503 break;
0504 case 0x10ec0892:
0505 case 0x10ec0897:
0506 alc_update_coef_idx(codec, 0x7, 1<<5, 0);
0507 break;
0508 case 0x10ec0899:
0509 case 0x10ec0900:
0510 case 0x10ec0b00:
0511 case 0x10ec1168:
0512 case 0x10ec1220:
0513 alc_update_coef_idx(codec, 0x7, 1<<1, 0);
0514 break;
0515 }
0516 }
0517
0518
0519 static void alc888_coef_init(struct hda_codec *codec)
0520 {
0521 switch (alc_get_coef0(codec) & 0x00f0) {
0522
0523 case 0x00:
0524
0525 case 0x10:
0526 alc_update_coef_idx(codec, 7, 0, 0x2030);
0527 break;
0528 }
0529 }
0530
0531
0532 static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
0533 {
0534 if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
0535 return;
0536 if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
0537 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
0538 on ? 2 : 0);
0539 }
0540
0541
0542 static void alc_auto_setup_eapd(struct hda_codec *codec, bool on)
0543 {
0544
0545 static const hda_nid_t pins[] = {
0546 0x0f, 0x10, 0x14, 0x15, 0x17, 0
0547 };
0548 const hda_nid_t *p;
0549 for (p = pins; *p; p++)
0550 set_eapd(codec, *p, on);
0551 }
0552
0553 static int find_ext_mic_pin(struct hda_codec *codec);
0554
0555 static void alc_headset_mic_no_shutup(struct hda_codec *codec)
0556 {
0557 const struct hda_pincfg *pin;
0558 int mic_pin = find_ext_mic_pin(codec);
0559 int i;
0560
0561
0562
0563
0564 if (codec->bus->shutdown)
0565 return;
0566
0567 snd_array_for_each(&codec->init_pins, i, pin) {
0568
0569 if (pin->nid != mic_pin)
0570 snd_hda_codec_read(codec, pin->nid, 0,
0571 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
0572 }
0573
0574 codec->pins_shutup = 1;
0575 }
0576
0577 static void alc_shutup_pins(struct hda_codec *codec)
0578 {
0579 struct alc_spec *spec = codec->spec;
0580
0581 switch (codec->core.vendor_id) {
0582 case 0x10ec0236:
0583 case 0x10ec0256:
0584 case 0x19e58326:
0585 case 0x10ec0283:
0586 case 0x10ec0286:
0587 case 0x10ec0288:
0588 case 0x10ec0298:
0589 alc_headset_mic_no_shutup(codec);
0590 break;
0591 default:
0592 if (!spec->no_shutup_pins)
0593 snd_hda_shutup_pins(codec);
0594 break;
0595 }
0596 }
0597
0598
0599
0600
0601 static void alc_eapd_shutup(struct hda_codec *codec)
0602 {
0603 struct alc_spec *spec = codec->spec;
0604
0605 alc_auto_setup_eapd(codec, false);
0606 if (!spec->no_depop_delay)
0607 msleep(200);
0608 alc_shutup_pins(codec);
0609 }
0610
0611
0612 static void alc_auto_init_amp(struct hda_codec *codec, int type)
0613 {
0614 alc_auto_setup_eapd(codec, true);
0615 alc_write_gpio(codec);
0616 switch (type) {
0617 case ALC_INIT_DEFAULT:
0618 switch (codec->core.vendor_id) {
0619 case 0x10ec0260:
0620 alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x2010);
0621 break;
0622 case 0x10ec0880:
0623 case 0x10ec0882:
0624 case 0x10ec0883:
0625 case 0x10ec0885:
0626 alc_update_coef_idx(codec, 7, 0, 0x2030);
0627 break;
0628 case 0x10ec0888:
0629 alc888_coef_init(codec);
0630 break;
0631 }
0632 break;
0633 }
0634 }
0635
0636
0637 static hda_nid_t alc_get_hp_pin(struct alc_spec *spec)
0638 {
0639 if (spec->gen.autocfg.hp_pins[0])
0640 return spec->gen.autocfg.hp_pins[0];
0641 if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
0642 return spec->gen.autocfg.line_out_pins[0];
0643 return 0;
0644 }
0645
0646
0647
0648
0649
0650
0651
0652
0653 #define ALC_FIXUP_SKU_IGNORE (2)
0654
0655 static void alc_fixup_sku_ignore(struct hda_codec *codec,
0656 const struct hda_fixup *fix, int action)
0657 {
0658 struct alc_spec *spec = codec->spec;
0659 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
0660 spec->cdefine.fixup = 1;
0661 spec->cdefine.sku_cfg = ALC_FIXUP_SKU_IGNORE;
0662 }
0663 }
0664
0665 static void alc_fixup_no_depop_delay(struct hda_codec *codec,
0666 const struct hda_fixup *fix, int action)
0667 {
0668 struct alc_spec *spec = codec->spec;
0669
0670 if (action == HDA_FIXUP_ACT_PROBE) {
0671 spec->no_depop_delay = 1;
0672 codec->depop_delay = 0;
0673 }
0674 }
0675
0676 static int alc_auto_parse_customize_define(struct hda_codec *codec)
0677 {
0678 unsigned int ass, tmp, i;
0679 unsigned nid = 0;
0680 struct alc_spec *spec = codec->spec;
0681
0682 spec->cdefine.enable_pcbeep = 1;
0683
0684 if (spec->cdefine.fixup) {
0685 ass = spec->cdefine.sku_cfg;
0686 if (ass == ALC_FIXUP_SKU_IGNORE)
0687 return -1;
0688 goto do_sku;
0689 }
0690
0691 if (!codec->bus->pci)
0692 return -1;
0693 ass = codec->core.subsystem_id & 0xffff;
0694 if (ass != codec->bus->pci->subsystem_device && (ass & 1))
0695 goto do_sku;
0696
0697 nid = 0x1d;
0698 if (codec->core.vendor_id == 0x10ec0260)
0699 nid = 0x17;
0700 ass = snd_hda_codec_get_pincfg(codec, nid);
0701
0702 if (!(ass & 1)) {
0703 codec_info(codec, "%s: SKU not ready 0x%08x\n",
0704 codec->core.chip_name, ass);
0705 return -1;
0706 }
0707
0708
0709 tmp = 0;
0710 for (i = 1; i < 16; i++) {
0711 if ((ass >> i) & 1)
0712 tmp++;
0713 }
0714 if (((ass >> 16) & 0xf) != tmp)
0715 return -1;
0716
0717 spec->cdefine.port_connectivity = ass >> 30;
0718 spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
0719 spec->cdefine.check_sum = (ass >> 16) & 0xf;
0720 spec->cdefine.customization = ass >> 8;
0721 do_sku:
0722 spec->cdefine.sku_cfg = ass;
0723 spec->cdefine.external_amp = (ass & 0x38) >> 3;
0724 spec->cdefine.platform_type = (ass & 0x4) >> 2;
0725 spec->cdefine.swap = (ass & 0x2) >> 1;
0726 spec->cdefine.override = ass & 0x1;
0727
0728 codec_dbg(codec, "SKU: Nid=0x%x sku_cfg=0x%08x\n",
0729 nid, spec->cdefine.sku_cfg);
0730 codec_dbg(codec, "SKU: port_connectivity=0x%x\n",
0731 spec->cdefine.port_connectivity);
0732 codec_dbg(codec, "SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
0733 codec_dbg(codec, "SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
0734 codec_dbg(codec, "SKU: customization=0x%08x\n", spec->cdefine.customization);
0735 codec_dbg(codec, "SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
0736 codec_dbg(codec, "SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
0737 codec_dbg(codec, "SKU: swap=0x%x\n", spec->cdefine.swap);
0738 codec_dbg(codec, "SKU: override=0x%x\n", spec->cdefine.override);
0739
0740 return 0;
0741 }
0742
0743
0744 static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
0745 {
0746 int i;
0747 for (i = 0; i < nums; i++)
0748 if (list[i] == nid)
0749 return i;
0750 return -1;
0751 }
0752
0753 static bool found_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
0754 {
0755 return find_idx_in_nid_list(nid, list, nums) >= 0;
0756 }
0757
0758
0759
0760
0761
0762
0763
0764
0765
0766
0767 static int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports)
0768 {
0769 unsigned int ass, tmp, i;
0770 unsigned nid;
0771 struct alc_spec *spec = codec->spec;
0772
0773 if (spec->cdefine.fixup) {
0774 ass = spec->cdefine.sku_cfg;
0775 if (ass == ALC_FIXUP_SKU_IGNORE)
0776 return 0;
0777 goto do_sku;
0778 }
0779
0780 ass = codec->core.subsystem_id & 0xffff;
0781 if (codec->bus->pci &&
0782 ass != codec->bus->pci->subsystem_device && (ass & 1))
0783 goto do_sku;
0784
0785
0786
0787
0788
0789
0790
0791
0792
0793
0794 nid = 0x1d;
0795 if (codec->core.vendor_id == 0x10ec0260)
0796 nid = 0x17;
0797 ass = snd_hda_codec_get_pincfg(codec, nid);
0798 codec_dbg(codec,
0799 "realtek: No valid SSID, checking pincfg 0x%08x for NID 0x%x\n",
0800 ass, nid);
0801 if (!(ass & 1))
0802 return 0;
0803 if ((ass >> 30) != 1)
0804 return 0;
0805
0806
0807 tmp = 0;
0808 for (i = 1; i < 16; i++) {
0809 if ((ass >> i) & 1)
0810 tmp++;
0811 }
0812 if (((ass >> 16) & 0xf) != tmp)
0813 return 0;
0814 do_sku:
0815 codec_dbg(codec, "realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
0816 ass & 0xffff, codec->core.vendor_id);
0817
0818
0819
0820
0821
0822
0823
0824 tmp = (ass & 0x38) >> 3;
0825 if (spec->init_amp == ALC_INIT_UNDEFINED) {
0826 switch (tmp) {
0827 case 1:
0828 alc_setup_gpio(codec, 0x01);
0829 break;
0830 case 3:
0831 alc_setup_gpio(codec, 0x02);
0832 break;
0833 case 7:
0834 alc_setup_gpio(codec, 0x03);
0835 break;
0836 case 5:
0837 default:
0838 spec->init_amp = ALC_INIT_DEFAULT;
0839 break;
0840 }
0841 }
0842
0843
0844
0845
0846 if (!(ass & 0x8000))
0847 return 1;
0848
0849
0850
0851
0852
0853
0854
0855 if (!alc_get_hp_pin(spec)) {
0856 hda_nid_t nid;
0857 tmp = (ass >> 11) & 0x3;
0858 nid = ports[tmp];
0859 if (found_in_nid_list(nid, spec->gen.autocfg.line_out_pins,
0860 spec->gen.autocfg.line_outs))
0861 return 1;
0862 spec->gen.autocfg.hp_pins[0] = nid;
0863 }
0864 return 1;
0865 }
0866
0867
0868
0869 static void alc_ssid_check(struct hda_codec *codec, const hda_nid_t *ports)
0870 {
0871 if (!alc_subsystem_id(codec, ports)) {
0872 struct alc_spec *spec = codec->spec;
0873 if (spec->init_amp == ALC_INIT_UNDEFINED) {
0874 codec_dbg(codec,
0875 "realtek: Enable default setup for auto mode as fallback\n");
0876 spec->init_amp = ALC_INIT_DEFAULT;
0877 }
0878 }
0879 }
0880
0881
0882
0883
0884 static void alc_fixup_inv_dmic(struct hda_codec *codec,
0885 const struct hda_fixup *fix, int action)
0886 {
0887 struct alc_spec *spec = codec->spec;
0888
0889 spec->gen.inv_dmic_split = 1;
0890 }
0891
0892
0893 static int alc_build_controls(struct hda_codec *codec)
0894 {
0895 int err;
0896
0897 err = snd_hda_gen_build_controls(codec);
0898 if (err < 0)
0899 return err;
0900
0901 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_BUILD);
0902 return 0;
0903 }
0904
0905
0906
0907
0908
0909
0910 static void alc_pre_init(struct hda_codec *codec)
0911 {
0912 alc_fill_eapd_coef(codec);
0913 }
0914
0915 #define is_s3_resume(codec) \
0916 ((codec)->core.dev.power.power_state.event == PM_EVENT_RESUME)
0917 #define is_s4_resume(codec) \
0918 ((codec)->core.dev.power.power_state.event == PM_EVENT_RESTORE)
0919
0920 static int alc_init(struct hda_codec *codec)
0921 {
0922 struct alc_spec *spec = codec->spec;
0923
0924
0925 if (is_s4_resume(codec))
0926 alc_pre_init(codec);
0927
0928 if (spec->init_hook)
0929 spec->init_hook(codec);
0930
0931 spec->gen.skip_verbs = 1;
0932 snd_hda_gen_init(codec);
0933 alc_fix_pll(codec);
0934 alc_auto_init_amp(codec, spec->init_amp);
0935 snd_hda_apply_verbs(codec);
0936
0937 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT);
0938
0939 return 0;
0940 }
0941
0942 #define alc_free snd_hda_gen_free
0943
0944 #ifdef CONFIG_PM
0945 static inline void alc_shutup(struct hda_codec *codec)
0946 {
0947 struct alc_spec *spec = codec->spec;
0948
0949 if (!snd_hda_get_bool_hint(codec, "shutup"))
0950 return;
0951
0952 if (spec && spec->shutup)
0953 spec->shutup(codec);
0954 else
0955 alc_shutup_pins(codec);
0956 }
0957
0958 static void alc_power_eapd(struct hda_codec *codec)
0959 {
0960 alc_auto_setup_eapd(codec, false);
0961 }
0962
0963 static int alc_suspend(struct hda_codec *codec)
0964 {
0965 struct alc_spec *spec = codec->spec;
0966 alc_shutup(codec);
0967 if (spec && spec->power_hook)
0968 spec->power_hook(codec);
0969 return 0;
0970 }
0971
0972 static int alc_resume(struct hda_codec *codec)
0973 {
0974 struct alc_spec *spec = codec->spec;
0975
0976 if (!spec->no_depop_delay)
0977 msleep(150);
0978 codec->patch_ops.init(codec);
0979 snd_hda_regmap_sync(codec);
0980 hda_call_check_power_status(codec, 0x01);
0981 return 0;
0982 }
0983 #endif
0984
0985
0986
0987 static const struct hda_codec_ops alc_patch_ops = {
0988 .build_controls = alc_build_controls,
0989 .build_pcms = snd_hda_gen_build_pcms,
0990 .init = alc_init,
0991 .free = alc_free,
0992 .unsol_event = snd_hda_jack_unsol_event,
0993 #ifdef CONFIG_PM
0994 .resume = alc_resume,
0995 .suspend = alc_suspend,
0996 .check_power_status = snd_hda_gen_check_power_status,
0997 #endif
0998 };
0999
1000
1001 #define alc_codec_rename(codec, name) snd_hda_codec_set_name(codec, name)
1002
1003
1004
1005
1006 struct alc_codec_rename_table {
1007 unsigned int vendor_id;
1008 unsigned short coef_mask;
1009 unsigned short coef_bits;
1010 const char *name;
1011 };
1012
1013 struct alc_codec_rename_pci_table {
1014 unsigned int codec_vendor_id;
1015 unsigned short pci_subvendor;
1016 unsigned short pci_subdevice;
1017 const char *name;
1018 };
1019
1020 static const struct alc_codec_rename_table rename_tbl[] = {
1021 { 0x10ec0221, 0xf00f, 0x1003, "ALC231" },
1022 { 0x10ec0269, 0xfff0, 0x3010, "ALC277" },
1023 { 0x10ec0269, 0xf0f0, 0x2010, "ALC259" },
1024 { 0x10ec0269, 0xf0f0, 0x3010, "ALC258" },
1025 { 0x10ec0269, 0x00f0, 0x0010, "ALC269VB" },
1026 { 0x10ec0269, 0xffff, 0xa023, "ALC259" },
1027 { 0x10ec0269, 0xffff, 0x6023, "ALC281X" },
1028 { 0x10ec0269, 0x00f0, 0x0020, "ALC269VC" },
1029 { 0x10ec0269, 0x00f0, 0x0030, "ALC269VD" },
1030 { 0x10ec0662, 0xffff, 0x4020, "ALC656" },
1031 { 0x10ec0887, 0x00f0, 0x0030, "ALC887-VD" },
1032 { 0x10ec0888, 0x00f0, 0x0030, "ALC888-VD" },
1033 { 0x10ec0888, 0xf0f0, 0x3020, "ALC886" },
1034 { 0x10ec0899, 0x2000, 0x2000, "ALC899" },
1035 { 0x10ec0892, 0xffff, 0x8020, "ALC661" },
1036 { 0x10ec0892, 0xffff, 0x8011, "ALC661" },
1037 { 0x10ec0892, 0xffff, 0x4011, "ALC656" },
1038 { }
1039 };
1040
1041 static const struct alc_codec_rename_pci_table rename_pci_tbl[] = {
1042 { 0x10ec0280, 0x1028, 0, "ALC3220" },
1043 { 0x10ec0282, 0x1028, 0, "ALC3221" },
1044 { 0x10ec0283, 0x1028, 0, "ALC3223" },
1045 { 0x10ec0288, 0x1028, 0, "ALC3263" },
1046 { 0x10ec0292, 0x1028, 0, "ALC3226" },
1047 { 0x10ec0293, 0x1028, 0, "ALC3235" },
1048 { 0x10ec0255, 0x1028, 0, "ALC3234" },
1049 { 0x10ec0668, 0x1028, 0, "ALC3661" },
1050 { 0x10ec0275, 0x1028, 0, "ALC3260" },
1051 { 0x10ec0899, 0x1028, 0, "ALC3861" },
1052 { 0x10ec0298, 0x1028, 0, "ALC3266" },
1053 { 0x10ec0236, 0x1028, 0, "ALC3204" },
1054 { 0x10ec0256, 0x1028, 0, "ALC3246" },
1055 { 0x10ec0225, 0x1028, 0, "ALC3253" },
1056 { 0x10ec0295, 0x1028, 0, "ALC3254" },
1057 { 0x10ec0299, 0x1028, 0, "ALC3271" },
1058 { 0x10ec0670, 0x1025, 0, "ALC669X" },
1059 { 0x10ec0676, 0x1025, 0, "ALC679X" },
1060 { 0x10ec0282, 0x1043, 0, "ALC3229" },
1061 { 0x10ec0233, 0x1043, 0, "ALC3236" },
1062 { 0x10ec0280, 0x103c, 0, "ALC3228" },
1063 { 0x10ec0282, 0x103c, 0, "ALC3227" },
1064 { 0x10ec0286, 0x103c, 0, "ALC3242" },
1065 { 0x10ec0290, 0x103c, 0, "ALC3241" },
1066 { 0x10ec0668, 0x103c, 0, "ALC3662" },
1067 { 0x10ec0283, 0x17aa, 0, "ALC3239" },
1068 { 0x10ec0292, 0x17aa, 0, "ALC3232" },
1069 { }
1070 };
1071
1072 static int alc_codec_rename_from_preset(struct hda_codec *codec)
1073 {
1074 const struct alc_codec_rename_table *p;
1075 const struct alc_codec_rename_pci_table *q;
1076
1077 for (p = rename_tbl; p->vendor_id; p++) {
1078 if (p->vendor_id != codec->core.vendor_id)
1079 continue;
1080 if ((alc_get_coef0(codec) & p->coef_mask) == p->coef_bits)
1081 return alc_codec_rename(codec, p->name);
1082 }
1083
1084 if (!codec->bus->pci)
1085 return 0;
1086 for (q = rename_pci_tbl; q->codec_vendor_id; q++) {
1087 if (q->codec_vendor_id != codec->core.vendor_id)
1088 continue;
1089 if (q->pci_subvendor != codec->bus->pci->subsystem_vendor)
1090 continue;
1091 if (!q->pci_subdevice ||
1092 q->pci_subdevice == codec->bus->pci->subsystem_device)
1093 return alc_codec_rename(codec, q->name);
1094 }
1095
1096 return 0;
1097 }
1098
1099
1100
1101
1102
1103 #ifdef CONFIG_SND_HDA_INPUT_BEEP
1104
1105
1106 static const struct snd_kcontrol_new alc_beep_mixer[] = {
1107 HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
1108 HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
1109 };
1110
1111
1112 static int set_beep_amp(struct alc_spec *spec, hda_nid_t nid,
1113 int idx, int dir)
1114 {
1115 struct snd_kcontrol_new *knew;
1116 unsigned int beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir);
1117 int i;
1118
1119 for (i = 0; i < ARRAY_SIZE(alc_beep_mixer); i++) {
1120 knew = snd_hda_gen_add_kctl(&spec->gen, NULL,
1121 &alc_beep_mixer[i]);
1122 if (!knew)
1123 return -ENOMEM;
1124 knew->private_value = beep_amp;
1125 }
1126 return 0;
1127 }
1128
1129 static const struct snd_pci_quirk beep_allow_list[] = {
1130 SND_PCI_QUIRK(0x1043, 0x103c, "ASUS", 1),
1131 SND_PCI_QUIRK(0x1043, 0x115d, "ASUS", 1),
1132 SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),
1133 SND_PCI_QUIRK(0x1043, 0x8376, "EeePC", 1),
1134 SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1),
1135 SND_PCI_QUIRK(0x1043, 0x831a, "EeePC", 1),
1136 SND_PCI_QUIRK(0x1043, 0x834a, "EeePC", 1),
1137 SND_PCI_QUIRK(0x1458, 0xa002, "GA-MA790X", 1),
1138 SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),
1139
1140 SND_PCI_QUIRK(0x17aa, 0x309e, "Lenovo ThinkCentre M73", 0),
1141 SND_PCI_QUIRK(0x17aa, 0x30a3, "Lenovo ThinkCentre M93", 0),
1142 {}
1143 };
1144
1145 static inline int has_cdefine_beep(struct hda_codec *codec)
1146 {
1147 struct alc_spec *spec = codec->spec;
1148 const struct snd_pci_quirk *q;
1149 q = snd_pci_quirk_lookup(codec->bus->pci, beep_allow_list);
1150 if (q)
1151 return q->value;
1152 return spec->cdefine.enable_pcbeep;
1153 }
1154 #else
1155 #define set_beep_amp(spec, nid, idx, dir) 0
1156 #define has_cdefine_beep(codec) 0
1157 #endif
1158
1159
1160
1161
1162
1163 static int alc_parse_auto_config(struct hda_codec *codec,
1164 const hda_nid_t *ignore_nids,
1165 const hda_nid_t *ssid_nids)
1166 {
1167 struct alc_spec *spec = codec->spec;
1168 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
1169 int err;
1170
1171 err = snd_hda_parse_pin_defcfg(codec, cfg, ignore_nids,
1172 spec->parse_flags);
1173 if (err < 0)
1174 return err;
1175
1176 if (ssid_nids)
1177 alc_ssid_check(codec, ssid_nids);
1178
1179 err = snd_hda_gen_parse_auto_config(codec, cfg);
1180 if (err < 0)
1181 return err;
1182
1183 return 1;
1184 }
1185
1186
1187 static int alc_alloc_spec(struct hda_codec *codec, hda_nid_t mixer_nid)
1188 {
1189 struct alc_spec *spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1190 int err;
1191
1192 if (!spec)
1193 return -ENOMEM;
1194 codec->spec = spec;
1195 snd_hda_gen_spec_init(&spec->gen);
1196 spec->gen.mixer_nid = mixer_nid;
1197 spec->gen.own_eapd_ctl = 1;
1198 codec->single_adc_amp = 1;
1199
1200 codec->spdif_status_reset = 1;
1201 codec->forced_resume = 1;
1202 codec->patch_ops = alc_patch_ops;
1203 mutex_init(&spec->coef_mutex);
1204
1205 err = alc_codec_rename_from_preset(codec);
1206 if (err < 0) {
1207 kfree(spec);
1208 return err;
1209 }
1210 return 0;
1211 }
1212
1213 static int alc880_parse_auto_config(struct hda_codec *codec)
1214 {
1215 static const hda_nid_t alc880_ignore[] = { 0x1d, 0 };
1216 static const hda_nid_t alc880_ssids[] = { 0x15, 0x1b, 0x14, 0 };
1217 return alc_parse_auto_config(codec, alc880_ignore, alc880_ssids);
1218 }
1219
1220
1221
1222
1223 enum {
1224 ALC880_FIXUP_GPIO1,
1225 ALC880_FIXUP_GPIO2,
1226 ALC880_FIXUP_MEDION_RIM,
1227 ALC880_FIXUP_LG,
1228 ALC880_FIXUP_LG_LW25,
1229 ALC880_FIXUP_W810,
1230 ALC880_FIXUP_EAPD_COEF,
1231 ALC880_FIXUP_TCL_S700,
1232 ALC880_FIXUP_VOL_KNOB,
1233 ALC880_FIXUP_FUJITSU,
1234 ALC880_FIXUP_F1734,
1235 ALC880_FIXUP_UNIWILL,
1236 ALC880_FIXUP_UNIWILL_DIG,
1237 ALC880_FIXUP_Z71V,
1238 ALC880_FIXUP_ASUS_W5A,
1239 ALC880_FIXUP_3ST_BASE,
1240 ALC880_FIXUP_3ST,
1241 ALC880_FIXUP_3ST_DIG,
1242 ALC880_FIXUP_5ST_BASE,
1243 ALC880_FIXUP_5ST,
1244 ALC880_FIXUP_5ST_DIG,
1245 ALC880_FIXUP_6ST_BASE,
1246 ALC880_FIXUP_6ST,
1247 ALC880_FIXUP_6ST_DIG,
1248 ALC880_FIXUP_6ST_AUTOMUTE,
1249 };
1250
1251
1252 static void alc880_fixup_vol_knob(struct hda_codec *codec,
1253 const struct hda_fixup *fix, int action)
1254 {
1255 if (action == HDA_FIXUP_ACT_PROBE)
1256 snd_hda_jack_detect_enable_callback(codec, 0x21,
1257 alc_update_knob_master);
1258 }
1259
1260 static const struct hda_fixup alc880_fixups[] = {
1261 [ALC880_FIXUP_GPIO1] = {
1262 .type = HDA_FIXUP_FUNC,
1263 .v.func = alc_fixup_gpio1,
1264 },
1265 [ALC880_FIXUP_GPIO2] = {
1266 .type = HDA_FIXUP_FUNC,
1267 .v.func = alc_fixup_gpio2,
1268 },
1269 [ALC880_FIXUP_MEDION_RIM] = {
1270 .type = HDA_FIXUP_VERBS,
1271 .v.verbs = (const struct hda_verb[]) {
1272 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1273 { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
1274 { }
1275 },
1276 .chained = true,
1277 .chain_id = ALC880_FIXUP_GPIO2,
1278 },
1279 [ALC880_FIXUP_LG] = {
1280 .type = HDA_FIXUP_PINS,
1281 .v.pins = (const struct hda_pintbl[]) {
1282
1283 { 0x16, 0x411111f0 },
1284 { 0x18, 0x411111f0 },
1285 { 0x1a, 0x411111f0 },
1286 { }
1287 }
1288 },
1289 [ALC880_FIXUP_LG_LW25] = {
1290 .type = HDA_FIXUP_PINS,
1291 .v.pins = (const struct hda_pintbl[]) {
1292 { 0x1a, 0x0181344f },
1293 { 0x1b, 0x0321403f },
1294 { }
1295 }
1296 },
1297 [ALC880_FIXUP_W810] = {
1298 .type = HDA_FIXUP_PINS,
1299 .v.pins = (const struct hda_pintbl[]) {
1300
1301 { 0x17, 0x411111f0 },
1302 { }
1303 },
1304 .chained = true,
1305 .chain_id = ALC880_FIXUP_GPIO2,
1306 },
1307 [ALC880_FIXUP_EAPD_COEF] = {
1308 .type = HDA_FIXUP_VERBS,
1309 .v.verbs = (const struct hda_verb[]) {
1310
1311 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1312 { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
1313 {}
1314 },
1315 },
1316 [ALC880_FIXUP_TCL_S700] = {
1317 .type = HDA_FIXUP_VERBS,
1318 .v.verbs = (const struct hda_verb[]) {
1319
1320 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1321 { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
1322 {}
1323 },
1324 .chained = true,
1325 .chain_id = ALC880_FIXUP_GPIO2,
1326 },
1327 [ALC880_FIXUP_VOL_KNOB] = {
1328 .type = HDA_FIXUP_FUNC,
1329 .v.func = alc880_fixup_vol_knob,
1330 },
1331 [ALC880_FIXUP_FUJITSU] = {
1332
1333 .type = HDA_FIXUP_PINS,
1334 .v.pins = (const struct hda_pintbl[]) {
1335 { 0x14, 0x0121401f },
1336 { 0x15, 0x99030120 },
1337 { 0x16, 0x99030130 },
1338 { 0x17, 0x411111f0 },
1339 { 0x18, 0x411111f0 },
1340 { 0x19, 0x01a19950 },
1341 { 0x1a, 0x411111f0 },
1342 { 0x1b, 0x411111f0 },
1343 { 0x1c, 0x411111f0 },
1344 { 0x1d, 0x411111f0 },
1345 { 0x1e, 0x01454140 },
1346 { }
1347 },
1348 .chained = true,
1349 .chain_id = ALC880_FIXUP_VOL_KNOB,
1350 },
1351 [ALC880_FIXUP_F1734] = {
1352
1353 .type = HDA_FIXUP_PINS,
1354 .v.pins = (const struct hda_pintbl[]) {
1355 { 0x14, 0x0121401f },
1356 { 0x15, 0x99030120 },
1357 { 0x16, 0x411111f0 },
1358 { 0x17, 0x411111f0 },
1359 { 0x18, 0x411111f0 },
1360 { 0x19, 0x01a19950 },
1361 { 0x1a, 0x411111f0 },
1362 { 0x1b, 0x411111f0 },
1363 { 0x1c, 0x411111f0 },
1364 { 0x1d, 0x411111f0 },
1365 { 0x1e, 0x411111f0 },
1366 { }
1367 },
1368 .chained = true,
1369 .chain_id = ALC880_FIXUP_VOL_KNOB,
1370 },
1371 [ALC880_FIXUP_UNIWILL] = {
1372
1373 .type = HDA_FIXUP_PINS,
1374 .v.pins = (const struct hda_pintbl[]) {
1375 { 0x14, 0x0121411f },
1376 { 0x15, 0x99030120 },
1377 { 0x16, 0x99030130 },
1378 { }
1379 },
1380 },
1381 [ALC880_FIXUP_UNIWILL_DIG] = {
1382 .type = HDA_FIXUP_PINS,
1383 .v.pins = (const struct hda_pintbl[]) {
1384
1385 { 0x17, 0x411111f0 },
1386 { 0x19, 0x411111f0 },
1387 { 0x1b, 0x411111f0 },
1388 { 0x1f, 0x411111f0 },
1389 { }
1390 }
1391 },
1392 [ALC880_FIXUP_Z71V] = {
1393 .type = HDA_FIXUP_PINS,
1394 .v.pins = (const struct hda_pintbl[]) {
1395
1396 { 0x14, 0x99030120 },
1397 { 0x15, 0x0121411f },
1398 { 0x16, 0x411111f0 },
1399 { 0x17, 0x411111f0 },
1400 { 0x18, 0x01a19950 },
1401 { 0x19, 0x411111f0 },
1402 { 0x1a, 0x01813031 },
1403 { 0x1b, 0x411111f0 },
1404 { 0x1c, 0x411111f0 },
1405 { 0x1d, 0x411111f0 },
1406 { 0x1e, 0x0144111e },
1407 { }
1408 }
1409 },
1410 [ALC880_FIXUP_ASUS_W5A] = {
1411 .type = HDA_FIXUP_PINS,
1412 .v.pins = (const struct hda_pintbl[]) {
1413
1414 { 0x14, 0x0121411f },
1415 { 0x15, 0x411111f0 },
1416 { 0x16, 0x411111f0 },
1417 { 0x17, 0x411111f0 },
1418 { 0x18, 0x90a60160 },
1419 { 0x19, 0x411111f0 },
1420 { 0x1a, 0x411111f0 },
1421 { 0x1b, 0x411111f0 },
1422 { 0x1c, 0x411111f0 },
1423 { 0x1d, 0x411111f0 },
1424 { 0x1e, 0xb743111e },
1425 { }
1426 },
1427 .chained = true,
1428 .chain_id = ALC880_FIXUP_GPIO1,
1429 },
1430 [ALC880_FIXUP_3ST_BASE] = {
1431 .type = HDA_FIXUP_PINS,
1432 .v.pins = (const struct hda_pintbl[]) {
1433 { 0x14, 0x01014010 },
1434 { 0x15, 0x411111f0 },
1435 { 0x16, 0x411111f0 },
1436 { 0x17, 0x411111f0 },
1437 { 0x18, 0x01a19c30 },
1438 { 0x19, 0x0121411f },
1439 { 0x1a, 0x01813031 },
1440 { 0x1b, 0x02a19c40 },
1441 { 0x1c, 0x411111f0 },
1442 { 0x1d, 0x411111f0 },
1443
1444 { 0x1f, 0x411111f0 },
1445 { }
1446 }
1447 },
1448 [ALC880_FIXUP_3ST] = {
1449 .type = HDA_FIXUP_PINS,
1450 .v.pins = (const struct hda_pintbl[]) {
1451 { 0x1e, 0x411111f0 },
1452 { }
1453 },
1454 .chained = true,
1455 .chain_id = ALC880_FIXUP_3ST_BASE,
1456 },
1457 [ALC880_FIXUP_3ST_DIG] = {
1458 .type = HDA_FIXUP_PINS,
1459 .v.pins = (const struct hda_pintbl[]) {
1460 { 0x1e, 0x0144111e },
1461 { }
1462 },
1463 .chained = true,
1464 .chain_id = ALC880_FIXUP_3ST_BASE,
1465 },
1466 [ALC880_FIXUP_5ST_BASE] = {
1467 .type = HDA_FIXUP_PINS,
1468 .v.pins = (const struct hda_pintbl[]) {
1469 { 0x14, 0x01014010 },
1470 { 0x15, 0x411111f0 },
1471 { 0x16, 0x01011411 },
1472 { 0x17, 0x01016412 },
1473 { 0x18, 0x01a19c30 },
1474 { 0x19, 0x0121411f },
1475 { 0x1a, 0x01813031 },
1476 { 0x1b, 0x02a19c40 },
1477 { 0x1c, 0x411111f0 },
1478 { 0x1d, 0x411111f0 },
1479
1480 { 0x1f, 0x411111f0 },
1481 { }
1482 }
1483 },
1484 [ALC880_FIXUP_5ST] = {
1485 .type = HDA_FIXUP_PINS,
1486 .v.pins = (const struct hda_pintbl[]) {
1487 { 0x1e, 0x411111f0 },
1488 { }
1489 },
1490 .chained = true,
1491 .chain_id = ALC880_FIXUP_5ST_BASE,
1492 },
1493 [ALC880_FIXUP_5ST_DIG] = {
1494 .type = HDA_FIXUP_PINS,
1495 .v.pins = (const struct hda_pintbl[]) {
1496 { 0x1e, 0x0144111e },
1497 { }
1498 },
1499 .chained = true,
1500 .chain_id = ALC880_FIXUP_5ST_BASE,
1501 },
1502 [ALC880_FIXUP_6ST_BASE] = {
1503 .type = HDA_FIXUP_PINS,
1504 .v.pins = (const struct hda_pintbl[]) {
1505 { 0x14, 0x01014010 },
1506 { 0x15, 0x01016412 },
1507 { 0x16, 0x01011411 },
1508 { 0x17, 0x01012414 },
1509 { 0x18, 0x01a19c30 },
1510 { 0x19, 0x02a19c40 },
1511 { 0x1a, 0x01813031 },
1512 { 0x1b, 0x0121411f },
1513 { 0x1c, 0x411111f0 },
1514 { 0x1d, 0x411111f0 },
1515
1516 { 0x1f, 0x411111f0 },
1517 { }
1518 }
1519 },
1520 [ALC880_FIXUP_6ST] = {
1521 .type = HDA_FIXUP_PINS,
1522 .v.pins = (const struct hda_pintbl[]) {
1523 { 0x1e, 0x411111f0 },
1524 { }
1525 },
1526 .chained = true,
1527 .chain_id = ALC880_FIXUP_6ST_BASE,
1528 },
1529 [ALC880_FIXUP_6ST_DIG] = {
1530 .type = HDA_FIXUP_PINS,
1531 .v.pins = (const struct hda_pintbl[]) {
1532 { 0x1e, 0x0144111e },
1533 { }
1534 },
1535 .chained = true,
1536 .chain_id = ALC880_FIXUP_6ST_BASE,
1537 },
1538 [ALC880_FIXUP_6ST_AUTOMUTE] = {
1539 .type = HDA_FIXUP_PINS,
1540 .v.pins = (const struct hda_pintbl[]) {
1541 { 0x1b, 0x0121401f },
1542 { }
1543 },
1544 .chained_before = true,
1545 .chain_id = ALC880_FIXUP_6ST_BASE,
1546 },
1547 };
1548
1549 static const struct snd_pci_quirk alc880_fixup_tbl[] = {
1550 SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_FIXUP_W810),
1551 SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS W5A", ALC880_FIXUP_ASUS_W5A),
1552 SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_FIXUP_Z71V),
1553 SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_FIXUP_GPIO1),
1554 SND_PCI_QUIRK(0x147b, 0x1045, "ABit AA8XE", ALC880_FIXUP_6ST_AUTOMUTE),
1555 SND_PCI_QUIRK(0x1558, 0x5401, "Clevo GPIO2", ALC880_FIXUP_GPIO2),
1556 SND_PCI_QUIRK_VENDOR(0x1558, "Clevo", ALC880_FIXUP_EAPD_COEF),
1557 SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_FIXUP_UNIWILL_DIG),
1558 SND_PCI_QUIRK(0x1584, 0x9054, "Uniwill", ALC880_FIXUP_F1734),
1559 SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_FIXUP_UNIWILL),
1560 SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_FIXUP_VOL_KNOB),
1561 SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_FIXUP_W810),
1562 SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_FIXUP_MEDION_RIM),
1563 SND_PCI_QUIRK(0x1631, 0xe011, "PB 13201056", ALC880_FIXUP_6ST_AUTOMUTE),
1564 SND_PCI_QUIRK(0x1734, 0x107c, "FSC Amilo M1437", ALC880_FIXUP_FUJITSU),
1565 SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FIXUP_FUJITSU),
1566 SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_FIXUP_F1734),
1567 SND_PCI_QUIRK(0x1734, 0x10b0, "FSC Amilo Pi1556", ALC880_FIXUP_FUJITSU),
1568 SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_FIXUP_LG),
1569 SND_PCI_QUIRK(0x1854, 0x005f, "LG P1 Express", ALC880_FIXUP_LG),
1570 SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_FIXUP_LG),
1571 SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_FIXUP_LG_LW25),
1572 SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_FIXUP_TCL_S700),
1573
1574
1575
1576
1577
1578
1579
1580 SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_FIXUP_5ST_DIG),
1581 SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_FIXUP_6ST),
1582 SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_FIXUP_3ST_DIG),
1583 SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_FIXUP_6ST_DIG),
1584 SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_FIXUP_6ST_DIG),
1585 SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_FIXUP_6ST_DIG),
1586 SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_FIXUP_3ST_DIG),
1587 SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_FIXUP_3ST),
1588 SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_FIXUP_6ST_DIG),
1589 SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_FIXUP_3ST),
1590 SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_FIXUP_3ST),
1591 SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_FIXUP_5ST),
1592 SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_FIXUP_5ST),
1593 SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_FIXUP_5ST),
1594 SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_FIXUP_6ST_DIG),
1595 SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_FIXUP_6ST_DIG),
1596 SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_FIXUP_6ST_DIG),
1597 SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_FIXUP_6ST_DIG),
1598 SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_FIXUP_5ST_DIG),
1599 SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_FIXUP_5ST_DIG),
1600 SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_FIXUP_5ST_DIG),
1601 SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_FIXUP_6ST_DIG),
1602 SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_FIXUP_6ST_DIG),
1603 SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1604 SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1605 SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1606 SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1607 SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1608 SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1609 SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1610 SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1611 SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1612 SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1613
1614 SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_FIXUP_3ST),
1615 SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_FIXUP_5ST_DIG),
1616 SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_FIXUP_6ST_DIG),
1617 {}
1618 };
1619
1620 static const struct hda_model_fixup alc880_fixup_models[] = {
1621 {.id = ALC880_FIXUP_3ST, .name = "3stack"},
1622 {.id = ALC880_FIXUP_3ST_DIG, .name = "3stack-digout"},
1623 {.id = ALC880_FIXUP_5ST, .name = "5stack"},
1624 {.id = ALC880_FIXUP_5ST_DIG, .name = "5stack-digout"},
1625 {.id = ALC880_FIXUP_6ST, .name = "6stack"},
1626 {.id = ALC880_FIXUP_6ST_DIG, .name = "6stack-digout"},
1627 {.id = ALC880_FIXUP_6ST_AUTOMUTE, .name = "6stack-automute"},
1628 {}
1629 };
1630
1631
1632
1633
1634
1635 static int patch_alc880(struct hda_codec *codec)
1636 {
1637 struct alc_spec *spec;
1638 int err;
1639
1640 err = alc_alloc_spec(codec, 0x0b);
1641 if (err < 0)
1642 return err;
1643
1644 spec = codec->spec;
1645 spec->gen.need_dac_fix = 1;
1646 spec->gen.beep_nid = 0x01;
1647
1648 codec->patch_ops.unsol_event = alc880_unsol_event;
1649
1650 alc_pre_init(codec);
1651
1652 snd_hda_pick_fixup(codec, alc880_fixup_models, alc880_fixup_tbl,
1653 alc880_fixups);
1654 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1655
1656
1657 err = alc880_parse_auto_config(codec);
1658 if (err < 0)
1659 goto error;
1660
1661 if (!spec->gen.no_analog) {
1662 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
1663 if (err < 0)
1664 goto error;
1665 }
1666
1667 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
1668
1669 return 0;
1670
1671 error:
1672 alc_free(codec);
1673 return err;
1674 }
1675
1676
1677
1678
1679
1680 static int alc260_parse_auto_config(struct hda_codec *codec)
1681 {
1682 static const hda_nid_t alc260_ignore[] = { 0x17, 0 };
1683 static const hda_nid_t alc260_ssids[] = { 0x10, 0x15, 0x0f, 0 };
1684 return alc_parse_auto_config(codec, alc260_ignore, alc260_ssids);
1685 }
1686
1687
1688
1689
1690 enum {
1691 ALC260_FIXUP_HP_DC5750,
1692 ALC260_FIXUP_HP_PIN_0F,
1693 ALC260_FIXUP_COEF,
1694 ALC260_FIXUP_GPIO1,
1695 ALC260_FIXUP_GPIO1_TOGGLE,
1696 ALC260_FIXUP_REPLACER,
1697 ALC260_FIXUP_HP_B1900,
1698 ALC260_FIXUP_KN1,
1699 ALC260_FIXUP_FSC_S7020,
1700 ALC260_FIXUP_FSC_S7020_JWSE,
1701 ALC260_FIXUP_VAIO_PINS,
1702 };
1703
1704 static void alc260_gpio1_automute(struct hda_codec *codec)
1705 {
1706 struct alc_spec *spec = codec->spec;
1707
1708 alc_update_gpio_data(codec, 0x01, spec->gen.hp_jack_present);
1709 }
1710
1711 static void alc260_fixup_gpio1_toggle(struct hda_codec *codec,
1712 const struct hda_fixup *fix, int action)
1713 {
1714 struct alc_spec *spec = codec->spec;
1715 if (action == HDA_FIXUP_ACT_PROBE) {
1716
1717
1718
1719 spec->gen.automute_hook = alc260_gpio1_automute;
1720 spec->gen.detect_hp = 1;
1721 spec->gen.automute_speaker = 1;
1722 spec->gen.autocfg.hp_pins[0] = 0x0f;
1723 snd_hda_jack_detect_enable_callback(codec, 0x0f,
1724 snd_hda_gen_hp_automute);
1725 alc_setup_gpio(codec, 0x01);
1726 }
1727 }
1728
1729 static void alc260_fixup_kn1(struct hda_codec *codec,
1730 const struct hda_fixup *fix, int action)
1731 {
1732 struct alc_spec *spec = codec->spec;
1733 static const struct hda_pintbl pincfgs[] = {
1734 { 0x0f, 0x02214000 },
1735 { 0x12, 0x90a60160 },
1736 { 0x13, 0x02a19000 },
1737 { 0x18, 0x01446000 },
1738
1739 { 0x10, 0x411111f0 },
1740 { 0x11, 0x411111f0 },
1741 { 0x14, 0x411111f0 },
1742 { 0x15, 0x411111f0 },
1743 { 0x16, 0x411111f0 },
1744 { 0x17, 0x411111f0 },
1745 { 0x19, 0x411111f0 },
1746 { }
1747 };
1748
1749 switch (action) {
1750 case HDA_FIXUP_ACT_PRE_PROBE:
1751 snd_hda_apply_pincfgs(codec, pincfgs);
1752 spec->init_amp = ALC_INIT_NONE;
1753 break;
1754 }
1755 }
1756
1757 static void alc260_fixup_fsc_s7020(struct hda_codec *codec,
1758 const struct hda_fixup *fix, int action)
1759 {
1760 struct alc_spec *spec = codec->spec;
1761 if (action == HDA_FIXUP_ACT_PRE_PROBE)
1762 spec->init_amp = ALC_INIT_NONE;
1763 }
1764
1765 static void alc260_fixup_fsc_s7020_jwse(struct hda_codec *codec,
1766 const struct hda_fixup *fix, int action)
1767 {
1768 struct alc_spec *spec = codec->spec;
1769 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1770 spec->gen.add_jack_modes = 1;
1771 spec->gen.hp_mic = 1;
1772 }
1773 }
1774
1775 static const struct hda_fixup alc260_fixups[] = {
1776 [ALC260_FIXUP_HP_DC5750] = {
1777 .type = HDA_FIXUP_PINS,
1778 .v.pins = (const struct hda_pintbl[]) {
1779 { 0x11, 0x90130110 },
1780 { }
1781 }
1782 },
1783 [ALC260_FIXUP_HP_PIN_0F] = {
1784 .type = HDA_FIXUP_PINS,
1785 .v.pins = (const struct hda_pintbl[]) {
1786 { 0x0f, 0x01214000 },
1787 { }
1788 }
1789 },
1790 [ALC260_FIXUP_COEF] = {
1791 .type = HDA_FIXUP_VERBS,
1792 .v.verbs = (const struct hda_verb[]) {
1793 { 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1794 { 0x1a, AC_VERB_SET_PROC_COEF, 0x3040 },
1795 { }
1796 },
1797 },
1798 [ALC260_FIXUP_GPIO1] = {
1799 .type = HDA_FIXUP_FUNC,
1800 .v.func = alc_fixup_gpio1,
1801 },
1802 [ALC260_FIXUP_GPIO1_TOGGLE] = {
1803 .type = HDA_FIXUP_FUNC,
1804 .v.func = alc260_fixup_gpio1_toggle,
1805 .chained = true,
1806 .chain_id = ALC260_FIXUP_HP_PIN_0F,
1807 },
1808 [ALC260_FIXUP_REPLACER] = {
1809 .type = HDA_FIXUP_VERBS,
1810 .v.verbs = (const struct hda_verb[]) {
1811 { 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1812 { 0x1a, AC_VERB_SET_PROC_COEF, 0x3050 },
1813 { }
1814 },
1815 .chained = true,
1816 .chain_id = ALC260_FIXUP_GPIO1_TOGGLE,
1817 },
1818 [ALC260_FIXUP_HP_B1900] = {
1819 .type = HDA_FIXUP_FUNC,
1820 .v.func = alc260_fixup_gpio1_toggle,
1821 .chained = true,
1822 .chain_id = ALC260_FIXUP_COEF,
1823 },
1824 [ALC260_FIXUP_KN1] = {
1825 .type = HDA_FIXUP_FUNC,
1826 .v.func = alc260_fixup_kn1,
1827 },
1828 [ALC260_FIXUP_FSC_S7020] = {
1829 .type = HDA_FIXUP_FUNC,
1830 .v.func = alc260_fixup_fsc_s7020,
1831 },
1832 [ALC260_FIXUP_FSC_S7020_JWSE] = {
1833 .type = HDA_FIXUP_FUNC,
1834 .v.func = alc260_fixup_fsc_s7020_jwse,
1835 .chained = true,
1836 .chain_id = ALC260_FIXUP_FSC_S7020,
1837 },
1838 [ALC260_FIXUP_VAIO_PINS] = {
1839 .type = HDA_FIXUP_PINS,
1840 .v.pins = (const struct hda_pintbl[]) {
1841
1842 { 0x0f, 0x01211020 },
1843 { 0x10, 0x0001003f },
1844 { 0x11, 0x411111f0 },
1845 { 0x12, 0x01a15930 },
1846 { 0x13, 0x411111f0 },
1847 { 0x14, 0x411111f0 },
1848 { 0x15, 0x411111f0 },
1849 { 0x16, 0x411111f0 },
1850 { 0x17, 0x411111f0 },
1851 { 0x18, 0x411111f0 },
1852 { 0x19, 0x411111f0 },
1853 { }
1854 }
1855 },
1856 };
1857
1858 static const struct snd_pci_quirk alc260_fixup_tbl[] = {
1859 SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_FIXUP_GPIO1),
1860 SND_PCI_QUIRK(0x1025, 0x007f, "Acer Aspire 9500", ALC260_FIXUP_COEF),
1861 SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_FIXUP_GPIO1),
1862 SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", ALC260_FIXUP_HP_DC5750),
1863 SND_PCI_QUIRK(0x103c, 0x30ba, "HP Presario B1900", ALC260_FIXUP_HP_B1900),
1864 SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_FIXUP_VAIO_PINS),
1865 SND_PCI_QUIRK(0x104d, 0x81e2, "Sony VAIO TX", ALC260_FIXUP_HP_PIN_0F),
1866 SND_PCI_QUIRK(0x10cf, 0x1326, "FSC LifeBook S7020", ALC260_FIXUP_FSC_S7020),
1867 SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FIXUP_GPIO1),
1868 SND_PCI_QUIRK(0x152d, 0x0729, "Quanta KN1", ALC260_FIXUP_KN1),
1869 SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_FIXUP_REPLACER),
1870 SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_FIXUP_COEF),
1871 {}
1872 };
1873
1874 static const struct hda_model_fixup alc260_fixup_models[] = {
1875 {.id = ALC260_FIXUP_GPIO1, .name = "gpio1"},
1876 {.id = ALC260_FIXUP_COEF, .name = "coef"},
1877 {.id = ALC260_FIXUP_FSC_S7020, .name = "fujitsu"},
1878 {.id = ALC260_FIXUP_FSC_S7020_JWSE, .name = "fujitsu-jwse"},
1879 {}
1880 };
1881
1882
1883
1884 static int patch_alc260(struct hda_codec *codec)
1885 {
1886 struct alc_spec *spec;
1887 int err;
1888
1889 err = alc_alloc_spec(codec, 0x07);
1890 if (err < 0)
1891 return err;
1892
1893 spec = codec->spec;
1894
1895
1896
1897
1898 spec->gen.prefer_hp_amp = 1;
1899 spec->gen.beep_nid = 0x01;
1900
1901 spec->shutup = alc_eapd_shutup;
1902
1903 alc_pre_init(codec);
1904
1905 snd_hda_pick_fixup(codec, alc260_fixup_models, alc260_fixup_tbl,
1906 alc260_fixups);
1907 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1908
1909
1910 err = alc260_parse_auto_config(codec);
1911 if (err < 0)
1912 goto error;
1913
1914 if (!spec->gen.no_analog) {
1915 err = set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
1916 if (err < 0)
1917 goto error;
1918 }
1919
1920 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
1921
1922 return 0;
1923
1924 error:
1925 alc_free(codec);
1926 return err;
1927 }
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945 enum {
1946 ALC882_FIXUP_ABIT_AW9D_MAX,
1947 ALC882_FIXUP_LENOVO_Y530,
1948 ALC882_FIXUP_PB_M5210,
1949 ALC882_FIXUP_ACER_ASPIRE_7736,
1950 ALC882_FIXUP_ASUS_W90V,
1951 ALC889_FIXUP_CD,
1952 ALC889_FIXUP_FRONT_HP_NO_PRESENCE,
1953 ALC889_FIXUP_VAIO_TT,
1954 ALC888_FIXUP_EEE1601,
1955 ALC886_FIXUP_EAPD,
1956 ALC882_FIXUP_EAPD,
1957 ALC883_FIXUP_EAPD,
1958 ALC883_FIXUP_ACER_EAPD,
1959 ALC882_FIXUP_GPIO1,
1960 ALC882_FIXUP_GPIO2,
1961 ALC882_FIXUP_GPIO3,
1962 ALC889_FIXUP_COEF,
1963 ALC882_FIXUP_ASUS_W2JC,
1964 ALC882_FIXUP_ACER_ASPIRE_4930G,
1965 ALC882_FIXUP_ACER_ASPIRE_8930G,
1966 ALC882_FIXUP_ASPIRE_8930G_VERBS,
1967 ALC885_FIXUP_MACPRO_GPIO,
1968 ALC889_FIXUP_DAC_ROUTE,
1969 ALC889_FIXUP_MBP_VREF,
1970 ALC889_FIXUP_IMAC91_VREF,
1971 ALC889_FIXUP_MBA11_VREF,
1972 ALC889_FIXUP_MBA21_VREF,
1973 ALC889_FIXUP_MP11_VREF,
1974 ALC889_FIXUP_MP41_VREF,
1975 ALC882_FIXUP_INV_DMIC,
1976 ALC882_FIXUP_NO_PRIMARY_HP,
1977 ALC887_FIXUP_ASUS_BASS,
1978 ALC887_FIXUP_BASS_CHMAP,
1979 ALC1220_FIXUP_GB_DUAL_CODECS,
1980 ALC1220_FIXUP_GB_X570,
1981 ALC1220_FIXUP_CLEVO_P950,
1982 ALC1220_FIXUP_CLEVO_PB51ED,
1983 ALC1220_FIXUP_CLEVO_PB51ED_PINS,
1984 ALC887_FIXUP_ASUS_AUDIO,
1985 ALC887_FIXUP_ASUS_HMIC,
1986 ALCS1200A_FIXUP_MIC_VREF,
1987 };
1988
1989 static void alc889_fixup_coef(struct hda_codec *codec,
1990 const struct hda_fixup *fix, int action)
1991 {
1992 if (action != HDA_FIXUP_ACT_INIT)
1993 return;
1994 alc_update_coef_idx(codec, 7, 0, 0x2030);
1995 }
1996
1997
1998 static void alc885_fixup_macpro_gpio(struct hda_codec *codec,
1999 const struct hda_fixup *fix, int action)
2000 {
2001 struct alc_spec *spec = codec->spec;
2002
2003 spec->gpio_write_delay = true;
2004 alc_fixup_gpio3(codec, fix, action);
2005 }
2006
2007
2008
2009
2010
2011 static void alc889_fixup_dac_route(struct hda_codec *codec,
2012 const struct hda_fixup *fix, int action)
2013 {
2014 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2015
2016 static const hda_nid_t conn1[] = { 0x0c, 0x0d };
2017 static const hda_nid_t conn2[] = { 0x0e, 0x0f };
2018 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2019 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
2020 snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn2), conn2);
2021 snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn2), conn2);
2022 } else if (action == HDA_FIXUP_ACT_PROBE) {
2023
2024 static const hda_nid_t conn[] = { 0x0c, 0x0d, 0x0e, 0x0f, 0x26 };
2025 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
2026 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn), conn);
2027 snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn), conn);
2028 snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn), conn);
2029 }
2030 }
2031
2032
2033 static void alc889_fixup_mbp_vref(struct hda_codec *codec,
2034 const struct hda_fixup *fix, int action)
2035 {
2036 static const hda_nid_t nids[] = { 0x14, 0x15, 0x19 };
2037 struct alc_spec *spec = codec->spec;
2038 int i;
2039
2040 if (action != HDA_FIXUP_ACT_INIT)
2041 return;
2042 for (i = 0; i < ARRAY_SIZE(nids); i++) {
2043 unsigned int val = snd_hda_codec_get_pincfg(codec, nids[i]);
2044 if (get_defcfg_device(val) != AC_JACK_HP_OUT)
2045 continue;
2046 val = snd_hda_codec_get_pin_target(codec, nids[i]);
2047 val |= AC_PINCTL_VREF_80;
2048 snd_hda_set_pin_ctl(codec, nids[i], val);
2049 spec->gen.keep_vref_in_automute = 1;
2050 break;
2051 }
2052 }
2053
2054 static void alc889_fixup_mac_pins(struct hda_codec *codec,
2055 const hda_nid_t *nids, int num_nids)
2056 {
2057 struct alc_spec *spec = codec->spec;
2058 int i;
2059
2060 for (i = 0; i < num_nids; i++) {
2061 unsigned int val;
2062 val = snd_hda_codec_get_pin_target(codec, nids[i]);
2063 val |= AC_PINCTL_VREF_50;
2064 snd_hda_set_pin_ctl(codec, nids[i], val);
2065 }
2066 spec->gen.keep_vref_in_automute = 1;
2067 }
2068
2069
2070 static void alc889_fixup_imac91_vref(struct hda_codec *codec,
2071 const struct hda_fixup *fix, int action)
2072 {
2073 static const hda_nid_t nids[] = { 0x18, 0x1a };
2074
2075 if (action == HDA_FIXUP_ACT_INIT)
2076 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2077 }
2078
2079
2080 static void alc889_fixup_mba11_vref(struct hda_codec *codec,
2081 const struct hda_fixup *fix, int action)
2082 {
2083 static const hda_nid_t nids[] = { 0x18 };
2084
2085 if (action == HDA_FIXUP_ACT_INIT)
2086 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2087 }
2088
2089
2090 static void alc889_fixup_mba21_vref(struct hda_codec *codec,
2091 const struct hda_fixup *fix, int action)
2092 {
2093 static const hda_nid_t nids[] = { 0x18, 0x19 };
2094
2095 if (action == HDA_FIXUP_ACT_INIT)
2096 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2097 }
2098
2099
2100
2101
2102
2103 static void alc882_fixup_no_primary_hp(struct hda_codec *codec,
2104 const struct hda_fixup *fix, int action)
2105 {
2106 struct alc_spec *spec = codec->spec;
2107 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2108 spec->gen.no_primary_hp = 1;
2109 spec->gen.no_multi_io = 1;
2110 }
2111 }
2112
2113 static void alc_fixup_bass_chmap(struct hda_codec *codec,
2114 const struct hda_fixup *fix, int action);
2115
2116
2117
2118
2119 static void alc_fixup_dual_codecs(struct hda_codec *codec,
2120 const struct hda_fixup *fix, int action)
2121 {
2122 struct alc_spec *spec = codec->spec;
2123
2124 if (action != HDA_FIXUP_ACT_PRE_PROBE)
2125 return;
2126
2127 spec->gen.suppress_vmaster = 1;
2128
2129 spec->gen.suppress_auto_mute = 1;
2130 spec->gen.suppress_auto_mic = 1;
2131
2132 spec->gen.mixer_nid = 0;
2133
2134 codec->force_pin_prefix = 1;
2135 }
2136
2137 static void rename_ctl(struct hda_codec *codec, const char *oldname,
2138 const char *newname)
2139 {
2140 struct snd_kcontrol *kctl;
2141
2142 kctl = snd_hda_find_mixer_ctl(codec, oldname);
2143 if (kctl)
2144 strcpy(kctl->id.name, newname);
2145 }
2146
2147 static void alc1220_fixup_gb_dual_codecs(struct hda_codec *codec,
2148 const struct hda_fixup *fix,
2149 int action)
2150 {
2151 alc_fixup_dual_codecs(codec, fix, action);
2152 switch (action) {
2153 case HDA_FIXUP_ACT_PRE_PROBE:
2154
2155 strcpy(codec->card->longname, "HDAudio-Gigabyte-ALC1220DualCodecs");
2156 break;
2157 case HDA_FIXUP_ACT_BUILD:
2158
2159 rename_ctl(codec, "Capture Volume",
2160 codec->addr == 0 ?
2161 "Rear-Panel Capture Volume" :
2162 "Front-Panel Capture Volume");
2163 rename_ctl(codec, "Capture Switch",
2164 codec->addr == 0 ?
2165 "Rear-Panel Capture Switch" :
2166 "Front-Panel Capture Switch");
2167 break;
2168 }
2169 }
2170
2171 static void alc1220_fixup_gb_x570(struct hda_codec *codec,
2172 const struct hda_fixup *fix,
2173 int action)
2174 {
2175 static const hda_nid_t conn1[] = { 0x0c };
2176 static const struct coef_fw gb_x570_coefs[] = {
2177 WRITE_COEF(0x07, 0x03c0),
2178 WRITE_COEF(0x1a, 0x01c1),
2179 WRITE_COEF(0x1b, 0x0202),
2180 WRITE_COEF(0x43, 0x3005),
2181 {}
2182 };
2183
2184 switch (action) {
2185 case HDA_FIXUP_ACT_PRE_PROBE:
2186 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2187 snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
2188 break;
2189 case HDA_FIXUP_ACT_INIT:
2190 alc_process_coef_fw(codec, gb_x570_coefs);
2191 break;
2192 }
2193 }
2194
2195 static void alc1220_fixup_clevo_p950(struct hda_codec *codec,
2196 const struct hda_fixup *fix,
2197 int action)
2198 {
2199 static const hda_nid_t conn1[] = { 0x0c };
2200
2201 if (action != HDA_FIXUP_ACT_PRE_PROBE)
2202 return;
2203
2204 alc_update_coef_idx(codec, 0x7, 0, 0x3c3);
2205
2206
2207
2208 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2209 snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
2210 }
2211
2212 static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
2213 const struct hda_fixup *fix, int action);
2214
2215 static void alc1220_fixup_clevo_pb51ed(struct hda_codec *codec,
2216 const struct hda_fixup *fix,
2217 int action)
2218 {
2219 alc1220_fixup_clevo_p950(codec, fix, action);
2220 alc_fixup_headset_mode_no_hp_mic(codec, fix, action);
2221 }
2222
2223 static void alc887_asus_hp_automute_hook(struct hda_codec *codec,
2224 struct hda_jack_callback *jack)
2225 {
2226 struct alc_spec *spec = codec->spec;
2227 unsigned int vref;
2228
2229 snd_hda_gen_hp_automute(codec, jack);
2230
2231 if (spec->gen.hp_jack_present)
2232 vref = AC_PINCTL_VREF_80;
2233 else
2234 vref = AC_PINCTL_VREF_HIZ;
2235 snd_hda_set_pin_ctl(codec, 0x19, PIN_HP | vref);
2236 }
2237
2238 static void alc887_fixup_asus_jack(struct hda_codec *codec,
2239 const struct hda_fixup *fix, int action)
2240 {
2241 struct alc_spec *spec = codec->spec;
2242 if (action != HDA_FIXUP_ACT_PROBE)
2243 return;
2244 snd_hda_set_pin_ctl_cache(codec, 0x1b, PIN_HP);
2245 spec->gen.hp_automute_hook = alc887_asus_hp_automute_hook;
2246 }
2247
2248 static const struct hda_fixup alc882_fixups[] = {
2249 [ALC882_FIXUP_ABIT_AW9D_MAX] = {
2250 .type = HDA_FIXUP_PINS,
2251 .v.pins = (const struct hda_pintbl[]) {
2252 { 0x15, 0x01080104 },
2253 { 0x16, 0x01011012 },
2254 { 0x17, 0x01016011 },
2255 { }
2256 }
2257 },
2258 [ALC882_FIXUP_LENOVO_Y530] = {
2259 .type = HDA_FIXUP_PINS,
2260 .v.pins = (const struct hda_pintbl[]) {
2261 { 0x15, 0x99130112 },
2262 { 0x16, 0x99130111 },
2263 { }
2264 }
2265 },
2266 [ALC882_FIXUP_PB_M5210] = {
2267 .type = HDA_FIXUP_PINCTLS,
2268 .v.pins = (const struct hda_pintbl[]) {
2269 { 0x19, PIN_VREF50 },
2270 {}
2271 }
2272 },
2273 [ALC882_FIXUP_ACER_ASPIRE_7736] = {
2274 .type = HDA_FIXUP_FUNC,
2275 .v.func = alc_fixup_sku_ignore,
2276 },
2277 [ALC882_FIXUP_ASUS_W90V] = {
2278 .type = HDA_FIXUP_PINS,
2279 .v.pins = (const struct hda_pintbl[]) {
2280 { 0x16, 0x99130110 },
2281 { }
2282 }
2283 },
2284 [ALC889_FIXUP_CD] = {
2285 .type = HDA_FIXUP_PINS,
2286 .v.pins = (const struct hda_pintbl[]) {
2287 { 0x1c, 0x993301f0 },
2288 { }
2289 }
2290 },
2291 [ALC889_FIXUP_FRONT_HP_NO_PRESENCE] = {
2292 .type = HDA_FIXUP_PINS,
2293 .v.pins = (const struct hda_pintbl[]) {
2294 { 0x1b, 0x02214120 },
2295 { }
2296 },
2297 .chained = true,
2298 .chain_id = ALC889_FIXUP_CD,
2299 },
2300 [ALC889_FIXUP_VAIO_TT] = {
2301 .type = HDA_FIXUP_PINS,
2302 .v.pins = (const struct hda_pintbl[]) {
2303 { 0x17, 0x90170111 },
2304 { }
2305 }
2306 },
2307 [ALC888_FIXUP_EEE1601] = {
2308 .type = HDA_FIXUP_VERBS,
2309 .v.verbs = (const struct hda_verb[]) {
2310 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2311 { 0x20, AC_VERB_SET_PROC_COEF, 0x0838 },
2312 { }
2313 }
2314 },
2315 [ALC886_FIXUP_EAPD] = {
2316 .type = HDA_FIXUP_VERBS,
2317 .v.verbs = (const struct hda_verb[]) {
2318
2319 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2320 { 0x20, AC_VERB_SET_PROC_COEF, 0x0068 },
2321 { }
2322 }
2323 },
2324 [ALC882_FIXUP_EAPD] = {
2325 .type = HDA_FIXUP_VERBS,
2326 .v.verbs = (const struct hda_verb[]) {
2327
2328 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2329 { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
2330 { }
2331 }
2332 },
2333 [ALC883_FIXUP_EAPD] = {
2334 .type = HDA_FIXUP_VERBS,
2335 .v.verbs = (const struct hda_verb[]) {
2336
2337 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2338 { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2339 { }
2340 }
2341 },
2342 [ALC883_FIXUP_ACER_EAPD] = {
2343 .type = HDA_FIXUP_VERBS,
2344 .v.verbs = (const struct hda_verb[]) {
2345
2346 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2347 { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2348 { }
2349 }
2350 },
2351 [ALC882_FIXUP_GPIO1] = {
2352 .type = HDA_FIXUP_FUNC,
2353 .v.func = alc_fixup_gpio1,
2354 },
2355 [ALC882_FIXUP_GPIO2] = {
2356 .type = HDA_FIXUP_FUNC,
2357 .v.func = alc_fixup_gpio2,
2358 },
2359 [ALC882_FIXUP_GPIO3] = {
2360 .type = HDA_FIXUP_FUNC,
2361 .v.func = alc_fixup_gpio3,
2362 },
2363 [ALC882_FIXUP_ASUS_W2JC] = {
2364 .type = HDA_FIXUP_FUNC,
2365 .v.func = alc_fixup_gpio1,
2366 .chained = true,
2367 .chain_id = ALC882_FIXUP_EAPD,
2368 },
2369 [ALC889_FIXUP_COEF] = {
2370 .type = HDA_FIXUP_FUNC,
2371 .v.func = alc889_fixup_coef,
2372 },
2373 [ALC882_FIXUP_ACER_ASPIRE_4930G] = {
2374 .type = HDA_FIXUP_PINS,
2375 .v.pins = (const struct hda_pintbl[]) {
2376 { 0x16, 0x99130111 },
2377 { 0x17, 0x99130112 },
2378 { }
2379 },
2380 .chained = true,
2381 .chain_id = ALC882_FIXUP_GPIO1,
2382 },
2383 [ALC882_FIXUP_ACER_ASPIRE_8930G] = {
2384 .type = HDA_FIXUP_PINS,
2385 .v.pins = (const struct hda_pintbl[]) {
2386 { 0x16, 0x99130111 },
2387 { 0x1b, 0x99130112 },
2388 { }
2389 },
2390 .chained = true,
2391 .chain_id = ALC882_FIXUP_ASPIRE_8930G_VERBS,
2392 },
2393 [ALC882_FIXUP_ASPIRE_8930G_VERBS] = {
2394
2395 .type = HDA_FIXUP_VERBS,
2396 .v.verbs = (const struct hda_verb[]) {
2397
2398
2399
2400
2401 { 0x20, AC_VERB_SET_COEF_INDEX, 0x03 },
2402 { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2403
2404
2405
2406 { 0x20, AC_VERB_SET_COEF_INDEX, 0x08 },
2407 { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2420 { 0x20, AC_VERB_SET_PROC_COEF, 0x0003 },
2421 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2422 { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2423 { }
2424 },
2425 .chained = true,
2426 .chain_id = ALC882_FIXUP_GPIO1,
2427 },
2428 [ALC885_FIXUP_MACPRO_GPIO] = {
2429 .type = HDA_FIXUP_FUNC,
2430 .v.func = alc885_fixup_macpro_gpio,
2431 },
2432 [ALC889_FIXUP_DAC_ROUTE] = {
2433 .type = HDA_FIXUP_FUNC,
2434 .v.func = alc889_fixup_dac_route,
2435 },
2436 [ALC889_FIXUP_MBP_VREF] = {
2437 .type = HDA_FIXUP_FUNC,
2438 .v.func = alc889_fixup_mbp_vref,
2439 .chained = true,
2440 .chain_id = ALC882_FIXUP_GPIO1,
2441 },
2442 [ALC889_FIXUP_IMAC91_VREF] = {
2443 .type = HDA_FIXUP_FUNC,
2444 .v.func = alc889_fixup_imac91_vref,
2445 .chained = true,
2446 .chain_id = ALC882_FIXUP_GPIO1,
2447 },
2448 [ALC889_FIXUP_MBA11_VREF] = {
2449 .type = HDA_FIXUP_FUNC,
2450 .v.func = alc889_fixup_mba11_vref,
2451 .chained = true,
2452 .chain_id = ALC889_FIXUP_MBP_VREF,
2453 },
2454 [ALC889_FIXUP_MBA21_VREF] = {
2455 .type = HDA_FIXUP_FUNC,
2456 .v.func = alc889_fixup_mba21_vref,
2457 .chained = true,
2458 .chain_id = ALC889_FIXUP_MBP_VREF,
2459 },
2460 [ALC889_FIXUP_MP11_VREF] = {
2461 .type = HDA_FIXUP_FUNC,
2462 .v.func = alc889_fixup_mba11_vref,
2463 .chained = true,
2464 .chain_id = ALC885_FIXUP_MACPRO_GPIO,
2465 },
2466 [ALC889_FIXUP_MP41_VREF] = {
2467 .type = HDA_FIXUP_FUNC,
2468 .v.func = alc889_fixup_mbp_vref,
2469 .chained = true,
2470 .chain_id = ALC885_FIXUP_MACPRO_GPIO,
2471 },
2472 [ALC882_FIXUP_INV_DMIC] = {
2473 .type = HDA_FIXUP_FUNC,
2474 .v.func = alc_fixup_inv_dmic,
2475 },
2476 [ALC882_FIXUP_NO_PRIMARY_HP] = {
2477 .type = HDA_FIXUP_FUNC,
2478 .v.func = alc882_fixup_no_primary_hp,
2479 },
2480 [ALC887_FIXUP_ASUS_BASS] = {
2481 .type = HDA_FIXUP_PINS,
2482 .v.pins = (const struct hda_pintbl[]) {
2483 {0x16, 0x99130130},
2484 {}
2485 },
2486 .chained = true,
2487 .chain_id = ALC887_FIXUP_BASS_CHMAP,
2488 },
2489 [ALC887_FIXUP_BASS_CHMAP] = {
2490 .type = HDA_FIXUP_FUNC,
2491 .v.func = alc_fixup_bass_chmap,
2492 },
2493 [ALC1220_FIXUP_GB_DUAL_CODECS] = {
2494 .type = HDA_FIXUP_FUNC,
2495 .v.func = alc1220_fixup_gb_dual_codecs,
2496 },
2497 [ALC1220_FIXUP_GB_X570] = {
2498 .type = HDA_FIXUP_FUNC,
2499 .v.func = alc1220_fixup_gb_x570,
2500 },
2501 [ALC1220_FIXUP_CLEVO_P950] = {
2502 .type = HDA_FIXUP_FUNC,
2503 .v.func = alc1220_fixup_clevo_p950,
2504 },
2505 [ALC1220_FIXUP_CLEVO_PB51ED] = {
2506 .type = HDA_FIXUP_FUNC,
2507 .v.func = alc1220_fixup_clevo_pb51ed,
2508 },
2509 [ALC1220_FIXUP_CLEVO_PB51ED_PINS] = {
2510 .type = HDA_FIXUP_PINS,
2511 .v.pins = (const struct hda_pintbl[]) {
2512 { 0x19, 0x01a1913c },
2513 {}
2514 },
2515 .chained = true,
2516 .chain_id = ALC1220_FIXUP_CLEVO_PB51ED,
2517 },
2518 [ALC887_FIXUP_ASUS_AUDIO] = {
2519 .type = HDA_FIXUP_PINS,
2520 .v.pins = (const struct hda_pintbl[]) {
2521 { 0x15, 0x02a14150 },
2522 { 0x19, 0x22219420 },
2523 {}
2524 },
2525 },
2526 [ALC887_FIXUP_ASUS_HMIC] = {
2527 .type = HDA_FIXUP_FUNC,
2528 .v.func = alc887_fixup_asus_jack,
2529 .chained = true,
2530 .chain_id = ALC887_FIXUP_ASUS_AUDIO,
2531 },
2532 [ALCS1200A_FIXUP_MIC_VREF] = {
2533 .type = HDA_FIXUP_PINCTLS,
2534 .v.pins = (const struct hda_pintbl[]) {
2535 { 0x18, PIN_VREF50 },
2536 { 0x19, PIN_VREF50 },
2537 {}
2538 }
2539 },
2540 };
2541
2542 static const struct snd_pci_quirk alc882_fixup_tbl[] = {
2543 SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD),
2544 SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2545 SND_PCI_QUIRK(0x1025, 0x0107, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2546 SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD),
2547 SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2548 SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD),
2549 SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_FIXUP_ACER_EAPD),
2550 SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
2551 ALC882_FIXUP_ACER_ASPIRE_4930G),
2552 SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
2553 ALC882_FIXUP_ACER_ASPIRE_4930G),
2554 SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
2555 ALC882_FIXUP_ACER_ASPIRE_8930G),
2556 SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
2557 ALC882_FIXUP_ACER_ASPIRE_8930G),
2558 SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
2559 ALC882_FIXUP_ACER_ASPIRE_4930G),
2560 SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
2561 SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
2562 ALC882_FIXUP_ACER_ASPIRE_4930G),
2563 SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
2564 ALC882_FIXUP_ACER_ASPIRE_4930G),
2565 SND_PCI_QUIRK(0x1025, 0x021e, "Acer Aspire 5739G",
2566 ALC882_FIXUP_ACER_ASPIRE_4930G),
2567 SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),
2568 SND_PCI_QUIRK(0x1025, 0x026b, "Acer Aspire 8940G", ALC882_FIXUP_ACER_ASPIRE_8930G),
2569 SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736),
2570 SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD),
2571 SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),
2572 SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_FIXUP_ASUS_W2JC),
2573 SND_PCI_QUIRK(0x1043, 0x2390, "Asus D700SA", ALC887_FIXUP_ASUS_HMIC),
2574 SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601),
2575 SND_PCI_QUIRK(0x1043, 0x84bc, "ASUS ET2700", ALC887_FIXUP_ASUS_BASS),
2576 SND_PCI_QUIRK(0x1043, 0x8691, "ASUS ROG Ranger VIII", ALC882_FIXUP_GPIO3),
2577 SND_PCI_QUIRK(0x1043, 0x8797, "ASUS TUF B550M-PLUS", ALCS1200A_FIXUP_MIC_VREF),
2578 SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP),
2579 SND_PCI_QUIRK(0x104d, 0x9044, "Sony VAIO AiO", ALC882_FIXUP_NO_PRIMARY_HP),
2580 SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT),
2581 SND_PCI_QUIRK(0x104d, 0x905a, "Sony Vaio Z", ALC882_FIXUP_NO_PRIMARY_HP),
2582 SND_PCI_QUIRK(0x104d, 0x9060, "Sony Vaio VPCL14M1R", ALC882_FIXUP_NO_PRIMARY_HP),
2583
2584
2585 SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF),
2586 SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC889_FIXUP_MBP_VREF),
2587 SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
2588 SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC889_FIXUP_MP11_VREF),
2589 SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_FIXUP_MACPRO_GPIO),
2590 SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_FIXUP_MACPRO_GPIO),
2591 SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC889_FIXUP_MBP_VREF),
2592 SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889_FIXUP_MBP_VREF),
2593 SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD),
2594 SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC889_FIXUP_MBA11_VREF),
2595 SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBA21_VREF),
2596 SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889_FIXUP_MBP_VREF),
2597 SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
2598 SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO),
2599 SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF),
2600 SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF),
2601 SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF),
2602 SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 4,1/5,1", ALC889_FIXUP_MP41_VREF),
2603 SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF),
2604 SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),
2605 SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),
2606 SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_MBA11_VREF),
2607
2608 SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),
2609 SND_PCI_QUIRK(0x13fe, 0x1009, "Advantech MIT-W101", ALC886_FIXUP_EAPD),
2610 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE),
2611 SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
2612 SND_PCI_QUIRK(0x1458, 0xa0cd, "Gigabyte X570 Aorus Master", ALC1220_FIXUP_GB_X570),
2613 SND_PCI_QUIRK(0x1458, 0xa0ce, "Gigabyte X570 Aorus Xtreme", ALC1220_FIXUP_GB_X570),
2614 SND_PCI_QUIRK(0x1458, 0xa0d5, "Gigabyte X570S Aorus Master", ALC1220_FIXUP_GB_X570),
2615 SND_PCI_QUIRK(0x1462, 0x11f7, "MSI-GE63", ALC1220_FIXUP_CLEVO_P950),
2616 SND_PCI_QUIRK(0x1462, 0x1228, "MSI-GP63", ALC1220_FIXUP_CLEVO_P950),
2617 SND_PCI_QUIRK(0x1462, 0x1229, "MSI-GP73", ALC1220_FIXUP_CLEVO_P950),
2618 SND_PCI_QUIRK(0x1462, 0x1275, "MSI-GL63", ALC1220_FIXUP_CLEVO_P950),
2619 SND_PCI_QUIRK(0x1462, 0x1276, "MSI-GL73", ALC1220_FIXUP_CLEVO_P950),
2620 SND_PCI_QUIRK(0x1462, 0x1293, "MSI-GP65", ALC1220_FIXUP_CLEVO_P950),
2621 SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),
2622 SND_PCI_QUIRK(0x1462, 0xcc34, "MSI Godlike X570", ALC1220_FIXUP_GB_DUAL_CODECS),
2623 SND_PCI_QUIRK(0x1462, 0xda57, "MSI Z270-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
2624 SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
2625 SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
2626 SND_PCI_QUIRK(0x1558, 0x50d3, "Clevo PC50[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2627 SND_PCI_QUIRK(0x1558, 0x65d1, "Clevo PB51[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2628 SND_PCI_QUIRK(0x1558, 0x65d2, "Clevo PB51R[CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2629 SND_PCI_QUIRK(0x1558, 0x65e1, "Clevo PB51[ED][DF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2630 SND_PCI_QUIRK(0x1558, 0x65e5, "Clevo PC50D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2631 SND_PCI_QUIRK(0x1558, 0x65f1, "Clevo PC50HS", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2632 SND_PCI_QUIRK(0x1558, 0x65f5, "Clevo PD50PN[NRT]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2633 SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2634 SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2635 SND_PCI_QUIRK(0x1558, 0x67e5, "Clevo PC70D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2636 SND_PCI_QUIRK(0x1558, 0x67f1, "Clevo PC70H[PRS]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2637 SND_PCI_QUIRK(0x1558, 0x67f5, "Clevo PD70PN[NRT]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2638 SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2639 SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170SM", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2640 SND_PCI_QUIRK(0x1558, 0x7715, "Clevo X170KM-G", ALC1220_FIXUP_CLEVO_PB51ED),
2641 SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),
2642 SND_PCI_QUIRK(0x1558, 0x9506, "Clevo P955HQ", ALC1220_FIXUP_CLEVO_P950),
2643 SND_PCI_QUIRK(0x1558, 0x950a, "Clevo P955H[PR]", ALC1220_FIXUP_CLEVO_P950),
2644 SND_PCI_QUIRK(0x1558, 0x95e1, "Clevo P95xER", ALC1220_FIXUP_CLEVO_P950),
2645 SND_PCI_QUIRK(0x1558, 0x95e2, "Clevo P950ER", ALC1220_FIXUP_CLEVO_P950),
2646 SND_PCI_QUIRK(0x1558, 0x95e3, "Clevo P955[ER]T", ALC1220_FIXUP_CLEVO_P950),
2647 SND_PCI_QUIRK(0x1558, 0x95e4, "Clevo P955ER", ALC1220_FIXUP_CLEVO_P950),
2648 SND_PCI_QUIRK(0x1558, 0x95e5, "Clevo P955EE6", ALC1220_FIXUP_CLEVO_P950),
2649 SND_PCI_QUIRK(0x1558, 0x95e6, "Clevo P950R[CDF]", ALC1220_FIXUP_CLEVO_P950),
2650 SND_PCI_QUIRK(0x1558, 0x96e1, "Clevo P960[ER][CDFN]-K", ALC1220_FIXUP_CLEVO_P950),
2651 SND_PCI_QUIRK(0x1558, 0x97e1, "Clevo P970[ER][CDFN]", ALC1220_FIXUP_CLEVO_P950),
2652 SND_PCI_QUIRK(0x1558, 0x97e2, "Clevo P970RC-M", ALC1220_FIXUP_CLEVO_P950),
2653 SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
2654 SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),
2655 SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),
2656 SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_FIXUP_COEF),
2657 {}
2658 };
2659
2660 static const struct hda_model_fixup alc882_fixup_models[] = {
2661 {.id = ALC882_FIXUP_ABIT_AW9D_MAX, .name = "abit-aw9d"},
2662 {.id = ALC882_FIXUP_LENOVO_Y530, .name = "lenovo-y530"},
2663 {.id = ALC882_FIXUP_ACER_ASPIRE_7736, .name = "acer-aspire-7736"},
2664 {.id = ALC882_FIXUP_ASUS_W90V, .name = "asus-w90v"},
2665 {.id = ALC889_FIXUP_CD, .name = "cd"},
2666 {.id = ALC889_FIXUP_FRONT_HP_NO_PRESENCE, .name = "no-front-hp"},
2667 {.id = ALC889_FIXUP_VAIO_TT, .name = "vaio-tt"},
2668 {.id = ALC888_FIXUP_EEE1601, .name = "eee1601"},
2669 {.id = ALC882_FIXUP_EAPD, .name = "alc882-eapd"},
2670 {.id = ALC883_FIXUP_EAPD, .name = "alc883-eapd"},
2671 {.id = ALC882_FIXUP_GPIO1, .name = "gpio1"},
2672 {.id = ALC882_FIXUP_GPIO2, .name = "gpio2"},
2673 {.id = ALC882_FIXUP_GPIO3, .name = "gpio3"},
2674 {.id = ALC889_FIXUP_COEF, .name = "alc889-coef"},
2675 {.id = ALC882_FIXUP_ASUS_W2JC, .name = "asus-w2jc"},
2676 {.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name = "acer-aspire-4930g"},
2677 {.id = ALC882_FIXUP_ACER_ASPIRE_8930G, .name = "acer-aspire-8930g"},
2678 {.id = ALC883_FIXUP_ACER_EAPD, .name = "acer-aspire"},
2679 {.id = ALC885_FIXUP_MACPRO_GPIO, .name = "macpro-gpio"},
2680 {.id = ALC889_FIXUP_DAC_ROUTE, .name = "dac-route"},
2681 {.id = ALC889_FIXUP_MBP_VREF, .name = "mbp-vref"},
2682 {.id = ALC889_FIXUP_IMAC91_VREF, .name = "imac91-vref"},
2683 {.id = ALC889_FIXUP_MBA11_VREF, .name = "mba11-vref"},
2684 {.id = ALC889_FIXUP_MBA21_VREF, .name = "mba21-vref"},
2685 {.id = ALC889_FIXUP_MP11_VREF, .name = "mp11-vref"},
2686 {.id = ALC889_FIXUP_MP41_VREF, .name = "mp41-vref"},
2687 {.id = ALC882_FIXUP_INV_DMIC, .name = "inv-dmic"},
2688 {.id = ALC882_FIXUP_NO_PRIMARY_HP, .name = "no-primary-hp"},
2689 {.id = ALC887_FIXUP_ASUS_BASS, .name = "asus-bass"},
2690 {.id = ALC1220_FIXUP_GB_DUAL_CODECS, .name = "dual-codecs"},
2691 {.id = ALC1220_FIXUP_GB_X570, .name = "gb-x570"},
2692 {.id = ALC1220_FIXUP_CLEVO_P950, .name = "clevo-p950"},
2693 {}
2694 };
2695
2696 static const struct snd_hda_pin_quirk alc882_pin_fixup_tbl[] = {
2697 SND_HDA_PIN_QUIRK(0x10ec1220, 0x1043, "ASUS", ALC1220_FIXUP_CLEVO_P950,
2698 {0x14, 0x01014010},
2699 {0x15, 0x01011012},
2700 {0x16, 0x01016011},
2701 {0x18, 0x01a19040},
2702 {0x19, 0x02a19050},
2703 {0x1a, 0x0181304f},
2704 {0x1b, 0x0221401f},
2705 {0x1e, 0x01456130}),
2706 SND_HDA_PIN_QUIRK(0x10ec1220, 0x1462, "MS-7C35", ALC1220_FIXUP_CLEVO_P950,
2707 {0x14, 0x01015010},
2708 {0x15, 0x01011012},
2709 {0x16, 0x01011011},
2710 {0x18, 0x01a11040},
2711 {0x19, 0x02a19050},
2712 {0x1a, 0x0181104f},
2713 {0x1b, 0x0221401f},
2714 {0x1e, 0x01451130}),
2715 {}
2716 };
2717
2718
2719
2720
2721
2722 static int alc882_parse_auto_config(struct hda_codec *codec)
2723 {
2724 static const hda_nid_t alc882_ignore[] = { 0x1d, 0 };
2725 static const hda_nid_t alc882_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2726 return alc_parse_auto_config(codec, alc882_ignore, alc882_ssids);
2727 }
2728
2729
2730
2731 static int patch_alc882(struct hda_codec *codec)
2732 {
2733 struct alc_spec *spec;
2734 int err;
2735
2736 err = alc_alloc_spec(codec, 0x0b);
2737 if (err < 0)
2738 return err;
2739
2740 spec = codec->spec;
2741
2742 switch (codec->core.vendor_id) {
2743 case 0x10ec0882:
2744 case 0x10ec0885:
2745 case 0x10ec0900:
2746 case 0x10ec0b00:
2747 case 0x10ec1220:
2748 break;
2749 default:
2750
2751 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2752 break;
2753 }
2754
2755 alc_pre_init(codec);
2756
2757 snd_hda_pick_fixup(codec, alc882_fixup_models, alc882_fixup_tbl,
2758 alc882_fixups);
2759 snd_hda_pick_pin_fixup(codec, alc882_pin_fixup_tbl, alc882_fixups, true);
2760 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2761
2762 alc_auto_parse_customize_define(codec);
2763
2764 if (has_cdefine_beep(codec))
2765 spec->gen.beep_nid = 0x01;
2766
2767
2768 err = alc882_parse_auto_config(codec);
2769 if (err < 0)
2770 goto error;
2771
2772 if (!spec->gen.no_analog && spec->gen.beep_nid) {
2773 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2774 if (err < 0)
2775 goto error;
2776 }
2777
2778 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2779
2780 return 0;
2781
2782 error:
2783 alc_free(codec);
2784 return err;
2785 }
2786
2787
2788
2789
2790
2791 static int alc262_parse_auto_config(struct hda_codec *codec)
2792 {
2793 static const hda_nid_t alc262_ignore[] = { 0x1d, 0 };
2794 static const hda_nid_t alc262_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2795 return alc_parse_auto_config(codec, alc262_ignore, alc262_ssids);
2796 }
2797
2798
2799
2800
2801 enum {
2802 ALC262_FIXUP_FSC_H270,
2803 ALC262_FIXUP_FSC_S7110,
2804 ALC262_FIXUP_HP_Z200,
2805 ALC262_FIXUP_TYAN,
2806 ALC262_FIXUP_LENOVO_3000,
2807 ALC262_FIXUP_BENQ,
2808 ALC262_FIXUP_BENQ_T31,
2809 ALC262_FIXUP_INV_DMIC,
2810 ALC262_FIXUP_INTEL_BAYLEYBAY,
2811 };
2812
2813 static const struct hda_fixup alc262_fixups[] = {
2814 [ALC262_FIXUP_FSC_H270] = {
2815 .type = HDA_FIXUP_PINS,
2816 .v.pins = (const struct hda_pintbl[]) {
2817 { 0x14, 0x99130110 },
2818 { 0x15, 0x0221142f },
2819 { 0x1b, 0x0121141f },
2820 { }
2821 }
2822 },
2823 [ALC262_FIXUP_FSC_S7110] = {
2824 .type = HDA_FIXUP_PINS,
2825 .v.pins = (const struct hda_pintbl[]) {
2826 { 0x15, 0x90170110 },
2827 { }
2828 },
2829 .chained = true,
2830 .chain_id = ALC262_FIXUP_BENQ,
2831 },
2832 [ALC262_FIXUP_HP_Z200] = {
2833 .type = HDA_FIXUP_PINS,
2834 .v.pins = (const struct hda_pintbl[]) {
2835 { 0x16, 0x99130120 },
2836 { }
2837 }
2838 },
2839 [ALC262_FIXUP_TYAN] = {
2840 .type = HDA_FIXUP_PINS,
2841 .v.pins = (const struct hda_pintbl[]) {
2842 { 0x14, 0x1993e1f0 },
2843 { }
2844 }
2845 },
2846 [ALC262_FIXUP_LENOVO_3000] = {
2847 .type = HDA_FIXUP_PINCTLS,
2848 .v.pins = (const struct hda_pintbl[]) {
2849 { 0x19, PIN_VREF50 },
2850 {}
2851 },
2852 .chained = true,
2853 .chain_id = ALC262_FIXUP_BENQ,
2854 },
2855 [ALC262_FIXUP_BENQ] = {
2856 .type = HDA_FIXUP_VERBS,
2857 .v.verbs = (const struct hda_verb[]) {
2858 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2859 { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2860 {}
2861 }
2862 },
2863 [ALC262_FIXUP_BENQ_T31] = {
2864 .type = HDA_FIXUP_VERBS,
2865 .v.verbs = (const struct hda_verb[]) {
2866 { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2867 { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2868 {}
2869 }
2870 },
2871 [ALC262_FIXUP_INV_DMIC] = {
2872 .type = HDA_FIXUP_FUNC,
2873 .v.func = alc_fixup_inv_dmic,
2874 },
2875 [ALC262_FIXUP_INTEL_BAYLEYBAY] = {
2876 .type = HDA_FIXUP_FUNC,
2877 .v.func = alc_fixup_no_depop_delay,
2878 },
2879 };
2880
2881 static const struct snd_pci_quirk alc262_fixup_tbl[] = {
2882 SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", ALC262_FIXUP_HP_Z200),
2883 SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu Lifebook S7110", ALC262_FIXUP_FSC_S7110),
2884 SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ),
2885 SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN),
2886 SND_PCI_QUIRK(0x1734, 0x1141, "FSC ESPRIMO U9210", ALC262_FIXUP_FSC_H270),
2887 SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270),
2888 SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000),
2889 SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ),
2890 SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_FIXUP_BENQ_T31),
2891 SND_PCI_QUIRK(0x8086, 0x7270, "BayleyBay", ALC262_FIXUP_INTEL_BAYLEYBAY),
2892 {}
2893 };
2894
2895 static const struct hda_model_fixup alc262_fixup_models[] = {
2896 {.id = ALC262_FIXUP_INV_DMIC, .name = "inv-dmic"},
2897 {.id = ALC262_FIXUP_FSC_H270, .name = "fsc-h270"},
2898 {.id = ALC262_FIXUP_FSC_S7110, .name = "fsc-s7110"},
2899 {.id = ALC262_FIXUP_HP_Z200, .name = "hp-z200"},
2900 {.id = ALC262_FIXUP_TYAN, .name = "tyan"},
2901 {.id = ALC262_FIXUP_LENOVO_3000, .name = "lenovo-3000"},
2902 {.id = ALC262_FIXUP_BENQ, .name = "benq"},
2903 {.id = ALC262_FIXUP_BENQ_T31, .name = "benq-t31"},
2904 {.id = ALC262_FIXUP_INTEL_BAYLEYBAY, .name = "bayleybay"},
2905 {}
2906 };
2907
2908
2909
2910 static int patch_alc262(struct hda_codec *codec)
2911 {
2912 struct alc_spec *spec;
2913 int err;
2914
2915 err = alc_alloc_spec(codec, 0x0b);
2916 if (err < 0)
2917 return err;
2918
2919 spec = codec->spec;
2920 spec->gen.shared_mic_vref_pin = 0x18;
2921
2922 spec->shutup = alc_eapd_shutup;
2923
2924 #if 0
2925
2926
2927
2928 alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x80);
2929 #endif
2930 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2931
2932 alc_pre_init(codec);
2933
2934 snd_hda_pick_fixup(codec, alc262_fixup_models, alc262_fixup_tbl,
2935 alc262_fixups);
2936 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2937
2938 alc_auto_parse_customize_define(codec);
2939
2940 if (has_cdefine_beep(codec))
2941 spec->gen.beep_nid = 0x01;
2942
2943
2944 err = alc262_parse_auto_config(codec);
2945 if (err < 0)
2946 goto error;
2947
2948 if (!spec->gen.no_analog && spec->gen.beep_nid) {
2949 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2950 if (err < 0)
2951 goto error;
2952 }
2953
2954 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2955
2956 return 0;
2957
2958 error:
2959 alc_free(codec);
2960 return err;
2961 }
2962
2963
2964
2965
2966
2967 static int alc268_beep_switch_put(struct snd_kcontrol *kcontrol,
2968 struct snd_ctl_elem_value *ucontrol)
2969 {
2970 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2971 unsigned long pval;
2972 int err;
2973
2974 mutex_lock(&codec->control_mutex);
2975 pval = kcontrol->private_value;
2976 kcontrol->private_value = (pval & ~0xff) | 0x0f;
2977 err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2978 if (err >= 0) {
2979 kcontrol->private_value = (pval & ~0xff) | 0x10;
2980 err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2981 }
2982 kcontrol->private_value = pval;
2983 mutex_unlock(&codec->control_mutex);
2984 return err;
2985 }
2986
2987 static const struct snd_kcontrol_new alc268_beep_mixer[] = {
2988 HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
2989 {
2990 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2991 .name = "Beep Playback Switch",
2992 .subdevice = HDA_SUBDEV_AMP_FLAG,
2993 .info = snd_hda_mixer_amp_switch_info,
2994 .get = snd_hda_mixer_amp_switch_get,
2995 .put = alc268_beep_switch_put,
2996 .private_value = HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT)
2997 },
2998 };
2999
3000
3001 static const struct hda_verb alc268_beep_init_verbs[] = {
3002 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3003 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3004 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3005 { }
3006 };
3007
3008 enum {
3009 ALC268_FIXUP_INV_DMIC,
3010 ALC268_FIXUP_HP_EAPD,
3011 ALC268_FIXUP_SPDIF,
3012 };
3013
3014 static const struct hda_fixup alc268_fixups[] = {
3015 [ALC268_FIXUP_INV_DMIC] = {
3016 .type = HDA_FIXUP_FUNC,
3017 .v.func = alc_fixup_inv_dmic,
3018 },
3019 [ALC268_FIXUP_HP_EAPD] = {
3020 .type = HDA_FIXUP_VERBS,
3021 .v.verbs = (const struct hda_verb[]) {
3022 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 0},
3023 {}
3024 }
3025 },
3026 [ALC268_FIXUP_SPDIF] = {
3027 .type = HDA_FIXUP_PINS,
3028 .v.pins = (const struct hda_pintbl[]) {
3029 { 0x1e, 0x014b1180 },
3030 {}
3031 }
3032 },
3033 };
3034
3035 static const struct hda_model_fixup alc268_fixup_models[] = {
3036 {.id = ALC268_FIXUP_INV_DMIC, .name = "inv-dmic"},
3037 {.id = ALC268_FIXUP_HP_EAPD, .name = "hp-eapd"},
3038 {.id = ALC268_FIXUP_SPDIF, .name = "spdif"},
3039 {}
3040 };
3041
3042 static const struct snd_pci_quirk alc268_fixup_tbl[] = {
3043 SND_PCI_QUIRK(0x1025, 0x0139, "Acer TravelMate 6293", ALC268_FIXUP_SPDIF),
3044 SND_PCI_QUIRK(0x1025, 0x015b, "Acer AOA 150 (ZG5)", ALC268_FIXUP_INV_DMIC),
3045
3046
3047
3048 SND_PCI_QUIRK(0x1179, 0xff06, "Toshiba P200", ALC268_FIXUP_HP_EAPD),
3049 {}
3050 };
3051
3052
3053
3054
3055 static int alc268_parse_auto_config(struct hda_codec *codec)
3056 {
3057 static const hda_nid_t alc268_ssids[] = { 0x15, 0x1b, 0x14, 0 };
3058 return alc_parse_auto_config(codec, NULL, alc268_ssids);
3059 }
3060
3061
3062
3063 static int patch_alc268(struct hda_codec *codec)
3064 {
3065 struct alc_spec *spec;
3066 int i, err;
3067
3068
3069 err = alc_alloc_spec(codec, 0);
3070 if (err < 0)
3071 return err;
3072
3073 spec = codec->spec;
3074 if (has_cdefine_beep(codec))
3075 spec->gen.beep_nid = 0x01;
3076
3077 spec->shutup = alc_eapd_shutup;
3078
3079 alc_pre_init(codec);
3080
3081 snd_hda_pick_fixup(codec, alc268_fixup_models, alc268_fixup_tbl, alc268_fixups);
3082 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
3083
3084
3085 err = alc268_parse_auto_config(codec);
3086 if (err < 0)
3087 goto error;
3088
3089 if (err > 0 && !spec->gen.no_analog &&
3090 spec->gen.autocfg.speaker_pins[0] != 0x1d) {
3091 for (i = 0; i < ARRAY_SIZE(alc268_beep_mixer); i++) {
3092 if (!snd_hda_gen_add_kctl(&spec->gen, NULL,
3093 &alc268_beep_mixer[i])) {
3094 err = -ENOMEM;
3095 goto error;
3096 }
3097 }
3098 snd_hda_add_verbs(codec, alc268_beep_init_verbs);
3099 if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
3100
3101 snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
3102 (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
3103 (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
3104 (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
3105 (0 << AC_AMPCAP_MUTE_SHIFT));
3106 }
3107
3108 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
3109
3110 return 0;
3111
3112 error:
3113 alc_free(codec);
3114 return err;
3115 }
3116
3117
3118
3119
3120
3121 static const struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
3122 .rates = SNDRV_PCM_RATE_44100,
3123 };
3124
3125 static const struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
3126 .rates = SNDRV_PCM_RATE_44100,
3127 };
3128
3129
3130 enum {
3131 ALC269_TYPE_ALC269VA,
3132 ALC269_TYPE_ALC269VB,
3133 ALC269_TYPE_ALC269VC,
3134 ALC269_TYPE_ALC269VD,
3135 ALC269_TYPE_ALC280,
3136 ALC269_TYPE_ALC282,
3137 ALC269_TYPE_ALC283,
3138 ALC269_TYPE_ALC284,
3139 ALC269_TYPE_ALC293,
3140 ALC269_TYPE_ALC286,
3141 ALC269_TYPE_ALC298,
3142 ALC269_TYPE_ALC255,
3143 ALC269_TYPE_ALC256,
3144 ALC269_TYPE_ALC257,
3145 ALC269_TYPE_ALC215,
3146 ALC269_TYPE_ALC225,
3147 ALC269_TYPE_ALC245,
3148 ALC269_TYPE_ALC287,
3149 ALC269_TYPE_ALC294,
3150 ALC269_TYPE_ALC300,
3151 ALC269_TYPE_ALC623,
3152 ALC269_TYPE_ALC700,
3153 };
3154
3155
3156
3157
3158 static int alc269_parse_auto_config(struct hda_codec *codec)
3159 {
3160 static const hda_nid_t alc269_ignore[] = { 0x1d, 0 };
3161 static const hda_nid_t alc269_ssids[] = { 0, 0x1b, 0x14, 0x21 };
3162 static const hda_nid_t alc269va_ssids[] = { 0x15, 0x1b, 0x14, 0 };
3163 struct alc_spec *spec = codec->spec;
3164 const hda_nid_t *ssids;
3165
3166 switch (spec->codec_variant) {
3167 case ALC269_TYPE_ALC269VA:
3168 case ALC269_TYPE_ALC269VC:
3169 case ALC269_TYPE_ALC280:
3170 case ALC269_TYPE_ALC284:
3171 case ALC269_TYPE_ALC293:
3172 ssids = alc269va_ssids;
3173 break;
3174 case ALC269_TYPE_ALC269VB:
3175 case ALC269_TYPE_ALC269VD:
3176 case ALC269_TYPE_ALC282:
3177 case ALC269_TYPE_ALC283:
3178 case ALC269_TYPE_ALC286:
3179 case ALC269_TYPE_ALC298:
3180 case ALC269_TYPE_ALC255:
3181 case ALC269_TYPE_ALC256:
3182 case ALC269_TYPE_ALC257:
3183 case ALC269_TYPE_ALC215:
3184 case ALC269_TYPE_ALC225:
3185 case ALC269_TYPE_ALC245:
3186 case ALC269_TYPE_ALC287:
3187 case ALC269_TYPE_ALC294:
3188 case ALC269_TYPE_ALC300:
3189 case ALC269_TYPE_ALC623:
3190 case ALC269_TYPE_ALC700:
3191 ssids = alc269_ssids;
3192 break;
3193 default:
3194 ssids = alc269_ssids;
3195 break;
3196 }
3197
3198 return alc_parse_auto_config(codec, alc269_ignore, ssids);
3199 }
3200
3201 static const struct hda_jack_keymap alc_headset_btn_keymap[] = {
3202 { SND_JACK_BTN_0, KEY_PLAYPAUSE },
3203 { SND_JACK_BTN_1, KEY_VOICECOMMAND },
3204 { SND_JACK_BTN_2, KEY_VOLUMEUP },
3205 { SND_JACK_BTN_3, KEY_VOLUMEDOWN },
3206 {}
3207 };
3208
3209 static void alc_headset_btn_callback(struct hda_codec *codec,
3210 struct hda_jack_callback *jack)
3211 {
3212 int report = 0;
3213
3214 if (jack->unsol_res & (7 << 13))
3215 report |= SND_JACK_BTN_0;
3216
3217 if (jack->unsol_res & (1 << 16 | 3 << 8))
3218 report |= SND_JACK_BTN_1;
3219
3220
3221 if (jack->unsol_res & (7 << 23))
3222 report |= SND_JACK_BTN_2;
3223
3224
3225 if (jack->unsol_res & (7 << 10))
3226 report |= SND_JACK_BTN_3;
3227
3228 snd_hda_jack_set_button_state(codec, jack->nid, report);
3229 }
3230
3231 static void alc_disable_headset_jack_key(struct hda_codec *codec)
3232 {
3233 struct alc_spec *spec = codec->spec;
3234
3235 if (!spec->has_hs_key)
3236 return;
3237
3238 switch (codec->core.vendor_id) {
3239 case 0x10ec0215:
3240 case 0x10ec0225:
3241 case 0x10ec0285:
3242 case 0x10ec0287:
3243 case 0x10ec0295:
3244 case 0x10ec0289:
3245 case 0x10ec0299:
3246 alc_write_coef_idx(codec, 0x48, 0x0);
3247 alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3248 alc_update_coef_idx(codec, 0x44, 0x0045 << 8, 0x0);
3249 break;
3250 case 0x10ec0230:
3251 case 0x10ec0236:
3252 case 0x10ec0256:
3253 case 0x19e58326:
3254 alc_write_coef_idx(codec, 0x48, 0x0);
3255 alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3256 break;
3257 }
3258 }
3259
3260 static void alc_enable_headset_jack_key(struct hda_codec *codec)
3261 {
3262 struct alc_spec *spec = codec->spec;
3263
3264 if (!spec->has_hs_key)
3265 return;
3266
3267 switch (codec->core.vendor_id) {
3268 case 0x10ec0215:
3269 case 0x10ec0225:
3270 case 0x10ec0285:
3271 case 0x10ec0287:
3272 case 0x10ec0295:
3273 case 0x10ec0289:
3274 case 0x10ec0299:
3275 alc_write_coef_idx(codec, 0x48, 0xd011);
3276 alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3277 alc_update_coef_idx(codec, 0x44, 0x007f << 8, 0x0045 << 8);
3278 break;
3279 case 0x10ec0230:
3280 case 0x10ec0236:
3281 case 0x10ec0256:
3282 case 0x19e58326:
3283 alc_write_coef_idx(codec, 0x48, 0xd011);
3284 alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3285 break;
3286 }
3287 }
3288
3289 static void alc_fixup_headset_jack(struct hda_codec *codec,
3290 const struct hda_fixup *fix, int action)
3291 {
3292 struct alc_spec *spec = codec->spec;
3293 hda_nid_t hp_pin;
3294
3295 switch (action) {
3296 case HDA_FIXUP_ACT_PRE_PROBE:
3297 spec->has_hs_key = 1;
3298 snd_hda_jack_detect_enable_callback(codec, 0x55,
3299 alc_headset_btn_callback);
3300 break;
3301 case HDA_FIXUP_ACT_BUILD:
3302 hp_pin = alc_get_hp_pin(spec);
3303 if (!hp_pin || snd_hda_jack_bind_keymap(codec, 0x55,
3304 alc_headset_btn_keymap,
3305 hp_pin))
3306 snd_hda_jack_add_kctl(codec, 0x55, "Headset Jack",
3307 false, SND_JACK_HEADSET,
3308 alc_headset_btn_keymap);
3309
3310 alc_enable_headset_jack_key(codec);
3311 break;
3312 }
3313 }
3314
3315 static void alc269vb_toggle_power_output(struct hda_codec *codec, int power_up)
3316 {
3317 alc_update_coef_idx(codec, 0x04, 1 << 11, power_up ? (1 << 11) : 0);
3318 }
3319
3320 static void alc269_shutup(struct hda_codec *codec)
3321 {
3322 struct alc_spec *spec = codec->spec;
3323
3324 if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3325 alc269vb_toggle_power_output(codec, 0);
3326 if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
3327 (alc_get_coef0(codec) & 0x00ff) == 0x018) {
3328 msleep(150);
3329 }
3330 alc_shutup_pins(codec);
3331 }
3332
3333 static const struct coef_fw alc282_coefs[] = {
3334 WRITE_COEF(0x03, 0x0002),
3335 UPDATE_COEF(0x05, 0xff3f, 0x0700),
3336 WRITE_COEF(0x07, 0x0200),
3337 UPDATE_COEF(0x06, 0x00f0, 0),
3338 UPDATE_COEF(0x08, 0xfffc, 0x0c2c),
3339 WRITE_COEF(0x0a, 0xcccc),
3340 WRITE_COEF(0x0b, 0xcccc),
3341 WRITE_COEF(0x0e, 0x6e00),
3342 UPDATE_COEF(0x0f, 0xf800, 0x1000),
3343 UPDATE_COEF(0x10, 0xfc00, 0x0c00),
3344 WRITE_COEF(0x6f, 0x0),
3345 UPDATE_COEF(0x0c, 0xfe00, 0),
3346 WRITE_COEF(0x34, 0xa0c0),
3347 UPDATE_COEF(0x16, 0x0008, 0),
3348 UPDATE_COEF(0x1d, 0x00e0, 0),
3349 UPDATE_COEF(0x1f, 0x00e0, 0),
3350 WRITE_COEF(0x21, 0x8804),
3351 WRITE_COEF(0x63, 0x2902),
3352 WRITE_COEF(0x68, 0xa080),
3353 WRITE_COEF(0x69, 0x3400),
3354 WRITE_COEF(0x6a, 0x2f3e),
3355 WRITE_COEF(0x6b, 0x0),
3356 UPDATE_COEF(0x6d, 0x0fff, 0x0900),
3357 WRITE_COEF(0x6e, 0x110a),
3358 UPDATE_COEF(0x70, 0x00f8, 0x00d8),
3359 WRITE_COEF(0x71, 0x0014),
3360 WRITE_COEF(0x72, 0xc2ba),
3361 UPDATE_COEF(0x77, 0x0f80, 0),
3362 WRITE_COEF(0x6c, 0xfc06),
3363 {}
3364 };
3365
3366 static void alc282_restore_default_value(struct hda_codec *codec)
3367 {
3368 alc_process_coef_fw(codec, alc282_coefs);
3369 }
3370
3371 static void alc282_init(struct hda_codec *codec)
3372 {
3373 struct alc_spec *spec = codec->spec;
3374 hda_nid_t hp_pin = alc_get_hp_pin(spec);
3375 bool hp_pin_sense;
3376 int coef78;
3377
3378 alc282_restore_default_value(codec);
3379
3380 if (!hp_pin)
3381 return;
3382 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3383 coef78 = alc_read_coef_idx(codec, 0x78);
3384
3385
3386
3387 alc_write_coef_idx(codec, 0x78, 0x9004);
3388
3389 if (hp_pin_sense)
3390 msleep(2);
3391
3392 snd_hda_codec_write(codec, hp_pin, 0,
3393 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3394
3395 if (hp_pin_sense)
3396 msleep(85);
3397
3398 snd_hda_codec_write(codec, hp_pin, 0,
3399 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3400
3401 if (hp_pin_sense)
3402 msleep(100);
3403
3404
3405 alc_write_coef_idx(codec, 0x78, coef78);
3406 }
3407
3408 static void alc282_shutup(struct hda_codec *codec)
3409 {
3410 struct alc_spec *spec = codec->spec;
3411 hda_nid_t hp_pin = alc_get_hp_pin(spec);
3412 bool hp_pin_sense;
3413 int coef78;
3414
3415 if (!hp_pin) {
3416 alc269_shutup(codec);
3417 return;
3418 }
3419
3420 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3421 coef78 = alc_read_coef_idx(codec, 0x78);
3422 alc_write_coef_idx(codec, 0x78, 0x9004);
3423
3424 if (hp_pin_sense)
3425 msleep(2);
3426
3427 snd_hda_codec_write(codec, hp_pin, 0,
3428 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3429
3430 if (hp_pin_sense)
3431 msleep(85);
3432
3433 if (!spec->no_shutup_pins)
3434 snd_hda_codec_write(codec, hp_pin, 0,
3435 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3436
3437 if (hp_pin_sense)
3438 msleep(100);
3439
3440 alc_auto_setup_eapd(codec, false);
3441 alc_shutup_pins(codec);
3442 alc_write_coef_idx(codec, 0x78, coef78);
3443 }
3444
3445 static const struct coef_fw alc283_coefs[] = {
3446 WRITE_COEF(0x03, 0x0002),
3447 UPDATE_COEF(0x05, 0xff3f, 0x0700),
3448 WRITE_COEF(0x07, 0x0200),
3449 UPDATE_COEF(0x06, 0x00f0, 0),
3450 UPDATE_COEF(0x08, 0xfffc, 0x0c2c),
3451 WRITE_COEF(0x0a, 0xcccc),
3452 WRITE_COEF(0x0b, 0xcccc),
3453 WRITE_COEF(0x0e, 0x6fc0),
3454 UPDATE_COEF(0x0f, 0xf800, 0x1000),
3455 UPDATE_COEF(0x10, 0xfc00, 0x0c00),
3456 WRITE_COEF(0x3a, 0x0),
3457 UPDATE_COEF(0x0c, 0xfe00, 0x0),
3458 WRITE_COEF(0x22, 0xa0c0),
3459 UPDATE_COEFEX(0x53, 0x01, 0x000f, 0x0008),
3460 UPDATE_COEF(0x1d, 0x00e0, 0),
3461 UPDATE_COEF(0x1f, 0x00e0, 0),
3462 WRITE_COEF(0x21, 0x8804),
3463 WRITE_COEF(0x2e, 0x2902),
3464 WRITE_COEF(0x33, 0xa080),
3465 WRITE_COEF(0x34, 0x3400),
3466 WRITE_COEF(0x35, 0x2f3e),
3467 WRITE_COEF(0x36, 0x0),
3468 UPDATE_COEF(0x38, 0x0fff, 0x0900),
3469 WRITE_COEF(0x39, 0x110a),
3470 UPDATE_COEF(0x3b, 0x00f8, 0x00d8),
3471 WRITE_COEF(0x3c, 0x0014),
3472 WRITE_COEF(0x3d, 0xc2ba),
3473 UPDATE_COEF(0x42, 0x0f80, 0x0),
3474 WRITE_COEF(0x49, 0x0),
3475 UPDATE_COEF(0x40, 0xf800, 0x9800),
3476 UPDATE_COEF(0x42, 0xf000, 0x2000),
3477 WRITE_COEF(0x37, 0xfc06),
3478 UPDATE_COEF(0x1b, 0x8000, 0),
3479 {}
3480 };
3481
3482 static void alc283_restore_default_value(struct hda_codec *codec)
3483 {
3484 alc_process_coef_fw(codec, alc283_coefs);
3485 }
3486
3487 static void alc283_init(struct hda_codec *codec)
3488 {
3489 struct alc_spec *spec = codec->spec;
3490 hda_nid_t hp_pin = alc_get_hp_pin(spec);
3491 bool hp_pin_sense;
3492
3493 alc283_restore_default_value(codec);
3494
3495 if (!hp_pin)
3496 return;
3497
3498 msleep(30);
3499 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3500
3501
3502
3503 alc_write_coef_idx(codec, 0x43, 0x9004);
3504
3505 snd_hda_codec_write(codec, hp_pin, 0,
3506 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3507
3508 if (hp_pin_sense)
3509 msleep(85);
3510
3511 snd_hda_codec_write(codec, hp_pin, 0,
3512 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3513
3514 if (hp_pin_sense)
3515 msleep(85);
3516
3517
3518 alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
3519
3520 alc_write_coef_idx(codec, 0x43, 0x9614);
3521 }
3522
3523 static void alc283_shutup(struct hda_codec *codec)
3524 {
3525 struct alc_spec *spec = codec->spec;
3526 hda_nid_t hp_pin = alc_get_hp_pin(spec);
3527 bool hp_pin_sense;
3528
3529 if (!hp_pin) {
3530 alc269_shutup(codec);
3531 return;
3532 }
3533
3534 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3535
3536 alc_write_coef_idx(codec, 0x43, 0x9004);
3537
3538
3539 alc_write_coef_idx(codec, 0x06, 0x2100);
3540
3541 snd_hda_codec_write(codec, hp_pin, 0,
3542 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3543
3544 if (hp_pin_sense)
3545 msleep(100);
3546
3547 if (!spec->no_shutup_pins)
3548 snd_hda_codec_write(codec, hp_pin, 0,
3549 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3550
3551 alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
3552
3553 if (hp_pin_sense)
3554 msleep(100);
3555 alc_auto_setup_eapd(codec, false);
3556 alc_shutup_pins(codec);
3557 alc_write_coef_idx(codec, 0x43, 0x9614);
3558 }
3559
3560 static void alc256_init(struct hda_codec *codec)
3561 {
3562 struct alc_spec *spec = codec->spec;
3563 hda_nid_t hp_pin = alc_get_hp_pin(spec);
3564 bool hp_pin_sense;
3565
3566 if (!hp_pin)
3567 hp_pin = 0x21;
3568
3569 msleep(30);
3570
3571 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3572
3573 if (hp_pin_sense)
3574 msleep(2);
3575
3576 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1);
3577 if (spec->ultra_low_power) {
3578 alc_update_coef_idx(codec, 0x03, 1<<1, 1<<1);
3579 alc_update_coef_idx(codec, 0x08, 3<<2, 3<<2);
3580 alc_update_coef_idx(codec, 0x08, 7<<4, 0);
3581 alc_update_coef_idx(codec, 0x3b, 1<<15, 0);
3582 alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3583 msleep(30);
3584 }
3585
3586 snd_hda_codec_write(codec, hp_pin, 0,
3587 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3588
3589 if (hp_pin_sense || spec->ultra_low_power)
3590 msleep(85);
3591
3592 snd_hda_codec_write(codec, hp_pin, 0,
3593 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3594
3595 if (hp_pin_sense || spec->ultra_low_power)
3596 msleep(100);
3597
3598 alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
3599 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4);
3600 alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15);
3601 alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15);
3602
3603
3604
3605
3606
3607
3608 alc_write_coef_idx(codec, 0x36, 0x5757);
3609 }
3610
3611 static void alc256_shutup(struct hda_codec *codec)
3612 {
3613 struct alc_spec *spec = codec->spec;
3614 hda_nid_t hp_pin = alc_get_hp_pin(spec);
3615 bool hp_pin_sense;
3616
3617 if (!hp_pin)
3618 hp_pin = 0x21;
3619
3620 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3621
3622 if (hp_pin_sense)
3623 msleep(2);
3624
3625 snd_hda_codec_write(codec, hp_pin, 0,
3626 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3627
3628 if (hp_pin_sense || spec->ultra_low_power)
3629 msleep(85);
3630
3631
3632
3633
3634
3635
3636 if (codec->core.vendor_id != 0x10ec0236 &&
3637 codec->core.vendor_id != 0x10ec0257)
3638 alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
3639
3640 if (!spec->no_shutup_pins)
3641 snd_hda_codec_write(codec, hp_pin, 0,
3642 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3643
3644 if (hp_pin_sense || spec->ultra_low_power)
3645 msleep(100);
3646
3647 alc_auto_setup_eapd(codec, false);
3648 alc_shutup_pins(codec);
3649 if (spec->ultra_low_power) {
3650 msleep(50);
3651 alc_update_coef_idx(codec, 0x03, 1<<1, 0);
3652 alc_update_coef_idx(codec, 0x08, 7<<4, 7<<4);
3653 alc_update_coef_idx(codec, 0x08, 3<<2, 0);
3654 alc_update_coef_idx(codec, 0x3b, 1<<15, 1<<15);
3655 alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3656 msleep(30);
3657 }
3658 }
3659
3660 static void alc285_hp_init(struct hda_codec *codec)
3661 {
3662 struct alc_spec *spec = codec->spec;
3663 hda_nid_t hp_pin = alc_get_hp_pin(spec);
3664 int i, val;
3665 int coef38, coef0d, coef36;
3666
3667 alc_update_coef_idx(codec, 0x4a, 1<<15, 1<<15);
3668 coef38 = alc_read_coef_idx(codec, 0x38);
3669 coef0d = alc_read_coef_idx(codec, 0x0d);
3670 coef36 = alc_read_coef_idx(codec, 0x36);
3671 alc_update_coef_idx(codec, 0x38, 1<<4, 0x0);
3672 alc_update_coef_idx(codec, 0x0d, 0x110, 0x0);
3673
3674 alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
3675
3676 if (hp_pin)
3677 snd_hda_codec_write(codec, hp_pin, 0,
3678 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3679
3680 msleep(130);
3681 alc_update_coef_idx(codec, 0x36, 1<<14, 1<<14);
3682 alc_update_coef_idx(codec, 0x36, 1<<13, 0x0);
3683
3684 if (hp_pin)
3685 snd_hda_codec_write(codec, hp_pin, 0,
3686 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3687 msleep(10);
3688 alc_write_coef_idx(codec, 0x67, 0x0);
3689 alc_write_coefex_idx(codec, 0x58, 0x00, 0x7880);
3690 alc_write_coefex_idx(codec, 0x58, 0x0f, 0xf049);
3691 alc_update_coefex_idx(codec, 0x58, 0x03, 0x00f0, 0x00c0);
3692
3693 alc_write_coefex_idx(codec, 0x58, 0x00, 0xf888);
3694 val = alc_read_coefex_idx(codec, 0x58, 0x00);
3695 for (i = 0; i < 20 && val & 0x8000; i++) {
3696 msleep(50);
3697 val = alc_read_coefex_idx(codec, 0x58, 0x00);
3698 }
3699
3700 alc_write_coefex_idx(codec, 0x58, 0x00, val);
3701 alc_update_coef_idx(codec, 0x38, 1<<4, coef38);
3702 alc_update_coef_idx(codec, 0x0d, 0x110, coef0d);
3703 alc_update_coef_idx(codec, 0x36, 3<<13, coef36);
3704
3705 msleep(50);
3706 alc_update_coef_idx(codec, 0x4a, 1<<15, 0);
3707 }
3708
3709 static void alc225_init(struct hda_codec *codec)
3710 {
3711 struct alc_spec *spec = codec->spec;
3712 hda_nid_t hp_pin = alc_get_hp_pin(spec);
3713 bool hp1_pin_sense, hp2_pin_sense;
3714
3715 if (spec->codec_variant != ALC269_TYPE_ALC287 &&
3716 spec->codec_variant != ALC269_TYPE_ALC245)
3717
3718 if (!spec->done_hp_init ||
3719 is_s3_resume(codec) ||
3720 is_s4_resume(codec)) {
3721 alc285_hp_init(codec);
3722 spec->done_hp_init = true;
3723 }
3724
3725 if (!hp_pin)
3726 hp_pin = 0x21;
3727 msleep(30);
3728
3729 hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3730 hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3731
3732 if (hp1_pin_sense || hp2_pin_sense)
3733 msleep(2);
3734
3735 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1);
3736 if (spec->ultra_low_power) {
3737 alc_update_coef_idx(codec, 0x08, 0x0f << 2, 3<<2);
3738 alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3739 alc_update_coef_idx(codec, 0x33, 1<<11, 0);
3740 msleep(30);
3741 }
3742
3743 if (hp1_pin_sense || spec->ultra_low_power)
3744 snd_hda_codec_write(codec, hp_pin, 0,
3745 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3746 if (hp2_pin_sense)
3747 snd_hda_codec_write(codec, 0x16, 0,
3748 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3749
3750 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3751 msleep(85);
3752
3753 if (hp1_pin_sense || spec->ultra_low_power)
3754 snd_hda_codec_write(codec, hp_pin, 0,
3755 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3756 if (hp2_pin_sense)
3757 snd_hda_codec_write(codec, 0x16, 0,
3758 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3759
3760 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3761 msleep(100);
3762
3763 alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3764 alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4);
3765 }
3766
3767 static void alc225_shutup(struct hda_codec *codec)
3768 {
3769 struct alc_spec *spec = codec->spec;
3770 hda_nid_t hp_pin = alc_get_hp_pin(spec);
3771 bool hp1_pin_sense, hp2_pin_sense;
3772
3773 if (!hp_pin)
3774 hp_pin = 0x21;
3775
3776 alc_disable_headset_jack_key(codec);
3777
3778 alc_update_coef_idx(codec, 0x4a, 0, 3 << 10);
3779
3780 hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3781 hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3782
3783 if (hp1_pin_sense || hp2_pin_sense)
3784 msleep(2);
3785
3786 if (hp1_pin_sense || spec->ultra_low_power)
3787 snd_hda_codec_write(codec, hp_pin, 0,
3788 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3789 if (hp2_pin_sense)
3790 snd_hda_codec_write(codec, 0x16, 0,
3791 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3792
3793 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3794 msleep(85);
3795
3796 if (hp1_pin_sense || spec->ultra_low_power)
3797 snd_hda_codec_write(codec, hp_pin, 0,
3798 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3799 if (hp2_pin_sense)
3800 snd_hda_codec_write(codec, 0x16, 0,
3801 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3802
3803 if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3804 msleep(100);
3805
3806 alc_auto_setup_eapd(codec, false);
3807 alc_shutup_pins(codec);
3808 if (spec->ultra_low_power) {
3809 msleep(50);
3810 alc_update_coef_idx(codec, 0x08, 0x0f << 2, 0x0c << 2);
3811 alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3812 alc_update_coef_idx(codec, 0x33, 1<<11, 1<<11);
3813 alc_update_coef_idx(codec, 0x4a, 3<<4, 2<<4);
3814 msleep(30);
3815 }
3816
3817 alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3818 alc_enable_headset_jack_key(codec);
3819 }
3820
3821 static void alc_default_init(struct hda_codec *codec)
3822 {
3823 struct alc_spec *spec = codec->spec;
3824 hda_nid_t hp_pin = alc_get_hp_pin(spec);
3825 bool hp_pin_sense;
3826
3827 if (!hp_pin)
3828 return;
3829
3830 msleep(30);
3831
3832 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3833
3834 if (hp_pin_sense)
3835 msleep(2);
3836
3837 snd_hda_codec_write(codec, hp_pin, 0,
3838 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3839
3840 if (hp_pin_sense)
3841 msleep(85);
3842
3843 snd_hda_codec_write(codec, hp_pin, 0,
3844 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3845
3846 if (hp_pin_sense)
3847 msleep(100);
3848 }
3849
3850 static void alc_default_shutup(struct hda_codec *codec)
3851 {
3852 struct alc_spec *spec = codec->spec;
3853 hda_nid_t hp_pin = alc_get_hp_pin(spec);
3854 bool hp_pin_sense;
3855
3856 if (!hp_pin) {
3857 alc269_shutup(codec);
3858 return;
3859 }
3860
3861 hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3862
3863 if (hp_pin_sense)
3864 msleep(2);
3865
3866 snd_hda_codec_write(codec, hp_pin, 0,
3867 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3868
3869 if (hp_pin_sense)
3870 msleep(85);
3871
3872 if (!spec->no_shutup_pins)
3873 snd_hda_codec_write(codec, hp_pin, 0,
3874 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3875
3876 if (hp_pin_sense)
3877 msleep(100);
3878
3879 alc_auto_setup_eapd(codec, false);
3880 alc_shutup_pins(codec);
3881 }
3882
3883 static void alc294_hp_init(struct hda_codec *codec)
3884 {
3885 struct alc_spec *spec = codec->spec;
3886 hda_nid_t hp_pin = alc_get_hp_pin(spec);
3887 int i, val;
3888
3889 if (!hp_pin)
3890 return;
3891
3892 snd_hda_codec_write(codec, hp_pin, 0,
3893 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3894
3895 msleep(100);
3896
3897 if (!spec->no_shutup_pins)
3898 snd_hda_codec_write(codec, hp_pin, 0,
3899 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3900
3901 alc_update_coef_idx(codec, 0x6f, 0x000f, 0);
3902 alc_update_coefex_idx(codec, 0x58, 0x00, 0x8000, 0x8000);
3903
3904
3905 val = alc_read_coefex_idx(codec, 0x58, 0x01);
3906 for (i = 0; i < 20 && val & 0x0080; i++) {
3907 msleep(50);
3908 val = alc_read_coefex_idx(codec, 0x58, 0x01);
3909 }
3910
3911 alc_update_coef_idx(codec, 0x6f, 0x000f, 0x000b);
3912 msleep(50);
3913 }
3914
3915 static void alc294_init(struct hda_codec *codec)
3916 {
3917 struct alc_spec *spec = codec->spec;
3918
3919
3920 if (!spec->done_hp_init ||
3921 codec->core.dev.power.power_state.event == PM_EVENT_RESTORE) {
3922 alc294_hp_init(codec);
3923 spec->done_hp_init = true;
3924 }
3925 alc_default_init(codec);
3926 }
3927
3928 static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg,
3929 unsigned int val)
3930 {
3931 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3932 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val & 0xffff);
3933 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val >> 16);
3934 }
3935
3936 static int alc5505_coef_get(struct hda_codec *codec, unsigned int index_reg)
3937 {
3938 unsigned int val;
3939
3940 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3941 val = snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3942 & 0xffff;
3943 val |= snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3944 << 16;
3945 return val;
3946 }
3947
3948 static void alc5505_dsp_halt(struct hda_codec *codec)
3949 {
3950 unsigned int val;
3951
3952 alc5505_coef_set(codec, 0x3000, 0x000c);
3953 alc5505_coef_set(codec, 0x880c, 0x0008);
3954 alc5505_coef_set(codec, 0x61c0, 0x11110080);
3955 alc5505_coef_set(codec, 0x6230, 0xfc0d4011);
3956 alc5505_coef_set(codec, 0x61b4, 0x040a2b03);
3957 alc5505_coef_set(codec, 0x61b0, 0x00005b17);
3958 alc5505_coef_set(codec, 0x61b8, 0x04133303);
3959 val = alc5505_coef_get(codec, 0x6220);
3960 alc5505_coef_set(codec, 0x6220, (val | 0x3000));
3961 }
3962
3963 static void alc5505_dsp_back_from_halt(struct hda_codec *codec)
3964 {
3965 alc5505_coef_set(codec, 0x61b8, 0x04133302);
3966 alc5505_coef_set(codec, 0x61b0, 0x00005b16);
3967 alc5505_coef_set(codec, 0x61b4, 0x040a2b02);
3968 alc5505_coef_set(codec, 0x6230, 0xf80d4011);
3969 alc5505_coef_set(codec, 0x6220, 0x2002010f);
3970 alc5505_coef_set(codec, 0x880c, 0x00000004);
3971 }
3972
3973 static void alc5505_dsp_init(struct hda_codec *codec)
3974 {
3975 unsigned int val;
3976
3977 alc5505_dsp_halt(codec);
3978 alc5505_dsp_back_from_halt(codec);
3979 alc5505_coef_set(codec, 0x61b0, 0x5b14);
3980 alc5505_coef_set(codec, 0x61b0, 0x5b16);
3981 alc5505_coef_set(codec, 0x61b4, 0x04132b00);
3982 alc5505_coef_set(codec, 0x61b4, 0x04132b02);
3983 alc5505_coef_set(codec, 0x61b8, 0x041f3300);
3984 alc5505_coef_set(codec, 0x61b8, 0x041f3302);
3985 snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_CODEC_RESET, 0);
3986 alc5505_coef_set(codec, 0x61b8, 0x041b3302);
3987 alc5505_coef_set(codec, 0x61b8, 0x04173302);
3988 alc5505_coef_set(codec, 0x61b8, 0x04163302);
3989 alc5505_coef_set(codec, 0x8800, 0x348b328b);
3990 alc5505_coef_set(codec, 0x8808, 0x00020022);
3991 alc5505_coef_set(codec, 0x8818, 0x00000400);
3992
3993 val = alc5505_coef_get(codec, 0x6200) >> 16;
3994 if (val <= 3)
3995 alc5505_coef_set(codec, 0x6220, 0x2002010f);
3996 else
3997 alc5505_coef_set(codec, 0x6220, 0x6002018f);
3998
3999 alc5505_coef_set(codec, 0x61ac, 0x055525f0);
4000 alc5505_coef_set(codec, 0x61c0, 0x12230080);
4001 alc5505_coef_set(codec, 0x61b4, 0x040e2b02);
4002 alc5505_coef_set(codec, 0x61bc, 0x010234f8);
4003 alc5505_coef_set(codec, 0x880c, 0x00000004);
4004 alc5505_coef_set(codec, 0x880c, 0x00000003);
4005 alc5505_coef_set(codec, 0x880c, 0x00000010);
4006
4007 #ifdef HALT_REALTEK_ALC5505
4008 alc5505_dsp_halt(codec);
4009 #endif
4010 }
4011
4012 #ifdef HALT_REALTEK_ALC5505
4013 #define alc5505_dsp_suspend(codec) do { } while (0)
4014 #define alc5505_dsp_resume(codec) do { } while (0)
4015 #else
4016 #define alc5505_dsp_suspend(codec) alc5505_dsp_halt(codec)
4017 #define alc5505_dsp_resume(codec) alc5505_dsp_back_from_halt(codec)
4018 #endif
4019
4020 #ifdef CONFIG_PM
4021 static int alc269_suspend(struct hda_codec *codec)
4022 {
4023 struct alc_spec *spec = codec->spec;
4024 int i;
4025
4026 if (spec->has_alc5505_dsp)
4027 alc5505_dsp_suspend(codec);
4028
4029 for (i = 0; i < HDA_MAX_COMPONENTS; i++)
4030 if (spec->comps[i].suspend_hook)
4031 spec->comps[i].suspend_hook(spec->comps[i].dev);
4032
4033 return alc_suspend(codec);
4034 }
4035
4036 static int alc269_resume(struct hda_codec *codec)
4037 {
4038 struct alc_spec *spec = codec->spec;
4039 int i;
4040
4041 if (spec->codec_variant == ALC269_TYPE_ALC269VB)
4042 alc269vb_toggle_power_output(codec, 0);
4043 if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
4044 (alc_get_coef0(codec) & 0x00ff) == 0x018) {
4045 msleep(150);
4046 }
4047
4048 codec->patch_ops.init(codec);
4049
4050 if (spec->codec_variant == ALC269_TYPE_ALC269VB)
4051 alc269vb_toggle_power_output(codec, 1);
4052 if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
4053 (alc_get_coef0(codec) & 0x00ff) == 0x017) {
4054 msleep(200);
4055 }
4056
4057 snd_hda_regmap_sync(codec);
4058 hda_call_check_power_status(codec, 0x01);
4059
4060
4061
4062
4063
4064 if (spec->gpio_data)
4065 alc_write_gpio_data(codec);
4066
4067 if (spec->has_alc5505_dsp)
4068 alc5505_dsp_resume(codec);
4069
4070 for (i = 0; i < HDA_MAX_COMPONENTS; i++)
4071 if (spec->comps[i].resume_hook)
4072 spec->comps[i].resume_hook(spec->comps[i].dev);
4073
4074 return 0;
4075 }
4076 #endif
4077
4078 static void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec,
4079 const struct hda_fixup *fix, int action)
4080 {
4081 struct alc_spec *spec = codec->spec;
4082
4083 if (action == HDA_FIXUP_ACT_PRE_PROBE)
4084 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
4085 }
4086
4087 static void alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec *codec,
4088 const struct hda_fixup *fix,
4089 int action)
4090 {
4091 unsigned int cfg_headphone = snd_hda_codec_get_pincfg(codec, 0x21);
4092 unsigned int cfg_headset_mic = snd_hda_codec_get_pincfg(codec, 0x19);
4093
4094 if (cfg_headphone && cfg_headset_mic == 0x411111f0)
4095 snd_hda_codec_set_pincfg(codec, 0x19,
4096 (cfg_headphone & ~AC_DEFCFG_DEVICE) |
4097 (AC_JACK_MIC_IN << AC_DEFCFG_DEVICE_SHIFT));
4098 }
4099
4100 static void alc269_fixup_hweq(struct hda_codec *codec,
4101 const struct hda_fixup *fix, int action)
4102 {
4103 if (action == HDA_FIXUP_ACT_INIT)
4104 alc_update_coef_idx(codec, 0x1e, 0, 0x80);
4105 }
4106
4107 static void alc269_fixup_headset_mic(struct hda_codec *codec,
4108 const struct hda_fixup *fix, int action)
4109 {
4110 struct alc_spec *spec = codec->spec;
4111
4112 if (action == HDA_FIXUP_ACT_PRE_PROBE)
4113 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
4114 }
4115
4116 static void alc271_fixup_dmic(struct hda_codec *codec,
4117 const struct hda_fixup *fix, int action)
4118 {
4119 static const struct hda_verb verbs[] = {
4120 {0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
4121 {0x20, AC_VERB_SET_PROC_COEF, 0x4000},
4122 {}
4123 };
4124 unsigned int cfg;
4125
4126 if (strcmp(codec->core.chip_name, "ALC271X") &&
4127 strcmp(codec->core.chip_name, "ALC269VB"))
4128 return;
4129 cfg = snd_hda_codec_get_pincfg(codec, 0x12);
4130 if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED)
4131 snd_hda_sequence_write(codec, verbs);
4132 }
4133
4134
4135 static void alc269vb_fixup_aspire_e1_coef(struct hda_codec *codec,
4136 const struct hda_fixup *fix,
4137 int action)
4138 {
4139 if (action == HDA_FIXUP_ACT_INIT)
4140 alc_update_coef_idx(codec, 0x0d, 0x6000, 0x6000);
4141 }
4142
4143 static void alc269_fixup_pcm_44k(struct hda_codec *codec,
4144 const struct hda_fixup *fix, int action)
4145 {
4146 struct alc_spec *spec = codec->spec;
4147
4148 if (action != HDA_FIXUP_ACT_PROBE)
4149 return;
4150
4151
4152
4153
4154 spec->gen.stream_analog_playback = &alc269_44k_pcm_analog_playback;
4155 spec->gen.stream_analog_capture = &alc269_44k_pcm_analog_capture;
4156 }
4157
4158 static void alc269_fixup_stereo_dmic(struct hda_codec *codec,
4159 const struct hda_fixup *fix, int action)
4160 {
4161
4162
4163
4164
4165
4166 if (action == HDA_FIXUP_ACT_INIT)
4167 alc_update_coef_idx(codec, 0x07, 0, 0x80);
4168 }
4169
4170 static void alc269_quanta_automute(struct hda_codec *codec)
4171 {
4172 snd_hda_gen_update_outputs(codec);
4173
4174 alc_write_coef_idx(codec, 0x0c, 0x680);
4175 alc_write_coef_idx(codec, 0x0c, 0x480);
4176 }
4177
4178 static void alc269_fixup_quanta_mute(struct hda_codec *codec,
4179 const struct hda_fixup *fix, int action)
4180 {
4181 struct alc_spec *spec = codec->spec;
4182 if (action != HDA_FIXUP_ACT_PROBE)
4183 return;
4184 spec->gen.automute_hook = alc269_quanta_automute;
4185 }
4186
4187 static void alc269_x101_hp_automute_hook(struct hda_codec *codec,
4188 struct hda_jack_callback *jack)
4189 {
4190 struct alc_spec *spec = codec->spec;
4191 int vref;
4192 msleep(200);
4193 snd_hda_gen_hp_automute(codec, jack);
4194
4195 vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
4196 msleep(100);
4197 snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4198 vref);
4199 msleep(500);
4200 snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4201 vref);
4202 }
4203
4204
4205
4206
4207 struct hda_alc298_mbxinit {
4208 unsigned char value_0x23;
4209 unsigned char value_0x25;
4210 };
4211
4212 static void alc298_huawei_mbx_stereo_seq(struct hda_codec *codec,
4213 const struct hda_alc298_mbxinit *initval,
4214 bool first)
4215 {
4216 snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x0);
4217 alc_write_coef_idx(codec, 0x26, 0xb000);
4218
4219 if (first)
4220 snd_hda_codec_write(codec, 0x21, 0, AC_VERB_GET_PIN_SENSE, 0x0);
4221
4222 snd_hda_codec_write(codec, 0x6, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
4223 alc_write_coef_idx(codec, 0x26, 0xf000);
4224 alc_write_coef_idx(codec, 0x23, initval->value_0x23);
4225
4226 if (initval->value_0x23 != 0x1e)
4227 alc_write_coef_idx(codec, 0x25, initval->value_0x25);
4228
4229 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
4230 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
4231 }
4232
4233 static void alc298_fixup_huawei_mbx_stereo(struct hda_codec *codec,
4234 const struct hda_fixup *fix,
4235 int action)
4236 {
4237
4238 static const struct hda_alc298_mbxinit dac_init[] = {
4239 {0x0c, 0x00}, {0x0d, 0x00}, {0x0e, 0x00}, {0x0f, 0x00},
4240 {0x10, 0x00}, {0x1a, 0x40}, {0x1b, 0x82}, {0x1c, 0x00},
4241 {0x1d, 0x00}, {0x1e, 0x00}, {0x1f, 0x00},
4242 {0x20, 0xc2}, {0x21, 0xc8}, {0x22, 0x26}, {0x23, 0x24},
4243 {0x27, 0xff}, {0x28, 0xff}, {0x29, 0xff}, {0x2a, 0x8f},
4244 {0x2b, 0x02}, {0x2c, 0x48}, {0x2d, 0x34}, {0x2e, 0x00},
4245 {0x2f, 0x00},
4246 {0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00},
4247 {0x34, 0x00}, {0x35, 0x01}, {0x36, 0x93}, {0x37, 0x0c},
4248 {0x38, 0x00}, {0x39, 0x00}, {0x3a, 0xf8}, {0x38, 0x80},
4249 {}
4250 };
4251 const struct hda_alc298_mbxinit *seq;
4252
4253 if (action != HDA_FIXUP_ACT_INIT)
4254 return;
4255
4256
4257 snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x00);
4258 snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
4259 alc_write_coef_idx(codec, 0x26, 0xf000);
4260 alc_write_coef_idx(codec, 0x22, 0x31);
4261 alc_write_coef_idx(codec, 0x23, 0x0b);
4262 alc_write_coef_idx(codec, 0x25, 0x00);
4263 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
4264 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
4265
4266 for (seq = dac_init; seq->value_0x23; seq++)
4267 alc298_huawei_mbx_stereo_seq(codec, seq, seq == dac_init);
4268 }
4269
4270 static void alc269_fixup_x101_headset_mic(struct hda_codec *codec,
4271 const struct hda_fixup *fix, int action)
4272 {
4273 struct alc_spec *spec = codec->spec;
4274 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4275 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
4276 spec->gen.hp_automute_hook = alc269_x101_hp_automute_hook;
4277 }
4278 }
4279
4280 static void alc_update_vref_led(struct hda_codec *codec, hda_nid_t pin,
4281 bool polarity, bool on)
4282 {
4283 unsigned int pinval;
4284
4285 if (!pin)
4286 return;
4287 if (polarity)
4288 on = !on;
4289 pinval = snd_hda_codec_get_pin_target(codec, pin);
4290 pinval &= ~AC_PINCTL_VREFEN;
4291 pinval |= on ? AC_PINCTL_VREF_80 : AC_PINCTL_VREF_HIZ;
4292
4293 snd_hda_power_up_pm(codec);
4294 snd_hda_set_pin_ctl_cache(codec, pin, pinval);
4295 snd_hda_power_down_pm(codec);
4296 }
4297
4298
4299 static int vref_mute_led_set(struct led_classdev *led_cdev,
4300 enum led_brightness brightness)
4301 {
4302 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4303 struct alc_spec *spec = codec->spec;
4304
4305 alc_update_vref_led(codec, spec->mute_led_nid,
4306 spec->mute_led_polarity, brightness);
4307 return 0;
4308 }
4309
4310
4311 static unsigned int led_power_filter(struct hda_codec *codec,
4312 hda_nid_t nid,
4313 unsigned int power_state)
4314 {
4315 struct alc_spec *spec = codec->spec;
4316
4317 if (power_state != AC_PWRST_D3 || nid == 0 ||
4318 (nid != spec->mute_led_nid && nid != spec->cap_mute_led_nid))
4319 return power_state;
4320
4321
4322 snd_hda_set_pin_ctl(codec, nid,
4323 snd_hda_codec_get_pin_target(codec, nid));
4324
4325 return snd_hda_gen_path_power_filter(codec, nid, power_state);
4326 }
4327
4328 static void alc269_fixup_hp_mute_led(struct hda_codec *codec,
4329 const struct hda_fixup *fix, int action)
4330 {
4331 struct alc_spec *spec = codec->spec;
4332 const struct dmi_device *dev = NULL;
4333
4334 if (action != HDA_FIXUP_ACT_PRE_PROBE)
4335 return;
4336
4337 while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) {
4338 int pol, pin;
4339 if (sscanf(dev->name, "HP_Mute_LED_%d_%x", &pol, &pin) != 2)
4340 continue;
4341 if (pin < 0x0a || pin >= 0x10)
4342 break;
4343 spec->mute_led_polarity = pol;
4344 spec->mute_led_nid = pin - 0x0a + 0x18;
4345 snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
4346 codec->power_filter = led_power_filter;
4347 codec_dbg(codec,
4348 "Detected mute LED for %x:%d\n", spec->mute_led_nid,
4349 spec->mute_led_polarity);
4350 break;
4351 }
4352 }
4353
4354 static void alc269_fixup_hp_mute_led_micx(struct hda_codec *codec,
4355 const struct hda_fixup *fix,
4356 int action, hda_nid_t pin)
4357 {
4358 struct alc_spec *spec = codec->spec;
4359
4360 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4361 spec->mute_led_polarity = 0;
4362 spec->mute_led_nid = pin;
4363 snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
4364 codec->power_filter = led_power_filter;
4365 }
4366 }
4367
4368 static void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec,
4369 const struct hda_fixup *fix, int action)
4370 {
4371 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x18);
4372 }
4373
4374 static void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec,
4375 const struct hda_fixup *fix, int action)
4376 {
4377 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x19);
4378 }
4379
4380 static void alc269_fixup_hp_mute_led_mic3(struct hda_codec *codec,
4381 const struct hda_fixup *fix, int action)
4382 {
4383 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1b);
4384 }
4385
4386
4387 static void alc_update_gpio_led(struct hda_codec *codec, unsigned int mask,
4388 int polarity, bool enabled)
4389 {
4390 if (polarity)
4391 enabled = !enabled;
4392 alc_update_gpio_data(codec, mask, !enabled);
4393 }
4394
4395
4396 static int gpio_mute_led_set(struct led_classdev *led_cdev,
4397 enum led_brightness brightness)
4398 {
4399 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4400 struct alc_spec *spec = codec->spec;
4401
4402 alc_update_gpio_led(codec, spec->gpio_mute_led_mask,
4403 spec->mute_led_polarity, !brightness);
4404 return 0;
4405 }
4406
4407
4408 static int micmute_led_set(struct led_classdev *led_cdev,
4409 enum led_brightness brightness)
4410 {
4411 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4412 struct alc_spec *spec = codec->spec;
4413
4414 alc_update_gpio_led(codec, spec->gpio_mic_led_mask,
4415 spec->micmute_led_polarity, !brightness);
4416 return 0;
4417 }
4418
4419
4420 static void alc_fixup_hp_gpio_led(struct hda_codec *codec,
4421 int action,
4422 unsigned int mute_mask,
4423 unsigned int micmute_mask)
4424 {
4425 struct alc_spec *spec = codec->spec;
4426
4427 alc_fixup_gpio(codec, action, mute_mask | micmute_mask);
4428
4429 if (action != HDA_FIXUP_ACT_PRE_PROBE)
4430 return;
4431 if (mute_mask) {
4432 spec->gpio_mute_led_mask = mute_mask;
4433 snd_hda_gen_add_mute_led_cdev(codec, gpio_mute_led_set);
4434 }
4435 if (micmute_mask) {
4436 spec->gpio_mic_led_mask = micmute_mask;
4437 snd_hda_gen_add_micmute_led_cdev(codec, micmute_led_set);
4438 }
4439 }
4440
4441 static void alc236_fixup_hp_gpio_led(struct hda_codec *codec,
4442 const struct hda_fixup *fix, int action)
4443 {
4444 alc_fixup_hp_gpio_led(codec, action, 0x02, 0x01);
4445 }
4446
4447 static void alc269_fixup_hp_gpio_led(struct hda_codec *codec,
4448 const struct hda_fixup *fix, int action)
4449 {
4450 alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
4451 }
4452
4453 static void alc285_fixup_hp_gpio_led(struct hda_codec *codec,
4454 const struct hda_fixup *fix, int action)
4455 {
4456 alc_fixup_hp_gpio_led(codec, action, 0x04, 0x01);
4457 }
4458
4459 static void alc286_fixup_hp_gpio_led(struct hda_codec *codec,
4460 const struct hda_fixup *fix, int action)
4461 {
4462 alc_fixup_hp_gpio_led(codec, action, 0x02, 0x20);
4463 }
4464
4465 static void alc287_fixup_hp_gpio_led(struct hda_codec *codec,
4466 const struct hda_fixup *fix, int action)
4467 {
4468 alc_fixup_hp_gpio_led(codec, action, 0x10, 0);
4469 }
4470
4471 static void alc245_fixup_hp_gpio_led(struct hda_codec *codec,
4472 const struct hda_fixup *fix, int action)
4473 {
4474 struct alc_spec *spec = codec->spec;
4475
4476 if (action == HDA_FIXUP_ACT_PRE_PROBE)
4477 spec->micmute_led_polarity = 1;
4478 alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
4479 }
4480
4481
4482 static int vref_micmute_led_set(struct led_classdev *led_cdev,
4483 enum led_brightness brightness)
4484 {
4485 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4486 struct alc_spec *spec = codec->spec;
4487
4488 alc_update_vref_led(codec, spec->cap_mute_led_nid,
4489 spec->micmute_led_polarity, brightness);
4490 return 0;
4491 }
4492
4493 static void alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec,
4494 const struct hda_fixup *fix, int action)
4495 {
4496 struct alc_spec *spec = codec->spec;
4497
4498 alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
4499 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4500
4501
4502
4503 spec->gpio_mask |= 0x10;
4504 spec->gpio_dir |= 0x10;
4505 spec->cap_mute_led_nid = 0x18;
4506 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4507 codec->power_filter = led_power_filter;
4508 }
4509 }
4510
4511 static void alc280_fixup_hp_gpio4(struct hda_codec *codec,
4512 const struct hda_fixup *fix, int action)
4513 {
4514 struct alc_spec *spec = codec->spec;
4515
4516 alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
4517 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4518 spec->cap_mute_led_nid = 0x18;
4519 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4520 codec->power_filter = led_power_filter;
4521 }
4522 }
4523
4524
4525
4526
4527 static void alc245_fixup_hp_x360_amp(struct hda_codec *codec,
4528 const struct hda_fixup *fix, int action)
4529 {
4530 struct alc_spec *spec = codec->spec;
4531
4532 switch (action) {
4533 case HDA_FIXUP_ACT_PRE_PROBE:
4534 spec->gpio_mask |= 0x01;
4535 spec->gpio_dir |= 0x01;
4536 break;
4537 case HDA_FIXUP_ACT_INIT:
4538
4539 alc_update_gpio_data(codec, 0x01, true);
4540 msleep(100);
4541 alc_update_gpio_data(codec, 0x01, false);
4542 break;
4543 }
4544 }
4545
4546
4547 static void alc274_hp_envy_pcm_hook(struct hda_pcm_stream *hinfo,
4548 struct hda_codec *codec,
4549 struct snd_pcm_substream *substream,
4550 int action)
4551 {
4552 switch (action) {
4553 case HDA_GEN_PCM_ACT_PREPARE:
4554 alc_update_gpio_data(codec, 0x04, true);
4555 break;
4556 case HDA_GEN_PCM_ACT_CLEANUP:
4557 alc_update_gpio_data(codec, 0x04, false);
4558 break;
4559 }
4560 }
4561
4562 static void alc274_fixup_hp_envy_gpio(struct hda_codec *codec,
4563 const struct hda_fixup *fix,
4564 int action)
4565 {
4566 struct alc_spec *spec = codec->spec;
4567
4568 if (action == HDA_FIXUP_ACT_PROBE) {
4569 spec->gpio_mask |= 0x04;
4570 spec->gpio_dir |= 0x04;
4571 spec->gen.pcm_playback_hook = alc274_hp_envy_pcm_hook;
4572 }
4573 }
4574
4575 static void alc_update_coef_led(struct hda_codec *codec,
4576 struct alc_coef_led *led,
4577 bool polarity, bool on)
4578 {
4579 if (polarity)
4580 on = !on;
4581
4582 alc_update_coef_idx(codec, led->idx, led->mask,
4583 on ? led->on : led->off);
4584 }
4585
4586
4587 static int coef_mute_led_set(struct led_classdev *led_cdev,
4588 enum led_brightness brightness)
4589 {
4590 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4591 struct alc_spec *spec = codec->spec;
4592
4593 alc_update_coef_led(codec, &spec->mute_led_coef,
4594 spec->mute_led_polarity, brightness);
4595 return 0;
4596 }
4597
4598 static void alc285_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4599 const struct hda_fixup *fix,
4600 int action)
4601 {
4602 struct alc_spec *spec = codec->spec;
4603
4604 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4605 spec->mute_led_polarity = 0;
4606 spec->mute_led_coef.idx = 0x0b;
4607 spec->mute_led_coef.mask = 1 << 3;
4608 spec->mute_led_coef.on = 1 << 3;
4609 spec->mute_led_coef.off = 0;
4610 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4611 }
4612 }
4613
4614 static void alc236_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4615 const struct hda_fixup *fix,
4616 int action)
4617 {
4618 struct alc_spec *spec = codec->spec;
4619
4620 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4621 spec->mute_led_polarity = 0;
4622 spec->mute_led_coef.idx = 0x34;
4623 spec->mute_led_coef.mask = 1 << 5;
4624 spec->mute_led_coef.on = 0;
4625 spec->mute_led_coef.off = 1 << 5;
4626 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4627 }
4628 }
4629
4630
4631 static int coef_micmute_led_set(struct led_classdev *led_cdev,
4632 enum led_brightness brightness)
4633 {
4634 struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4635 struct alc_spec *spec = codec->spec;
4636
4637 alc_update_coef_led(codec, &spec->mic_led_coef,
4638 spec->micmute_led_polarity, brightness);
4639 return 0;
4640 }
4641
4642 static void alc285_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4643 const struct hda_fixup *fix, int action)
4644 {
4645 struct alc_spec *spec = codec->spec;
4646
4647 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4648 spec->mic_led_coef.idx = 0x19;
4649 spec->mic_led_coef.mask = 1 << 13;
4650 spec->mic_led_coef.on = 1 << 13;
4651 spec->mic_led_coef.off = 0;
4652 snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
4653 }
4654 }
4655
4656 static void alc236_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4657 const struct hda_fixup *fix, int action)
4658 {
4659 struct alc_spec *spec = codec->spec;
4660
4661 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4662 spec->mic_led_coef.idx = 0x35;
4663 spec->mic_led_coef.mask = 3 << 2;
4664 spec->mic_led_coef.on = 2 << 2;
4665 spec->mic_led_coef.off = 1 << 2;
4666 snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
4667 }
4668 }
4669
4670 static void alc285_fixup_hp_mute_led(struct hda_codec *codec,
4671 const struct hda_fixup *fix, int action)
4672 {
4673 alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
4674 alc285_fixup_hp_coef_micmute_led(codec, fix, action);
4675 }
4676
4677 static void alc236_fixup_hp_mute_led(struct hda_codec *codec,
4678 const struct hda_fixup *fix, int action)
4679 {
4680 alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
4681 alc236_fixup_hp_coef_micmute_led(codec, fix, action);
4682 }
4683
4684 static void alc236_fixup_hp_micmute_led_vref(struct hda_codec *codec,
4685 const struct hda_fixup *fix, int action)
4686 {
4687 struct alc_spec *spec = codec->spec;
4688
4689 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4690 spec->cap_mute_led_nid = 0x1a;
4691 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4692 codec->power_filter = led_power_filter;
4693 }
4694 }
4695
4696 static void alc236_fixup_hp_mute_led_micmute_vref(struct hda_codec *codec,
4697 const struct hda_fixup *fix, int action)
4698 {
4699 alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
4700 alc236_fixup_hp_micmute_led_vref(codec, fix, action);
4701 }
4702
4703 static inline void alc298_samsung_write_coef_pack(struct hda_codec *codec,
4704 const unsigned short coefs[2])
4705 {
4706 alc_write_coef_idx(codec, 0x23, coefs[0]);
4707 alc_write_coef_idx(codec, 0x25, coefs[1]);
4708 alc_write_coef_idx(codec, 0x26, 0xb011);
4709 }
4710
4711 struct alc298_samsung_amp_desc {
4712 unsigned char nid;
4713 unsigned short init_seq[2][2];
4714 };
4715
4716 static void alc298_fixup_samsung_amp(struct hda_codec *codec,
4717 const struct hda_fixup *fix, int action)
4718 {
4719 int i, j;
4720 static const unsigned short init_seq[][2] = {
4721 { 0x19, 0x00 }, { 0x20, 0xc0 }, { 0x22, 0x44 }, { 0x23, 0x08 },
4722 { 0x24, 0x85 }, { 0x25, 0x41 }, { 0x35, 0x40 }, { 0x36, 0x01 },
4723 { 0x38, 0x81 }, { 0x3a, 0x03 }, { 0x3b, 0x81 }, { 0x40, 0x3e },
4724 { 0x41, 0x07 }, { 0x400, 0x1 }
4725 };
4726 static const struct alc298_samsung_amp_desc amps[] = {
4727 { 0x3a, { { 0x18, 0x1 }, { 0x26, 0x0 } } },
4728 { 0x39, { { 0x18, 0x2 }, { 0x26, 0x1 } } }
4729 };
4730
4731 if (action != HDA_FIXUP_ACT_INIT)
4732 return;
4733
4734 for (i = 0; i < ARRAY_SIZE(amps); i++) {
4735 alc_write_coef_idx(codec, 0x22, amps[i].nid);
4736
4737 for (j = 0; j < ARRAY_SIZE(amps[i].init_seq); j++)
4738 alc298_samsung_write_coef_pack(codec, amps[i].init_seq[j]);
4739
4740 for (j = 0; j < ARRAY_SIZE(init_seq); j++)
4741 alc298_samsung_write_coef_pack(codec, init_seq[j]);
4742 }
4743 }
4744
4745 #if IS_REACHABLE(CONFIG_INPUT)
4746 static void gpio2_mic_hotkey_event(struct hda_codec *codec,
4747 struct hda_jack_callback *event)
4748 {
4749 struct alc_spec *spec = codec->spec;
4750
4751
4752
4753 input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 1);
4754 input_sync(spec->kb_dev);
4755 input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 0);
4756 input_sync(spec->kb_dev);
4757 }
4758
4759 static int alc_register_micmute_input_device(struct hda_codec *codec)
4760 {
4761 struct alc_spec *spec = codec->spec;
4762 int i;
4763
4764 spec->kb_dev = input_allocate_device();
4765 if (!spec->kb_dev) {
4766 codec_err(codec, "Out of memory (input_allocate_device)\n");
4767 return -ENOMEM;
4768 }
4769
4770 spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX] = KEY_MICMUTE;
4771
4772 spec->kb_dev->name = "Microphone Mute Button";
4773 spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY);
4774 spec->kb_dev->keycodesize = sizeof(spec->alc_mute_keycode_map[0]);
4775 spec->kb_dev->keycodemax = ARRAY_SIZE(spec->alc_mute_keycode_map);
4776 spec->kb_dev->keycode = spec->alc_mute_keycode_map;
4777 for (i = 0; i < ARRAY_SIZE(spec->alc_mute_keycode_map); i++)
4778 set_bit(spec->alc_mute_keycode_map[i], spec->kb_dev->keybit);
4779
4780 if (input_register_device(spec->kb_dev)) {
4781 codec_err(codec, "input_register_device failed\n");
4782 input_free_device(spec->kb_dev);
4783 spec->kb_dev = NULL;
4784 return -ENOMEM;
4785 }
4786
4787 return 0;
4788 }
4789
4790
4791
4792
4793
4794
4795 static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec,
4796 const struct hda_fixup *fix, int action)
4797 {
4798 struct alc_spec *spec = codec->spec;
4799
4800 alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
4801 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4802 spec->init_amp = ALC_INIT_DEFAULT;
4803 if (alc_register_micmute_input_device(codec) != 0)
4804 return;
4805
4806 spec->gpio_mask |= 0x06;
4807 spec->gpio_dir |= 0x02;
4808 spec->gpio_data |= 0x02;
4809 snd_hda_codec_write_cache(codec, codec->core.afg, 0,
4810 AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x04);
4811 snd_hda_jack_detect_enable_callback(codec, codec->core.afg,
4812 gpio2_mic_hotkey_event);
4813 return;
4814 }
4815
4816 if (!spec->kb_dev)
4817 return;
4818
4819 switch (action) {
4820 case HDA_FIXUP_ACT_FREE:
4821 input_unregister_device(spec->kb_dev);
4822 spec->kb_dev = NULL;
4823 }
4824 }
4825
4826
4827
4828
4829 static void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec,
4830 const struct hda_fixup *fix, int action)
4831 {
4832 struct alc_spec *spec = codec->spec;
4833
4834 alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
4835 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4836 spec->init_amp = ALC_INIT_DEFAULT;
4837 if (alc_register_micmute_input_device(codec) != 0)
4838 return;
4839
4840 snd_hda_jack_detect_enable_callback(codec, 0x1b,
4841 gpio2_mic_hotkey_event);
4842 return;
4843 }
4844
4845 if (!spec->kb_dev)
4846 return;
4847
4848 switch (action) {
4849 case HDA_FIXUP_ACT_FREE:
4850 input_unregister_device(spec->kb_dev);
4851 spec->kb_dev = NULL;
4852 }
4853 }
4854 #else
4855 #define alc280_fixup_hp_gpio2_mic_hotkey NULL
4856 #define alc233_fixup_lenovo_line2_mic_hotkey NULL
4857 #endif
4858
4859 static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec,
4860 const struct hda_fixup *fix, int action)
4861 {
4862 struct alc_spec *spec = codec->spec;
4863
4864 alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1a);
4865 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4866 spec->cap_mute_led_nid = 0x18;
4867 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4868 }
4869 }
4870
4871 static const struct coef_fw alc225_pre_hsmode[] = {
4872 UPDATE_COEF(0x4a, 1<<8, 0),
4873 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0),
4874 UPDATE_COEF(0x63, 3<<14, 3<<14),
4875 UPDATE_COEF(0x4a, 3<<4, 2<<4),
4876 UPDATE_COEF(0x4a, 3<<10, 3<<10),
4877 UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10),
4878 UPDATE_COEF(0x4a, 3<<10, 0),
4879 {}
4880 };
4881
4882 static void alc_headset_mode_unplugged(struct hda_codec *codec)
4883 {
4884 struct alc_spec *spec = codec->spec;
4885 static const struct coef_fw coef0255[] = {
4886 WRITE_COEF(0x1b, 0x0c0b),
4887 WRITE_COEF(0x45, 0xd089),
4888 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0),
4889 WRITE_COEF(0x06, 0x6104),
4890 WRITE_COEFEX(0x57, 0x03, 0x8aa6),
4891 {}
4892 };
4893 static const struct coef_fw coef0256[] = {
4894 WRITE_COEF(0x1b, 0x0c4b),
4895 WRITE_COEF(0x45, 0xd089),
4896 WRITE_COEF(0x06, 0x6104),
4897 WRITE_COEFEX(0x57, 0x03, 0x09a3),
4898 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0),
4899 {}
4900 };
4901 static const struct coef_fw coef0233[] = {
4902 WRITE_COEF(0x1b, 0x0c0b),
4903 WRITE_COEF(0x45, 0xc429),
4904 UPDATE_COEF(0x35, 0x4000, 0),
4905 WRITE_COEF(0x06, 0x2104),
4906 WRITE_COEF(0x1a, 0x0001),
4907 WRITE_COEF(0x26, 0x0004),
4908 WRITE_COEF(0x32, 0x42a3),
4909 {}
4910 };
4911 static const struct coef_fw coef0288[] = {
4912 UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
4913 UPDATE_COEF(0x50, 0x2000, 0x2000),
4914 UPDATE_COEF(0x56, 0x0006, 0x0006),
4915 UPDATE_COEF(0x66, 0x0008, 0),
4916 UPDATE_COEF(0x67, 0x2000, 0),
4917 {}
4918 };
4919 static const struct coef_fw coef0298[] = {
4920 UPDATE_COEF(0x19, 0x1300, 0x0300),
4921 {}
4922 };
4923 static const struct coef_fw coef0292[] = {
4924 WRITE_COEF(0x76, 0x000e),
4925 WRITE_COEF(0x6c, 0x2400),
4926 WRITE_COEF(0x18, 0x7308),
4927 WRITE_COEF(0x6b, 0xc429),
4928 {}
4929 };
4930 static const struct coef_fw coef0293[] = {
4931 UPDATE_COEF(0x10, 7<<8, 6<<8),
4932 UPDATE_COEFEX(0x57, 0x05, 1<<15|1<<13, 0x0),
4933 UPDATE_COEFEX(0x57, 0x03, 1<<10, 1<<10),
4934 UPDATE_COEF(0x1a, 1<<3, 1<<3),
4935 WRITE_COEF(0x45, 0xc429),
4936 UPDATE_COEF(0x4a, 0x000f, 0x000e),
4937 {}
4938 };
4939 static const struct coef_fw coef0668[] = {
4940 WRITE_COEF(0x15, 0x0d40),
4941 WRITE_COEF(0xb7, 0x802b),
4942 {}
4943 };
4944 static const struct coef_fw coef0225[] = {
4945 UPDATE_COEF(0x63, 3<<14, 0),
4946 {}
4947 };
4948 static const struct coef_fw coef0274[] = {
4949 UPDATE_COEF(0x4a, 0x0100, 0),
4950 UPDATE_COEFEX(0x57, 0x05, 0x4000, 0),
4951 UPDATE_COEF(0x6b, 0xf000, 0x5000),
4952 UPDATE_COEF(0x4a, 0x0010, 0),
4953 UPDATE_COEF(0x4a, 0x0c00, 0x0c00),
4954 WRITE_COEF(0x45, 0x5289),
4955 UPDATE_COEF(0x4a, 0x0c00, 0),
4956 {}
4957 };
4958
4959 if (spec->no_internal_mic_pin) {
4960 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
4961 return;
4962 }
4963
4964 switch (codec->core.vendor_id) {
4965 case 0x10ec0255:
4966 alc_process_coef_fw(codec, coef0255);
4967 break;
4968 case 0x10ec0230:
4969 case 0x10ec0236:
4970 case 0x10ec0256:
4971 case 0x19e58326:
4972 alc_process_coef_fw(codec, coef0256);
4973 break;
4974 case 0x10ec0234:
4975 case 0x10ec0274:
4976 case 0x10ec0294:
4977 alc_process_coef_fw(codec, coef0274);
4978 break;
4979 case 0x10ec0233:
4980 case 0x10ec0283:
4981 alc_process_coef_fw(codec, coef0233);
4982 break;
4983 case 0x10ec0286:
4984 case 0x10ec0288:
4985 alc_process_coef_fw(codec, coef0288);
4986 break;
4987 case 0x10ec0298:
4988 alc_process_coef_fw(codec, coef0298);
4989 alc_process_coef_fw(codec, coef0288);
4990 break;
4991 case 0x10ec0292:
4992 alc_process_coef_fw(codec, coef0292);
4993 break;
4994 case 0x10ec0293:
4995 alc_process_coef_fw(codec, coef0293);
4996 break;
4997 case 0x10ec0668:
4998 alc_process_coef_fw(codec, coef0668);
4999 break;
5000 case 0x10ec0215:
5001 case 0x10ec0225:
5002 case 0x10ec0285:
5003 case 0x10ec0295:
5004 case 0x10ec0289:
5005 case 0x10ec0299:
5006 alc_process_coef_fw(codec, alc225_pre_hsmode);
5007 alc_process_coef_fw(codec, coef0225);
5008 break;
5009 case 0x10ec0867:
5010 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5011 break;
5012 }
5013 codec_dbg(codec, "Headset jack set to unplugged mode.\n");
5014 }
5015
5016
5017 static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
5018 hda_nid_t mic_pin)
5019 {
5020 static const struct coef_fw coef0255[] = {
5021 WRITE_COEFEX(0x57, 0x03, 0x8aa6),
5022 WRITE_COEF(0x06, 0x6100),
5023 {}
5024 };
5025 static const struct coef_fw coef0256[] = {
5026 UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14),
5027 WRITE_COEFEX(0x57, 0x03, 0x09a3),
5028 WRITE_COEF(0x06, 0x6100),
5029 {}
5030 };
5031 static const struct coef_fw coef0233[] = {
5032 UPDATE_COEF(0x35, 0, 1<<14),
5033 WRITE_COEF(0x06, 0x2100),
5034 WRITE_COEF(0x1a, 0x0021),
5035 WRITE_COEF(0x26, 0x008c),
5036 {}
5037 };
5038 static const struct coef_fw coef0288[] = {
5039 UPDATE_COEF(0x4f, 0x00c0, 0),
5040 UPDATE_COEF(0x50, 0x2000, 0),
5041 UPDATE_COEF(0x56, 0x0006, 0),
5042 UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
5043 UPDATE_COEF(0x66, 0x0008, 0x0008),
5044 UPDATE_COEF(0x67, 0x2000, 0x2000),
5045 {}
5046 };
5047 static const struct coef_fw coef0292[] = {
5048 WRITE_COEF(0x19, 0xa208),
5049 WRITE_COEF(0x2e, 0xacf0),
5050 {}
5051 };
5052 static const struct coef_fw coef0293[] = {
5053 UPDATE_COEFEX(0x57, 0x05, 0, 1<<15|1<<13),
5054 UPDATE_COEFEX(0x57, 0x03, 1<<10, 0),
5055 UPDATE_COEF(0x1a, 1<<3, 0),
5056 {}
5057 };
5058 static const struct coef_fw coef0688[] = {
5059 WRITE_COEF(0xb7, 0x802b),
5060 WRITE_COEF(0xb5, 0x1040),
5061 UPDATE_COEF(0xc3, 0, 1<<12),
5062 {}
5063 };
5064 static const struct coef_fw coef0225[] = {
5065 UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14),
5066 UPDATE_COEF(0x4a, 3<<4, 2<<4),
5067 UPDATE_COEF(0x63, 3<<14, 0),
5068 {}
5069 };
5070 static const struct coef_fw coef0274[] = {
5071 UPDATE_COEFEX(0x57, 0x05, 0x4000, 0x4000),
5072 UPDATE_COEF(0x4a, 0x0010, 0),
5073 UPDATE_COEF(0x6b, 0xf000, 0),
5074 {}
5075 };
5076
5077 switch (codec->core.vendor_id) {
5078 case 0x10ec0255:
5079 alc_write_coef_idx(codec, 0x45, 0xc489);
5080 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5081 alc_process_coef_fw(codec, coef0255);
5082 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5083 break;
5084 case 0x10ec0230:
5085 case 0x10ec0236:
5086 case 0x10ec0256:
5087 case 0x19e58326:
5088 alc_write_coef_idx(codec, 0x45, 0xc489);
5089 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5090 alc_process_coef_fw(codec, coef0256);
5091 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5092 break;
5093 case 0x10ec0234:
5094 case 0x10ec0274:
5095 case 0x10ec0294:
5096 alc_write_coef_idx(codec, 0x45, 0x4689);
5097 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5098 alc_process_coef_fw(codec, coef0274);
5099 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5100 break;
5101 case 0x10ec0233:
5102 case 0x10ec0283:
5103 alc_write_coef_idx(codec, 0x45, 0xc429);
5104 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5105 alc_process_coef_fw(codec, coef0233);
5106 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5107 break;
5108 case 0x10ec0286:
5109 case 0x10ec0288:
5110 case 0x10ec0298:
5111 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5112 alc_process_coef_fw(codec, coef0288);
5113 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5114 break;
5115 case 0x10ec0292:
5116 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5117 alc_process_coef_fw(codec, coef0292);
5118 break;
5119 case 0x10ec0293:
5120
5121 alc_write_coef_idx(codec, 0x45, 0xc429);
5122 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5123 alc_process_coef_fw(codec, coef0293);
5124 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5125 break;
5126 case 0x10ec0867:
5127 alc_update_coefex_idx(codec, 0x57, 0x5, 0, 1<<14);
5128 fallthrough;
5129 case 0x10ec0221:
5130 case 0x10ec0662:
5131 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5132 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5133 break;
5134 case 0x10ec0668:
5135 alc_write_coef_idx(codec, 0x11, 0x0001);
5136 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5137 alc_process_coef_fw(codec, coef0688);
5138 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5139 break;
5140 case 0x10ec0215:
5141 case 0x10ec0225:
5142 case 0x10ec0285:
5143 case 0x10ec0295:
5144 case 0x10ec0289:
5145 case 0x10ec0299:
5146 alc_process_coef_fw(codec, alc225_pre_hsmode);
5147 alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x31<<10);
5148 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5149 alc_process_coef_fw(codec, coef0225);
5150 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5151 break;
5152 }
5153 codec_dbg(codec, "Headset jack set to mic-in mode.\n");
5154 }
5155
5156 static void alc_headset_mode_default(struct hda_codec *codec)
5157 {
5158 static const struct coef_fw coef0225[] = {
5159 UPDATE_COEF(0x45, 0x3f<<10, 0x30<<10),
5160 UPDATE_COEF(0x45, 0x3f<<10, 0x31<<10),
5161 UPDATE_COEF(0x49, 3<<8, 0<<8),
5162 UPDATE_COEF(0x4a, 3<<4, 3<<4),
5163 UPDATE_COEF(0x63, 3<<14, 0),
5164 UPDATE_COEF(0x67, 0xf000, 0x3000),
5165 {}
5166 };
5167 static const struct coef_fw coef0255[] = {
5168 WRITE_COEF(0x45, 0xc089),
5169 WRITE_COEF(0x45, 0xc489),
5170 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5171 WRITE_COEF(0x49, 0x0049),
5172 {}
5173 };
5174 static const struct coef_fw coef0256[] = {
5175 WRITE_COEF(0x45, 0xc489),
5176 WRITE_COEFEX(0x57, 0x03, 0x0da3),
5177 WRITE_COEF(0x49, 0x0049),
5178 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0),
5179 WRITE_COEF(0x06, 0x6100),
5180 {}
5181 };
5182 static const struct coef_fw coef0233[] = {
5183 WRITE_COEF(0x06, 0x2100),
5184 WRITE_COEF(0x32, 0x4ea3),
5185 {}
5186 };
5187 static const struct coef_fw coef0288[] = {
5188 UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
5189 UPDATE_COEF(0x50, 0x2000, 0x2000),
5190 UPDATE_COEF(0x56, 0x0006, 0x0006),
5191 UPDATE_COEF(0x66, 0x0008, 0),
5192 UPDATE_COEF(0x67, 0x2000, 0),
5193 {}
5194 };
5195 static const struct coef_fw coef0292[] = {
5196 WRITE_COEF(0x76, 0x000e),
5197 WRITE_COEF(0x6c, 0x2400),
5198 WRITE_COEF(0x6b, 0xc429),
5199 WRITE_COEF(0x18, 0x7308),
5200 {}
5201 };
5202 static const struct coef_fw coef0293[] = {
5203 UPDATE_COEF(0x4a, 0x000f, 0x000e),
5204 WRITE_COEF(0x45, 0xC429),
5205 UPDATE_COEF(0x1a, 1<<3, 0),
5206 {}
5207 };
5208 static const struct coef_fw coef0688[] = {
5209 WRITE_COEF(0x11, 0x0041),
5210 WRITE_COEF(0x15, 0x0d40),
5211 WRITE_COEF(0xb7, 0x802b),
5212 {}
5213 };
5214 static const struct coef_fw coef0274[] = {
5215 WRITE_COEF(0x45, 0x4289),
5216 UPDATE_COEF(0x4a, 0x0010, 0x0010),
5217 UPDATE_COEF(0x6b, 0x0f00, 0),
5218 UPDATE_COEF(0x49, 0x0300, 0x0300),
5219 {}
5220 };
5221
5222 switch (codec->core.vendor_id) {
5223 case 0x10ec0215:
5224 case 0x10ec0225:
5225 case 0x10ec0285:
5226 case 0x10ec0295:
5227 case 0x10ec0289:
5228 case 0x10ec0299:
5229 alc_process_coef_fw(codec, alc225_pre_hsmode);
5230 alc_process_coef_fw(codec, coef0225);
5231 break;
5232 case 0x10ec0255:
5233 alc_process_coef_fw(codec, coef0255);
5234 break;
5235 case 0x10ec0230:
5236 case 0x10ec0236:
5237 case 0x10ec0256:
5238 case 0x19e58326:
5239 alc_write_coef_idx(codec, 0x1b, 0x0e4b);
5240 alc_write_coef_idx(codec, 0x45, 0xc089);
5241 msleep(50);
5242 alc_process_coef_fw(codec, coef0256);
5243 break;
5244 case 0x10ec0234:
5245 case 0x10ec0274:
5246 case 0x10ec0294:
5247 alc_process_coef_fw(codec, coef0274);
5248 break;
5249 case 0x10ec0233:
5250 case 0x10ec0283:
5251 alc_process_coef_fw(codec, coef0233);
5252 break;
5253 case 0x10ec0286:
5254 case 0x10ec0288:
5255 case 0x10ec0298:
5256 alc_process_coef_fw(codec, coef0288);
5257 break;
5258 case 0x10ec0292:
5259 alc_process_coef_fw(codec, coef0292);
5260 break;
5261 case 0x10ec0293:
5262 alc_process_coef_fw(codec, coef0293);
5263 break;
5264 case 0x10ec0668:
5265 alc_process_coef_fw(codec, coef0688);
5266 break;
5267 case 0x10ec0867:
5268 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5269 break;
5270 }
5271 codec_dbg(codec, "Headset jack set to headphone (default) mode.\n");
5272 }
5273
5274
5275 static void alc_headset_mode_ctia(struct hda_codec *codec)
5276 {
5277 int val;
5278
5279 static const struct coef_fw coef0255[] = {
5280 WRITE_COEF(0x45, 0xd489),
5281 WRITE_COEF(0x1b, 0x0c2b),
5282 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5283 {}
5284 };
5285 static const struct coef_fw coef0256[] = {
5286 WRITE_COEF(0x45, 0xd489),
5287 WRITE_COEF(0x1b, 0x0e6b),
5288 {}
5289 };
5290 static const struct coef_fw coef0233[] = {
5291 WRITE_COEF(0x45, 0xd429),
5292 WRITE_COEF(0x1b, 0x0c2b),
5293 WRITE_COEF(0x32, 0x4ea3),
5294 {}
5295 };
5296 static const struct coef_fw coef0288[] = {
5297 UPDATE_COEF(0x50, 0x2000, 0x2000),
5298 UPDATE_COEF(0x56, 0x0006, 0x0006),
5299 UPDATE_COEF(0x66, 0x0008, 0),
5300 UPDATE_COEF(0x67, 0x2000, 0),
5301 {}
5302 };
5303 static const struct coef_fw coef0292[] = {
5304 WRITE_COEF(0x6b, 0xd429),
5305 WRITE_COEF(0x76, 0x0008),
5306 WRITE_COEF(0x18, 0x7388),
5307 {}
5308 };
5309 static const struct coef_fw coef0293[] = {
5310 WRITE_COEF(0x45, 0xd429),
5311 UPDATE_COEF(0x10, 7<<8, 7<<8),
5312 {}
5313 };
5314 static const struct coef_fw coef0688[] = {
5315 WRITE_COEF(0x11, 0x0001),
5316 WRITE_COEF(0x15, 0x0d60),
5317 WRITE_COEF(0xc3, 0x0000),
5318 {}
5319 };
5320 static const struct coef_fw coef0225_1[] = {
5321 UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
5322 UPDATE_COEF(0x63, 3<<14, 2<<14),
5323 {}
5324 };
5325 static const struct coef_fw coef0225_2[] = {
5326 UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
5327 UPDATE_COEF(0x63, 3<<14, 1<<14),
5328 {}
5329 };
5330
5331 switch (codec->core.vendor_id) {
5332 case 0x10ec0255:
5333 alc_process_coef_fw(codec, coef0255);
5334 break;
5335 case 0x10ec0230:
5336 case 0x10ec0236:
5337 case 0x10ec0256:
5338 case 0x19e58326:
5339 alc_process_coef_fw(codec, coef0256);
5340 break;
5341 case 0x10ec0234:
5342 case 0x10ec0274:
5343 case 0x10ec0294:
5344 alc_write_coef_idx(codec, 0x45, 0xd689);
5345 break;
5346 case 0x10ec0233:
5347 case 0x10ec0283:
5348 alc_process_coef_fw(codec, coef0233);
5349 break;
5350 case 0x10ec0298:
5351 val = alc_read_coef_idx(codec, 0x50);
5352 if (val & (1 << 12)) {
5353 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
5354 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5355 msleep(300);
5356 } else {
5357 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
5358 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5359 msleep(300);
5360 }
5361 break;
5362 case 0x10ec0286:
5363 case 0x10ec0288:
5364 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5365 msleep(300);
5366 alc_process_coef_fw(codec, coef0288);
5367 break;
5368 case 0x10ec0292:
5369 alc_process_coef_fw(codec, coef0292);
5370 break;
5371 case 0x10ec0293:
5372 alc_process_coef_fw(codec, coef0293);
5373 break;
5374 case 0x10ec0668:
5375 alc_process_coef_fw(codec, coef0688);
5376 break;
5377 case 0x10ec0215:
5378 case 0x10ec0225:
5379 case 0x10ec0285:
5380 case 0x10ec0295:
5381 case 0x10ec0289:
5382 case 0x10ec0299:
5383 val = alc_read_coef_idx(codec, 0x45);
5384 if (val & (1 << 9))
5385 alc_process_coef_fw(codec, coef0225_2);
5386 else
5387 alc_process_coef_fw(codec, coef0225_1);
5388 break;
5389 case 0x10ec0867:
5390 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5391 break;
5392 }
5393 codec_dbg(codec, "Headset jack set to iPhone-style headset mode.\n");
5394 }
5395
5396
5397 static void alc_headset_mode_omtp(struct hda_codec *codec)
5398 {
5399 static const struct coef_fw coef0255[] = {
5400 WRITE_COEF(0x45, 0xe489),
5401 WRITE_COEF(0x1b, 0x0c2b),
5402 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5403 {}
5404 };
5405 static const struct coef_fw coef0256[] = {
5406 WRITE_COEF(0x45, 0xe489),
5407 WRITE_COEF(0x1b, 0x0e6b),
5408 {}
5409 };
5410 static const struct coef_fw coef0233[] = {
5411 WRITE_COEF(0x45, 0xe429),
5412 WRITE_COEF(0x1b, 0x0c2b),
5413 WRITE_COEF(0x32, 0x4ea3),
5414 {}
5415 };
5416 static const struct coef_fw coef0288[] = {
5417 UPDATE_COEF(0x50, 0x2000, 0x2000),
5418 UPDATE_COEF(0x56, 0x0006, 0x0006),
5419 UPDATE_COEF(0x66, 0x0008, 0),
5420 UPDATE_COEF(0x67, 0x2000, 0),
5421 {}
5422 };
5423 static const struct coef_fw coef0292[] = {
5424 WRITE_COEF(0x6b, 0xe429),
5425 WRITE_COEF(0x76, 0x0008),
5426 WRITE_COEF(0x18, 0x7388),
5427 {}
5428 };
5429 static const struct coef_fw coef0293[] = {
5430 WRITE_COEF(0x45, 0xe429),
5431 UPDATE_COEF(0x10, 7<<8, 7<<8),
5432 {}
5433 };
5434 static const struct coef_fw coef0688[] = {
5435 WRITE_COEF(0x11, 0x0001),
5436 WRITE_COEF(0x15, 0x0d50),
5437 WRITE_COEF(0xc3, 0x0000),
5438 {}
5439 };
5440 static const struct coef_fw coef0225[] = {
5441 UPDATE_COEF(0x45, 0x3f<<10, 0x39<<10),
5442 UPDATE_COEF(0x63, 3<<14, 2<<14),
5443 {}
5444 };
5445
5446 switch (codec->core.vendor_id) {
5447 case 0x10ec0255:
5448 alc_process_coef_fw(codec, coef0255);
5449 break;
5450 case 0x10ec0230:
5451 case 0x10ec0236:
5452 case 0x10ec0256:
5453 case 0x19e58326:
5454 alc_process_coef_fw(codec, coef0256);
5455 break;
5456 case 0x10ec0234:
5457 case 0x10ec0274:
5458 case 0x10ec0294:
5459 alc_write_coef_idx(codec, 0x45, 0xe689);
5460 break;
5461 case 0x10ec0233:
5462 case 0x10ec0283:
5463 alc_process_coef_fw(codec, coef0233);
5464 break;
5465 case 0x10ec0298:
5466 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
5467 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5468 msleep(300);
5469 break;
5470 case 0x10ec0286:
5471 case 0x10ec0288:
5472 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5473 msleep(300);
5474 alc_process_coef_fw(codec, coef0288);
5475 break;
5476 case 0x10ec0292:
5477 alc_process_coef_fw(codec, coef0292);
5478 break;
5479 case 0x10ec0293:
5480 alc_process_coef_fw(codec, coef0293);
5481 break;
5482 case 0x10ec0668:
5483 alc_process_coef_fw(codec, coef0688);
5484 break;
5485 case 0x10ec0215:
5486 case 0x10ec0225:
5487 case 0x10ec0285:
5488 case 0x10ec0295:
5489 case 0x10ec0289:
5490 case 0x10ec0299:
5491 alc_process_coef_fw(codec, coef0225);
5492 break;
5493 }
5494 codec_dbg(codec, "Headset jack set to Nokia-style headset mode.\n");
5495 }
5496
5497 static void alc_determine_headset_type(struct hda_codec *codec)
5498 {
5499 int val;
5500 bool is_ctia = false;
5501 struct alc_spec *spec = codec->spec;
5502 static const struct coef_fw coef0255[] = {
5503 WRITE_COEF(0x45, 0xd089),
5504 WRITE_COEF(0x49, 0x0149),
5505
5506 {}
5507 };
5508 static const struct coef_fw coef0288[] = {
5509 UPDATE_COEF(0x4f, 0xfcc0, 0xd400),
5510 {}
5511 };
5512 static const struct coef_fw coef0298[] = {
5513 UPDATE_COEF(0x50, 0x2000, 0x2000),
5514 UPDATE_COEF(0x56, 0x0006, 0x0006),
5515 UPDATE_COEF(0x66, 0x0008, 0),
5516 UPDATE_COEF(0x67, 0x2000, 0),
5517 UPDATE_COEF(0x19, 0x1300, 0x1300),
5518 {}
5519 };
5520 static const struct coef_fw coef0293[] = {
5521 UPDATE_COEF(0x4a, 0x000f, 0x0008),
5522 WRITE_COEF(0x45, 0xD429),
5523 {}
5524 };
5525 static const struct coef_fw coef0688[] = {
5526 WRITE_COEF(0x11, 0x0001),
5527 WRITE_COEF(0xb7, 0x802b),
5528 WRITE_COEF(0x15, 0x0d60),
5529 WRITE_COEF(0xc3, 0x0c00),
5530 {}
5531 };
5532 static const struct coef_fw coef0274[] = {
5533 UPDATE_COEF(0x4a, 0x0010, 0),
5534 UPDATE_COEF(0x4a, 0x8000, 0),
5535 WRITE_COEF(0x45, 0xd289),
5536 UPDATE_COEF(0x49, 0x0300, 0x0300),
5537 {}
5538 };
5539
5540 if (spec->no_internal_mic_pin) {
5541 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
5542 return;
5543 }
5544
5545 switch (codec->core.vendor_id) {
5546 case 0x10ec0255:
5547 alc_process_coef_fw(codec, coef0255);
5548 msleep(300);
5549 val = alc_read_coef_idx(codec, 0x46);
5550 is_ctia = (val & 0x0070) == 0x0070;
5551 break;
5552 case 0x10ec0230:
5553 case 0x10ec0236:
5554 case 0x10ec0256:
5555 case 0x19e58326:
5556 alc_write_coef_idx(codec, 0x1b, 0x0e4b);
5557 alc_write_coef_idx(codec, 0x06, 0x6104);
5558 alc_write_coefex_idx(codec, 0x57, 0x3, 0x09a3);
5559
5560 snd_hda_codec_write(codec, 0x21, 0,
5561 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5562 msleep(80);
5563 snd_hda_codec_write(codec, 0x21, 0,
5564 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5565
5566 alc_process_coef_fw(codec, coef0255);
5567 msleep(300);
5568 val = alc_read_coef_idx(codec, 0x46);
5569 is_ctia = (val & 0x0070) == 0x0070;
5570
5571 alc_write_coefex_idx(codec, 0x57, 0x3, 0x0da3);
5572 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5573
5574 snd_hda_codec_write(codec, 0x21, 0,
5575 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5576 msleep(80);
5577 snd_hda_codec_write(codec, 0x21, 0,
5578 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5579 break;
5580 case 0x10ec0234:
5581 case 0x10ec0274:
5582 case 0x10ec0294:
5583 alc_process_coef_fw(codec, coef0274);
5584 msleep(850);
5585 val = alc_read_coef_idx(codec, 0x46);
5586 is_ctia = (val & 0x00f0) == 0x00f0;
5587 break;
5588 case 0x10ec0233:
5589 case 0x10ec0283:
5590 alc_write_coef_idx(codec, 0x45, 0xd029);
5591 msleep(300);
5592 val = alc_read_coef_idx(codec, 0x46);
5593 is_ctia = (val & 0x0070) == 0x0070;
5594 break;
5595 case 0x10ec0298:
5596 snd_hda_codec_write(codec, 0x21, 0,
5597 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5598 msleep(100);
5599 snd_hda_codec_write(codec, 0x21, 0,
5600 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5601 msleep(200);
5602
5603 val = alc_read_coef_idx(codec, 0x50);
5604 if (val & (1 << 12)) {
5605 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
5606 alc_process_coef_fw(codec, coef0288);
5607 msleep(350);
5608 val = alc_read_coef_idx(codec, 0x50);
5609 is_ctia = (val & 0x0070) == 0x0070;
5610 } else {
5611 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
5612 alc_process_coef_fw(codec, coef0288);
5613 msleep(350);
5614 val = alc_read_coef_idx(codec, 0x50);
5615 is_ctia = (val & 0x0070) == 0x0070;
5616 }
5617 alc_process_coef_fw(codec, coef0298);
5618 snd_hda_codec_write(codec, 0x21, 0,
5619 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP);
5620 msleep(75);
5621 snd_hda_codec_write(codec, 0x21, 0,
5622 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5623 break;
5624 case 0x10ec0286:
5625 case 0x10ec0288:
5626 alc_process_coef_fw(codec, coef0288);
5627 msleep(350);
5628 val = alc_read_coef_idx(codec, 0x50);
5629 is_ctia = (val & 0x0070) == 0x0070;
5630 break;
5631 case 0x10ec0292:
5632 alc_write_coef_idx(codec, 0x6b, 0xd429);
5633 msleep(300);
5634 val = alc_read_coef_idx(codec, 0x6c);
5635 is_ctia = (val & 0x001c) == 0x001c;
5636 break;
5637 case 0x10ec0293:
5638 alc_process_coef_fw(codec, coef0293);
5639 msleep(300);
5640 val = alc_read_coef_idx(codec, 0x46);
5641 is_ctia = (val & 0x0070) == 0x0070;
5642 break;
5643 case 0x10ec0668:
5644 alc_process_coef_fw(codec, coef0688);
5645 msleep(300);
5646 val = alc_read_coef_idx(codec, 0xbe);
5647 is_ctia = (val & 0x1c02) == 0x1c02;
5648 break;
5649 case 0x10ec0215:
5650 case 0x10ec0225:
5651 case 0x10ec0285:
5652 case 0x10ec0295:
5653 case 0x10ec0289:
5654 case 0x10ec0299:
5655 snd_hda_codec_write(codec, 0x21, 0,
5656 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5657 msleep(80);
5658 snd_hda_codec_write(codec, 0x21, 0,
5659 AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5660
5661 alc_process_coef_fw(codec, alc225_pre_hsmode);
5662 alc_update_coef_idx(codec, 0x67, 0xf000, 0x1000);
5663 val = alc_read_coef_idx(codec, 0x45);
5664 if (val & (1 << 9)) {
5665 alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5666 alc_update_coef_idx(codec, 0x49, 3<<8, 2<<8);
5667 msleep(800);
5668 val = alc_read_coef_idx(codec, 0x46);
5669 is_ctia = (val & 0x00f0) == 0x00f0;
5670 } else {
5671 alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5672 alc_update_coef_idx(codec, 0x49, 3<<8, 1<<8);
5673 msleep(800);
5674 val = alc_read_coef_idx(codec, 0x46);
5675 is_ctia = (val & 0x00f0) == 0x00f0;
5676 }
5677 alc_update_coef_idx(codec, 0x4a, 7<<6, 7<<6);
5678 alc_update_coef_idx(codec, 0x4a, 3<<4, 3<<4);
5679 alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
5680
5681 snd_hda_codec_write(codec, 0x21, 0,
5682 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5683 msleep(80);
5684 snd_hda_codec_write(codec, 0x21, 0,
5685 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5686 break;
5687 case 0x10ec0867:
5688 is_ctia = true;
5689 break;
5690 }
5691
5692 codec_dbg(codec, "Headset jack detected iPhone-style headset: %s\n",
5693 is_ctia ? "yes" : "no");
5694 spec->current_headset_type = is_ctia ? ALC_HEADSET_TYPE_CTIA : ALC_HEADSET_TYPE_OMTP;
5695 }
5696
5697 static void alc_update_headset_mode(struct hda_codec *codec)
5698 {
5699 struct alc_spec *spec = codec->spec;
5700
5701 hda_nid_t mux_pin = spec->gen.imux_pins[spec->gen.cur_mux[0]];
5702 hda_nid_t hp_pin = alc_get_hp_pin(spec);
5703
5704 int new_headset_mode;
5705
5706 if (!snd_hda_jack_detect(codec, hp_pin))
5707 new_headset_mode = ALC_HEADSET_MODE_UNPLUGGED;
5708 else if (mux_pin == spec->headset_mic_pin)
5709 new_headset_mode = ALC_HEADSET_MODE_HEADSET;
5710 else if (mux_pin == spec->headphone_mic_pin)
5711 new_headset_mode = ALC_HEADSET_MODE_MIC;
5712 else
5713 new_headset_mode = ALC_HEADSET_MODE_HEADPHONE;
5714
5715 if (new_headset_mode == spec->current_headset_mode) {
5716 snd_hda_gen_update_outputs(codec);
5717 return;
5718 }
5719
5720 switch (new_headset_mode) {
5721 case ALC_HEADSET_MODE_UNPLUGGED:
5722 alc_headset_mode_unplugged(codec);
5723 spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5724 spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
5725 spec->gen.hp_jack_present = false;
5726 break;
5727 case ALC_HEADSET_MODE_HEADSET:
5728 if (spec->current_headset_type == ALC_HEADSET_TYPE_UNKNOWN)
5729 alc_determine_headset_type(codec);
5730 if (spec->current_headset_type == ALC_HEADSET_TYPE_CTIA)
5731 alc_headset_mode_ctia(codec);
5732 else if (spec->current_headset_type == ALC_HEADSET_TYPE_OMTP)
5733 alc_headset_mode_omtp(codec);
5734 spec->gen.hp_jack_present = true;
5735 break;
5736 case ALC_HEADSET_MODE_MIC:
5737 alc_headset_mode_mic_in(codec, hp_pin, spec->headphone_mic_pin);
5738 spec->gen.hp_jack_present = false;
5739 break;
5740 case ALC_HEADSET_MODE_HEADPHONE:
5741 alc_headset_mode_default(codec);
5742 spec->gen.hp_jack_present = true;
5743 break;
5744 }
5745 if (new_headset_mode != ALC_HEADSET_MODE_MIC) {
5746 snd_hda_set_pin_ctl_cache(codec, hp_pin,
5747 AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
5748 if (spec->headphone_mic_pin && spec->headphone_mic_pin != hp_pin)
5749 snd_hda_set_pin_ctl_cache(codec, spec->headphone_mic_pin,
5750 PIN_VREFHIZ);
5751 }
5752 spec->current_headset_mode = new_headset_mode;
5753
5754 snd_hda_gen_update_outputs(codec);
5755 }
5756
5757 static void alc_update_headset_mode_hook(struct hda_codec *codec,
5758 struct snd_kcontrol *kcontrol,
5759 struct snd_ctl_elem_value *ucontrol)
5760 {
5761 alc_update_headset_mode(codec);
5762 }
5763
5764 static void alc_update_headset_jack_cb(struct hda_codec *codec,
5765 struct hda_jack_callback *jack)
5766 {
5767 snd_hda_gen_hp_automute(codec, jack);
5768 alc_update_headset_mode(codec);
5769 }
5770
5771 static void alc_probe_headset_mode(struct hda_codec *codec)
5772 {
5773 int i;
5774 struct alc_spec *spec = codec->spec;
5775 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5776
5777
5778 for (i = 0; i < cfg->num_inputs; i++) {
5779 if (cfg->inputs[i].is_headset_mic && !spec->headset_mic_pin)
5780 spec->headset_mic_pin = cfg->inputs[i].pin;
5781 if (cfg->inputs[i].is_headphone_mic && !spec->headphone_mic_pin)
5782 spec->headphone_mic_pin = cfg->inputs[i].pin;
5783 }
5784
5785 WARN_ON(spec->gen.cap_sync_hook);
5786 spec->gen.cap_sync_hook = alc_update_headset_mode_hook;
5787 spec->gen.automute_hook = alc_update_headset_mode;
5788 spec->gen.hp_automute_hook = alc_update_headset_jack_cb;
5789 }
5790
5791 static void alc_fixup_headset_mode(struct hda_codec *codec,
5792 const struct hda_fixup *fix, int action)
5793 {
5794 struct alc_spec *spec = codec->spec;
5795
5796 switch (action) {
5797 case HDA_FIXUP_ACT_PRE_PROBE:
5798 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC | HDA_PINCFG_HEADPHONE_MIC;
5799 break;
5800 case HDA_FIXUP_ACT_PROBE:
5801 alc_probe_headset_mode(codec);
5802 break;
5803 case HDA_FIXUP_ACT_INIT:
5804 if (is_s3_resume(codec) || is_s4_resume(codec)) {
5805 spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5806 spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
5807 }
5808 alc_update_headset_mode(codec);
5809 break;
5810 }
5811 }
5812
5813 static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
5814 const struct hda_fixup *fix, int action)
5815 {
5816 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5817 struct alc_spec *spec = codec->spec;
5818 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5819 }
5820 else
5821 alc_fixup_headset_mode(codec, fix, action);
5822 }
5823
5824 static void alc255_set_default_jack_type(struct hda_codec *codec)
5825 {
5826
5827 static const struct coef_fw alc255fw[] = {
5828 WRITE_COEF(0x1b, 0x880b),
5829 WRITE_COEF(0x45, 0xd089),
5830 WRITE_COEF(0x1b, 0x080b),
5831 WRITE_COEF(0x46, 0x0004),
5832 WRITE_COEF(0x1b, 0x0c0b),
5833 {}
5834 };
5835 static const struct coef_fw alc256fw[] = {
5836 WRITE_COEF(0x1b, 0x884b),
5837 WRITE_COEF(0x45, 0xd089),
5838 WRITE_COEF(0x1b, 0x084b),
5839 WRITE_COEF(0x46, 0x0004),
5840 WRITE_COEF(0x1b, 0x0c4b),
5841 {}
5842 };
5843 switch (codec->core.vendor_id) {
5844 case 0x10ec0255:
5845 alc_process_coef_fw(codec, alc255fw);
5846 break;
5847 case 0x10ec0230:
5848 case 0x10ec0236:
5849 case 0x10ec0256:
5850 case 0x19e58326:
5851 alc_process_coef_fw(codec, alc256fw);
5852 break;
5853 }
5854 msleep(30);
5855 }
5856
5857 static void alc_fixup_headset_mode_alc255(struct hda_codec *codec,
5858 const struct hda_fixup *fix, int action)
5859 {
5860 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5861 alc255_set_default_jack_type(codec);
5862 }
5863 alc_fixup_headset_mode(codec, fix, action);
5864 }
5865
5866 static void alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec,
5867 const struct hda_fixup *fix, int action)
5868 {
5869 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5870 struct alc_spec *spec = codec->spec;
5871 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5872 alc255_set_default_jack_type(codec);
5873 }
5874 else
5875 alc_fixup_headset_mode(codec, fix, action);
5876 }
5877
5878 static void alc288_update_headset_jack_cb(struct hda_codec *codec,
5879 struct hda_jack_callback *jack)
5880 {
5881 struct alc_spec *spec = codec->spec;
5882
5883 alc_update_headset_jack_cb(codec, jack);
5884
5885 alc_update_gpio_data(codec, 0x40, spec->gen.hp_jack_present);
5886 }
5887
5888 static void alc_fixup_headset_mode_dell_alc288(struct hda_codec *codec,
5889 const struct hda_fixup *fix, int action)
5890 {
5891 alc_fixup_headset_mode(codec, fix, action);
5892 if (action == HDA_FIXUP_ACT_PROBE) {
5893 struct alc_spec *spec = codec->spec;
5894
5895 spec->gpio_mask |= 0x40;
5896 spec->gpio_dir |= 0x40;
5897 spec->gen.hp_automute_hook = alc288_update_headset_jack_cb;
5898 }
5899 }
5900
5901 static void alc_fixup_auto_mute_via_amp(struct hda_codec *codec,
5902 const struct hda_fixup *fix, int action)
5903 {
5904 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5905 struct alc_spec *spec = codec->spec;
5906 spec->gen.auto_mute_via_amp = 1;
5907 }
5908 }
5909
5910 static void alc_fixup_no_shutup(struct hda_codec *codec,
5911 const struct hda_fixup *fix, int action)
5912 {
5913 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5914 struct alc_spec *spec = codec->spec;
5915 spec->no_shutup_pins = 1;
5916 }
5917 }
5918
5919 static void alc_fixup_disable_aamix(struct hda_codec *codec,
5920 const struct hda_fixup *fix, int action)
5921 {
5922 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5923 struct alc_spec *spec = codec->spec;
5924
5925 spec->gen.mixer_nid = 0;
5926 }
5927 }
5928
5929
5930 static void alc_fixup_tpt440_dock(struct hda_codec *codec,
5931 const struct hda_fixup *fix, int action)
5932 {
5933 static const struct hda_pintbl pincfgs[] = {
5934 { 0x16, 0x21211010 },
5935 { 0x19, 0x21a11010 },
5936 { }
5937 };
5938 struct alc_spec *spec = codec->spec;
5939
5940 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5941 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
5942 codec->power_save_node = 0;
5943 snd_hda_apply_pincfgs(codec, pincfgs);
5944 }
5945 }
5946
5947 static void alc_fixup_tpt470_dock(struct hda_codec *codec,
5948 const struct hda_fixup *fix, int action)
5949 {
5950 static const struct hda_pintbl pincfgs[] = {
5951 { 0x17, 0x21211010 },
5952 { 0x19, 0x21a11010 },
5953 { }
5954 };
5955 struct alc_spec *spec = codec->spec;
5956
5957 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5958 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
5959 snd_hda_apply_pincfgs(codec, pincfgs);
5960 } else if (action == HDA_FIXUP_ACT_INIT) {
5961
5962 snd_hda_codec_write(codec, 0x17, 0,
5963 AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
5964
5965 snd_hda_codec_write(codec, 0x19, 0,
5966 AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
5967 }
5968 }
5969
5970 static void alc_fixup_tpt470_dacs(struct hda_codec *codec,
5971 const struct hda_fixup *fix, int action)
5972 {
5973
5974
5975
5976
5977 static const hda_nid_t preferred_pairs[] = {
5978 0x14, 0x03, 0x17, 0x02, 0x21, 0x02,
5979 0
5980 };
5981 struct alc_spec *spec = codec->spec;
5982
5983 if (action == HDA_FIXUP_ACT_PRE_PROBE)
5984 spec->gen.preferred_dacs = preferred_pairs;
5985 }
5986
5987 static void alc295_fixup_asus_dacs(struct hda_codec *codec,
5988 const struct hda_fixup *fix, int action)
5989 {
5990 static const hda_nid_t preferred_pairs[] = {
5991 0x17, 0x02, 0x21, 0x03, 0
5992 };
5993 struct alc_spec *spec = codec->spec;
5994
5995 if (action == HDA_FIXUP_ACT_PRE_PROBE)
5996 spec->gen.preferred_dacs = preferred_pairs;
5997 }
5998
5999 static void alc_shutup_dell_xps13(struct hda_codec *codec)
6000 {
6001 struct alc_spec *spec = codec->spec;
6002 int hp_pin = alc_get_hp_pin(spec);
6003
6004
6005 snd_hda_codec_write(codec, hp_pin, 0,
6006 AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
6007 msleep(20);
6008 }
6009
6010 static void alc_fixup_dell_xps13(struct hda_codec *codec,
6011 const struct hda_fixup *fix, int action)
6012 {
6013 struct alc_spec *spec = codec->spec;
6014 struct hda_input_mux *imux = &spec->gen.input_mux;
6015 int i;
6016
6017 switch (action) {
6018 case HDA_FIXUP_ACT_PRE_PROBE:
6019
6020
6021
6022 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
6023 spec->shutup = alc_shutup_dell_xps13;
6024 break;
6025 case HDA_FIXUP_ACT_PROBE:
6026
6027 for (i = 0; i < imux->num_items; i++) {
6028 if (spec->gen.imux_pins[i] == 0x12) {
6029 spec->gen.cur_mux[0] = i;
6030 break;
6031 }
6032 }
6033 break;
6034 }
6035 }
6036
6037 static void alc_fixup_headset_mode_alc662(struct hda_codec *codec,
6038 const struct hda_fixup *fix, int action)
6039 {
6040 struct alc_spec *spec = codec->spec;
6041
6042 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6043 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
6044 spec->gen.hp_mic = 1;
6045
6046
6047
6048 snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000);
6049 snd_hda_override_wcaps(codec, 0x1b, get_wcaps(codec, 0x1b) & ~AC_WCAP_IN_AMP);
6050 } else
6051 alc_fixup_headset_mode(codec, fix, action);
6052 }
6053
6054 static void alc_fixup_headset_mode_alc668(struct hda_codec *codec,
6055 const struct hda_fixup *fix, int action)
6056 {
6057 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6058 alc_write_coef_idx(codec, 0xc4, 0x8000);
6059 alc_update_coef_idx(codec, 0xc2, ~0xfe, 0);
6060 snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
6061 }
6062 alc_fixup_headset_mode(codec, fix, action);
6063 }
6064
6065
6066 static int find_ext_mic_pin(struct hda_codec *codec)
6067 {
6068 struct alc_spec *spec = codec->spec;
6069 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
6070 hda_nid_t nid;
6071 unsigned int defcfg;
6072 int i;
6073
6074 for (i = 0; i < cfg->num_inputs; i++) {
6075 if (cfg->inputs[i].type != AUTO_PIN_MIC)
6076 continue;
6077 nid = cfg->inputs[i].pin;
6078 defcfg = snd_hda_codec_get_pincfg(codec, nid);
6079 if (snd_hda_get_input_pin_attr(defcfg) == INPUT_PIN_ATTR_INT)
6080 continue;
6081 return nid;
6082 }
6083
6084 return 0;
6085 }
6086
6087 static void alc271_hp_gate_mic_jack(struct hda_codec *codec,
6088 const struct hda_fixup *fix,
6089 int action)
6090 {
6091 struct alc_spec *spec = codec->spec;
6092
6093 if (action == HDA_FIXUP_ACT_PROBE) {
6094 int mic_pin = find_ext_mic_pin(codec);
6095 int hp_pin = alc_get_hp_pin(spec);
6096
6097 if (snd_BUG_ON(!mic_pin || !hp_pin))
6098 return;
6099 snd_hda_jack_set_gating_jack(codec, mic_pin, hp_pin);
6100 }
6101 }
6102
6103 static void alc269_fixup_limit_int_mic_boost(struct hda_codec *codec,
6104 const struct hda_fixup *fix,
6105 int action)
6106 {
6107 struct alc_spec *spec = codec->spec;
6108 struct auto_pin_cfg *cfg = &spec->gen.autocfg;
6109 int i;
6110
6111
6112
6113
6114
6115 if (action != HDA_FIXUP_ACT_PROBE)
6116 return;
6117
6118 for (i = 0; i < cfg->num_inputs; i++) {
6119 hda_nid_t nid = cfg->inputs[i].pin;
6120 unsigned int defcfg;
6121 if (cfg->inputs[i].type != AUTO_PIN_MIC)
6122 continue;
6123 defcfg = snd_hda_codec_get_pincfg(codec, nid);
6124 if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
6125 continue;
6126
6127 snd_hda_override_amp_caps(codec, nid, HDA_INPUT,
6128 (0x00 << AC_AMPCAP_OFFSET_SHIFT) |
6129 (0x01 << AC_AMPCAP_NUM_STEPS_SHIFT) |
6130 (0x2f << AC_AMPCAP_STEP_SIZE_SHIFT) |
6131 (0 << AC_AMPCAP_MUTE_SHIFT));
6132 }
6133 }
6134
6135 static void alc283_hp_automute_hook(struct hda_codec *codec,
6136 struct hda_jack_callback *jack)
6137 {
6138 struct alc_spec *spec = codec->spec;
6139 int vref;
6140
6141 msleep(200);
6142 snd_hda_gen_hp_automute(codec, jack);
6143
6144 vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
6145
6146 msleep(600);
6147 snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
6148 vref);
6149 }
6150
6151 static void alc283_fixup_chromebook(struct hda_codec *codec,
6152 const struct hda_fixup *fix, int action)
6153 {
6154 struct alc_spec *spec = codec->spec;
6155
6156 switch (action) {
6157 case HDA_FIXUP_ACT_PRE_PROBE:
6158 snd_hda_override_wcaps(codec, 0x03, 0);
6159
6160 spec->gen.mixer_nid = 0;
6161 break;
6162 case HDA_FIXUP_ACT_INIT:
6163
6164
6165 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
6166
6167 alc_update_coef_idx(codec, 0x1a, 0, 1 << 4);
6168 break;
6169 }
6170 }
6171
6172 static void alc283_fixup_sense_combo_jack(struct hda_codec *codec,
6173 const struct hda_fixup *fix, int action)
6174 {
6175 struct alc_spec *spec = codec->spec;
6176
6177 switch (action) {
6178 case HDA_FIXUP_ACT_PRE_PROBE:
6179 spec->gen.hp_automute_hook = alc283_hp_automute_hook;
6180 break;
6181 case HDA_FIXUP_ACT_INIT:
6182
6183
6184 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
6185 break;
6186 }
6187 }
6188
6189
6190 static void asus_tx300_automute(struct hda_codec *codec)
6191 {
6192 struct alc_spec *spec = codec->spec;
6193 snd_hda_gen_update_outputs(codec);
6194 if (snd_hda_jack_detect(codec, 0x1b))
6195 spec->gen.mute_bits |= (1ULL << 0x14);
6196 }
6197
6198 static void alc282_fixup_asus_tx300(struct hda_codec *codec,
6199 const struct hda_fixup *fix, int action)
6200 {
6201 struct alc_spec *spec = codec->spec;
6202 static const struct hda_pintbl dock_pins[] = {
6203 { 0x1b, 0x21114000 },
6204 {}
6205 };
6206
6207 switch (action) {
6208 case HDA_FIXUP_ACT_PRE_PROBE:
6209 spec->init_amp = ALC_INIT_DEFAULT;
6210
6211 alc_setup_gpio(codec, 0x04);
6212 snd_hda_apply_pincfgs(codec, dock_pins);
6213 spec->gen.auto_mute_via_amp = 1;
6214 spec->gen.automute_hook = asus_tx300_automute;
6215 snd_hda_jack_detect_enable_callback(codec, 0x1b,
6216 snd_hda_gen_hp_automute);
6217 break;
6218 case HDA_FIXUP_ACT_PROBE:
6219 spec->init_amp = ALC_INIT_DEFAULT;
6220 break;
6221 case HDA_FIXUP_ACT_BUILD:
6222
6223
6224
6225 rename_ctl(codec, "Speaker Playback Switch",
6226 "Dock Speaker Playback Switch");
6227 rename_ctl(codec, "Bass Speaker Playback Switch",
6228 "Speaker Playback Switch");
6229 break;
6230 }
6231 }
6232
6233 static void alc290_fixup_mono_speakers(struct hda_codec *codec,
6234 const struct hda_fixup *fix, int action)
6235 {
6236 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6237
6238
6239
6240 static const hda_nid_t conn1[] = { 0x0c };
6241 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
6242 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
6243 }
6244 }
6245
6246 static void alc298_fixup_speaker_volume(struct hda_codec *codec,
6247 const struct hda_fixup *fix, int action)
6248 {
6249 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6250
6251
6252
6253
6254
6255
6256
6257 static const hda_nid_t conn1[] = { 0x0c };
6258 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn1), conn1);
6259 }
6260 }
6261
6262
6263 static void alc295_fixup_disable_dac3(struct hda_codec *codec,
6264 const struct hda_fixup *fix, int action)
6265 {
6266 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6267 static const hda_nid_t conn[] = { 0x02, 0x03 };
6268 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6269 }
6270 }
6271
6272
6273 static void alc285_fixup_speaker2_to_dac1(struct hda_codec *codec,
6274 const struct hda_fixup *fix, int action)
6275 {
6276 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6277 static const hda_nid_t conn[] = { 0x02 };
6278 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6279 }
6280 }
6281
6282
6283 static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec,
6284 struct hda_jack_callback *jack)
6285 {
6286 struct alc_spec *spec = codec->spec;
6287
6288 snd_hda_gen_hp_automute(codec, jack);
6289
6290 alc_update_gpio_led(codec, 0x10, spec->mute_led_polarity,
6291 !spec->gen.hp_jack_present);
6292 }
6293
6294
6295
6296
6297
6298
6299
6300 static void alc280_fixup_hp_9480m(struct hda_codec *codec,
6301 const struct hda_fixup *fix,
6302 int action)
6303 {
6304 struct alc_spec *spec = codec->spec;
6305
6306 alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
6307 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6308
6309 spec->gpio_mask |= 0x10;
6310 spec->gpio_dir |= 0x10;
6311 spec->gen.hp_automute_hook = alc280_hp_gpio4_automute_hook;
6312 }
6313 }
6314
6315 static void alc275_fixup_gpio4_off(struct hda_codec *codec,
6316 const struct hda_fixup *fix,
6317 int action)
6318 {
6319 struct alc_spec *spec = codec->spec;
6320
6321 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6322 spec->gpio_mask |= 0x04;
6323 spec->gpio_dir |= 0x04;
6324
6325 }
6326 }
6327
6328
6329
6330
6331
6332
6333
6334 static void alc285_fixup_thinkpad_x1_gen7(struct hda_codec *codec,
6335 const struct hda_fixup *fix, int action)
6336 {
6337 static const hda_nid_t conn[] = { 0x02, 0x03 };
6338 static const hda_nid_t preferred_pairs[] = {
6339 0x14, 0x02, 0x17, 0x03, 0x21, 0x03, 0
6340 };
6341 struct alc_spec *spec = codec->spec;
6342
6343 switch (action) {
6344 case HDA_FIXUP_ACT_PRE_PROBE:
6345 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6346 spec->gen.preferred_dacs = preferred_pairs;
6347 break;
6348 case HDA_FIXUP_ACT_BUILD:
6349
6350
6351
6352
6353
6354
6355 rename_ctl(codec, "Front Playback Volume", "DAC1 Playback Volume");
6356 rename_ctl(codec, "Bass Speaker Playback Volume", "DAC2 Playback Volume");
6357 break;
6358 }
6359 }
6360
6361 static void alc233_alc662_fixup_lenovo_dual_codecs(struct hda_codec *codec,
6362 const struct hda_fixup *fix,
6363 int action)
6364 {
6365 alc_fixup_dual_codecs(codec, fix, action);
6366 switch (action) {
6367 case HDA_FIXUP_ACT_PRE_PROBE:
6368
6369 strcpy(codec->card->longname, "HDAudio-Lenovo-DualCodecs");
6370 break;
6371 case HDA_FIXUP_ACT_BUILD:
6372
6373 rename_ctl(codec, "Capture Volume",
6374 codec->addr == 0 ?
6375 "Rear-Panel Capture Volume" :
6376 "Front-Panel Capture Volume");
6377 rename_ctl(codec, "Capture Switch",
6378 codec->addr == 0 ?
6379 "Rear-Panel Capture Switch" :
6380 "Front-Panel Capture Switch");
6381 break;
6382 }
6383 }
6384
6385 static void alc225_fixup_s3_pop_noise(struct hda_codec *codec,
6386 const struct hda_fixup *fix, int action)
6387 {
6388 if (action != HDA_FIXUP_ACT_PRE_PROBE)
6389 return;
6390
6391 codec->power_save_node = 1;
6392 }
6393
6394
6395 static void alc274_fixup_bind_dacs(struct hda_codec *codec,
6396 const struct hda_fixup *fix, int action)
6397 {
6398 struct alc_spec *spec = codec->spec;
6399 static const hda_nid_t preferred_pairs[] = {
6400 0x21, 0x03, 0x1b, 0x03, 0x16, 0x02,
6401 0
6402 };
6403
6404 if (action != HDA_FIXUP_ACT_PRE_PROBE)
6405 return;
6406
6407 spec->gen.preferred_dacs = preferred_pairs;
6408 spec->gen.auto_mute_via_amp = 1;
6409 codec->power_save_node = 0;
6410 }
6411
6412
6413 static void alc289_fixup_asus_ga401(struct hda_codec *codec,
6414 const struct hda_fixup *fix, int action)
6415 {
6416 static const hda_nid_t preferred_pairs[] = {
6417 0x14, 0x02, 0x17, 0x02, 0x21, 0x03, 0
6418 };
6419 struct alc_spec *spec = codec->spec;
6420
6421 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6422 spec->gen.preferred_dacs = preferred_pairs;
6423 spec->gen.obey_preferred_dacs = 1;
6424 }
6425 }
6426
6427
6428 static void alc285_fixup_invalidate_dacs(struct hda_codec *codec,
6429 const struct hda_fixup *fix, int action)
6430 {
6431 if (action != HDA_FIXUP_ACT_PRE_PROBE)
6432 return;
6433
6434 snd_hda_override_wcaps(codec, 0x03, 0);
6435 }
6436
6437 static void alc_combo_jack_hp_jd_restart(struct hda_codec *codec)
6438 {
6439 switch (codec->core.vendor_id) {
6440 case 0x10ec0274:
6441 case 0x10ec0294:
6442 case 0x10ec0225:
6443 case 0x10ec0295:
6444 case 0x10ec0299:
6445 alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15);
6446 alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15);
6447 break;
6448 case 0x10ec0230:
6449 case 0x10ec0235:
6450 case 0x10ec0236:
6451 case 0x10ec0255:
6452 case 0x10ec0256:
6453 case 0x19e58326:
6454 alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15);
6455 alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15);
6456 break;
6457 }
6458 }
6459
6460 static void alc295_fixup_chromebook(struct hda_codec *codec,
6461 const struct hda_fixup *fix, int action)
6462 {
6463 struct alc_spec *spec = codec->spec;
6464
6465 switch (action) {
6466 case HDA_FIXUP_ACT_PRE_PROBE:
6467 spec->ultra_low_power = true;
6468 break;
6469 case HDA_FIXUP_ACT_INIT:
6470 alc_combo_jack_hp_jd_restart(codec);
6471 break;
6472 }
6473 }
6474
6475 static void alc_fixup_disable_mic_vref(struct hda_codec *codec,
6476 const struct hda_fixup *fix, int action)
6477 {
6478 if (action == HDA_FIXUP_ACT_PRE_PROBE)
6479 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
6480 }
6481
6482
6483 static void alc294_gx502_toggle_output(struct hda_codec *codec,
6484 struct hda_jack_callback *cb)
6485 {
6486
6487
6488
6489 if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
6490 alc_write_coef_idx(codec, 0x10, 0x8a20);
6491 else
6492 alc_write_coef_idx(codec, 0x10, 0x0a20);
6493 }
6494
6495 static void alc294_fixup_gx502_hp(struct hda_codec *codec,
6496 const struct hda_fixup *fix, int action)
6497 {
6498
6499 if (!is_jack_detectable(codec, 0x21))
6500 return;
6501
6502 switch (action) {
6503 case HDA_FIXUP_ACT_PRE_PROBE:
6504 snd_hda_jack_detect_enable_callback(codec, 0x21,
6505 alc294_gx502_toggle_output);
6506 break;
6507 case HDA_FIXUP_ACT_INIT:
6508
6509
6510
6511 alc294_gx502_toggle_output(codec, NULL);
6512 break;
6513 }
6514 }
6515
6516 static void alc294_gu502_toggle_output(struct hda_codec *codec,
6517 struct hda_jack_callback *cb)
6518 {
6519
6520
6521
6522 if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
6523 alc_write_coef_idx(codec, 0x10, 0x8420);
6524 else
6525 alc_write_coef_idx(codec, 0x10, 0x0a20);
6526 }
6527
6528 static void alc294_fixup_gu502_hp(struct hda_codec *codec,
6529 const struct hda_fixup *fix, int action)
6530 {
6531 if (!is_jack_detectable(codec, 0x21))
6532 return;
6533
6534 switch (action) {
6535 case HDA_FIXUP_ACT_PRE_PROBE:
6536 snd_hda_jack_detect_enable_callback(codec, 0x21,
6537 alc294_gu502_toggle_output);
6538 break;
6539 case HDA_FIXUP_ACT_INIT:
6540 alc294_gu502_toggle_output(codec, NULL);
6541 break;
6542 }
6543 }
6544
6545 static void alc285_fixup_hp_gpio_amp_init(struct hda_codec *codec,
6546 const struct hda_fixup *fix, int action)
6547 {
6548 if (action != HDA_FIXUP_ACT_INIT)
6549 return;
6550
6551 msleep(100);
6552 alc_write_coef_idx(codec, 0x65, 0x0);
6553 }
6554
6555 static void alc274_fixup_hp_headset_mic(struct hda_codec *codec,
6556 const struct hda_fixup *fix, int action)
6557 {
6558 switch (action) {
6559 case HDA_FIXUP_ACT_INIT:
6560 alc_combo_jack_hp_jd_restart(codec);
6561 break;
6562 }
6563 }
6564
6565 static void alc_fixup_no_int_mic(struct hda_codec *codec,
6566 const struct hda_fixup *fix, int action)
6567 {
6568 struct alc_spec *spec = codec->spec;
6569
6570 switch (action) {
6571 case HDA_FIXUP_ACT_PRE_PROBE:
6572
6573 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
6574 spec->no_internal_mic_pin = true;
6575 break;
6576 case HDA_FIXUP_ACT_INIT:
6577 alc_combo_jack_hp_jd_restart(codec);
6578 break;
6579 }
6580 }
6581
6582
6583
6584
6585 static void alc285_fixup_hp_spectre_x360_eb1(struct hda_codec *codec,
6586 const struct hda_fixup *fix, int action)
6587 {
6588 static const hda_nid_t conn[] = { 0x02 };
6589
6590 struct alc_spec *spec = codec->spec;
6591 static const struct hda_pintbl pincfgs[] = {
6592 { 0x14, 0x90170110 },
6593 { 0x17, 0x90170130 },
6594 { }
6595 };
6596
6597
6598 alc_fixup_hp_gpio_led(codec, action, 0x00, 0x04);
6599
6600 switch (action) {
6601 case HDA_FIXUP_ACT_PRE_PROBE:
6602 spec->micmute_led_polarity = 1;
6603
6604 spec->gpio_mask |= 0x01;
6605 spec->gpio_dir |= 0x01;
6606 snd_hda_apply_pincfgs(codec, pincfgs);
6607
6608 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
6609 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6610 break;
6611 case HDA_FIXUP_ACT_INIT:
6612
6613 alc_update_gpio_data(codec, 0x01, true);
6614 msleep(100);
6615 alc_update_gpio_data(codec, 0x01, false);
6616 break;
6617 }
6618 }
6619
6620 static void alc285_fixup_hp_spectre_x360(struct hda_codec *codec,
6621 const struct hda_fixup *fix, int action)
6622 {
6623 static const hda_nid_t conn[] = { 0x02 };
6624 static const struct hda_pintbl pincfgs[] = {
6625 { 0x14, 0x90170110 },
6626 { }
6627 };
6628
6629 switch (action) {
6630 case HDA_FIXUP_ACT_PRE_PROBE:
6631 snd_hda_apply_pincfgs(codec, pincfgs);
6632
6633 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6634 break;
6635 }
6636 }
6637
6638
6639 #include "thinkpad_helper.c"
6640
6641 static void alc_fixup_thinkpad_acpi(struct hda_codec *codec,
6642 const struct hda_fixup *fix, int action)
6643 {
6644 alc_fixup_no_shutup(codec, fix, action);
6645 hda_fixup_thinkpad_acpi(codec, fix, action);
6646 }
6647
6648
6649 static void alc287_fixup_legion_15imhg05_speakers(struct hda_codec *codec,
6650 const struct hda_fixup *fix,
6651 int action)
6652 {
6653 struct alc_spec *spec = codec->spec;
6654
6655 switch (action) {
6656 case HDA_FIXUP_ACT_PRE_PROBE:
6657 spec->gen.suppress_auto_mute = 1;
6658 break;
6659 }
6660 }
6661
6662 static int comp_bind(struct device *dev)
6663 {
6664 struct hda_codec *cdc = dev_to_hda_codec(dev);
6665 struct alc_spec *spec = cdc->spec;
6666 int ret, i;
6667
6668 ret = component_bind_all(dev, spec->comps);
6669 if (ret)
6670 return ret;
6671
6672 if (snd_hdac_is_power_on(&cdc->core)) {
6673 codec_dbg(cdc, "Resuming after bind.\n");
6674 for (i = 0; i < HDA_MAX_COMPONENTS; i++)
6675 if (spec->comps[i].resume_hook)
6676 spec->comps[i].resume_hook(spec->comps[i].dev);
6677 }
6678
6679 return 0;
6680 }
6681
6682 static void comp_unbind(struct device *dev)
6683 {
6684 struct hda_codec *cdc = dev_to_hda_codec(dev);
6685 struct alc_spec *spec = cdc->spec;
6686
6687 component_unbind_all(dev, spec->comps);
6688 }
6689
6690 static const struct component_master_ops comp_master_ops = {
6691 .bind = comp_bind,
6692 .unbind = comp_unbind,
6693 };
6694
6695 static void comp_generic_playback_hook(struct hda_pcm_stream *hinfo, struct hda_codec *cdc,
6696 struct snd_pcm_substream *sub, int action)
6697 {
6698 struct alc_spec *spec = cdc->spec;
6699 int i;
6700
6701 for (i = 0; i < HDA_MAX_COMPONENTS; i++) {
6702 if (spec->comps[i].dev)
6703 spec->comps[i].playback_hook(spec->comps[i].dev, action);
6704 }
6705 }
6706
6707 static void cs35l41_generic_fixup(struct hda_codec *cdc, int action, const char *bus,
6708 const char *hid, int count)
6709 {
6710 struct device *dev = hda_codec_dev(cdc);
6711 struct alc_spec *spec = cdc->spec;
6712 char *name;
6713 int ret, i;
6714
6715 switch (action) {
6716 case HDA_FIXUP_ACT_PRE_PROBE:
6717 for (i = 0; i < count; i++) {
6718 name = devm_kasprintf(dev, GFP_KERNEL,
6719 "%s-%s:00-cs35l41-hda.%d", bus, hid, i);
6720 if (!name)
6721 return;
6722 spec->comps[i].codec = cdc;
6723 component_match_add(dev, &spec->match, component_compare_dev_name, name);
6724 }
6725 ret = component_master_add_with_match(dev, &comp_master_ops, spec->match);
6726 if (ret)
6727 codec_err(cdc, "Fail to register component aggregator %d\n", ret);
6728 else
6729 spec->gen.pcm_playback_hook = comp_generic_playback_hook;
6730 break;
6731 }
6732 }
6733
6734 static void cs35l41_fixup_i2c_two(struct hda_codec *cdc, const struct hda_fixup *fix, int action)
6735 {
6736 cs35l41_generic_fixup(cdc, action, "i2c", "CSC3551", 2);
6737 }
6738
6739 static void cs35l41_fixup_spi_two(struct hda_codec *codec, const struct hda_fixup *fix, int action)
6740 {
6741 cs35l41_generic_fixup(codec, action, "spi0", "CSC3551", 2);
6742 }
6743
6744 static void cs35l41_fixup_spi_four(struct hda_codec *codec, const struct hda_fixup *fix, int action)
6745 {
6746 cs35l41_generic_fixup(codec, action, "spi0", "CSC3551", 4);
6747 }
6748
6749 static void alc287_fixup_legion_16achg6_speakers(struct hda_codec *cdc, const struct hda_fixup *fix,
6750 int action)
6751 {
6752 cs35l41_generic_fixup(cdc, action, "i2c", "CLSA0100", 2);
6753 }
6754
6755 static void alc287_fixup_legion_16ithg6_speakers(struct hda_codec *cdc, const struct hda_fixup *fix,
6756 int action)
6757 {
6758 cs35l41_generic_fixup(cdc, action, "i2c", "CLSA0101", 2);
6759 }
6760
6761
6762 #include "hp_x360_helper.c"
6763
6764
6765 #include "ideapad_s740_helper.c"
6766
6767 static const struct coef_fw alc256_fixup_set_coef_defaults_coefs[] = {
6768 WRITE_COEF(0x10, 0x0020), WRITE_COEF(0x24, 0x0000),
6769 WRITE_COEF(0x26, 0x0000), WRITE_COEF(0x29, 0x3000),
6770 WRITE_COEF(0x37, 0xfe05), WRITE_COEF(0x45, 0x5089),
6771 {}
6772 };
6773
6774 static void alc256_fixup_set_coef_defaults(struct hda_codec *codec,
6775 const struct hda_fixup *fix,
6776 int action)
6777 {
6778
6779
6780
6781
6782
6783
6784
6785
6786 alc_process_coef_fw(codec, alc256_fixup_set_coef_defaults_coefs);
6787 }
6788
6789 static const struct coef_fw alc233_fixup_no_audio_jack_coefs[] = {
6790 WRITE_COEF(0x1a, 0x9003), WRITE_COEF(0x1b, 0x0e2b), WRITE_COEF(0x37, 0xfe06),
6791 WRITE_COEF(0x38, 0x4981), WRITE_COEF(0x45, 0xd489), WRITE_COEF(0x46, 0x0074),
6792 WRITE_COEF(0x49, 0x0149),
6793 {}
6794 };
6795
6796 static void alc233_fixup_no_audio_jack(struct hda_codec *codec,
6797 const struct hda_fixup *fix,
6798 int action)
6799 {
6800
6801
6802
6803
6804
6805
6806
6807 alc_process_coef_fw(codec, alc233_fixup_no_audio_jack_coefs);
6808 }
6809
6810 static void alc256_fixup_mic_no_presence_and_resume(struct hda_codec *codec,
6811 const struct hda_fixup *fix,
6812 int action)
6813 {
6814
6815
6816
6817
6818
6819 if (codec->core.vendor_id == 0x10ec0256) {
6820 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
6821 snd_hda_codec_set_pincfg(codec, 0x19, 0x04a11120);
6822 } else {
6823 snd_hda_codec_set_pincfg(codec, 0x1a, 0x04a1113c);
6824 }
6825 }
6826
6827 static void alc_fixup_dell4_mic_no_presence_quiet(struct hda_codec *codec,
6828 const struct hda_fixup *fix,
6829 int action)
6830 {
6831 struct alc_spec *spec = codec->spec;
6832 struct hda_input_mux *imux = &spec->gen.input_mux;
6833 int i;
6834
6835 alc269_fixup_limit_int_mic_boost(codec, fix, action);
6836
6837 switch (action) {
6838 case HDA_FIXUP_ACT_PRE_PROBE:
6839
6840
6841
6842
6843
6844 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
6845 snd_hda_codec_set_pin_target(codec, 0x1b, PIN_VREFHIZ);
6846 break;
6847 case HDA_FIXUP_ACT_PROBE:
6848
6849
6850
6851
6852 for (i = 0; i < imux->num_items; i++) {
6853 if (spec->gen.imux_pins[i] == 0x12) {
6854 spec->gen.cur_mux[0] = i;
6855 break;
6856 }
6857 }
6858 break;
6859 }
6860 }
6861
6862 static void alc287_fixup_yoga9_14iap7_bass_spk_pin(struct hda_codec *codec,
6863 const struct hda_fixup *fix, int action)
6864 {
6865
6866
6867
6868
6869 static const struct hda_pintbl pincfgs[] = {
6870 { 0x17, 0x90170121 },
6871 { }
6872 };
6873
6874
6875
6876
6877 static const hda_nid_t conn[] = { 0x02, 0x03 };
6878
6879
6880
6881
6882 static const hda_nid_t preferred_pairs[] = {
6883 0x14, 0x02,
6884 0x17, 0x02,
6885 0x21, 0x03,
6886 0
6887 };
6888 struct alc_spec *spec = codec->spec;
6889
6890 switch (action) {
6891 case HDA_FIXUP_ACT_PRE_PROBE:
6892 snd_hda_apply_pincfgs(codec, pincfgs);
6893 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6894 spec->gen.preferred_dacs = preferred_pairs;
6895 break;
6896 }
6897 }
6898
6899 enum {
6900 ALC269_FIXUP_GPIO2,
6901 ALC269_FIXUP_SONY_VAIO,
6902 ALC275_FIXUP_SONY_VAIO_GPIO2,
6903 ALC269_FIXUP_DELL_M101Z,
6904 ALC269_FIXUP_SKU_IGNORE,
6905 ALC269_FIXUP_ASUS_G73JW,
6906 ALC269_FIXUP_LENOVO_EAPD,
6907 ALC275_FIXUP_SONY_HWEQ,
6908 ALC275_FIXUP_SONY_DISABLE_AAMIX,
6909 ALC271_FIXUP_DMIC,
6910 ALC269_FIXUP_PCM_44K,
6911 ALC269_FIXUP_STEREO_DMIC,
6912 ALC269_FIXUP_HEADSET_MIC,
6913 ALC269_FIXUP_QUANTA_MUTE,
6914 ALC269_FIXUP_LIFEBOOK,
6915 ALC269_FIXUP_LIFEBOOK_EXTMIC,
6916 ALC269_FIXUP_LIFEBOOK_HP_PIN,
6917 ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT,
6918 ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC,
6919 ALC269_FIXUP_AMIC,
6920 ALC269_FIXUP_DMIC,
6921 ALC269VB_FIXUP_AMIC,
6922 ALC269VB_FIXUP_DMIC,
6923 ALC269_FIXUP_HP_MUTE_LED,
6924 ALC269_FIXUP_HP_MUTE_LED_MIC1,
6925 ALC269_FIXUP_HP_MUTE_LED_MIC2,
6926 ALC269_FIXUP_HP_MUTE_LED_MIC3,
6927 ALC269_FIXUP_HP_GPIO_LED,
6928 ALC269_FIXUP_HP_GPIO_MIC1_LED,
6929 ALC269_FIXUP_HP_LINE1_MIC1_LED,
6930 ALC269_FIXUP_INV_DMIC,
6931 ALC269_FIXUP_LENOVO_DOCK,
6932 ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST,
6933 ALC269_FIXUP_NO_SHUTUP,
6934 ALC286_FIXUP_SONY_MIC_NO_PRESENCE,
6935 ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
6936 ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
6937 ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
6938 ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
6939 ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
6940 ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET,
6941 ALC269_FIXUP_HEADSET_MODE,
6942 ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
6943 ALC269_FIXUP_ASPIRE_HEADSET_MIC,
6944 ALC269_FIXUP_ASUS_X101_FUNC,
6945 ALC269_FIXUP_ASUS_X101_VERB,
6946 ALC269_FIXUP_ASUS_X101,
6947 ALC271_FIXUP_AMIC_MIC2,
6948 ALC271_FIXUP_HP_GATE_MIC_JACK,
6949 ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572,
6950 ALC269_FIXUP_ACER_AC700,
6951 ALC269_FIXUP_LIMIT_INT_MIC_BOOST,
6952 ALC269VB_FIXUP_ASUS_ZENBOOK,
6953 ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A,
6954 ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE,
6955 ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED,
6956 ALC269VB_FIXUP_ORDISSIMO_EVE2,
6957 ALC283_FIXUP_CHROME_BOOK,
6958 ALC283_FIXUP_SENSE_COMBO_JACK,
6959 ALC282_FIXUP_ASUS_TX300,
6960 ALC283_FIXUP_INT_MIC,
6961 ALC290_FIXUP_MONO_SPEAKERS,
6962 ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
6963 ALC290_FIXUP_SUBWOOFER,
6964 ALC290_FIXUP_SUBWOOFER_HSJACK,
6965 ALC269_FIXUP_THINKPAD_ACPI,
6966 ALC269_FIXUP_DMIC_THINKPAD_ACPI,
6967 ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
6968 ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
6969 ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6970 ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
6971 ALC255_FIXUP_HEADSET_MODE,
6972 ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,
6973 ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
6974 ALC292_FIXUP_TPT440_DOCK,
6975 ALC292_FIXUP_TPT440,
6976 ALC283_FIXUP_HEADSET_MIC,
6977 ALC255_FIXUP_MIC_MUTE_LED,
6978 ALC282_FIXUP_ASPIRE_V5_PINS,
6979 ALC269VB_FIXUP_ASPIRE_E1_COEF,
6980 ALC280_FIXUP_HP_GPIO4,
6981 ALC286_FIXUP_HP_GPIO_LED,
6982 ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY,
6983 ALC280_FIXUP_HP_DOCK_PINS,
6984 ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED,
6985 ALC280_FIXUP_HP_9480M,
6986 ALC245_FIXUP_HP_X360_AMP,
6987 ALC285_FIXUP_HP_SPECTRE_X360_EB1,
6988 ALC288_FIXUP_DELL_HEADSET_MODE,
6989 ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
6990 ALC288_FIXUP_DELL_XPS_13,
6991 ALC288_FIXUP_DISABLE_AAMIX,
6992 ALC292_FIXUP_DELL_E7X_AAMIX,
6993 ALC292_FIXUP_DELL_E7X,
6994 ALC292_FIXUP_DISABLE_AAMIX,
6995 ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK,
6996 ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
6997 ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
6998 ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
6999 ALC275_FIXUP_DELL_XPS,
7000 ALC293_FIXUP_LENOVO_SPK_NOISE,
7001 ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
7002 ALC255_FIXUP_DELL_SPK_NOISE,
7003 ALC225_FIXUP_DISABLE_MIC_VREF,
7004 ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
7005 ALC295_FIXUP_DISABLE_DAC3,
7006 ALC285_FIXUP_SPEAKER2_TO_DAC1,
7007 ALC280_FIXUP_HP_HEADSET_MIC,
7008 ALC221_FIXUP_HP_FRONT_MIC,
7009 ALC292_FIXUP_TPT460,
7010 ALC298_FIXUP_SPK_VOLUME,
7011 ALC298_FIXUP_LENOVO_SPK_VOLUME,
7012 ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER,
7013 ALC269_FIXUP_ATIV_BOOK_8,
7014 ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE,
7015 ALC221_FIXUP_HP_MIC_NO_PRESENCE,
7016 ALC256_FIXUP_ASUS_HEADSET_MODE,
7017 ALC256_FIXUP_ASUS_MIC,
7018 ALC256_FIXUP_ASUS_AIO_GPIO2,
7019 ALC233_FIXUP_ASUS_MIC_NO_PRESENCE,
7020 ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE,
7021 ALC233_FIXUP_LENOVO_MULTI_CODECS,
7022 ALC233_FIXUP_ACER_HEADSET_MIC,
7023 ALC294_FIXUP_LENOVO_MIC_LOCATION,
7024 ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE,
7025 ALC225_FIXUP_S3_POP_NOISE,
7026 ALC700_FIXUP_INTEL_REFERENCE,
7027 ALC274_FIXUP_DELL_BIND_DACS,
7028 ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
7029 ALC298_FIXUP_TPT470_DOCK_FIX,
7030 ALC298_FIXUP_TPT470_DOCK,
7031 ALC255_FIXUP_DUMMY_LINEOUT_VERB,
7032 ALC255_FIXUP_DELL_HEADSET_MIC,
7033 ALC256_FIXUP_HUAWEI_MACH_WX9_PINS,
7034 ALC298_FIXUP_HUAWEI_MBX_STEREO,
7035 ALC295_FIXUP_HP_X360,
7036 ALC221_FIXUP_HP_HEADSET_MIC,
7037 ALC285_FIXUP_LENOVO_HEADPHONE_NOISE,
7038 ALC295_FIXUP_HP_AUTO_MUTE,
7039 ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
7040 ALC294_FIXUP_ASUS_MIC,
7041 ALC294_FIXUP_ASUS_HEADSET_MIC,
7042 ALC294_FIXUP_ASUS_SPK,
7043 ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
7044 ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
7045 ALC255_FIXUP_ACER_HEADSET_MIC,
7046 ALC295_FIXUP_CHROME_BOOK,
7047 ALC225_FIXUP_HEADSET_JACK,
7048 ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE,
7049 ALC225_FIXUP_WYSE_AUTO_MUTE,
7050 ALC225_FIXUP_WYSE_DISABLE_MIC_VREF,
7051 ALC286_FIXUP_ACER_AIO_HEADSET_MIC,
7052 ALC256_FIXUP_ASUS_HEADSET_MIC,
7053 ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
7054 ALC299_FIXUP_PREDATOR_SPK,
7055 ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE,
7056 ALC289_FIXUP_DELL_SPK2,
7057 ALC289_FIXUP_DUAL_SPK,
7058 ALC294_FIXUP_SPK2_TO_DAC1,
7059 ALC294_FIXUP_ASUS_DUAL_SPK,
7060 ALC285_FIXUP_THINKPAD_X1_GEN7,
7061 ALC285_FIXUP_THINKPAD_HEADSET_JACK,
7062 ALC294_FIXUP_ASUS_HPE,
7063 ALC294_FIXUP_ASUS_COEF_1B,
7064 ALC294_FIXUP_ASUS_GX502_HP,
7065 ALC294_FIXUP_ASUS_GX502_PINS,
7066 ALC294_FIXUP_ASUS_GX502_VERBS,
7067 ALC294_FIXUP_ASUS_GU502_HP,
7068 ALC294_FIXUP_ASUS_GU502_PINS,
7069 ALC294_FIXUP_ASUS_GU502_VERBS,
7070 ALC294_FIXUP_ASUS_G513_PINS,
7071 ALC285_FIXUP_ASUS_G533Z_PINS,
7072 ALC285_FIXUP_HP_GPIO_LED,
7073 ALC285_FIXUP_HP_MUTE_LED,
7074 ALC236_FIXUP_HP_GPIO_LED,
7075 ALC236_FIXUP_HP_MUTE_LED,
7076 ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,
7077 ALC298_FIXUP_SAMSUNG_AMP,
7078 ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
7079 ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
7080 ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
7081 ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS,
7082 ALC269VC_FIXUP_ACER_HEADSET_MIC,
7083 ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE,
7084 ALC289_FIXUP_ASUS_GA401,
7085 ALC289_FIXUP_ASUS_GA502,
7086 ALC256_FIXUP_ACER_MIC_NO_PRESENCE,
7087 ALC285_FIXUP_HP_GPIO_AMP_INIT,
7088 ALC269_FIXUP_CZC_B20,
7089 ALC269_FIXUP_CZC_TMI,
7090 ALC269_FIXUP_CZC_L101,
7091 ALC269_FIXUP_LEMOTE_A1802,
7092 ALC269_FIXUP_LEMOTE_A190X,
7093 ALC256_FIXUP_INTEL_NUC8_RUGGED,
7094 ALC233_FIXUP_INTEL_NUC8_DMIC,
7095 ALC233_FIXUP_INTEL_NUC8_BOOST,
7096 ALC256_FIXUP_INTEL_NUC10,
7097 ALC255_FIXUP_XIAOMI_HEADSET_MIC,
7098 ALC274_FIXUP_HP_MIC,
7099 ALC274_FIXUP_HP_HEADSET_MIC,
7100 ALC274_FIXUP_HP_ENVY_GPIO,
7101 ALC256_FIXUP_ASUS_HPE,
7102 ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
7103 ALC287_FIXUP_HP_GPIO_LED,
7104 ALC256_FIXUP_HP_HEADSET_MIC,
7105 ALC245_FIXUP_HP_GPIO_LED,
7106 ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
7107 ALC282_FIXUP_ACER_DISABLE_LINEOUT,
7108 ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST,
7109 ALC256_FIXUP_ACER_HEADSET_MIC,
7110 ALC285_FIXUP_IDEAPAD_S740_COEF,
7111 ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST,
7112 ALC295_FIXUP_ASUS_DACS,
7113 ALC295_FIXUP_HP_OMEN,
7114 ALC285_FIXUP_HP_SPECTRE_X360,
7115 ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP,
7116 ALC623_FIXUP_LENOVO_THINKSTATION_P340,
7117 ALC255_FIXUP_ACER_HEADPHONE_AND_MIC,
7118 ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST,
7119 ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS,
7120 ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,
7121 ALC287_FIXUP_YOGA7_14ITL_SPEAKERS,
7122 ALC298_FIXUP_LENOVO_C940_DUET7,
7123 ALC287_FIXUP_13S_GEN2_SPEAKERS,
7124 ALC256_FIXUP_SET_COEF_DEFAULTS,
7125 ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
7126 ALC233_FIXUP_NO_AUDIO_JACK,
7127 ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME,
7128 ALC285_FIXUP_LEGION_Y9000X_SPEAKERS,
7129 ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,
7130 ALC287_FIXUP_LEGION_16ACHG6,
7131 ALC287_FIXUP_CS35L41_I2C_2,
7132 ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED,
7133 ALC245_FIXUP_CS35L41_SPI_2,
7134 ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED,
7135 ALC245_FIXUP_CS35L41_SPI_4,
7136 ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED,
7137 ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED,
7138 ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE,
7139 ALC287_FIXUP_LEGION_16ITHG6,
7140 ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK,
7141 ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN,
7142 };
7143
7144
7145
7146
7147
7148 static void alc298_fixup_lenovo_c940_duet7(struct hda_codec *codec,
7149 const struct hda_fixup *fix,
7150 int action)
7151 {
7152 int id;
7153
7154 if (codec->core.vendor_id == 0x10ec0298)
7155 id = ALC298_FIXUP_LENOVO_SPK_VOLUME;
7156 else
7157 id = ALC287_FIXUP_YOGA7_14ITL_SPEAKERS;
7158 __snd_hda_apply_fixup(codec, id, action, 0);
7159 }
7160
7161 static const struct hda_fixup alc269_fixups[] = {
7162 [ALC269_FIXUP_GPIO2] = {
7163 .type = HDA_FIXUP_FUNC,
7164 .v.func = alc_fixup_gpio2,
7165 },
7166 [ALC269_FIXUP_SONY_VAIO] = {
7167 .type = HDA_FIXUP_PINCTLS,
7168 .v.pins = (const struct hda_pintbl[]) {
7169 {0x19, PIN_VREFGRD},
7170 {}
7171 }
7172 },
7173 [ALC275_FIXUP_SONY_VAIO_GPIO2] = {
7174 .type = HDA_FIXUP_FUNC,
7175 .v.func = alc275_fixup_gpio4_off,
7176 .chained = true,
7177 .chain_id = ALC269_FIXUP_SONY_VAIO
7178 },
7179 [ALC269_FIXUP_DELL_M101Z] = {
7180 .type = HDA_FIXUP_VERBS,
7181 .v.verbs = (const struct hda_verb[]) {
7182
7183 {0x20, AC_VERB_SET_COEF_INDEX, 13},
7184 {0x20, AC_VERB_SET_PROC_COEF, 0x4040},
7185 {}
7186 }
7187 },
7188 [ALC269_FIXUP_SKU_IGNORE] = {
7189 .type = HDA_FIXUP_FUNC,
7190 .v.func = alc_fixup_sku_ignore,
7191 },
7192 [ALC269_FIXUP_ASUS_G73JW] = {
7193 .type = HDA_FIXUP_PINS,
7194 .v.pins = (const struct hda_pintbl[]) {
7195 { 0x17, 0x99130111 },
7196 { }
7197 }
7198 },
7199 [ALC269_FIXUP_LENOVO_EAPD] = {
7200 .type = HDA_FIXUP_VERBS,
7201 .v.verbs = (const struct hda_verb[]) {
7202 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
7203 {}
7204 }
7205 },
7206 [ALC275_FIXUP_SONY_HWEQ] = {
7207 .type = HDA_FIXUP_FUNC,
7208 .v.func = alc269_fixup_hweq,
7209 .chained = true,
7210 .chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
7211 },
7212 [ALC275_FIXUP_SONY_DISABLE_AAMIX] = {
7213 .type = HDA_FIXUP_FUNC,
7214 .v.func = alc_fixup_disable_aamix,
7215 .chained = true,
7216 .chain_id = ALC269_FIXUP_SONY_VAIO
7217 },
7218 [ALC271_FIXUP_DMIC] = {
7219 .type = HDA_FIXUP_FUNC,
7220 .v.func = alc271_fixup_dmic,
7221 },
7222 [ALC269_FIXUP_PCM_44K] = {
7223 .type = HDA_FIXUP_FUNC,
7224 .v.func = alc269_fixup_pcm_44k,
7225 .chained = true,
7226 .chain_id = ALC269_FIXUP_QUANTA_MUTE
7227 },
7228 [ALC269_FIXUP_STEREO_DMIC] = {
7229 .type = HDA_FIXUP_FUNC,
7230 .v.func = alc269_fixup_stereo_dmic,
7231 },
7232 [ALC269_FIXUP_HEADSET_MIC] = {
7233 .type = HDA_FIXUP_FUNC,
7234 .v.func = alc269_fixup_headset_mic,
7235 },
7236 [ALC269_FIXUP_QUANTA_MUTE] = {
7237 .type = HDA_FIXUP_FUNC,
7238 .v.func = alc269_fixup_quanta_mute,
7239 },
7240 [ALC269_FIXUP_LIFEBOOK] = {
7241 .type = HDA_FIXUP_PINS,
7242 .v.pins = (const struct hda_pintbl[]) {
7243 { 0x1a, 0x2101103f },
7244 { 0x1b, 0x23a11040 },
7245 { }
7246 },
7247 .chained = true,
7248 .chain_id = ALC269_FIXUP_QUANTA_MUTE
7249 },
7250 [ALC269_FIXUP_LIFEBOOK_EXTMIC] = {
7251 .type = HDA_FIXUP_PINS,
7252 .v.pins = (const struct hda_pintbl[]) {
7253 { 0x19, 0x01a1903c },
7254 { }
7255 },
7256 },
7257 [ALC269_FIXUP_LIFEBOOK_HP_PIN] = {
7258 .type = HDA_FIXUP_PINS,
7259 .v.pins = (const struct hda_pintbl[]) {
7260 { 0x21, 0x0221102f },
7261 { }
7262 },
7263 },
7264 [ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT] = {
7265 .type = HDA_FIXUP_FUNC,
7266 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
7267 },
7268 [ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC] = {
7269 .type = HDA_FIXUP_FUNC,
7270 .v.func = alc269_fixup_pincfg_U7x7_headset_mic,
7271 },
7272 [ALC269_FIXUP_AMIC] = {
7273 .type = HDA_FIXUP_PINS,
7274 .v.pins = (const struct hda_pintbl[]) {
7275 { 0x14, 0x99130110 },
7276 { 0x15, 0x0121401f },
7277 { 0x18, 0x01a19c20 },
7278 { 0x19, 0x99a3092f },
7279 { }
7280 },
7281 },
7282 [ALC269_FIXUP_DMIC] = {
7283 .type = HDA_FIXUP_PINS,
7284 .v.pins = (const struct hda_pintbl[]) {
7285 { 0x12, 0x99a3092f },
7286 { 0x14, 0x99130110 },
7287 { 0x15, 0x0121401f },
7288 { 0x18, 0x01a19c20 },
7289 { }
7290 },
7291 },
7292 [ALC269VB_FIXUP_AMIC] = {
7293 .type = HDA_FIXUP_PINS,
7294 .v.pins = (const struct hda_pintbl[]) {
7295 { 0x14, 0x99130110 },
7296 { 0x18, 0x01a19c20 },
7297 { 0x19, 0x99a3092f },
7298 { 0x21, 0x0121401f },
7299 { }
7300 },
7301 },
7302 [ALC269VB_FIXUP_DMIC] = {
7303 .type = HDA_FIXUP_PINS,
7304 .v.pins = (const struct hda_pintbl[]) {
7305 { 0x12, 0x99a3092f },
7306 { 0x14, 0x99130110 },
7307 { 0x18, 0x01a19c20 },
7308 { 0x21, 0x0121401f },
7309 { }
7310 },
7311 },
7312 [ALC269_FIXUP_HP_MUTE_LED] = {
7313 .type = HDA_FIXUP_FUNC,
7314 .v.func = alc269_fixup_hp_mute_led,
7315 },
7316 [ALC269_FIXUP_HP_MUTE_LED_MIC1] = {
7317 .type = HDA_FIXUP_FUNC,
7318 .v.func = alc269_fixup_hp_mute_led_mic1,
7319 },
7320 [ALC269_FIXUP_HP_MUTE_LED_MIC2] = {
7321 .type = HDA_FIXUP_FUNC,
7322 .v.func = alc269_fixup_hp_mute_led_mic2,
7323 },
7324 [ALC269_FIXUP_HP_MUTE_LED_MIC3] = {
7325 .type = HDA_FIXUP_FUNC,
7326 .v.func = alc269_fixup_hp_mute_led_mic3,
7327 .chained = true,
7328 .chain_id = ALC295_FIXUP_HP_AUTO_MUTE
7329 },
7330 [ALC269_FIXUP_HP_GPIO_LED] = {
7331 .type = HDA_FIXUP_FUNC,
7332 .v.func = alc269_fixup_hp_gpio_led,
7333 },
7334 [ALC269_FIXUP_HP_GPIO_MIC1_LED] = {
7335 .type = HDA_FIXUP_FUNC,
7336 .v.func = alc269_fixup_hp_gpio_mic1_led,
7337 },
7338 [ALC269_FIXUP_HP_LINE1_MIC1_LED] = {
7339 .type = HDA_FIXUP_FUNC,
7340 .v.func = alc269_fixup_hp_line1_mic1_led,
7341 },
7342 [ALC269_FIXUP_INV_DMIC] = {
7343 .type = HDA_FIXUP_FUNC,
7344 .v.func = alc_fixup_inv_dmic,
7345 },
7346 [ALC269_FIXUP_NO_SHUTUP] = {
7347 .type = HDA_FIXUP_FUNC,
7348 .v.func = alc_fixup_no_shutup,
7349 },
7350 [ALC269_FIXUP_LENOVO_DOCK] = {
7351 .type = HDA_FIXUP_PINS,
7352 .v.pins = (const struct hda_pintbl[]) {
7353 { 0x19, 0x23a11040 },
7354 { 0x1b, 0x2121103f },
7355 { }
7356 },
7357 .chained = true,
7358 .chain_id = ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT
7359 },
7360 [ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST] = {
7361 .type = HDA_FIXUP_FUNC,
7362 .v.func = alc269_fixup_limit_int_mic_boost,
7363 .chained = true,
7364 .chain_id = ALC269_FIXUP_LENOVO_DOCK,
7365 },
7366 [ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT] = {
7367 .type = HDA_FIXUP_FUNC,
7368 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
7369 .chained = true,
7370 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
7371 },
7372 [ALC269_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7373 .type = HDA_FIXUP_PINS,
7374 .v.pins = (const struct hda_pintbl[]) {
7375 { 0x19, 0x01a1913c },
7376 { 0x1a, 0x01a1913d },
7377 { }
7378 },
7379 .chained = true,
7380 .chain_id = ALC269_FIXUP_HEADSET_MODE
7381 },
7382 [ALC269_FIXUP_DELL2_MIC_NO_PRESENCE] = {
7383 .type = HDA_FIXUP_PINS,
7384 .v.pins = (const struct hda_pintbl[]) {
7385 { 0x16, 0x21014020 },
7386 { 0x19, 0x21a19030 },
7387 { 0x1a, 0x01a1913c },
7388 { }
7389 },
7390 .chained = true,
7391 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7392 },
7393 [ALC269_FIXUP_DELL3_MIC_NO_PRESENCE] = {
7394 .type = HDA_FIXUP_PINS,
7395 .v.pins = (const struct hda_pintbl[]) {
7396 { 0x1a, 0x01a1913c },
7397 { }
7398 },
7399 .chained = true,
7400 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7401 },
7402 [ALC269_FIXUP_DELL4_MIC_NO_PRESENCE] = {
7403 .type = HDA_FIXUP_PINS,
7404 .v.pins = (const struct hda_pintbl[]) {
7405 { 0x19, 0x01a1913c },
7406 { 0x1b, 0x01a1913d },
7407 { }
7408 },
7409 .chained = true,
7410 .chain_id = ALC269_FIXUP_HEADSET_MODE
7411 },
7412 [ALC269_FIXUP_HEADSET_MODE] = {
7413 .type = HDA_FIXUP_FUNC,
7414 .v.func = alc_fixup_headset_mode,
7415 .chained = true,
7416 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
7417 },
7418 [ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
7419 .type = HDA_FIXUP_FUNC,
7420 .v.func = alc_fixup_headset_mode_no_hp_mic,
7421 },
7422 [ALC269_FIXUP_ASPIRE_HEADSET_MIC] = {
7423 .type = HDA_FIXUP_PINS,
7424 .v.pins = (const struct hda_pintbl[]) {
7425 { 0x19, 0x01a1913c },
7426 { }
7427 },
7428 .chained = true,
7429 .chain_id = ALC269_FIXUP_HEADSET_MODE,
7430 },
7431 [ALC286_FIXUP_SONY_MIC_NO_PRESENCE] = {
7432 .type = HDA_FIXUP_PINS,
7433 .v.pins = (const struct hda_pintbl[]) {
7434 { 0x18, 0x01a1913c },
7435 { }
7436 },
7437 .chained = true,
7438 .chain_id = ALC269_FIXUP_HEADSET_MIC
7439 },
7440 [ALC256_FIXUP_HUAWEI_MACH_WX9_PINS] = {
7441 .type = HDA_FIXUP_PINS,
7442 .v.pins = (const struct hda_pintbl[]) {
7443 {0x12, 0x90a60130},
7444 {0x13, 0x40000000},
7445 {0x14, 0x90170110},
7446 {0x18, 0x411111f0},
7447 {0x19, 0x04a11040},
7448 {0x1a, 0x411111f0},
7449 {0x1b, 0x90170112},
7450 {0x1d, 0x40759a05},
7451 {0x1e, 0x411111f0},
7452 {0x21, 0x04211020},
7453 { }
7454 },
7455 .chained = true,
7456 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
7457 },
7458 [ALC298_FIXUP_HUAWEI_MBX_STEREO] = {
7459 .type = HDA_FIXUP_FUNC,
7460 .v.func = alc298_fixup_huawei_mbx_stereo,
7461 .chained = true,
7462 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
7463 },
7464 [ALC269_FIXUP_ASUS_X101_FUNC] = {
7465 .type = HDA_FIXUP_FUNC,
7466 .v.func = alc269_fixup_x101_headset_mic,
7467 },
7468 [ALC269_FIXUP_ASUS_X101_VERB] = {
7469 .type = HDA_FIXUP_VERBS,
7470 .v.verbs = (const struct hda_verb[]) {
7471 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
7472 {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
7473 {0x20, AC_VERB_SET_PROC_COEF, 0x0310},
7474 { }
7475 },
7476 .chained = true,
7477 .chain_id = ALC269_FIXUP_ASUS_X101_FUNC
7478 },
7479 [ALC269_FIXUP_ASUS_X101] = {
7480 .type = HDA_FIXUP_PINS,
7481 .v.pins = (const struct hda_pintbl[]) {
7482 { 0x18, 0x04a1182c },
7483 { }
7484 },
7485 .chained = true,
7486 .chain_id = ALC269_FIXUP_ASUS_X101_VERB
7487 },
7488 [ALC271_FIXUP_AMIC_MIC2] = {
7489 .type = HDA_FIXUP_PINS,
7490 .v.pins = (const struct hda_pintbl[]) {
7491 { 0x14, 0x99130110 },
7492 { 0x19, 0x01a19c20 },
7493 { 0x1b, 0x99a7012f },
7494 { 0x21, 0x0121401f },
7495 { }
7496 },
7497 },
7498 [ALC271_FIXUP_HP_GATE_MIC_JACK] = {
7499 .type = HDA_FIXUP_FUNC,
7500 .v.func = alc271_hp_gate_mic_jack,
7501 .chained = true,
7502 .chain_id = ALC271_FIXUP_AMIC_MIC2,
7503 },
7504 [ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572] = {
7505 .type = HDA_FIXUP_FUNC,
7506 .v.func = alc269_fixup_limit_int_mic_boost,
7507 .chained = true,
7508 .chain_id = ALC271_FIXUP_HP_GATE_MIC_JACK,
7509 },
7510 [ALC269_FIXUP_ACER_AC700] = {
7511 .type = HDA_FIXUP_PINS,
7512 .v.pins = (const struct hda_pintbl[]) {
7513 { 0x12, 0x99a3092f },
7514 { 0x14, 0x99130110 },
7515 { 0x18, 0x03a11c20 },
7516 { 0x1e, 0x0346101e },
7517 { 0x21, 0x0321101f },
7518 { }
7519 },
7520 .chained = true,
7521 .chain_id = ALC271_FIXUP_DMIC,
7522 },
7523 [ALC269_FIXUP_LIMIT_INT_MIC_BOOST] = {
7524 .type = HDA_FIXUP_FUNC,
7525 .v.func = alc269_fixup_limit_int_mic_boost,
7526 .chained = true,
7527 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
7528 },
7529 [ALC269VB_FIXUP_ASUS_ZENBOOK] = {
7530 .type = HDA_FIXUP_FUNC,
7531 .v.func = alc269_fixup_limit_int_mic_boost,
7532 .chained = true,
7533 .chain_id = ALC269VB_FIXUP_DMIC,
7534 },
7535 [ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A] = {
7536 .type = HDA_FIXUP_VERBS,
7537 .v.verbs = (const struct hda_verb[]) {
7538
7539 { 0x20, AC_VERB_SET_COEF_INDEX, 0x12 },
7540 { 0x20, AC_VERB_SET_PROC_COEF, 0x2800 },
7541 {}
7542 },
7543 .chained = true,
7544 .chain_id = ALC269VB_FIXUP_ASUS_ZENBOOK,
7545 },
7546 [ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7547 .type = HDA_FIXUP_PINS,
7548 .v.pins = (const struct hda_pintbl[]) {
7549 { 0x18, 0x01a110f0 },
7550 { }
7551 },
7552 .chained = true,
7553 .chain_id = ALC269_FIXUP_HEADSET_MIC
7554 },
7555 [ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED] = {
7556 .type = HDA_FIXUP_FUNC,
7557 .v.func = alc269_fixup_limit_int_mic_boost,
7558 .chained = true,
7559 .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC1,
7560 },
7561 [ALC269VB_FIXUP_ORDISSIMO_EVE2] = {
7562 .type = HDA_FIXUP_PINS,
7563 .v.pins = (const struct hda_pintbl[]) {
7564 { 0x12, 0x99a3092f },
7565 { 0x18, 0x03a11d20 },
7566 { 0x19, 0x411111f0 },
7567 { }
7568 },
7569 },
7570 [ALC283_FIXUP_CHROME_BOOK] = {
7571 .type = HDA_FIXUP_FUNC,
7572 .v.func = alc283_fixup_chromebook,
7573 },
7574 [ALC283_FIXUP_SENSE_COMBO_JACK] = {
7575 .type = HDA_FIXUP_FUNC,
7576 .v.func = alc283_fixup_sense_combo_jack,
7577 .chained = true,
7578 .chain_id = ALC283_FIXUP_CHROME_BOOK,
7579 },
7580 [ALC282_FIXUP_ASUS_TX300] = {
7581 .type = HDA_FIXUP_FUNC,
7582 .v.func = alc282_fixup_asus_tx300,
7583 },
7584 [ALC283_FIXUP_INT_MIC] = {
7585 .type = HDA_FIXUP_VERBS,
7586 .v.verbs = (const struct hda_verb[]) {
7587 {0x20, AC_VERB_SET_COEF_INDEX, 0x1a},
7588 {0x20, AC_VERB_SET_PROC_COEF, 0x0011},
7589 { }
7590 },
7591 .chained = true,
7592 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
7593 },
7594 [ALC290_FIXUP_SUBWOOFER_HSJACK] = {
7595 .type = HDA_FIXUP_PINS,
7596 .v.pins = (const struct hda_pintbl[]) {
7597 { 0x17, 0x90170112 },
7598 { }
7599 },
7600 .chained = true,
7601 .chain_id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
7602 },
7603 [ALC290_FIXUP_SUBWOOFER] = {
7604 .type = HDA_FIXUP_PINS,
7605 .v.pins = (const struct hda_pintbl[]) {
7606 { 0x17, 0x90170112 },
7607 { }
7608 },
7609 .chained = true,
7610 .chain_id = ALC290_FIXUP_MONO_SPEAKERS,
7611 },
7612 [ALC290_FIXUP_MONO_SPEAKERS] = {
7613 .type = HDA_FIXUP_FUNC,
7614 .v.func = alc290_fixup_mono_speakers,
7615 },
7616 [ALC290_FIXUP_MONO_SPEAKERS_HSJACK] = {
7617 .type = HDA_FIXUP_FUNC,
7618 .v.func = alc290_fixup_mono_speakers,
7619 .chained = true,
7620 .chain_id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
7621 },
7622 [ALC269_FIXUP_THINKPAD_ACPI] = {
7623 .type = HDA_FIXUP_FUNC,
7624 .v.func = alc_fixup_thinkpad_acpi,
7625 .chained = true,
7626 .chain_id = ALC269_FIXUP_SKU_IGNORE,
7627 },
7628 [ALC269_FIXUP_DMIC_THINKPAD_ACPI] = {
7629 .type = HDA_FIXUP_FUNC,
7630 .v.func = alc_fixup_inv_dmic,
7631 .chained = true,
7632 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
7633 },
7634 [ALC255_FIXUP_ACER_MIC_NO_PRESENCE] = {
7635 .type = HDA_FIXUP_PINS,
7636 .v.pins = (const struct hda_pintbl[]) {
7637 { 0x19, 0x01a1913c },
7638 { }
7639 },
7640 .chained = true,
7641 .chain_id = ALC255_FIXUP_HEADSET_MODE
7642 },
7643 [ALC255_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7644 .type = HDA_FIXUP_PINS,
7645 .v.pins = (const struct hda_pintbl[]) {
7646 { 0x19, 0x01a1913c },
7647 { }
7648 },
7649 .chained = true,
7650 .chain_id = ALC255_FIXUP_HEADSET_MODE
7651 },
7652 [ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7653 .type = HDA_FIXUP_PINS,
7654 .v.pins = (const struct hda_pintbl[]) {
7655 { 0x19, 0x01a1913c },
7656 { 0x1a, 0x01a1913d },
7657 { }
7658 },
7659 .chained = true,
7660 .chain_id = ALC255_FIXUP_HEADSET_MODE
7661 },
7662 [ALC255_FIXUP_DELL2_MIC_NO_PRESENCE] = {
7663 .type = HDA_FIXUP_PINS,
7664 .v.pins = (const struct hda_pintbl[]) {
7665 { 0x19, 0x01a1913c },
7666 { }
7667 },
7668 .chained = true,
7669 .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
7670 },
7671 [ALC255_FIXUP_HEADSET_MODE] = {
7672 .type = HDA_FIXUP_FUNC,
7673 .v.func = alc_fixup_headset_mode_alc255,
7674 .chained = true,
7675 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
7676 },
7677 [ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
7678 .type = HDA_FIXUP_FUNC,
7679 .v.func = alc_fixup_headset_mode_alc255_no_hp_mic,
7680 },
7681 [ALC293_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7682 .type = HDA_FIXUP_PINS,
7683 .v.pins = (const struct hda_pintbl[]) {
7684 { 0x18, 0x01a1913d },
7685 { 0x1a, 0x01a1913c },
7686 { }
7687 },
7688 .chained = true,
7689 .chain_id = ALC269_FIXUP_HEADSET_MODE
7690 },
7691 [ALC292_FIXUP_TPT440_DOCK] = {
7692 .type = HDA_FIXUP_FUNC,
7693 .v.func = alc_fixup_tpt440_dock,
7694 .chained = true,
7695 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
7696 },
7697 [ALC292_FIXUP_TPT440] = {
7698 .type = HDA_FIXUP_FUNC,
7699 .v.func = alc_fixup_disable_aamix,
7700 .chained = true,
7701 .chain_id = ALC292_FIXUP_TPT440_DOCK,
7702 },
7703 [ALC283_FIXUP_HEADSET_MIC] = {
7704 .type = HDA_FIXUP_PINS,
7705 .v.pins = (const struct hda_pintbl[]) {
7706 { 0x19, 0x04a110f0 },
7707 { },
7708 },
7709 },
7710 [ALC255_FIXUP_MIC_MUTE_LED] = {
7711 .type = HDA_FIXUP_FUNC,
7712 .v.func = alc_fixup_micmute_led,
7713 },
7714 [ALC282_FIXUP_ASPIRE_V5_PINS] = {
7715 .type = HDA_FIXUP_PINS,
7716 .v.pins = (const struct hda_pintbl[]) {
7717 { 0x12, 0x90a60130 },
7718 { 0x14, 0x90170110 },
7719 { 0x17, 0x40000008 },
7720 { 0x18, 0x411111f0 },
7721 { 0x19, 0x01a1913c },
7722 { 0x1a, 0x411111f0 },
7723 { 0x1b, 0x411111f0 },
7724 { 0x1d, 0x40f89b2d },
7725 { 0x1e, 0x411111f0 },
7726 { 0x21, 0x0321101f },
7727 { },
7728 },
7729 },
7730 [ALC269VB_FIXUP_ASPIRE_E1_COEF] = {
7731 .type = HDA_FIXUP_FUNC,
7732 .v.func = alc269vb_fixup_aspire_e1_coef,
7733 },
7734 [ALC280_FIXUP_HP_GPIO4] = {
7735 .type = HDA_FIXUP_FUNC,
7736 .v.func = alc280_fixup_hp_gpio4,
7737 },
7738 [ALC286_FIXUP_HP_GPIO_LED] = {
7739 .type = HDA_FIXUP_FUNC,
7740 .v.func = alc286_fixup_hp_gpio_led,
7741 },
7742 [ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY] = {
7743 .type = HDA_FIXUP_FUNC,
7744 .v.func = alc280_fixup_hp_gpio2_mic_hotkey,
7745 },
7746 [ALC280_FIXUP_HP_DOCK_PINS] = {
7747 .type = HDA_FIXUP_PINS,
7748 .v.pins = (const struct hda_pintbl[]) {
7749 { 0x1b, 0x21011020 },
7750 { 0x1a, 0x01a1903c },
7751 { 0x18, 0x2181103f },
7752 { },
7753 },
7754 .chained = true,
7755 .chain_id = ALC280_FIXUP_HP_GPIO4
7756 },
7757 [ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED] = {
7758 .type = HDA_FIXUP_PINS,
7759 .v.pins = (const struct hda_pintbl[]) {
7760 { 0x1b, 0x21011020 },
7761 { 0x18, 0x2181103f },
7762 { },
7763 },
7764 .chained = true,
7765 .chain_id = ALC269_FIXUP_HP_GPIO_MIC1_LED
7766 },
7767 [ALC280_FIXUP_HP_9480M] = {
7768 .type = HDA_FIXUP_FUNC,
7769 .v.func = alc280_fixup_hp_9480m,
7770 },
7771 [ALC245_FIXUP_HP_X360_AMP] = {
7772 .type = HDA_FIXUP_FUNC,
7773 .v.func = alc245_fixup_hp_x360_amp,
7774 .chained = true,
7775 .chain_id = ALC245_FIXUP_HP_GPIO_LED
7776 },
7777 [ALC288_FIXUP_DELL_HEADSET_MODE] = {
7778 .type = HDA_FIXUP_FUNC,
7779 .v.func = alc_fixup_headset_mode_dell_alc288,
7780 .chained = true,
7781 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
7782 },
7783 [ALC288_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7784 .type = HDA_FIXUP_PINS,
7785 .v.pins = (const struct hda_pintbl[]) {
7786 { 0x18, 0x01a1913c },
7787 { 0x1a, 0x01a1913d },
7788 { }
7789 },
7790 .chained = true,
7791 .chain_id = ALC288_FIXUP_DELL_HEADSET_MODE
7792 },
7793 [ALC288_FIXUP_DISABLE_AAMIX] = {
7794 .type = HDA_FIXUP_FUNC,
7795 .v.func = alc_fixup_disable_aamix,
7796 .chained = true,
7797 .chain_id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE
7798 },
7799 [ALC288_FIXUP_DELL_XPS_13] = {
7800 .type = HDA_FIXUP_FUNC,
7801 .v.func = alc_fixup_dell_xps13,
7802 .chained = true,
7803 .chain_id = ALC288_FIXUP_DISABLE_AAMIX
7804 },
7805 [ALC292_FIXUP_DISABLE_AAMIX] = {
7806 .type = HDA_FIXUP_FUNC,
7807 .v.func = alc_fixup_disable_aamix,
7808 .chained = true,
7809 .chain_id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE
7810 },
7811 [ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK] = {
7812 .type = HDA_FIXUP_FUNC,
7813 .v.func = alc_fixup_disable_aamix,
7814 .chained = true,
7815 .chain_id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE
7816 },
7817 [ALC292_FIXUP_DELL_E7X_AAMIX] = {
7818 .type = HDA_FIXUP_FUNC,
7819 .v.func = alc_fixup_dell_xps13,
7820 .chained = true,
7821 .chain_id = ALC292_FIXUP_DISABLE_AAMIX
7822 },
7823 [ALC292_FIXUP_DELL_E7X] = {
7824 .type = HDA_FIXUP_FUNC,
7825 .v.func = alc_fixup_micmute_led,
7826
7827 .chained_before = true,
7828 .chain_id = ALC292_FIXUP_DELL_E7X_AAMIX,
7829 },
7830 [ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE] = {
7831 .type = HDA_FIXUP_PINS,
7832 .v.pins = (const struct hda_pintbl[]) {
7833 { 0x18, 0x01a1913c },
7834 { }
7835 },
7836 .chained_before = true,
7837 .chain_id = ALC269_FIXUP_HEADSET_MODE,
7838 },
7839 [ALC298_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7840 .type = HDA_FIXUP_PINS,
7841 .v.pins = (const struct hda_pintbl[]) {
7842 { 0x18, 0x01a1913c },
7843 { 0x1a, 0x01a1913d },
7844 { }
7845 },
7846 .chained = true,
7847 .chain_id = ALC269_FIXUP_HEADSET_MODE
7848 },
7849 [ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE] = {
7850 .type = HDA_FIXUP_PINS,
7851 .v.pins = (const struct hda_pintbl[]) {
7852 { 0x18, 0x01a1913c },
7853 { }
7854 },
7855 .chained = true,
7856 .chain_id = ALC269_FIXUP_HEADSET_MODE
7857 },
7858 [ALC275_FIXUP_DELL_XPS] = {
7859 .type = HDA_FIXUP_VERBS,
7860 .v.verbs = (const struct hda_verb[]) {
7861
7862 {0x20, AC_VERB_SET_COEF_INDEX, 0x1f},
7863 {0x20, AC_VERB_SET_PROC_COEF, 0x00c0},
7864 {0x20, AC_VERB_SET_COEF_INDEX, 0x30},
7865 {0x20, AC_VERB_SET_PROC_COEF, 0x00b1},
7866 {}
7867 }
7868 },
7869 [ALC293_FIXUP_LENOVO_SPK_NOISE] = {
7870 .type = HDA_FIXUP_FUNC,
7871 .v.func = alc_fixup_disable_aamix,
7872 .chained = true,
7873 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
7874 },
7875 [ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY] = {
7876 .type = HDA_FIXUP_FUNC,
7877 .v.func = alc233_fixup_lenovo_line2_mic_hotkey,
7878 },
7879 [ALC233_FIXUP_INTEL_NUC8_DMIC] = {
7880 .type = HDA_FIXUP_FUNC,
7881 .v.func = alc_fixup_inv_dmic,
7882 .chained = true,
7883 .chain_id = ALC233_FIXUP_INTEL_NUC8_BOOST,
7884 },
7885 [ALC233_FIXUP_INTEL_NUC8_BOOST] = {
7886 .type = HDA_FIXUP_FUNC,
7887 .v.func = alc269_fixup_limit_int_mic_boost
7888 },
7889 [ALC255_FIXUP_DELL_SPK_NOISE] = {
7890 .type = HDA_FIXUP_FUNC,
7891 .v.func = alc_fixup_disable_aamix,
7892 .chained = true,
7893 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
7894 },
7895 [ALC225_FIXUP_DISABLE_MIC_VREF] = {
7896 .type = HDA_FIXUP_FUNC,
7897 .v.func = alc_fixup_disable_mic_vref,
7898 .chained = true,
7899 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
7900 },
7901 [ALC225_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7902 .type = HDA_FIXUP_VERBS,
7903 .v.verbs = (const struct hda_verb[]) {
7904
7905 { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
7906 { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
7907 {}
7908 },
7909 .chained = true,
7910 .chain_id = ALC225_FIXUP_DISABLE_MIC_VREF
7911 },
7912 [ALC280_FIXUP_HP_HEADSET_MIC] = {
7913 .type = HDA_FIXUP_FUNC,
7914 .v.func = alc_fixup_disable_aamix,
7915 .chained = true,
7916 .chain_id = ALC269_FIXUP_HEADSET_MIC,
7917 },
7918 [ALC221_FIXUP_HP_FRONT_MIC] = {
7919 .type = HDA_FIXUP_PINS,
7920 .v.pins = (const struct hda_pintbl[]) {
7921 { 0x19, 0x02a19020 },
7922 { }
7923 },
7924 },
7925 [ALC292_FIXUP_TPT460] = {
7926 .type = HDA_FIXUP_FUNC,
7927 .v.func = alc_fixup_tpt440_dock,
7928 .chained = true,
7929 .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE,
7930 },
7931 [ALC298_FIXUP_SPK_VOLUME] = {
7932 .type = HDA_FIXUP_FUNC,
7933 .v.func = alc298_fixup_speaker_volume,
7934 .chained = true,
7935 .chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
7936 },
7937 [ALC298_FIXUP_LENOVO_SPK_VOLUME] = {
7938 .type = HDA_FIXUP_FUNC,
7939 .v.func = alc298_fixup_speaker_volume,
7940 },
7941 [ALC295_FIXUP_DISABLE_DAC3] = {
7942 .type = HDA_FIXUP_FUNC,
7943 .v.func = alc295_fixup_disable_dac3,
7944 },
7945 [ALC285_FIXUP_SPEAKER2_TO_DAC1] = {
7946 .type = HDA_FIXUP_FUNC,
7947 .v.func = alc285_fixup_speaker2_to_dac1,
7948 .chained = true,
7949 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
7950 },
7951 [ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {
7952 .type = HDA_FIXUP_PINS,
7953 .v.pins = (const struct hda_pintbl[]) {
7954 { 0x1b, 0x90170151 },
7955 { }
7956 },
7957 .chained = true,
7958 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
7959 },
7960 [ALC269_FIXUP_ATIV_BOOK_8] = {
7961 .type = HDA_FIXUP_FUNC,
7962 .v.func = alc_fixup_auto_mute_via_amp,
7963 .chained = true,
7964 .chain_id = ALC269_FIXUP_NO_SHUTUP
7965 },
7966 [ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE] = {
7967 .type = HDA_FIXUP_PINS,
7968 .v.pins = (const struct hda_pintbl[]) {
7969 { 0x19, 0x01a1913c },
7970 { 0x1a, 0x01813030 },
7971 { }
7972 },
7973 .chained = true,
7974 .chain_id = ALC269_FIXUP_HEADSET_MODE
7975 },
7976 [ALC221_FIXUP_HP_MIC_NO_PRESENCE] = {
7977 .type = HDA_FIXUP_PINS,
7978 .v.pins = (const struct hda_pintbl[]) {
7979 { 0x18, 0x01a1913c },
7980 { 0x1a, 0x01a1913d },
7981 { }
7982 },
7983 .chained = true,
7984 .chain_id = ALC269_FIXUP_HEADSET_MODE
7985 },
7986 [ALC256_FIXUP_ASUS_HEADSET_MODE] = {
7987 .type = HDA_FIXUP_FUNC,
7988 .v.func = alc_fixup_headset_mode,
7989 },
7990 [ALC256_FIXUP_ASUS_MIC] = {
7991 .type = HDA_FIXUP_PINS,
7992 .v.pins = (const struct hda_pintbl[]) {
7993 { 0x13, 0x90a60160 },
7994 { 0x19, 0x04a11120 },
7995 { }
7996 },
7997 .chained = true,
7998 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7999 },
8000 [ALC256_FIXUP_ASUS_AIO_GPIO2] = {
8001 .type = HDA_FIXUP_FUNC,
8002
8003 .v.func = alc_fixup_gpio4,
8004 },
8005 [ALC233_FIXUP_ASUS_MIC_NO_PRESENCE] = {
8006 .type = HDA_FIXUP_PINS,
8007 .v.pins = (const struct hda_pintbl[]) {
8008 { 0x19, 0x01a1913c },
8009 { }
8010 },
8011 .chained = true,
8012 .chain_id = ALC269_FIXUP_HEADSET_MIC
8013 },
8014 [ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE] = {
8015 .type = HDA_FIXUP_VERBS,
8016 .v.verbs = (const struct hda_verb[]) {
8017
8018 {0x20, AC_VERB_SET_COEF_INDEX, 0x40},
8019 {0x20, AC_VERB_SET_PROC_COEF, 0x8800},
8020 {}
8021 },
8022 .chained = true,
8023 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
8024 },
8025 [ALC233_FIXUP_LENOVO_MULTI_CODECS] = {
8026 .type = HDA_FIXUP_FUNC,
8027 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
8028 .chained = true,
8029 .chain_id = ALC269_FIXUP_GPIO2
8030 },
8031 [ALC233_FIXUP_ACER_HEADSET_MIC] = {
8032 .type = HDA_FIXUP_VERBS,
8033 .v.verbs = (const struct hda_verb[]) {
8034 { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
8035 { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
8036 { }
8037 },
8038 .chained = true,
8039 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
8040 },
8041 [ALC294_FIXUP_LENOVO_MIC_LOCATION] = {
8042 .type = HDA_FIXUP_PINS,
8043 .v.pins = (const struct hda_pintbl[]) {
8044
8045
8046
8047
8048
8049 { 0x1a, 0x04a19040 },
8050 { }
8051 },
8052 },
8053 [ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE] = {
8054 .type = HDA_FIXUP_PINS,
8055 .v.pins = (const struct hda_pintbl[]) {
8056 { 0x16, 0x0101102f },
8057 { 0x19, 0x02a1913c },
8058 { 0x1a, 0x01a19030 },
8059 { 0x1b, 0x02011020 },
8060 { }
8061 },
8062 .chained = true,
8063 .chain_id = ALC225_FIXUP_S3_POP_NOISE
8064 },
8065 [ALC225_FIXUP_S3_POP_NOISE] = {
8066 .type = HDA_FIXUP_FUNC,
8067 .v.func = alc225_fixup_s3_pop_noise,
8068 .chained = true,
8069 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8070 },
8071 [ALC700_FIXUP_INTEL_REFERENCE] = {
8072 .type = HDA_FIXUP_VERBS,
8073 .v.verbs = (const struct hda_verb[]) {
8074
8075 {0x20, AC_VERB_SET_COEF_INDEX, 0x45},
8076 {0x20, AC_VERB_SET_PROC_COEF, 0x5289},
8077 {0x20, AC_VERB_SET_COEF_INDEX, 0x4A},
8078 {0x20, AC_VERB_SET_PROC_COEF, 0x001b},
8079 {0x58, AC_VERB_SET_COEF_INDEX, 0x00},
8080 {0x58, AC_VERB_SET_PROC_COEF, 0x3888},
8081 {0x20, AC_VERB_SET_COEF_INDEX, 0x6f},
8082 {0x20, AC_VERB_SET_PROC_COEF, 0x2c0b},
8083 {}
8084 }
8085 },
8086 [ALC274_FIXUP_DELL_BIND_DACS] = {
8087 .type = HDA_FIXUP_FUNC,
8088 .v.func = alc274_fixup_bind_dacs,
8089 .chained = true,
8090 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
8091 },
8092 [ALC274_FIXUP_DELL_AIO_LINEOUT_VERB] = {
8093 .type = HDA_FIXUP_PINS,
8094 .v.pins = (const struct hda_pintbl[]) {
8095 { 0x1b, 0x0401102f },
8096 { }
8097 },
8098 .chained = true,
8099 .chain_id = ALC274_FIXUP_DELL_BIND_DACS
8100 },
8101 [ALC298_FIXUP_TPT470_DOCK_FIX] = {
8102 .type = HDA_FIXUP_FUNC,
8103 .v.func = alc_fixup_tpt470_dock,
8104 .chained = true,
8105 .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE
8106 },
8107 [ALC298_FIXUP_TPT470_DOCK] = {
8108 .type = HDA_FIXUP_FUNC,
8109 .v.func = alc_fixup_tpt470_dacs,
8110 .chained = true,
8111 .chain_id = ALC298_FIXUP_TPT470_DOCK_FIX
8112 },
8113 [ALC255_FIXUP_DUMMY_LINEOUT_VERB] = {
8114 .type = HDA_FIXUP_PINS,
8115 .v.pins = (const struct hda_pintbl[]) {
8116 { 0x14, 0x0201101f },
8117 { }
8118 },
8119 .chained = true,
8120 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
8121 },
8122 [ALC255_FIXUP_DELL_HEADSET_MIC] = {
8123 .type = HDA_FIXUP_PINS,
8124 .v.pins = (const struct hda_pintbl[]) {
8125 { 0x19, 0x01a1913c },
8126 { }
8127 },
8128 .chained = true,
8129 .chain_id = ALC269_FIXUP_HEADSET_MIC
8130 },
8131 [ALC295_FIXUP_HP_X360] = {
8132 .type = HDA_FIXUP_FUNC,
8133 .v.func = alc295_fixup_hp_top_speakers,
8134 .chained = true,
8135 .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC3
8136 },
8137 [ALC221_FIXUP_HP_HEADSET_MIC] = {
8138 .type = HDA_FIXUP_PINS,
8139 .v.pins = (const struct hda_pintbl[]) {
8140 { 0x19, 0x0181313f},
8141 { }
8142 },
8143 .chained = true,
8144 .chain_id = ALC269_FIXUP_HEADSET_MIC
8145 },
8146 [ALC285_FIXUP_LENOVO_HEADPHONE_NOISE] = {
8147 .type = HDA_FIXUP_FUNC,
8148 .v.func = alc285_fixup_invalidate_dacs,
8149 .chained = true,
8150 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
8151 },
8152 [ALC295_FIXUP_HP_AUTO_MUTE] = {
8153 .type = HDA_FIXUP_FUNC,
8154 .v.func = alc_fixup_auto_mute_via_amp,
8155 },
8156 [ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE] = {
8157 .type = HDA_FIXUP_PINS,
8158 .v.pins = (const struct hda_pintbl[]) {
8159 { 0x18, 0x01a1913c },
8160 { }
8161 },
8162 .chained = true,
8163 .chain_id = ALC269_FIXUP_HEADSET_MIC
8164 },
8165 [ALC294_FIXUP_ASUS_MIC] = {
8166 .type = HDA_FIXUP_PINS,
8167 .v.pins = (const struct hda_pintbl[]) {
8168 { 0x13, 0x90a60160 },
8169 { 0x19, 0x04a11120 },
8170 { }
8171 },
8172 .chained = true,
8173 .chain_id = ALC269_FIXUP_HEADSET_MIC
8174 },
8175 [ALC294_FIXUP_ASUS_HEADSET_MIC] = {
8176 .type = HDA_FIXUP_PINS,
8177 .v.pins = (const struct hda_pintbl[]) {
8178 { 0x19, 0x01a1103c },
8179 { }
8180 },
8181 .chained = true,
8182 .chain_id = ALC269_FIXUP_HEADSET_MIC
8183 },
8184 [ALC294_FIXUP_ASUS_SPK] = {
8185 .type = HDA_FIXUP_VERBS,
8186 .v.verbs = (const struct hda_verb[]) {
8187
8188 { 0x20, AC_VERB_SET_COEF_INDEX, 0x40 },
8189 { 0x20, AC_VERB_SET_PROC_COEF, 0x8800 },
8190 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
8191 { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
8192 { }
8193 },
8194 .chained = true,
8195 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8196 },
8197 [ALC295_FIXUP_CHROME_BOOK] = {
8198 .type = HDA_FIXUP_FUNC,
8199 .v.func = alc295_fixup_chromebook,
8200 .chained = true,
8201 .chain_id = ALC225_FIXUP_HEADSET_JACK
8202 },
8203 [ALC225_FIXUP_HEADSET_JACK] = {
8204 .type = HDA_FIXUP_FUNC,
8205 .v.func = alc_fixup_headset_jack,
8206 },
8207 [ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
8208 .type = HDA_FIXUP_PINS,
8209 .v.pins = (const struct hda_pintbl[]) {
8210 { 0x1a, 0x01a1913c },
8211 { }
8212 },
8213 .chained = true,
8214 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8215 },
8216 [ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE] = {
8217 .type = HDA_FIXUP_VERBS,
8218 .v.verbs = (const struct hda_verb[]) {
8219
8220 { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
8221 { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
8222 { }
8223 },
8224 .chained = true,
8225 .chain_id = ALC285_FIXUP_LENOVO_HEADPHONE_NOISE
8226 },
8227 [ALC255_FIXUP_ACER_HEADSET_MIC] = {
8228 .type = HDA_FIXUP_PINS,
8229 .v.pins = (const struct hda_pintbl[]) {
8230 { 0x19, 0x03a11130 },
8231 { 0x1a, 0x90a60140 },
8232 { }
8233 },
8234 .chained = true,
8235 .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
8236 },
8237 [ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE] = {
8238 .type = HDA_FIXUP_PINS,
8239 .v.pins = (const struct hda_pintbl[]) {
8240 { 0x16, 0x01011020 },
8241 { 0x19, 0x01a1913c },
8242 { }
8243 },
8244 .chained = true,
8245 .chain_id = ALC225_FIXUP_WYSE_AUTO_MUTE
8246 },
8247 [ALC225_FIXUP_WYSE_AUTO_MUTE] = {
8248 .type = HDA_FIXUP_FUNC,
8249 .v.func = alc_fixup_auto_mute_via_amp,
8250 .chained = true,
8251 .chain_id = ALC225_FIXUP_WYSE_DISABLE_MIC_VREF
8252 },
8253 [ALC225_FIXUP_WYSE_DISABLE_MIC_VREF] = {
8254 .type = HDA_FIXUP_FUNC,
8255 .v.func = alc_fixup_disable_mic_vref,
8256 .chained = true,
8257 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8258 },
8259 [ALC286_FIXUP_ACER_AIO_HEADSET_MIC] = {
8260 .type = HDA_FIXUP_VERBS,
8261 .v.verbs = (const struct hda_verb[]) {
8262 { 0x20, AC_VERB_SET_COEF_INDEX, 0x4f },
8263 { 0x20, AC_VERB_SET_PROC_COEF, 0x5029 },
8264 { }
8265 },
8266 .chained = true,
8267 .chain_id = ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE
8268 },
8269 [ALC256_FIXUP_ASUS_HEADSET_MIC] = {
8270 .type = HDA_FIXUP_PINS,
8271 .v.pins = (const struct hda_pintbl[]) {
8272 { 0x19, 0x03a11020 },
8273 { }
8274 },
8275 .chained = true,
8276 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8277 },
8278 [ALC256_FIXUP_ASUS_MIC_NO_PRESENCE] = {
8279 .type = HDA_FIXUP_PINS,
8280 .v.pins = (const struct hda_pintbl[]) {
8281 { 0x19, 0x04a11120 },
8282 { }
8283 },
8284 .chained = true,
8285 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8286 },
8287 [ALC299_FIXUP_PREDATOR_SPK] = {
8288 .type = HDA_FIXUP_PINS,
8289 .v.pins = (const struct hda_pintbl[]) {
8290 { 0x21, 0x90170150 },
8291 { }
8292 }
8293 },
8294 [ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE] = {
8295 .type = HDA_FIXUP_PINS,
8296 .v.pins = (const struct hda_pintbl[]) {
8297 { 0x19, 0x04a11040 },
8298 { 0x21, 0x04211020 },
8299 { }
8300 },
8301 .chained = true,
8302 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8303 },
8304 [ALC289_FIXUP_DELL_SPK2] = {
8305 .type = HDA_FIXUP_PINS,
8306 .v.pins = (const struct hda_pintbl[]) {
8307 { 0x17, 0x90170130 },
8308 { }
8309 },
8310 .chained = true,
8311 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE
8312 },
8313 [ALC289_FIXUP_DUAL_SPK] = {
8314 .type = HDA_FIXUP_FUNC,
8315 .v.func = alc285_fixup_speaker2_to_dac1,
8316 .chained = true,
8317 .chain_id = ALC289_FIXUP_DELL_SPK2
8318 },
8319 [ALC294_FIXUP_SPK2_TO_DAC1] = {
8320 .type = HDA_FIXUP_FUNC,
8321 .v.func = alc285_fixup_speaker2_to_dac1,
8322 .chained = true,
8323 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8324 },
8325 [ALC294_FIXUP_ASUS_DUAL_SPK] = {
8326 .type = HDA_FIXUP_FUNC,
8327
8328 .v.func = alc_fixup_gpio4,
8329 .chained = true,
8330 .chain_id = ALC294_FIXUP_SPK2_TO_DAC1
8331 },
8332 [ALC285_FIXUP_THINKPAD_X1_GEN7] = {
8333 .type = HDA_FIXUP_FUNC,
8334 .v.func = alc285_fixup_thinkpad_x1_gen7,
8335 .chained = true,
8336 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
8337 },
8338 [ALC285_FIXUP_THINKPAD_HEADSET_JACK] = {
8339 .type = HDA_FIXUP_FUNC,
8340 .v.func = alc_fixup_headset_jack,
8341 .chained = true,
8342 .chain_id = ALC285_FIXUP_THINKPAD_X1_GEN7
8343 },
8344 [ALC294_FIXUP_ASUS_HPE] = {
8345 .type = HDA_FIXUP_VERBS,
8346 .v.verbs = (const struct hda_verb[]) {
8347
8348 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
8349 { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
8350 { }
8351 },
8352 .chained = true,
8353 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8354 },
8355 [ALC294_FIXUP_ASUS_GX502_PINS] = {
8356 .type = HDA_FIXUP_PINS,
8357 .v.pins = (const struct hda_pintbl[]) {
8358 { 0x19, 0x03a11050 },
8359 { 0x1a, 0x01a11830 },
8360 { 0x21, 0x03211020 },
8361 { }
8362 },
8363 .chained = true,
8364 .chain_id = ALC294_FIXUP_ASUS_GX502_VERBS
8365 },
8366 [ALC294_FIXUP_ASUS_GX502_VERBS] = {
8367 .type = HDA_FIXUP_VERBS,
8368 .v.verbs = (const struct hda_verb[]) {
8369
8370 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
8371
8372 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
8373 { }
8374 },
8375 .chained = true,
8376 .chain_id = ALC294_FIXUP_ASUS_GX502_HP
8377 },
8378 [ALC294_FIXUP_ASUS_GX502_HP] = {
8379 .type = HDA_FIXUP_FUNC,
8380 .v.func = alc294_fixup_gx502_hp,
8381 },
8382 [ALC294_FIXUP_ASUS_GU502_PINS] = {
8383 .type = HDA_FIXUP_PINS,
8384 .v.pins = (const struct hda_pintbl[]) {
8385 { 0x19, 0x01a11050 },
8386 { 0x1a, 0x01a11830 },
8387 { 0x21, 0x012110f0 },
8388 { }
8389 },
8390 .chained = true,
8391 .chain_id = ALC294_FIXUP_ASUS_GU502_VERBS
8392 },
8393 [ALC294_FIXUP_ASUS_GU502_VERBS] = {
8394 .type = HDA_FIXUP_VERBS,
8395 .v.verbs = (const struct hda_verb[]) {
8396
8397 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
8398
8399 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
8400
8401 { 0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
8402 { }
8403 },
8404 .chained = true,
8405 .chain_id = ALC294_FIXUP_ASUS_GU502_HP
8406 },
8407 [ALC294_FIXUP_ASUS_GU502_HP] = {
8408 .type = HDA_FIXUP_FUNC,
8409 .v.func = alc294_fixup_gu502_hp,
8410 },
8411 [ALC294_FIXUP_ASUS_G513_PINS] = {
8412 .type = HDA_FIXUP_PINS,
8413 .v.pins = (const struct hda_pintbl[]) {
8414 { 0x19, 0x03a11050 },
8415 { 0x1a, 0x03a11c30 },
8416 { 0x21, 0x03211420 },
8417 { }
8418 },
8419 },
8420 [ALC285_FIXUP_ASUS_G533Z_PINS] = {
8421 .type = HDA_FIXUP_PINS,
8422 .v.pins = (const struct hda_pintbl[]) {
8423 { 0x14, 0x90170120 },
8424 { }
8425 },
8426 .chained = true,
8427 .chain_id = ALC294_FIXUP_ASUS_G513_PINS,
8428 },
8429 [ALC294_FIXUP_ASUS_COEF_1B] = {
8430 .type = HDA_FIXUP_VERBS,
8431 .v.verbs = (const struct hda_verb[]) {
8432
8433
8434
8435 { 0x20, AC_VERB_SET_COEF_INDEX, 0x1b },
8436 { 0x20, AC_VERB_SET_PROC_COEF, 0x4e4b },
8437 { }
8438 },
8439 .chained = true,
8440 .chain_id = ALC289_FIXUP_ASUS_GA401,
8441 },
8442 [ALC285_FIXUP_HP_GPIO_LED] = {
8443 .type = HDA_FIXUP_FUNC,
8444 .v.func = alc285_fixup_hp_gpio_led,
8445 },
8446 [ALC285_FIXUP_HP_MUTE_LED] = {
8447 .type = HDA_FIXUP_FUNC,
8448 .v.func = alc285_fixup_hp_mute_led,
8449 },
8450 [ALC236_FIXUP_HP_GPIO_LED] = {
8451 .type = HDA_FIXUP_FUNC,
8452 .v.func = alc236_fixup_hp_gpio_led,
8453 },
8454 [ALC236_FIXUP_HP_MUTE_LED] = {
8455 .type = HDA_FIXUP_FUNC,
8456 .v.func = alc236_fixup_hp_mute_led,
8457 },
8458 [ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF] = {
8459 .type = HDA_FIXUP_FUNC,
8460 .v.func = alc236_fixup_hp_mute_led_micmute_vref,
8461 },
8462 [ALC298_FIXUP_SAMSUNG_AMP] = {
8463 .type = HDA_FIXUP_FUNC,
8464 .v.func = alc298_fixup_samsung_amp,
8465 .chained = true,
8466 .chain_id = ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET
8467 },
8468 [ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
8469 .type = HDA_FIXUP_VERBS,
8470 .v.verbs = (const struct hda_verb[]) {
8471 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc5 },
8472 { }
8473 },
8474 },
8475 [ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
8476 .type = HDA_FIXUP_VERBS,
8477 .v.verbs = (const struct hda_verb[]) {
8478 { 0x20, AC_VERB_SET_COEF_INDEX, 0x08},
8479 { 0x20, AC_VERB_SET_PROC_COEF, 0x2fcf},
8480 { }
8481 },
8482 },
8483 [ALC295_FIXUP_ASUS_MIC_NO_PRESENCE] = {
8484 .type = HDA_FIXUP_PINS,
8485 .v.pins = (const struct hda_pintbl[]) {
8486 { 0x19, 0x01a1913c },
8487 { }
8488 },
8489 .chained = true,
8490 .chain_id = ALC269_FIXUP_HEADSET_MODE
8491 },
8492 [ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS] = {
8493 .type = HDA_FIXUP_PINS,
8494 .v.pins = (const struct hda_pintbl[]) {
8495 { 0x14, 0x90100120 },
8496 { 0x18, 0x02a111f0 },
8497 { 0x1a, 0x01011020 },
8498 { },
8499 },
8500 .chained = true,
8501 .chain_id = ALC269_FIXUP_HEADSET_MIC
8502 },
8503 [ALC269VC_FIXUP_ACER_HEADSET_MIC] = {
8504 .type = HDA_FIXUP_PINS,
8505 .v.pins = (const struct hda_pintbl[]) {
8506 { 0x18, 0x02a11030 },
8507 { }
8508 },
8509 .chained = true,
8510 .chain_id = ALC269_FIXUP_HEADSET_MIC
8511 },
8512 [ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE] = {
8513 .type = HDA_FIXUP_PINS,
8514 .v.pins = (const struct hda_pintbl[]) {
8515 { 0x18, 0x01a11130 },
8516 { }
8517 },
8518 .chained = true,
8519 .chain_id = ALC269_FIXUP_HEADSET_MIC
8520 },
8521 [ALC289_FIXUP_ASUS_GA401] = {
8522 .type = HDA_FIXUP_FUNC,
8523 .v.func = alc289_fixup_asus_ga401,
8524 .chained = true,
8525 .chain_id = ALC289_FIXUP_ASUS_GA502,
8526 },
8527 [ALC289_FIXUP_ASUS_GA502] = {
8528 .type = HDA_FIXUP_PINS,
8529 .v.pins = (const struct hda_pintbl[]) {
8530 { 0x19, 0x03a11020 },
8531 { }
8532 },
8533 },
8534 [ALC256_FIXUP_ACER_MIC_NO_PRESENCE] = {
8535 .type = HDA_FIXUP_PINS,
8536 .v.pins = (const struct hda_pintbl[]) {
8537 { 0x19, 0x02a11120 },
8538 { }
8539 },
8540 .chained = true,
8541 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8542 },
8543 [ALC285_FIXUP_HP_GPIO_AMP_INIT] = {
8544 .type = HDA_FIXUP_FUNC,
8545 .v.func = alc285_fixup_hp_gpio_amp_init,
8546 .chained = true,
8547 .chain_id = ALC285_FIXUP_HP_GPIO_LED
8548 },
8549 [ALC269_FIXUP_CZC_B20] = {
8550 .type = HDA_FIXUP_PINS,
8551 .v.pins = (const struct hda_pintbl[]) {
8552 { 0x12, 0x411111f0 },
8553 { 0x14, 0x90170110 },
8554 { 0x15, 0x032f1020 },
8555 { 0x17, 0x411111f0 },
8556 { 0x18, 0x03ab1040 },
8557 { 0x19, 0xb7a7013f },
8558 { 0x1a, 0x0181305f },
8559 { 0x1b, 0x411111f0 },
8560 { 0x1d, 0x411111f0 },
8561 { 0x1e, 0x411111f0 },
8562 { }
8563 },
8564 .chain_id = ALC269_FIXUP_DMIC,
8565 },
8566 [ALC269_FIXUP_CZC_TMI] = {
8567 .type = HDA_FIXUP_PINS,
8568 .v.pins = (const struct hda_pintbl[]) {
8569 { 0x12, 0x4000c000 },
8570 { 0x14, 0x90170110 },
8571 { 0x15, 0x0421401f },
8572 { 0x17, 0x411111f0 },
8573 { 0x18, 0x04a19020 },
8574 { 0x19, 0x411111f0 },
8575 { 0x1a, 0x411111f0 },
8576 { 0x1b, 0x411111f0 },
8577 { 0x1d, 0x40448505 },
8578 { 0x1e, 0x411111f0 },
8579 { 0x20, 0x8000ffff },
8580 { }
8581 },
8582 .chain_id = ALC269_FIXUP_DMIC,
8583 },
8584 [ALC269_FIXUP_CZC_L101] = {
8585 .type = HDA_FIXUP_PINS,
8586 .v.pins = (const struct hda_pintbl[]) {
8587 { 0x12, 0x40000000 },
8588 { 0x14, 0x01014010 },
8589 { 0x15, 0x411111f0 },
8590 { 0x16, 0x411111f0 },
8591 { 0x18, 0x01a19020 },
8592 { 0x19, 0x02a19021 },
8593 { 0x1a, 0x0181302f },
8594 { 0x1b, 0x0221401f },
8595 { 0x1c, 0x411111f0 },
8596 { 0x1d, 0x4044c601 },
8597 { 0x1e, 0x411111f0 },
8598 { }
8599 },
8600 .chain_id = ALC269_FIXUP_DMIC,
8601 },
8602 [ALC269_FIXUP_LEMOTE_A1802] = {
8603 .type = HDA_FIXUP_PINS,
8604 .v.pins = (const struct hda_pintbl[]) {
8605 { 0x12, 0x40000000 },
8606 { 0x14, 0x90170110 },
8607 { 0x17, 0x411111f0 },
8608 { 0x18, 0x03a19040 },
8609 { 0x19, 0x90a70130 },
8610 { 0x1a, 0x411111f0 },
8611 { 0x1b, 0x411111f0 },
8612 { 0x1d, 0x40489d2d },
8613 { 0x1e, 0x411111f0 },
8614 { 0x20, 0x0003ffff },
8615 { 0x21, 0x03214020 },
8616 { }
8617 },
8618 .chain_id = ALC269_FIXUP_DMIC,
8619 },
8620 [ALC269_FIXUP_LEMOTE_A190X] = {
8621 .type = HDA_FIXUP_PINS,
8622 .v.pins = (const struct hda_pintbl[]) {
8623 { 0x14, 0x99130110 },
8624 { 0x15, 0x0121401f },
8625 { 0x18, 0x01a19c20 },
8626 { 0x19, 0x99a3092f },
8627 { 0x1b, 0x0201401f },
8628 { }
8629 },
8630 .chain_id = ALC269_FIXUP_DMIC,
8631 },
8632 [ALC256_FIXUP_INTEL_NUC8_RUGGED] = {
8633 .type = HDA_FIXUP_PINS,
8634 .v.pins = (const struct hda_pintbl[]) {
8635 { 0x1b, 0x01a1913c },
8636 { }
8637 },
8638 .chained = true,
8639 .chain_id = ALC269_FIXUP_HEADSET_MODE
8640 },
8641 [ALC256_FIXUP_INTEL_NUC10] = {
8642 .type = HDA_FIXUP_PINS,
8643 .v.pins = (const struct hda_pintbl[]) {
8644 { 0x19, 0x01a1913c },
8645 { }
8646 },
8647 .chained = true,
8648 .chain_id = ALC269_FIXUP_HEADSET_MODE
8649 },
8650 [ALC255_FIXUP_XIAOMI_HEADSET_MIC] = {
8651 .type = HDA_FIXUP_VERBS,
8652 .v.verbs = (const struct hda_verb[]) {
8653 { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
8654 { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
8655 { }
8656 },
8657 .chained = true,
8658 .chain_id = ALC289_FIXUP_ASUS_GA502
8659 },
8660 [ALC274_FIXUP_HP_MIC] = {
8661 .type = HDA_FIXUP_VERBS,
8662 .v.verbs = (const struct hda_verb[]) {
8663 { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
8664 { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
8665 { }
8666 },
8667 },
8668 [ALC274_FIXUP_HP_HEADSET_MIC] = {
8669 .type = HDA_FIXUP_FUNC,
8670 .v.func = alc274_fixup_hp_headset_mic,
8671 .chained = true,
8672 .chain_id = ALC274_FIXUP_HP_MIC
8673 },
8674 [ALC274_FIXUP_HP_ENVY_GPIO] = {
8675 .type = HDA_FIXUP_FUNC,
8676 .v.func = alc274_fixup_hp_envy_gpio,
8677 },
8678 [ALC256_FIXUP_ASUS_HPE] = {
8679 .type = HDA_FIXUP_VERBS,
8680 .v.verbs = (const struct hda_verb[]) {
8681
8682 { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
8683 { 0x20, AC_VERB_SET_PROC_COEF, 0x7778 },
8684 { }
8685 },
8686 .chained = true,
8687 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8688 },
8689 [ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK] = {
8690 .type = HDA_FIXUP_FUNC,
8691 .v.func = alc_fixup_headset_jack,
8692 .chained = true,
8693 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
8694 },
8695 [ALC287_FIXUP_HP_GPIO_LED] = {
8696 .type = HDA_FIXUP_FUNC,
8697 .v.func = alc287_fixup_hp_gpio_led,
8698 },
8699 [ALC256_FIXUP_HP_HEADSET_MIC] = {
8700 .type = HDA_FIXUP_FUNC,
8701 .v.func = alc274_fixup_hp_headset_mic,
8702 },
8703 [ALC236_FIXUP_DELL_AIO_HEADSET_MIC] = {
8704 .type = HDA_FIXUP_FUNC,
8705 .v.func = alc_fixup_no_int_mic,
8706 .chained = true,
8707 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
8708 },
8709 [ALC282_FIXUP_ACER_DISABLE_LINEOUT] = {
8710 .type = HDA_FIXUP_PINS,
8711 .v.pins = (const struct hda_pintbl[]) {
8712 { 0x1b, 0x411111f0 },
8713 { 0x18, 0x01a1913c },
8714 { },
8715 },
8716 .chained = true,
8717 .chain_id = ALC269_FIXUP_HEADSET_MODE
8718 },
8719 [ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST] = {
8720 .type = HDA_FIXUP_FUNC,
8721 .v.func = alc269_fixup_limit_int_mic_boost,
8722 .chained = true,
8723 .chain_id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
8724 },
8725 [ALC256_FIXUP_ACER_HEADSET_MIC] = {
8726 .type = HDA_FIXUP_PINS,
8727 .v.pins = (const struct hda_pintbl[]) {
8728 { 0x19, 0x02a1113c },
8729 { 0x1a, 0x90a1092f },
8730 { }
8731 },
8732 .chained = true,
8733 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8734 },
8735 [ALC285_FIXUP_IDEAPAD_S740_COEF] = {
8736 .type = HDA_FIXUP_FUNC,
8737 .v.func = alc285_fixup_ideapad_s740_coef,
8738 .chained = true,
8739 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
8740 },
8741 [ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST] = {
8742 .type = HDA_FIXUP_FUNC,
8743 .v.func = alc269_fixup_limit_int_mic_boost,
8744 .chained = true,
8745 .chain_id = ALC285_FIXUP_HP_MUTE_LED,
8746 },
8747 [ALC295_FIXUP_ASUS_DACS] = {
8748 .type = HDA_FIXUP_FUNC,
8749 .v.func = alc295_fixup_asus_dacs,
8750 },
8751 [ALC295_FIXUP_HP_OMEN] = {
8752 .type = HDA_FIXUP_PINS,
8753 .v.pins = (const struct hda_pintbl[]) {
8754 { 0x12, 0xb7a60130 },
8755 { 0x13, 0x40000000 },
8756 { 0x14, 0x411111f0 },
8757 { 0x16, 0x411111f0 },
8758 { 0x17, 0x90170110 },
8759 { 0x18, 0x411111f0 },
8760 { 0x19, 0x02a11030 },
8761 { 0x1a, 0x411111f0 },
8762 { 0x1b, 0x04a19030 },
8763 { 0x1d, 0x40600001 },
8764 { 0x1e, 0x411111f0 },
8765 { 0x21, 0x03211020 },
8766 {}
8767 },
8768 .chained = true,
8769 .chain_id = ALC269_FIXUP_HP_LINE1_MIC1_LED,
8770 },
8771 [ALC285_FIXUP_HP_SPECTRE_X360] = {
8772 .type = HDA_FIXUP_FUNC,
8773 .v.func = alc285_fixup_hp_spectre_x360,
8774 },
8775 [ALC285_FIXUP_HP_SPECTRE_X360_EB1] = {
8776 .type = HDA_FIXUP_FUNC,
8777 .v.func = alc285_fixup_hp_spectre_x360_eb1
8778 },
8779 [ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP] = {
8780 .type = HDA_FIXUP_FUNC,
8781 .v.func = alc285_fixup_ideapad_s740_coef,
8782 .chained = true,
8783 .chain_id = ALC285_FIXUP_THINKPAD_HEADSET_JACK,
8784 },
8785 [ALC623_FIXUP_LENOVO_THINKSTATION_P340] = {
8786 .type = HDA_FIXUP_FUNC,
8787 .v.func = alc_fixup_no_shutup,
8788 .chained = true,
8789 .chain_id = ALC283_FIXUP_HEADSET_MIC,
8790 },
8791 [ALC255_FIXUP_ACER_HEADPHONE_AND_MIC] = {
8792 .type = HDA_FIXUP_PINS,
8793 .v.pins = (const struct hda_pintbl[]) {
8794 { 0x21, 0x03211030 },
8795 { }
8796 },
8797 .chained = true,
8798 .chain_id = ALC255_FIXUP_XIAOMI_HEADSET_MIC
8799 },
8800 [ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST] = {
8801 .type = HDA_FIXUP_FUNC,
8802 .v.func = alc269_fixup_limit_int_mic_boost,
8803 .chained = true,
8804 .chain_id = ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,
8805 },
8806 [ALC285_FIXUP_LEGION_Y9000X_SPEAKERS] = {
8807 .type = HDA_FIXUP_FUNC,
8808 .v.func = alc285_fixup_ideapad_s740_coef,
8809 .chained = true,
8810 .chain_id = ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,
8811 },
8812 [ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE] = {
8813 .type = HDA_FIXUP_FUNC,
8814 .v.func = alc287_fixup_legion_15imhg05_speakers,
8815 .chained = true,
8816 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
8817 },
8818 [ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS] = {
8819 .type = HDA_FIXUP_VERBS,
8820
8821 .v.verbs = (const struct hda_verb[]) {
8822
8823 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
8824 { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
8825
8826 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8827 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
8828 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8829 { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
8830 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8831
8832 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8833 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
8834 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8835 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8836 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8837
8838
8839 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
8840 { 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
8841
8842 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8843 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
8844 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8845 { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
8846 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8847
8848 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8849 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
8850 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8851 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8852 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8853 {}
8854 },
8855 .chained = true,
8856 .chain_id = ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,
8857 },
8858 [ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE] = {
8859 .type = HDA_FIXUP_FUNC,
8860 .v.func = alc287_fixup_legion_15imhg05_speakers,
8861 .chained = true,
8862 .chain_id = ALC269_FIXUP_HEADSET_MODE,
8863 },
8864 [ALC287_FIXUP_YOGA7_14ITL_SPEAKERS] = {
8865 .type = HDA_FIXUP_VERBS,
8866 .v.verbs = (const struct hda_verb[]) {
8867
8868 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
8869 { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
8870
8871 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8872 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
8873 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8874 { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
8875 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8876
8877 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8878 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
8879 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8880 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8881 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8882
8883
8884 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
8885 { 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
8886
8887 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8888 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
8889 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8890 { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
8891 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8892
8893 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8894 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
8895 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8896 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8897 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8898 {}
8899 },
8900 .chained = true,
8901 .chain_id = ALC269_FIXUP_HEADSET_MODE,
8902 },
8903 [ALC298_FIXUP_LENOVO_C940_DUET7] = {
8904 .type = HDA_FIXUP_FUNC,
8905 .v.func = alc298_fixup_lenovo_c940_duet7,
8906 },
8907 [ALC287_FIXUP_13S_GEN2_SPEAKERS] = {
8908 .type = HDA_FIXUP_VERBS,
8909 .v.verbs = (const struct hda_verb[]) {
8910 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
8911 { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
8912 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8913 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
8914 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8915 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8916 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8917 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
8918 { 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
8919 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
8920 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
8921 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8922 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
8923 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
8924 {}
8925 },
8926 .chained = true,
8927 .chain_id = ALC269_FIXUP_HEADSET_MODE,
8928 },
8929 [ALC256_FIXUP_SET_COEF_DEFAULTS] = {
8930 .type = HDA_FIXUP_FUNC,
8931 .v.func = alc256_fixup_set_coef_defaults,
8932 },
8933 [ALC245_FIXUP_HP_GPIO_LED] = {
8934 .type = HDA_FIXUP_FUNC,
8935 .v.func = alc245_fixup_hp_gpio_led,
8936 },
8937 [ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
8938 .type = HDA_FIXUP_PINS,
8939 .v.pins = (const struct hda_pintbl[]) {
8940 { 0x19, 0x03a11120 },
8941 { }
8942 },
8943 .chained = true,
8944 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
8945 },
8946 [ALC233_FIXUP_NO_AUDIO_JACK] = {
8947 .type = HDA_FIXUP_FUNC,
8948 .v.func = alc233_fixup_no_audio_jack,
8949 },
8950 [ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME] = {
8951 .type = HDA_FIXUP_FUNC,
8952 .v.func = alc256_fixup_mic_no_presence_and_resume,
8953 .chained = true,
8954 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8955 },
8956 [ALC287_FIXUP_LEGION_16ACHG6] = {
8957 .type = HDA_FIXUP_FUNC,
8958 .v.func = alc287_fixup_legion_16achg6_speakers,
8959 },
8960 [ALC287_FIXUP_CS35L41_I2C_2] = {
8961 .type = HDA_FIXUP_FUNC,
8962 .v.func = cs35l41_fixup_i2c_two,
8963 .chained = true,
8964 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
8965 },
8966 [ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED] = {
8967 .type = HDA_FIXUP_FUNC,
8968 .v.func = cs35l41_fixup_i2c_two,
8969 .chained = true,
8970 .chain_id = ALC285_FIXUP_HP_MUTE_LED,
8971 },
8972 [ALC245_FIXUP_CS35L41_SPI_2] = {
8973 .type = HDA_FIXUP_FUNC,
8974 .v.func = cs35l41_fixup_spi_two,
8975 },
8976 [ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED] = {
8977 .type = HDA_FIXUP_FUNC,
8978 .v.func = cs35l41_fixup_spi_two,
8979 .chained = true,
8980 .chain_id = ALC285_FIXUP_HP_GPIO_LED,
8981 },
8982 [ALC245_FIXUP_CS35L41_SPI_4] = {
8983 .type = HDA_FIXUP_FUNC,
8984 .v.func = cs35l41_fixup_spi_four,
8985 },
8986 [ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED] = {
8987 .type = HDA_FIXUP_FUNC,
8988 .v.func = cs35l41_fixup_spi_four,
8989 .chained = true,
8990 .chain_id = ALC285_FIXUP_HP_GPIO_LED,
8991 },
8992 [ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED] = {
8993 .type = HDA_FIXUP_VERBS,
8994 .v.verbs = (const struct hda_verb[]) {
8995 { 0x20, AC_VERB_SET_COEF_INDEX, 0x19 },
8996 { 0x20, AC_VERB_SET_PROC_COEF, 0x8e11 },
8997 { }
8998 },
8999 .chained = true,
9000 .chain_id = ALC285_FIXUP_HP_MUTE_LED,
9001 },
9002 [ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET] = {
9003 .type = HDA_FIXUP_FUNC,
9004 .v.func = alc_fixup_dell4_mic_no_presence_quiet,
9005 .chained = true,
9006 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
9007 },
9008 [ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE] = {
9009 .type = HDA_FIXUP_PINS,
9010 .v.pins = (const struct hda_pintbl[]) {
9011 { 0x19, 0x02a1112c },
9012 { }
9013 },
9014 .chained = true,
9015 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
9016 },
9017 [ALC287_FIXUP_LEGION_16ITHG6] = {
9018 .type = HDA_FIXUP_FUNC,
9019 .v.func = alc287_fixup_legion_16ithg6_speakers,
9020 },
9021 [ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK] = {
9022 .type = HDA_FIXUP_VERBS,
9023 .v.verbs = (const struct hda_verb[]) {
9024
9025 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9026 { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
9027
9028 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9029 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9030 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9031 { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
9032 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9033
9034 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9035 { 0x20, AC_VERB_SET_PROC_COEF, 0xf },
9036 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9037 { 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
9038 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9039
9040 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9041 { 0x20, AC_VERB_SET_PROC_COEF, 0x10 },
9042 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9043 { 0x20, AC_VERB_SET_PROC_COEF, 0x40 },
9044 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9045
9046 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9047 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9048 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9049 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9050 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9051
9052
9053 { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9054 { 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
9055
9056 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9057 { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9058 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9059 { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
9060 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9061
9062 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9063 { 0x20, AC_VERB_SET_PROC_COEF, 0xf },
9064 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9065 { 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
9066 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9067
9068 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9069 { 0x20, AC_VERB_SET_PROC_COEF, 0x10 },
9070 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9071 { 0x20, AC_VERB_SET_PROC_COEF, 0x44 },
9072 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9073
9074 { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9075 { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9076 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9077 { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9078 { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9079
9080 { },
9081 },
9082 },
9083 [ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN] = {
9084 .type = HDA_FIXUP_FUNC,
9085 .v.func = alc287_fixup_yoga9_14iap7_bass_spk_pin,
9086 .chained = true,
9087 .chain_id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK,
9088 },
9089 };
9090
9091 static const struct snd_pci_quirk alc269_fixup_tbl[] = {
9092 SND_PCI_QUIRK(0x1025, 0x0283, "Acer TravelMate 8371", ALC269_FIXUP_INV_DMIC),
9093 SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC),
9094 SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC),
9095 SND_PCI_QUIRK(0x1025, 0x047c, "Acer AC700", ALC269_FIXUP_ACER_AC700),
9096 SND_PCI_QUIRK(0x1025, 0x072d, "Acer Aspire V5-571G", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
9097 SND_PCI_QUIRK(0x1025, 0x0740, "Acer AO725", ALC271_FIXUP_HP_GATE_MIC_JACK),
9098 SND_PCI_QUIRK(0x1025, 0x0742, "Acer AO756", ALC271_FIXUP_HP_GATE_MIC_JACK),
9099 SND_PCI_QUIRK(0x1025, 0x0762, "Acer Aspire E1-472", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
9100 SND_PCI_QUIRK(0x1025, 0x0775, "Acer Aspire E1-572", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
9101 SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS),
9102 SND_PCI_QUIRK(0x1025, 0x080d, "Acer Aspire V5-122P", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
9103 SND_PCI_QUIRK(0x1025, 0x0840, "Acer Aspire E1", ALC269VB_FIXUP_ASPIRE_E1_COEF),
9104 SND_PCI_QUIRK(0x1025, 0x101c, "Acer Veriton N2510G", ALC269_FIXUP_LIFEBOOK),
9105 SND_PCI_QUIRK(0x1025, 0x102b, "Acer Aspire C24-860", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE),
9106 SND_PCI_QUIRK(0x1025, 0x1065, "Acer Aspire C20-820", ALC269VC_FIXUP_ACER_HEADSET_MIC),
9107 SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK),
9108 SND_PCI_QUIRK(0x1025, 0x1094, "Acer Aspire E5-575T", ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST),
9109 SND_PCI_QUIRK(0x1025, 0x1099, "Acer Aspire E5-523G", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9110 SND_PCI_QUIRK(0x1025, 0x110e, "Acer Aspire ES1-432", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9111 SND_PCI_QUIRK(0x1025, 0x1166, "Acer Veriton N4640G", ALC269_FIXUP_LIFEBOOK),
9112 SND_PCI_QUIRK(0x1025, 0x1167, "Acer Veriton N6640G", ALC269_FIXUP_LIFEBOOK),
9113 SND_PCI_QUIRK(0x1025, 0x1246, "Acer Predator Helios 500", ALC299_FIXUP_PREDATOR_SPK),
9114 SND_PCI_QUIRK(0x1025, 0x1247, "Acer vCopperbox", ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS),
9115 SND_PCI_QUIRK(0x1025, 0x1248, "Acer Veriton N4660G", ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE),
9116 SND_PCI_QUIRK(0x1025, 0x1269, "Acer SWIFT SF314-54", ALC256_FIXUP_ACER_HEADSET_MIC),
9117 SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
9118 SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
9119 SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
9120 SND_PCI_QUIRK(0x1025, 0x129c, "Acer SWIFT SF314-55", ALC256_FIXUP_ACER_HEADSET_MIC),
9121 SND_PCI_QUIRK(0x1025, 0x129d, "Acer SWIFT SF313-51", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
9122 SND_PCI_QUIRK(0x1025, 0x1300, "Acer SWIFT SF314-56", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
9123 SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
9124 SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", ALC233_FIXUP_ACER_HEADSET_MIC),
9125 SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC),
9126 SND_PCI_QUIRK(0x1025, 0x141f, "Acer Spin SP513-54N", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9127 SND_PCI_QUIRK(0x1025, 0x142b, "Acer Swift SF314-42", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9128 SND_PCI_QUIRK(0x1025, 0x1430, "Acer TravelMate B311R-31", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
9129 SND_PCI_QUIRK(0x1025, 0x1466, "Acer Aspire A515-56", ALC255_FIXUP_ACER_HEADPHONE_AND_MIC),
9130 SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
9131 SND_PCI_QUIRK(0x1028, 0x053c, "Dell Latitude E5430", ALC292_FIXUP_DELL_E7X),
9132 SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS),
9133 SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X),
9134 SND_PCI_QUIRK(0x1028, 0x05be, "Dell Latitude E6540", ALC292_FIXUP_DELL_E7X),
9135 SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X),
9136 SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X),
9137 SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER),
9138 SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
9139 SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
9140 SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
9141 SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
9142 SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
9143 SND_PCI_QUIRK(0x1028, 0x062c, "Dell Latitude E5550", ALC292_FIXUP_DELL_E7X),
9144 SND_PCI_QUIRK(0x1028, 0x062e, "Dell Latitude E7450", ALC292_FIXUP_DELL_E7X),
9145 SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),
9146 SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9147 SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9148 SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13),
9149 SND_PCI_QUIRK(0x1028, 0x0669, "Dell Optiplex 9020m", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
9150 SND_PCI_QUIRK(0x1028, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK),
9151 SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
9152 SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9153 SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9154 SND_PCI_QUIRK(0x1028, 0x06db, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9155 SND_PCI_QUIRK(0x1028, 0x06dd, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9156 SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9157 SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9158 SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9159 SND_PCI_QUIRK(0x1028, 0x0706, "Dell Inspiron 7559", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
9160 SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE),
9161 SND_PCI_QUIRK(0x1028, 0x0738, "Dell Precision 5820", ALC269_FIXUP_NO_SHUTUP),
9162 SND_PCI_QUIRK(0x1028, 0x075c, "Dell XPS 27 7760", ALC298_FIXUP_SPK_VOLUME),
9163 SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME),
9164 SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
9165 SND_PCI_QUIRK(0x1028, 0x07b0, "Dell Precision 7520", ALC295_FIXUP_DISABLE_DAC3),
9166 SND_PCI_QUIRK(0x1028, 0x080c, "Dell WYSE", ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE),
9167 SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
9168 SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
9169 SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
9170 SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
9171 SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB),
9172 SND_PCI_QUIRK(0x1028, 0x087d, "Dell Precision 5530", ALC289_FIXUP_DUAL_SPK),
9173 SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE),
9174 SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE),
9175 SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
9176 SND_PCI_QUIRK(0x1028, 0x097d, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
9177 SND_PCI_QUIRK(0x1028, 0x097e, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
9178 SND_PCI_QUIRK(0x1028, 0x098d, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
9179 SND_PCI_QUIRK(0x1028, 0x09bf, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
9180 SND_PCI_QUIRK(0x1028, 0x0a2e, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
9181 SND_PCI_QUIRK(0x1028, 0x0a30, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
9182 SND_PCI_QUIRK(0x1028, 0x0a38, "Dell Latitude 7520", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET),
9183 SND_PCI_QUIRK(0x1028, 0x0a58, "Dell", ALC255_FIXUP_DELL_HEADSET_MIC),
9184 SND_PCI_QUIRK(0x1028, 0x0a61, "Dell XPS 15 9510", ALC289_FIXUP_DUAL_SPK),
9185 SND_PCI_QUIRK(0x1028, 0x0a62, "Dell Precision 5560", ALC289_FIXUP_DUAL_SPK),
9186 SND_PCI_QUIRK(0x1028, 0x0a9d, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
9187 SND_PCI_QUIRK(0x1028, 0x0a9e, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
9188 SND_PCI_QUIRK(0x1028, 0x0b19, "Dell XPS 15 9520", ALC289_FIXUP_DUAL_SPK),
9189 SND_PCI_QUIRK(0x1028, 0x0b1a, "Dell Precision 5570", ALC289_FIXUP_DUAL_SPK),
9190 SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9191 SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9192 SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
9193 SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),
9194 SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED),
9195 SND_PCI_QUIRK(0x103c, 0x21f9, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9196 SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9197 SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9198 SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9199 SND_PCI_QUIRK(0x103c, 0x221c, "HP EliteBook 755 G2", ALC280_FIXUP_HP_HEADSET_MIC),
9200 SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9201 SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9202 SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9203 SND_PCI_QUIRK(0x103c, 0x2237, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9204 SND_PCI_QUIRK(0x103c, 0x2238, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9205 SND_PCI_QUIRK(0x103c, 0x2239, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9206 SND_PCI_QUIRK(0x103c, 0x224b, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9207 SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9208 SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9209 SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9210 SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9211 SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9212 SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9213 SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED),
9214 SND_PCI_QUIRK(0x103c, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY),
9215 SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9216 SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9217 SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9218 SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9219 SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9220 SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9221 SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9222 SND_PCI_QUIRK(0x103c, 0x226e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9223 SND_PCI_QUIRK(0x103c, 0x2271, "HP", ALC286_FIXUP_HP_GPIO_LED),
9224 SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9225 SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC280_FIXUP_HP_DOCK_PINS),
9226 SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9227 SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC280_FIXUP_HP_DOCK_PINS),
9228 SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9229 SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9230 SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9231 SND_PCI_QUIRK(0x103c, 0x228b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9232 SND_PCI_QUIRK(0x103c, 0x228e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9233 SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9234 SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9235 SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9236 SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9237 SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9238 SND_PCI_QUIRK(0x103c, 0x22c5, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9239 SND_PCI_QUIRK(0x103c, 0x22c7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9240 SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9241 SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9242 SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC280_FIXUP_HP_9480M),
9243 SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9244 SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9245 SND_PCI_QUIRK(0x103c, 0x2334, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9246 SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9247 SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9248 SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9249 SND_PCI_QUIRK(0x103c, 0x2b5e, "HP 288 Pro G2 MT", ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE),
9250 SND_PCI_QUIRK(0x103c, 0x802e, "HP Z240 SFF", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9251 SND_PCI_QUIRK(0x103c, 0x802f, "HP Z240", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9252 SND_PCI_QUIRK(0x103c, 0x8077, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
9253 SND_PCI_QUIRK(0x103c, 0x8158, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
9254 SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9255 SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC),
9256 SND_PCI_QUIRK(0x103c, 0x827e, "HP x360", ALC295_FIXUP_HP_X360),
9257 SND_PCI_QUIRK(0x103c, 0x827f, "HP x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9258 SND_PCI_QUIRK(0x103c, 0x82bf, "HP G3 mini", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9259 SND_PCI_QUIRK(0x103c, 0x82c0, "HP G3 mini premium", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9260 SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9261 SND_PCI_QUIRK(0x103c, 0x841c, "HP Pavilion 15-CK0xx", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9262 SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9263 SND_PCI_QUIRK(0x103c, 0x84da, "HP OMEN dc0019-ur", ALC295_FIXUP_HP_OMEN),
9264 SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9265 SND_PCI_QUIRK(0x103c, 0x8519, "HP Spectre x360 15-df0xxx", ALC285_FIXUP_HP_SPECTRE_X360),
9266 SND_PCI_QUIRK(0x103c, 0x860f, "HP ZBook 15 G6", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9267 SND_PCI_QUIRK(0x103c, 0x861f, "HP Elite Dragonfly G1", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9268 SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED),
9269 SND_PCI_QUIRK(0x103c, 0x86c7, "HP Envy AiO 32", ALC274_FIXUP_HP_ENVY_GPIO),
9270 SND_PCI_QUIRK(0x103c, 0x86e7, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
9271 SND_PCI_QUIRK(0x103c, 0x86e8, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
9272 SND_PCI_QUIRK(0x103c, 0x8716, "HP Elite Dragonfly G2 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9273 SND_PCI_QUIRK(0x103c, 0x8720, "HP EliteBook x360 1040 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9274 SND_PCI_QUIRK(0x103c, 0x8724, "HP EliteBook 850 G7", ALC285_FIXUP_HP_GPIO_LED),
9275 SND_PCI_QUIRK(0x103c, 0x8728, "HP EliteBook 840 G7", ALC285_FIXUP_HP_GPIO_LED),
9276 SND_PCI_QUIRK(0x103c, 0x8729, "HP", ALC285_FIXUP_HP_GPIO_LED),
9277 SND_PCI_QUIRK(0x103c, 0x8730, "HP ProBook 445 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9278 SND_PCI_QUIRK(0x103c, 0x8735, "HP ProBook 435 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9279 SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9280 SND_PCI_QUIRK(0x103c, 0x8760, "HP", ALC285_FIXUP_HP_MUTE_LED),
9281 SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED),
9282 SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED),
9283 SND_PCI_QUIRK(0x103c, 0x8780, "HP ZBook Fury 17 G7 Mobile Workstation",
9284 ALC285_FIXUP_HP_GPIO_AMP_INIT),
9285 SND_PCI_QUIRK(0x103c, 0x8783, "HP ZBook Fury 15 G7 Mobile Workstation",
9286 ALC285_FIXUP_HP_GPIO_AMP_INIT),
9287 SND_PCI_QUIRK(0x103c, 0x8786, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
9288 SND_PCI_QUIRK(0x103c, 0x8787, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
9289 SND_PCI_QUIRK(0x103c, 0x8788, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
9290 SND_PCI_QUIRK(0x103c, 0x87c8, "HP", ALC287_FIXUP_HP_GPIO_LED),
9291 SND_PCI_QUIRK(0x103c, 0x87e5, "HP ProBook 440 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9292 SND_PCI_QUIRK(0x103c, 0x87e7, "HP ProBook 450 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9293 SND_PCI_QUIRK(0x103c, 0x87f1, "HP ProBook 630 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9294 SND_PCI_QUIRK(0x103c, 0x87f2, "HP ProBook 640 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9295 SND_PCI_QUIRK(0x103c, 0x87f4, "HP", ALC287_FIXUP_HP_GPIO_LED),
9296 SND_PCI_QUIRK(0x103c, 0x87f5, "HP", ALC287_FIXUP_HP_GPIO_LED),
9297 SND_PCI_QUIRK(0x103c, 0x87f6, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
9298 SND_PCI_QUIRK(0x103c, 0x87f7, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
9299 SND_PCI_QUIRK(0x103c, 0x8805, "HP ProBook 650 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9300 SND_PCI_QUIRK(0x103c, 0x880d, "HP EliteBook 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9301 SND_PCI_QUIRK(0x103c, 0x8811, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
9302 SND_PCI_QUIRK(0x103c, 0x8812, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
9303 SND_PCI_QUIRK(0x103c, 0x8846, "HP EliteBook 850 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9304 SND_PCI_QUIRK(0x103c, 0x8847, "HP EliteBook x360 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9305 SND_PCI_QUIRK(0x103c, 0x884b, "HP EliteBook 840 Aero G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9306 SND_PCI_QUIRK(0x103c, 0x884c, "HP EliteBook 840 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9307 SND_PCI_QUIRK(0x103c, 0x8862, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST),
9308 SND_PCI_QUIRK(0x103c, 0x8863, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST),
9309 SND_PCI_QUIRK(0x103c, 0x886d, "HP ZBook Fury 17.3 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9310 SND_PCI_QUIRK(0x103c, 0x8870, "HP ZBook Fury 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9311 SND_PCI_QUIRK(0x103c, 0x8873, "HP ZBook Studio 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9312 SND_PCI_QUIRK(0x103c, 0x888d, "HP ZBook Power 15.6 inch G8 Mobile Workstation PC", ALC236_FIXUP_HP_GPIO_LED),
9313 SND_PCI_QUIRK(0x103c, 0x8895, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED),
9314 SND_PCI_QUIRK(0x103c, 0x8896, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_MUTE_LED),
9315 SND_PCI_QUIRK(0x103c, 0x8898, "HP EliteBook 845 G8 Notebook PC", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),
9316 SND_PCI_QUIRK(0x103c, 0x88d0, "HP Pavilion 15-eh1xxx (mainboard 88D0)", ALC287_FIXUP_HP_GPIO_LED),
9317 SND_PCI_QUIRK(0x103c, 0x8902, "HP OMEN 16", ALC285_FIXUP_HP_MUTE_LED),
9318 SND_PCI_QUIRK(0x103c, 0x896e, "HP EliteBook x360 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9319 SND_PCI_QUIRK(0x103c, 0x8971, "HP EliteBook 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9320 SND_PCI_QUIRK(0x103c, 0x8972, "HP EliteBook 840 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9321 SND_PCI_QUIRK(0x103c, 0x8973, "HP EliteBook 860 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9322 SND_PCI_QUIRK(0x103c, 0x8974, "HP EliteBook 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9323 SND_PCI_QUIRK(0x103c, 0x8975, "HP EliteBook x360 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9324 SND_PCI_QUIRK(0x103c, 0x8981, "HP Elite Dragonfly G3", ALC245_FIXUP_CS35L41_SPI_4),
9325 SND_PCI_QUIRK(0x103c, 0x898e, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2),
9326 SND_PCI_QUIRK(0x103c, 0x898f, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2),
9327 SND_PCI_QUIRK(0x103c, 0x8991, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9328 SND_PCI_QUIRK(0x103c, 0x8992, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2),
9329 SND_PCI_QUIRK(0x103c, 0x8994, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9330 SND_PCI_QUIRK(0x103c, 0x8995, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2),
9331 SND_PCI_QUIRK(0x103c, 0x89a4, "HP ProBook 440 G9", ALC236_FIXUP_HP_GPIO_LED),
9332 SND_PCI_QUIRK(0x103c, 0x89a6, "HP ProBook 450 G9", ALC236_FIXUP_HP_GPIO_LED),
9333 SND_PCI_QUIRK(0x103c, 0x89aa, "HP EliteBook 630 G9", ALC236_FIXUP_HP_GPIO_LED),
9334 SND_PCI_QUIRK(0x103c, 0x89ac, "HP EliteBook 640 G9", ALC236_FIXUP_HP_GPIO_LED),
9335 SND_PCI_QUIRK(0x103c, 0x89ae, "HP EliteBook 650 G9", ALC236_FIXUP_HP_GPIO_LED),
9336 SND_PCI_QUIRK(0x103c, 0x89c3, "Zbook Studio G9", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
9337 SND_PCI_QUIRK(0x103c, 0x89c6, "Zbook Fury 17 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9338 SND_PCI_QUIRK(0x103c, 0x89ca, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9339 SND_PCI_QUIRK(0x103c, 0x8a78, "HP Dev One", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),
9340 SND_PCI_QUIRK(0x103c, 0x8aa0, "HP ProBook 440 G9 (MB 8A9E)", ALC236_FIXUP_HP_GPIO_LED),
9341 SND_PCI_QUIRK(0x103c, 0x8aa3, "HP ProBook 450 G9 (MB 8AA1)", ALC236_FIXUP_HP_GPIO_LED),
9342 SND_PCI_QUIRK(0x103c, 0x8aa8, "HP EliteBook 640 G9 (MB 8AA6)", ALC236_FIXUP_HP_GPIO_LED),
9343 SND_PCI_QUIRK(0x103c, 0x8aab, "HP EliteBook 650 G9 (MB 8AA9)", ALC236_FIXUP_HP_GPIO_LED),
9344 SND_PCI_QUIRK(0x103c, 0x8ad1, "HP EliteBook 840 14 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9345 SND_PCI_QUIRK(0x103c, 0x8ad2, "HP EliteBook 860 16 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9346 SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
9347 SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
9348 SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9349 SND_PCI_QUIRK(0x1043, 0x10a1, "ASUS UX391UA", ALC294_FIXUP_ASUS_SPK),
9350 SND_PCI_QUIRK(0x1043, 0x10c0, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
9351 SND_PCI_QUIRK(0x1043, 0x10d0, "ASUS X540LA/X540LJ", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
9352 SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9353 SND_PCI_QUIRK(0x1043, 0x11c0, "ASUS X556UR", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
9354 SND_PCI_QUIRK(0x1043, 0x125e, "ASUS Q524UQK", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
9355 SND_PCI_QUIRK(0x1043, 0x1271, "ASUS X430UN", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
9356 SND_PCI_QUIRK(0x1043, 0x1290, "ASUS X441SA", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
9357 SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
9358 SND_PCI_QUIRK(0x1043, 0x12af, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2),
9359 SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),
9360 SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC),
9361 SND_PCI_QUIRK(0x1043, 0x1313, "Asus K42JZ", ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE),
9362 SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
9363 SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
9364 SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
9365 SND_PCI_QUIRK(0x1043, 0x1662, "ASUS GV301QH", ALC294_FIXUP_ASUS_DUAL_SPK),
9366 SND_PCI_QUIRK(0x1043, 0x16b2, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),
9367 SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
9368 SND_PCI_QUIRK(0x1043, 0x1740, "ASUS UX430UA", ALC295_FIXUP_ASUS_DACS),
9369 SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_DUAL_SPK),
9370 SND_PCI_QUIRK(0x1043, 0x1881, "ASUS Zephyrus S/M", ALC294_FIXUP_ASUS_GX502_PINS),
9371 SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC),
9372 SND_PCI_QUIRK(0x1043, 0x18f1, "Asus FX505DT", ALC256_FIXUP_ASUS_HEADSET_MIC),
9373 SND_PCI_QUIRK(0x1043, 0x194e, "ASUS UX563FD", ALC294_FIXUP_ASUS_HPE),
9374 SND_PCI_QUIRK(0x1043, 0x1970, "ASUS UX550VE", ALC289_FIXUP_ASUS_GA401),
9375 SND_PCI_QUIRK(0x1043, 0x1982, "ASUS B1400CEPE", ALC256_FIXUP_ASUS_HPE),
9376 SND_PCI_QUIRK(0x1043, 0x19ce, "ASUS B9450FA", ALC294_FIXUP_ASUS_HPE),
9377 SND_PCI_QUIRK(0x1043, 0x19e1, "ASUS UX581LV", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE),
9378 SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
9379 SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC),
9380 SND_PCI_QUIRK(0x1043, 0x1a8f, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2),
9381 SND_PCI_QUIRK(0x1043, 0x1b11, "ASUS UX431DA", ALC294_FIXUP_ASUS_COEF_1B),
9382 SND_PCI_QUIRK(0x1043, 0x1b13, "Asus U41SV", ALC269_FIXUP_INV_DMIC),
9383 SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
9384 SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9385 SND_PCI_QUIRK(0x1043, 0x1c92, "ASUS ROG Strix G15", ALC285_FIXUP_ASUS_G533Z_PINS),
9386 SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
9387 SND_PCI_QUIRK(0x1043, 0x1d42, "ASUS Zephyrus G14 2022", ALC289_FIXUP_ASUS_GA401),
9388 SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE),
9389 SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502),
9390 SND_PCI_QUIRK(0x1043, 0x1e51, "ASUS Zephyrus M15", ALC294_FIXUP_ASUS_GU502_PINS),
9391 SND_PCI_QUIRK(0x1043, 0x1e5e, "ASUS ROG Strix G513", ALC294_FIXUP_ASUS_G513_PINS),
9392 SND_PCI_QUIRK(0x1043, 0x1e8e, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA401),
9393 SND_PCI_QUIRK(0x1043, 0x1c52, "ASUS Zephyrus G15 2022", ALC289_FIXUP_ASUS_GA401),
9394 SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401),
9395 SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
9396 SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
9397 SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
9398 SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
9399 SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
9400 SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
9401 SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
9402 SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
9403 SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
9404 SND_PCI_QUIRK(0x104d, 0x9099, "Sony VAIO S13", ALC275_FIXUP_SONY_DISABLE_AAMIX),
9405 SND_PCI_QUIRK(0x104d, 0x90b5, "Sony VAIO Pro 11", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
9406 SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
9407 SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),
9408 SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT),
9409 SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN),
9410 SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC),
9411 SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN),
9412 SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),
9413 SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE),
9414 SND_PCI_QUIRK(0x10ec, 0x118c, "Medion EE4254 MD62100", ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE),
9415 SND_PCI_QUIRK(0x10ec, 0x1230, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
9416 SND_PCI_QUIRK(0x10ec, 0x1252, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
9417 SND_PCI_QUIRK(0x10ec, 0x1254, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
9418 SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-SZ6", ALC269_FIXUP_HEADSET_MODE),
9419 SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
9420 SND_PCI_QUIRK(0x144d, 0xc169, "Samsung Notebook 9 Pen (NP930SBE-K01US)", ALC298_FIXUP_SAMSUNG_AMP),
9421 SND_PCI_QUIRK(0x144d, 0xc176, "Samsung Notebook 9 Pro (NP930MBE-K04US)", ALC298_FIXUP_SAMSUNG_AMP),
9422 SND_PCI_QUIRK(0x144d, 0xc189, "Samsung Galaxy Flex Book (NT950QCG-X716)", ALC298_FIXUP_SAMSUNG_AMP),
9423 SND_PCI_QUIRK(0x144d, 0xc18a, "Samsung Galaxy Book Ion (NP930XCJ-K01US)", ALC298_FIXUP_SAMSUNG_AMP),
9424 SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
9425 SND_PCI_QUIRK(0x144d, 0xc812, "Samsung Notebook Pen S (NT950SBE-X58)", ALC298_FIXUP_SAMSUNG_AMP),
9426 SND_PCI_QUIRK(0x144d, 0xc830, "Samsung Galaxy Book Ion (NT950XCJ-X716A)", ALC298_FIXUP_SAMSUNG_AMP),
9427 SND_PCI_QUIRK(0x144d, 0xc832, "Samsung Galaxy Book Flex Alpha (NP730QCJ)", ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
9428 SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
9429 SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),
9430 SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC),
9431 SND_PCI_QUIRK(0x152d, 0x1082, "Quanta NL3", ALC269_FIXUP_LIFEBOOK),
9432 SND_PCI_QUIRK(0x1558, 0x1323, "Clevo N130ZU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9433 SND_PCI_QUIRK(0x1558, 0x1325, "Clevo N15[01][CW]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9434 SND_PCI_QUIRK(0x1558, 0x1401, "Clevo L140[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9435 SND_PCI_QUIRK(0x1558, 0x1403, "Clevo N140CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9436 SND_PCI_QUIRK(0x1558, 0x1404, "Clevo N150CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9437 SND_PCI_QUIRK(0x1558, 0x14a1, "Clevo L141MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9438 SND_PCI_QUIRK(0x1558, 0x4018, "Clevo NV40M[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9439 SND_PCI_QUIRK(0x1558, 0x4019, "Clevo NV40MZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9440 SND_PCI_QUIRK(0x1558, 0x4020, "Clevo NV40MB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9441 SND_PCI_QUIRK(0x1558, 0x4041, "Clevo NV4[15]PZ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9442 SND_PCI_QUIRK(0x1558, 0x40a1, "Clevo NL40GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9443 SND_PCI_QUIRK(0x1558, 0x40c1, "Clevo NL40[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9444 SND_PCI_QUIRK(0x1558, 0x40d1, "Clevo NL41DU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9445 SND_PCI_QUIRK(0x1558, 0x5015, "Clevo NH5[58]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9446 SND_PCI_QUIRK(0x1558, 0x5017, "Clevo NH7[79]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9447 SND_PCI_QUIRK(0x1558, 0x50a3, "Clevo NJ51GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9448 SND_PCI_QUIRK(0x1558, 0x50b3, "Clevo NK50S[BEZ]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9449 SND_PCI_QUIRK(0x1558, 0x50b6, "Clevo NK50S5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9450 SND_PCI_QUIRK(0x1558, 0x50b8, "Clevo NK50SZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9451 SND_PCI_QUIRK(0x1558, 0x50d5, "Clevo NP50D5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9452 SND_PCI_QUIRK(0x1558, 0x50e1, "Clevo NH5[58]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9453 SND_PCI_QUIRK(0x1558, 0x50e2, "Clevo NH7[79]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9454 SND_PCI_QUIRK(0x1558, 0x50f0, "Clevo NH50A[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9455 SND_PCI_QUIRK(0x1558, 0x50f2, "Clevo NH50E[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9456 SND_PCI_QUIRK(0x1558, 0x50f3, "Clevo NH58DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9457 SND_PCI_QUIRK(0x1558, 0x50f5, "Clevo NH55EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9458 SND_PCI_QUIRK(0x1558, 0x50f6, "Clevo NH55DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9459 SND_PCI_QUIRK(0x1558, 0x5101, "Clevo S510WU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9460 SND_PCI_QUIRK(0x1558, 0x5157, "Clevo W517GU1", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9461 SND_PCI_QUIRK(0x1558, 0x51a1, "Clevo NS50MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9462 SND_PCI_QUIRK(0x1558, 0x70a1, "Clevo NB70T[HJK]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9463 SND_PCI_QUIRK(0x1558, 0x70b3, "Clevo NK70SB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9464 SND_PCI_QUIRK(0x1558, 0x70f2, "Clevo NH79EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9465 SND_PCI_QUIRK(0x1558, 0x70f3, "Clevo NH77DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9466 SND_PCI_QUIRK(0x1558, 0x70f4, "Clevo NH77EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9467 SND_PCI_QUIRK(0x1558, 0x70f6, "Clevo NH77DPQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9468 SND_PCI_QUIRK(0x1558, 0x7716, "Clevo NS50PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9469 SND_PCI_QUIRK(0x1558, 0x7717, "Clevo NS70PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9470 SND_PCI_QUIRK(0x1558, 0x7718, "Clevo L140PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9471 SND_PCI_QUIRK(0x1558, 0x8228, "Clevo NR40BU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9472 SND_PCI_QUIRK(0x1558, 0x8520, "Clevo NH50D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9473 SND_PCI_QUIRK(0x1558, 0x8521, "Clevo NH77D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9474 SND_PCI_QUIRK(0x1558, 0x8535, "Clevo NH50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9475 SND_PCI_QUIRK(0x1558, 0x8536, "Clevo NH79D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9476 SND_PCI_QUIRK(0x1558, 0x8550, "Clevo NH[57][0-9][ER][ACDH]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9477 SND_PCI_QUIRK(0x1558, 0x8551, "Clevo NH[57][0-9][ER][ACDH]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9478 SND_PCI_QUIRK(0x1558, 0x8560, "Clevo NH[57][0-9][ER][ACDH]Q", ALC269_FIXUP_HEADSET_MIC),
9479 SND_PCI_QUIRK(0x1558, 0x8561, "Clevo NH[57][0-9][ER][ACDH]Q", ALC269_FIXUP_HEADSET_MIC),
9480 SND_PCI_QUIRK(0x1558, 0x8562, "Clevo NH[57][0-9]RZ[Q]", ALC269_FIXUP_DMIC),
9481 SND_PCI_QUIRK(0x1558, 0x8668, "Clevo NP50B[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9482 SND_PCI_QUIRK(0x1558, 0x866d, "Clevo NP5[05]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9483 SND_PCI_QUIRK(0x1558, 0x867c, "Clevo NP7[01]PNP", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9484 SND_PCI_QUIRK(0x1558, 0x867d, "Clevo NP7[01]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9485 SND_PCI_QUIRK(0x1558, 0x8680, "Clevo NJ50LU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9486 SND_PCI_QUIRK(0x1558, 0x8686, "Clevo NH50[CZ]U", ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME),
9487 SND_PCI_QUIRK(0x1558, 0x8a20, "Clevo NH55DCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9488 SND_PCI_QUIRK(0x1558, 0x8a51, "Clevo NH70RCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9489 SND_PCI_QUIRK(0x1558, 0x8d50, "Clevo NH55RCQ-M", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9490 SND_PCI_QUIRK(0x1558, 0x951d, "Clevo N950T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9491 SND_PCI_QUIRK(0x1558, 0x9600, "Clevo N960K[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9492 SND_PCI_QUIRK(0x1558, 0x961d, "Clevo N960S[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9493 SND_PCI_QUIRK(0x1558, 0x971d, "Clevo N970T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9494 SND_PCI_QUIRK(0x1558, 0xa500, "Clevo NL5[03]RU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9495 SND_PCI_QUIRK(0x1558, 0xa600, "Clevo NL50NU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9496 SND_PCI_QUIRK(0x1558, 0xb018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9497 SND_PCI_QUIRK(0x1558, 0xb019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9498 SND_PCI_QUIRK(0x1558, 0xb022, "Clevo NH77D[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9499 SND_PCI_QUIRK(0x1558, 0xc018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9500 SND_PCI_QUIRK(0x1558, 0xc019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9501 SND_PCI_QUIRK(0x1558, 0xc022, "Clevo NH77[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9502 SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
9503 SND_PCI_QUIRK(0x17aa, 0x1048, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),
9504 SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
9505 SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
9506 SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
9507 SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
9508 SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
9509 SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),
9510 SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST),
9511 SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK),
9512 SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),
9513 SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK),
9514 SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK),
9515 SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440),
9516 SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK),
9517 SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK),
9518 SND_PCI_QUIRK(0x17aa, 0x2211, "Thinkpad W541", ALC292_FIXUP_TPT440_DOCK),
9519 SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK),
9520 SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK),
9521 SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9522 SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK),
9523 SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK),
9524 SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK),
9525 SND_PCI_QUIRK(0x17aa, 0x222d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9526 SND_PCI_QUIRK(0x17aa, 0x222e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9527 SND_PCI_QUIRK(0x17aa, 0x2231, "Thinkpad T560", ALC292_FIXUP_TPT460),
9528 SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460),
9529 SND_PCI_QUIRK(0x17aa, 0x2245, "Thinkpad T470", ALC298_FIXUP_TPT470_DOCK),
9530 SND_PCI_QUIRK(0x17aa, 0x2246, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9531 SND_PCI_QUIRK(0x17aa, 0x2247, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9532 SND_PCI_QUIRK(0x17aa, 0x2249, "Thinkpad", ALC292_FIXUP_TPT460),
9533 SND_PCI_QUIRK(0x17aa, 0x224b, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9534 SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9535 SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9536 SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9537 SND_PCI_QUIRK(0x17aa, 0x2292, "Thinkpad X1 Carbon 7th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
9538 SND_PCI_QUIRK(0x17aa, 0x22be, "Thinkpad X1 Carbon 8th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
9539 SND_PCI_QUIRK(0x17aa, 0x22c1, "Thinkpad P1 Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
9540 SND_PCI_QUIRK(0x17aa, 0x22c2, "Thinkpad X1 Extreme Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
9541 SND_PCI_QUIRK(0x17aa, 0x22f1, "Thinkpad", ALC287_FIXUP_CS35L41_I2C_2),
9542 SND_PCI_QUIRK(0x17aa, 0x22f2, "Thinkpad", ALC287_FIXUP_CS35L41_I2C_2),
9543 SND_PCI_QUIRK(0x17aa, 0x22f3, "Thinkpad", ALC287_FIXUP_CS35L41_I2C_2),
9544 SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
9545 SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
9546 SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
9547 SND_PCI_QUIRK(0x17aa, 0x3111, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
9548 SND_PCI_QUIRK(0x17aa, 0x312a, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
9549 SND_PCI_QUIRK(0x17aa, 0x312f, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
9550 SND_PCI_QUIRK(0x17aa, 0x313c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
9551 SND_PCI_QUIRK(0x17aa, 0x3151, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
9552 SND_PCI_QUIRK(0x17aa, 0x3176, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
9553 SND_PCI_QUIRK(0x17aa, 0x3178, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
9554 SND_PCI_QUIRK(0x17aa, 0x31af, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),
9555 SND_PCI_QUIRK(0x17aa, 0x3801, "Lenovo Yoga9 14IAP7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
9556 SND_PCI_QUIRK(0x17aa, 0x3802, "Lenovo Yoga DuetITL 2021", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
9557 SND_PCI_QUIRK(0x17aa, 0x3813, "Legion 7i 15IMHG05", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
9558 SND_PCI_QUIRK(0x17aa, 0x3818, "Lenovo C940 / Yoga Duet 7", ALC298_FIXUP_LENOVO_C940_DUET7),
9559 SND_PCI_QUIRK(0x17aa, 0x3819, "Lenovo 13s Gen2 ITL", ALC287_FIXUP_13S_GEN2_SPEAKERS),
9560 SND_PCI_QUIRK(0x17aa, 0x3820, "Yoga Duet 7 13ITL6", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
9561 SND_PCI_QUIRK(0x17aa, 0x3824, "Legion Y9000X 2020", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),
9562 SND_PCI_QUIRK(0x17aa, 0x3827, "Ideapad S740", ALC285_FIXUP_IDEAPAD_S740_COEF),
9563 SND_PCI_QUIRK(0x17aa, 0x3834, "Lenovo IdeaPad Slim 9i 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
9564 SND_PCI_QUIRK(0x17aa, 0x383d, "Legion Y9000X 2019", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),
9565 SND_PCI_QUIRK(0x17aa, 0x3843, "Yoga 9i", ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP),
9566 SND_PCI_QUIRK(0x17aa, 0x3847, "Legion 7 16ACHG6", ALC287_FIXUP_LEGION_16ACHG6),
9567 SND_PCI_QUIRK(0x17aa, 0x384a, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
9568 SND_PCI_QUIRK(0x17aa, 0x3852, "Lenovo Yoga 7 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
9569 SND_PCI_QUIRK(0x17aa, 0x3853, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
9570 SND_PCI_QUIRK(0x17aa, 0x3855, "Legion 7 16ITHG6", ALC287_FIXUP_LEGION_16ITHG6),
9571 SND_PCI_QUIRK(0x17aa, 0x3869, "Lenovo Yoga7 14IAL7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
9572 SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
9573 SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
9574 SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
9575 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
9576 SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9577 SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC),
9578 SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK),
9579 SND_PCI_QUIRK(0x17aa, 0x5026, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9580 SND_PCI_QUIRK(0x17aa, 0x5034, "Thinkpad T450", ALC292_FIXUP_TPT440_DOCK),
9581 SND_PCI_QUIRK(0x17aa, 0x5036, "Thinkpad T450s", ALC292_FIXUP_TPT440_DOCK),
9582 SND_PCI_QUIRK(0x17aa, 0x503c, "Thinkpad L450", ALC292_FIXUP_TPT440_DOCK),
9583 SND_PCI_QUIRK(0x17aa, 0x504a, "ThinkPad X260", ALC292_FIXUP_TPT440_DOCK),
9584 SND_PCI_QUIRK(0x17aa, 0x504b, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
9585 SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460),
9586 SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460),
9587 SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460),
9588 SND_PCI_QUIRK(0x17aa, 0x505d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9589 SND_PCI_QUIRK(0x17aa, 0x505f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9590 SND_PCI_QUIRK(0x17aa, 0x5062, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9591 SND_PCI_QUIRK(0x17aa, 0x508b, "Thinkpad X12 Gen 1", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
9592 SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9593 SND_PCI_QUIRK(0x17aa, 0x511e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9594 SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9595 SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
9596 SND_PCI_QUIRK(0x1849, 0x1233, "ASRock NUC Box 1100", ALC233_FIXUP_NO_AUDIO_JACK),
9597 SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS),
9598 SND_PCI_QUIRK(0x19e5, 0x320f, "Huawei WRT-WX9 ", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
9599 SND_PCI_QUIRK(0x1b35, 0x1235, "CZC B20", ALC269_FIXUP_CZC_B20),
9600 SND_PCI_QUIRK(0x1b35, 0x1236, "CZC TMI", ALC269_FIXUP_CZC_TMI),
9601 SND_PCI_QUIRK(0x1b35, 0x1237, "CZC L101", ALC269_FIXUP_CZC_L101),
9602 SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2),
9603 SND_PCI_QUIRK(0x1c06, 0x2013, "Lemote A1802", ALC269_FIXUP_LEMOTE_A1802),
9604 SND_PCI_QUIRK(0x1c06, 0x2015, "Lemote A190X", ALC269_FIXUP_LEMOTE_A190X),
9605 SND_PCI_QUIRK(0x1d05, 0x1132, "TongFang PHxTxX1", ALC256_FIXUP_SET_COEF_DEFAULTS),
9606 SND_PCI_QUIRK(0x1d05, 0x1096, "TongFang GMxMRxx", ALC269_FIXUP_NO_SHUTUP),
9607 SND_PCI_QUIRK(0x1d05, 0x1100, "TongFang GKxNRxx", ALC269_FIXUP_NO_SHUTUP),
9608 SND_PCI_QUIRK(0x1d05, 0x1111, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
9609 SND_PCI_QUIRK(0x1d05, 0x1119, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
9610 SND_PCI_QUIRK(0x1d05, 0x1129, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
9611 SND_PCI_QUIRK(0x1d05, 0x1147, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP),
9612 SND_PCI_QUIRK(0x1d05, 0x115c, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP),
9613 SND_PCI_QUIRK(0x1d05, 0x121b, "TongFang GMxAGxx", ALC269_FIXUP_NO_SHUTUP),
9614 SND_PCI_QUIRK(0x1d72, 0x1602, "RedmiBook", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
9615 SND_PCI_QUIRK(0x1d72, 0x1701, "XiaomiNotebook Pro", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE),
9616 SND_PCI_QUIRK(0x1d72, 0x1901, "RedmiBook 14", ALC256_FIXUP_ASUS_HEADSET_MIC),
9617 SND_PCI_QUIRK(0x1d72, 0x1945, "Redmi G", ALC256_FIXUP_ASUS_HEADSET_MIC),
9618 SND_PCI_QUIRK(0x1d72, 0x1947, "RedmiBook Air", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
9619 SND_PCI_QUIRK(0x8086, 0x2074, "Intel NUC 8", ALC233_FIXUP_INTEL_NUC8_DMIC),
9620 SND_PCI_QUIRK(0x8086, 0x2080, "Intel NUC 8 Rugged", ALC256_FIXUP_INTEL_NUC8_RUGGED),
9621 SND_PCI_QUIRK(0x8086, 0x2081, "Intel NUC 10", ALC256_FIXUP_INTEL_NUC10),
9622 SND_PCI_QUIRK(0xf111, 0x0001, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
9623
9624 #if 0
9625
9626
9627
9628
9629
9630 SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
9631 ALC269_FIXUP_AMIC),
9632 SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC),
9633 SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC),
9634 SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC),
9635 SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC),
9636 SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269_FIXUP_AMIC),
9637 SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269_FIXUP_AMIC),
9638 SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269_FIXUP_AMIC),
9639 SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_FIXUP_AMIC),
9640 SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269_FIXUP_AMIC),
9641 SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_FIXUP_AMIC),
9642 SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_FIXUP_AMIC),
9643 SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_FIXUP_AMIC),
9644 SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_FIXUP_AMIC),
9645 SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_FIXUP_AMIC),
9646 SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_FIXUP_AMIC),
9647 SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_FIXUP_AMIC),
9648 SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_FIXUP_AMIC),
9649 SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_FIXUP_AMIC),
9650 SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_FIXUP_AMIC),
9651 SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_FIXUP_AMIC),
9652 SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_FIXUP_AMIC),
9653 SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_FIXUP_AMIC),
9654 SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_FIXUP_AMIC),
9655 SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_FIXUP_AMIC),
9656 SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_FIXUP_AMIC),
9657 SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_FIXUP_AMIC),
9658 SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_FIXUP_AMIC),
9659 SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_FIXUP_AMIC),
9660 SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_FIXUP_AMIC),
9661 SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_FIXUP_AMIC),
9662 SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_FIXUP_AMIC),
9663 SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_FIXUP_AMIC),
9664 SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_FIXUP_AMIC),
9665 SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_FIXUP_AMIC),
9666 SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_FIXUP_DMIC),
9667 SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_FIXUP_AMIC),
9668 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_AMIC),
9669 SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_FIXUP_DMIC),
9670 SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_FIXUP_DMIC),
9671 #endif
9672 {}
9673 };
9674
9675 static const struct snd_pci_quirk alc269_fixup_vendor_tbl[] = {
9676 SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
9677 SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED),
9678 SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
9679 SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", ALC269_FIXUP_THINKPAD_ACPI),
9680 SND_PCI_QUIRK_VENDOR(0x19e5, "Huawei Matebook", ALC255_FIXUP_MIC_MUTE_LED),
9681 {}
9682 };
9683
9684 static const struct hda_model_fixup alc269_fixup_models[] = {
9685 {.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"},
9686 {.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"},
9687 {.id = ALC269_FIXUP_STEREO_DMIC, .name = "alc269-dmic"},
9688 {.id = ALC271_FIXUP_DMIC, .name = "alc271-dmic"},
9689 {.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"},
9690 {.id = ALC269_FIXUP_HEADSET_MIC, .name = "headset-mic"},
9691 {.id = ALC269_FIXUP_HEADSET_MODE, .name = "headset-mode"},
9692 {.id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, .name = "headset-mode-no-hp-mic"},
9693 {.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
9694 {.id = ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST, .name = "lenovo-dock-limit-boost"},
9695 {.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
9696 {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic1-led"},
9697 {.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
9698 {.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
9699 {.id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, .name = "dell-headset3"},
9700 {.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, .name = "dell-headset4"},
9701 {.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},
9702 {.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"},
9703 {.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
9704 {.id = ALC292_FIXUP_TPT440, .name = "tpt440"},
9705 {.id = ALC292_FIXUP_TPT460, .name = "tpt460"},
9706 {.id = ALC298_FIXUP_TPT470_DOCK_FIX, .name = "tpt470-dock-fix"},
9707 {.id = ALC298_FIXUP_TPT470_DOCK, .name = "tpt470-dock"},
9708 {.id = ALC233_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
9709 {.id = ALC700_FIXUP_INTEL_REFERENCE, .name = "alc700-ref"},
9710 {.id = ALC269_FIXUP_SONY_VAIO, .name = "vaio"},
9711 {.id = ALC269_FIXUP_DELL_M101Z, .name = "dell-m101z"},
9712 {.id = ALC269_FIXUP_ASUS_G73JW, .name = "asus-g73jw"},
9713 {.id = ALC269_FIXUP_LENOVO_EAPD, .name = "lenovo-eapd"},
9714 {.id = ALC275_FIXUP_SONY_HWEQ, .name = "sony-hweq"},
9715 {.id = ALC269_FIXUP_PCM_44K, .name = "pcm44k"},
9716 {.id = ALC269_FIXUP_LIFEBOOK, .name = "lifebook"},
9717 {.id = ALC269_FIXUP_LIFEBOOK_EXTMIC, .name = "lifebook-extmic"},
9718 {.id = ALC269_FIXUP_LIFEBOOK_HP_PIN, .name = "lifebook-hp-pin"},
9719 {.id = ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC, .name = "lifebook-u7x7"},
9720 {.id = ALC269VB_FIXUP_AMIC, .name = "alc269vb-amic"},
9721 {.id = ALC269VB_FIXUP_DMIC, .name = "alc269vb-dmic"},
9722 {.id = ALC269_FIXUP_HP_MUTE_LED_MIC1, .name = "hp-mute-led-mic1"},
9723 {.id = ALC269_FIXUP_HP_MUTE_LED_MIC2, .name = "hp-mute-led-mic2"},
9724 {.id = ALC269_FIXUP_HP_MUTE_LED_MIC3, .name = "hp-mute-led-mic3"},
9725 {.id = ALC269_FIXUP_HP_GPIO_MIC1_LED, .name = "hp-gpio-mic1"},
9726 {.id = ALC269_FIXUP_HP_LINE1_MIC1_LED, .name = "hp-line1-mic1"},
9727 {.id = ALC269_FIXUP_NO_SHUTUP, .name = "noshutup"},
9728 {.id = ALC286_FIXUP_SONY_MIC_NO_PRESENCE, .name = "sony-nomic"},
9729 {.id = ALC269_FIXUP_ASPIRE_HEADSET_MIC, .name = "aspire-headset-mic"},
9730 {.id = ALC269_FIXUP_ASUS_X101, .name = "asus-x101"},
9731 {.id = ALC271_FIXUP_HP_GATE_MIC_JACK, .name = "acer-ao7xx"},
9732 {.id = ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572, .name = "acer-aspire-e1"},
9733 {.id = ALC269_FIXUP_ACER_AC700, .name = "acer-ac700"},
9734 {.id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST, .name = "limit-mic-boost"},
9735 {.id = ALC269VB_FIXUP_ASUS_ZENBOOK, .name = "asus-zenbook"},
9736 {.id = ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A, .name = "asus-zenbook-ux31a"},
9737 {.id = ALC269VB_FIXUP_ORDISSIMO_EVE2, .name = "ordissimo"},
9738 {.id = ALC282_FIXUP_ASUS_TX300, .name = "asus-tx300"},
9739 {.id = ALC283_FIXUP_INT_MIC, .name = "alc283-int-mic"},
9740 {.id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK, .name = "mono-speakers"},
9741 {.id = ALC290_FIXUP_SUBWOOFER_HSJACK, .name = "alc290-subwoofer"},
9742 {.id = ALC269_FIXUP_THINKPAD_ACPI, .name = "thinkpad"},
9743 {.id = ALC269_FIXUP_DMIC_THINKPAD_ACPI, .name = "dmic-thinkpad"},
9744 {.id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE, .name = "alc255-acer"},
9745 {.id = ALC255_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc255-asus"},
9746 {.id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc255-dell1"},
9747 {.id = ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "alc255-dell2"},
9748 {.id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc293-dell1"},
9749 {.id = ALC283_FIXUP_HEADSET_MIC, .name = "alc283-headset"},
9750 {.id = ALC255_FIXUP_MIC_MUTE_LED, .name = "alc255-dell-mute"},
9751 {.id = ALC282_FIXUP_ASPIRE_V5_PINS, .name = "aspire-v5"},
9752 {.id = ALC269VB_FIXUP_ASPIRE_E1_COEF, .name = "aspire-e1-coef"},
9753 {.id = ALC280_FIXUP_HP_GPIO4, .name = "hp-gpio4"},
9754 {.id = ALC286_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
9755 {.id = ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY, .name = "hp-gpio2-hotkey"},
9756 {.id = ALC280_FIXUP_HP_DOCK_PINS, .name = "hp-dock-pins"},
9757 {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic"},
9758 {.id = ALC280_FIXUP_HP_9480M, .name = "hp-9480m"},
9759 {.id = ALC288_FIXUP_DELL_HEADSET_MODE, .name = "alc288-dell-headset"},
9760 {.id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc288-dell1"},
9761 {.id = ALC288_FIXUP_DELL_XPS_13, .name = "alc288-dell-xps13"},
9762 {.id = ALC292_FIXUP_DELL_E7X, .name = "dell-e7x"},
9763 {.id = ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK, .name = "alc293-dell"},
9764 {.id = ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc298-dell1"},
9765 {.id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, .name = "alc298-dell-aio"},
9766 {.id = ALC275_FIXUP_DELL_XPS, .name = "alc275-dell-xps"},
9767 {.id = ALC293_FIXUP_LENOVO_SPK_NOISE, .name = "lenovo-spk-noise"},
9768 {.id = ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, .name = "lenovo-hotkey"},
9769 {.id = ALC255_FIXUP_DELL_SPK_NOISE, .name = "dell-spk-noise"},
9770 {.id = ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc225-dell1"},
9771 {.id = ALC295_FIXUP_DISABLE_DAC3, .name = "alc295-disable-dac3"},
9772 {.id = ALC285_FIXUP_SPEAKER2_TO_DAC1, .name = "alc285-speaker2-to-dac1"},
9773 {.id = ALC280_FIXUP_HP_HEADSET_MIC, .name = "alc280-hp-headset"},
9774 {.id = ALC221_FIXUP_HP_FRONT_MIC, .name = "alc221-hp-mic"},
9775 {.id = ALC298_FIXUP_SPK_VOLUME, .name = "alc298-spk-volume"},
9776 {.id = ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER, .name = "dell-inspiron-7559"},
9777 {.id = ALC269_FIXUP_ATIV_BOOK_8, .name = "ativ-book"},
9778 {.id = ALC221_FIXUP_HP_MIC_NO_PRESENCE, .name = "alc221-hp-mic"},
9779 {.id = ALC256_FIXUP_ASUS_HEADSET_MODE, .name = "alc256-asus-headset"},
9780 {.id = ALC256_FIXUP_ASUS_MIC, .name = "alc256-asus-mic"},
9781 {.id = ALC256_FIXUP_ASUS_AIO_GPIO2, .name = "alc256-asus-aio"},
9782 {.id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc233-asus"},
9783 {.id = ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE, .name = "alc233-eapd"},
9784 {.id = ALC294_FIXUP_LENOVO_MIC_LOCATION, .name = "alc294-lenovo-mic"},
9785 {.id = ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE, .name = "alc225-wyse"},
9786 {.id = ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, .name = "alc274-dell-aio"},
9787 {.id = ALC255_FIXUP_DUMMY_LINEOUT_VERB, .name = "alc255-dummy-lineout"},
9788 {.id = ALC255_FIXUP_DELL_HEADSET_MIC, .name = "alc255-dell-headset"},
9789 {.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"},
9790 {.id = ALC225_FIXUP_HEADSET_JACK, .name = "alc-headset-jack"},
9791 {.id = ALC295_FIXUP_CHROME_BOOK, .name = "alc-chrome-book"},
9792 {.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"},
9793 {.id = ALC298_FIXUP_HUAWEI_MBX_STEREO, .name = "huawei-mbx-stereo"},
9794 {.id = ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, .name = "alc256-medion-headset"},
9795 {.id = ALC298_FIXUP_SAMSUNG_AMP, .name = "alc298-samsung-amp"},
9796 {.id = ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET, .name = "alc256-samsung-headphone"},
9797 {.id = ALC255_FIXUP_XIAOMI_HEADSET_MIC, .name = "alc255-xiaomi-headset"},
9798 {.id = ALC274_FIXUP_HP_MIC, .name = "alc274-hp-mic-detect"},
9799 {.id = ALC245_FIXUP_HP_X360_AMP, .name = "alc245-hp-x360-amp"},
9800 {.id = ALC295_FIXUP_HP_OMEN, .name = "alc295-hp-omen"},
9801 {.id = ALC285_FIXUP_HP_SPECTRE_X360, .name = "alc285-hp-spectre-x360"},
9802 {.id = ALC285_FIXUP_HP_SPECTRE_X360_EB1, .name = "alc285-hp-spectre-x360-eb1"},
9803 {.id = ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP, .name = "alc287-ideapad-bass-spk-amp"},
9804 {.id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN, .name = "alc287-yoga9-bass-spk-pin"},
9805 {.id = ALC623_FIXUP_LENOVO_THINKSTATION_P340, .name = "alc623-lenovo-thinkstation-p340"},
9806 {.id = ALC255_FIXUP_ACER_HEADPHONE_AND_MIC, .name = "alc255-acer-headphone-and-mic"},
9807 {.id = ALC285_FIXUP_HP_GPIO_AMP_INIT, .name = "alc285-hp-amp-init"},
9808 {}
9809 };
9810 #define ALC225_STANDARD_PINS \
9811 {0x21, 0x04211020}
9812
9813 #define ALC256_STANDARD_PINS \
9814 {0x12, 0x90a60140}, \
9815 {0x14, 0x90170110}, \
9816 {0x21, 0x02211020}
9817
9818 #define ALC282_STANDARD_PINS \
9819 {0x14, 0x90170110}
9820
9821 #define ALC290_STANDARD_PINS \
9822 {0x12, 0x99a30130}
9823
9824 #define ALC292_STANDARD_PINS \
9825 {0x14, 0x90170110}, \
9826 {0x15, 0x0221401f}
9827
9828 #define ALC295_STANDARD_PINS \
9829 {0x12, 0xb7a60130}, \
9830 {0x14, 0x90170110}, \
9831 {0x21, 0x04211020}
9832
9833 #define ALC298_STANDARD_PINS \
9834 {0x12, 0x90a60130}, \
9835 {0x21, 0x03211020}
9836
9837 static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
9838 SND_HDA_PIN_QUIRK(0x10ec0221, 0x103c, "HP Workstation", ALC221_FIXUP_HP_HEADSET_MIC,
9839 {0x14, 0x01014020},
9840 {0x17, 0x90170110},
9841 {0x18, 0x02a11030},
9842 {0x19, 0x0181303F},
9843 {0x21, 0x0221102f}),
9844 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1025, "Acer", ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
9845 {0x12, 0x90a601c0},
9846 {0x14, 0x90171120},
9847 {0x21, 0x02211030}),
9848 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
9849 {0x14, 0x90170110},
9850 {0x1b, 0x90a70130},
9851 {0x21, 0x03211020}),
9852 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
9853 {0x1a, 0x90a70130},
9854 {0x1b, 0x90170110},
9855 {0x21, 0x03211020}),
9856 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
9857 ALC225_STANDARD_PINS,
9858 {0x12, 0xb7a60130},
9859 {0x14, 0x901701a0}),
9860 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
9861 ALC225_STANDARD_PINS,
9862 {0x12, 0xb7a60130},
9863 {0x14, 0x901701b0}),
9864 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
9865 ALC225_STANDARD_PINS,
9866 {0x12, 0xb7a60150},
9867 {0x14, 0x901701a0}),
9868 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
9869 ALC225_STANDARD_PINS,
9870 {0x12, 0xb7a60150},
9871 {0x14, 0x901701b0}),
9872 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
9873 ALC225_STANDARD_PINS,
9874 {0x12, 0xb7a60130},
9875 {0x1b, 0x90170110}),
9876 SND_HDA_PIN_QUIRK(0x10ec0233, 0x8086, "Intel NUC Skull Canyon", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
9877 {0x1b, 0x01111010},
9878 {0x1e, 0x01451130},
9879 {0x21, 0x02211020}),
9880 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
9881 {0x12, 0x90a60140},
9882 {0x14, 0x90170110},
9883 {0x19, 0x02a11030},
9884 {0x21, 0x02211020}),
9885 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
9886 {0x14, 0x90170110},
9887 {0x19, 0x02a11030},
9888 {0x1a, 0x02a11040},
9889 {0x1b, 0x01014020},
9890 {0x21, 0x0221101f}),
9891 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
9892 {0x14, 0x90170110},
9893 {0x19, 0x02a11030},
9894 {0x1a, 0x02a11040},
9895 {0x1b, 0x01011020},
9896 {0x21, 0x0221101f}),
9897 SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
9898 {0x14, 0x90170110},
9899 {0x19, 0x02a11020},
9900 {0x1a, 0x02a11030},
9901 {0x21, 0x0221101f}),
9902 SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
9903 {0x21, 0x02211010}),
9904 SND_HDA_PIN_QUIRK(0x10ec0236, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
9905 {0x14, 0x90170110},
9906 {0x19, 0x02a11020},
9907 {0x21, 0x02211030}),
9908 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
9909 {0x14, 0x90170110},
9910 {0x21, 0x02211020}),
9911 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9912 {0x14, 0x90170130},
9913 {0x21, 0x02211040}),
9914 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9915 {0x12, 0x90a60140},
9916 {0x14, 0x90170110},
9917 {0x21, 0x02211020}),
9918 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9919 {0x12, 0x90a60160},
9920 {0x14, 0x90170120},
9921 {0x21, 0x02211030}),
9922 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9923 {0x14, 0x90170110},
9924 {0x1b, 0x02011020},
9925 {0x21, 0x0221101f}),
9926 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9927 {0x14, 0x90170110},
9928 {0x1b, 0x01011020},
9929 {0x21, 0x0221101f}),
9930 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9931 {0x14, 0x90170130},
9932 {0x1b, 0x01014020},
9933 {0x21, 0x0221103f}),
9934 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9935 {0x14, 0x90170130},
9936 {0x1b, 0x01011020},
9937 {0x21, 0x0221103f}),
9938 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9939 {0x14, 0x90170130},
9940 {0x1b, 0x02011020},
9941 {0x21, 0x0221103f}),
9942 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9943 {0x14, 0x90170150},
9944 {0x1b, 0x02011020},
9945 {0x21, 0x0221105f}),
9946 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9947 {0x14, 0x90170110},
9948 {0x1b, 0x01014020},
9949 {0x21, 0x0221101f}),
9950 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9951 {0x12, 0x90a60160},
9952 {0x14, 0x90170120},
9953 {0x17, 0x90170140},
9954 {0x21, 0x0321102f}),
9955 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9956 {0x12, 0x90a60160},
9957 {0x14, 0x90170130},
9958 {0x21, 0x02211040}),
9959 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9960 {0x12, 0x90a60160},
9961 {0x14, 0x90170140},
9962 {0x21, 0x02211050}),
9963 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9964 {0x12, 0x90a60170},
9965 {0x14, 0x90170120},
9966 {0x21, 0x02211030}),
9967 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9968 {0x12, 0x90a60170},
9969 {0x14, 0x90170130},
9970 {0x21, 0x02211040}),
9971 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9972 {0x12, 0x90a60170},
9973 {0x14, 0x90171130},
9974 {0x21, 0x02211040}),
9975 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9976 {0x12, 0x90a60170},
9977 {0x14, 0x90170140},
9978 {0x21, 0x02211050}),
9979 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5548", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9980 {0x12, 0x90a60180},
9981 {0x14, 0x90170130},
9982 {0x21, 0x02211040}),
9983 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5565", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9984 {0x12, 0x90a60180},
9985 {0x14, 0x90170120},
9986 {0x21, 0x02211030}),
9987 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9988 {0x1b, 0x01011020},
9989 {0x21, 0x02211010}),
9990 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
9991 {0x14, 0x90170110},
9992 {0x1b, 0x90a70130},
9993 {0x21, 0x04211020}),
9994 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
9995 {0x14, 0x90170110},
9996 {0x1b, 0x90a70130},
9997 {0x21, 0x03211020}),
9998 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
9999 {0x12, 0x90a60130},
10000 {0x14, 0x90170110},
10001 {0x21, 0x03211020}),
10002 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
10003 {0x12, 0x90a60130},
10004 {0x14, 0x90170110},
10005 {0x21, 0x04211020}),
10006 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
10007 {0x1a, 0x90a70130},
10008 {0x1b, 0x90170110},
10009 {0x21, 0x03211020}),
10010 SND_HDA_PIN_QUIRK(0x10ec0256, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
10011 {0x14, 0x90170110},
10012 {0x19, 0x02a11020},
10013 {0x21, 0x0221101f}),
10014 SND_HDA_PIN_QUIRK(0x10ec0274, 0x103c, "HP", ALC274_FIXUP_HP_HEADSET_MIC,
10015 {0x17, 0x90170110},
10016 {0x19, 0x03a11030},
10017 {0x21, 0x03211020}),
10018 SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
10019 {0x12, 0x90a60130},
10020 {0x14, 0x90170110},
10021 {0x15, 0x0421101f},
10022 {0x1a, 0x04a11020}),
10023 SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED,
10024 {0x12, 0x90a60140},
10025 {0x14, 0x90170110},
10026 {0x15, 0x0421101f},
10027 {0x18, 0x02811030},
10028 {0x1a, 0x04a1103f},
10029 {0x1b, 0x02011020}),
10030 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP 15 Touchsmart", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10031 ALC282_STANDARD_PINS,
10032 {0x12, 0x99a30130},
10033 {0x19, 0x03a11020},
10034 {0x21, 0x0321101f}),
10035 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10036 ALC282_STANDARD_PINS,
10037 {0x12, 0x99a30130},
10038 {0x19, 0x03a11020},
10039 {0x21, 0x03211040}),
10040 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10041 ALC282_STANDARD_PINS,
10042 {0x12, 0x99a30130},
10043 {0x19, 0x03a11030},
10044 {0x21, 0x03211020}),
10045 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10046 ALC282_STANDARD_PINS,
10047 {0x12, 0x99a30130},
10048 {0x19, 0x04a11020},
10049 {0x21, 0x0421101f}),
10050 SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED,
10051 ALC282_STANDARD_PINS,
10052 {0x12, 0x90a60140},
10053 {0x19, 0x04a11030},
10054 {0x21, 0x04211020}),
10055 SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
10056 ALC282_STANDARD_PINS,
10057 {0x12, 0x90a609c0},
10058 {0x18, 0x03a11830},
10059 {0x19, 0x04a19831},
10060 {0x1a, 0x0481303f},
10061 {0x1b, 0x04211020},
10062 {0x21, 0x0321101f}),
10063 SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
10064 ALC282_STANDARD_PINS,
10065 {0x12, 0x90a60940},
10066 {0x18, 0x03a11830},
10067 {0x19, 0x04a19831},
10068 {0x1a, 0x0481303f},
10069 {0x1b, 0x04211020},
10070 {0x21, 0x0321101f}),
10071 SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10072 ALC282_STANDARD_PINS,
10073 {0x12, 0x90a60130},
10074 {0x21, 0x0321101f}),
10075 SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10076 {0x12, 0x90a60160},
10077 {0x14, 0x90170120},
10078 {0x21, 0x02211030}),
10079 SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10080 ALC282_STANDARD_PINS,
10081 {0x12, 0x90a60130},
10082 {0x19, 0x03a11020},
10083 {0x21, 0x0321101f}),
10084 SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
10085 {0x12, 0x90a60130},
10086 {0x14, 0x90170110},
10087 {0x19, 0x04a11040},
10088 {0x21, 0x04211020}),
10089 SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
10090 {0x14, 0x90170110},
10091 {0x19, 0x04a11040},
10092 {0x1d, 0x40600001},
10093 {0x21, 0x04211020}),
10094 SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
10095 {0x14, 0x90170110},
10096 {0x19, 0x04a11040},
10097 {0x21, 0x04211020}),
10098 SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_HEADSET_JACK,
10099 {0x14, 0x90170110},
10100 {0x17, 0x90170111},
10101 {0x19, 0x03a11030},
10102 {0x21, 0x03211020}),
10103 SND_HDA_PIN_QUIRK(0x10ec0286, 0x1025, "Acer", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
10104 {0x12, 0x90a60130},
10105 {0x17, 0x90170110},
10106 {0x21, 0x02211020}),
10107 SND_HDA_PIN_QUIRK(0x10ec0288, 0x1028, "Dell", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
10108 {0x12, 0x90a60120},
10109 {0x14, 0x90170110},
10110 {0x21, 0x0321101f}),
10111 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10112 ALC290_STANDARD_PINS,
10113 {0x15, 0x04211040},
10114 {0x18, 0x90170112},
10115 {0x1a, 0x04a11020}),
10116 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10117 ALC290_STANDARD_PINS,
10118 {0x15, 0x04211040},
10119 {0x18, 0x90170110},
10120 {0x1a, 0x04a11020}),
10121 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10122 ALC290_STANDARD_PINS,
10123 {0x15, 0x0421101f},
10124 {0x1a, 0x04a11020}),
10125 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10126 ALC290_STANDARD_PINS,
10127 {0x15, 0x04211020},
10128 {0x1a, 0x04a11040}),
10129 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10130 ALC290_STANDARD_PINS,
10131 {0x14, 0x90170110},
10132 {0x15, 0x04211020},
10133 {0x1a, 0x04a11040}),
10134 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10135 ALC290_STANDARD_PINS,
10136 {0x14, 0x90170110},
10137 {0x15, 0x04211020},
10138 {0x1a, 0x04a11020}),
10139 SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10140 ALC290_STANDARD_PINS,
10141 {0x14, 0x90170110},
10142 {0x15, 0x0421101f},
10143 {0x1a, 0x04a11020}),
10144 SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
10145 ALC292_STANDARD_PINS,
10146 {0x12, 0x90a60140},
10147 {0x16, 0x01014020},
10148 {0x19, 0x01a19030}),
10149 SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
10150 ALC292_STANDARD_PINS,
10151 {0x12, 0x90a60140},
10152 {0x16, 0x01014020},
10153 {0x18, 0x02a19031},
10154 {0x19, 0x01a1903e}),
10155 SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
10156 ALC292_STANDARD_PINS,
10157 {0x12, 0x90a60140}),
10158 SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
10159 ALC292_STANDARD_PINS,
10160 {0x13, 0x90a60140},
10161 {0x16, 0x21014020},
10162 {0x19, 0x21a19030}),
10163 SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
10164 ALC292_STANDARD_PINS,
10165 {0x13, 0x90a60140}),
10166 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_HPE,
10167 {0x17, 0x90170110},
10168 {0x21, 0x04211020}),
10169 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_MIC,
10170 {0x14, 0x90170110},
10171 {0x1b, 0x90a70130},
10172 {0x21, 0x04211020}),
10173 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
10174 {0x12, 0x90a60130},
10175 {0x17, 0x90170110},
10176 {0x21, 0x03211020}),
10177 SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
10178 {0x12, 0x90a60130},
10179 {0x17, 0x90170110},
10180 {0x21, 0x04211020}),
10181 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
10182 {0x12, 0x90a60130},
10183 {0x17, 0x90170110},
10184 {0x21, 0x03211020}),
10185 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
10186 {0x12, 0x90a60120},
10187 {0x17, 0x90170110},
10188 {0x21, 0x04211030}),
10189 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
10190 {0x12, 0x90a60130},
10191 {0x17, 0x90170110},
10192 {0x21, 0x03211020}),
10193 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
10194 {0x12, 0x90a60130},
10195 {0x17, 0x90170110},
10196 {0x21, 0x03211020}),
10197 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
10198 {0x14, 0x90170110},
10199 {0x21, 0x04211020}),
10200 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
10201 {0x14, 0x90170110},
10202 {0x21, 0x04211030}),
10203 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10204 ALC295_STANDARD_PINS,
10205 {0x17, 0x21014020},
10206 {0x18, 0x21a19030}),
10207 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10208 ALC295_STANDARD_PINS,
10209 {0x17, 0x21014040},
10210 {0x18, 0x21a19050}),
10211 SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10212 ALC295_STANDARD_PINS),
10213 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
10214 ALC298_STANDARD_PINS,
10215 {0x17, 0x90170110}),
10216 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
10217 ALC298_STANDARD_PINS,
10218 {0x17, 0x90170140}),
10219 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
10220 ALC298_STANDARD_PINS,
10221 {0x17, 0x90170150}),
10222 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_SPK_VOLUME,
10223 {0x12, 0xb7a60140},
10224 {0x13, 0xb7a60150},
10225 {0x17, 0x90170110},
10226 {0x1a, 0x03011020},
10227 {0x21, 0x03211030}),
10228 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
10229 {0x12, 0xb7a60140},
10230 {0x17, 0x90170110},
10231 {0x1a, 0x03a11030},
10232 {0x21, 0x03211020}),
10233 SND_HDA_PIN_QUIRK(0x10ec0299, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
10234 ALC225_STANDARD_PINS,
10235 {0x12, 0xb7a60130},
10236 {0x17, 0x90170110}),
10237 SND_HDA_PIN_QUIRK(0x10ec0623, 0x17aa, "Lenovo", ALC283_FIXUP_HEADSET_MIC,
10238 {0x14, 0x01014010},
10239 {0x17, 0x90170120},
10240 {0x18, 0x02a11030},
10241 {0x19, 0x02a1103f},
10242 {0x21, 0x0221101f}),
10243 {}
10244 };
10245
10246
10247
10248
10249
10250
10251
10252 static const struct snd_hda_pin_quirk alc269_fallback_pin_fixup_tbl[] = {
10253 SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
10254 {0x19, 0x40000000},
10255 {0x1b, 0x40000000}),
10256 SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10257 {0x19, 0x40000000},
10258 {0x1a, 0x40000000}),
10259 SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10260 {0x19, 0x40000000},
10261 {0x1a, 0x40000000}),
10262 SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
10263 {0x19, 0x40000000},
10264 {0x1a, 0x40000000}),
10265 {}
10266 };
10267
10268 static void alc269_fill_coef(struct hda_codec *codec)
10269 {
10270 struct alc_spec *spec = codec->spec;
10271 int val;
10272
10273 if (spec->codec_variant != ALC269_TYPE_ALC269VB)
10274 return;
10275
10276 if ((alc_get_coef0(codec) & 0x00ff) < 0x015) {
10277 alc_write_coef_idx(codec, 0xf, 0x960b);
10278 alc_write_coef_idx(codec, 0xe, 0x8817);
10279 }
10280
10281 if ((alc_get_coef0(codec) & 0x00ff) == 0x016) {
10282 alc_write_coef_idx(codec, 0xf, 0x960b);
10283 alc_write_coef_idx(codec, 0xe, 0x8814);
10284 }
10285
10286 if ((alc_get_coef0(codec) & 0x00ff) == 0x017) {
10287
10288 alc_update_coef_idx(codec, 0x04, 0, 1<<11);
10289 }
10290
10291 if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {
10292 val = alc_read_coef_idx(codec, 0xd);
10293 if (val != -1 && (val & 0x0c00) >> 10 != 0x1) {
10294
10295 alc_write_coef_idx(codec, 0xd, val | (1<<10));
10296 }
10297 val = alc_read_coef_idx(codec, 0x17);
10298 if (val != -1 && (val & 0x01c0) >> 6 != 0x4) {
10299
10300 alc_write_coef_idx(codec, 0x17, val | (1<<7));
10301 }
10302 }
10303
10304
10305 alc_update_coef_idx(codec, 0x4, 0, 1<<11);
10306 }
10307
10308
10309
10310 static int patch_alc269(struct hda_codec *codec)
10311 {
10312 struct alc_spec *spec;
10313 int err;
10314
10315 err = alc_alloc_spec(codec, 0x0b);
10316 if (err < 0)
10317 return err;
10318
10319 spec = codec->spec;
10320 spec->gen.shared_mic_vref_pin = 0x18;
10321 codec->power_save_node = 0;
10322
10323 #ifdef CONFIG_PM
10324 codec->patch_ops.suspend = alc269_suspend;
10325 codec->patch_ops.resume = alc269_resume;
10326 #endif
10327 spec->shutup = alc_default_shutup;
10328 spec->init_hook = alc_default_init;
10329
10330 switch (codec->core.vendor_id) {
10331 case 0x10ec0269:
10332 spec->codec_variant = ALC269_TYPE_ALC269VA;
10333 switch (alc_get_coef0(codec) & 0x00f0) {
10334 case 0x0010:
10335 if (codec->bus->pci &&
10336 codec->bus->pci->subsystem_vendor == 0x1025 &&
10337 spec->cdefine.platform_type == 1)
10338 err = alc_codec_rename(codec, "ALC271X");
10339 spec->codec_variant = ALC269_TYPE_ALC269VB;
10340 break;
10341 case 0x0020:
10342 if (codec->bus->pci &&
10343 codec->bus->pci->subsystem_vendor == 0x17aa &&
10344 codec->bus->pci->subsystem_device == 0x21f3)
10345 err = alc_codec_rename(codec, "ALC3202");
10346 spec->codec_variant = ALC269_TYPE_ALC269VC;
10347 break;
10348 case 0x0030:
10349 spec->codec_variant = ALC269_TYPE_ALC269VD;
10350 break;
10351 default:
10352 alc_fix_pll_init(codec, 0x20, 0x04, 15);
10353 }
10354 if (err < 0)
10355 goto error;
10356 spec->shutup = alc269_shutup;
10357 spec->init_hook = alc269_fill_coef;
10358 alc269_fill_coef(codec);
10359 break;
10360
10361 case 0x10ec0280:
10362 case 0x10ec0290:
10363 spec->codec_variant = ALC269_TYPE_ALC280;
10364 break;
10365 case 0x10ec0282:
10366 spec->codec_variant = ALC269_TYPE_ALC282;
10367 spec->shutup = alc282_shutup;
10368 spec->init_hook = alc282_init;
10369 break;
10370 case 0x10ec0233:
10371 case 0x10ec0283:
10372 spec->codec_variant = ALC269_TYPE_ALC283;
10373 spec->shutup = alc283_shutup;
10374 spec->init_hook = alc283_init;
10375 break;
10376 case 0x10ec0284:
10377 case 0x10ec0292:
10378 spec->codec_variant = ALC269_TYPE_ALC284;
10379 break;
10380 case 0x10ec0293:
10381 spec->codec_variant = ALC269_TYPE_ALC293;
10382 break;
10383 case 0x10ec0286:
10384 case 0x10ec0288:
10385 spec->codec_variant = ALC269_TYPE_ALC286;
10386 break;
10387 case 0x10ec0298:
10388 spec->codec_variant = ALC269_TYPE_ALC298;
10389 break;
10390 case 0x10ec0235:
10391 case 0x10ec0255:
10392 spec->codec_variant = ALC269_TYPE_ALC255;
10393 spec->shutup = alc256_shutup;
10394 spec->init_hook = alc256_init;
10395 break;
10396 case 0x10ec0230:
10397 case 0x10ec0236:
10398 case 0x10ec0256:
10399 case 0x19e58326:
10400 spec->codec_variant = ALC269_TYPE_ALC256;
10401 spec->shutup = alc256_shutup;
10402 spec->init_hook = alc256_init;
10403 spec->gen.mixer_nid = 0;
10404 break;
10405 case 0x10ec0257:
10406 spec->codec_variant = ALC269_TYPE_ALC257;
10407 spec->shutup = alc256_shutup;
10408 spec->init_hook = alc256_init;
10409 spec->gen.mixer_nid = 0;
10410 break;
10411 case 0x10ec0215:
10412 case 0x10ec0245:
10413 case 0x10ec0285:
10414 case 0x10ec0289:
10415 if (alc_get_coef0(codec) & 0x0010)
10416 spec->codec_variant = ALC269_TYPE_ALC245;
10417 else
10418 spec->codec_variant = ALC269_TYPE_ALC215;
10419 spec->shutup = alc225_shutup;
10420 spec->init_hook = alc225_init;
10421 spec->gen.mixer_nid = 0;
10422 break;
10423 case 0x10ec0225:
10424 case 0x10ec0295:
10425 case 0x10ec0299:
10426 spec->codec_variant = ALC269_TYPE_ALC225;
10427 spec->shutup = alc225_shutup;
10428 spec->init_hook = alc225_init;
10429 spec->gen.mixer_nid = 0;
10430 break;
10431 case 0x10ec0287:
10432 spec->codec_variant = ALC269_TYPE_ALC287;
10433 spec->shutup = alc225_shutup;
10434 spec->init_hook = alc225_init;
10435 spec->gen.mixer_nid = 0;
10436 break;
10437 case 0x10ec0234:
10438 case 0x10ec0274:
10439 case 0x10ec0294:
10440 spec->codec_variant = ALC269_TYPE_ALC294;
10441 spec->gen.mixer_nid = 0;
10442 alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3));
10443 spec->init_hook = alc294_init;
10444 break;
10445 case 0x10ec0300:
10446 spec->codec_variant = ALC269_TYPE_ALC300;
10447 spec->gen.mixer_nid = 0;
10448 break;
10449 case 0x10ec0623:
10450 spec->codec_variant = ALC269_TYPE_ALC623;
10451 break;
10452 case 0x10ec0700:
10453 case 0x10ec0701:
10454 case 0x10ec0703:
10455 case 0x10ec0711:
10456 spec->codec_variant = ALC269_TYPE_ALC700;
10457 spec->gen.mixer_nid = 0;
10458 alc_update_coef_idx(codec, 0x4a, 1 << 15, 0);
10459 spec->init_hook = alc294_init;
10460 break;
10461
10462 }
10463
10464 if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) {
10465 spec->has_alc5505_dsp = 1;
10466 spec->init_hook = alc5505_dsp_init;
10467 }
10468
10469 alc_pre_init(codec);
10470
10471 snd_hda_pick_fixup(codec, alc269_fixup_models,
10472 alc269_fixup_tbl, alc269_fixups);
10473
10474
10475
10476
10477 if (codec->fixup_id == ALC282_FIXUP_ASUS_TX300 &&
10478 codec->core.vendor_id == 0x10ec0294) {
10479 codec_dbg(codec, "Clear wrong fixup for ASUS ROG Strix G17\n");
10480 codec->fixup_id = HDA_FIXUP_ID_NOT_SET;
10481 }
10482
10483 snd_hda_pick_pin_fixup(codec, alc269_pin_fixup_tbl, alc269_fixups, true);
10484 snd_hda_pick_pin_fixup(codec, alc269_fallback_pin_fixup_tbl, alc269_fixups, false);
10485 snd_hda_pick_fixup(codec, NULL, alc269_fixup_vendor_tbl,
10486 alc269_fixups);
10487 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
10488
10489 alc_auto_parse_customize_define(codec);
10490
10491 if (has_cdefine_beep(codec))
10492 spec->gen.beep_nid = 0x01;
10493
10494
10495 err = alc269_parse_auto_config(codec);
10496 if (err < 0)
10497 goto error;
10498
10499 if (!spec->gen.no_analog && spec->gen.beep_nid && spec->gen.mixer_nid) {
10500 err = set_beep_amp(spec, spec->gen.mixer_nid, 0x04, HDA_INPUT);
10501 if (err < 0)
10502 goto error;
10503 }
10504
10505 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
10506
10507 return 0;
10508
10509 error:
10510 alc_free(codec);
10511 return err;
10512 }
10513
10514
10515
10516
10517
10518 static int alc861_parse_auto_config(struct hda_codec *codec)
10519 {
10520 static const hda_nid_t alc861_ignore[] = { 0x1d, 0 };
10521 static const hda_nid_t alc861_ssids[] = { 0x0e, 0x0f, 0x0b, 0 };
10522 return alc_parse_auto_config(codec, alc861_ignore, alc861_ssids);
10523 }
10524
10525
10526 enum {
10527 ALC861_FIXUP_FSC_AMILO_PI1505,
10528 ALC861_FIXUP_AMP_VREF_0F,
10529 ALC861_FIXUP_NO_JACK_DETECT,
10530 ALC861_FIXUP_ASUS_A6RP,
10531 ALC660_FIXUP_ASUS_W7J,
10532 };
10533
10534
10535 static void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec,
10536 const struct hda_fixup *fix, int action)
10537 {
10538 struct alc_spec *spec = codec->spec;
10539 unsigned int val;
10540
10541 if (action != HDA_FIXUP_ACT_INIT)
10542 return;
10543 val = snd_hda_codec_get_pin_target(codec, 0x0f);
10544 if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)))
10545 val |= AC_PINCTL_IN_EN;
10546 val |= AC_PINCTL_VREF_50;
10547 snd_hda_set_pin_ctl(codec, 0x0f, val);
10548 spec->gen.keep_vref_in_automute = 1;
10549 }
10550
10551
10552 static void alc_fixup_no_jack_detect(struct hda_codec *codec,
10553 const struct hda_fixup *fix, int action)
10554 {
10555 if (action == HDA_FIXUP_ACT_PRE_PROBE)
10556 codec->no_jack_detect = 1;
10557 }
10558
10559 static const struct hda_fixup alc861_fixups[] = {
10560 [ALC861_FIXUP_FSC_AMILO_PI1505] = {
10561 .type = HDA_FIXUP_PINS,
10562 .v.pins = (const struct hda_pintbl[]) {
10563 { 0x0b, 0x0221101f },
10564 { 0x0f, 0x90170310 },
10565 { }
10566 }
10567 },
10568 [ALC861_FIXUP_AMP_VREF_0F] = {
10569 .type = HDA_FIXUP_FUNC,
10570 .v.func = alc861_fixup_asus_amp_vref_0f,
10571 },
10572 [ALC861_FIXUP_NO_JACK_DETECT] = {
10573 .type = HDA_FIXUP_FUNC,
10574 .v.func = alc_fixup_no_jack_detect,
10575 },
10576 [ALC861_FIXUP_ASUS_A6RP] = {
10577 .type = HDA_FIXUP_FUNC,
10578 .v.func = alc861_fixup_asus_amp_vref_0f,
10579 .chained = true,
10580 .chain_id = ALC861_FIXUP_NO_JACK_DETECT,
10581 },
10582 [ALC660_FIXUP_ASUS_W7J] = {
10583 .type = HDA_FIXUP_VERBS,
10584 .v.verbs = (const struct hda_verb[]) {
10585
10586
10587
10588 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
10589 { }
10590 },
10591 }
10592 };
10593
10594 static const struct snd_pci_quirk alc861_fixup_tbl[] = {
10595 SND_PCI_QUIRK(0x1043, 0x1253, "ASUS W7J", ALC660_FIXUP_ASUS_W7J),
10596 SND_PCI_QUIRK(0x1043, 0x1263, "ASUS Z35HL", ALC660_FIXUP_ASUS_W7J),
10597 SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP),
10598 SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", ALC861_FIXUP_AMP_VREF_0F),
10599 SND_PCI_QUIRK(0x1462, 0x7254, "HP DX2200", ALC861_FIXUP_NO_JACK_DETECT),
10600 SND_PCI_QUIRK_VENDOR(0x1584, "Haier/Uniwill", ALC861_FIXUP_AMP_VREF_0F),
10601 SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", ALC861_FIXUP_FSC_AMILO_PI1505),
10602 {}
10603 };
10604
10605
10606
10607 static int patch_alc861(struct hda_codec *codec)
10608 {
10609 struct alc_spec *spec;
10610 int err;
10611
10612 err = alc_alloc_spec(codec, 0x15);
10613 if (err < 0)
10614 return err;
10615
10616 spec = codec->spec;
10617 if (has_cdefine_beep(codec))
10618 spec->gen.beep_nid = 0x23;
10619
10620 #ifdef CONFIG_PM
10621 spec->power_hook = alc_power_eapd;
10622 #endif
10623
10624 alc_pre_init(codec);
10625
10626 snd_hda_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);
10627 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
10628
10629
10630 err = alc861_parse_auto_config(codec);
10631 if (err < 0)
10632 goto error;
10633
10634 if (!spec->gen.no_analog) {
10635 err = set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
10636 if (err < 0)
10637 goto error;
10638 }
10639
10640 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
10641
10642 return 0;
10643
10644 error:
10645 alc_free(codec);
10646 return err;
10647 }
10648
10649
10650
10651
10652
10653
10654
10655
10656 static int alc861vd_parse_auto_config(struct hda_codec *codec)
10657 {
10658 static const hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
10659 static const hda_nid_t alc861vd_ssids[] = { 0x15, 0x1b, 0x14, 0 };
10660 return alc_parse_auto_config(codec, alc861vd_ignore, alc861vd_ssids);
10661 }
10662
10663 enum {
10664 ALC660VD_FIX_ASUS_GPIO1,
10665 ALC861VD_FIX_DALLAS,
10666 };
10667
10668
10669 static void alc861vd_fixup_dallas(struct hda_codec *codec,
10670 const struct hda_fixup *fix, int action)
10671 {
10672 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
10673 snd_hda_override_pin_caps(codec, 0x18, 0x00000734);
10674 snd_hda_override_pin_caps(codec, 0x19, 0x0000073c);
10675 }
10676 }
10677
10678
10679 static void alc660vd_fixup_asus_gpio1(struct hda_codec *codec,
10680 const struct hda_fixup *fix, int action)
10681 {
10682 struct alc_spec *spec = codec->spec;
10683
10684 if (action == HDA_FIXUP_ACT_PRE_PROBE)
10685 spec->gpio_mask |= 0x02;
10686 alc_fixup_gpio(codec, action, 0x01);
10687 }
10688
10689 static const struct hda_fixup alc861vd_fixups[] = {
10690 [ALC660VD_FIX_ASUS_GPIO1] = {
10691 .type = HDA_FIXUP_FUNC,
10692 .v.func = alc660vd_fixup_asus_gpio1,
10693 },
10694 [ALC861VD_FIX_DALLAS] = {
10695 .type = HDA_FIXUP_FUNC,
10696 .v.func = alc861vd_fixup_dallas,
10697 },
10698 };
10699
10700 static const struct snd_pci_quirk alc861vd_fixup_tbl[] = {
10701 SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_FIX_DALLAS),
10702 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
10703 SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_FIX_DALLAS),
10704 {}
10705 };
10706
10707
10708
10709 static int patch_alc861vd(struct hda_codec *codec)
10710 {
10711 struct alc_spec *spec;
10712 int err;
10713
10714 err = alc_alloc_spec(codec, 0x0b);
10715 if (err < 0)
10716 return err;
10717
10718 spec = codec->spec;
10719 if (has_cdefine_beep(codec))
10720 spec->gen.beep_nid = 0x23;
10721
10722 spec->shutup = alc_eapd_shutup;
10723
10724 alc_pre_init(codec);
10725
10726 snd_hda_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);
10727 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
10728
10729
10730 err = alc861vd_parse_auto_config(codec);
10731 if (err < 0)
10732 goto error;
10733
10734 if (!spec->gen.no_analog) {
10735 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
10736 if (err < 0)
10737 goto error;
10738 }
10739
10740 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
10741
10742 return 0;
10743
10744 error:
10745 alc_free(codec);
10746 return err;
10747 }
10748
10749
10750
10751
10752
10753
10754
10755
10756
10757
10758
10759
10760
10761
10762
10763
10764
10765 static int alc662_parse_auto_config(struct hda_codec *codec)
10766 {
10767 static const hda_nid_t alc662_ignore[] = { 0x1d, 0 };
10768 static const hda_nid_t alc663_ssids[] = { 0x15, 0x1b, 0x14, 0x21 };
10769 static const hda_nid_t alc662_ssids[] = { 0x15, 0x1b, 0x14, 0 };
10770 const hda_nid_t *ssids;
10771
10772 if (codec->core.vendor_id == 0x10ec0272 || codec->core.vendor_id == 0x10ec0663 ||
10773 codec->core.vendor_id == 0x10ec0665 || codec->core.vendor_id == 0x10ec0670 ||
10774 codec->core.vendor_id == 0x10ec0671)
10775 ssids = alc663_ssids;
10776 else
10777 ssids = alc662_ssids;
10778 return alc_parse_auto_config(codec, alc662_ignore, ssids);
10779 }
10780
10781 static void alc272_fixup_mario(struct hda_codec *codec,
10782 const struct hda_fixup *fix, int action)
10783 {
10784 if (action != HDA_FIXUP_ACT_PRE_PROBE)
10785 return;
10786 if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
10787 (0x3b << AC_AMPCAP_OFFSET_SHIFT) |
10788 (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |
10789 (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |
10790 (0 << AC_AMPCAP_MUTE_SHIFT)))
10791 codec_warn(codec, "failed to override amp caps for NID 0x2\n");
10792 }
10793
10794 static const struct snd_pcm_chmap_elem asus_pcm_2_1_chmaps[] = {
10795 { .channels = 2,
10796 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
10797 { .channels = 4,
10798 .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
10799 SNDRV_CHMAP_NA, SNDRV_CHMAP_LFE } },
10800 { }
10801 };
10802
10803
10804 static void alc_fixup_bass_chmap(struct hda_codec *codec,
10805 const struct hda_fixup *fix, int action)
10806 {
10807 if (action == HDA_FIXUP_ACT_BUILD) {
10808 struct alc_spec *spec = codec->spec;
10809 spec->gen.pcm_rec[0]->stream[0].chmap = asus_pcm_2_1_chmaps;
10810 }
10811 }
10812
10813
10814 static unsigned int gpio_led_power_filter(struct hda_codec *codec,
10815 hda_nid_t nid,
10816 unsigned int power_state)
10817 {
10818 struct alc_spec *spec = codec->spec;
10819 if (nid == codec->core.afg && power_state == AC_PWRST_D3 && spec->gpio_data)
10820 return AC_PWRST_D0;
10821 return power_state;
10822 }
10823
10824 static void alc662_fixup_led_gpio1(struct hda_codec *codec,
10825 const struct hda_fixup *fix, int action)
10826 {
10827 struct alc_spec *spec = codec->spec;
10828
10829 alc_fixup_hp_gpio_led(codec, action, 0x01, 0);
10830 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
10831 spec->mute_led_polarity = 1;
10832 codec->power_filter = gpio_led_power_filter;
10833 }
10834 }
10835
10836 static void alc662_usi_automute_hook(struct hda_codec *codec,
10837 struct hda_jack_callback *jack)
10838 {
10839 struct alc_spec *spec = codec->spec;
10840 int vref;
10841 msleep(200);
10842 snd_hda_gen_hp_automute(codec, jack);
10843
10844 vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
10845 msleep(100);
10846 snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
10847 vref);
10848 }
10849
10850 static void alc662_fixup_usi_headset_mic(struct hda_codec *codec,
10851 const struct hda_fixup *fix, int action)
10852 {
10853 struct alc_spec *spec = codec->spec;
10854 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
10855 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
10856 spec->gen.hp_automute_hook = alc662_usi_automute_hook;
10857 }
10858 }
10859
10860 static void alc662_aspire_ethos_mute_speakers(struct hda_codec *codec,
10861 struct hda_jack_callback *cb)
10862 {
10863
10864
10865
10866
10867
10868
10869 if (snd_hda_jack_detect_state(codec, 0x1b) == HDA_JACK_PRESENT) {
10870 snd_hda_set_pin_ctl_cache(codec, 0x15, 0);
10871 snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
10872 } else {
10873 snd_hda_set_pin_ctl_cache(codec, 0x15, PIN_OUT);
10874 snd_hda_set_pin_ctl_cache(codec, 0x18, PIN_OUT);
10875 }
10876 }
10877
10878 static void alc662_fixup_aspire_ethos_hp(struct hda_codec *codec,
10879 const struct hda_fixup *fix, int action)
10880 {
10881
10882 if (!is_jack_detectable(codec, 0x1b))
10883 return;
10884
10885 switch (action) {
10886 case HDA_FIXUP_ACT_PRE_PROBE:
10887 snd_hda_jack_detect_enable_callback(codec, 0x1b,
10888 alc662_aspire_ethos_mute_speakers);
10889
10890 alc_setup_gpio(codec, 0x02);
10891 break;
10892 case HDA_FIXUP_ACT_INIT:
10893
10894
10895
10896 alc662_aspire_ethos_mute_speakers(codec, NULL);
10897 break;
10898 }
10899 }
10900
10901 static void alc671_fixup_hp_headset_mic2(struct hda_codec *codec,
10902 const struct hda_fixup *fix, int action)
10903 {
10904 struct alc_spec *spec = codec->spec;
10905
10906 static const struct hda_pintbl pincfgs[] = {
10907 { 0x19, 0x02a11040 },
10908 { 0x1b, 0x0181304f },
10909 { }
10910 };
10911
10912 switch (action) {
10913 case HDA_FIXUP_ACT_PRE_PROBE:
10914 spec->gen.mixer_nid = 0;
10915 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
10916 snd_hda_apply_pincfgs(codec, pincfgs);
10917 break;
10918 case HDA_FIXUP_ACT_INIT:
10919 alc_write_coef_idx(codec, 0x19, 0xa054);
10920 break;
10921 }
10922 }
10923
10924 static void alc897_hp_automute_hook(struct hda_codec *codec,
10925 struct hda_jack_callback *jack)
10926 {
10927 struct alc_spec *spec = codec->spec;
10928 int vref;
10929
10930 snd_hda_gen_hp_automute(codec, jack);
10931 vref = spec->gen.hp_jack_present ? (PIN_HP | AC_PINCTL_VREF_100) : PIN_HP;
10932 snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
10933 vref);
10934 }
10935
10936 static void alc897_fixup_lenovo_headset_mic(struct hda_codec *codec,
10937 const struct hda_fixup *fix, int action)
10938 {
10939 struct alc_spec *spec = codec->spec;
10940 if (action == HDA_FIXUP_ACT_PRE_PROBE) {
10941 spec->gen.hp_automute_hook = alc897_hp_automute_hook;
10942 }
10943 }
10944
10945 static const struct coef_fw alc668_coefs[] = {
10946 WRITE_COEF(0x01, 0xbebe), WRITE_COEF(0x02, 0xaaaa), WRITE_COEF(0x03, 0x0),
10947 WRITE_COEF(0x04, 0x0180), WRITE_COEF(0x06, 0x0), WRITE_COEF(0x07, 0x0f80),
10948 WRITE_COEF(0x08, 0x0031), WRITE_COEF(0x0a, 0x0060), WRITE_COEF(0x0b, 0x0),
10949 WRITE_COEF(0x0c, 0x7cf7), WRITE_COEF(0x0d, 0x1080), WRITE_COEF(0x0e, 0x7f7f),
10950 WRITE_COEF(0x0f, 0xcccc), WRITE_COEF(0x10, 0xddcc), WRITE_COEF(0x11, 0x0001),
10951 WRITE_COEF(0x13, 0x0), WRITE_COEF(0x14, 0x2aa0), WRITE_COEF(0x17, 0xa940),
10952 WRITE_COEF(0x19, 0x0), WRITE_COEF(0x1a, 0x0), WRITE_COEF(0x1b, 0x0),
10953 WRITE_COEF(0x1c, 0x0), WRITE_COEF(0x1d, 0x0), WRITE_COEF(0x1e, 0x7418),
10954 WRITE_COEF(0x1f, 0x0804), WRITE_COEF(0x20, 0x4200), WRITE_COEF(0x21, 0x0468),
10955 WRITE_COEF(0x22, 0x8ccc), WRITE_COEF(0x23, 0x0250), WRITE_COEF(0x24, 0x7418),
10956 WRITE_COEF(0x27, 0x0), WRITE_COEF(0x28, 0x8ccc), WRITE_COEF(0x2a, 0xff00),
10957 WRITE_COEF(0x2b, 0x8000), WRITE_COEF(0xa7, 0xff00), WRITE_COEF(0xa8, 0x8000),
10958 WRITE_COEF(0xaa, 0x2e17), WRITE_COEF(0xab, 0xa0c0), WRITE_COEF(0xac, 0x0),
10959 WRITE_COEF(0xad, 0x0), WRITE_COEF(0xae, 0x2ac6), WRITE_COEF(0xaf, 0xa480),
10960 WRITE_COEF(0xb0, 0x0), WRITE_COEF(0xb1, 0x0), WRITE_COEF(0xb2, 0x0),
10961 WRITE_COEF(0xb3, 0x0), WRITE_COEF(0xb4, 0x0), WRITE_COEF(0xb5, 0x1040),
10962 WRITE_COEF(0xb6, 0xd697), WRITE_COEF(0xb7, 0x902b), WRITE_COEF(0xb8, 0xd697),
10963 WRITE_COEF(0xb9, 0x902b), WRITE_COEF(0xba, 0xb8ba), WRITE_COEF(0xbb, 0xaaab),
10964 WRITE_COEF(0xbc, 0xaaaf), WRITE_COEF(0xbd, 0x6aaa), WRITE_COEF(0xbe, 0x1c02),
10965 WRITE_COEF(0xc0, 0x00ff), WRITE_COEF(0xc1, 0x0fa6),
10966 {}
10967 };
10968
10969 static void alc668_restore_default_value(struct hda_codec *codec)
10970 {
10971 alc_process_coef_fw(codec, alc668_coefs);
10972 }
10973
10974 enum {
10975 ALC662_FIXUP_ASPIRE,
10976 ALC662_FIXUP_LED_GPIO1,
10977 ALC662_FIXUP_IDEAPAD,
10978 ALC272_FIXUP_MARIO,
10979 ALC662_FIXUP_CZC_ET26,
10980 ALC662_FIXUP_CZC_P10T,
10981 ALC662_FIXUP_SKU_IGNORE,
10982 ALC662_FIXUP_HP_RP5800,
10983 ALC662_FIXUP_ASUS_MODE1,
10984 ALC662_FIXUP_ASUS_MODE2,
10985 ALC662_FIXUP_ASUS_MODE3,
10986 ALC662_FIXUP_ASUS_MODE4,
10987 ALC662_FIXUP_ASUS_MODE5,
10988 ALC662_FIXUP_ASUS_MODE6,
10989 ALC662_FIXUP_ASUS_MODE7,
10990 ALC662_FIXUP_ASUS_MODE8,
10991 ALC662_FIXUP_NO_JACK_DETECT,
10992 ALC662_FIXUP_ZOTAC_Z68,
10993 ALC662_FIXUP_INV_DMIC,
10994 ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
10995 ALC668_FIXUP_DELL_MIC_NO_PRESENCE,
10996 ALC662_FIXUP_HEADSET_MODE,
10997 ALC668_FIXUP_HEADSET_MODE,
10998 ALC662_FIXUP_BASS_MODE4_CHMAP,
10999 ALC662_FIXUP_BASS_16,
11000 ALC662_FIXUP_BASS_1A,
11001 ALC662_FIXUP_BASS_CHMAP,
11002 ALC668_FIXUP_AUTO_MUTE,
11003 ALC668_FIXUP_DELL_DISABLE_AAMIX,
11004 ALC668_FIXUP_DELL_XPS13,
11005 ALC662_FIXUP_ASUS_Nx50,
11006 ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
11007 ALC668_FIXUP_ASUS_Nx51,
11008 ALC668_FIXUP_MIC_COEF,
11009 ALC668_FIXUP_ASUS_G751,
11010 ALC891_FIXUP_HEADSET_MODE,
11011 ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
11012 ALC662_FIXUP_ACER_VERITON,
11013 ALC892_FIXUP_ASROCK_MOBO,
11014 ALC662_FIXUP_USI_FUNC,
11015 ALC662_FIXUP_USI_HEADSET_MODE,
11016 ALC662_FIXUP_LENOVO_MULTI_CODECS,
11017 ALC669_FIXUP_ACER_ASPIRE_ETHOS,
11018 ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET,
11019 ALC671_FIXUP_HP_HEADSET_MIC2,
11020 ALC662_FIXUP_ACER_X2660G_HEADSET_MODE,
11021 ALC662_FIXUP_ACER_NITRO_HEADSET_MODE,
11022 ALC668_FIXUP_ASUS_NO_HEADSET_MIC,
11023 ALC668_FIXUP_HEADSET_MIC,
11024 ALC668_FIXUP_MIC_DET_COEF,
11025 ALC897_FIXUP_LENOVO_HEADSET_MIC,
11026 ALC897_FIXUP_HEADSET_MIC_PIN,
11027 ALC897_FIXUP_HP_HSMIC_VERB,
11028 };
11029
11030 static const struct hda_fixup alc662_fixups[] = {
11031 [ALC662_FIXUP_ASPIRE] = {
11032 .type = HDA_FIXUP_PINS,
11033 .v.pins = (const struct hda_pintbl[]) {
11034 { 0x15, 0x99130112 },
11035 { }
11036 }
11037 },
11038 [ALC662_FIXUP_LED_GPIO1] = {
11039 .type = HDA_FIXUP_FUNC,
11040 .v.func = alc662_fixup_led_gpio1,
11041 },
11042 [ALC662_FIXUP_IDEAPAD] = {
11043 .type = HDA_FIXUP_PINS,
11044 .v.pins = (const struct hda_pintbl[]) {
11045 { 0x17, 0x99130112 },
11046 { }
11047 },
11048 .chained = true,
11049 .chain_id = ALC662_FIXUP_LED_GPIO1,
11050 },
11051 [ALC272_FIXUP_MARIO] = {
11052 .type = HDA_FIXUP_FUNC,
11053 .v.func = alc272_fixup_mario,
11054 },
11055 [ALC662_FIXUP_CZC_ET26] = {
11056 .type = HDA_FIXUP_PINS,
11057 .v.pins = (const struct hda_pintbl[]) {
11058 {0x12, 0x403cc000},
11059 {0x14, 0x90170110},
11060 {0x15, 0x411111f0},
11061 {0x16, 0x411111f0},
11062 {0x18, 0x01a19030},
11063 {0x19, 0x90a7013f},
11064 {0x1a, 0x01014020},
11065 {0x1b, 0x0121401f},
11066 {0x1c, 0x411111f0},
11067 {0x1d, 0x411111f0},
11068 {0x1e, 0x40478e35},
11069 {}
11070 },
11071 .chained = true,
11072 .chain_id = ALC662_FIXUP_SKU_IGNORE
11073 },
11074 [ALC662_FIXUP_CZC_P10T] = {
11075 .type = HDA_FIXUP_VERBS,
11076 .v.verbs = (const struct hda_verb[]) {
11077 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
11078 {}
11079 }
11080 },
11081 [ALC662_FIXUP_SKU_IGNORE] = {
11082 .type = HDA_FIXUP_FUNC,
11083 .v.func = alc_fixup_sku_ignore,
11084 },
11085 [ALC662_FIXUP_HP_RP5800] = {
11086 .type = HDA_FIXUP_PINS,
11087 .v.pins = (const struct hda_pintbl[]) {
11088 { 0x14, 0x0221201f },
11089 { }
11090 },
11091 .chained = true,
11092 .chain_id = ALC662_FIXUP_SKU_IGNORE
11093 },
11094 [ALC662_FIXUP_ASUS_MODE1] = {
11095 .type = HDA_FIXUP_PINS,
11096 .v.pins = (const struct hda_pintbl[]) {
11097 { 0x14, 0x99130110 },
11098 { 0x18, 0x01a19c20 },
11099 { 0x19, 0x99a3092f },
11100 { 0x21, 0x0121401f },
11101 { }
11102 },
11103 .chained = true,
11104 .chain_id = ALC662_FIXUP_SKU_IGNORE
11105 },
11106 [ALC662_FIXUP_ASUS_MODE2] = {
11107 .type = HDA_FIXUP_PINS,
11108 .v.pins = (const struct hda_pintbl[]) {
11109 { 0x14, 0x99130110 },
11110 { 0x18, 0x01a19820 },
11111 { 0x19, 0x99a3092f },
11112 { 0x1b, 0x0121401f },
11113 { }
11114 },
11115 .chained = true,
11116 .chain_id = ALC662_FIXUP_SKU_IGNORE
11117 },
11118 [ALC662_FIXUP_ASUS_MODE3] = {
11119 .type = HDA_FIXUP_PINS,
11120 .v.pins = (const struct hda_pintbl[]) {
11121 { 0x14, 0x99130110 },
11122 { 0x15, 0x0121441f },
11123 { 0x18, 0x01a19840 },
11124 { 0x19, 0x99a3094f },
11125 { 0x21, 0x01211420 },
11126 { }
11127 },
11128 .chained = true,
11129 .chain_id = ALC662_FIXUP_SKU_IGNORE
11130 },
11131 [ALC662_FIXUP_ASUS_MODE4] = {
11132 .type = HDA_FIXUP_PINS,
11133 .v.pins = (const struct hda_pintbl[]) {
11134 { 0x14, 0x99130110 },
11135 { 0x16, 0x99130111 },
11136 { 0x18, 0x01a19840 },
11137 { 0x19, 0x99a3094f },
11138 { 0x21, 0x0121441f },
11139 { }
11140 },
11141 .chained = true,
11142 .chain_id = ALC662_FIXUP_SKU_IGNORE
11143 },
11144 [ALC662_FIXUP_ASUS_MODE5] = {
11145 .type = HDA_FIXUP_PINS,
11146 .v.pins = (const struct hda_pintbl[]) {
11147 { 0x14, 0x99130110 },
11148 { 0x15, 0x0121441f },
11149 { 0x16, 0x99130111 },
11150 { 0x18, 0x01a19840 },
11151 { 0x19, 0x99a3094f },
11152 { }
11153 },
11154 .chained = true,
11155 .chain_id = ALC662_FIXUP_SKU_IGNORE
11156 },
11157 [ALC662_FIXUP_ASUS_MODE6] = {
11158 .type = HDA_FIXUP_PINS,
11159 .v.pins = (const struct hda_pintbl[]) {
11160 { 0x14, 0x99130110 },
11161 { 0x15, 0x01211420 },
11162 { 0x18, 0x01a19840 },
11163 { 0x19, 0x99a3094f },
11164 { 0x1b, 0x0121441f },
11165 { }
11166 },
11167 .chained = true,
11168 .chain_id = ALC662_FIXUP_SKU_IGNORE
11169 },
11170 [ALC662_FIXUP_ASUS_MODE7] = {
11171 .type = HDA_FIXUP_PINS,
11172 .v.pins = (const struct hda_pintbl[]) {
11173 { 0x14, 0x99130110 },
11174 { 0x17, 0x99130111 },
11175 { 0x18, 0x01a19840 },
11176 { 0x19, 0x99a3094f },
11177 { 0x1b, 0x01214020 },
11178 { 0x21, 0x0121401f },
11179 { }
11180 },
11181 .chained = true,
11182 .chain_id = ALC662_FIXUP_SKU_IGNORE
11183 },
11184 [ALC662_FIXUP_ASUS_MODE8] = {
11185 .type = HDA_FIXUP_PINS,
11186 .v.pins = (const struct hda_pintbl[]) {
11187 { 0x14, 0x99130110 },
11188 { 0x12, 0x99a30970 },
11189 { 0x15, 0x01214020 },
11190 { 0x17, 0x99130111 },
11191 { 0x18, 0x01a19840 },
11192 { 0x21, 0x0121401f },
11193 { }
11194 },
11195 .chained = true,
11196 .chain_id = ALC662_FIXUP_SKU_IGNORE
11197 },
11198 [ALC662_FIXUP_NO_JACK_DETECT] = {
11199 .type = HDA_FIXUP_FUNC,
11200 .v.func = alc_fixup_no_jack_detect,
11201 },
11202 [ALC662_FIXUP_ZOTAC_Z68] = {
11203 .type = HDA_FIXUP_PINS,
11204 .v.pins = (const struct hda_pintbl[]) {
11205 { 0x1b, 0x02214020 },
11206 { }
11207 }
11208 },
11209 [ALC662_FIXUP_INV_DMIC] = {
11210 .type = HDA_FIXUP_FUNC,
11211 .v.func = alc_fixup_inv_dmic,
11212 },
11213 [ALC668_FIXUP_DELL_XPS13] = {
11214 .type = HDA_FIXUP_FUNC,
11215 .v.func = alc_fixup_dell_xps13,
11216 .chained = true,
11217 .chain_id = ALC668_FIXUP_DELL_DISABLE_AAMIX
11218 },
11219 [ALC668_FIXUP_DELL_DISABLE_AAMIX] = {
11220 .type = HDA_FIXUP_FUNC,
11221 .v.func = alc_fixup_disable_aamix,
11222 .chained = true,
11223 .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
11224 },
11225 [ALC668_FIXUP_AUTO_MUTE] = {
11226 .type = HDA_FIXUP_FUNC,
11227 .v.func = alc_fixup_auto_mute_via_amp,
11228 .chained = true,
11229 .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
11230 },
11231 [ALC662_FIXUP_DELL_MIC_NO_PRESENCE] = {
11232 .type = HDA_FIXUP_PINS,
11233 .v.pins = (const struct hda_pintbl[]) {
11234 { 0x19, 0x03a1113c },
11235
11236 { }
11237 },
11238 .chained = true,
11239 .chain_id = ALC662_FIXUP_HEADSET_MODE
11240 },
11241 [ALC662_FIXUP_HEADSET_MODE] = {
11242 .type = HDA_FIXUP_FUNC,
11243 .v.func = alc_fixup_headset_mode_alc662,
11244 },
11245 [ALC668_FIXUP_DELL_MIC_NO_PRESENCE] = {
11246 .type = HDA_FIXUP_PINS,
11247 .v.pins = (const struct hda_pintbl[]) {
11248 { 0x19, 0x03a1913d },
11249 { 0x1b, 0x03a1113c },
11250 { }
11251 },
11252 .chained = true,
11253 .chain_id = ALC668_FIXUP_HEADSET_MODE
11254 },
11255 [ALC668_FIXUP_HEADSET_MODE] = {
11256 .type = HDA_FIXUP_FUNC,
11257 .v.func = alc_fixup_headset_mode_alc668,
11258 },
11259 [ALC662_FIXUP_BASS_MODE4_CHMAP] = {
11260 .type = HDA_FIXUP_FUNC,
11261 .v.func = alc_fixup_bass_chmap,
11262 .chained = true,
11263 .chain_id = ALC662_FIXUP_ASUS_MODE4
11264 },
11265 [ALC662_FIXUP_BASS_16] = {
11266 .type = HDA_FIXUP_PINS,
11267 .v.pins = (const struct hda_pintbl[]) {
11268 {0x16, 0x80106111},
11269 {}
11270 },
11271 .chained = true,
11272 .chain_id = ALC662_FIXUP_BASS_CHMAP,
11273 },
11274 [ALC662_FIXUP_BASS_1A] = {
11275 .type = HDA_FIXUP_PINS,
11276 .v.pins = (const struct hda_pintbl[]) {
11277 {0x1a, 0x80106111},
11278 {}
11279 },
11280 .chained = true,
11281 .chain_id = ALC662_FIXUP_BASS_CHMAP,
11282 },
11283 [ALC662_FIXUP_BASS_CHMAP] = {
11284 .type = HDA_FIXUP_FUNC,
11285 .v.func = alc_fixup_bass_chmap,
11286 },
11287 [ALC662_FIXUP_ASUS_Nx50] = {
11288 .type = HDA_FIXUP_FUNC,
11289 .v.func = alc_fixup_auto_mute_via_amp,
11290 .chained = true,
11291 .chain_id = ALC662_FIXUP_BASS_1A
11292 },
11293 [ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE] = {
11294 .type = HDA_FIXUP_FUNC,
11295 .v.func = alc_fixup_headset_mode_alc668,
11296 .chain_id = ALC662_FIXUP_BASS_CHMAP
11297 },
11298 [ALC668_FIXUP_ASUS_Nx51] = {
11299 .type = HDA_FIXUP_PINS,
11300 .v.pins = (const struct hda_pintbl[]) {
11301 { 0x19, 0x03a1913d },
11302 { 0x1a, 0x90170151 },
11303 { 0x1b, 0x03a1113c },
11304 {}
11305 },
11306 .chained = true,
11307 .chain_id = ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
11308 },
11309 [ALC668_FIXUP_MIC_COEF] = {
11310 .type = HDA_FIXUP_VERBS,
11311 .v.verbs = (const struct hda_verb[]) {
11312 { 0x20, AC_VERB_SET_COEF_INDEX, 0xc3 },
11313 { 0x20, AC_VERB_SET_PROC_COEF, 0x4000 },
11314 {}
11315 },
11316 },
11317 [ALC668_FIXUP_ASUS_G751] = {
11318 .type = HDA_FIXUP_PINS,
11319 .v.pins = (const struct hda_pintbl[]) {
11320 { 0x16, 0x0421101f },
11321 {}
11322 },
11323 .chained = true,
11324 .chain_id = ALC668_FIXUP_MIC_COEF
11325 },
11326 [ALC891_FIXUP_HEADSET_MODE] = {
11327 .type = HDA_FIXUP_FUNC,
11328 .v.func = alc_fixup_headset_mode,
11329 },
11330 [ALC891_FIXUP_DELL_MIC_NO_PRESENCE] = {
11331 .type = HDA_FIXUP_PINS,
11332 .v.pins = (const struct hda_pintbl[]) {
11333 { 0x19, 0x03a1913d },
11334 { 0x1b, 0x03a1113c },
11335 { }
11336 },
11337 .chained = true,
11338 .chain_id = ALC891_FIXUP_HEADSET_MODE
11339 },
11340 [ALC662_FIXUP_ACER_VERITON] = {
11341 .type = HDA_FIXUP_PINS,
11342 .v.pins = (const struct hda_pintbl[]) {
11343 { 0x15, 0x50170120 },
11344 { }
11345 }
11346 },
11347 [ALC892_FIXUP_ASROCK_MOBO] = {
11348 .type = HDA_FIXUP_PINS,
11349 .v.pins = (const struct hda_pintbl[]) {
11350 { 0x15, 0x40f000f0 },
11351 { 0x16, 0x40f000f0 },
11352 { }
11353 }
11354 },
11355 [ALC662_FIXUP_USI_FUNC] = {
11356 .type = HDA_FIXUP_FUNC,
11357 .v.func = alc662_fixup_usi_headset_mic,
11358 },
11359 [ALC662_FIXUP_USI_HEADSET_MODE] = {
11360 .type = HDA_FIXUP_PINS,
11361 .v.pins = (const struct hda_pintbl[]) {
11362 { 0x19, 0x02a1913c },
11363 { 0x18, 0x01a1903d },
11364 { }
11365 },
11366 .chained = true,
11367 .chain_id = ALC662_FIXUP_USI_FUNC
11368 },
11369 [ALC662_FIXUP_LENOVO_MULTI_CODECS] = {
11370 .type = HDA_FIXUP_FUNC,
11371 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
11372 },
11373 [ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET] = {
11374 .type = HDA_FIXUP_FUNC,
11375 .v.func = alc662_fixup_aspire_ethos_hp,
11376 },
11377 [ALC669_FIXUP_ACER_ASPIRE_ETHOS] = {
11378 .type = HDA_FIXUP_PINS,
11379 .v.pins = (const struct hda_pintbl[]) {
11380 { 0x15, 0x92130110 },
11381 { 0x18, 0x99130111 },
11382 { 0x1b, 0x11130012 },
11383 { }
11384 },
11385 .chained = true,
11386 .chain_id = ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET
11387 },
11388 [ALC671_FIXUP_HP_HEADSET_MIC2] = {
11389 .type = HDA_FIXUP_FUNC,
11390 .v.func = alc671_fixup_hp_headset_mic2,
11391 },
11392 [ALC662_FIXUP_ACER_X2660G_HEADSET_MODE] = {
11393 .type = HDA_FIXUP_PINS,
11394 .v.pins = (const struct hda_pintbl[]) {
11395 { 0x1a, 0x02a1113c },
11396 { }
11397 },
11398 .chained = true,
11399 .chain_id = ALC662_FIXUP_USI_FUNC
11400 },
11401 [ALC662_FIXUP_ACER_NITRO_HEADSET_MODE] = {
11402 .type = HDA_FIXUP_PINS,
11403 .v.pins = (const struct hda_pintbl[]) {
11404 { 0x1a, 0x01a11140 },
11405 { 0x1b, 0x0221144f },
11406 { }
11407 },
11408 .chained = true,
11409 .chain_id = ALC662_FIXUP_USI_FUNC
11410 },
11411 [ALC668_FIXUP_ASUS_NO_HEADSET_MIC] = {
11412 .type = HDA_FIXUP_PINS,
11413 .v.pins = (const struct hda_pintbl[]) {
11414 { 0x1b, 0x04a1112c },
11415 { }
11416 },
11417 .chained = true,
11418 .chain_id = ALC668_FIXUP_HEADSET_MIC
11419 },
11420 [ALC668_FIXUP_HEADSET_MIC] = {
11421 .type = HDA_FIXUP_FUNC,
11422 .v.func = alc269_fixup_headset_mic,
11423 .chained = true,
11424 .chain_id = ALC668_FIXUP_MIC_DET_COEF
11425 },
11426 [ALC668_FIXUP_MIC_DET_COEF] = {
11427 .type = HDA_FIXUP_VERBS,
11428 .v.verbs = (const struct hda_verb[]) {
11429 { 0x20, AC_VERB_SET_COEF_INDEX, 0x15 },
11430 { 0x20, AC_VERB_SET_PROC_COEF, 0x0d60 },
11431 {}
11432 },
11433 },
11434 [ALC897_FIXUP_LENOVO_HEADSET_MIC] = {
11435 .type = HDA_FIXUP_FUNC,
11436 .v.func = alc897_fixup_lenovo_headset_mic,
11437 },
11438 [ALC897_FIXUP_HEADSET_MIC_PIN] = {
11439 .type = HDA_FIXUP_PINS,
11440 .v.pins = (const struct hda_pintbl[]) {
11441 { 0x1a, 0x03a11050 },
11442 { }
11443 },
11444 .chained = true,
11445 .chain_id = ALC897_FIXUP_LENOVO_HEADSET_MIC
11446 },
11447 [ALC897_FIXUP_HP_HSMIC_VERB] = {
11448 .type = HDA_FIXUP_PINS,
11449 .v.pins = (const struct hda_pintbl[]) {
11450 { 0x19, 0x01a1913c },
11451 { }
11452 },
11453 },
11454 };
11455
11456 static const struct snd_pci_quirk alc662_fixup_tbl[] = {
11457 SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2),
11458 SND_PCI_QUIRK(0x1025, 0x022f, "Acer Aspire One", ALC662_FIXUP_INV_DMIC),
11459 SND_PCI_QUIRK(0x1025, 0x0241, "Packard Bell DOTS", ALC662_FIXUP_INV_DMIC),
11460 SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
11461 SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),
11462 SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC),
11463 SND_PCI_QUIRK(0x1025, 0x034a, "Gateway LT27", ALC662_FIXUP_INV_DMIC),
11464 SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
11465 SND_PCI_QUIRK(0x1025, 0x0566, "Acer Aspire Ethos 8951G", ALC669_FIXUP_ACER_ASPIRE_ETHOS),
11466 SND_PCI_QUIRK(0x1025, 0x123c, "Acer Nitro N50-600", ALC662_FIXUP_ACER_NITRO_HEADSET_MODE),
11467 SND_PCI_QUIRK(0x1025, 0x124e, "Acer 2660G", ALC662_FIXUP_ACER_X2660G_HEADSET_MODE),
11468 SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11469 SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11470 SND_PCI_QUIRK(0x1028, 0x05fe, "Dell XPS 15", ALC668_FIXUP_DELL_XPS13),
11471 SND_PCI_QUIRK(0x1028, 0x060a, "Dell XPS 13", ALC668_FIXUP_DELL_XPS13),
11472 SND_PCI_QUIRK(0x1028, 0x060d, "Dell M3800", ALC668_FIXUP_DELL_XPS13),
11473 SND_PCI_QUIRK(0x1028, 0x0625, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11474 SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11475 SND_PCI_QUIRK(0x1028, 0x0696, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11476 SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11477 SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11478 SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
11479 SND_PCI_QUIRK(0x103c, 0x8719, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
11480 SND_PCI_QUIRK(0x103c, 0x873e, "HP", ALC671_FIXUP_HP_HEADSET_MIC2),
11481 SND_PCI_QUIRK(0x103c, 0x877e, "HP 288 Pro G6", ALC671_FIXUP_HP_HEADSET_MIC2),
11482 SND_PCI_QUIRK(0x103c, 0x885f, "HP 288 Pro G8", ALC671_FIXUP_HP_HEADSET_MIC2),
11483 SND_PCI_QUIRK(0x1043, 0x1080, "Asus UX501VW", ALC668_FIXUP_HEADSET_MODE),
11484 SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_ASUS_Nx50),
11485 SND_PCI_QUIRK(0x1043, 0x129d, "Asus N750", ALC662_FIXUP_ASUS_Nx50),
11486 SND_PCI_QUIRK(0x1043, 0x12ff, "ASUS G751", ALC668_FIXUP_ASUS_G751),
11487 SND_PCI_QUIRK(0x1043, 0x13df, "Asus N550JX", ALC662_FIXUP_BASS_1A),
11488 SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
11489 SND_PCI_QUIRK(0x1043, 0x15a7, "ASUS UX51VZH", ALC662_FIXUP_BASS_16),
11490 SND_PCI_QUIRK(0x1043, 0x177d, "ASUS N551", ALC668_FIXUP_ASUS_Nx51),
11491 SND_PCI_QUIRK(0x1043, 0x17bd, "ASUS N751", ALC668_FIXUP_ASUS_Nx51),
11492 SND_PCI_QUIRK(0x1043, 0x185d, "ASUS G551JW", ALC668_FIXUP_ASUS_NO_HEADSET_MIC),
11493 SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71SL", ALC662_FIXUP_ASUS_MODE8),
11494 SND_PCI_QUIRK(0x1043, 0x1b73, "ASUS N55SF", ALC662_FIXUP_BASS_16),
11495 SND_PCI_QUIRK(0x1043, 0x1bf3, "ASUS N76VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
11496 SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),
11497 SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
11498 SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
11499 SND_PCI_QUIRK(0x14cd, 0x5003, "USI", ALC662_FIXUP_USI_HEADSET_MODE),
11500 SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC662_FIXUP_LENOVO_MULTI_CODECS),
11501 SND_PCI_QUIRK(0x17aa, 0x1057, "Lenovo P360", ALC897_FIXUP_HEADSET_MIC_PIN),
11502 SND_PCI_QUIRK(0x17aa, 0x32ca, "Lenovo ThinkCentre M80", ALC897_FIXUP_HEADSET_MIC_PIN),
11503 SND_PCI_QUIRK(0x17aa, 0x32cb, "Lenovo ThinkCentre M70", ALC897_FIXUP_HEADSET_MIC_PIN),
11504 SND_PCI_QUIRK(0x17aa, 0x32cf, "Lenovo ThinkCentre M950", ALC897_FIXUP_HEADSET_MIC_PIN),
11505 SND_PCI_QUIRK(0x17aa, 0x32f7, "Lenovo ThinkCentre M90", ALC897_FIXUP_HEADSET_MIC_PIN),
11506 SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
11507 SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
11508 SND_PCI_QUIRK(0x1849, 0x5892, "ASRock B150M", ALC892_FIXUP_ASROCK_MOBO),
11509 SND_PCI_QUIRK(0x19da, 0xa130, "Zotac Z68", ALC662_FIXUP_ZOTAC_Z68),
11510 SND_PCI_QUIRK(0x1b0a, 0x01b8, "ACER Veriton", ALC662_FIXUP_ACER_VERITON),
11511 SND_PCI_QUIRK(0x1b35, 0x1234, "CZC ET26", ALC662_FIXUP_CZC_ET26),
11512 SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
11513
11514 #if 0
11515
11516
11517
11518
11519
11520 SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1),
11521 SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3),
11522 SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1),
11523 SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC662_FIXUP_ASUS_MODE3),
11524 SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
11525 SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11526 SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
11527 SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC662_FIXUP_ASUS_MODE1),
11528 SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC662_FIXUP_ASUS_MODE1),
11529 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11530 SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC662_FIXUP_ASUS_MODE7),
11531 SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC662_FIXUP_ASUS_MODE7),
11532 SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC662_FIXUP_ASUS_MODE8),
11533 SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC662_FIXUP_ASUS_MODE3),
11534 SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC662_FIXUP_ASUS_MODE1),
11535 SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11536 SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_FIXUP_ASUS_MODE2),
11537 SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC662_FIXUP_ASUS_MODE1),
11538 SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11539 SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
11540 SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
11541 SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11542 SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC662_FIXUP_ASUS_MODE1),
11543 SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC662_FIXUP_ASUS_MODE3),
11544 SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_FIXUP_ASUS_MODE2),
11545 SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11546 SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC662_FIXUP_ASUS_MODE5),
11547 SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
11548 SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11549 SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC662_FIXUP_ASUS_MODE1),
11550 SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11551 SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11552 SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC662_FIXUP_ASUS_MODE3),
11553 SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC662_FIXUP_ASUS_MODE3),
11554 SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC662_FIXUP_ASUS_MODE1),
11555 SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC662_FIXUP_ASUS_MODE1),
11556 SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC662_FIXUP_ASUS_MODE1),
11557 SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC662_FIXUP_ASUS_MODE1),
11558 SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC662_FIXUP_ASUS_MODE1),
11559 SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
11560 SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_FIXUP_ASUS_MODE2),
11561 SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC662_FIXUP_ASUS_MODE1),
11562 SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
11563 SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC662_FIXUP_ASUS_MODE3),
11564 SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC662_FIXUP_ASUS_MODE1),
11565 SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC662_FIXUP_ASUS_MODE1),
11566 SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC662_FIXUP_ASUS_MODE1),
11567 SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_FIXUP_ASUS_MODE2),
11568 SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
11569 SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE4),
11570 #endif
11571 {}
11572 };
11573
11574 static const struct hda_model_fixup alc662_fixup_models[] = {
11575 {.id = ALC662_FIXUP_ASPIRE, .name = "aspire"},
11576 {.id = ALC662_FIXUP_IDEAPAD, .name = "ideapad"},
11577 {.id = ALC272_FIXUP_MARIO, .name = "mario"},
11578 {.id = ALC662_FIXUP_HP_RP5800, .name = "hp-rp5800"},
11579 {.id = ALC662_FIXUP_ASUS_MODE1, .name = "asus-mode1"},
11580 {.id = ALC662_FIXUP_ASUS_MODE2, .name = "asus-mode2"},
11581 {.id = ALC662_FIXUP_ASUS_MODE3, .name = "asus-mode3"},
11582 {.id = ALC662_FIXUP_ASUS_MODE4, .name = "asus-mode4"},
11583 {.id = ALC662_FIXUP_ASUS_MODE5, .name = "asus-mode5"},
11584 {.id = ALC662_FIXUP_ASUS_MODE6, .name = "asus-mode6"},
11585 {.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},
11586 {.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},
11587 {.id = ALC662_FIXUP_ZOTAC_Z68, .name = "zotac-z68"},
11588 {.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"},
11589 {.id = ALC662_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc662-headset-multi"},
11590 {.id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
11591 {.id = ALC662_FIXUP_HEADSET_MODE, .name = "alc662-headset"},
11592 {.id = ALC668_FIXUP_HEADSET_MODE, .name = "alc668-headset"},
11593 {.id = ALC662_FIXUP_BASS_16, .name = "bass16"},
11594 {.id = ALC662_FIXUP_BASS_1A, .name = "bass1a"},
11595 {.id = ALC668_FIXUP_AUTO_MUTE, .name = "automute"},
11596 {.id = ALC668_FIXUP_DELL_XPS13, .name = "dell-xps13"},
11597 {.id = ALC662_FIXUP_ASUS_Nx50, .name = "asus-nx50"},
11598 {.id = ALC668_FIXUP_ASUS_Nx51, .name = "asus-nx51"},
11599 {.id = ALC668_FIXUP_ASUS_G751, .name = "asus-g751"},
11600 {.id = ALC891_FIXUP_HEADSET_MODE, .name = "alc891-headset"},
11601 {.id = ALC891_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc891-headset-multi"},
11602 {.id = ALC662_FIXUP_ACER_VERITON, .name = "acer-veriton"},
11603 {.id = ALC892_FIXUP_ASROCK_MOBO, .name = "asrock-mobo"},
11604 {.id = ALC662_FIXUP_USI_HEADSET_MODE, .name = "usi-headset"},
11605 {.id = ALC662_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
11606 {.id = ALC669_FIXUP_ACER_ASPIRE_ETHOS, .name = "aspire-ethos"},
11607 {}
11608 };
11609
11610 static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = {
11611 SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
11612 {0x17, 0x02211010},
11613 {0x18, 0x01a19030},
11614 {0x1a, 0x01813040},
11615 {0x21, 0x01014020}),
11616 SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
11617 {0x16, 0x01813030},
11618 {0x17, 0x02211010},
11619 {0x18, 0x01a19040},
11620 {0x21, 0x01014020}),
11621 SND_HDA_PIN_QUIRK(0x10ec0662, 0x1028, "Dell", ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
11622 {0x14, 0x01014010},
11623 {0x18, 0x01a19020},
11624 {0x1a, 0x0181302f},
11625 {0x1b, 0x0221401f}),
11626 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
11627 {0x12, 0x99a30130},
11628 {0x14, 0x90170110},
11629 {0x15, 0x0321101f},
11630 {0x16, 0x03011020}),
11631 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
11632 {0x12, 0x99a30140},
11633 {0x14, 0x90170110},
11634 {0x15, 0x0321101f},
11635 {0x16, 0x03011020}),
11636 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
11637 {0x12, 0x99a30150},
11638 {0x14, 0x90170110},
11639 {0x15, 0x0321101f},
11640 {0x16, 0x03011020}),
11641 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
11642 {0x14, 0x90170110},
11643 {0x15, 0x0321101f},
11644 {0x16, 0x03011020}),
11645 SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell XPS 15", ALC668_FIXUP_AUTO_MUTE,
11646 {0x12, 0x90a60130},
11647 {0x14, 0x90170110},
11648 {0x15, 0x0321101f}),
11649 SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
11650 {0x14, 0x01014010},
11651 {0x17, 0x90170150},
11652 {0x19, 0x02a11060},
11653 {0x1b, 0x01813030},
11654 {0x21, 0x02211020}),
11655 SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
11656 {0x14, 0x01014010},
11657 {0x18, 0x01a19040},
11658 {0x1b, 0x01813030},
11659 {0x21, 0x02211020}),
11660 SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
11661 {0x14, 0x01014020},
11662 {0x17, 0x90170110},
11663 {0x18, 0x01a19050},
11664 {0x1b, 0x01813040},
11665 {0x21, 0x02211030}),
11666 {}
11667 };
11668
11669
11670
11671 static int patch_alc662(struct hda_codec *codec)
11672 {
11673 struct alc_spec *spec;
11674 int err;
11675
11676 err = alc_alloc_spec(codec, 0x0b);
11677 if (err < 0)
11678 return err;
11679
11680 spec = codec->spec;
11681
11682 spec->shutup = alc_eapd_shutup;
11683
11684
11685 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
11686
11687 alc_fix_pll_init(codec, 0x20, 0x04, 15);
11688
11689 switch (codec->core.vendor_id) {
11690 case 0x10ec0668:
11691 spec->init_hook = alc668_restore_default_value;
11692 break;
11693 }
11694
11695 alc_pre_init(codec);
11696
11697 snd_hda_pick_fixup(codec, alc662_fixup_models,
11698 alc662_fixup_tbl, alc662_fixups);
11699 snd_hda_pick_pin_fixup(codec, alc662_pin_fixup_tbl, alc662_fixups, true);
11700 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
11701
11702 alc_auto_parse_customize_define(codec);
11703
11704 if (has_cdefine_beep(codec))
11705 spec->gen.beep_nid = 0x01;
11706
11707 if ((alc_get_coef0(codec) & (1 << 14)) &&
11708 codec->bus->pci && codec->bus->pci->subsystem_vendor == 0x1025 &&
11709 spec->cdefine.platform_type == 1) {
11710 err = alc_codec_rename(codec, "ALC272X");
11711 if (err < 0)
11712 goto error;
11713 }
11714
11715
11716 err = alc662_parse_auto_config(codec);
11717 if (err < 0)
11718 goto error;
11719
11720 if (!spec->gen.no_analog && spec->gen.beep_nid) {
11721 switch (codec->core.vendor_id) {
11722 case 0x10ec0662:
11723 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
11724 break;
11725 case 0x10ec0272:
11726 case 0x10ec0663:
11727 case 0x10ec0665:
11728 case 0x10ec0668:
11729 err = set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
11730 break;
11731 case 0x10ec0273:
11732 err = set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
11733 break;
11734 }
11735 if (err < 0)
11736 goto error;
11737 }
11738
11739 snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
11740
11741 return 0;
11742
11743 error:
11744 alc_free(codec);
11745 return err;
11746 }
11747
11748
11749
11750
11751
11752 static int alc680_parse_auto_config(struct hda_codec *codec)
11753 {
11754 return alc_parse_auto_config(codec, NULL, NULL);
11755 }
11756
11757
11758
11759 static int patch_alc680(struct hda_codec *codec)
11760 {
11761 int err;
11762
11763
11764 err = alc_alloc_spec(codec, 0);
11765 if (err < 0)
11766 return err;
11767
11768
11769 err = alc680_parse_auto_config(codec);
11770 if (err < 0) {
11771 alc_free(codec);
11772 return err;
11773 }
11774
11775 return 0;
11776 }
11777
11778
11779
11780
11781 static const struct hda_device_id snd_hda_id_realtek[] = {
11782 HDA_CODEC_ENTRY(0x10ec0215, "ALC215", patch_alc269),
11783 HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269),
11784 HDA_CODEC_ENTRY(0x10ec0222, "ALC222", patch_alc269),
11785 HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269),
11786 HDA_CODEC_ENTRY(0x10ec0230, "ALC236", patch_alc269),
11787 HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269),
11788 HDA_CODEC_ENTRY(0x10ec0233, "ALC233", patch_alc269),
11789 HDA_CODEC_ENTRY(0x10ec0234, "ALC234", patch_alc269),
11790 HDA_CODEC_ENTRY(0x10ec0235, "ALC233", patch_alc269),
11791 HDA_CODEC_ENTRY(0x10ec0236, "ALC236", patch_alc269),
11792 HDA_CODEC_ENTRY(0x10ec0245, "ALC245", patch_alc269),
11793 HDA_CODEC_ENTRY(0x10ec0255, "ALC255", patch_alc269),
11794 HDA_CODEC_ENTRY(0x10ec0256, "ALC256", patch_alc269),
11795 HDA_CODEC_ENTRY(0x10ec0257, "ALC257", patch_alc269),
11796 HDA_CODEC_ENTRY(0x10ec0260, "ALC260", patch_alc260),
11797 HDA_CODEC_ENTRY(0x10ec0262, "ALC262", patch_alc262),
11798 HDA_CODEC_ENTRY(0x10ec0267, "ALC267", patch_alc268),
11799 HDA_CODEC_ENTRY(0x10ec0268, "ALC268", patch_alc268),
11800 HDA_CODEC_ENTRY(0x10ec0269, "ALC269", patch_alc269),
11801 HDA_CODEC_ENTRY(0x10ec0270, "ALC270", patch_alc269),
11802 HDA_CODEC_ENTRY(0x10ec0272, "ALC272", patch_alc662),
11803 HDA_CODEC_ENTRY(0x10ec0274, "ALC274", patch_alc269),
11804 HDA_CODEC_ENTRY(0x10ec0275, "ALC275", patch_alc269),
11805 HDA_CODEC_ENTRY(0x10ec0276, "ALC276", patch_alc269),
11806 HDA_CODEC_ENTRY(0x10ec0280, "ALC280", patch_alc269),
11807 HDA_CODEC_ENTRY(0x10ec0282, "ALC282", patch_alc269),
11808 HDA_CODEC_ENTRY(0x10ec0283, "ALC283", patch_alc269),
11809 HDA_CODEC_ENTRY(0x10ec0284, "ALC284", patch_alc269),
11810 HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269),
11811 HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269),
11812 HDA_CODEC_ENTRY(0x10ec0287, "ALC287", patch_alc269),
11813 HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269),
11814 HDA_CODEC_ENTRY(0x10ec0289, "ALC289", patch_alc269),
11815 HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269),
11816 HDA_CODEC_ENTRY(0x10ec0292, "ALC292", patch_alc269),
11817 HDA_CODEC_ENTRY(0x10ec0293, "ALC293", patch_alc269),
11818 HDA_CODEC_ENTRY(0x10ec0294, "ALC294", patch_alc269),
11819 HDA_CODEC_ENTRY(0x10ec0295, "ALC295", patch_alc269),
11820 HDA_CODEC_ENTRY(0x10ec0298, "ALC298", patch_alc269),
11821 HDA_CODEC_ENTRY(0x10ec0299, "ALC299", patch_alc269),
11822 HDA_CODEC_ENTRY(0x10ec0300, "ALC300", patch_alc269),
11823 HDA_CODEC_ENTRY(0x10ec0623, "ALC623", patch_alc269),
11824 HDA_CODEC_REV_ENTRY(0x10ec0861, 0x100340, "ALC660", patch_alc861),
11825 HDA_CODEC_ENTRY(0x10ec0660, "ALC660-VD", patch_alc861vd),
11826 HDA_CODEC_ENTRY(0x10ec0861, "ALC861", patch_alc861),
11827 HDA_CODEC_ENTRY(0x10ec0862, "ALC861-VD", patch_alc861vd),
11828 HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100002, "ALC662 rev2", patch_alc882),
11829 HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100101, "ALC662 rev1", patch_alc662),
11830 HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100300, "ALC662 rev3", patch_alc662),
11831 HDA_CODEC_ENTRY(0x10ec0663, "ALC663", patch_alc662),
11832 HDA_CODEC_ENTRY(0x10ec0665, "ALC665", patch_alc662),
11833 HDA_CODEC_ENTRY(0x10ec0667, "ALC667", patch_alc662),
11834 HDA_CODEC_ENTRY(0x10ec0668, "ALC668", patch_alc662),
11835 HDA_CODEC_ENTRY(0x10ec0670, "ALC670", patch_alc662),
11836 HDA_CODEC_ENTRY(0x10ec0671, "ALC671", patch_alc662),
11837 HDA_CODEC_ENTRY(0x10ec0680, "ALC680", patch_alc680),
11838 HDA_CODEC_ENTRY(0x10ec0700, "ALC700", patch_alc269),
11839 HDA_CODEC_ENTRY(0x10ec0701, "ALC701", patch_alc269),
11840 HDA_CODEC_ENTRY(0x10ec0703, "ALC703", patch_alc269),
11841 HDA_CODEC_ENTRY(0x10ec0711, "ALC711", patch_alc269),
11842 HDA_CODEC_ENTRY(0x10ec0867, "ALC891", patch_alc662),
11843 HDA_CODEC_ENTRY(0x10ec0880, "ALC880", patch_alc880),
11844 HDA_CODEC_ENTRY(0x10ec0882, "ALC882", patch_alc882),
11845 HDA_CODEC_ENTRY(0x10ec0883, "ALC883", patch_alc882),
11846 HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100101, "ALC889A", patch_alc882),
11847 HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100103, "ALC889A", patch_alc882),
11848 HDA_CODEC_ENTRY(0x10ec0885, "ALC885", patch_alc882),
11849 HDA_CODEC_ENTRY(0x10ec0887, "ALC887", patch_alc882),
11850 HDA_CODEC_REV_ENTRY(0x10ec0888, 0x100101, "ALC1200", patch_alc882),
11851 HDA_CODEC_ENTRY(0x10ec0888, "ALC888", patch_alc882),
11852 HDA_CODEC_ENTRY(0x10ec0889, "ALC889", patch_alc882),
11853 HDA_CODEC_ENTRY(0x10ec0892, "ALC892", patch_alc662),
11854 HDA_CODEC_ENTRY(0x10ec0897, "ALC897", patch_alc662),
11855 HDA_CODEC_ENTRY(0x10ec0899, "ALC898", patch_alc882),
11856 HDA_CODEC_ENTRY(0x10ec0900, "ALC1150", patch_alc882),
11857 HDA_CODEC_ENTRY(0x10ec0b00, "ALCS1200A", patch_alc882),
11858 HDA_CODEC_ENTRY(0x10ec1168, "ALC1220", patch_alc882),
11859 HDA_CODEC_ENTRY(0x10ec1220, "ALC1220", patch_alc882),
11860 HDA_CODEC_ENTRY(0x19e58326, "HW8326", patch_alc269),
11861 {}
11862 };
11863 MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_realtek);
11864
11865 MODULE_LICENSE("GPL");
11866 MODULE_DESCRIPTION("Realtek HD-audio codec");
11867
11868 static struct hda_codec_driver realtek_driver = {
11869 .id = snd_hda_id_realtek,
11870 };
11871
11872 module_hda_codec_driver(realtek_driver);