linux/sound/pci/hda/patch_realtek.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * Universal Interface for Intel High Definition Audio Codec
   4 *
   5 * HD audio interface patch for Realtek ALC codecs
   6 *
   7 * Copyright (c) 2004 Kailang Yang <kailang@realtek.com.tw>
   8 *                    PeiSen Hou <pshou@realtek.com.tw>
   9 *                    Takashi Iwai <tiwai@suse.de>
  10 *                    Jonathan Woithe <jwoithe@just42.net>
  11 */
  12
  13#include <linux/init.h>
  14#include <linux/delay.h>
  15#include <linux/slab.h>
  16#include <linux/pci.h>
  17#include <linux/dmi.h>
  18#include <linux/module.h>
  19#include <linux/input.h>
  20#include <linux/leds.h>
  21#include <sound/core.h>
  22#include <sound/jack.h>
  23#include <sound/hda_codec.h>
  24#include "hda_local.h"
  25#include "hda_auto_parser.h"
  26#include "hda_jack.h"
  27#include "hda_generic.h"
  28
  29/* keep halting ALC5505 DSP, for power saving */
  30#define HALT_REALTEK_ALC5505
  31
  32/* extra amp-initialization sequence types */
  33enum {
  34        ALC_INIT_UNDEFINED,
  35        ALC_INIT_NONE,
  36        ALC_INIT_DEFAULT,
  37};
  38
  39enum {
  40        ALC_HEADSET_MODE_UNKNOWN,
  41        ALC_HEADSET_MODE_UNPLUGGED,
  42        ALC_HEADSET_MODE_HEADSET,
  43        ALC_HEADSET_MODE_MIC,
  44        ALC_HEADSET_MODE_HEADPHONE,
  45};
  46
  47enum {
  48        ALC_HEADSET_TYPE_UNKNOWN,
  49        ALC_HEADSET_TYPE_CTIA,
  50        ALC_HEADSET_TYPE_OMTP,
  51};
  52
  53enum {
  54        ALC_KEY_MICMUTE_INDEX,
  55};
  56
  57struct alc_customize_define {
  58        unsigned int  sku_cfg;
  59        unsigned char port_connectivity;
  60        unsigned char check_sum;
  61        unsigned char customization;
  62        unsigned char external_amp;
  63        unsigned int  enable_pcbeep:1;
  64        unsigned int  platform_type:1;
  65        unsigned int  swap:1;
  66        unsigned int  override:1;
  67        unsigned int  fixup:1; /* Means that this sku is set by driver, not read from hw */
  68};
  69
  70struct alc_coef_led {
  71        unsigned int idx;
  72        unsigned int mask;
  73        unsigned int on;
  74        unsigned int off;
  75};
  76
  77struct alc_spec {
  78        struct hda_gen_spec gen; /* must be at head */
  79
  80        /* codec parameterization */
  81        struct alc_customize_define cdefine;
  82        unsigned int parse_flags; /* flag for snd_hda_parse_pin_defcfg() */
  83
  84        /* GPIO bits */
  85        unsigned int gpio_mask;
  86        unsigned int gpio_dir;
  87        unsigned int gpio_data;
  88        bool gpio_write_delay;  /* add a delay before writing gpio_data */
  89
  90        /* mute LED for HP laptops, see vref_mute_led_set() */
  91        int mute_led_polarity;
  92        int micmute_led_polarity;
  93        hda_nid_t mute_led_nid;
  94        hda_nid_t cap_mute_led_nid;
  95
  96        unsigned int gpio_mute_led_mask;
  97        unsigned int gpio_mic_led_mask;
  98        struct alc_coef_led mute_led_coef;
  99        struct alc_coef_led mic_led_coef;
 100
 101        hda_nid_t headset_mic_pin;
 102        hda_nid_t headphone_mic_pin;
 103        int current_headset_mode;
 104        int current_headset_type;
 105
 106        /* hooks */
 107        void (*init_hook)(struct hda_codec *codec);
 108#ifdef CONFIG_PM
 109        void (*power_hook)(struct hda_codec *codec);
 110#endif
 111        void (*shutup)(struct hda_codec *codec);
 112        void (*reboot_notify)(struct hda_codec *codec);
 113
 114        int init_amp;
 115        int codec_variant;      /* flag for other variants */
 116        unsigned int has_alc5505_dsp:1;
 117        unsigned int no_depop_delay:1;
 118        unsigned int done_hp_init:1;
 119        unsigned int no_shutup_pins:1;
 120        unsigned int ultra_low_power:1;
 121        unsigned int has_hs_key:1;
 122        unsigned int no_internal_mic_pin:1;
 123
 124        /* for PLL fix */
 125        hda_nid_t pll_nid;
 126        unsigned int pll_coef_idx, pll_coef_bit;
 127        unsigned int coef0;
 128        struct input_dev *kb_dev;
 129        u8 alc_mute_keycode_map[1];
 130};
 131
 132/*
 133 * COEF access helper functions
 134 */
 135
 136static int alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
 137                               unsigned int coef_idx)
 138{
 139        unsigned int val;
 140
 141        snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
 142        val = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PROC_COEF, 0);
 143        return val;
 144}
 145
 146#define alc_read_coef_idx(codec, coef_idx) \
 147        alc_read_coefex_idx(codec, 0x20, coef_idx)
 148
 149static void alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
 150                                 unsigned int coef_idx, unsigned int coef_val)
 151{
 152        snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
 153        snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PROC_COEF, coef_val);
 154}
 155
 156#define alc_write_coef_idx(codec, coef_idx, coef_val) \
 157        alc_write_coefex_idx(codec, 0x20, coef_idx, coef_val)
 158
 159static void alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
 160                                  unsigned int coef_idx, unsigned int mask,
 161                                  unsigned int bits_set)
 162{
 163        unsigned int val = alc_read_coefex_idx(codec, nid, coef_idx);
 164
 165        if (val != -1)
 166                alc_write_coefex_idx(codec, nid, coef_idx,
 167                                     (val & ~mask) | bits_set);
 168}
 169
 170#define alc_update_coef_idx(codec, coef_idx, mask, bits_set)    \
 171        alc_update_coefex_idx(codec, 0x20, coef_idx, mask, bits_set)
 172
 173/* a special bypass for COEF 0; read the cached value at the second time */
 174static unsigned int alc_get_coef0(struct hda_codec *codec)
 175{
 176        struct alc_spec *spec = codec->spec;
 177
 178        if (!spec->coef0)
 179                spec->coef0 = alc_read_coef_idx(codec, 0);
 180        return spec->coef0;
 181}
 182
 183/* coef writes/updates batch */
 184struct coef_fw {
 185        unsigned char nid;
 186        unsigned char idx;
 187        unsigned short mask;
 188        unsigned short val;
 189};
 190
 191#define UPDATE_COEFEX(_nid, _idx, _mask, _val) \
 192        { .nid = (_nid), .idx = (_idx), .mask = (_mask), .val = (_val) }
 193#define WRITE_COEFEX(_nid, _idx, _val) UPDATE_COEFEX(_nid, _idx, -1, _val)
 194#define WRITE_COEF(_idx, _val) WRITE_COEFEX(0x20, _idx, _val)
 195#define UPDATE_COEF(_idx, _mask, _val) UPDATE_COEFEX(0x20, _idx, _mask, _val)
 196
 197static void alc_process_coef_fw(struct hda_codec *codec,
 198                                const struct coef_fw *fw)
 199{
 200        for (; fw->nid; fw++) {
 201                if (fw->mask == (unsigned short)-1)
 202                        alc_write_coefex_idx(codec, fw->nid, fw->idx, fw->val);
 203                else
 204                        alc_update_coefex_idx(codec, fw->nid, fw->idx,
 205                                              fw->mask, fw->val);
 206        }
 207}
 208
 209/*
 210 * GPIO setup tables, used in initialization
 211 */
 212
 213/* Enable GPIO mask and set output */
 214static void alc_setup_gpio(struct hda_codec *codec, unsigned int mask)
 215{
 216        struct alc_spec *spec = codec->spec;
 217
 218        spec->gpio_mask |= mask;
 219        spec->gpio_dir |= mask;
 220        spec->gpio_data |= mask;
 221}
 222
 223static void alc_write_gpio_data(struct hda_codec *codec)
 224{
 225        struct alc_spec *spec = codec->spec;
 226
 227        snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
 228                            spec->gpio_data);
 229}
 230
 231static void alc_update_gpio_data(struct hda_codec *codec, unsigned int mask,
 232                                 bool on)
 233{
 234        struct alc_spec *spec = codec->spec;
 235        unsigned int oldval = spec->gpio_data;
 236
 237        if (on)
 238                spec->gpio_data |= mask;
 239        else
 240                spec->gpio_data &= ~mask;
 241        if (oldval != spec->gpio_data)
 242                alc_write_gpio_data(codec);
 243}
 244
 245static void alc_write_gpio(struct hda_codec *codec)
 246{
 247        struct alc_spec *spec = codec->spec;
 248
 249        if (!spec->gpio_mask)
 250                return;
 251
 252        snd_hda_codec_write(codec, codec->core.afg, 0,
 253                            AC_VERB_SET_GPIO_MASK, spec->gpio_mask);
 254        snd_hda_codec_write(codec, codec->core.afg, 0,
 255                            AC_VERB_SET_GPIO_DIRECTION, spec->gpio_dir);
 256        if (spec->gpio_write_delay)
 257                msleep(1);
 258        alc_write_gpio_data(codec);
 259}
 260
 261static void alc_fixup_gpio(struct hda_codec *codec, int action,
 262                           unsigned int mask)
 263{
 264        if (action == HDA_FIXUP_ACT_PRE_PROBE)
 265                alc_setup_gpio(codec, mask);
 266}
 267
 268static void alc_fixup_gpio1(struct hda_codec *codec,
 269                            const struct hda_fixup *fix, int action)
 270{
 271        alc_fixup_gpio(codec, action, 0x01);
 272}
 273
 274static void alc_fixup_gpio2(struct hda_codec *codec,
 275                            const struct hda_fixup *fix, int action)
 276{
 277        alc_fixup_gpio(codec, action, 0x02);
 278}
 279
 280static void alc_fixup_gpio3(struct hda_codec *codec,
 281                            const struct hda_fixup *fix, int action)
 282{
 283        alc_fixup_gpio(codec, action, 0x03);
 284}
 285
 286static void alc_fixup_gpio4(struct hda_codec *codec,
 287                            const struct hda_fixup *fix, int action)
 288{
 289        alc_fixup_gpio(codec, action, 0x04);
 290}
 291
 292static void alc_fixup_micmute_led(struct hda_codec *codec,
 293                                  const struct hda_fixup *fix, int action)
 294{
 295        if (action == HDA_FIXUP_ACT_PROBE)
 296                snd_hda_gen_add_micmute_led_cdev(codec, NULL);
 297}
 298
 299/*
 300 * Fix hardware PLL issue
 301 * On some codecs, the analog PLL gating control must be off while
 302 * the default value is 1.
 303 */
 304static void alc_fix_pll(struct hda_codec *codec)
 305{
 306        struct alc_spec *spec = codec->spec;
 307
 308        if (spec->pll_nid)
 309                alc_update_coefex_idx(codec, spec->pll_nid, spec->pll_coef_idx,
 310                                      1 << spec->pll_coef_bit, 0);
 311}
 312
 313static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
 314                             unsigned int coef_idx, unsigned int coef_bit)
 315{
 316        struct alc_spec *spec = codec->spec;
 317        spec->pll_nid = nid;
 318        spec->pll_coef_idx = coef_idx;
 319        spec->pll_coef_bit = coef_bit;
 320        alc_fix_pll(codec);
 321}
 322
 323/* update the master volume per volume-knob's unsol event */
 324static void alc_update_knob_master(struct hda_codec *codec,
 325                                   struct hda_jack_callback *jack)
 326{
 327        unsigned int val;
 328        struct snd_kcontrol *kctl;
 329        struct snd_ctl_elem_value *uctl;
 330
 331        kctl = snd_hda_find_mixer_ctl(codec, "Master Playback Volume");
 332        if (!kctl)
 333                return;
 334        uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
 335        if (!uctl)
 336                return;
 337        val = snd_hda_codec_read(codec, jack->nid, 0,
 338                                 AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
 339        val &= HDA_AMP_VOLMASK;
 340        uctl->value.integer.value[0] = val;
 341        uctl->value.integer.value[1] = val;
 342        kctl->put(kctl, uctl);
 343        kfree(uctl);
 344}
 345
 346static void alc880_unsol_event(struct hda_codec *codec, unsigned int res)
 347{
 348        /* For some reason, the res given from ALC880 is broken.
 349           Here we adjust it properly. */
 350        snd_hda_jack_unsol_event(codec, res >> 2);
 351}
 352
 353/* Change EAPD to verb control */
 354static void alc_fill_eapd_coef(struct hda_codec *codec)
 355{
 356        int coef;
 357
 358        coef = alc_get_coef0(codec);
 359
 360        switch (codec->core.vendor_id) {
 361        case 0x10ec0262:
 362                alc_update_coef_idx(codec, 0x7, 0, 1<<5);
 363                break;
 364        case 0x10ec0267:
 365        case 0x10ec0268:
 366                alc_update_coef_idx(codec, 0x7, 0, 1<<13);
 367                break;
 368        case 0x10ec0269:
 369                if ((coef & 0x00f0) == 0x0010)
 370                        alc_update_coef_idx(codec, 0xd, 0, 1<<14);
 371                if ((coef & 0x00f0) == 0x0020)
 372                        alc_update_coef_idx(codec, 0x4, 1<<15, 0);
 373                if ((coef & 0x00f0) == 0x0030)
 374                        alc_update_coef_idx(codec, 0x10, 1<<9, 0);
 375                break;
 376        case 0x10ec0280:
 377        case 0x10ec0284:
 378        case 0x10ec0290:
 379        case 0x10ec0292:
 380                alc_update_coef_idx(codec, 0x4, 1<<15, 0);
 381                break;
 382        case 0x10ec0225:
 383        case 0x10ec0295:
 384        case 0x10ec0299:
 385                alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
 386                fallthrough;
 387        case 0x10ec0215:
 388        case 0x10ec0233:
 389        case 0x10ec0235:
 390        case 0x10ec0236:
 391        case 0x10ec0245:
 392        case 0x10ec0255:
 393        case 0x10ec0256:
 394        case 0x10ec0257:
 395        case 0x10ec0282:
 396        case 0x10ec0283:
 397        case 0x10ec0286:
 398        case 0x10ec0287:
 399        case 0x10ec0288:
 400        case 0x10ec0285:
 401        case 0x10ec0298:
 402        case 0x10ec0289:
 403        case 0x10ec0300:
 404                alc_update_coef_idx(codec, 0x10, 1<<9, 0);
 405                break;
 406        case 0x10ec0275:
 407                alc_update_coef_idx(codec, 0xe, 0, 1<<0);
 408                break;
 409        case 0x10ec0293:
 410                alc_update_coef_idx(codec, 0xa, 1<<13, 0);
 411                break;
 412        case 0x10ec0234:
 413        case 0x10ec0274:
 414        case 0x10ec0294:
 415        case 0x10ec0700:
 416        case 0x10ec0701:
 417        case 0x10ec0703:
 418        case 0x10ec0711:
 419                alc_update_coef_idx(codec, 0x10, 1<<15, 0);
 420                break;
 421        case 0x10ec0662:
 422                if ((coef & 0x00f0) == 0x0030)
 423                        alc_update_coef_idx(codec, 0x4, 1<<10, 0); /* EAPD Ctrl */
 424                break;
 425        case 0x10ec0272:
 426        case 0x10ec0273:
 427        case 0x10ec0663:
 428        case 0x10ec0665:
 429        case 0x10ec0670:
 430        case 0x10ec0671:
 431        case 0x10ec0672:
 432                alc_update_coef_idx(codec, 0xd, 0, 1<<14); /* EAPD Ctrl */
 433                break;
 434        case 0x10ec0222:
 435        case 0x10ec0623:
 436                alc_update_coef_idx(codec, 0x19, 1<<13, 0);
 437                break;
 438        case 0x10ec0668:
 439                alc_update_coef_idx(codec, 0x7, 3<<13, 0);
 440                break;
 441        case 0x10ec0867:
 442                alc_update_coef_idx(codec, 0x4, 1<<10, 0);
 443                break;
 444        case 0x10ec0888:
 445                if ((coef & 0x00f0) == 0x0020 || (coef & 0x00f0) == 0x0030)
 446                        alc_update_coef_idx(codec, 0x7, 1<<5, 0);
 447                break;
 448        case 0x10ec0892:
 449        case 0x10ec0897:
 450                alc_update_coef_idx(codec, 0x7, 1<<5, 0);
 451                break;
 452        case 0x10ec0899:
 453        case 0x10ec0900:
 454        case 0x10ec0b00:
 455        case 0x10ec1168:
 456        case 0x10ec1220:
 457                alc_update_coef_idx(codec, 0x7, 1<<1, 0);
 458                break;
 459        }
 460}
 461
 462/* additional initialization for ALC888 variants */
 463static void alc888_coef_init(struct hda_codec *codec)
 464{
 465        switch (alc_get_coef0(codec) & 0x00f0) {
 466        /* alc888-VA */
 467        case 0x00:
 468        /* alc888-VB */
 469        case 0x10:
 470                alc_update_coef_idx(codec, 7, 0, 0x2030); /* Turn EAPD to High */
 471                break;
 472        }
 473}
 474
 475/* turn on/off EAPD control (only if available) */
 476static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
 477{
 478        if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
 479                return;
 480        if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
 481                snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
 482                                    on ? 2 : 0);
 483}
 484
 485/* turn on/off EAPD controls of the codec */
 486static void alc_auto_setup_eapd(struct hda_codec *codec, bool on)
 487{
 488        /* We currently only handle front, HP */
 489        static const hda_nid_t pins[] = {
 490                0x0f, 0x10, 0x14, 0x15, 0x17, 0
 491        };
 492        const hda_nid_t *p;
 493        for (p = pins; *p; p++)
 494                set_eapd(codec, *p, on);
 495}
 496
 497static int find_ext_mic_pin(struct hda_codec *codec);
 498
 499static void alc_headset_mic_no_shutup(struct hda_codec *codec)
 500{
 501        const struct hda_pincfg *pin;
 502        int mic_pin = find_ext_mic_pin(codec);
 503        int i;
 504
 505        /* don't shut up pins when unloading the driver; otherwise it breaks
 506         * the default pin setup at the next load of the driver
 507         */
 508        if (codec->bus->shutdown)
 509                return;
 510
 511        snd_array_for_each(&codec->init_pins, i, pin) {
 512                /* use read here for syncing after issuing each verb */
 513                if (pin->nid != mic_pin)
 514                        snd_hda_codec_read(codec, pin->nid, 0,
 515                                        AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
 516        }
 517
 518        codec->pins_shutup = 1;
 519}
 520
 521static void alc_shutup_pins(struct hda_codec *codec)
 522{
 523        struct alc_spec *spec = codec->spec;
 524
 525        switch (codec->core.vendor_id) {
 526        case 0x10ec0283:
 527        case 0x10ec0286:
 528        case 0x10ec0288:
 529        case 0x10ec0298:
 530                alc_headset_mic_no_shutup(codec);
 531                break;
 532        default:
 533                if (!spec->no_shutup_pins)
 534                        snd_hda_shutup_pins(codec);
 535                break;
 536        }
 537}
 538
 539/* generic shutup callback;
 540 * just turning off EAPD and a little pause for avoiding pop-noise
 541 */
 542static void alc_eapd_shutup(struct hda_codec *codec)
 543{
 544        struct alc_spec *spec = codec->spec;
 545
 546        alc_auto_setup_eapd(codec, false);
 547        if (!spec->no_depop_delay)
 548                msleep(200);
 549        alc_shutup_pins(codec);
 550}
 551
 552/* generic EAPD initialization */
 553static void alc_auto_init_amp(struct hda_codec *codec, int type)
 554{
 555        alc_auto_setup_eapd(codec, true);
 556        alc_write_gpio(codec);
 557        switch (type) {
 558        case ALC_INIT_DEFAULT:
 559                switch (codec->core.vendor_id) {
 560                case 0x10ec0260:
 561                        alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x2010);
 562                        break;
 563                case 0x10ec0880:
 564                case 0x10ec0882:
 565                case 0x10ec0883:
 566                case 0x10ec0885:
 567                        alc_update_coef_idx(codec, 7, 0, 0x2030);
 568                        break;
 569                case 0x10ec0888:
 570                        alc888_coef_init(codec);
 571                        break;
 572                }
 573                break;
 574        }
 575}
 576
 577/* get a primary headphone pin if available */
 578static hda_nid_t alc_get_hp_pin(struct alc_spec *spec)
 579{
 580        if (spec->gen.autocfg.hp_pins[0])
 581                return spec->gen.autocfg.hp_pins[0];
 582        if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
 583                return spec->gen.autocfg.line_out_pins[0];
 584        return 0;
 585}
 586
 587/*
 588 * Realtek SSID verification
 589 */
 590
 591/* Could be any non-zero and even value. When used as fixup, tells
 592 * the driver to ignore any present sku defines.
 593 */
 594#define ALC_FIXUP_SKU_IGNORE (2)
 595
 596static void alc_fixup_sku_ignore(struct hda_codec *codec,
 597                                 const struct hda_fixup *fix, int action)
 598{
 599        struct alc_spec *spec = codec->spec;
 600        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
 601                spec->cdefine.fixup = 1;
 602                spec->cdefine.sku_cfg = ALC_FIXUP_SKU_IGNORE;
 603        }
 604}
 605
 606static void alc_fixup_no_depop_delay(struct hda_codec *codec,
 607                                    const struct hda_fixup *fix, int action)
 608{
 609        struct alc_spec *spec = codec->spec;
 610
 611        if (action == HDA_FIXUP_ACT_PROBE) {
 612                spec->no_depop_delay = 1;
 613                codec->depop_delay = 0;
 614        }
 615}
 616
 617static int alc_auto_parse_customize_define(struct hda_codec *codec)
 618{
 619        unsigned int ass, tmp, i;
 620        unsigned nid = 0;
 621        struct alc_spec *spec = codec->spec;
 622
 623        spec->cdefine.enable_pcbeep = 1; /* assume always enabled */
 624
 625        if (spec->cdefine.fixup) {
 626                ass = spec->cdefine.sku_cfg;
 627                if (ass == ALC_FIXUP_SKU_IGNORE)
 628                        return -1;
 629                goto do_sku;
 630        }
 631
 632        if (!codec->bus->pci)
 633                return -1;
 634        ass = codec->core.subsystem_id & 0xffff;
 635        if (ass != codec->bus->pci->subsystem_device && (ass & 1))
 636                goto do_sku;
 637
 638        nid = 0x1d;
 639        if (codec->core.vendor_id == 0x10ec0260)
 640                nid = 0x17;
 641        ass = snd_hda_codec_get_pincfg(codec, nid);
 642
 643        if (!(ass & 1)) {
 644                codec_info(codec, "%s: SKU not ready 0x%08x\n",
 645                           codec->core.chip_name, ass);
 646                return -1;
 647        }
 648
 649        /* check sum */
 650        tmp = 0;
 651        for (i = 1; i < 16; i++) {
 652                if ((ass >> i) & 1)
 653                        tmp++;
 654        }
 655        if (((ass >> 16) & 0xf) != tmp)
 656                return -1;
 657
 658        spec->cdefine.port_connectivity = ass >> 30;
 659        spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
 660        spec->cdefine.check_sum = (ass >> 16) & 0xf;
 661        spec->cdefine.customization = ass >> 8;
 662do_sku:
 663        spec->cdefine.sku_cfg = ass;
 664        spec->cdefine.external_amp = (ass & 0x38) >> 3;
 665        spec->cdefine.platform_type = (ass & 0x4) >> 2;
 666        spec->cdefine.swap = (ass & 0x2) >> 1;
 667        spec->cdefine.override = ass & 0x1;
 668
 669        codec_dbg(codec, "SKU: Nid=0x%x sku_cfg=0x%08x\n",
 670                   nid, spec->cdefine.sku_cfg);
 671        codec_dbg(codec, "SKU: port_connectivity=0x%x\n",
 672                   spec->cdefine.port_connectivity);
 673        codec_dbg(codec, "SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
 674        codec_dbg(codec, "SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
 675        codec_dbg(codec, "SKU: customization=0x%08x\n", spec->cdefine.customization);
 676        codec_dbg(codec, "SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
 677        codec_dbg(codec, "SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
 678        codec_dbg(codec, "SKU: swap=0x%x\n", spec->cdefine.swap);
 679        codec_dbg(codec, "SKU: override=0x%x\n", spec->cdefine.override);
 680
 681        return 0;
 682}
 683
 684/* return the position of NID in the list, or -1 if not found */
 685static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
 686{
 687        int i;
 688        for (i = 0; i < nums; i++)
 689                if (list[i] == nid)
 690                        return i;
 691        return -1;
 692}
 693/* return true if the given NID is found in the list */
 694static bool found_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
 695{
 696        return find_idx_in_nid_list(nid, list, nums) >= 0;
 697}
 698
 699/* check subsystem ID and set up device-specific initialization;
 700 * return 1 if initialized, 0 if invalid SSID
 701 */
 702/* 32-bit subsystem ID for BIOS loading in HD Audio codec.
 703 *      31 ~ 16 :       Manufacture ID
 704 *      15 ~ 8  :       SKU ID
 705 *      7  ~ 0  :       Assembly ID
 706 *      port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
 707 */
 708static int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports)
 709{
 710        unsigned int ass, tmp, i;
 711        unsigned nid;
 712        struct alc_spec *spec = codec->spec;
 713
 714        if (spec->cdefine.fixup) {
 715                ass = spec->cdefine.sku_cfg;
 716                if (ass == ALC_FIXUP_SKU_IGNORE)
 717                        return 0;
 718                goto do_sku;
 719        }
 720
 721        ass = codec->core.subsystem_id & 0xffff;
 722        if (codec->bus->pci &&
 723            ass != codec->bus->pci->subsystem_device && (ass & 1))
 724                goto do_sku;
 725
 726        /* invalid SSID, check the special NID pin defcfg instead */
 727        /*
 728         * 31~30        : port connectivity
 729         * 29~21        : reserve
 730         * 20           : PCBEEP input
 731         * 19~16        : Check sum (15:1)
 732         * 15~1         : Custom
 733         * 0            : override
 734        */
 735        nid = 0x1d;
 736        if (codec->core.vendor_id == 0x10ec0260)
 737                nid = 0x17;
 738        ass = snd_hda_codec_get_pincfg(codec, nid);
 739        codec_dbg(codec,
 740                  "realtek: No valid SSID, checking pincfg 0x%08x for NID 0x%x\n",
 741                   ass, nid);
 742        if (!(ass & 1))
 743                return 0;
 744        if ((ass >> 30) != 1)   /* no physical connection */
 745                return 0;
 746
 747        /* check sum */
 748        tmp = 0;
 749        for (i = 1; i < 16; i++) {
 750                if ((ass >> i) & 1)
 751                        tmp++;
 752        }
 753        if (((ass >> 16) & 0xf) != tmp)
 754                return 0;
 755do_sku:
 756        codec_dbg(codec, "realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
 757                   ass & 0xffff, codec->core.vendor_id);
 758        /*
 759         * 0 : override
 760         * 1 :  Swap Jack
 761         * 2 : 0 --> Desktop, 1 --> Laptop
 762         * 3~5 : External Amplifier control
 763         * 7~6 : Reserved
 764        */
 765        tmp = (ass & 0x38) >> 3;        /* external Amp control */
 766        if (spec->init_amp == ALC_INIT_UNDEFINED) {
 767                switch (tmp) {
 768                case 1:
 769                        alc_setup_gpio(codec, 0x01);
 770                        break;
 771                case 3:
 772                        alc_setup_gpio(codec, 0x02);
 773                        break;
 774                case 7:
 775                        alc_setup_gpio(codec, 0x03);
 776                        break;
 777                case 5:
 778                default:
 779                        spec->init_amp = ALC_INIT_DEFAULT;
 780                        break;
 781                }
 782        }
 783
 784        /* is laptop or Desktop and enable the function "Mute internal speaker
 785         * when the external headphone out jack is plugged"
 786         */
 787        if (!(ass & 0x8000))
 788                return 1;
 789        /*
 790         * 10~8 : Jack location
 791         * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
 792         * 14~13: Resvered
 793         * 15   : 1 --> enable the function "Mute internal speaker
 794         *              when the external headphone out jack is plugged"
 795         */
 796        if (!alc_get_hp_pin(spec)) {
 797                hda_nid_t nid;
 798                tmp = (ass >> 11) & 0x3;        /* HP to chassis */
 799                nid = ports[tmp];
 800                if (found_in_nid_list(nid, spec->gen.autocfg.line_out_pins,
 801                                      spec->gen.autocfg.line_outs))
 802                        return 1;
 803                spec->gen.autocfg.hp_pins[0] = nid;
 804        }
 805        return 1;
 806}
 807
 808/* Check the validity of ALC subsystem-id
 809 * ports contains an array of 4 pin NIDs for port-A, E, D and I */
 810static void alc_ssid_check(struct hda_codec *codec, const hda_nid_t *ports)
 811{
 812        if (!alc_subsystem_id(codec, ports)) {
 813                struct alc_spec *spec = codec->spec;
 814                if (spec->init_amp == ALC_INIT_UNDEFINED) {
 815                        codec_dbg(codec,
 816                                  "realtek: Enable default setup for auto mode as fallback\n");
 817                        spec->init_amp = ALC_INIT_DEFAULT;
 818                }
 819        }
 820}
 821
 822/*
 823 */
 824
 825static void alc_fixup_inv_dmic(struct hda_codec *codec,
 826                               const struct hda_fixup *fix, int action)
 827{
 828        struct alc_spec *spec = codec->spec;
 829
 830        spec->gen.inv_dmic_split = 1;
 831}
 832
 833
 834static int alc_build_controls(struct hda_codec *codec)
 835{
 836        int err;
 837
 838        err = snd_hda_gen_build_controls(codec);
 839        if (err < 0)
 840                return err;
 841
 842        snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_BUILD);
 843        return 0;
 844}
 845
 846
 847/*
 848 * Common callbacks
 849 */
 850
 851static void alc_pre_init(struct hda_codec *codec)
 852{
 853        alc_fill_eapd_coef(codec);
 854}
 855
 856#define is_s3_resume(codec) \
 857        ((codec)->core.dev.power.power_state.event == PM_EVENT_RESUME)
 858#define is_s4_resume(codec) \
 859        ((codec)->core.dev.power.power_state.event == PM_EVENT_RESTORE)
 860
 861static int alc_init(struct hda_codec *codec)
 862{
 863        struct alc_spec *spec = codec->spec;
 864
 865        /* hibernation resume needs the full chip initialization */
 866        if (is_s4_resume(codec))
 867                alc_pre_init(codec);
 868
 869        if (spec->init_hook)
 870                spec->init_hook(codec);
 871
 872        spec->gen.skip_verbs = 1; /* applied in below */
 873        snd_hda_gen_init(codec);
 874        alc_fix_pll(codec);
 875        alc_auto_init_amp(codec, spec->init_amp);
 876        snd_hda_apply_verbs(codec); /* apply verbs here after own init */
 877
 878        snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT);
 879
 880        return 0;
 881}
 882
 883static inline void alc_shutup(struct hda_codec *codec)
 884{
 885        struct alc_spec *spec = codec->spec;
 886
 887        if (!snd_hda_get_bool_hint(codec, "shutup"))
 888                return; /* disabled explicitly by hints */
 889
 890        if (spec && spec->shutup)
 891                spec->shutup(codec);
 892        else
 893                alc_shutup_pins(codec);
 894}
 895
 896static void alc_reboot_notify(struct hda_codec *codec)
 897{
 898        struct alc_spec *spec = codec->spec;
 899
 900        if (spec && spec->reboot_notify)
 901                spec->reboot_notify(codec);
 902        else
 903                alc_shutup(codec);
 904}
 905
 906#define alc_free        snd_hda_gen_free
 907
 908#ifdef CONFIG_PM
 909static void alc_power_eapd(struct hda_codec *codec)
 910{
 911        alc_auto_setup_eapd(codec, false);
 912}
 913
 914static int alc_suspend(struct hda_codec *codec)
 915{
 916        struct alc_spec *spec = codec->spec;
 917        alc_shutup(codec);
 918        if (spec && spec->power_hook)
 919                spec->power_hook(codec);
 920        return 0;
 921}
 922#endif
 923
 924#ifdef CONFIG_PM
 925static int alc_resume(struct hda_codec *codec)
 926{
 927        struct alc_spec *spec = codec->spec;
 928
 929        if (!spec->no_depop_delay)
 930                msleep(150); /* to avoid pop noise */
 931        codec->patch_ops.init(codec);
 932        snd_hda_regmap_sync(codec);
 933        hda_call_check_power_status(codec, 0x01);
 934        return 0;
 935}
 936#endif
 937
 938/*
 939 */
 940static const struct hda_codec_ops alc_patch_ops = {
 941        .build_controls = alc_build_controls,
 942        .build_pcms = snd_hda_gen_build_pcms,
 943        .init = alc_init,
 944        .free = alc_free,
 945        .unsol_event = snd_hda_jack_unsol_event,
 946#ifdef CONFIG_PM
 947        .resume = alc_resume,
 948        .suspend = alc_suspend,
 949        .check_power_status = snd_hda_gen_check_power_status,
 950#endif
 951        .reboot_notify = alc_reboot_notify,
 952};
 953
 954
 955#define alc_codec_rename(codec, name) snd_hda_codec_set_name(codec, name)
 956
 957/*
 958 * Rename codecs appropriately from COEF value or subvendor id
 959 */
 960struct alc_codec_rename_table {
 961        unsigned int vendor_id;
 962        unsigned short coef_mask;
 963        unsigned short coef_bits;
 964        const char *name;
 965};
 966
 967struct alc_codec_rename_pci_table {
 968        unsigned int codec_vendor_id;
 969        unsigned short pci_subvendor;
 970        unsigned short pci_subdevice;
 971        const char *name;
 972};
 973
 974static const struct alc_codec_rename_table rename_tbl[] = {
 975        { 0x10ec0221, 0xf00f, 0x1003, "ALC231" },
 976        { 0x10ec0269, 0xfff0, 0x3010, "ALC277" },
 977        { 0x10ec0269, 0xf0f0, 0x2010, "ALC259" },
 978        { 0x10ec0269, 0xf0f0, 0x3010, "ALC258" },
 979        { 0x10ec0269, 0x00f0, 0x0010, "ALC269VB" },
 980        { 0x10ec0269, 0xffff, 0xa023, "ALC259" },
 981        { 0x10ec0269, 0xffff, 0x6023, "ALC281X" },
 982        { 0x10ec0269, 0x00f0, 0x0020, "ALC269VC" },
 983        { 0x10ec0269, 0x00f0, 0x0030, "ALC269VD" },
 984        { 0x10ec0662, 0xffff, 0x4020, "ALC656" },
 985        { 0x10ec0887, 0x00f0, 0x0030, "ALC887-VD" },
 986        { 0x10ec0888, 0x00f0, 0x0030, "ALC888-VD" },
 987        { 0x10ec0888, 0xf0f0, 0x3020, "ALC886" },
 988        { 0x10ec0899, 0x2000, 0x2000, "ALC899" },
 989        { 0x10ec0892, 0xffff, 0x8020, "ALC661" },
 990        { 0x10ec0892, 0xffff, 0x8011, "ALC661" },
 991        { 0x10ec0892, 0xffff, 0x4011, "ALC656" },
 992        { } /* terminator */
 993};
 994
 995static const struct alc_codec_rename_pci_table rename_pci_tbl[] = {
 996        { 0x10ec0280, 0x1028, 0, "ALC3220" },
 997        { 0x10ec0282, 0x1028, 0, "ALC3221" },
 998        { 0x10ec0283, 0x1028, 0, "ALC3223" },
 999        { 0x10ec0288, 0x1028, 0, "ALC3263" },
1000        { 0x10ec0292, 0x1028, 0, "ALC3226" },
1001        { 0x10ec0293, 0x1028, 0, "ALC3235" },
1002        { 0x10ec0255, 0x1028, 0, "ALC3234" },
1003        { 0x10ec0668, 0x1028, 0, "ALC3661" },
1004        { 0x10ec0275, 0x1028, 0, "ALC3260" },
1005        { 0x10ec0899, 0x1028, 0, "ALC3861" },
1006        { 0x10ec0298, 0x1028, 0, "ALC3266" },
1007        { 0x10ec0236, 0x1028, 0, "ALC3204" },
1008        { 0x10ec0256, 0x1028, 0, "ALC3246" },
1009        { 0x10ec0225, 0x1028, 0, "ALC3253" },
1010        { 0x10ec0295, 0x1028, 0, "ALC3254" },
1011        { 0x10ec0299, 0x1028, 0, "ALC3271" },
1012        { 0x10ec0670, 0x1025, 0, "ALC669X" },
1013        { 0x10ec0676, 0x1025, 0, "ALC679X" },
1014        { 0x10ec0282, 0x1043, 0, "ALC3229" },
1015        { 0x10ec0233, 0x1043, 0, "ALC3236" },
1016        { 0x10ec0280, 0x103c, 0, "ALC3228" },
1017        { 0x10ec0282, 0x103c, 0, "ALC3227" },
1018        { 0x10ec0286, 0x103c, 0, "ALC3242" },
1019        { 0x10ec0290, 0x103c, 0, "ALC3241" },
1020        { 0x10ec0668, 0x103c, 0, "ALC3662" },
1021        { 0x10ec0283, 0x17aa, 0, "ALC3239" },
1022        { 0x10ec0292, 0x17aa, 0, "ALC3232" },
1023        { } /* terminator */
1024};
1025
1026static int alc_codec_rename_from_preset(struct hda_codec *codec)
1027{
1028        const struct alc_codec_rename_table *p;
1029        const struct alc_codec_rename_pci_table *q;
1030
1031        for (p = rename_tbl; p->vendor_id; p++) {
1032                if (p->vendor_id != codec->core.vendor_id)
1033                        continue;
1034                if ((alc_get_coef0(codec) & p->coef_mask) == p->coef_bits)
1035                        return alc_codec_rename(codec, p->name);
1036        }
1037
1038        if (!codec->bus->pci)
1039                return 0;
1040        for (q = rename_pci_tbl; q->codec_vendor_id; q++) {
1041                if (q->codec_vendor_id != codec->core.vendor_id)
1042                        continue;
1043                if (q->pci_subvendor != codec->bus->pci->subsystem_vendor)
1044                        continue;
1045                if (!q->pci_subdevice ||
1046                    q->pci_subdevice == codec->bus->pci->subsystem_device)
1047                        return alc_codec_rename(codec, q->name);
1048        }
1049
1050        return 0;
1051}
1052
1053
1054/*
1055 * Digital-beep handlers
1056 */
1057#ifdef CONFIG_SND_HDA_INPUT_BEEP
1058
1059/* additional beep mixers; private_value will be overwritten */
1060static const struct snd_kcontrol_new alc_beep_mixer[] = {
1061        HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
1062        HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
1063};
1064
1065/* set up and create beep controls */
1066static int set_beep_amp(struct alc_spec *spec, hda_nid_t nid,
1067                        int idx, int dir)
1068{
1069        struct snd_kcontrol_new *knew;
1070        unsigned int beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir);
1071        int i;
1072
1073        for (i = 0; i < ARRAY_SIZE(alc_beep_mixer); i++) {
1074                knew = snd_hda_gen_add_kctl(&spec->gen, NULL,
1075                                            &alc_beep_mixer[i]);
1076                if (!knew)
1077                        return -ENOMEM;
1078                knew->private_value = beep_amp;
1079        }
1080        return 0;
1081}
1082
1083static const struct snd_pci_quirk beep_allow_list[] = {
1084        SND_PCI_QUIRK(0x1043, 0x103c, "ASUS", 1),
1085        SND_PCI_QUIRK(0x1043, 0x115d, "ASUS", 1),
1086        SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),
1087        SND_PCI_QUIRK(0x1043, 0x8376, "EeePC", 1),
1088        SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1),
1089        SND_PCI_QUIRK(0x1043, 0x831a, "EeePC", 1),
1090        SND_PCI_QUIRK(0x1043, 0x834a, "EeePC", 1),
1091        SND_PCI_QUIRK(0x1458, 0xa002, "GA-MA790X", 1),
1092        SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),
1093        /* denylist -- no beep available */
1094        SND_PCI_QUIRK(0x17aa, 0x309e, "Lenovo ThinkCentre M73", 0),
1095        SND_PCI_QUIRK(0x17aa, 0x30a3, "Lenovo ThinkCentre M93", 0),
1096        {}
1097};
1098
1099static inline int has_cdefine_beep(struct hda_codec *codec)
1100{
1101        struct alc_spec *spec = codec->spec;
1102        const struct snd_pci_quirk *q;
1103        q = snd_pci_quirk_lookup(codec->bus->pci, beep_allow_list);
1104        if (q)
1105                return q->value;
1106        return spec->cdefine.enable_pcbeep;
1107}
1108#else
1109#define set_beep_amp(spec, nid, idx, dir)       0
1110#define has_cdefine_beep(codec)         0
1111#endif
1112
1113/* parse the BIOS configuration and set up the alc_spec */
1114/* return 1 if successful, 0 if the proper config is not found,
1115 * or a negative error code
1116 */
1117static int alc_parse_auto_config(struct hda_codec *codec,
1118                                 const hda_nid_t *ignore_nids,
1119                                 const hda_nid_t *ssid_nids)
1120{
1121        struct alc_spec *spec = codec->spec;
1122        struct auto_pin_cfg *cfg = &spec->gen.autocfg;
1123        int err;
1124
1125        err = snd_hda_parse_pin_defcfg(codec, cfg, ignore_nids,
1126                                       spec->parse_flags);
1127        if (err < 0)
1128                return err;
1129
1130        if (ssid_nids)
1131                alc_ssid_check(codec, ssid_nids);
1132
1133        err = snd_hda_gen_parse_auto_config(codec, cfg);
1134        if (err < 0)
1135                return err;
1136
1137        return 1;
1138}
1139
1140/* common preparation job for alc_spec */
1141static int alc_alloc_spec(struct hda_codec *codec, hda_nid_t mixer_nid)
1142{
1143        struct alc_spec *spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1144        int err;
1145
1146        if (!spec)
1147                return -ENOMEM;
1148        codec->spec = spec;
1149        snd_hda_gen_spec_init(&spec->gen);
1150        spec->gen.mixer_nid = mixer_nid;
1151        spec->gen.own_eapd_ctl = 1;
1152        codec->single_adc_amp = 1;
1153        /* FIXME: do we need this for all Realtek codec models? */
1154        codec->spdif_status_reset = 1;
1155        codec->forced_resume = 1;
1156        codec->patch_ops = alc_patch_ops;
1157
1158        err = alc_codec_rename_from_preset(codec);
1159        if (err < 0) {
1160                kfree(spec);
1161                return err;
1162        }
1163        return 0;
1164}
1165
1166static int alc880_parse_auto_config(struct hda_codec *codec)
1167{
1168        static const hda_nid_t alc880_ignore[] = { 0x1d, 0 };
1169        static const hda_nid_t alc880_ssids[] = { 0x15, 0x1b, 0x14, 0 };
1170        return alc_parse_auto_config(codec, alc880_ignore, alc880_ssids);
1171}
1172
1173/*
1174 * ALC880 fix-ups
1175 */
1176enum {
1177        ALC880_FIXUP_GPIO1,
1178        ALC880_FIXUP_GPIO2,
1179        ALC880_FIXUP_MEDION_RIM,
1180        ALC880_FIXUP_LG,
1181        ALC880_FIXUP_LG_LW25,
1182        ALC880_FIXUP_W810,
1183        ALC880_FIXUP_EAPD_COEF,
1184        ALC880_FIXUP_TCL_S700,
1185        ALC880_FIXUP_VOL_KNOB,
1186        ALC880_FIXUP_FUJITSU,
1187        ALC880_FIXUP_F1734,
1188        ALC880_FIXUP_UNIWILL,
1189        ALC880_FIXUP_UNIWILL_DIG,
1190        ALC880_FIXUP_Z71V,
1191        ALC880_FIXUP_ASUS_W5A,
1192        ALC880_FIXUP_3ST_BASE,
1193        ALC880_FIXUP_3ST,
1194        ALC880_FIXUP_3ST_DIG,
1195        ALC880_FIXUP_5ST_BASE,
1196        ALC880_FIXUP_5ST,
1197        ALC880_FIXUP_5ST_DIG,
1198        ALC880_FIXUP_6ST_BASE,
1199        ALC880_FIXUP_6ST,
1200        ALC880_FIXUP_6ST_DIG,
1201        ALC880_FIXUP_6ST_AUTOMUTE,
1202};
1203
1204/* enable the volume-knob widget support on NID 0x21 */
1205static void alc880_fixup_vol_knob(struct hda_codec *codec,
1206                                  const struct hda_fixup *fix, int action)
1207{
1208        if (action == HDA_FIXUP_ACT_PROBE)
1209                snd_hda_jack_detect_enable_callback(codec, 0x21,
1210                                                    alc_update_knob_master);
1211}
1212
1213static const struct hda_fixup alc880_fixups[] = {
1214        [ALC880_FIXUP_GPIO1] = {
1215                .type = HDA_FIXUP_FUNC,
1216                .v.func = alc_fixup_gpio1,
1217        },
1218        [ALC880_FIXUP_GPIO2] = {
1219                .type = HDA_FIXUP_FUNC,
1220                .v.func = alc_fixup_gpio2,
1221        },
1222        [ALC880_FIXUP_MEDION_RIM] = {
1223                .type = HDA_FIXUP_VERBS,
1224                .v.verbs = (const struct hda_verb[]) {
1225                        { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1226                        { 0x20, AC_VERB_SET_PROC_COEF,  0x3060 },
1227                        { }
1228                },
1229                .chained = true,
1230                .chain_id = ALC880_FIXUP_GPIO2,
1231        },
1232        [ALC880_FIXUP_LG] = {
1233                .type = HDA_FIXUP_PINS,
1234                .v.pins = (const struct hda_pintbl[]) {
1235                        /* disable bogus unused pins */
1236                        { 0x16, 0x411111f0 },
1237                        { 0x18, 0x411111f0 },
1238                        { 0x1a, 0x411111f0 },
1239                        { }
1240                }
1241        },
1242        [ALC880_FIXUP_LG_LW25] = {
1243                .type = HDA_FIXUP_PINS,
1244                .v.pins = (const struct hda_pintbl[]) {
1245                        { 0x1a, 0x0181344f }, /* line-in */
1246                        { 0x1b, 0x0321403f }, /* headphone */
1247                        { }
1248                }
1249        },
1250        [ALC880_FIXUP_W810] = {
1251                .type = HDA_FIXUP_PINS,
1252                .v.pins = (const struct hda_pintbl[]) {
1253                        /* disable bogus unused pins */
1254                        { 0x17, 0x411111f0 },
1255                        { }
1256                },
1257                .chained = true,
1258                .chain_id = ALC880_FIXUP_GPIO2,
1259        },
1260        [ALC880_FIXUP_EAPD_COEF] = {
1261                .type = HDA_FIXUP_VERBS,
1262                .v.verbs = (const struct hda_verb[]) {
1263                        /* change to EAPD mode */
1264                        { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1265                        { 0x20, AC_VERB_SET_PROC_COEF,  0x3060 },
1266                        {}
1267                },
1268        },
1269        [ALC880_FIXUP_TCL_S700] = {
1270                .type = HDA_FIXUP_VERBS,
1271                .v.verbs = (const struct hda_verb[]) {
1272                        /* change to EAPD mode */
1273                        { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1274                        { 0x20, AC_VERB_SET_PROC_COEF,  0x3070 },
1275                        {}
1276                },
1277                .chained = true,
1278                .chain_id = ALC880_FIXUP_GPIO2,
1279        },
1280        [ALC880_FIXUP_VOL_KNOB] = {
1281                .type = HDA_FIXUP_FUNC,
1282                .v.func = alc880_fixup_vol_knob,
1283        },
1284        [ALC880_FIXUP_FUJITSU] = {
1285                /* override all pins as BIOS on old Amilo is broken */
1286                .type = HDA_FIXUP_PINS,
1287                .v.pins = (const struct hda_pintbl[]) {
1288                        { 0x14, 0x0121401f }, /* HP */
1289                        { 0x15, 0x99030120 }, /* speaker */
1290                        { 0x16, 0x99030130 }, /* bass speaker */
1291                        { 0x17, 0x411111f0 }, /* N/A */
1292                        { 0x18, 0x411111f0 }, /* N/A */
1293                        { 0x19, 0x01a19950 }, /* mic-in */
1294                        { 0x1a, 0x411111f0 }, /* N/A */
1295                        { 0x1b, 0x411111f0 }, /* N/A */
1296                        { 0x1c, 0x411111f0 }, /* N/A */
1297                        { 0x1d, 0x411111f0 }, /* N/A */
1298                        { 0x1e, 0x01454140 }, /* SPDIF out */
1299                        { }
1300                },
1301                .chained = true,
1302                .chain_id = ALC880_FIXUP_VOL_KNOB,
1303        },
1304        [ALC880_FIXUP_F1734] = {
1305                /* almost compatible with FUJITSU, but no bass and SPDIF */
1306                .type = HDA_FIXUP_PINS,
1307                .v.pins = (const struct hda_pintbl[]) {
1308                        { 0x14, 0x0121401f }, /* HP */
1309                        { 0x15, 0x99030120 }, /* speaker */
1310                        { 0x16, 0x411111f0 }, /* N/A */
1311                        { 0x17, 0x411111f0 }, /* N/A */
1312                        { 0x18, 0x411111f0 }, /* N/A */
1313                        { 0x19, 0x01a19950 }, /* mic-in */
1314                        { 0x1a, 0x411111f0 }, /* N/A */
1315                        { 0x1b, 0x411111f0 }, /* N/A */
1316                        { 0x1c, 0x411111f0 }, /* N/A */
1317                        { 0x1d, 0x411111f0 }, /* N/A */
1318                        { 0x1e, 0x411111f0 }, /* N/A */
1319                        { }
1320                },
1321                .chained = true,
1322                .chain_id = ALC880_FIXUP_VOL_KNOB,
1323        },
1324        [ALC880_FIXUP_UNIWILL] = {
1325                /* need to fix HP and speaker pins to be parsed correctly */
1326                .type = HDA_FIXUP_PINS,
1327                .v.pins = (const struct hda_pintbl[]) {
1328                        { 0x14, 0x0121411f }, /* HP */
1329                        { 0x15, 0x99030120 }, /* speaker */
1330                        { 0x16, 0x99030130 }, /* bass speaker */
1331                        { }
1332                },
1333        },
1334        [ALC880_FIXUP_UNIWILL_DIG] = {
1335                .type = HDA_FIXUP_PINS,
1336                .v.pins = (const struct hda_pintbl[]) {
1337                        /* disable bogus unused pins */
1338                        { 0x17, 0x411111f0 },
1339                        { 0x19, 0x411111f0 },
1340                        { 0x1b, 0x411111f0 },
1341                        { 0x1f, 0x411111f0 },
1342                        { }
1343                }
1344        },
1345        [ALC880_FIXUP_Z71V] = {
1346                .type = HDA_FIXUP_PINS,
1347                .v.pins = (const struct hda_pintbl[]) {
1348                        /* set up the whole pins as BIOS is utterly broken */
1349                        { 0x14, 0x99030120 }, /* speaker */
1350                        { 0x15, 0x0121411f }, /* HP */
1351                        { 0x16, 0x411111f0 }, /* N/A */
1352                        { 0x17, 0x411111f0 }, /* N/A */
1353                        { 0x18, 0x01a19950 }, /* mic-in */
1354                        { 0x19, 0x411111f0 }, /* N/A */
1355                        { 0x1a, 0x01813031 }, /* line-in */
1356                        { 0x1b, 0x411111f0 }, /* N/A */
1357                        { 0x1c, 0x411111f0 }, /* N/A */
1358                        { 0x1d, 0x411111f0 }, /* N/A */
1359                        { 0x1e, 0x0144111e }, /* SPDIF */
1360                        { }
1361                }
1362        },
1363        [ALC880_FIXUP_ASUS_W5A] = {
1364                .type = HDA_FIXUP_PINS,
1365                .v.pins = (const struct hda_pintbl[]) {
1366                        /* set up the whole pins as BIOS is utterly broken */
1367                        { 0x14, 0x0121411f }, /* HP */
1368                        { 0x15, 0x411111f0 }, /* N/A */
1369                        { 0x16, 0x411111f0 }, /* N/A */
1370                        { 0x17, 0x411111f0 }, /* N/A */
1371                        { 0x18, 0x90a60160 }, /* mic */
1372                        { 0x19, 0x411111f0 }, /* N/A */
1373                        { 0x1a, 0x411111f0 }, /* N/A */
1374                        { 0x1b, 0x411111f0 }, /* N/A */
1375                        { 0x1c, 0x411111f0 }, /* N/A */
1376                        { 0x1d, 0x411111f0 }, /* N/A */
1377                        { 0x1e, 0xb743111e }, /* SPDIF out */
1378                        { }
1379                },
1380                .chained = true,
1381                .chain_id = ALC880_FIXUP_GPIO1,
1382        },
1383        [ALC880_FIXUP_3ST_BASE] = {
1384                .type = HDA_FIXUP_PINS,
1385                .v.pins = (const struct hda_pintbl[]) {
1386                        { 0x14, 0x01014010 }, /* line-out */
1387                        { 0x15, 0x411111f0 }, /* N/A */
1388                        { 0x16, 0x411111f0 }, /* N/A */
1389                        { 0x17, 0x411111f0 }, /* N/A */
1390                        { 0x18, 0x01a19c30 }, /* mic-in */
1391                        { 0x19, 0x0121411f }, /* HP */
1392                        { 0x1a, 0x01813031 }, /* line-in */
1393                        { 0x1b, 0x02a19c40 }, /* front-mic */
1394                        { 0x1c, 0x411111f0 }, /* N/A */
1395                        { 0x1d, 0x411111f0 }, /* N/A */
1396                        /* 0x1e is filled in below */
1397                        { 0x1f, 0x411111f0 }, /* N/A */
1398                        { }
1399                }
1400        },
1401        [ALC880_FIXUP_3ST] = {
1402                .type = HDA_FIXUP_PINS,
1403                .v.pins = (const struct hda_pintbl[]) {
1404                        { 0x1e, 0x411111f0 }, /* N/A */
1405                        { }
1406                },
1407                .chained = true,
1408                .chain_id = ALC880_FIXUP_3ST_BASE,
1409        },
1410        [ALC880_FIXUP_3ST_DIG] = {
1411                .type = HDA_FIXUP_PINS,
1412                .v.pins = (const struct hda_pintbl[]) {
1413                        { 0x1e, 0x0144111e }, /* SPDIF */
1414                        { }
1415                },
1416                .chained = true,
1417                .chain_id = ALC880_FIXUP_3ST_BASE,
1418        },
1419        [ALC880_FIXUP_5ST_BASE] = {
1420                .type = HDA_FIXUP_PINS,
1421                .v.pins = (const struct hda_pintbl[]) {
1422                        { 0x14, 0x01014010 }, /* front */
1423                        { 0x15, 0x411111f0 }, /* N/A */
1424                        { 0x16, 0x01011411 }, /* CLFE */
1425                        { 0x17, 0x01016412 }, /* surr */
1426                        { 0x18, 0x01a19c30 }, /* mic-in */
1427                        { 0x19, 0x0121411f }, /* HP */
1428                        { 0x1a, 0x01813031 }, /* line-in */
1429                        { 0x1b, 0x02a19c40 }, /* front-mic */
1430                        { 0x1c, 0x411111f0 }, /* N/A */
1431                        { 0x1d, 0x411111f0 }, /* N/A */
1432                        /* 0x1e is filled in below */
1433                        { 0x1f, 0x411111f0 }, /* N/A */
1434                        { }
1435                }
1436        },
1437        [ALC880_FIXUP_5ST] = {
1438                .type = HDA_FIXUP_PINS,
1439                .v.pins = (const struct hda_pintbl[]) {
1440                        { 0x1e, 0x411111f0 }, /* N/A */
1441                        { }
1442                },
1443                .chained = true,
1444                .chain_id = ALC880_FIXUP_5ST_BASE,
1445        },
1446        [ALC880_FIXUP_5ST_DIG] = {
1447                .type = HDA_FIXUP_PINS,
1448                .v.pins = (const struct hda_pintbl[]) {
1449                        { 0x1e, 0x0144111e }, /* SPDIF */
1450                        { }
1451                },
1452                .chained = true,
1453                .chain_id = ALC880_FIXUP_5ST_BASE,
1454        },
1455        [ALC880_FIXUP_6ST_BASE] = {
1456                .type = HDA_FIXUP_PINS,
1457                .v.pins = (const struct hda_pintbl[]) {
1458                        { 0x14, 0x01014010 }, /* front */
1459                        { 0x15, 0x01016412 }, /* surr */
1460                        { 0x16, 0x01011411 }, /* CLFE */
1461                        { 0x17, 0x01012414 }, /* side */
1462                        { 0x18, 0x01a19c30 }, /* mic-in */
1463                        { 0x19, 0x02a19c40 }, /* front-mic */
1464                        { 0x1a, 0x01813031 }, /* line-in */
1465                        { 0x1b, 0x0121411f }, /* HP */
1466                        { 0x1c, 0x411111f0 }, /* N/A */
1467                        { 0x1d, 0x411111f0 }, /* N/A */
1468                        /* 0x1e is filled in below */
1469                        { 0x1f, 0x411111f0 }, /* N/A */
1470                        { }
1471                }
1472        },
1473        [ALC880_FIXUP_6ST] = {
1474                .type = HDA_FIXUP_PINS,
1475                .v.pins = (const struct hda_pintbl[]) {
1476                        { 0x1e, 0x411111f0 }, /* N/A */
1477                        { }
1478                },
1479                .chained = true,
1480                .chain_id = ALC880_FIXUP_6ST_BASE,
1481        },
1482        [ALC880_FIXUP_6ST_DIG] = {
1483                .type = HDA_FIXUP_PINS,
1484                .v.pins = (const struct hda_pintbl[]) {
1485                        { 0x1e, 0x0144111e }, /* SPDIF */
1486                        { }
1487                },
1488                .chained = true,
1489                .chain_id = ALC880_FIXUP_6ST_BASE,
1490        },
1491        [ALC880_FIXUP_6ST_AUTOMUTE] = {
1492                .type = HDA_FIXUP_PINS,
1493                .v.pins = (const struct hda_pintbl[]) {
1494                        { 0x1b, 0x0121401f }, /* HP with jack detect */
1495                        { }
1496                },
1497                .chained_before = true,
1498                .chain_id = ALC880_FIXUP_6ST_BASE,
1499        },
1500};
1501
1502static const struct snd_pci_quirk alc880_fixup_tbl[] = {
1503        SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_FIXUP_W810),
1504        SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS W5A", ALC880_FIXUP_ASUS_W5A),
1505        SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_FIXUP_Z71V),
1506        SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_FIXUP_GPIO1),
1507        SND_PCI_QUIRK(0x147b, 0x1045, "ABit AA8XE", ALC880_FIXUP_6ST_AUTOMUTE),
1508        SND_PCI_QUIRK(0x1558, 0x5401, "Clevo GPIO2", ALC880_FIXUP_GPIO2),
1509        SND_PCI_QUIRK_VENDOR(0x1558, "Clevo", ALC880_FIXUP_EAPD_COEF),
1510        SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_FIXUP_UNIWILL_DIG),
1511        SND_PCI_QUIRK(0x1584, 0x9054, "Uniwill", ALC880_FIXUP_F1734),
1512        SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_FIXUP_UNIWILL),
1513        SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_FIXUP_VOL_KNOB),
1514        SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_FIXUP_W810),
1515        SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_FIXUP_MEDION_RIM),
1516        SND_PCI_QUIRK(0x1631, 0xe011, "PB 13201056", ALC880_FIXUP_6ST_AUTOMUTE),
1517        SND_PCI_QUIRK(0x1734, 0x107c, "FSC Amilo M1437", ALC880_FIXUP_FUJITSU),
1518        SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FIXUP_FUJITSU),
1519        SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_FIXUP_F1734),
1520        SND_PCI_QUIRK(0x1734, 0x10b0, "FSC Amilo Pi1556", ALC880_FIXUP_FUJITSU),
1521        SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_FIXUP_LG),
1522        SND_PCI_QUIRK(0x1854, 0x005f, "LG P1 Express", ALC880_FIXUP_LG),
1523        SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_FIXUP_LG),
1524        SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_FIXUP_LG_LW25),
1525        SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_FIXUP_TCL_S700),
1526
1527        /* Below is the copied entries from alc880_quirks.c.
1528         * It's not quite sure whether BIOS sets the correct pin-config table
1529         * on these machines, thus they are kept to be compatible with
1530         * the old static quirks.  Once when it's confirmed to work without
1531         * these overrides, it'd be better to remove.
1532         */
1533        SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_FIXUP_5ST_DIG),
1534        SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_FIXUP_6ST),
1535        SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_FIXUP_3ST_DIG),
1536        SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_FIXUP_6ST_DIG),
1537        SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_FIXUP_6ST_DIG),
1538        SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_FIXUP_6ST_DIG),
1539        SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_FIXUP_3ST_DIG),
1540        SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_FIXUP_3ST),
1541        SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_FIXUP_6ST_DIG),
1542        SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_FIXUP_3ST),
1543        SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_FIXUP_3ST),
1544        SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_FIXUP_5ST),
1545        SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_FIXUP_5ST),
1546        SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_FIXUP_5ST),
1547        SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_FIXUP_6ST_DIG),
1548        SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_FIXUP_6ST_DIG),
1549        SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_FIXUP_6ST_DIG),
1550        SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_FIXUP_6ST_DIG),
1551        SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_FIXUP_5ST_DIG),
1552        SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_FIXUP_5ST_DIG),
1553        SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_FIXUP_5ST_DIG),
1554        SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_FIXUP_6ST_DIG), /* broken BIOS */
1555        SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_FIXUP_6ST_DIG),
1556        SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1557        SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1558        SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1559        SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1560        SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1561        SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1562        SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1563        SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1564        SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1565        SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1566        /* default Intel */
1567        SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_FIXUP_3ST),
1568        SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_FIXUP_5ST_DIG),
1569        SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_FIXUP_6ST_DIG),
1570        {}
1571};
1572
1573static const struct hda_model_fixup alc880_fixup_models[] = {
1574        {.id = ALC880_FIXUP_3ST, .name = "3stack"},
1575        {.id = ALC880_FIXUP_3ST_DIG, .name = "3stack-digout"},
1576        {.id = ALC880_FIXUP_5ST, .name = "5stack"},
1577        {.id = ALC880_FIXUP_5ST_DIG, .name = "5stack-digout"},
1578        {.id = ALC880_FIXUP_6ST, .name = "6stack"},
1579        {.id = ALC880_FIXUP_6ST_DIG, .name = "6stack-digout"},
1580        {.id = ALC880_FIXUP_6ST_AUTOMUTE, .name = "6stack-automute"},
1581        {}
1582};
1583
1584
1585/*
1586 * OK, here we have finally the patch for ALC880
1587 */
1588static int patch_alc880(struct hda_codec *codec)
1589{
1590        struct alc_spec *spec;
1591        int err;
1592
1593        err = alc_alloc_spec(codec, 0x0b);
1594        if (err < 0)
1595                return err;
1596
1597        spec = codec->spec;
1598        spec->gen.need_dac_fix = 1;
1599        spec->gen.beep_nid = 0x01;
1600
1601        codec->patch_ops.unsol_event = alc880_unsol_event;
1602
1603        alc_pre_init(codec);
1604
1605        snd_hda_pick_fixup(codec, alc880_fixup_models, alc880_fixup_tbl,
1606                       alc880_fixups);
1607        snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1608
1609        /* automatic parse from the BIOS config */
1610        err = alc880_parse_auto_config(codec);
1611        if (err < 0)
1612                goto error;
1613
1614        if (!spec->gen.no_analog) {
1615                err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
1616                if (err < 0)
1617                        goto error;
1618        }
1619
1620        snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
1621
1622        return 0;
1623
1624 error:
1625        alc_free(codec);
1626        return err;
1627}
1628
1629
1630/*
1631 * ALC260 support
1632 */
1633static int alc260_parse_auto_config(struct hda_codec *codec)
1634{
1635        static const hda_nid_t alc260_ignore[] = { 0x17, 0 };
1636        static const hda_nid_t alc260_ssids[] = { 0x10, 0x15, 0x0f, 0 };
1637        return alc_parse_auto_config(codec, alc260_ignore, alc260_ssids);
1638}
1639
1640/*
1641 * Pin config fixes
1642 */
1643enum {
1644        ALC260_FIXUP_HP_DC5750,
1645        ALC260_FIXUP_HP_PIN_0F,
1646        ALC260_FIXUP_COEF,
1647        ALC260_FIXUP_GPIO1,
1648        ALC260_FIXUP_GPIO1_TOGGLE,
1649        ALC260_FIXUP_REPLACER,
1650        ALC260_FIXUP_HP_B1900,
1651        ALC260_FIXUP_KN1,
1652        ALC260_FIXUP_FSC_S7020,
1653        ALC260_FIXUP_FSC_S7020_JWSE,
1654        ALC260_FIXUP_VAIO_PINS,
1655};
1656
1657static void alc260_gpio1_automute(struct hda_codec *codec)
1658{
1659        struct alc_spec *spec = codec->spec;
1660
1661        alc_update_gpio_data(codec, 0x01, spec->gen.hp_jack_present);
1662}
1663
1664static void alc260_fixup_gpio1_toggle(struct hda_codec *codec,
1665                                      const struct hda_fixup *fix, int action)
1666{
1667        struct alc_spec *spec = codec->spec;
1668        if (action == HDA_FIXUP_ACT_PROBE) {
1669                /* although the machine has only one output pin, we need to
1670                 * toggle GPIO1 according to the jack state
1671                 */
1672                spec->gen.automute_hook = alc260_gpio1_automute;
1673                spec->gen.detect_hp = 1;
1674                spec->gen.automute_speaker = 1;
1675                spec->gen.autocfg.hp_pins[0] = 0x0f; /* copy it for automute */
1676                snd_hda_jack_detect_enable_callback(codec, 0x0f,
1677                                                    snd_hda_gen_hp_automute);
1678                alc_setup_gpio(codec, 0x01);
1679        }
1680}
1681
1682static void alc260_fixup_kn1(struct hda_codec *codec,
1683                             const struct hda_fixup *fix, int action)
1684{
1685        struct alc_spec *spec = codec->spec;
1686        static const struct hda_pintbl pincfgs[] = {
1687                { 0x0f, 0x02214000 }, /* HP/speaker */
1688                { 0x12, 0x90a60160 }, /* int mic */
1689                { 0x13, 0x02a19000 }, /* ext mic */
1690                { 0x18, 0x01446000 }, /* SPDIF out */
1691                /* disable bogus I/O pins */
1692                { 0x10, 0x411111f0 },
1693                { 0x11, 0x411111f0 },
1694                { 0x14, 0x411111f0 },
1695                { 0x15, 0x411111f0 },
1696                { 0x16, 0x411111f0 },
1697                { 0x17, 0x411111f0 },
1698                { 0x19, 0x411111f0 },
1699                { }
1700        };
1701
1702        switch (action) {
1703        case HDA_FIXUP_ACT_PRE_PROBE:
1704                snd_hda_apply_pincfgs(codec, pincfgs);
1705                spec->init_amp = ALC_INIT_NONE;
1706                break;
1707        }
1708}
1709
1710static void alc260_fixup_fsc_s7020(struct hda_codec *codec,
1711                                   const struct hda_fixup *fix, int action)
1712{
1713        struct alc_spec *spec = codec->spec;
1714        if (action == HDA_FIXUP_ACT_PRE_PROBE)
1715                spec->init_amp = ALC_INIT_NONE;
1716}
1717
1718static void alc260_fixup_fsc_s7020_jwse(struct hda_codec *codec,
1719                                   const struct hda_fixup *fix, int action)
1720{
1721        struct alc_spec *spec = codec->spec;
1722        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1723                spec->gen.add_jack_modes = 1;
1724                spec->gen.hp_mic = 1;
1725        }
1726}
1727
1728static const struct hda_fixup alc260_fixups[] = {
1729        [ALC260_FIXUP_HP_DC5750] = {
1730                .type = HDA_FIXUP_PINS,
1731                .v.pins = (const struct hda_pintbl[]) {
1732                        { 0x11, 0x90130110 }, /* speaker */
1733                        { }
1734                }
1735        },
1736        [ALC260_FIXUP_HP_PIN_0F] = {
1737                .type = HDA_FIXUP_PINS,
1738                .v.pins = (const struct hda_pintbl[]) {
1739                        { 0x0f, 0x01214000 }, /* HP */
1740                        { }
1741                }
1742        },
1743        [ALC260_FIXUP_COEF] = {
1744                .type = HDA_FIXUP_VERBS,
1745                .v.verbs = (const struct hda_verb[]) {
1746                        { 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1747                        { 0x1a, AC_VERB_SET_PROC_COEF,  0x3040 },
1748                        { }
1749                },
1750        },
1751        [ALC260_FIXUP_GPIO1] = {
1752                .type = HDA_FIXUP_FUNC,
1753                .v.func = alc_fixup_gpio1,
1754        },
1755        [ALC260_FIXUP_GPIO1_TOGGLE] = {
1756                .type = HDA_FIXUP_FUNC,
1757                .v.func = alc260_fixup_gpio1_toggle,
1758                .chained = true,
1759                .chain_id = ALC260_FIXUP_HP_PIN_0F,
1760        },
1761        [ALC260_FIXUP_REPLACER] = {
1762                .type = HDA_FIXUP_VERBS,
1763                .v.verbs = (const struct hda_verb[]) {
1764                        { 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1765                        { 0x1a, AC_VERB_SET_PROC_COEF,  0x3050 },
1766                        { }
1767                },
1768                .chained = true,
1769                .chain_id = ALC260_FIXUP_GPIO1_TOGGLE,
1770        },
1771        [ALC260_FIXUP_HP_B1900] = {
1772                .type = HDA_FIXUP_FUNC,
1773                .v.func = alc260_fixup_gpio1_toggle,
1774                .chained = true,
1775                .chain_id = ALC260_FIXUP_COEF,
1776        },
1777        [ALC260_FIXUP_KN1] = {
1778                .type = HDA_FIXUP_FUNC,
1779                .v.func = alc260_fixup_kn1,
1780        },
1781        [ALC260_FIXUP_FSC_S7020] = {
1782                .type = HDA_FIXUP_FUNC,
1783                .v.func = alc260_fixup_fsc_s7020,
1784        },
1785        [ALC260_FIXUP_FSC_S7020_JWSE] = {
1786                .type = HDA_FIXUP_FUNC,
1787                .v.func = alc260_fixup_fsc_s7020_jwse,
1788                .chained = true,
1789                .chain_id = ALC260_FIXUP_FSC_S7020,
1790        },
1791        [ALC260_FIXUP_VAIO_PINS] = {
1792                .type = HDA_FIXUP_PINS,
1793                .v.pins = (const struct hda_pintbl[]) {
1794                        /* Pin configs are missing completely on some VAIOs */
1795                        { 0x0f, 0x01211020 },
1796                        { 0x10, 0x0001003f },
1797                        { 0x11, 0x411111f0 },
1798                        { 0x12, 0x01a15930 },
1799                        { 0x13, 0x411111f0 },
1800                        { 0x14, 0x411111f0 },
1801                        { 0x15, 0x411111f0 },
1802                        { 0x16, 0x411111f0 },
1803                        { 0x17, 0x411111f0 },
1804                        { 0x18, 0x411111f0 },
1805                        { 0x19, 0x411111f0 },
1806                        { }
1807                }
1808        },
1809};
1810
1811static const struct snd_pci_quirk alc260_fixup_tbl[] = {
1812        SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_FIXUP_GPIO1),
1813        SND_PCI_QUIRK(0x1025, 0x007f, "Acer Aspire 9500", ALC260_FIXUP_COEF),
1814        SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_FIXUP_GPIO1),
1815        SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", ALC260_FIXUP_HP_DC5750),
1816        SND_PCI_QUIRK(0x103c, 0x30ba, "HP Presario B1900", ALC260_FIXUP_HP_B1900),
1817        SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_FIXUP_VAIO_PINS),
1818        SND_PCI_QUIRK(0x104d, 0x81e2, "Sony VAIO TX", ALC260_FIXUP_HP_PIN_0F),
1819        SND_PCI_QUIRK(0x10cf, 0x1326, "FSC LifeBook S7020", ALC260_FIXUP_FSC_S7020),
1820        SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FIXUP_GPIO1),
1821        SND_PCI_QUIRK(0x152d, 0x0729, "Quanta KN1", ALC260_FIXUP_KN1),
1822        SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_FIXUP_REPLACER),
1823        SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_FIXUP_COEF),
1824        {}
1825};
1826
1827static const struct hda_model_fixup alc260_fixup_models[] = {
1828        {.id = ALC260_FIXUP_GPIO1, .name = "gpio1"},
1829        {.id = ALC260_FIXUP_COEF, .name = "coef"},
1830        {.id = ALC260_FIXUP_FSC_S7020, .name = "fujitsu"},
1831        {.id = ALC260_FIXUP_FSC_S7020_JWSE, .name = "fujitsu-jwse"},
1832        {}
1833};
1834
1835/*
1836 */
1837static int patch_alc260(struct hda_codec *codec)
1838{
1839        struct alc_spec *spec;
1840        int err;
1841
1842        err = alc_alloc_spec(codec, 0x07);
1843        if (err < 0)
1844                return err;
1845
1846        spec = codec->spec;
1847        /* as quite a few machines require HP amp for speaker outputs,
1848         * it's easier to enable it unconditionally; even if it's unneeded,
1849         * it's almost harmless.
1850         */
1851        spec->gen.prefer_hp_amp = 1;
1852        spec->gen.beep_nid = 0x01;
1853
1854        spec->shutup = alc_eapd_shutup;
1855
1856        alc_pre_init(codec);
1857
1858        snd_hda_pick_fixup(codec, alc260_fixup_models, alc260_fixup_tbl,
1859                           alc260_fixups);
1860        snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1861
1862        /* automatic parse from the BIOS config */
1863        err = alc260_parse_auto_config(codec);
1864        if (err < 0)
1865                goto error;
1866
1867        if (!spec->gen.no_analog) {
1868                err = set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
1869                if (err < 0)
1870                        goto error;
1871        }
1872
1873        snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
1874
1875        return 0;
1876
1877 error:
1878        alc_free(codec);
1879        return err;
1880}
1881
1882
1883/*
1884 * ALC882/883/885/888/889 support
1885 *
1886 * ALC882 is almost identical with ALC880 but has cleaner and more flexible
1887 * configuration.  Each pin widget can choose any input DACs and a mixer.
1888 * Each ADC is connected from a mixer of all inputs.  This makes possible
1889 * 6-channel independent captures.
1890 *
1891 * In addition, an independent DAC for the multi-playback (not used in this
1892 * driver yet).
1893 */
1894
1895/*
1896 * Pin config fixes
1897 */
1898enum {
1899        ALC882_FIXUP_ABIT_AW9D_MAX,
1900        ALC882_FIXUP_LENOVO_Y530,
1901        ALC882_FIXUP_PB_M5210,
1902        ALC882_FIXUP_ACER_ASPIRE_7736,
1903        ALC882_FIXUP_ASUS_W90V,
1904        ALC889_FIXUP_CD,
1905        ALC889_FIXUP_FRONT_HP_NO_PRESENCE,
1906        ALC889_FIXUP_VAIO_TT,
1907        ALC888_FIXUP_EEE1601,
1908        ALC882_FIXUP_EAPD,
1909        ALC883_FIXUP_EAPD,
1910        ALC883_FIXUP_ACER_EAPD,
1911        ALC882_FIXUP_GPIO1,
1912        ALC882_FIXUP_GPIO2,
1913        ALC882_FIXUP_GPIO3,
1914        ALC889_FIXUP_COEF,
1915        ALC882_FIXUP_ASUS_W2JC,
1916        ALC882_FIXUP_ACER_ASPIRE_4930G,
1917        ALC882_FIXUP_ACER_ASPIRE_8930G,
1918        ALC882_FIXUP_ASPIRE_8930G_VERBS,
1919        ALC885_FIXUP_MACPRO_GPIO,
1920        ALC889_FIXUP_DAC_ROUTE,
1921        ALC889_FIXUP_MBP_VREF,
1922        ALC889_FIXUP_IMAC91_VREF,
1923        ALC889_FIXUP_MBA11_VREF,
1924        ALC889_FIXUP_MBA21_VREF,
1925        ALC889_FIXUP_MP11_VREF,
1926        ALC889_FIXUP_MP41_VREF,
1927        ALC882_FIXUP_INV_DMIC,
1928        ALC882_FIXUP_NO_PRIMARY_HP,
1929        ALC887_FIXUP_ASUS_BASS,
1930        ALC887_FIXUP_BASS_CHMAP,
1931        ALC1220_FIXUP_GB_DUAL_CODECS,
1932        ALC1220_FIXUP_CLEVO_P950,
1933        ALC1220_FIXUP_CLEVO_PB51ED,
1934        ALC1220_FIXUP_CLEVO_PB51ED_PINS,
1935        ALC887_FIXUP_ASUS_AUDIO,
1936        ALC887_FIXUP_ASUS_HMIC,
1937};
1938
1939static void alc889_fixup_coef(struct hda_codec *codec,
1940                              const struct hda_fixup *fix, int action)
1941{
1942        if (action != HDA_FIXUP_ACT_INIT)
1943                return;
1944        alc_update_coef_idx(codec, 7, 0, 0x2030);
1945}
1946
1947/* set up GPIO at initialization */
1948static void alc885_fixup_macpro_gpio(struct hda_codec *codec,
1949                                     const struct hda_fixup *fix, int action)
1950{
1951        struct alc_spec *spec = codec->spec;
1952
1953        spec->gpio_write_delay = true;
1954        alc_fixup_gpio3(codec, fix, action);
1955}
1956
1957/* Fix the connection of some pins for ALC889:
1958 * At least, Acer Aspire 5935 shows the connections to DAC3/4 don't
1959 * work correctly (bko#42740)
1960 */
1961static void alc889_fixup_dac_route(struct hda_codec *codec,
1962                                   const struct hda_fixup *fix, int action)
1963{
1964        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1965                /* fake the connections during parsing the tree */
1966                static const hda_nid_t conn1[] = { 0x0c, 0x0d };
1967                static const hda_nid_t conn2[] = { 0x0e, 0x0f };
1968                snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
1969                snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
1970                snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn2), conn2);
1971                snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn2), conn2);
1972        } else if (action == HDA_FIXUP_ACT_PROBE) {
1973                /* restore the connections */
1974                static const hda_nid_t conn[] = { 0x0c, 0x0d, 0x0e, 0x0f, 0x26 };
1975                snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
1976                snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn), conn);
1977                snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn), conn);
1978                snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn), conn);
1979        }
1980}
1981
1982/* Set VREF on HP pin */
1983static void alc889_fixup_mbp_vref(struct hda_codec *codec,
1984                                  const struct hda_fixup *fix, int action)
1985{
1986        static const hda_nid_t nids[] = { 0x14, 0x15, 0x19 };
1987        struct alc_spec *spec = codec->spec;
1988        int i;
1989
1990        if (action != HDA_FIXUP_ACT_INIT)
1991                return;
1992        for (i = 0; i < ARRAY_SIZE(nids); i++) {
1993                unsigned int val = snd_hda_codec_get_pincfg(codec, nids[i]);
1994                if (get_defcfg_device(val) != AC_JACK_HP_OUT)
1995                        continue;
1996                val = snd_hda_codec_get_pin_target(codec, nids[i]);
1997                val |= AC_PINCTL_VREF_80;
1998                snd_hda_set_pin_ctl(codec, nids[i], val);
1999                spec->gen.keep_vref_in_automute = 1;
2000                break;
2001        }
2002}
2003
2004static void alc889_fixup_mac_pins(struct hda_codec *codec,
2005                                  const hda_nid_t *nids, int num_nids)
2006{
2007        struct alc_spec *spec = codec->spec;
2008        int i;
2009
2010        for (i = 0; i < num_nids; i++) {
2011                unsigned int val;
2012                val = snd_hda_codec_get_pin_target(codec, nids[i]);
2013                val |= AC_PINCTL_VREF_50;
2014                snd_hda_set_pin_ctl(codec, nids[i], val);
2015        }
2016        spec->gen.keep_vref_in_automute = 1;
2017}
2018
2019/* Set VREF on speaker pins on imac91 */
2020static void alc889_fixup_imac91_vref(struct hda_codec *codec,
2021                                     const struct hda_fixup *fix, int action)
2022{
2023        static const hda_nid_t nids[] = { 0x18, 0x1a };
2024
2025        if (action == HDA_FIXUP_ACT_INIT)
2026                alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2027}
2028
2029/* Set VREF on speaker pins on mba11 */
2030static void alc889_fixup_mba11_vref(struct hda_codec *codec,
2031                                    const struct hda_fixup *fix, int action)
2032{
2033        static const hda_nid_t nids[] = { 0x18 };
2034
2035        if (action == HDA_FIXUP_ACT_INIT)
2036                alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2037}
2038
2039/* Set VREF on speaker pins on mba21 */
2040static void alc889_fixup_mba21_vref(struct hda_codec *codec,
2041                                    const struct hda_fixup *fix, int action)
2042{
2043        static const hda_nid_t nids[] = { 0x18, 0x19 };
2044
2045        if (action == HDA_FIXUP_ACT_INIT)
2046                alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2047}
2048
2049/* Don't take HP output as primary
2050 * Strangely, the speaker output doesn't work on Vaio Z and some Vaio
2051 * all-in-one desktop PCs (for example VGC-LN51JGB) through DAC 0x05
2052 */
2053static void alc882_fixup_no_primary_hp(struct hda_codec *codec,
2054                                       const struct hda_fixup *fix, int action)
2055{
2056        struct alc_spec *spec = codec->spec;
2057        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2058                spec->gen.no_primary_hp = 1;
2059                spec->gen.no_multi_io = 1;
2060        }
2061}
2062
2063static void alc_fixup_bass_chmap(struct hda_codec *codec,
2064                                 const struct hda_fixup *fix, int action);
2065
2066/* For dual-codec configuration, we need to disable some features to avoid
2067 * conflicts of kctls and PCM streams
2068 */
2069static void alc_fixup_dual_codecs(struct hda_codec *codec,
2070                                  const struct hda_fixup *fix, int action)
2071{
2072        struct alc_spec *spec = codec->spec;
2073
2074        if (action != HDA_FIXUP_ACT_PRE_PROBE)
2075                return;
2076        /* disable vmaster */
2077        spec->gen.suppress_vmaster = 1;
2078        /* auto-mute and auto-mic switch don't work with multiple codecs */
2079        spec->gen.suppress_auto_mute = 1;
2080        spec->gen.suppress_auto_mic = 1;
2081        /* disable aamix as well */
2082        spec->gen.mixer_nid = 0;
2083        /* add location prefix to avoid conflicts */
2084        codec->force_pin_prefix = 1;
2085}
2086
2087static void rename_ctl(struct hda_codec *codec, const char *oldname,
2088                       const char *newname)
2089{
2090        struct snd_kcontrol *kctl;
2091
2092        kctl = snd_hda_find_mixer_ctl(codec, oldname);
2093        if (kctl)
2094                strcpy(kctl->id.name, newname);
2095}
2096
2097static void alc1220_fixup_gb_dual_codecs(struct hda_codec *codec,
2098                                         const struct hda_fixup *fix,
2099                                         int action)
2100{
2101        alc_fixup_dual_codecs(codec, fix, action);
2102        switch (action) {
2103        case HDA_FIXUP_ACT_PRE_PROBE:
2104                /* override card longname to provide a unique UCM profile */
2105                strcpy(codec->card->longname, "HDAudio-Gigabyte-ALC1220DualCodecs");
2106                break;
2107        case HDA_FIXUP_ACT_BUILD:
2108                /* rename Capture controls depending on the codec */
2109                rename_ctl(codec, "Capture Volume",
2110                           codec->addr == 0 ?
2111                           "Rear-Panel Capture Volume" :
2112                           "Front-Panel Capture Volume");
2113                rename_ctl(codec, "Capture Switch",
2114                           codec->addr == 0 ?
2115                           "Rear-Panel Capture Switch" :
2116                           "Front-Panel Capture Switch");
2117                break;
2118        }
2119}
2120
2121static void alc1220_fixup_clevo_p950(struct hda_codec *codec,
2122                                     const struct hda_fixup *fix,
2123                                     int action)
2124{
2125        static const hda_nid_t conn1[] = { 0x0c };
2126
2127        if (action != HDA_FIXUP_ACT_PRE_PROBE)
2128                return;
2129
2130        alc_update_coef_idx(codec, 0x7, 0, 0x3c3);
2131        /* We therefore want to make sure 0x14 (front headphone) and
2132         * 0x1b (speakers) use the stereo DAC 0x02
2133         */
2134        snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2135        snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
2136}
2137
2138static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
2139                                const struct hda_fixup *fix, int action);
2140
2141static void alc1220_fixup_clevo_pb51ed(struct hda_codec *codec,
2142                                     const struct hda_fixup *fix,
2143                                     int action)
2144{
2145        alc1220_fixup_clevo_p950(codec, fix, action);
2146        alc_fixup_headset_mode_no_hp_mic(codec, fix, action);
2147}
2148
2149static void alc887_asus_hp_automute_hook(struct hda_codec *codec,
2150                                         struct hda_jack_callback *jack)
2151{
2152        struct alc_spec *spec = codec->spec;
2153        unsigned int vref;
2154
2155        snd_hda_gen_hp_automute(codec, jack);
2156
2157        if (spec->gen.hp_jack_present)
2158                vref = AC_PINCTL_VREF_80;
2159        else
2160                vref = AC_PINCTL_VREF_HIZ;
2161        snd_hda_set_pin_ctl(codec, 0x19, PIN_HP | vref);
2162}
2163
2164static void alc887_fixup_asus_jack(struct hda_codec *codec,
2165                                     const struct hda_fixup *fix, int action)
2166{
2167        struct alc_spec *spec = codec->spec;
2168        if (action != HDA_FIXUP_ACT_PROBE)
2169                return;
2170        snd_hda_set_pin_ctl_cache(codec, 0x1b, PIN_HP);
2171        spec->gen.hp_automute_hook = alc887_asus_hp_automute_hook;
2172}
2173
2174static const struct hda_fixup alc882_fixups[] = {
2175        [ALC882_FIXUP_ABIT_AW9D_MAX] = {
2176                .type = HDA_FIXUP_PINS,
2177                .v.pins = (const struct hda_pintbl[]) {
2178                        { 0x15, 0x01080104 }, /* side */
2179                        { 0x16, 0x01011012 }, /* rear */
2180                        { 0x17, 0x01016011 }, /* clfe */
2181                        { }
2182                }
2183        },
2184        [ALC882_FIXUP_LENOVO_Y530] = {
2185                .type = HDA_FIXUP_PINS,
2186                .v.pins = (const struct hda_pintbl[]) {
2187                        { 0x15, 0x99130112 }, /* rear int speakers */
2188                        { 0x16, 0x99130111 }, /* subwoofer */
2189                        { }
2190                }
2191        },
2192        [ALC882_FIXUP_PB_M5210] = {
2193                .type = HDA_FIXUP_PINCTLS,
2194                .v.pins = (const struct hda_pintbl[]) {
2195                        { 0x19, PIN_VREF50 },
2196                        {}
2197                }
2198        },
2199        [ALC882_FIXUP_ACER_ASPIRE_7736] = {
2200                .type = HDA_FIXUP_FUNC,
2201                .v.func = alc_fixup_sku_ignore,
2202        },
2203        [ALC882_FIXUP_ASUS_W90V] = {
2204                .type = HDA_FIXUP_PINS,
2205                .v.pins = (const struct hda_pintbl[]) {
2206                        { 0x16, 0x99130110 }, /* fix sequence for CLFE */
2207                        { }
2208                }
2209        },
2210        [ALC889_FIXUP_CD] = {
2211                .type = HDA_FIXUP_PINS,
2212                .v.pins = (const struct hda_pintbl[]) {
2213                        { 0x1c, 0x993301f0 }, /* CD */
2214                        { }
2215                }
2216        },
2217        [ALC889_FIXUP_FRONT_HP_NO_PRESENCE] = {
2218                .type = HDA_FIXUP_PINS,
2219                .v.pins = (const struct hda_pintbl[]) {
2220                        { 0x1b, 0x02214120 }, /* Front HP jack is flaky, disable jack detect */
2221                        { }
2222                },
2223                .chained = true,
2224                .chain_id = ALC889_FIXUP_CD,
2225        },
2226        [ALC889_FIXUP_VAIO_TT] = {
2227                .type = HDA_FIXUP_PINS,
2228                .v.pins = (const struct hda_pintbl[]) {
2229                        { 0x17, 0x90170111 }, /* hidden surround speaker */
2230                        { }
2231                }
2232        },
2233        [ALC888_FIXUP_EEE1601] = {
2234                .type = HDA_FIXUP_VERBS,
2235                .v.verbs = (const struct hda_verb[]) {
2236                        { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2237                        { 0x20, AC_VERB_SET_PROC_COEF,  0x0838 },
2238                        { }
2239                }
2240        },
2241        [ALC882_FIXUP_EAPD] = {
2242                .type = HDA_FIXUP_VERBS,
2243                .v.verbs = (const struct hda_verb[]) {
2244                        /* change to EAPD mode */
2245                        { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2246                        { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
2247                        { }
2248                }
2249        },
2250        [ALC883_FIXUP_EAPD] = {
2251                .type = HDA_FIXUP_VERBS,
2252                .v.verbs = (const struct hda_verb[]) {
2253                        /* change to EAPD mode */
2254                        { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2255                        { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2256                        { }
2257                }
2258        },
2259        [ALC883_FIXUP_ACER_EAPD] = {
2260                .type = HDA_FIXUP_VERBS,
2261                .v.verbs = (const struct hda_verb[]) {
2262                        /* eanable EAPD on Acer laptops */
2263                        { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2264                        { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2265                        { }
2266                }
2267        },
2268        [ALC882_FIXUP_GPIO1] = {
2269                .type = HDA_FIXUP_FUNC,
2270                .v.func = alc_fixup_gpio1,
2271        },
2272        [ALC882_FIXUP_GPIO2] = {
2273                .type = HDA_FIXUP_FUNC,
2274                .v.func = alc_fixup_gpio2,
2275        },
2276        [ALC882_FIXUP_GPIO3] = {
2277                .type = HDA_FIXUP_FUNC,
2278                .v.func = alc_fixup_gpio3,
2279        },
2280        [ALC882_FIXUP_ASUS_W2JC] = {
2281                .type = HDA_FIXUP_FUNC,
2282                .v.func = alc_fixup_gpio1,
2283                .chained = true,
2284                .chain_id = ALC882_FIXUP_EAPD,
2285        },
2286        [ALC889_FIXUP_COEF] = {
2287                .type = HDA_FIXUP_FUNC,
2288                .v.func = alc889_fixup_coef,
2289        },
2290        [ALC882_FIXUP_ACER_ASPIRE_4930G] = {
2291                .type = HDA_FIXUP_PINS,
2292                .v.pins = (const struct hda_pintbl[]) {
2293                        { 0x16, 0x99130111 }, /* CLFE speaker */
2294                        { 0x17, 0x99130112 }, /* surround speaker */
2295                        { }
2296                },
2297                .chained = true,
2298                .chain_id = ALC882_FIXUP_GPIO1,
2299        },
2300        [ALC882_FIXUP_ACER_ASPIRE_8930G] = {
2301                .type = HDA_FIXUP_PINS,
2302                .v.pins = (const struct hda_pintbl[]) {
2303                        { 0x16, 0x99130111 }, /* CLFE speaker */
2304                        { 0x1b, 0x99130112 }, /* surround speaker */
2305                        { }
2306                },
2307                .chained = true,
2308                .chain_id = ALC882_FIXUP_ASPIRE_8930G_VERBS,
2309        },
2310        [ALC882_FIXUP_ASPIRE_8930G_VERBS] = {
2311                /* additional init verbs for Acer Aspire 8930G */
2312                .type = HDA_FIXUP_VERBS,
2313                .v.verbs = (const struct hda_verb[]) {
2314                        /* Enable all DACs */
2315                        /* DAC DISABLE/MUTE 1? */
2316                        /*  setting bits 1-5 disables DAC nids 0x02-0x06
2317                         *  apparently. Init=0x38 */
2318                        { 0x20, AC_VERB_SET_COEF_INDEX, 0x03 },
2319                        { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2320                        /* DAC DISABLE/MUTE 2? */
2321                        /*  some bit here disables the other DACs.
2322                         *  Init=0x4900 */
2323                        { 0x20, AC_VERB_SET_COEF_INDEX, 0x08 },
2324                        { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2325                        /* DMIC fix
2326                         * This laptop has a stereo digital microphone.
2327                         * The mics are only 1cm apart which makes the stereo
2328                         * useless. However, either the mic or the ALC889
2329                         * makes the signal become a difference/sum signal
2330                         * instead of standard stereo, which is annoying.
2331                         * So instead we flip this bit which makes the
2332                         * codec replicate the sum signal to both channels,
2333                         * turning it into a normal mono mic.
2334                         */
2335                        /* DMIC_CONTROL? Init value = 0x0001 */
2336                        { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2337                        { 0x20, AC_VERB_SET_PROC_COEF, 0x0003 },
2338                        { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2339                        { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2340                        { }
2341                },
2342                .chained = true,
2343                .chain_id = ALC882_FIXUP_GPIO1,
2344        },
2345        [ALC885_FIXUP_MACPRO_GPIO] = {
2346                .type = HDA_FIXUP_FUNC,
2347                .v.func = alc885_fixup_macpro_gpio,
2348        },
2349        [ALC889_FIXUP_DAC_ROUTE] = {
2350                .type = HDA_FIXUP_FUNC,
2351                .v.func = alc889_fixup_dac_route,
2352        },
2353        [ALC889_FIXUP_MBP_VREF] = {
2354                .type = HDA_FIXUP_FUNC,
2355                .v.func = alc889_fixup_mbp_vref,
2356                .chained = true,
2357                .chain_id = ALC882_FIXUP_GPIO1,
2358        },
2359        [ALC889_FIXUP_IMAC91_VREF] = {
2360                .type = HDA_FIXUP_FUNC,
2361                .v.func = alc889_fixup_imac91_vref,
2362                .chained = true,
2363                .chain_id = ALC882_FIXUP_GPIO1,
2364        },
2365        [ALC889_FIXUP_MBA11_VREF] = {
2366                .type = HDA_FIXUP_FUNC,
2367                .v.func = alc889_fixup_mba11_vref,
2368                .chained = true,
2369                .chain_id = ALC889_FIXUP_MBP_VREF,
2370        },
2371        [ALC889_FIXUP_MBA21_VREF] = {
2372                .type = HDA_FIXUP_FUNC,
2373                .v.func = alc889_fixup_mba21_vref,
2374                .chained = true,
2375                .chain_id = ALC889_FIXUP_MBP_VREF,
2376        },
2377        [ALC889_FIXUP_MP11_VREF] = {
2378                .type = HDA_FIXUP_FUNC,
2379                .v.func = alc889_fixup_mba11_vref,
2380                .chained = true,
2381                .chain_id = ALC885_FIXUP_MACPRO_GPIO,
2382        },
2383        [ALC889_FIXUP_MP41_VREF] = {
2384                .type = HDA_FIXUP_FUNC,
2385                .v.func = alc889_fixup_mbp_vref,
2386                .chained = true,
2387                .chain_id = ALC885_FIXUP_MACPRO_GPIO,
2388        },
2389        [ALC882_FIXUP_INV_DMIC] = {
2390                .type = HDA_FIXUP_FUNC,
2391                .v.func = alc_fixup_inv_dmic,
2392        },
2393        [ALC882_FIXUP_NO_PRIMARY_HP] = {
2394                .type = HDA_FIXUP_FUNC,
2395                .v.func = alc882_fixup_no_primary_hp,
2396        },
2397        [ALC887_FIXUP_ASUS_BASS] = {
2398                .type = HDA_FIXUP_PINS,
2399                .v.pins = (const struct hda_pintbl[]) {
2400                        {0x16, 0x99130130}, /* bass speaker */
2401                        {}
2402                },
2403                .chained = true,
2404                .chain_id = ALC887_FIXUP_BASS_CHMAP,
2405        },
2406        [ALC887_FIXUP_BASS_CHMAP] = {
2407                .type = HDA_FIXUP_FUNC,
2408                .v.func = alc_fixup_bass_chmap,
2409        },
2410        [ALC1220_FIXUP_GB_DUAL_CODECS] = {
2411                .type = HDA_FIXUP_FUNC,
2412                .v.func = alc1220_fixup_gb_dual_codecs,
2413        },
2414        [ALC1220_FIXUP_CLEVO_P950] = {
2415                .type = HDA_FIXUP_FUNC,
2416                .v.func = alc1220_fixup_clevo_p950,
2417        },
2418        [ALC1220_FIXUP_CLEVO_PB51ED] = {
2419                .type = HDA_FIXUP_FUNC,
2420                .v.func = alc1220_fixup_clevo_pb51ed,
2421        },
2422        [ALC1220_FIXUP_CLEVO_PB51ED_PINS] = {
2423                .type = HDA_FIXUP_PINS,
2424                .v.pins = (const struct hda_pintbl[]) {
2425                        { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
2426                        {}
2427                },
2428                .chained = true,
2429                .chain_id = ALC1220_FIXUP_CLEVO_PB51ED,
2430        },
2431        [ALC887_FIXUP_ASUS_AUDIO] = {
2432                .type = HDA_FIXUP_PINS,
2433                .v.pins = (const struct hda_pintbl[]) {
2434                        { 0x15, 0x02a14150 }, /* use as headset mic, without its own jack detect */
2435                        { 0x19, 0x22219420 },
2436                        {}
2437                },
2438        },
2439        [ALC887_FIXUP_ASUS_HMIC] = {
2440                .type = HDA_FIXUP_FUNC,
2441                .v.func = alc887_fixup_asus_jack,
2442                .chained = true,
2443                .chain_id = ALC887_FIXUP_ASUS_AUDIO,
2444        },
2445};
2446
2447static const struct snd_pci_quirk alc882_fixup_tbl[] = {
2448        SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD),
2449        SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2450        SND_PCI_QUIRK(0x1025, 0x0107, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2451        SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD),
2452        SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2453        SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD),
2454        SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_FIXUP_ACER_EAPD),
2455        SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
2456                      ALC882_FIXUP_ACER_ASPIRE_4930G),
2457        SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
2458                      ALC882_FIXUP_ACER_ASPIRE_4930G),
2459        SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
2460                      ALC882_FIXUP_ACER_ASPIRE_8930G),
2461        SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
2462                      ALC882_FIXUP_ACER_ASPIRE_8930G),
2463        SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
2464                      ALC882_FIXUP_ACER_ASPIRE_4930G),
2465        SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
2466                      ALC882_FIXUP_ACER_ASPIRE_4930G),
2467        SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
2468                      ALC882_FIXUP_ACER_ASPIRE_4930G),
2469        SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
2470        SND_PCI_QUIRK(0x1025, 0x021e, "Acer Aspire 5739G",
2471                      ALC882_FIXUP_ACER_ASPIRE_4930G),
2472        SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),
2473        SND_PCI_QUIRK(0x1025, 0x026b, "Acer Aspire 8940G", ALC882_FIXUP_ACER_ASPIRE_8930G),
2474        SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736),
2475        SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD),
2476        SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),
2477        SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_FIXUP_ASUS_W2JC),
2478        SND_PCI_QUIRK(0x1043, 0x2390, "Asus D700SA", ALC887_FIXUP_ASUS_HMIC),
2479        SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601),
2480        SND_PCI_QUIRK(0x1043, 0x84bc, "ASUS ET2700", ALC887_FIXUP_ASUS_BASS),
2481        SND_PCI_QUIRK(0x1043, 0x8691, "ASUS ROG Ranger VIII", ALC882_FIXUP_GPIO3),
2482        SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT),
2483        SND_PCI_QUIRK(0x104d, 0x905a, "Sony Vaio Z", ALC882_FIXUP_NO_PRIMARY_HP),
2484        SND_PCI_QUIRK(0x104d, 0x9060, "Sony Vaio VPCL14M1R", ALC882_FIXUP_NO_PRIMARY_HP),
2485        SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP),
2486        SND_PCI_QUIRK(0x104d, 0x9044, "Sony VAIO AiO", ALC882_FIXUP_NO_PRIMARY_HP),
2487
2488        /* All Apple entries are in codec SSIDs */
2489        SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF),
2490        SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC889_FIXUP_MBP_VREF),
2491        SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
2492        SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC889_FIXUP_MP11_VREF),
2493        SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_FIXUP_MACPRO_GPIO),
2494        SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_FIXUP_MACPRO_GPIO),
2495        SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC889_FIXUP_MBP_VREF),
2496        SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889_FIXUP_MBP_VREF),
2497        SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD),
2498        SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC889_FIXUP_MBA11_VREF),
2499        SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBA21_VREF),
2500        SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889_FIXUP_MBP_VREF),
2501        SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
2502        SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO),
2503        SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF),
2504        SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF),
2505        SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF),
2506        SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 4,1/5,1", ALC889_FIXUP_MP41_VREF),
2507        SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF),
2508        SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),
2509        SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),
2510        SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_MBA11_VREF),
2511
2512        SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),
2513        SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE),
2514        SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
2515        SND_PCI_QUIRK(0x1458, 0xa0cd, "Gigabyte X570 Aorus Master", ALC1220_FIXUP_CLEVO_P950),
2516        SND_PCI_QUIRK(0x1458, 0xa0ce, "Gigabyte X570 Aorus Xtreme", ALC1220_FIXUP_CLEVO_P950),
2517        SND_PCI_QUIRK(0x1462, 0x11f7, "MSI-GE63", ALC1220_FIXUP_CLEVO_P950),
2518        SND_PCI_QUIRK(0x1462, 0x1228, "MSI-GP63", ALC1220_FIXUP_CLEVO_P950),
2519        SND_PCI_QUIRK(0x1462, 0x1275, "MSI-GL63", ALC1220_FIXUP_CLEVO_P950),
2520        SND_PCI_QUIRK(0x1462, 0x1276, "MSI-GL73", ALC1220_FIXUP_CLEVO_P950),
2521        SND_PCI_QUIRK(0x1462, 0x1293, "MSI-GP65", ALC1220_FIXUP_CLEVO_P950),
2522        SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),
2523        SND_PCI_QUIRK(0x1462, 0xda57, "MSI Z270-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
2524        SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
2525        SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
2526        SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),
2527        SND_PCI_QUIRK(0x1558, 0x9506, "Clevo P955HQ", ALC1220_FIXUP_CLEVO_P950),
2528        SND_PCI_QUIRK(0x1558, 0x950A, "Clevo P955H[PR]", ALC1220_FIXUP_CLEVO_P950),
2529        SND_PCI_QUIRK(0x1558, 0x95e1, "Clevo P95xER", ALC1220_FIXUP_CLEVO_P950),
2530        SND_PCI_QUIRK(0x1558, 0x95e2, "Clevo P950ER", ALC1220_FIXUP_CLEVO_P950),
2531        SND_PCI_QUIRK(0x1558, 0x95e3, "Clevo P955[ER]T", ALC1220_FIXUP_CLEVO_P950),
2532        SND_PCI_QUIRK(0x1558, 0x95e4, "Clevo P955ER", ALC1220_FIXUP_CLEVO_P950),
2533        SND_PCI_QUIRK(0x1558, 0x95e5, "Clevo P955EE6", ALC1220_FIXUP_CLEVO_P950),
2534        SND_PCI_QUIRK(0x1558, 0x95e6, "Clevo P950R[CDF]", ALC1220_FIXUP_CLEVO_P950),
2535        SND_PCI_QUIRK(0x1558, 0x96e1, "Clevo P960[ER][CDFN]-K", ALC1220_FIXUP_CLEVO_P950),
2536        SND_PCI_QUIRK(0x1558, 0x97e1, "Clevo P970[ER][CDFN]", ALC1220_FIXUP_CLEVO_P950),
2537        SND_PCI_QUIRK(0x1558, 0x97e2, "Clevo P970RC-M", ALC1220_FIXUP_CLEVO_P950),
2538        SND_PCI_QUIRK(0x1558, 0x50d3, "Clevo PC50[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2539        SND_PCI_QUIRK(0x1558, 0x65d1, "Clevo PB51[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2540        SND_PCI_QUIRK(0x1558, 0x65d2, "Clevo PB51R[CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2541        SND_PCI_QUIRK(0x1558, 0x65e1, "Clevo PB51[ED][DF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2542        SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2543        SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2544        SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2545        SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2546        SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
2547        SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),
2548        SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),
2549        SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_FIXUP_COEF),
2550        {}
2551};
2552
2553static const struct hda_model_fixup alc882_fixup_models[] = {
2554        {.id = ALC882_FIXUP_ABIT_AW9D_MAX, .name = "abit-aw9d"},
2555        {.id = ALC882_FIXUP_LENOVO_Y530, .name = "lenovo-y530"},
2556        {.id = ALC882_FIXUP_ACER_ASPIRE_7736, .name = "acer-aspire-7736"},
2557        {.id = ALC882_FIXUP_ASUS_W90V, .name = "asus-w90v"},
2558        {.id = ALC889_FIXUP_CD, .name = "cd"},
2559        {.id = ALC889_FIXUP_FRONT_HP_NO_PRESENCE, .name = "no-front-hp"},
2560        {.id = ALC889_FIXUP_VAIO_TT, .name = "vaio-tt"},
2561        {.id = ALC888_FIXUP_EEE1601, .name = "eee1601"},
2562        {.id = ALC882_FIXUP_EAPD, .name = "alc882-eapd"},
2563        {.id = ALC883_FIXUP_EAPD, .name = "alc883-eapd"},
2564        {.id = ALC882_FIXUP_GPIO1, .name = "gpio1"},
2565        {.id = ALC882_FIXUP_GPIO2, .name = "gpio2"},
2566        {.id = ALC882_FIXUP_GPIO3, .name = "gpio3"},
2567        {.id = ALC889_FIXUP_COEF, .name = "alc889-coef"},
2568        {.id = ALC882_FIXUP_ASUS_W2JC, .name = "asus-w2jc"},
2569        {.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name = "acer-aspire-4930g"},
2570        {.id = ALC882_FIXUP_ACER_ASPIRE_8930G, .name = "acer-aspire-8930g"},
2571        {.id = ALC883_FIXUP_ACER_EAPD, .name = "acer-aspire"},
2572        {.id = ALC885_FIXUP_MACPRO_GPIO, .name = "macpro-gpio"},
2573        {.id = ALC889_FIXUP_DAC_ROUTE, .name = "dac-route"},
2574        {.id = ALC889_FIXUP_MBP_VREF, .name = "mbp-vref"},
2575        {.id = ALC889_FIXUP_IMAC91_VREF, .name = "imac91-vref"},
2576        {.id = ALC889_FIXUP_MBA11_VREF, .name = "mba11-vref"},
2577        {.id = ALC889_FIXUP_MBA21_VREF, .name = "mba21-vref"},
2578        {.id = ALC889_FIXUP_MP11_VREF, .name = "mp11-vref"},
2579        {.id = ALC889_FIXUP_MP41_VREF, .name = "mp41-vref"},
2580        {.id = ALC882_FIXUP_INV_DMIC, .name = "inv-dmic"},
2581        {.id = ALC882_FIXUP_NO_PRIMARY_HP, .name = "no-primary-hp"},
2582        {.id = ALC887_FIXUP_ASUS_BASS, .name = "asus-bass"},
2583        {.id = ALC1220_FIXUP_GB_DUAL_CODECS, .name = "dual-codecs"},
2584        {.id = ALC1220_FIXUP_CLEVO_P950, .name = "clevo-p950"},
2585        {}
2586};
2587
2588/*
2589 * BIOS auto configuration
2590 */
2591/* almost identical with ALC880 parser... */
2592static int alc882_parse_auto_config(struct hda_codec *codec)
2593{
2594        static const hda_nid_t alc882_ignore[] = { 0x1d, 0 };
2595        static const hda_nid_t alc882_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2596        return alc_parse_auto_config(codec, alc882_ignore, alc882_ssids);
2597}
2598
2599/*
2600 */
2601static int patch_alc882(struct hda_codec *codec)
2602{
2603        struct alc_spec *spec;
2604        int err;
2605
2606        err = alc_alloc_spec(codec, 0x0b);
2607        if (err < 0)
2608                return err;
2609
2610        spec = codec->spec;
2611
2612        switch (codec->core.vendor_id) {
2613        case 0x10ec0882:
2614        case 0x10ec0885:
2615        case 0x10ec0900:
2616        case 0x10ec0b00:
2617        case 0x10ec1220:
2618                break;
2619        default:
2620                /* ALC883 and variants */
2621                alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2622                break;
2623        }
2624
2625        alc_pre_init(codec);
2626
2627        snd_hda_pick_fixup(codec, alc882_fixup_models, alc882_fixup_tbl,
2628                       alc882_fixups);
2629        snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2630
2631        alc_auto_parse_customize_define(codec);
2632
2633        if (has_cdefine_beep(codec))
2634                spec->gen.beep_nid = 0x01;
2635
2636        /* automatic parse from the BIOS config */
2637        err = alc882_parse_auto_config(codec);
2638        if (err < 0)
2639                goto error;
2640
2641        if (!spec->gen.no_analog && spec->gen.beep_nid) {
2642                err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2643                if (err < 0)
2644                        goto error;
2645        }
2646
2647        snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2648
2649        return 0;
2650
2651 error:
2652        alc_free(codec);
2653        return err;
2654}
2655
2656
2657/*
2658 * ALC262 support
2659 */
2660static int alc262_parse_auto_config(struct hda_codec *codec)
2661{
2662        static const hda_nid_t alc262_ignore[] = { 0x1d, 0 };
2663        static const hda_nid_t alc262_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2664        return alc_parse_auto_config(codec, alc262_ignore, alc262_ssids);
2665}
2666
2667/*
2668 * Pin config fixes
2669 */
2670enum {
2671        ALC262_FIXUP_FSC_H270,
2672        ALC262_FIXUP_FSC_S7110,
2673        ALC262_FIXUP_HP_Z200,
2674        ALC262_FIXUP_TYAN,
2675        ALC262_FIXUP_LENOVO_3000,
2676        ALC262_FIXUP_BENQ,
2677        ALC262_FIXUP_BENQ_T31,
2678        ALC262_FIXUP_INV_DMIC,
2679        ALC262_FIXUP_INTEL_BAYLEYBAY,
2680};
2681
2682static const struct hda_fixup alc262_fixups[] = {
2683        [ALC262_FIXUP_FSC_H270] = {
2684                .type = HDA_FIXUP_PINS,
2685                .v.pins = (const struct hda_pintbl[]) {
2686                        { 0x14, 0x99130110 }, /* speaker */
2687                        { 0x15, 0x0221142f }, /* front HP */
2688                        { 0x1b, 0x0121141f }, /* rear HP */
2689                        { }
2690                }
2691        },
2692        [ALC262_FIXUP_FSC_S7110] = {
2693                .type = HDA_FIXUP_PINS,
2694                .v.pins = (const struct hda_pintbl[]) {
2695                        { 0x15, 0x90170110 }, /* speaker */
2696                        { }
2697                },
2698                .chained = true,
2699                .chain_id = ALC262_FIXUP_BENQ,
2700        },
2701        [ALC262_FIXUP_HP_Z200] = {
2702                .type = HDA_FIXUP_PINS,
2703                .v.pins = (const struct hda_pintbl[]) {
2704                        { 0x16, 0x99130120 }, /* internal speaker */
2705                        { }
2706                }
2707        },
2708        [ALC262_FIXUP_TYAN] = {
2709                .type = HDA_FIXUP_PINS,
2710                .v.pins = (const struct hda_pintbl[]) {
2711                        { 0x14, 0x1993e1f0 }, /* int AUX */
2712                        { }
2713                }
2714        },
2715        [ALC262_FIXUP_LENOVO_3000] = {
2716                .type = HDA_FIXUP_PINCTLS,
2717                .v.pins = (const struct hda_pintbl[]) {
2718                        { 0x19, PIN_VREF50 },
2719                        {}
2720                },
2721                .chained = true,
2722                .chain_id = ALC262_FIXUP_BENQ,
2723        },
2724        [ALC262_FIXUP_BENQ] = {
2725                .type = HDA_FIXUP_VERBS,
2726                .v.verbs = (const struct hda_verb[]) {
2727                        { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2728                        { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2729                        {}
2730                }
2731        },
2732        [ALC262_FIXUP_BENQ_T31] = {
2733                .type = HDA_FIXUP_VERBS,
2734                .v.verbs = (const struct hda_verb[]) {
2735                        { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2736                        { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2737                        {}
2738                }
2739        },
2740        [ALC262_FIXUP_INV_DMIC] = {
2741                .type = HDA_FIXUP_FUNC,
2742                .v.func = alc_fixup_inv_dmic,
2743        },
2744        [ALC262_FIXUP_INTEL_BAYLEYBAY] = {
2745                .type = HDA_FIXUP_FUNC,
2746                .v.func = alc_fixup_no_depop_delay,
2747        },
2748};
2749
2750static const struct snd_pci_quirk alc262_fixup_tbl[] = {
2751        SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", ALC262_FIXUP_HP_Z200),
2752        SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu Lifebook S7110", ALC262_FIXUP_FSC_S7110),
2753        SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ),
2754        SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN),
2755        SND_PCI_QUIRK(0x1734, 0x1141, "FSC ESPRIMO U9210", ALC262_FIXUP_FSC_H270),
2756        SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270),
2757        SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000),
2758        SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ),
2759        SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_FIXUP_BENQ_T31),
2760        SND_PCI_QUIRK(0x8086, 0x7270, "BayleyBay", ALC262_FIXUP_INTEL_BAYLEYBAY),
2761        {}
2762};
2763
2764static const struct hda_model_fixup alc262_fixup_models[] = {
2765        {.id = ALC262_FIXUP_INV_DMIC, .name = "inv-dmic"},
2766        {.id = ALC262_FIXUP_FSC_H270, .name = "fsc-h270"},
2767        {.id = ALC262_FIXUP_FSC_S7110, .name = "fsc-s7110"},
2768        {.id = ALC262_FIXUP_HP_Z200, .name = "hp-z200"},
2769        {.id = ALC262_FIXUP_TYAN, .name = "tyan"},
2770        {.id = ALC262_FIXUP_LENOVO_3000, .name = "lenovo-3000"},
2771        {.id = ALC262_FIXUP_BENQ, .name = "benq"},
2772        {.id = ALC262_FIXUP_BENQ_T31, .name = "benq-t31"},
2773        {.id = ALC262_FIXUP_INTEL_BAYLEYBAY, .name = "bayleybay"},
2774        {}
2775};
2776
2777/*
2778 */
2779static int patch_alc262(struct hda_codec *codec)
2780{
2781        struct alc_spec *spec;
2782        int err;
2783
2784        err = alc_alloc_spec(codec, 0x0b);
2785        if (err < 0)
2786                return err;
2787
2788        spec = codec->spec;
2789        spec->gen.shared_mic_vref_pin = 0x18;
2790
2791        spec->shutup = alc_eapd_shutup;
2792
2793#if 0
2794        /* pshou 07/11/05  set a zero PCM sample to DAC when FIFO is
2795         * under-run
2796         */
2797        alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x80);
2798#endif
2799        alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2800
2801        alc_pre_init(codec);
2802
2803        snd_hda_pick_fixup(codec, alc262_fixup_models, alc262_fixup_tbl,
2804                       alc262_fixups);
2805        snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2806
2807        alc_auto_parse_customize_define(codec);
2808
2809        if (has_cdefine_beep(codec))
2810                spec->gen.beep_nid = 0x01;
2811
2812        /* automatic parse from the BIOS config */
2813        err = alc262_parse_auto_config(codec);
2814        if (err < 0)
2815                goto error;
2816
2817        if (!spec->gen.no_analog && spec->gen.beep_nid) {
2818                err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2819                if (err < 0)
2820                        goto error;
2821        }
2822
2823        snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2824
2825        return 0;
2826
2827 error:
2828        alc_free(codec);
2829        return err;
2830}
2831
2832/*
2833 *  ALC268
2834 */
2835/* bind Beep switches of both NID 0x0f and 0x10 */
2836static int alc268_beep_switch_put(struct snd_kcontrol *kcontrol,
2837                                  struct snd_ctl_elem_value *ucontrol)
2838{
2839        struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2840        unsigned long pval;
2841        int err;
2842
2843        mutex_lock(&codec->control_mutex);
2844        pval = kcontrol->private_value;
2845        kcontrol->private_value = (pval & ~0xff) | 0x0f;
2846        err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2847        if (err >= 0) {
2848                kcontrol->private_value = (pval & ~0xff) | 0x10;
2849                err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2850        }
2851        kcontrol->private_value = pval;
2852        mutex_unlock(&codec->control_mutex);
2853        return err;
2854}
2855
2856static const struct snd_kcontrol_new alc268_beep_mixer[] = {
2857        HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
2858        {
2859                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2860                .name = "Beep Playback Switch",
2861                .subdevice = HDA_SUBDEV_AMP_FLAG,
2862                .info = snd_hda_mixer_amp_switch_info,
2863                .get = snd_hda_mixer_amp_switch_get,
2864                .put = alc268_beep_switch_put,
2865                .private_value = HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT)
2866        },
2867};
2868
2869/* set PCBEEP vol = 0, mute connections */
2870static const struct hda_verb alc268_beep_init_verbs[] = {
2871        {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2872        {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2873        {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2874        { }
2875};
2876
2877enum {
2878        ALC268_FIXUP_INV_DMIC,
2879        ALC268_FIXUP_HP_EAPD,
2880        ALC268_FIXUP_SPDIF,
2881};
2882
2883static const struct hda_fixup alc268_fixups[] = {
2884        [ALC268_FIXUP_INV_DMIC] = {
2885                .type = HDA_FIXUP_FUNC,
2886                .v.func = alc_fixup_inv_dmic,
2887        },
2888        [ALC268_FIXUP_HP_EAPD] = {
2889                .type = HDA_FIXUP_VERBS,
2890                .v.verbs = (const struct hda_verb[]) {
2891                        {0x15, AC_VERB_SET_EAPD_BTLENABLE, 0},
2892                        {}
2893                }
2894        },
2895        [ALC268_FIXUP_SPDIF] = {
2896                .type = HDA_FIXUP_PINS,
2897                .v.pins = (const struct hda_pintbl[]) {
2898                        { 0x1e, 0x014b1180 }, /* enable SPDIF out */
2899                        {}
2900                }
2901        },
2902};
2903
2904static const struct hda_model_fixup alc268_fixup_models[] = {
2905        {.id = ALC268_FIXUP_INV_DMIC, .name = "inv-dmic"},
2906        {.id = ALC268_FIXUP_HP_EAPD, .name = "hp-eapd"},
2907        {.id = ALC268_FIXUP_SPDIF, .name = "spdif"},
2908        {}
2909};
2910
2911static const struct snd_pci_quirk alc268_fixup_tbl[] = {
2912        SND_PCI_QUIRK(0x1025, 0x0139, "Acer TravelMate 6293", ALC268_FIXUP_SPDIF),
2913        SND_PCI_QUIRK(0x1025, 0x015b, "Acer AOA 150 (ZG5)", ALC268_FIXUP_INV_DMIC),
2914        /* below is codec SSID since multiple Toshiba laptops have the
2915         * same PCI SSID 1179:ff00
2916         */
2917        SND_PCI_QUIRK(0x1179, 0xff06, "Toshiba P200", ALC268_FIXUP_HP_EAPD),
2918        {}
2919};
2920
2921/*
2922 * BIOS auto configuration
2923 */
2924static int alc268_parse_auto_config(struct hda_codec *codec)
2925{
2926        static const hda_nid_t alc268_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2927        return alc_parse_auto_config(codec, NULL, alc268_ssids);
2928}
2929
2930/*
2931 */
2932static int patch_alc268(struct hda_codec *codec)
2933{
2934        struct alc_spec *spec;
2935        int i, err;
2936
2937        /* ALC268 has no aa-loopback mixer */
2938        err = alc_alloc_spec(codec, 0);
2939        if (err < 0)
2940                return err;
2941
2942        spec = codec->spec;
2943        if (has_cdefine_beep(codec))
2944                spec->gen.beep_nid = 0x01;
2945
2946        spec->shutup = alc_eapd_shutup;
2947
2948        alc_pre_init(codec);
2949
2950        snd_hda_pick_fixup(codec, alc268_fixup_models, alc268_fixup_tbl, alc268_fixups);
2951        snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2952
2953        /* automatic parse from the BIOS config */
2954        err = alc268_parse_auto_config(codec);
2955        if (err < 0)
2956                goto error;
2957
2958        if (err > 0 && !spec->gen.no_analog &&
2959            spec->gen.autocfg.speaker_pins[0] != 0x1d) {
2960                for (i = 0; i < ARRAY_SIZE(alc268_beep_mixer); i++) {
2961                        if (!snd_hda_gen_add_kctl(&spec->gen, NULL,
2962                                                  &alc268_beep_mixer[i])) {
2963                                err = -ENOMEM;
2964                                goto error;
2965                        }
2966                }
2967                snd_hda_add_verbs(codec, alc268_beep_init_verbs);
2968                if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
2969                        /* override the amp caps for beep generator */
2970                        snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
2971                                          (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
2972                                          (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
2973                                          (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
2974                                          (0 << AC_AMPCAP_MUTE_SHIFT));
2975        }
2976
2977        snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2978
2979        return 0;
2980
2981 error:
2982        alc_free(codec);
2983        return err;
2984}
2985
2986/*
2987 * ALC269
2988 */
2989
2990static const struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
2991        .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
2992};
2993
2994static const struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
2995        .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
2996};
2997
2998/* different alc269-variants */
2999enum {
3000        ALC269_TYPE_ALC269VA,
3001        ALC269_TYPE_ALC269VB,
3002        ALC269_TYPE_ALC269VC,
3003        ALC269_TYPE_ALC269VD,
3004        ALC269_TYPE_ALC280,
3005        ALC269_TYPE_ALC282,
3006        ALC269_TYPE_ALC283,
3007        ALC269_TYPE_ALC284,
3008        ALC269_TYPE_ALC293,
3009        ALC269_TYPE_ALC286,
3010        ALC269_TYPE_ALC298,
3011        ALC269_TYPE_ALC255,
3012        ALC269_TYPE_ALC256,
3013        ALC269_TYPE_ALC257,
3014        ALC269_TYPE_ALC215,
3015        ALC269_TYPE_ALC225,
3016        ALC269_TYPE_ALC294,
3017        ALC269_TYPE_ALC300,
3018        ALC269_TYPE_ALC623,
3019        ALC269_TYPE_ALC700,
3020};
3021
3022/*
3023 * BIOS auto configuration
3024 */
3025static int alc269_parse_auto_config(struct hda_codec *codec)
3026{
3027        static const hda_nid_t alc269_ignore[] = { 0x1d, 0 };
3028        static const hda_nid_t alc269_ssids[] = { 0, 0x1b, 0x14, 0x21 };
3029        static const hda_nid_t alc269va_ssids[] = { 0x15, 0x1b, 0x14, 0 };
3030        struct alc_spec *spec = codec->spec;
3031        const hda_nid_t *ssids;
3032
3033        switch (spec->codec_variant) {
3034        case ALC269_TYPE_ALC269VA:
3035        case ALC269_TYPE_ALC269VC:
3036        case ALC269_TYPE_ALC280:
3037        case ALC269_TYPE_ALC284:
3038        case ALC269_TYPE_ALC293:
3039                ssids = alc269va_ssids;
3040                break;
3041        case ALC269_TYPE_ALC269VB:
3042        case ALC269_TYPE_ALC269VD:
3043        case ALC269_TYPE_ALC282:
3044        case ALC269_TYPE_ALC283:
3045        case ALC269_TYPE_ALC286:
3046        case ALC269_TYPE_ALC298:
3047        case ALC269_TYPE_ALC255:
3048        case ALC269_TYPE_ALC256:
3049        case ALC269_TYPE_ALC257:
3050        case ALC269_TYPE_ALC215:
3051        case ALC269_TYPE_ALC225:
3052        case ALC269_TYPE_ALC294:
3053        case ALC269_TYPE_ALC300:
3054        case ALC269_TYPE_ALC623:
3055        case ALC269_TYPE_ALC700:
3056                ssids = alc269_ssids;
3057                break;
3058        default:
3059                ssids = alc269_ssids;
3060                break;
3061        }
3062
3063        return alc_parse_auto_config(codec, alc269_ignore, ssids);
3064}
3065
3066static const struct hda_jack_keymap alc_headset_btn_keymap[] = {
3067        { SND_JACK_BTN_0, KEY_PLAYPAUSE },
3068        { SND_JACK_BTN_1, KEY_VOICECOMMAND },
3069        { SND_JACK_BTN_2, KEY_VOLUMEUP },
3070        { SND_JACK_BTN_3, KEY_VOLUMEDOWN },
3071        {}
3072};
3073
3074static void alc_headset_btn_callback(struct hda_codec *codec,
3075                                     struct hda_jack_callback *jack)
3076{
3077        int report = 0;
3078
3079        if (jack->unsol_res & (7 << 13))
3080                report |= SND_JACK_BTN_0;
3081
3082        if (jack->unsol_res  & (1 << 16 | 3 << 8))
3083                report |= SND_JACK_BTN_1;
3084
3085        /* Volume up key */
3086        if (jack->unsol_res & (7 << 23))
3087                report |= SND_JACK_BTN_2;
3088
3089        /* Volume down key */
3090        if (jack->unsol_res & (7 << 10))
3091                report |= SND_JACK_BTN_3;
3092
3093        jack->jack->button_state = report;
3094}
3095
3096static void alc_disable_headset_jack_key(struct hda_codec *codec)
3097{
3098        struct alc_spec *spec = codec->spec;
3099
3100        if (!spec->has_hs_key)
3101                return;
3102
3103        switch (codec->core.vendor_id) {
3104        case 0x10ec0215:
3105        case 0x10ec0225:
3106        case 0x10ec0285:
3107        case 0x10ec0295:
3108        case 0x10ec0289:
3109        case 0x10ec0299:
3110                alc_write_coef_idx(codec, 0x48, 0x0);
3111                alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3112                alc_update_coef_idx(codec, 0x44, 0x0045 << 8, 0x0);
3113                break;
3114        case 0x10ec0236:
3115        case 0x10ec0256:
3116                alc_write_coef_idx(codec, 0x48, 0x0);
3117                alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3118                break;
3119        }
3120}
3121
3122static void alc_enable_headset_jack_key(struct hda_codec *codec)
3123{
3124        struct alc_spec *spec = codec->spec;
3125
3126        if (!spec->has_hs_key)
3127                return;
3128
3129        switch (codec->core.vendor_id) {
3130        case 0x10ec0215:
3131        case 0x10ec0225:
3132        case 0x10ec0285:
3133        case 0x10ec0295:
3134        case 0x10ec0289:
3135        case 0x10ec0299:
3136                alc_write_coef_idx(codec, 0x48, 0xd011);
3137                alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3138                alc_update_coef_idx(codec, 0x44, 0x007f << 8, 0x0045 << 8);
3139                break;
3140        case 0x10ec0236:
3141        case 0x10ec0256:
3142                alc_write_coef_idx(codec, 0x48, 0xd011);
3143                alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3144                break;
3145        }
3146}
3147
3148static void alc_fixup_headset_jack(struct hda_codec *codec,
3149                                    const struct hda_fixup *fix, int action)
3150{
3151        struct alc_spec *spec = codec->spec;
3152
3153        switch (action) {
3154        case HDA_FIXUP_ACT_PRE_PROBE:
3155                spec->has_hs_key = 1;
3156                snd_hda_jack_detect_enable_callback(codec, 0x55,
3157                                                    alc_headset_btn_callback);
3158                snd_hda_jack_add_kctl(codec, 0x55, "Headset Jack", false,
3159                                      SND_JACK_HEADSET, alc_headset_btn_keymap);
3160                break;
3161        case HDA_FIXUP_ACT_INIT:
3162                alc_enable_headset_jack_key(codec);
3163                break;
3164        }
3165}
3166
3167static void alc269vb_toggle_power_output(struct hda_codec *codec, int power_up)
3168{
3169        alc_update_coef_idx(codec, 0x04, 1 << 11, power_up ? (1 << 11) : 0);
3170}
3171
3172static void alc269_shutup(struct hda_codec *codec)
3173{
3174        struct alc_spec *spec = codec->spec;
3175
3176        if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3177                alc269vb_toggle_power_output(codec, 0);
3178        if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
3179                        (alc_get_coef0(codec) & 0x00ff) == 0x018) {
3180                msleep(150);
3181        }
3182        alc_shutup_pins(codec);
3183}
3184
3185static const struct coef_fw alc282_coefs[] = {
3186        WRITE_COEF(0x03, 0x0002), /* Power Down Control */
3187        UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
3188        WRITE_COEF(0x07, 0x0200), /* DMIC control */
3189        UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
3190        UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
3191        WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
3192        WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
3193        WRITE_COEF(0x0e, 0x6e00), /* LDO1/2/3, DAC/ADC */
3194        UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
3195        UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
3196        WRITE_COEF(0x6f, 0x0), /* Class D test 4 */
3197        UPDATE_COEF(0x0c, 0xfe00, 0), /* IO power down directly */
3198        WRITE_COEF(0x34, 0xa0c0), /* ANC */
3199        UPDATE_COEF(0x16, 0x0008, 0), /* AGC MUX */
3200        UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
3201        UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
3202        WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
3203        WRITE_COEF(0x63, 0x2902), /* PLL */
3204        WRITE_COEF(0x68, 0xa080), /* capless control 2 */
3205        WRITE_COEF(0x69, 0x3400), /* capless control 3 */
3206        WRITE_COEF(0x6a, 0x2f3e), /* capless control 4 */
3207        WRITE_COEF(0x6b, 0x0), /* capless control 5 */
3208        UPDATE_COEF(0x6d, 0x0fff, 0x0900), /* class D test 2 */
3209        WRITE_COEF(0x6e, 0x110a), /* class D test 3 */
3210        UPDATE_COEF(0x70, 0x00f8, 0x00d8), /* class D test 5 */
3211        WRITE_COEF(0x71, 0x0014), /* class D test 6 */
3212        WRITE_COEF(0x72, 0xc2ba), /* classD OCP */
3213        UPDATE_COEF(0x77, 0x0f80, 0), /* classD pure DC test */
3214        WRITE_COEF(0x6c, 0xfc06), /* Class D amp control */
3215        {}
3216};
3217
3218static void alc282_restore_default_value(struct hda_codec *codec)
3219{
3220        alc_process_coef_fw(codec, alc282_coefs);
3221}
3222
3223static void alc282_init(struct hda_codec *codec)
3224{
3225        struct alc_spec *spec = codec->spec;
3226        hda_nid_t hp_pin = alc_get_hp_pin(spec);
3227        bool hp_pin_sense;
3228        int coef78;
3229
3230        alc282_restore_default_value(codec);
3231
3232        if (!hp_pin)
3233                return;
3234        hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3235        coef78 = alc_read_coef_idx(codec, 0x78);
3236
3237        /* Index 0x78 Direct Drive HP AMP LPM Control 1 */
3238        /* Headphone capless set to high power mode */
3239        alc_write_coef_idx(codec, 0x78, 0x9004);
3240
3241        if (hp_pin_sense)
3242                msleep(2);
3243
3244        snd_hda_codec_write(codec, hp_pin, 0,
3245                            AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3246
3247        if (hp_pin_sense)
3248                msleep(85);
3249
3250        snd_hda_codec_write(codec, hp_pin, 0,
3251                            AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3252
3253        if (hp_pin_sense)
3254                msleep(100);
3255
3256        /* Headphone capless set to normal mode */
3257        alc_write_coef_idx(codec, 0x78, coef78);
3258}
3259
3260static void alc282_shutup(struct hda_codec *codec)
3261{
3262        struct alc_spec *spec = codec->spec;
3263        hda_nid_t hp_pin = alc_get_hp_pin(spec);
3264        bool hp_pin_sense;
3265        int coef78;
3266
3267        if (!hp_pin) {
3268                alc269_shutup(codec);
3269                return;
3270        }
3271
3272        hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3273        coef78 = alc_read_coef_idx(codec, 0x78);
3274        alc_write_coef_idx(codec, 0x78, 0x9004);
3275
3276        if (hp_pin_sense)
3277                msleep(2);
3278
3279        snd_hda_codec_write(codec, hp_pin, 0,
3280                            AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3281
3282        if (hp_pin_sense)
3283                msleep(85);
3284
3285        if (!spec->no_shutup_pins)
3286                snd_hda_codec_write(codec, hp_pin, 0,
3287                                    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3288
3289        if (hp_pin_sense)
3290                msleep(100);
3291
3292        alc_auto_setup_eapd(codec, false);
3293        alc_shutup_pins(codec);
3294        alc_write_coef_idx(codec, 0x78, coef78);
3295}
3296
3297static const struct coef_fw alc283_coefs[] = {
3298        WRITE_COEF(0x03, 0x0002), /* Power Down Control */
3299        UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
3300        WRITE_COEF(0x07, 0x0200), /* DMIC control */
3301        UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
3302        UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
3303        WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
3304        WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
3305        WRITE_COEF(0x0e, 0x6fc0), /* LDO1/2/3, DAC/ADC */
3306        UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
3307        UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
3308        WRITE_COEF(0x3a, 0x0), /* Class D test 4 */
3309        UPDATE_COEF(0x0c, 0xfe00, 0x0), /* IO power down directly */
3310        WRITE_COEF(0x22, 0xa0c0), /* ANC */
3311        UPDATE_COEFEX(0x53, 0x01, 0x000f, 0x0008), /* AGC MUX */
3312        UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
3313        UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
3314        WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
3315        WRITE_COEF(0x2e, 0x2902), /* PLL */
3316        WRITE_COEF(0x33, 0xa080), /* capless control 2 */
3317        WRITE_COEF(0x34, 0x3400), /* capless control 3 */
3318        WRITE_COEF(0x35, 0x2f3e), /* capless control 4 */
3319        WRITE_COEF(0x36, 0x0), /* capless control 5 */
3320        UPDATE_COEF(0x38, 0x0fff, 0x0900), /* class D test 2 */
3321        WRITE_COEF(0x39, 0x110a), /* class D test 3 */
3322        UPDATE_COEF(0x3b, 0x00f8, 0x00d8), /* class D test 5 */
3323        WRITE_COEF(0x3c, 0x0014), /* class D test 6 */
3324        WRITE_COEF(0x3d, 0xc2ba), /* classD OCP */
3325        UPDATE_COEF(0x42, 0x0f80, 0x0), /* classD pure DC test */
3326        WRITE_COEF(0x49, 0x0), /* test mode */
3327        UPDATE_COEF(0x40, 0xf800, 0x9800), /* Class D DC enable */
3328        UPDATE_COEF(0x42, 0xf000, 0x2000), /* DC offset */
3329        WRITE_COEF(0x37, 0xfc06), /* Class D amp control */
3330        UPDATE_COEF(0x1b, 0x8000, 0), /* HP JD control */
3331        {}
3332};
3333
3334static void alc283_restore_default_value(struct hda_codec *codec)
3335{
3336        alc_process_coef_fw(codec, alc283_coefs);
3337}
3338
3339static void alc283_init(struct hda_codec *codec)
3340{
3341        struct alc_spec *spec = codec->spec;
3342        hda_nid_t hp_pin = alc_get_hp_pin(spec);
3343        bool hp_pin_sense;
3344
3345        alc283_restore_default_value(codec);
3346
3347        if (!hp_pin)
3348                return;
3349
3350        msleep(30);
3351        hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3352
3353        /* Index 0x43 Direct Drive HP AMP LPM Control 1 */
3354        /* Headphone capless set to high power mode */
3355        alc_write_coef_idx(codec, 0x43, 0x9004);
3356
3357        snd_hda_codec_write(codec, hp_pin, 0,
3358                            AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3359
3360        if (hp_pin_sense)
3361                msleep(85);
3362
3363        snd_hda_codec_write(codec, hp_pin, 0,
3364                            AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3365
3366        if (hp_pin_sense)
3367                msleep(85);
3368        /* Index 0x46 Combo jack auto switch control 2 */
3369        /* 3k pull low control for Headset jack. */
3370        alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
3371        /* Headphone capless set to normal mode */
3372        alc_write_coef_idx(codec, 0x43, 0x9614);
3373}
3374
3375static void alc283_shutup(struct hda_codec *codec)
3376{
3377        struct alc_spec *spec = codec->spec;
3378        hda_nid_t hp_pin = alc_get_hp_pin(spec);
3379        bool hp_pin_sense;
3380
3381        if (!hp_pin) {
3382                alc269_shutup(codec);
3383                return;
3384        }
3385
3386        hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3387
3388        alc_write_coef_idx(codec, 0x43, 0x9004);
3389
3390        /*depop hp during suspend*/
3391        alc_write_coef_idx(codec, 0x06, 0x2100);
3392
3393        snd_hda_codec_write(codec, hp_pin, 0,
3394                            AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3395
3396        if (hp_pin_sense)
3397                msleep(100);
3398
3399        if (!spec->no_shutup_pins)
3400                snd_hda_codec_write(codec, hp_pin, 0,
3401                                    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3402
3403        alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
3404
3405        if (hp_pin_sense)
3406                msleep(100);
3407        alc_auto_setup_eapd(codec, false);
3408        alc_shutup_pins(codec);
3409        alc_write_coef_idx(codec, 0x43, 0x9614);
3410}
3411
3412static void alc256_init(struct hda_codec *codec)
3413{
3414        struct alc_spec *spec = codec->spec;
3415        hda_nid_t hp_pin = alc_get_hp_pin(spec);
3416        bool hp_pin_sense;
3417
3418        if (!hp_pin)
3419                hp_pin = 0x21;
3420
3421        msleep(30);
3422
3423        hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3424
3425        if (hp_pin_sense)
3426                msleep(2);
3427
3428        alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
3429        if (spec->ultra_low_power) {
3430                alc_update_coef_idx(codec, 0x03, 1<<1, 1<<1);
3431                alc_update_coef_idx(codec, 0x08, 3<<2, 3<<2);
3432                alc_update_coef_idx(codec, 0x08, 7<<4, 0);
3433                alc_update_coef_idx(codec, 0x3b, 1<<15, 0);
3434                alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3435                msleep(30);
3436        }
3437
3438        snd_hda_codec_write(codec, hp_pin, 0,
3439                            AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3440
3441        if (hp_pin_sense || spec->ultra_low_power)
3442                msleep(85);
3443
3444        snd_hda_codec_write(codec, hp_pin, 0,
3445                            AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3446
3447        if (hp_pin_sense || spec->ultra_low_power)
3448                msleep(100);
3449
3450        alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
3451        alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
3452        alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15); /* Clear bit */
3453        alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15);
3454        /*
3455         * Expose headphone mic (or possibly Line In on some machines) instead
3456         * of PC Beep on 1Ah, and disable 1Ah loopback for all outputs. See
3457         * Documentation/sound/hd-audio/realtek-pc-beep.rst for details of
3458         * this register.
3459         */
3460        alc_write_coef_idx(codec, 0x36, 0x5757);
3461}
3462
3463static void alc256_shutup(struct hda_codec *codec)
3464{
3465        struct alc_spec *spec = codec->spec;
3466        hda_nid_t hp_pin = alc_get_hp_pin(spec);
3467        bool hp_pin_sense;
3468
3469        if (!hp_pin)
3470                hp_pin = 0x21;
3471
3472        hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3473
3474        if (hp_pin_sense)
3475                msleep(2);
3476
3477        snd_hda_codec_write(codec, hp_pin, 0,
3478                            AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3479
3480        if (hp_pin_sense || spec->ultra_low_power)
3481                msleep(85);
3482
3483        /* 3k pull low control for Headset jack. */
3484        /* NOTE: call this before clearing the pin, otherwise codec stalls */
3485        /* If disable 3k pulldown control for alc257, the Mic detection will not work correctly
3486         * when booting with headset plugged. So skip setting it for the codec alc257
3487         */
3488        if (codec->core.vendor_id != 0x10ec0257)
3489                alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
3490
3491        if (!spec->no_shutup_pins)
3492                snd_hda_codec_write(codec, hp_pin, 0,
3493                                    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3494
3495        if (hp_pin_sense || spec->ultra_low_power)
3496                msleep(100);
3497
3498        alc_auto_setup_eapd(codec, false);
3499        alc_shutup_pins(codec);
3500        if (spec->ultra_low_power) {
3501                msleep(50);
3502                alc_update_coef_idx(codec, 0x03, 1<<1, 0);
3503                alc_update_coef_idx(codec, 0x08, 7<<4, 7<<4);
3504                alc_update_coef_idx(codec, 0x08, 3<<2, 0);
3505                alc_update_coef_idx(codec, 0x3b, 1<<15, 1<<15);
3506                alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3507                msleep(30);
3508        }
3509}
3510
3511static void alc225_init(struct hda_codec *codec)
3512{
3513        struct alc_spec *spec = codec->spec;
3514        hda_nid_t hp_pin = alc_get_hp_pin(spec);
3515        bool hp1_pin_sense, hp2_pin_sense;
3516
3517        if (!hp_pin)
3518                hp_pin = 0x21;
3519        msleep(30);
3520
3521        hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3522        hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3523
3524        if (hp1_pin_sense || hp2_pin_sense)
3525                msleep(2);
3526
3527        alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
3528        if (spec->ultra_low_power) {
3529                alc_update_coef_idx(codec, 0x08, 0x0f << 2, 3<<2);
3530                alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3531                alc_update_coef_idx(codec, 0x33, 1<<11, 0);
3532                msleep(30);
3533        }
3534
3535        if (hp1_pin_sense || spec->ultra_low_power)
3536                snd_hda_codec_write(codec, hp_pin, 0,
3537                            AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3538        if (hp2_pin_sense)
3539                snd_hda_codec_write(codec, 0x16, 0,
3540                            AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3541
3542        if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3543                msleep(85);
3544
3545        if (hp1_pin_sense || spec->ultra_low_power)
3546                snd_hda_codec_write(codec, hp_pin, 0,
3547                            AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3548        if (hp2_pin_sense)
3549                snd_hda_codec_write(codec, 0x16, 0,
3550                            AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3551
3552        if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3553                msleep(100);
3554
3555        alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3556        alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
3557}
3558
3559static void alc225_shutup(struct hda_codec *codec)
3560{
3561        struct alc_spec *spec = codec->spec;
3562        hda_nid_t hp_pin = alc_get_hp_pin(spec);
3563        bool hp1_pin_sense, hp2_pin_sense;
3564
3565        if (!hp_pin)
3566                hp_pin = 0x21;
3567
3568        alc_disable_headset_jack_key(codec);
3569        /* 3k pull low control for Headset jack. */
3570        alc_update_coef_idx(codec, 0x4a, 0, 3 << 10);
3571
3572        hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3573        hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3574
3575        if (hp1_pin_sense || hp2_pin_sense)
3576                msleep(2);
3577
3578        if (hp1_pin_sense || spec->ultra_low_power)
3579                snd_hda_codec_write(codec, hp_pin, 0,
3580                            AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3581        if (hp2_pin_sense)
3582                snd_hda_codec_write(codec, 0x16, 0,
3583                            AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3584
3585        if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3586                msleep(85);
3587
3588        if (hp1_pin_sense || spec->ultra_low_power)
3589                snd_hda_codec_write(codec, hp_pin, 0,
3590                            AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3591        if (hp2_pin_sense)
3592                snd_hda_codec_write(codec, 0x16, 0,
3593                            AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3594
3595        if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3596                msleep(100);
3597
3598        alc_auto_setup_eapd(codec, false);
3599        alc_shutup_pins(codec);
3600        if (spec->ultra_low_power) {
3601                msleep(50);
3602                alc_update_coef_idx(codec, 0x08, 0x0f << 2, 0x0c << 2);
3603                alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3604                alc_update_coef_idx(codec, 0x33, 1<<11, 1<<11);
3605                alc_update_coef_idx(codec, 0x4a, 3<<4, 2<<4);
3606                msleep(30);
3607        }
3608
3609        alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3610        alc_enable_headset_jack_key(codec);
3611}
3612
3613static void alc_default_init(struct hda_codec *codec)
3614{
3615        struct alc_spec *spec = codec->spec;
3616        hda_nid_t hp_pin = alc_get_hp_pin(spec);
3617        bool hp_pin_sense;
3618
3619        if (!hp_pin)
3620                return;
3621
3622        msleep(30);
3623
3624        hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3625
3626        if (hp_pin_sense)
3627                msleep(2);
3628
3629        snd_hda_codec_write(codec, hp_pin, 0,
3630                            AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3631
3632        if (hp_pin_sense)
3633                msleep(85);
3634
3635        snd_hda_codec_write(codec, hp_pin, 0,
3636                            AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3637
3638        if (hp_pin_sense)
3639                msleep(100);
3640}
3641
3642static void alc_default_shutup(struct hda_codec *codec)
3643{
3644        struct alc_spec *spec = codec->spec;
3645        hda_nid_t hp_pin = alc_get_hp_pin(spec);
3646        bool hp_pin_sense;
3647
3648        if (!hp_pin) {
3649                alc269_shutup(codec);
3650                return;
3651        }
3652
3653        hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3654
3655        if (hp_pin_sense)
3656                msleep(2);
3657
3658        snd_hda_codec_write(codec, hp_pin, 0,
3659                            AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3660
3661        if (hp_pin_sense)
3662                msleep(85);
3663
3664        if (!spec->no_shutup_pins)
3665                snd_hda_codec_write(codec, hp_pin, 0,
3666                                    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3667
3668        if (hp_pin_sense)
3669                msleep(100);
3670
3671        alc_auto_setup_eapd(codec, false);
3672        alc_shutup_pins(codec);
3673}
3674
3675static void alc294_hp_init(struct hda_codec *codec)
3676{
3677        struct alc_spec *spec = codec->spec;
3678        hda_nid_t hp_pin = alc_get_hp_pin(spec);
3679        int i, val;
3680
3681        if (!hp_pin)
3682                return;
3683
3684        snd_hda_codec_write(codec, hp_pin, 0,
3685                            AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3686
3687        msleep(100);
3688
3689        if (!spec->no_shutup_pins)
3690                snd_hda_codec_write(codec, hp_pin, 0,
3691                                    AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3692
3693        alc_update_coef_idx(codec, 0x6f, 0x000f, 0);/* Set HP depop to manual mode */
3694        alc_update_coefex_idx(codec, 0x58, 0x00, 0x8000, 0x8000); /* HP depop procedure start */
3695
3696        /* Wait for depop procedure finish  */
3697        val = alc_read_coefex_idx(codec, 0x58, 0x01);
3698        for (i = 0; i < 20 && val & 0x0080; i++) {
3699                msleep(50);
3700                val = alc_read_coefex_idx(codec, 0x58, 0x01);
3701        }
3702        /* Set HP depop to auto mode */
3703        alc_update_coef_idx(codec, 0x6f, 0x000f, 0x000b);
3704        msleep(50);
3705}
3706
3707static void alc294_init(struct hda_codec *codec)
3708{
3709        struct alc_spec *spec = codec->spec;
3710
3711        /* required only at boot or S4 resume time */
3712        if (!spec->done_hp_init ||
3713            codec->core.dev.power.power_state.event == PM_EVENT_RESTORE) {
3714                alc294_hp_init(codec);
3715                spec->done_hp_init = true;
3716        }
3717        alc_default_init(codec);
3718}
3719
3720static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg,
3721                             unsigned int val)
3722{
3723        snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3724        snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val & 0xffff); /* LSB */
3725        snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val >> 16); /* MSB */
3726}
3727
3728static int alc5505_coef_get(struct hda_codec *codec, unsigned int index_reg)
3729{
3730        unsigned int val;
3731
3732        snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3733        val = snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3734                & 0xffff;
3735        val |= snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3736                << 16;
3737        return val;
3738}
3739
3740static void alc5505_dsp_halt(struct hda_codec *codec)
3741{
3742        unsigned int val;
3743
3744        alc5505_coef_set(codec, 0x3000, 0x000c); /* DSP CPU stop */
3745        alc5505_coef_set(codec, 0x880c, 0x0008); /* DDR enter self refresh */
3746        alc5505_coef_set(codec, 0x61c0, 0x11110080); /* Clock control for PLL and CPU */
3747        alc5505_coef_set(codec, 0x6230, 0xfc0d4011); /* Disable Input OP */
3748        alc5505_coef_set(codec, 0x61b4, 0x040a2b03); /* Stop PLL2 */
3749        alc5505_coef_set(codec, 0x61b0, 0x00005b17); /* Stop PLL1 */
3750        alc5505_coef_set(codec, 0x61b8, 0x04133303); /* Stop PLL3 */
3751        val = alc5505_coef_get(codec, 0x6220);
3752        alc5505_coef_set(codec, 0x6220, (val | 0x3000)); /* switch Ringbuffer clock to DBUS clock */
3753}
3754
3755static void alc5505_dsp_back_from_halt(struct hda_codec *codec)
3756{
3757        alc5505_coef_set(codec, 0x61b8, 0x04133302);
3758        alc5505_coef_set(codec, 0x61b0, 0x00005b16);
3759        alc5505_coef_set(codec, 0x61b4, 0x040a2b02);
3760        alc5505_coef_set(codec, 0x6230, 0xf80d4011);
3761        alc5505_coef_set(codec, 0x6220, 0x2002010f);
3762        alc5505_coef_set(codec, 0x880c, 0x00000004);
3763}
3764
3765static void alc5505_dsp_init(struct hda_codec *codec)
3766{
3767        unsigned int val;
3768
3769        alc5505_dsp_halt(codec);
3770        alc5505_dsp_back_from_halt(codec);
3771        alc5505_coef_set(codec, 0x61b0, 0x5b14); /* PLL1 control */
3772        alc5505_coef_set(codec, 0x61b0, 0x5b16);
3773        alc5505_coef_set(codec, 0x61b4, 0x04132b00); /* PLL2 control */
3774        alc5505_coef_set(codec, 0x61b4, 0x04132b02);
3775        alc5505_coef_set(codec, 0x61b8, 0x041f3300); /* PLL3 control*/
3776        alc5505_coef_set(codec, 0x61b8, 0x041f3302);
3777        snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_CODEC_RESET, 0); /* Function reset */
3778        alc5505_coef_set(codec, 0x61b8, 0x041b3302);
3779        alc5505_coef_set(codec, 0x61b8, 0x04173302);
3780        alc5505_coef_set(codec, 0x61b8, 0x04163302);
3781        alc5505_coef_set(codec, 0x8800, 0x348b328b); /* DRAM control */
3782        alc5505_coef_set(codec, 0x8808, 0x00020022); /* DRAM control */
3783        alc5505_coef_set(codec, 0x8818, 0x00000400); /* DRAM control */
3784
3785        val = alc5505_coef_get(codec, 0x6200) >> 16; /* Read revision ID */
3786        if (val <= 3)
3787                alc5505_coef_set(codec, 0x6220, 0x2002010f); /* I/O PAD Configuration */
3788        else
3789                alc5505_coef_set(codec, 0x6220, 0x6002018f);
3790
3791        alc5505_coef_set(codec, 0x61ac, 0x055525f0); /**/
3792        alc5505_coef_set(codec, 0x61c0, 0x12230080); /* Clock control */
3793        alc5505_coef_set(codec, 0x61b4, 0x040e2b02); /* PLL2 control */
3794        alc5505_coef_set(codec, 0x61bc, 0x010234f8); /* OSC Control */
3795        alc5505_coef_set(codec, 0x880c, 0x00000004); /* DRAM Function control */
3796        alc5505_coef_set(codec, 0x880c, 0x00000003);
3797        alc5505_coef_set(codec, 0x880c, 0x00000010);
3798
3799#ifdef HALT_REALTEK_ALC5505
3800        alc5505_dsp_halt(codec);
3801#endif
3802}
3803
3804#ifdef HALT_REALTEK_ALC5505
3805#define alc5505_dsp_suspend(codec)      do { } while (0) /* NOP */
3806#define alc5505_dsp_resume(codec)       do { } while (0) /* NOP */
3807#else
3808#define alc5505_dsp_suspend(codec)      alc5505_dsp_halt(codec)
3809#define alc5505_dsp_resume(codec)       alc5505_dsp_back_from_halt(codec)
3810#endif
3811
3812#ifdef CONFIG_PM
3813static int alc269_suspend(struct hda_codec *codec)
3814{
3815        struct alc_spec *spec = codec->spec;
3816
3817        if (spec->has_alc5505_dsp)
3818                alc5505_dsp_suspend(codec);
3819        return alc_suspend(codec);
3820}
3821
3822static int alc269_resume(struct hda_codec *codec)
3823{
3824        struct alc_spec *spec = codec->spec;
3825
3826        if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3827                alc269vb_toggle_power_output(codec, 0);
3828        if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
3829                        (alc_get_coef0(codec) & 0x00ff) == 0x018) {
3830                msleep(150);
3831        }
3832
3833        codec->patch_ops.init(codec);
3834
3835        if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3836                alc269vb_toggle_power_output(codec, 1);
3837        if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
3838                        (alc_get_coef0(codec) & 0x00ff) == 0x017) {
3839                msleep(200);
3840        }
3841
3842        snd_hda_regmap_sync(codec);
3843        hda_call_check_power_status(codec, 0x01);
3844
3845        /* on some machine, the BIOS will clear the codec gpio data when enter
3846         * suspend, and won't restore the data after resume, so we restore it
3847         * in the driver.
3848         */
3849        if (spec->gpio_data)
3850                alc_write_gpio_data(codec);
3851
3852        if (spec->has_alc5505_dsp)
3853                alc5505_dsp_resume(codec);
3854
3855        return 0;
3856}
3857#endif /* CONFIG_PM */
3858
3859static void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec,
3860                                                 const struct hda_fixup *fix, int action)
3861{
3862        struct alc_spec *spec = codec->spec;
3863
3864        if (action == HDA_FIXUP_ACT_PRE_PROBE)
3865                spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
3866}
3867
3868static void alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec *codec,
3869                                                 const struct hda_fixup *fix,
3870                                                 int action)
3871{
3872        unsigned int cfg_headphone = snd_hda_codec_get_pincfg(codec, 0x21);
3873        unsigned int cfg_headset_mic = snd_hda_codec_get_pincfg(codec, 0x19);
3874
3875        if (cfg_headphone && cfg_headset_mic == 0x411111f0)
3876                snd_hda_codec_set_pincfg(codec, 0x19,
3877                        (cfg_headphone & ~AC_DEFCFG_DEVICE) |
3878                        (AC_JACK_MIC_IN << AC_DEFCFG_DEVICE_SHIFT));
3879}
3880
3881static void alc269_fixup_hweq(struct hda_codec *codec,
3882                               const struct hda_fixup *fix, int action)
3883{
3884        if (action == HDA_FIXUP_ACT_INIT)
3885                alc_update_coef_idx(codec, 0x1e, 0, 0x80);
3886}
3887
3888static void alc269_fixup_headset_mic(struct hda_codec *codec,
3889                                       const struct hda_fixup *fix, int action)
3890{
3891        struct alc_spec *spec = codec->spec;
3892
3893        if (action == HDA_FIXUP_ACT_PRE_PROBE)
3894                spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
3895}
3896
3897static void alc271_fixup_dmic(struct hda_codec *codec,
3898                              const struct hda_fixup *fix, int action)
3899{
3900        static const struct hda_verb verbs[] = {
3901                {0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
3902                {0x20, AC_VERB_SET_PROC_COEF, 0x4000},
3903                {}
3904        };
3905        unsigned int cfg;
3906
3907        if (strcmp(codec->core.chip_name, "ALC271X") &&
3908            strcmp(codec->core.chip_name, "ALC269VB"))
3909                return;
3910        cfg = snd_hda_codec_get_pincfg(codec, 0x12);
3911        if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED)
3912                snd_hda_sequence_write(codec, verbs);
3913}
3914
3915static void alc269_fixup_pcm_44k(struct hda_codec *codec,
3916                                 const struct hda_fixup *fix, int action)
3917{
3918        struct alc_spec *spec = codec->spec;
3919
3920        if (action != HDA_FIXUP_ACT_PROBE)
3921                return;
3922
3923        /* Due to a hardware problem on Lenovo Ideadpad, we need to
3924         * fix the sample rate of analog I/O to 44.1kHz
3925         */
3926        spec->gen.stream_analog_playback = &alc269_44k_pcm_analog_playback;
3927        spec->gen.stream_analog_capture = &alc269_44k_pcm_analog_capture;
3928}
3929
3930static void alc269_fixup_stereo_dmic(struct hda_codec *codec,
3931                                     const struct hda_fixup *fix, int action)
3932{
3933        /* The digital-mic unit sends PDM (differential signal) instead of
3934         * the standard PCM, thus you can't record a valid mono stream as is.
3935         * Below is a workaround specific to ALC269 to control the dmic
3936         * signal source as mono.
3937         */
3938        if (action == HDA_FIXUP_ACT_INIT)
3939                alc_update_coef_idx(codec, 0x07, 0, 0x80);
3940}
3941
3942static void alc269_quanta_automute(struct hda_codec *codec)
3943{
3944        snd_hda_gen_update_outputs(codec);
3945
3946        alc_write_coef_idx(codec, 0x0c, 0x680);
3947        alc_write_coef_idx(codec, 0x0c, 0x480);
3948}
3949
3950static void alc269_fixup_quanta_mute(struct hda_codec *codec,
3951                                     const struct hda_fixup *fix, int action)
3952{
3953        struct alc_spec *spec = codec->spec;
3954        if (action != HDA_FIXUP_ACT_PROBE)
3955                return;
3956        spec->gen.automute_hook = alc269_quanta_automute;
3957}
3958
3959static void alc269_x101_hp_automute_hook(struct hda_codec *codec,
3960                                         struct hda_jack_callback *jack)
3961{
3962        struct alc_spec *spec = codec->spec;
3963        int vref;
3964        msleep(200);
3965        snd_hda_gen_hp_automute(codec, jack);
3966
3967        vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
3968        msleep(100);
3969        snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
3970                            vref);
3971        msleep(500);
3972        snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
3973                            vref);
3974}
3975
3976/*
3977 * Magic sequence to make Huawei Matebook X right speaker working (bko#197801)
3978 */
3979struct hda_alc298_mbxinit {
3980        unsigned char value_0x23;
3981        unsigned char value_0x25;
3982};
3983
3984static void alc298_huawei_mbx_stereo_seq(struct hda_codec *codec,
3985                                         const struct hda_alc298_mbxinit *initval,
3986                                         bool first)
3987{
3988        snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x0);
3989        alc_write_coef_idx(codec, 0x26, 0xb000);
3990
3991        if (first)
3992                snd_hda_codec_write(codec, 0x21, 0, AC_VERB_GET_PIN_SENSE, 0x0);
3993
3994        snd_hda_codec_write(codec, 0x6, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
3995        alc_write_coef_idx(codec, 0x26, 0xf000);
3996        alc_write_coef_idx(codec, 0x23, initval->value_0x23);
3997
3998        if (initval->value_0x23 != 0x1e)
3999                alc_write_coef_idx(codec, 0x25, initval->value_0x25);
4000
4001        snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
4002        snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
4003}
4004
4005static void alc298_fixup_huawei_mbx_stereo(struct hda_codec *codec,
4006                                           const struct hda_fixup *fix,
4007                                           int action)
4008{
4009        /* Initialization magic */
4010        static const struct hda_alc298_mbxinit dac_init[] = {
4011                {0x0c, 0x00}, {0x0d, 0x00}, {0x0e, 0x00}, {0x0f, 0x00},
4012                {0x10, 0x00}, {0x1a, 0x40}, {0x1b, 0x82}, {0x1c, 0x00},
4013                {0x1d, 0x00}, {0x1e, 0x00}, {0x1f, 0x00},
4014                {0x20, 0xc2}, {0x21, 0xc8}, {0x22, 0x26}, {0x23, 0x24},
4015                {0x27, 0xff}, {0x28, 0xff}, {0x29, 0xff}, {0x2a, 0x8f},
4016                {0x2b, 0x02}, {0x2c, 0x48}, {0x2d, 0x34}, {0x2e, 0x00},
4017                {0x2f, 0x00},
4018                {0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00},
4019                {0x34, 0x00}, {0x35, 0x01}, {0x36, 0x93}, {0x37, 0x0c},
4020                {0x38, 0x00}, {0x39, 0x00}, {0x3a, 0xf8}, {0x38, 0x80},
4021                {}
4022        };
4023        const struct hda_alc298_mbxinit *seq;
4024
4025        if (action != HDA_FIXUP_ACT_INIT)
4026                return;
4027
4028        /* Start */
4029        snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x00);
4030        snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
4031        alc_write_coef_idx(codec, 0x26, 0xf000);
4032        alc_write_coef_idx(codec, 0x22, 0x31);
4033        alc_write_coef_idx(codec, 0x23, 0x0b);
4034        alc_write_coef_idx(codec, 0x25, 0x00);
4035        snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
4036        snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
4037
4038        for (seq = dac_init; seq->value_0x23; seq++)
4039                alc298_huawei_mbx_stereo_seq(codec, seq, seq == dac_init);
4040}
4041
4042static void alc269_fixup_x101_headset_mic(struct hda_codec *codec,
4043                                     const struct hda_fixup *fix, int action)
4044{
4045        struct alc_spec *spec = codec->spec;
4046        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4047                spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
4048                spec->gen.hp_automute_hook = alc269_x101_hp_automute_hook;
4049        }
4050}
4051
4052static void alc_update_vref_led(struct hda_codec *codec, hda_nid_t pin,
4053                                bool polarity, bool on)
4054{
4055        unsigned int pinval;
4056
4057        if (!pin)
4058                return;
4059        if (polarity)
4060                on = !on;
4061        pinval = snd_hda_codec_get_pin_target(codec, pin);
4062        pinval &= ~AC_PINCTL_VREFEN;
4063        pinval |= on ? AC_PINCTL_VREF_80 : AC_PINCTL_VREF_HIZ;
4064        /* temporarily power up/down for setting VREF */
4065        snd_hda_power_up_pm(codec);
4066        snd_hda_set_pin_ctl_cache(codec, pin, pinval);
4067        snd_hda_power_down_pm(codec);
4068}
4069
4070/* update mute-LED according to the speaker mute state via mic VREF pin */
4071static int vref_mute_led_set(struct led_classdev *led_cdev,
4072                             enum led_brightness brightness)
4073{
4074        struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4075        struct alc_spec *spec = codec->spec;
4076
4077        alc_update_vref_led(codec, spec->mute_led_nid,
4078                            spec->mute_led_polarity, brightness);
4079        return 0;
4080}
4081
4082/* Make sure the led works even in runtime suspend */
4083static unsigned int led_power_filter(struct hda_codec *codec,
4084                                                  hda_nid_t nid,
4085                                                  unsigned int power_state)
4086{
4087        struct alc_spec *spec = codec->spec;
4088
4089        if (power_state != AC_PWRST_D3 || nid == 0 ||
4090            (nid != spec->mute_led_nid && nid != spec->cap_mute_led_nid))
4091                return power_state;
4092
4093        /* Set pin ctl again, it might have just been set to 0 */
4094        snd_hda_set_pin_ctl(codec, nid,
4095                            snd_hda_codec_get_pin_target(codec, nid));
4096
4097        return snd_hda_gen_path_power_filter(codec, nid, power_state);
4098}
4099
4100static void alc269_fixup_hp_mute_led(struct hda_codec *codec,
4101                                     const struct hda_fixup *fix, int action)
4102{
4103        struct alc_spec *spec = codec->spec;
4104        const struct dmi_device *dev = NULL;
4105
4106        if (action != HDA_FIXUP_ACT_PRE_PROBE)
4107                return;
4108
4109        while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) {
4110                int pol, pin;
4111                if (sscanf(dev->name, "HP_Mute_LED_%d_%x", &pol, &pin) != 2)
4112                        continue;
4113                if (pin < 0x0a || pin >= 0x10)
4114                        break;
4115                spec->mute_led_polarity = pol;
4116                spec->mute_led_nid = pin - 0x0a + 0x18;
4117                snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
4118                codec->power_filter = led_power_filter;
4119                codec_dbg(codec,
4120                          "Detected mute LED for %x:%d\n", spec->mute_led_nid,
4121                           spec->mute_led_polarity);
4122                break;
4123        }
4124}
4125
4126static void alc269_fixup_hp_mute_led_micx(struct hda_codec *codec,
4127                                          const struct hda_fixup *fix,
4128                                          int action, hda_nid_t pin)
4129{
4130        struct alc_spec *spec = codec->spec;
4131
4132        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4133                spec->mute_led_polarity = 0;
4134                spec->mute_led_nid = pin;
4135                snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
4136                codec->power_filter = led_power_filter;
4137        }
4138}
4139
4140static void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec,
4141                                const struct hda_fixup *fix, int action)
4142{
4143        alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x18);
4144}
4145
4146static void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec,
4147                                const struct hda_fixup *fix, int action)
4148{
4149        alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x19);
4150}
4151
4152static void alc269_fixup_hp_mute_led_mic3(struct hda_codec *codec,
4153                                const struct hda_fixup *fix, int action)
4154{
4155        alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1b);
4156}
4157
4158/* update LED status via GPIO */
4159static void alc_update_gpio_led(struct hda_codec *codec, unsigned int mask,
4160                                int polarity, bool enabled)
4161{
4162        if (polarity)
4163                enabled = !enabled;
4164        alc_update_gpio_data(codec, mask, !enabled); /* muted -> LED on */
4165}
4166
4167/* turn on/off mute LED via GPIO per vmaster hook */
4168static int gpio_mute_led_set(struct led_classdev *led_cdev,
4169                             enum led_brightness brightness)
4170{
4171        struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4172        struct alc_spec *spec = codec->spec;
4173
4174        alc_update_gpio_led(codec, spec->gpio_mute_led_mask,
4175                            spec->mute_led_polarity, !brightness);
4176        return 0;
4177}
4178
4179/* turn on/off mic-mute LED via GPIO per capture hook */
4180static int micmute_led_set(struct led_classdev *led_cdev,
4181                           enum led_brightness brightness)
4182{
4183        struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4184        struct alc_spec *spec = codec->spec;
4185
4186        alc_update_gpio_led(codec, spec->gpio_mic_led_mask,
4187                            spec->micmute_led_polarity, !brightness);
4188        return 0;
4189}
4190
4191/* setup mute and mic-mute GPIO bits, add hooks appropriately */
4192static void alc_fixup_hp_gpio_led(struct hda_codec *codec,
4193                                  int action,
4194                                  unsigned int mute_mask,
4195                                  unsigned int micmute_mask)
4196{
4197        struct alc_spec *spec = codec->spec;
4198
4199        alc_fixup_gpio(codec, action, mute_mask | micmute_mask);
4200
4201        if (action != HDA_FIXUP_ACT_PRE_PROBE)
4202                return;
4203        if (mute_mask) {
4204                spec->gpio_mute_led_mask = mute_mask;
4205                snd_hda_gen_add_mute_led_cdev(codec, gpio_mute_led_set);
4206        }
4207        if (micmute_mask) {
4208                spec->gpio_mic_led_mask = micmute_mask;
4209                snd_hda_gen_add_micmute_led_cdev(codec, micmute_led_set);
4210        }
4211}
4212
4213static void alc269_fixup_hp_gpio_led(struct hda_codec *codec,
4214                                const struct hda_fixup *fix, int action)
4215{
4216        alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
4217}
4218
4219static void alc285_fixup_hp_gpio_led(struct hda_codec *codec,
4220                                const struct hda_fixup *fix, int action)
4221{
4222        alc_fixup_hp_gpio_led(codec, action, 0x04, 0x01);
4223}
4224
4225static void alc286_fixup_hp_gpio_led(struct hda_codec *codec,
4226                                const struct hda_fixup *fix, int action)
4227{
4228        alc_fixup_hp_gpio_led(codec, action, 0x02, 0x20);
4229}
4230
4231static void alc287_fixup_hp_gpio_led(struct hda_codec *codec,
4232                                const struct hda_fixup *fix, int action)
4233{
4234        alc_fixup_hp_gpio_led(codec, action, 0x10, 0);
4235}
4236
4237/* turn on/off mic-mute LED per capture hook via VREF change */
4238static int vref_micmute_led_set(struct led_classdev *led_cdev,
4239                                enum led_brightness brightness)
4240{
4241        struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4242        struct alc_spec *spec = codec->spec;
4243
4244        alc_update_vref_led(codec, spec->cap_mute_led_nid,
4245                            spec->micmute_led_polarity, brightness);
4246        return 0;
4247}
4248
4249static void alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec,
4250                                const struct hda_fixup *fix, int action)
4251{
4252        struct alc_spec *spec = codec->spec;
4253
4254        alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
4255        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4256                /* Like hp_gpio_mic1_led, but also needs GPIO4 low to
4257                 * enable headphone amp
4258                 */
4259                spec->gpio_mask |= 0x10;
4260                spec->gpio_dir |= 0x10;
4261                spec->cap_mute_led_nid = 0x18;
4262                snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4263                codec->power_filter = led_power_filter;
4264        }
4265}
4266
4267static void alc280_fixup_hp_gpio4(struct hda_codec *codec,
4268                                   const struct hda_fixup *fix, int action)
4269{
4270        struct alc_spec *spec = codec->spec;
4271
4272        alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
4273        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4274                spec->cap_mute_led_nid = 0x18;
4275                snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4276                codec->power_filter = led_power_filter;
4277        }
4278}
4279
4280static void alc_update_coef_led(struct hda_codec *codec,
4281                                struct alc_coef_led *led,
4282                                bool polarity, bool on)
4283{
4284        if (polarity)
4285                on = !on;
4286        /* temporarily power up/down for setting COEF bit */
4287        alc_update_coef_idx(codec, led->idx, led->mask,
4288                            on ? led->on : led->off);
4289}
4290
4291/* update mute-LED according to the speaker mute state via COEF bit */
4292static int coef_mute_led_set(struct led_classdev *led_cdev,
4293                             enum led_brightness brightness)
4294{
4295        struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4296        struct alc_spec *spec = codec->spec;
4297
4298        alc_update_coef_led(codec, &spec->mute_led_coef,
4299                            spec->mute_led_polarity, brightness);
4300        return 0;
4301}
4302
4303static void alc285_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4304                                          const struct hda_fixup *fix,
4305                                          int action)
4306{
4307        struct alc_spec *spec = codec->spec;
4308
4309        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4310                spec->mute_led_polarity = 0;
4311                spec->mute_led_coef.idx = 0x0b;
4312                spec->mute_led_coef.mask = 1 << 3;
4313                spec->mute_led_coef.on = 1 << 3;
4314                spec->mute_led_coef.off = 0;
4315                snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4316        }
4317}
4318
4319static void alc236_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4320                                          const struct hda_fixup *fix,
4321                                          int action)
4322{
4323        struct alc_spec *spec = codec->spec;
4324
4325        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4326                spec->mute_led_polarity = 0;
4327                spec->mute_led_coef.idx = 0x34;
4328                spec->mute_led_coef.mask = 1 << 5;
4329                spec->mute_led_coef.on = 0;
4330                spec->mute_led_coef.off = 1 << 5;
4331                snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4332        }
4333}
4334
4335/* turn on/off mic-mute LED per capture hook by coef bit */
4336static int coef_micmute_led_set(struct led_classdev *led_cdev,
4337                                enum led_brightness brightness)
4338{
4339        struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4340        struct alc_spec *spec = codec->spec;
4341
4342        alc_update_coef_led(codec, &spec->mic_led_coef,
4343                            spec->micmute_led_polarity, brightness);
4344        return 0;
4345}
4346
4347static void alc285_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4348                                const struct hda_fixup *fix, int action)
4349{
4350        struct alc_spec *spec = codec->spec;
4351
4352        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4353                spec->mic_led_coef.idx = 0x19;
4354                spec->mic_led_coef.mask = 1 << 13;
4355                spec->mic_led_coef.on = 1 << 13;
4356                spec->mic_led_coef.off = 0;
4357                snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
4358        }
4359}
4360
4361static void alc236_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4362                                const struct hda_fixup *fix, int action)
4363{
4364        struct alc_spec *spec = codec->spec;
4365
4366        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4367                spec->mic_led_coef.idx = 0x35;
4368                spec->mic_led_coef.mask = 3 << 2;
4369                spec->mic_led_coef.on = 2 << 2;
4370                spec->mic_led_coef.off = 1 << 2;
4371                snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
4372        }
4373}
4374
4375static void alc285_fixup_hp_mute_led(struct hda_codec *codec,
4376                                const struct hda_fixup *fix, int action)
4377{
4378        alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
4379        alc285_fixup_hp_coef_micmute_led(codec, fix, action);
4380}
4381
4382static void alc236_fixup_hp_mute_led(struct hda_codec *codec,
4383                                const struct hda_fixup *fix, int action)
4384{
4385        alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
4386        alc236_fixup_hp_coef_micmute_led(codec, fix, action);
4387}
4388
4389#if IS_REACHABLE(CONFIG_INPUT)
4390static void gpio2_mic_hotkey_event(struct hda_codec *codec,
4391                                   struct hda_jack_callback *event)
4392{
4393        struct alc_spec *spec = codec->spec;
4394
4395        /* GPIO2 just toggles on a keypress/keyrelease cycle. Therefore
4396           send both key on and key off event for every interrupt. */
4397        input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 1);
4398        input_sync(spec->kb_dev);
4399        input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 0);
4400        input_sync(spec->kb_dev);
4401}
4402
4403static int alc_register_micmute_input_device(struct hda_codec *codec)
4404{
4405        struct alc_spec *spec = codec->spec;
4406        int i;
4407
4408        spec->kb_dev = input_allocate_device();
4409        if (!spec->kb_dev) {
4410                codec_err(codec, "Out of memory (input_allocate_device)\n");
4411                return -ENOMEM;
4412        }
4413
4414        spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX] = KEY_MICMUTE;
4415
4416        spec->kb_dev->name = "Microphone Mute Button";
4417        spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY);
4418        spec->kb_dev->keycodesize = sizeof(spec->alc_mute_keycode_map[0]);
4419        spec->kb_dev->keycodemax = ARRAY_SIZE(spec->alc_mute_keycode_map);
4420        spec->kb_dev->keycode = spec->alc_mute_keycode_map;
4421        for (i = 0; i < ARRAY_SIZE(spec->alc_mute_keycode_map); i++)
4422                set_bit(spec->alc_mute_keycode_map[i], spec->kb_dev->keybit);
4423
4424        if (input_register_device(spec->kb_dev)) {
4425                codec_err(codec, "input_register_device failed\n");
4426                input_free_device(spec->kb_dev);
4427                spec->kb_dev = NULL;
4428                return -ENOMEM;
4429        }
4430
4431        return 0;
4432}
4433
4434/* GPIO1 = set according to SKU external amp
4435 * GPIO2 = mic mute hotkey
4436 * GPIO3 = mute LED
4437 * GPIO4 = mic mute LED
4438 */
4439static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec,
4440                                             const struct hda_fixup *fix, int action)
4441{
4442        struct alc_spec *spec = codec->spec;
4443
4444        alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
4445        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4446                spec->init_amp = ALC_INIT_DEFAULT;
4447                if (alc_register_micmute_input_device(codec) != 0)
4448                        return;
4449
4450                spec->gpio_mask |= 0x06;
4451                spec->gpio_dir |= 0x02;
4452                spec->gpio_data |= 0x02;
4453                snd_hda_codec_write_cache(codec, codec->core.afg, 0,
4454                                          AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x04);
4455                snd_hda_jack_detect_enable_callback(codec, codec->core.afg,
4456                                                    gpio2_mic_hotkey_event);
4457                return;
4458        }
4459
4460        if (!spec->kb_dev)
4461                return;
4462
4463        switch (action) {
4464        case HDA_FIXUP_ACT_FREE:
4465                input_unregister_device(spec->kb_dev);
4466                spec->kb_dev = NULL;
4467        }
4468}
4469
4470/* Line2 = mic mute hotkey
4471 * GPIO2 = mic mute LED
4472 */
4473static void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec,
4474                                             const struct hda_fixup *fix, int action)
4475{
4476        struct alc_spec *spec = codec->spec;
4477
4478        alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
4479        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4480                spec->init_amp = ALC_INIT_DEFAULT;
4481                if (alc_register_micmute_input_device(codec) != 0)
4482                        return;
4483
4484                snd_hda_jack_detect_enable_callback(codec, 0x1b,
4485                                                    gpio2_mic_hotkey_event);
4486                return;
4487        }
4488
4489        if (!spec->kb_dev)
4490                return;
4491
4492        switch (action) {
4493        case HDA_FIXUP_ACT_FREE:
4494                input_unregister_device(spec->kb_dev);
4495                spec->kb_dev = NULL;
4496        }
4497}
4498#else /* INPUT */
4499#define alc280_fixup_hp_gpio2_mic_hotkey        NULL
4500#define alc233_fixup_lenovo_line2_mic_hotkey    NULL
4501#endif /* INPUT */
4502
4503static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec,
4504                                const struct hda_fixup *fix, int action)
4505{
4506        struct alc_spec *spec = codec->spec;
4507
4508        alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1a);
4509        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4510                spec->cap_mute_led_nid = 0x18;
4511                snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4512        }
4513}
4514
4515static const struct coef_fw alc225_pre_hsmode[] = {
4516        UPDATE_COEF(0x4a, 1<<8, 0),
4517        UPDATE_COEFEX(0x57, 0x05, 1<<14, 0),
4518        UPDATE_COEF(0x63, 3<<14, 3<<14),
4519        UPDATE_COEF(0x4a, 3<<4, 2<<4),
4520        UPDATE_COEF(0x4a, 3<<10, 3<<10),
4521        UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10),
4522        UPDATE_COEF(0x4a, 3<<10, 0),
4523        {}
4524};
4525
4526static void alc_headset_mode_unplugged(struct hda_codec *codec)
4527{
4528        struct alc_spec *spec = codec->spec;
4529        static const struct coef_fw coef0255[] = {
4530                WRITE_COEF(0x1b, 0x0c0b), /* LDO and MISC control */
4531                WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
4532                UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
4533                WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
4534                WRITE_COEFEX(0x57, 0x03, 0x8aa6), /* Direct Drive HP Amp control */
4535                {}
4536        };
4537        static const struct coef_fw coef0256[] = {
4538                WRITE_COEF(0x1b, 0x0c4b), /* LDO and MISC control */
4539                WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
4540                WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
4541                WRITE_COEFEX(0x57, 0x03, 0x09a3), /* Direct Drive HP Amp control */
4542                UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
4543                {}
4544        };
4545        static const struct coef_fw coef0233[] = {
4546                WRITE_COEF(0x1b, 0x0c0b),
4547                WRITE_COEF(0x45, 0xc429),
4548                UPDATE_COEF(0x35, 0x4000, 0),
4549                WRITE_COEF(0x06, 0x2104),
4550                WRITE_COEF(0x1a, 0x0001),
4551                WRITE_COEF(0x26, 0x0004),
4552                WRITE_COEF(0x32, 0x42a3),
4553                {}
4554        };
4555        static const struct coef_fw coef0288[] = {
4556                UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
4557                UPDATE_COEF(0x50, 0x2000, 0x2000),
4558                UPDATE_COEF(0x56, 0x0006, 0x0006),
4559                UPDATE_COEF(0x66, 0x0008, 0),
4560                UPDATE_COEF(0x67, 0x2000, 0),
4561                {}
4562        };
4563        static const struct coef_fw coef0298[] = {
4564                UPDATE_COEF(0x19, 0x1300, 0x0300),
4565                {}
4566        };
4567        static const struct coef_fw coef0292[] = {
4568                WRITE_COEF(0x76, 0x000e),
4569                WRITE_COEF(0x6c, 0x2400),
4570                WRITE_COEF(0x18, 0x7308),
4571                WRITE_COEF(0x6b, 0xc429),
4572                {}
4573        };
4574        static const struct coef_fw coef0293[] = {
4575                UPDATE_COEF(0x10, 7<<8, 6<<8), /* SET Line1 JD to 0 */
4576                UPDATE_COEFEX(0x57, 0x05, 1<<15|1<<13, 0x0), /* SET charge pump by verb */
4577                UPDATE_COEFEX(0x57, 0x03, 1<<10, 1<<10), /* SET EN_OSW to 1 */
4578                UPDATE_COEF(0x1a, 1<<3, 1<<3), /* Combo JD gating with LINE1-VREFO */
4579                WRITE_COEF(0x45, 0xc429), /* Set to TRS type */
4580                UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
4581                {}
4582        };
4583        static const struct coef_fw coef0668[] = {
4584                WRITE_COEF(0x15, 0x0d40),
4585                WRITE_COEF(0xb7, 0x802b),
4586                {}
4587        };
4588        static const struct coef_fw coef0225[] = {
4589                UPDATE_COEF(0x63, 3<<14, 0),
4590                {}
4591        };
4592        static const struct coef_fw coef0274[] = {
4593                UPDATE_COEF(0x4a, 0x0100, 0),
4594                UPDATE_COEFEX(0x57, 0x05, 0x4000, 0),
4595                UPDATE_COEF(0x6b, 0xf000, 0x5000),
4596                UPDATE_COEF(0x4a, 0x0010, 0),
4597                UPDATE_COEF(0x4a, 0x0c00, 0x0c00),
4598                WRITE_COEF(0x45, 0x5289),
4599                UPDATE_COEF(0x4a, 0x0c00, 0),
4600                {}
4601        };
4602
4603        if (spec->no_internal_mic_pin) {
4604                alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
4605                return;
4606        }
4607
4608        switch (codec->core.vendor_id) {
4609        case 0x10ec0255:
4610                alc_process_coef_fw(codec, coef0255);
4611                break;
4612        case 0x10ec0236:
4613        case 0x10ec0256:
4614                alc_process_coef_fw(codec, coef0256);
4615                break;
4616        case 0x10ec0234:
4617        case 0x10ec0274:
4618        case 0x10ec0294:
4619                alc_process_coef_fw(codec, coef0274);
4620                break;
4621        case 0x10ec0233:
4622        case 0x10ec0283:
4623                alc_process_coef_fw(codec, coef0233);
4624                break;
4625        case 0x10ec0286:
4626        case 0x10ec0288:
4627                alc_process_coef_fw(codec, coef0288);
4628                break;
4629        case 0x10ec0298:
4630                alc_process_coef_fw(codec, coef0298);
4631                alc_process_coef_fw(codec, coef0288);
4632                break;
4633        case 0x10ec0292:
4634                alc_process_coef_fw(codec, coef0292);
4635                break;
4636        case 0x10ec0293:
4637                alc_process_coef_fw(codec, coef0293);
4638                break;
4639        case 0x10ec0668:
4640                alc_process_coef_fw(codec, coef0668);
4641                break;
4642        case 0x10ec0215:
4643        case 0x10ec0225:
4644        case 0x10ec0285:
4645        case 0x10ec0295:
4646        case 0x10ec0289:
4647        case 0x10ec0299:
4648                alc_process_coef_fw(codec, alc225_pre_hsmode);
4649                alc_process_coef_fw(codec, coef0225);
4650                break;
4651        case 0x10ec0867:
4652                alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
4653                break;
4654        }
4655        codec_dbg(codec, "Headset jack set to unplugged mode.\n");
4656}
4657
4658
4659static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
4660                                    hda_nid_t mic_pin)
4661{
4662        static const struct coef_fw coef0255[] = {
4663                WRITE_COEFEX(0x57, 0x03, 0x8aa6),
4664                WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
4665                {}
4666        };
4667        static const struct coef_fw coef0256[] = {
4668                UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14), /* Direct Drive HP Amp control(Set to verb control)*/
4669                WRITE_COEFEX(0x57, 0x03, 0x09a3),
4670                WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
4671                {}
4672        };
4673        static const struct coef_fw coef0233[] = {
4674                UPDATE_COEF(0x35, 0, 1<<14),
4675                WRITE_COEF(0x06, 0x2100),
4676                WRITE_COEF(0x1a, 0x0021),
4677                WRITE_COEF(0x26, 0x008c),
4678                {}
4679        };
4680        static const struct coef_fw coef0288[] = {
4681                UPDATE_COEF(0x4f, 0x00c0, 0),
4682                UPDATE_COEF(0x50, 0x2000, 0),
4683                UPDATE_COEF(0x56, 0x0006, 0),
4684                UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
4685                UPDATE_COEF(0x66, 0x0008, 0x0008),
4686                UPDATE_COEF(0x67, 0x2000, 0x2000),
4687                {}
4688        };
4689        static const struct coef_fw coef0292[] = {
4690                WRITE_COEF(0x19, 0xa208),
4691                WRITE_COEF(0x2e, 0xacf0),
4692                {}
4693        };
4694        static const struct coef_fw coef0293[] = {
4695                UPDATE_COEFEX(0x57, 0x05, 0, 1<<15|1<<13), /* SET charge pump by verb */
4696                UPDATE_COEFEX(0x57, 0x03, 1<<10, 0), /* SET EN_OSW to 0 */
4697                UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
4698                {}
4699        };
4700        static const struct coef_fw coef0688[] = {
4701                WRITE_COEF(0xb7, 0x802b),
4702                WRITE_COEF(0xb5, 0x1040),
4703                UPDATE_COEF(0xc3, 0, 1<<12),
4704                {}
4705        };
4706        static const struct coef_fw coef0225[] = {
4707                UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14),
4708                UPDATE_COEF(0x4a, 3<<4, 2<<4),
4709                UPDATE_COEF(0x63, 3<<14, 0),
4710                {}
4711        };
4712        static const struct coef_fw coef0274[] = {
4713                UPDATE_COEFEX(0x57, 0x05, 0x4000, 0x4000),
4714                UPDATE_COEF(0x4a, 0x0010, 0),
4715                UPDATE_COEF(0x6b, 0xf000, 0),
4716                {}
4717        };
4718
4719        switch (codec->core.vendor_id) {
4720        case 0x10ec0255:
4721                alc_write_coef_idx(codec, 0x45, 0xc489);
4722                snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4723                alc_process_coef_fw(codec, coef0255);
4724                snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4725                break;
4726        case 0x10ec0236:
4727        case 0x10ec0256:
4728                alc_write_coef_idx(codec, 0x45, 0xc489);
4729                snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4730                alc_process_coef_fw(codec, coef0256);
4731                snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4732                break;
4733        case 0x10ec0234:
4734        case 0x10ec0274:
4735        case 0x10ec0294:
4736                alc_write_coef_idx(codec, 0x45, 0x4689);
4737                snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4738                alc_process_coef_fw(codec, coef0274);
4739                snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4740                break;
4741        case 0x10ec0233:
4742        case 0x10ec0283:
4743                alc_write_coef_idx(codec, 0x45, 0xc429);
4744                snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4745                alc_process_coef_fw(codec, coef0233);
4746                snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4747                break;
4748        case 0x10ec0286:
4749        case 0x10ec0288:
4750        case 0x10ec0298:
4751                snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4752                alc_process_coef_fw(codec, coef0288);
4753                snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4754                break;
4755        case 0x10ec0292:
4756                snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4757                alc_process_coef_fw(codec, coef0292);
4758                break;
4759        case 0x10ec0293:
4760                /* Set to TRS mode */
4761                alc_write_coef_idx(codec, 0x45, 0xc429);
4762                snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4763                alc_process_coef_fw(codec, coef0293);
4764                snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4765                break;
4766        case 0x10ec0867:
4767                alc_update_coefex_idx(codec, 0x57, 0x5, 0, 1<<14);
4768                fallthrough;
4769        case 0x10ec0221:
4770        case 0x10ec0662:
4771                snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4772                snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4773                break;
4774        case 0x10ec0668:
4775                alc_write_coef_idx(codec, 0x11, 0x0001);
4776                snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4777                alc_process_coef_fw(codec, coef0688);
4778                snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4779                break;
4780        case 0x10ec0215:
4781        case 0x10ec0225:
4782        case 0x10ec0285:
4783        case 0x10ec0295:
4784        case 0x10ec0289:
4785        case 0x10ec0299:
4786                alc_process_coef_fw(codec, alc225_pre_hsmode);
4787                alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x31<<10);
4788                snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4789                alc_process_coef_fw(codec, coef0225);
4790                snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4791                break;
4792        }
4793        codec_dbg(codec, "Headset jack set to mic-in mode.\n");
4794}
4795
4796static void alc_headset_mode_default(struct hda_codec *codec)
4797{
4798        static const struct coef_fw coef0225[] = {
4799                UPDATE_COEF(0x45, 0x3f<<10, 0x30<<10),
4800                UPDATE_COEF(0x45, 0x3f<<10, 0x31<<10),
4801                UPDATE_COEF(0x49, 3<<8, 0<<8),
4802                UPDATE_COEF(0x4a, 3<<4, 3<<4),
4803                UPDATE_COEF(0x63, 3<<14, 0),
4804                UPDATE_COEF(0x67, 0xf000, 0x3000),
4805                {}
4806        };
4807        static const struct coef_fw coef0255[] = {
4808                WRITE_COEF(0x45, 0xc089),
4809                WRITE_COEF(0x45, 0xc489),
4810                WRITE_COEFEX(0x57, 0x03, 0x8ea6),
4811                WRITE_COEF(0x49, 0x0049),
4812                {}
4813        };
4814        static const struct coef_fw coef0256[] = {
4815                WRITE_COEF(0x45, 0xc489),
4816                WRITE_COEFEX(0x57, 0x03, 0x0da3),
4817                WRITE_COEF(0x49, 0x0049),
4818                UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
4819                WRITE_COEF(0x06, 0x6100),
4820                {}
4821        };
4822        static const struct coef_fw coef0233[] = {
4823                WRITE_COEF(0x06, 0x2100),
4824                WRITE_COEF(0x32, 0x4ea3),
4825                {}
4826        };
4827        static const struct coef_fw coef0288[] = {
4828                UPDATE_COEF(0x4f, 0xfcc0, 0xc400), /* Set to TRS type */
4829                UPDATE_COEF(0x50, 0x2000, 0x2000),
4830                UPDATE_COEF(0x56, 0x0006, 0x0006),
4831                UPDATE_COEF(0x66, 0x0008, 0),
4832                UPDATE_COEF(0x67, 0x2000, 0),
4833                {}
4834        };
4835        static const struct coef_fw coef0292[] = {
4836                WRITE_COEF(0x76, 0x000e),
4837                WRITE_COEF(0x6c, 0x2400),
4838                WRITE_COEF(0x6b, 0xc429),
4839                WRITE_COEF(0x18, 0x7308),
4840                {}
4841        };
4842        static const struct coef_fw coef0293[] = {
4843                UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
4844                WRITE_COEF(0x45, 0xC429), /* Set to TRS type */
4845                UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
4846                {}
4847        };
4848        static const struct coef_fw coef0688[] = {
4849                WRITE_COEF(0x11, 0x0041),
4850                WRITE_COEF(0x15, 0x0d40),
4851                WRITE_COEF(0xb7, 0x802b),
4852                {}
4853        };
4854        static const struct coef_fw coef0274[] = {
4855                WRITE_COEF(0x45, 0x4289),
4856                UPDATE_COEF(0x4a, 0x0010, 0x0010),
4857                UPDATE_COEF(0x6b, 0x0f00, 0),
4858                UPDATE_COEF(0x49, 0x0300, 0x0300),
4859                {}
4860        };
4861
4862        switch (codec->core.vendor_id) {
4863        case 0x10ec0215:
4864        case 0x10ec0225:
4865        case 0x10ec0285:
4866        case 0x10ec0295:
4867        case 0x10ec0289:
4868        case 0x10ec0299:
4869                alc_process_coef_fw(codec, alc225_pre_hsmode);
4870                alc_process_coef_fw(codec, coef0225);
4871                break;
4872        case 0x10ec0255:
4873                alc_process_coef_fw(codec, coef0255);
4874                break;
4875        case 0x10ec0236:
4876        case 0x10ec0256:
4877                alc_write_coef_idx(codec, 0x1b, 0x0e4b);
4878                alc_write_coef_idx(codec, 0x45, 0xc089);
4879                msleep(50);
4880                alc_process_coef_fw(codec, coef0256);
4881                break;
4882        case 0x10ec0234:
4883        case 0x10ec0274:
4884        case 0x10ec0294:
4885                alc_process_coef_fw(codec, coef0274);
4886                break;
4887        case 0x10ec0233:
4888        case 0x10ec0283:
4889                alc_process_coef_fw(codec, coef0233);
4890                break;
4891        case 0x10ec0286:
4892        case 0x10ec0288:
4893        case 0x10ec0298:
4894                alc_process_coef_fw(codec, coef0288);
4895                break;
4896        case 0x10ec0292:
4897                alc_process_coef_fw(codec, coef0292);
4898                break;
4899        case 0x10ec0293:
4900                alc_process_coef_fw(codec, coef0293);
4901                break;
4902        case 0x10ec0668:
4903                alc_process_coef_fw(codec, coef0688);
4904                break;
4905        case 0x10ec0867:
4906                alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
4907                break;
4908        }
4909        codec_dbg(codec, "Headset jack set to headphone (default) mode.\n");
4910}
4911
4912/* Iphone type */
4913static void alc_headset_mode_ctia(struct hda_codec *codec)
4914{
4915        int val;
4916
4917        static const struct coef_fw coef0255[] = {
4918                WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
4919                WRITE_COEF(0x1b, 0x0c2b),
4920                WRITE_COEFEX(0x57, 0x03, 0x8ea6),
4921                {}
4922        };
4923        static const struct coef_fw coef0256[] = {
4924                WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
4925                WRITE_COEF(0x1b, 0x0e6b),
4926                {}
4927        };
4928        static const struct coef_fw coef0233[] = {
4929                WRITE_COEF(0x45, 0xd429),
4930                WRITE_COEF(0x1b, 0x0c2b),
4931                WRITE_COEF(0x32, 0x4ea3),
4932                {}
4933        };
4934        static const struct coef_fw coef0288[] = {
4935                UPDATE_COEF(0x50, 0x2000, 0x2000),
4936                UPDATE_COEF(0x56, 0x0006, 0x0006),
4937                UPDATE_COEF(0x66, 0x0008, 0),
4938                UPDATE_COEF(0x67, 0x2000, 0),
4939                {}
4940        };
4941        static const struct coef_fw coef0292[] = {
4942                WRITE_COEF(0x6b, 0xd429),
4943                WRITE_COEF(0x76, 0x0008),
4944                WRITE_COEF(0x18, 0x7388),
4945                {}
4946        };
4947        static const struct coef_fw coef0293[] = {
4948                WRITE_COEF(0x45, 0xd429), /* Set to ctia type */
4949                UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
4950                {}
4951        };
4952        static const struct coef_fw coef0688[] = {
4953                WRITE_COEF(0x11, 0x0001),
4954                WRITE_COEF(0x15, 0x0d60),
4955                WRITE_COEF(0xc3, 0x0000),
4956                {}
4957        };
4958        static const struct coef_fw coef0225_1[] = {
4959                UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
4960                UPDATE_COEF(0x63, 3<<14, 2<<14),
4961                {}
4962        };
4963        static const struct coef_fw coef0225_2[] = {
4964                UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
4965                UPDATE_COEF(0x63, 3<<14, 1<<14),
4966                {}
4967        };
4968
4969        switch (codec->core.vendor_id) {
4970        case 0x10ec0255:
4971                alc_process_coef_fw(codec, coef0255);
4972                break;
4973        case 0x10ec0236:
4974        case 0x10ec0256:
4975                alc_process_coef_fw(codec, coef0256);
4976                break;
4977        case 0x10ec0234:
4978        case 0x10ec0274:
4979        case 0x10ec0294:
4980                alc_write_coef_idx(codec, 0x45, 0xd689);
4981                break;
4982        case 0x10ec0233:
4983        case 0x10ec0283:
4984                alc_process_coef_fw(codec, coef0233);
4985                break;
4986        case 0x10ec0298:
4987                val = alc_read_coef_idx(codec, 0x50);
4988                if (val & (1 << 12)) {
4989                        alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
4990                        alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
4991                        msleep(300);
4992                } else {
4993                        alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
4994                        alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
4995                        msleep(300);
4996                }
4997                break;
4998        case 0x10ec0286:
4999        case 0x10ec0288:
5000                alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5001                msleep(300);
5002                alc_process_coef_fw(codec, coef0288);
5003                break;
5004        case 0x10ec0292:
5005                alc_process_coef_fw(codec, coef0292);
5006                break;
5007        case 0x10ec0293:
5008                alc_process_coef_fw(codec, coef0293);
5009                break;
5010        case 0x10ec0668:
5011                alc_process_coef_fw(codec, coef0688);
5012                break;
5013        case 0x10ec0215:
5014        case 0x10ec0225:
5015        case 0x10ec0285:
5016        case 0x10ec0295:
5017        case 0x10ec0289:
5018        case 0x10ec0299:
5019                val = alc_read_coef_idx(codec, 0x45);
5020                if (val & (1 << 9))
5021                        alc_process_coef_fw(codec, coef0225_2);
5022                else
5023                        alc_process_coef_fw(codec, coef0225_1);
5024                break;
5025        case 0x10ec0867:
5026                alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5027                break;
5028        }
5029        codec_dbg(codec, "Headset jack set to iPhone-style headset mode.\n");
5030}
5031
5032/* Nokia type */
5033static void alc_headset_mode_omtp(struct hda_codec *codec)
5034{
5035        static const struct coef_fw coef0255[] = {
5036                WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
5037                WRITE_COEF(0x1b, 0x0c2b),
5038                WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5039                {}
5040        };
5041        static const struct coef_fw coef0256[] = {
5042                WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
5043                WRITE_COEF(0x1b, 0x0e6b),
5044                {}
5045        };
5046        static const struct coef_fw coef0233[] = {
5047                WRITE_COEF(0x45, 0xe429),
5048                WRITE_COEF(0x1b, 0x0c2b),
5049                WRITE_COEF(0x32, 0x4ea3),
5050                {}
5051        };
5052        static const struct coef_fw coef0288[] = {
5053                UPDATE_COEF(0x50, 0x2000, 0x2000),
5054                UPDATE_COEF(0x56, 0x0006, 0x0006),
5055                UPDATE_COEF(0x66, 0x0008, 0),
5056                UPDATE_COEF(0x67, 0x2000, 0),
5057                {}
5058        };
5059        static const struct coef_fw coef0292[] = {
5060                WRITE_COEF(0x6b, 0xe429),
5061                WRITE_COEF(0x76, 0x0008),
5062                WRITE_COEF(0x18, 0x7388),
5063                {}
5064        };
5065        static const struct coef_fw coef0293[] = {
5066                WRITE_COEF(0x45, 0xe429), /* Set to omtp type */
5067                UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
5068                {}
5069        };
5070        static const struct coef_fw coef0688[] = {
5071                WRITE_COEF(0x11, 0x0001),
5072                WRITE_COEF(0x15, 0x0d50),
5073                WRITE_COEF(0xc3, 0x0000),
5074                {}
5075        };
5076        static const struct coef_fw coef0225[] = {
5077                UPDATE_COEF(0x45, 0x3f<<10, 0x39<<10),
5078                UPDATE_COEF(0x63, 3<<14, 2<<14),
5079                {}
5080        };
5081
5082        switch (codec->core.vendor_id) {
5083        case 0x10ec0255:
5084                alc_process_coef_fw(codec, coef0255);
5085                break;
5086        case 0x10ec0236:
5087        case 0x10ec0256:
5088                alc_process_coef_fw(codec, coef0256);
5089                break;
5090        case 0x10ec0234:
5091        case 0x10ec0274:
5092        case 0x10ec0294:
5093                alc_write_coef_idx(codec, 0x45, 0xe689);
5094                break;
5095        case 0x10ec0233:
5096        case 0x10ec0283:
5097                alc_process_coef_fw(codec, coef0233);
5098                break;
5099        case 0x10ec0298:
5100                alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);/* Headset output enable */
5101                alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5102                msleep(300);
5103                break;
5104        case 0x10ec0286:
5105        case 0x10ec0288:
5106                alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5107                msleep(300);
5108                alc_process_coef_fw(codec, coef0288);
5109                break;
5110        case 0x10ec0292:
5111                alc_process_coef_fw(codec, coef0292);
5112                break;
5113        case 0x10ec0293:
5114                alc_process_coef_fw(codec, coef0293);
5115                break;
5116        case 0x10ec0668:
5117                alc_process_coef_fw(codec, coef0688);
5118                break;
5119        case 0x10ec0215:
5120        case 0x10ec0225:
5121        case 0x10ec0285:
5122        case 0x10ec0295:
5123        case 0x10ec0289:
5124        case 0x10ec0299:
5125                alc_process_coef_fw(codec, coef0225);
5126                break;
5127        }
5128        codec_dbg(codec, "Headset jack set to Nokia-style headset mode.\n");
5129}
5130
5131static void alc_determine_headset_type(struct hda_codec *codec)
5132{
5133        int val;
5134        bool is_ctia = false;
5135        struct alc_spec *spec = codec->spec;
5136        static const struct coef_fw coef0255[] = {
5137                WRITE_COEF(0x45, 0xd089), /* combo jack auto switch control(Check type)*/
5138                WRITE_COEF(0x49, 0x0149), /* combo jack auto switch control(Vref
5139 conteol) */
5140                {}
5141        };
5142        static const struct coef_fw coef0288[] = {
5143                UPDATE_COEF(0x4f, 0xfcc0, 0xd400), /* Check Type */
5144                {}
5145        };
5146        static const struct coef_fw coef0298[] = {
5147                UPDATE_COEF(0x50, 0x2000, 0x2000),
5148                UPDATE_COEF(0x56, 0x0006, 0x0006),
5149                UPDATE_COEF(0x66, 0x0008, 0),
5150                UPDATE_COEF(0x67, 0x2000, 0),
5151                UPDATE_COEF(0x19, 0x1300, 0x1300),
5152                {}
5153        };
5154        static const struct coef_fw coef0293[] = {
5155                UPDATE_COEF(0x4a, 0x000f, 0x0008), /* Combo Jack auto detect */
5156                WRITE_COEF(0x45, 0xD429), /* Set to ctia type */
5157                {}
5158        };
5159        static const struct coef_fw coef0688[] = {
5160                WRITE_COEF(0x11, 0x0001),
5161                WRITE_COEF(0xb7, 0x802b),
5162                WRITE_COEF(0x15, 0x0d60),
5163                WRITE_COEF(0xc3, 0x0c00),
5164                {}
5165        };
5166        static const struct coef_fw coef0274[] = {
5167                UPDATE_COEF(0x4a, 0x0010, 0),
5168                UPDATE_COEF(0x4a, 0x8000, 0),
5169                WRITE_COEF(0x45, 0xd289),
5170                UPDATE_COEF(0x49, 0x0300, 0x0300),
5171                {}
5172        };
5173
5174        if (spec->no_internal_mic_pin) {
5175                alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
5176                return;
5177        }
5178
5179        switch (codec->core.vendor_id) {
5180        case 0x10ec0255:
5181                alc_process_coef_fw(codec, coef0255);
5182                msleep(300);
5183                val = alc_read_coef_idx(codec, 0x46);
5184                is_ctia = (val & 0x0070) == 0x0070;
5185                break;
5186        case 0x10ec0236:
5187        case 0x10ec0256:
5188                alc_write_coef_idx(codec, 0x1b, 0x0e4b);
5189                alc_write_coef_idx(codec, 0x06, 0x6104);
5190                alc_write_coefex_idx(codec, 0x57, 0x3, 0x09a3);
5191
5192                snd_hda_codec_write(codec, 0x21, 0,
5193                            AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5194                msleep(80);
5195                snd_hda_codec_write(codec, 0x21, 0,
5196                            AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5197
5198                alc_process_coef_fw(codec, coef0255);
5199                msleep(300);
5200                val = alc_read_coef_idx(codec, 0x46);
5201                is_ctia = (val & 0x0070) == 0x0070;
5202
5203                alc_write_coefex_idx(codec, 0x57, 0x3, 0x0da3);
5204                alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5205
5206                snd_hda_codec_write(codec, 0x21, 0,
5207                            AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5208                msleep(80);
5209                snd_hda_codec_write(codec, 0x21, 0,
5210                            AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5211                break;
5212        case 0x10ec0234:
5213        case 0x10ec0274:
5214        case 0x10ec0294:
5215                alc_process_coef_fw(codec, coef0274);
5216                msleep(80);
5217                val = alc_read_coef_idx(codec, 0x46);
5218                is_ctia = (val & 0x00f0) == 0x00f0;
5219                break;
5220        case 0x10ec0233:
5221        case 0x10ec0283:
5222                alc_write_coef_idx(codec, 0x45, 0xd029);
5223                msleep(300);
5224                val = alc_read_coef_idx(codec, 0x46);
5225                is_ctia = (val & 0x0070) == 0x0070;
5226                break;
5227        case 0x10ec0298:
5228                snd_hda_codec_write(codec, 0x21, 0,
5229                            AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5230                msleep(100);
5231                snd_hda_codec_write(codec, 0x21, 0,
5232                            AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5233                msleep(200);
5234
5235                val = alc_read_coef_idx(codec, 0x50);
5236                if (val & (1 << 12)) {
5237                        alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
5238                        alc_process_coef_fw(codec, coef0288);
5239                        msleep(350);
5240                        val = alc_read_coef_idx(codec, 0x50);
5241                        is_ctia = (val & 0x0070) == 0x0070;
5242                } else {
5243                        alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
5244                        alc_process_coef_fw(codec, coef0288);
5245                        msleep(350);
5246                        val = alc_read_coef_idx(codec, 0x50);
5247                        is_ctia = (val & 0x0070) == 0x0070;
5248                }
5249                alc_process_coef_fw(codec, coef0298);
5250                snd_hda_codec_write(codec, 0x21, 0,
5251                            AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP);
5252                msleep(75);
5253                snd_hda_codec_write(codec, 0x21, 0,
5254                            AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5255                break;
5256        case 0x10ec0286:
5257        case 0x10ec0288:
5258                alc_process_coef_fw(codec, coef0288);
5259                msleep(350);
5260                val = alc_read_coef_idx(codec, 0x50);
5261                is_ctia = (val & 0x0070) == 0x0070;
5262                break;
5263        case 0x10ec0292:
5264                alc_write_coef_idx(codec, 0x6b, 0xd429);
5265                msleep(300);
5266                val = alc_read_coef_idx(codec, 0x6c);
5267                is_ctia = (val & 0x001c) == 0x001c;
5268                break;
5269        case 0x10ec0293:
5270                alc_process_coef_fw(codec, coef0293);
5271                msleep(300);
5272                val = alc_read_coef_idx(codec, 0x46);
5273                is_ctia = (val & 0x0070) == 0x0070;
5274                break;
5275        case 0x10ec0668:
5276                alc_process_coef_fw(codec, coef0688);
5277                msleep(300);
5278                val = alc_read_coef_idx(codec, 0xbe);
5279                is_ctia = (val & 0x1c02) == 0x1c02;
5280                break;
5281        case 0x10ec0215:
5282        case 0x10ec0225:
5283        case 0x10ec0285:
5284        case 0x10ec0295:
5285        case 0x10ec0289:
5286        case 0x10ec0299:
5287                snd_hda_codec_write(codec, 0x21, 0,
5288                            AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5289                msleep(80);
5290                snd_hda_codec_write(codec, 0x21, 0,
5291                            AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5292
5293                alc_process_coef_fw(codec, alc225_pre_hsmode);
5294                alc_update_coef_idx(codec, 0x67, 0xf000, 0x1000);
5295                val = alc_read_coef_idx(codec, 0x45);
5296                if (val & (1 << 9)) {
5297                        alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5298                        alc_update_coef_idx(codec, 0x49, 3<<8, 2<<8);
5299                        msleep(800);
5300                        val = alc_read_coef_idx(codec, 0x46);
5301                        is_ctia = (val & 0x00f0) == 0x00f0;
5302                } else {
5303                        alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5304                        alc_update_coef_idx(codec, 0x49, 3<<8, 1<<8);
5305                        msleep(800);
5306                        val = alc_read_coef_idx(codec, 0x46);
5307                        is_ctia = (val & 0x00f0) == 0x00f0;
5308                }
5309                alc_update_coef_idx(codec, 0x4a, 7<<6, 7<<6);
5310                alc_update_coef_idx(codec, 0x4a, 3<<4, 3<<4);
5311                alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
5312
5313                snd_hda_codec_write(codec, 0x21, 0,
5314                            AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5315                msleep(80);
5316                snd_hda_codec_write(codec, 0x21, 0,
5317                            AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5318                break;
5319        case 0x10ec0867:
5320                is_ctia = true;
5321                break;
5322        }
5323
5324        codec_dbg(codec, "Headset jack detected iPhone-style headset: %s\n",
5325                    is_ctia ? "yes" : "no");
5326        spec->current_headset_type = is_ctia ? ALC_HEADSET_TYPE_CTIA : ALC_HEADSET_TYPE_OMTP;
5327}
5328
5329static void alc_update_headset_mode(struct hda_codec *codec)
5330{
5331        struct alc_spec *spec = codec->spec;
5332
5333        hda_nid_t mux_pin = spec->gen.imux_pins[spec->gen.cur_mux[0]];
5334        hda_nid_t hp_pin = alc_get_hp_pin(spec);
5335
5336        int new_headset_mode;
5337
5338        if (!snd_hda_jack_detect(codec, hp_pin))
5339                new_headset_mode = ALC_HEADSET_MODE_UNPLUGGED;
5340        else if (mux_pin == spec->headset_mic_pin)
5341                new_headset_mode = ALC_HEADSET_MODE_HEADSET;
5342        else if (mux_pin == spec->headphone_mic_pin)
5343                new_headset_mode = ALC_HEADSET_MODE_MIC;
5344        else
5345                new_headset_mode = ALC_HEADSET_MODE_HEADPHONE;
5346
5347        if (new_headset_mode == spec->current_headset_mode) {
5348                snd_hda_gen_update_outputs(codec);
5349                return;
5350        }
5351
5352        switch (new_headset_mode) {
5353        case ALC_HEADSET_MODE_UNPLUGGED:
5354                alc_headset_mode_unplugged(codec);
5355                spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5356                spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
5357                spec->gen.hp_jack_present = false;
5358                break;
5359        case ALC_HEADSET_MODE_HEADSET:
5360                if (spec->current_headset_type == ALC_HEADSET_TYPE_UNKNOWN)
5361                        alc_determine_headset_type(codec);
5362                if (spec->current_headset_type == ALC_HEADSET_TYPE_CTIA)
5363                        alc_headset_mode_ctia(codec);
5364                else if (spec->current_headset_type == ALC_HEADSET_TYPE_OMTP)
5365                        alc_headset_mode_omtp(codec);
5366                spec->gen.hp_jack_present = true;
5367                break;
5368        case ALC_HEADSET_MODE_MIC:
5369                alc_headset_mode_mic_in(codec, hp_pin, spec->headphone_mic_pin);
5370                spec->gen.hp_jack_present = false;
5371                break;
5372        case ALC_HEADSET_MODE_HEADPHONE:
5373                alc_headset_mode_default(codec);
5374                spec->gen.hp_jack_present = true;
5375                break;
5376        }
5377        if (new_headset_mode != ALC_HEADSET_MODE_MIC) {
5378                snd_hda_set_pin_ctl_cache(codec, hp_pin,
5379                                          AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
5380                if (spec->headphone_mic_pin && spec->headphone_mic_pin != hp_pin)
5381                        snd_hda_set_pin_ctl_cache(codec, spec->headphone_mic_pin,
5382                                                  PIN_VREFHIZ);
5383        }
5384        spec->current_headset_mode = new_headset_mode;
5385
5386        snd_hda_gen_update_outputs(codec);
5387}
5388
5389static void alc_update_headset_mode_hook(struct hda_codec *codec,
5390                                         struct snd_kcontrol *kcontrol,
5391                                         struct snd_ctl_elem_value *ucontrol)
5392{
5393        alc_update_headset_mode(codec);
5394}
5395
5396static void alc_update_headset_jack_cb(struct hda_codec *codec,
5397                                       struct hda_jack_callback *jack)
5398{
5399        snd_hda_gen_hp_automute(codec, jack);
5400}
5401
5402static void alc_probe_headset_mode(struct hda_codec *codec)
5403{
5404        int i;
5405        struct alc_spec *spec = codec->spec;
5406        struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5407
5408        /* Find mic pins */
5409        for (i = 0; i < cfg->num_inputs; i++) {
5410                if (cfg->inputs[i].is_headset_mic && !spec->headset_mic_pin)
5411                        spec->headset_mic_pin = cfg->inputs[i].pin;
5412                if (cfg->inputs[i].is_headphone_mic && !spec->headphone_mic_pin)
5413                        spec->headphone_mic_pin = cfg->inputs[i].pin;
5414        }
5415
5416        WARN_ON(spec->gen.cap_sync_hook);
5417        spec->gen.cap_sync_hook = alc_update_headset_mode_hook;
5418        spec->gen.automute_hook = alc_update_headset_mode;
5419        spec->gen.hp_automute_hook = alc_update_headset_jack_cb;
5420}
5421
5422static void alc_fixup_headset_mode(struct hda_codec *codec,
5423                                const struct hda_fixup *fix, int action)
5424{
5425        struct alc_spec *spec = codec->spec;
5426
5427        switch (action) {
5428        case HDA_FIXUP_ACT_PRE_PROBE:
5429                spec->parse_flags |= HDA_PINCFG_HEADSET_MIC | HDA_PINCFG_HEADPHONE_MIC;
5430                break;
5431        case HDA_FIXUP_ACT_PROBE:
5432                alc_probe_headset_mode(codec);
5433                break;
5434        case HDA_FIXUP_ACT_INIT:
5435                if (is_s3_resume(codec) || is_s4_resume(codec)) {
5436                        spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5437                        spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
5438                }
5439                alc_update_headset_mode(codec);
5440                break;
5441        }
5442}
5443
5444static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
5445                                const struct hda_fixup *fix, int action)
5446{
5447        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5448                struct alc_spec *spec = codec->spec;
5449                spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5450        }
5451        else
5452                alc_fixup_headset_mode(codec, fix, action);
5453}
5454
5455static void alc255_set_default_jack_type(struct hda_codec *codec)
5456{
5457        /* Set to iphone type */
5458        static const struct coef_fw alc255fw[] = {
5459                WRITE_COEF(0x1b, 0x880b),
5460                WRITE_COEF(0x45, 0xd089),
5461                WRITE_COEF(0x1b, 0x080b),
5462                WRITE_COEF(0x46, 0x0004),
5463                WRITE_COEF(0x1b, 0x0c0b),
5464                {}
5465        };
5466        static const struct coef_fw alc256fw[] = {
5467                WRITE_COEF(0x1b, 0x884b),
5468                WRITE_COEF(0x45, 0xd089),
5469                WRITE_COEF(0x1b, 0x084b),
5470                WRITE_COEF(0x46, 0x0004),
5471                WRITE_COEF(0x1b, 0x0c4b),
5472                {}
5473        };
5474        switch (codec->core.vendor_id) {
5475        case 0x10ec0255:
5476                alc_process_coef_fw(codec, alc255fw);
5477                break;
5478        case 0x10ec0236:
5479        case 0x10ec0256:
5480                alc_process_coef_fw(codec, alc256fw);
5481                break;
5482        }
5483        msleep(30);
5484}
5485
5486static void alc_fixup_headset_mode_alc255(struct hda_codec *codec,
5487                                const struct hda_fixup *fix, int action)
5488{
5489        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5490                alc255_set_default_jack_type(codec);
5491        }
5492        alc_fixup_headset_mode(codec, fix, action);
5493}
5494
5495static void alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec,
5496                                const struct hda_fixup *fix, int action)
5497{
5498        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5499                struct alc_spec *spec = codec->spec;
5500                spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5501                alc255_set_default_jack_type(codec);
5502        } 
5503        else
5504                alc_fixup_headset_mode(codec, fix, action);
5505}
5506
5507static void alc288_update_headset_jack_cb(struct hda_codec *codec,
5508                                       struct hda_jack_callback *jack)
5509{
5510        struct alc_spec *spec = codec->spec;
5511
5512        alc_update_headset_jack_cb(codec, jack);
5513        /* Headset Mic enable or disable, only for Dell Dino */
5514        alc_update_gpio_data(codec, 0x40, spec->gen.hp_jack_present);
5515}
5516
5517static void alc_fixup_headset_mode_dell_alc288(struct hda_codec *codec,
5518                                const struct hda_fixup *fix, int action)
5519{
5520        alc_fixup_headset_mode(codec, fix, action);
5521        if (action == HDA_FIXUP_ACT_PROBE) {
5522                struct alc_spec *spec = codec->spec;
5523                /* toggled via hp_automute_hook */
5524                spec->gpio_mask |= 0x40;
5525                spec->gpio_dir |= 0x40;
5526                spec->gen.hp_automute_hook = alc288_update_headset_jack_cb;
5527        }
5528}
5529
5530static void alc_fixup_auto_mute_via_amp(struct hda_codec *codec,
5531                                        const struct hda_fixup *fix, int action)
5532{
5533        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5534                struct alc_spec *spec = codec->spec;
5535                spec->gen.auto_mute_via_amp = 1;
5536        }
5537}
5538
5539static void alc_fixup_no_shutup(struct hda_codec *codec,
5540                                const struct hda_fixup *fix, int action)
5541{
5542        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5543                struct alc_spec *spec = codec->spec;
5544                spec->no_shutup_pins = 1;
5545        }
5546}
5547
5548static void alc_fixup_disable_aamix(struct hda_codec *codec,
5549                                    const struct hda_fixup *fix, int action)
5550{
5551        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5552                struct alc_spec *spec = codec->spec;
5553                /* Disable AA-loopback as it causes white noise */
5554                spec->gen.mixer_nid = 0;
5555        }
5556}
5557
5558/* fixup for Thinkpad docks: add dock pins, avoid HP parser fixup */
5559static void alc_fixup_tpt440_dock(struct hda_codec *codec,
5560                                  const struct hda_fixup *fix, int action)
5561{
5562        static const struct hda_pintbl pincfgs[] = {
5563                { 0x16, 0x21211010 }, /* dock headphone */
5564                { 0x19, 0x21a11010 }, /* dock mic */
5565                { }
5566        };
5567        struct alc_spec *spec = codec->spec;
5568
5569        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5570                spec->reboot_notify = snd_hda_gen_reboot_notify; /* reduce noise */
5571                spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
5572                codec->power_save_node = 0; /* avoid click noises */
5573                snd_hda_apply_pincfgs(codec, pincfgs);
5574        }
5575}
5576
5577static void alc_fixup_tpt470_dock(struct hda_codec *codec,
5578                                  const struct hda_fixup *fix, int action)
5579{
5580        static const struct hda_pintbl pincfgs[] = {
5581                { 0x17, 0x21211010 }, /* dock headphone */
5582                { 0x19, 0x21a11010 }, /* dock mic */
5583                { }
5584        };
5585        struct alc_spec *spec = codec->spec;
5586
5587        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5588                spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
5589                snd_hda_apply_pincfgs(codec, pincfgs);
5590        } else if (action == HDA_FIXUP_ACT_INIT) {
5591                /* Enable DOCK device */
5592                snd_hda_codec_write(codec, 0x17, 0,
5593                            AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
5594                /* Enable DOCK device */
5595                snd_hda_codec_write(codec, 0x19, 0,
5596                            AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
5597        }
5598}
5599
5600static void alc_fixup_tpt470_dacs(struct hda_codec *codec,
5601                                  const struct hda_fixup *fix, int action)
5602{
5603        /* Assure the speaker pin to be coupled with DAC NID 0x03; otherwise
5604         * the speaker output becomes too low by some reason on Thinkpads with
5605         * ALC298 codec
5606         */
5607        static const hda_nid_t preferred_pairs[] = {
5608                0x14, 0x03, 0x17, 0x02, 0x21, 0x02,
5609                0
5610        };
5611        struct alc_spec *spec = codec->spec;
5612
5613        if (action == HDA_FIXUP_ACT_PRE_PROBE)
5614                spec->gen.preferred_dacs = preferred_pairs;
5615}
5616
5617static void alc_shutup_dell_xps13(struct hda_codec *codec)
5618{
5619        struct alc_spec *spec = codec->spec;
5620        int hp_pin = alc_get_hp_pin(spec);
5621
5622        /* Prevent pop noises when headphones are plugged in */
5623        snd_hda_codec_write(codec, hp_pin, 0,
5624                            AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5625        msleep(20);
5626}
5627
5628static void alc_fixup_dell_xps13(struct hda_codec *codec,
5629                                const struct hda_fixup *fix, int action)
5630{
5631        struct alc_spec *spec = codec->spec;
5632        struct hda_input_mux *imux = &spec->gen.input_mux;
5633        int i;
5634
5635        switch (action) {
5636        case HDA_FIXUP_ACT_PRE_PROBE:
5637                /* mic pin 0x19 must be initialized with Vref Hi-Z, otherwise
5638                 * it causes a click noise at start up
5639                 */
5640                snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
5641                spec->shutup = alc_shutup_dell_xps13;
5642                break;
5643        case HDA_FIXUP_ACT_PROBE:
5644                /* Make the internal mic the default input source. */
5645                for (i = 0; i < imux->num_items; i++) {
5646                        if (spec->gen.imux_pins[i] == 0x12) {
5647                                spec->gen.cur_mux[0] = i;
5648                                break;
5649                        }
5650                }
5651                break;
5652        }
5653}
5654
5655static void alc_fixup_headset_mode_alc662(struct hda_codec *codec,
5656                                const struct hda_fixup *fix, int action)
5657{
5658        struct alc_spec *spec = codec->spec;
5659
5660        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5661                spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5662                spec->gen.hp_mic = 1; /* Mic-in is same pin as headphone */
5663
5664                /* Disable boost for mic-in permanently. (This code is only called
5665                   from quirks that guarantee that the headphone is at NID 0x1b.) */
5666                snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000);
5667                snd_hda_override_wcaps(codec, 0x1b, get_wcaps(codec, 0x1b) & ~AC_WCAP_IN_AMP);
5668        } else
5669                alc_fixup_headset_mode(codec, fix, action);
5670}
5671
5672static void alc_fixup_headset_mode_alc668(struct hda_codec *codec,
5673                                const struct hda_fixup *fix, int action)
5674{
5675        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5676                alc_write_coef_idx(codec, 0xc4, 0x8000);
5677                alc_update_coef_idx(codec, 0xc2, ~0xfe, 0);
5678                snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
5679        }
5680        alc_fixup_headset_mode(codec, fix, action);
5681}
5682
5683/* Returns the nid of the external mic input pin, or 0 if it cannot be found. */
5684static int find_ext_mic_pin(struct hda_codec *codec)
5685{
5686        struct alc_spec *spec = codec->spec;
5687        struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5688        hda_nid_t nid;
5689        unsigned int defcfg;
5690        int i;
5691
5692        for (i = 0; i < cfg->num_inputs; i++) {
5693                if (cfg->inputs[i].type != AUTO_PIN_MIC)
5694                        continue;
5695                nid = cfg->inputs[i].pin;
5696                defcfg = snd_hda_codec_get_pincfg(codec, nid);
5697                if (snd_hda_get_input_pin_attr(defcfg) == INPUT_PIN_ATTR_INT)
5698                        continue;
5699                return nid;
5700        }
5701
5702        return 0;
5703}
5704
5705static void alc271_hp_gate_mic_jack(struct hda_codec *codec,
5706                                    const struct hda_fixup *fix,
5707                                    int action)
5708{
5709        struct alc_spec *spec = codec->spec;
5710
5711        if (action == HDA_FIXUP_ACT_PROBE) {
5712                int mic_pin = find_ext_mic_pin(codec);
5713                int hp_pin = alc_get_hp_pin(spec);
5714
5715                if (snd_BUG_ON(!mic_pin || !hp_pin))
5716                        return;
5717                snd_hda_jack_set_gating_jack(codec, mic_pin, hp_pin);
5718        }
5719}
5720
5721static void alc269_fixup_limit_int_mic_boost(struct hda_codec *codec,
5722                                             const struct hda_fixup *fix,
5723                                             int action)
5724{
5725        struct alc_spec *spec = codec->spec;
5726        struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5727        int i;
5728
5729        /* The mic boosts on level 2 and 3 are too noisy
5730           on the internal mic input.
5731           Therefore limit the boost to 0 or 1. */
5732
5733        if (action != HDA_FIXUP_ACT_PROBE)
5734                return;
5735
5736        for (i = 0; i < cfg->num_inputs; i++) {
5737                hda_nid_t nid = cfg->inputs[i].pin;
5738                unsigned int defcfg;
5739                if (cfg->inputs[i].type != AUTO_PIN_MIC)
5740                        continue;
5741                defcfg = snd_hda_codec_get_pincfg(codec, nid);
5742                if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
5743                        continue;
5744
5745                snd_hda_override_amp_caps(codec, nid, HDA_INPUT,
5746                                          (0x00 << AC_AMPCAP_OFFSET_SHIFT) |
5747                                          (0x01 << AC_AMPCAP_NUM_STEPS_SHIFT) |
5748                                          (0x2f << AC_AMPCAP_STEP_SIZE_SHIFT) |
5749                                          (0 << AC_AMPCAP_MUTE_SHIFT));
5750        }
5751}
5752
5753static void alc283_hp_automute_hook(struct hda_codec *codec,
5754                                    struct hda_jack_callback *jack)
5755{
5756        struct alc_spec *spec = codec->spec;
5757        int vref;
5758
5759        msleep(200);
5760        snd_hda_gen_hp_automute(codec, jack);
5761
5762        vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
5763
5764        msleep(600);
5765        snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5766                            vref);
5767}
5768
5769static void alc283_fixup_chromebook(struct hda_codec *codec,
5770                                    const struct hda_fixup *fix, int action)
5771{
5772        struct alc_spec *spec = codec->spec;
5773
5774        switch (action) {
5775        case HDA_FIXUP_ACT_PRE_PROBE:
5776                snd_hda_override_wcaps(codec, 0x03, 0);
5777                /* Disable AA-loopback as it causes white noise */
5778                spec->gen.mixer_nid = 0;
5779                break;
5780        case HDA_FIXUP_ACT_INIT:
5781                /* MIC2-VREF control */
5782                /* Set to manual mode */
5783                alc_update_coef_idx(codec, 0x06, 0x000c, 0);
5784                /* Enable Line1 input control by verb */
5785                alc_update_coef_idx(codec, 0x1a, 0, 1 << 4);
5786                break;
5787        }
5788}
5789
5790static void alc283_fixup_sense_combo_jack(struct hda_codec *codec,
5791                                    const struct hda_fixup *fix, int action)
5792{
5793        struct alc_spec *spec = codec->spec;
5794
5795        switch (action) {
5796        case HDA_FIXUP_ACT_PRE_PROBE:
5797                spec->gen.hp_automute_hook = alc283_hp_automute_hook;
5798                break;
5799        case HDA_FIXUP_ACT_INIT:
5800                /* MIC2-VREF control */
5801                /* Set to manual mode */
5802                alc_update_coef_idx(codec, 0x06, 0x000c, 0);
5803                break;
5804        }
5805}
5806
5807/* mute tablet speaker pin (0x14) via dock plugging in addition */
5808static void asus_tx300_automute(struct hda_codec *codec)
5809{
5810        struct alc_spec *spec = codec->spec;
5811        snd_hda_gen_update_outputs(codec);
5812        if (snd_hda_jack_detect(codec, 0x1b))
5813                spec->gen.mute_bits |= (1ULL << 0x14);
5814}
5815
5816static void alc282_fixup_asus_tx300(struct hda_codec *codec,
5817                                    const struct hda_fixup *fix, int action)
5818{
5819        struct alc_spec *spec = codec->spec;
5820        static const struct hda_pintbl dock_pins[] = {
5821                { 0x1b, 0x21114000 }, /* dock speaker pin */
5822                {}
5823        };
5824
5825        switch (action) {
5826        case HDA_FIXUP_ACT_PRE_PROBE:
5827                spec->init_amp = ALC_INIT_DEFAULT;
5828                /* TX300 needs to set up GPIO2 for the speaker amp */
5829                alc_setup_gpio(codec, 0x04);
5830                snd_hda_apply_pincfgs(codec, dock_pins);
5831                spec->gen.auto_mute_via_amp = 1;
5832                spec->gen.automute_hook = asus_tx300_automute;
5833                snd_hda_jack_detect_enable_callback(codec, 0x1b,
5834                                                    snd_hda_gen_hp_automute);
5835                break;
5836        case HDA_FIXUP_ACT_PROBE:
5837                spec->init_amp = ALC_INIT_DEFAULT;
5838                break;
5839        case HDA_FIXUP_ACT_BUILD:
5840                /* this is a bit tricky; give more sane names for the main
5841                 * (tablet) speaker and the dock speaker, respectively
5842                 */
5843                rename_ctl(codec, "Speaker Playback Switch",
5844                           "Dock Speaker Playback Switch");
5845                rename_ctl(codec, "Bass Speaker Playback Switch",
5846                           "Speaker Playback Switch");
5847                break;
5848        }
5849}
5850
5851static void alc290_fixup_mono_speakers(struct hda_codec *codec,
5852                                       const struct hda_fixup *fix, int action)
5853{
5854        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5855                /* DAC node 0x03 is giving mono output. We therefore want to
5856                   make sure 0x14 (front speaker) and 0x15 (headphones) use the
5857                   stereo DAC, while leaving 0x17 (bass speaker) for node 0x03. */
5858                static const hda_nid_t conn1[] = { 0x0c };
5859                snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
5860                snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
5861        }
5862}
5863
5864static void alc298_fixup_speaker_volume(struct hda_codec *codec,
5865                                        const struct hda_fixup *fix, int action)
5866{
5867        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5868                /* The speaker is routed to the Node 0x06 by a mistake, as a result
5869                   we can't adjust the speaker's volume since this node does not has
5870                   Amp-out capability. we change the speaker's route to:
5871                   Node 0x02 (Audio Output) -> Node 0x0c (Audio Mixer) -> Node 0x17 (
5872                   Pin Complex), since Node 0x02 has Amp-out caps, we can adjust
5873                   speaker's volume now. */
5874
5875                static const hda_nid_t conn1[] = { 0x0c };
5876                snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn1), conn1);
5877        }
5878}
5879
5880/* disable DAC3 (0x06) selection on NID 0x17 as it has no volume amp control */
5881static void alc295_fixup_disable_dac3(struct hda_codec *codec,
5882                                      const struct hda_fixup *fix, int action)
5883{
5884        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5885                static const hda_nid_t conn[] = { 0x02, 0x03 };
5886                snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
5887        }
5888}
5889
5890/* force NID 0x17 (Bass Speaker) to DAC1 to share it with the main speaker */
5891static void alc285_fixup_speaker2_to_dac1(struct hda_codec *codec,
5892                                          const struct hda_fixup *fix, int action)
5893{
5894        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5895                static const hda_nid_t conn[] = { 0x02 };
5896                snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
5897        }
5898}
5899
5900/* Hook to update amp GPIO4 for automute */
5901static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec,
5902                                          struct hda_jack_callback *jack)
5903{
5904        struct alc_spec *spec = codec->spec;
5905
5906        snd_hda_gen_hp_automute(codec, jack);
5907        /* mute_led_polarity is set to 0, so we pass inverted value here */
5908        alc_update_gpio_led(codec, 0x10, spec->mute_led_polarity,
5909                            !spec->gen.hp_jack_present);
5910}
5911
5912/* Manage GPIOs for HP EliteBook Folio 9480m.
5913 *
5914 * GPIO4 is the headphone amplifier power control
5915 * GPIO3 is the audio output mute indicator LED
5916 */
5917
5918static void alc280_fixup_hp_9480m(struct hda_codec *codec,
5919                                  const struct hda_fixup *fix,
5920                                  int action)
5921{
5922        struct alc_spec *spec = codec->spec;
5923
5924        alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
5925        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5926                /* amp at GPIO4; toggled via alc280_hp_gpio4_automute_hook() */
5927                spec->gpio_mask |= 0x10;
5928                spec->gpio_dir |= 0x10;
5929                spec->gen.hp_automute_hook = alc280_hp_gpio4_automute_hook;
5930        }
5931}
5932
5933static void alc275_fixup_gpio4_off(struct hda_codec *codec,
5934                                   const struct hda_fixup *fix,
5935                                   int action)
5936{
5937        struct alc_spec *spec = codec->spec;
5938
5939        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5940                spec->gpio_mask |= 0x04;
5941                spec->gpio_dir |= 0x04;
5942                /* set data bit low */
5943        }
5944}
5945
5946/* Quirk for Thinkpad X1 7th and 8th Gen
5947 * The following fixed routing needed
5948 * DAC1 (NID 0x02) -> Speaker (NID 0x14); some eq applied secretly
5949 * DAC2 (NID 0x03) -> Bass (NID 0x17) & Headphone (NID 0x21); sharing a DAC
5950 * DAC3 (NID 0x06) -> Unused, due to the lack of volume amp
5951 */
5952static void alc285_fixup_thinkpad_x1_gen7(struct hda_codec *codec,
5953                                          const struct hda_fixup *fix, int action)
5954{
5955        static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */
5956        static const hda_nid_t preferred_pairs[] = {
5957                0x14, 0x02, 0x17, 0x03, 0x21, 0x03, 0
5958        };
5959        struct alc_spec *spec = codec->spec;
5960
5961        switch (action) {
5962        case HDA_FIXUP_ACT_PRE_PROBE:
5963                snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
5964                spec->gen.preferred_dacs = preferred_pairs;
5965                break;
5966        case HDA_FIXUP_ACT_BUILD:
5967                /* The generic parser creates somewhat unintuitive volume ctls
5968                 * with the fixed routing above, and the shared DAC2 may be
5969                 * confusing for PA.
5970                 * Rename those to unique names so that PA doesn't touch them
5971                 * and use only Master volume.
5972                 */
5973                rename_ctl(codec, "Front Playback Volume", "DAC1 Playback Volume");
5974                rename_ctl(codec, "Bass Speaker Playback Volume", "DAC2 Playback Volume");
5975                break;
5976        }
5977}
5978
5979static void alc233_alc662_fixup_lenovo_dual_codecs(struct hda_codec *codec,
5980                                         const struct hda_fixup *fix,
5981                                         int action)
5982{
5983        alc_fixup_dual_codecs(codec, fix, action);
5984        switch (action) {
5985        case HDA_FIXUP_ACT_PRE_PROBE:
5986                /* override card longname to provide a unique UCM profile */
5987                strcpy(codec->card->longname, "HDAudio-Lenovo-DualCodecs");
5988                break;
5989        case HDA_FIXUP_ACT_BUILD:
5990                /* rename Capture controls depending on the codec */
5991                rename_ctl(codec, "Capture Volume",
5992                           codec->addr == 0 ?
5993                           "Rear-Panel Capture Volume" :
5994                           "Front-Panel Capture Volume");
5995                rename_ctl(codec, "Capture Switch",
5996                           codec->addr == 0 ?
5997                           "Rear-Panel Capture Switch" :
5998                           "Front-Panel Capture Switch");
5999                break;
6000        }
6001}
6002
6003static void alc225_fixup_s3_pop_noise(struct hda_codec *codec,
6004                                      const struct hda_fixup *fix, int action)
6005{
6006        if (action != HDA_FIXUP_ACT_PRE_PROBE)
6007                return;
6008
6009        codec->power_save_node = 1;
6010}
6011
6012/* Forcibly assign NID 0x03 to HP/LO while NID 0x02 to SPK for EQ */
6013static void alc274_fixup_bind_dacs(struct hda_codec *codec,
6014                                    const struct hda_fixup *fix, int action)
6015{
6016        struct alc_spec *spec = codec->spec;
6017        static const hda_nid_t preferred_pairs[] = {
6018                0x21, 0x03, 0x1b, 0x03, 0x16, 0x02,
6019                0
6020        };
6021
6022        if (action != HDA_FIXUP_ACT_PRE_PROBE)
6023                return;
6024
6025        spec->gen.preferred_dacs = preferred_pairs;
6026        spec->gen.auto_mute_via_amp = 1;
6027        codec->power_save_node = 0;
6028}
6029
6030/* avoid DAC 0x06 for bass speaker 0x17; it has no volume control */
6031static void alc289_fixup_asus_ga401(struct hda_codec *codec,
6032                                    const struct hda_fixup *fix, int action)
6033{
6034        static const hda_nid_t preferred_pairs[] = {
6035                0x14, 0x02, 0x17, 0x02, 0x21, 0x03, 0
6036        };
6037        struct alc_spec *spec = codec->spec;
6038
6039        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6040                spec->gen.preferred_dacs = preferred_pairs;
6041                spec->gen.obey_preferred_dacs = 1;
6042        }
6043}
6044
6045/* The DAC of NID 0x3 will introduce click/pop noise on headphones, so invalidate it */
6046static void alc285_fixup_invalidate_dacs(struct hda_codec *codec,
6047                              const struct hda_fixup *fix, int action)
6048{
6049        if (action != HDA_FIXUP_ACT_PRE_PROBE)
6050                return;
6051
6052        snd_hda_override_wcaps(codec, 0x03, 0);
6053}
6054
6055static void alc_combo_jack_hp_jd_restart(struct hda_codec *codec)
6056{
6057        switch (codec->core.vendor_id) {
6058        case 0x10ec0274:
6059        case 0x10ec0294:
6060        case 0x10ec0225:
6061        case 0x10ec0295:
6062        case 0x10ec0299:
6063                alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15); /* Reset HP JD */
6064                alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15);
6065                break;
6066        case 0x10ec0235:
6067        case 0x10ec0236:
6068        case 0x10ec0255:
6069        case 0x10ec0256:
6070                alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15); /* Reset HP JD */
6071                alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15);
6072                break;
6073        }
6074}
6075
6076static void alc295_fixup_chromebook(struct hda_codec *codec,
6077                                    const struct hda_fixup *fix, int action)
6078{
6079        struct alc_spec *spec = codec->spec;
6080
6081        switch (action) {
6082        case HDA_FIXUP_ACT_PRE_PROBE:
6083                spec->ultra_low_power = true;
6084                break;
6085        case HDA_FIXUP_ACT_INIT:
6086                alc_combo_jack_hp_jd_restart(codec);
6087                break;
6088        }
6089}
6090
6091static void alc_fixup_disable_mic_vref(struct hda_codec *codec,
6092                                  const struct hda_fixup *fix, int action)
6093{
6094        if (action == HDA_FIXUP_ACT_PRE_PROBE)
6095                snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
6096}
6097
6098
6099static void alc294_gx502_toggle_output(struct hda_codec *codec,
6100                                        struct hda_jack_callback *cb)
6101{
6102        /* The Windows driver sets the codec up in a very different way where
6103         * it appears to leave 0x10 = 0x8a20 set. For Linux we need to toggle it
6104         */
6105        if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
6106                alc_write_coef_idx(codec, 0x10, 0x8a20);
6107        else
6108                alc_write_coef_idx(codec, 0x10, 0x0a20);
6109}
6110
6111static void alc294_fixup_gx502_hp(struct hda_codec *codec,
6112                                        const struct hda_fixup *fix, int action)
6113{
6114        /* Pin 0x21: headphones/headset mic */
6115        if (!is_jack_detectable(codec, 0x21))
6116                return;
6117
6118        switch (action) {
6119        case HDA_FIXUP_ACT_PRE_PROBE:
6120                snd_hda_jack_detect_enable_callback(codec, 0x21,
6121                                alc294_gx502_toggle_output);
6122                break;
6123        case HDA_FIXUP_ACT_INIT:
6124                /* Make sure to start in a correct state, i.e. if
6125                 * headphones have been plugged in before powering up the system
6126                 */
6127                alc294_gx502_toggle_output(codec, NULL);
6128                break;
6129        }
6130}
6131
6132static void  alc285_fixup_hp_gpio_amp_init(struct hda_codec *codec,
6133                              const struct hda_fixup *fix, int action)
6134{
6135        if (action != HDA_FIXUP_ACT_INIT)
6136                return;
6137
6138        msleep(100);
6139        alc_write_coef_idx(codec, 0x65, 0x0);
6140}
6141
6142static void alc274_fixup_hp_headset_mic(struct hda_codec *codec,
6143                                    const struct hda_fixup *fix, int action)
6144{
6145        switch (action) {
6146        case HDA_FIXUP_ACT_INIT:
6147                alc_combo_jack_hp_jd_restart(codec);
6148                break;
6149        }
6150}
6151
6152static void alc_fixup_no_int_mic(struct hda_codec *codec,
6153                                    const struct hda_fixup *fix, int action)
6154{
6155        struct alc_spec *spec = codec->spec;
6156
6157        switch (action) {
6158        case HDA_FIXUP_ACT_PRE_PROBE:
6159                /* Mic RING SLEEVE swap for combo jack */
6160                alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
6161                spec->no_internal_mic_pin = true;
6162                break;
6163        case HDA_FIXUP_ACT_INIT:
6164                alc_combo_jack_hp_jd_restart(codec);
6165                break;
6166        }
6167}
6168
6169/* for hda_fixup_thinkpad_acpi() */
6170#include "thinkpad_helper.c"
6171
6172static void alc_fixup_thinkpad_acpi(struct hda_codec *codec,
6173                                    const struct hda_fixup *fix, int action)
6174{
6175        alc_fixup_no_shutup(codec, fix, action); /* reduce click noise */
6176        hda_fixup_thinkpad_acpi(codec, fix, action);
6177}
6178
6179/* for alc295_fixup_hp_top_speakers */
6180#include "hp_x360_helper.c"
6181
6182enum {
6183        ALC269_FIXUP_GPIO2,
6184        ALC269_FIXUP_SONY_VAIO,
6185        ALC275_FIXUP_SONY_VAIO_GPIO2,
6186        ALC269_FIXUP_DELL_M101Z,
6187        ALC269_FIXUP_SKU_IGNORE,
6188        ALC269_FIXUP_ASUS_G73JW,
6189        ALC269_FIXUP_LENOVO_EAPD,
6190        ALC275_FIXUP_SONY_HWEQ,
6191        ALC275_FIXUP_SONY_DISABLE_AAMIX,
6192        ALC271_FIXUP_DMIC,
6193        ALC269_FIXUP_PCM_44K,
6194        ALC269_FIXUP_STEREO_DMIC,
6195        ALC269_FIXUP_HEADSET_MIC,
6196        ALC269_FIXUP_QUANTA_MUTE,
6197        ALC269_FIXUP_LIFEBOOK,
6198        ALC269_FIXUP_LIFEBOOK_EXTMIC,
6199        ALC269_FIXUP_LIFEBOOK_HP_PIN,
6200        ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT,
6201        ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC,
6202        ALC269_FIXUP_AMIC,
6203        ALC269_FIXUP_DMIC,
6204        ALC269VB_FIXUP_AMIC,
6205        ALC269VB_FIXUP_DMIC,
6206        ALC269_FIXUP_HP_MUTE_LED,
6207        ALC269_FIXUP_HP_MUTE_LED_MIC1,
6208        ALC269_FIXUP_HP_MUTE_LED_MIC2,
6209        ALC269_FIXUP_HP_MUTE_LED_MIC3,
6210        ALC269_FIXUP_HP_GPIO_LED,
6211        ALC269_FIXUP_HP_GPIO_MIC1_LED,
6212        ALC269_FIXUP_HP_LINE1_MIC1_LED,
6213        ALC269_FIXUP_INV_DMIC,
6214        ALC269_FIXUP_LENOVO_DOCK,
6215        ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST,
6216        ALC269_FIXUP_NO_SHUTUP,
6217        ALC286_FIXUP_SONY_MIC_NO_PRESENCE,
6218        ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
6219        ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
6220        ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
6221        ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
6222        ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
6223        ALC269_FIXUP_HEADSET_MODE,
6224        ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
6225        ALC269_FIXUP_ASPIRE_HEADSET_MIC,
6226        ALC269_FIXUP_ASUS_X101_FUNC,
6227        ALC269_FIXUP_ASUS_X101_VERB,
6228        ALC269_FIXUP_ASUS_X101,
6229        ALC271_FIXUP_AMIC_MIC2,
6230        ALC271_FIXUP_HP_GATE_MIC_JACK,
6231        ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572,
6232        ALC269_FIXUP_ACER_AC700,
6233        ALC269_FIXUP_LIMIT_INT_MIC_BOOST,
6234        ALC269VB_FIXUP_ASUS_ZENBOOK,
6235        ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A,
6236        ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED,
6237        ALC269VB_FIXUP_ORDISSIMO_EVE2,
6238        ALC283_FIXUP_CHROME_BOOK,
6239        ALC283_FIXUP_SENSE_COMBO_JACK,
6240        ALC282_FIXUP_ASUS_TX300,
6241        ALC283_FIXUP_INT_MIC,
6242        ALC290_FIXUP_MONO_SPEAKERS,
6243        ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
6244        ALC290_FIXUP_SUBWOOFER,
6245        ALC290_FIXUP_SUBWOOFER_HSJACK,
6246        ALC269_FIXUP_THINKPAD_ACPI,
6247        ALC269_FIXUP_DMIC_THINKPAD_ACPI,
6248        ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
6249        ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
6250        ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6251        ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
6252        ALC255_FIXUP_HEADSET_MODE,
6253        ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,
6254        ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
6255        ALC292_FIXUP_TPT440_DOCK,
6256        ALC292_FIXUP_TPT440,
6257        ALC283_FIXUP_HEADSET_MIC,
6258        ALC255_FIXUP_MIC_MUTE_LED,
6259        ALC282_FIXUP_ASPIRE_V5_PINS,
6260        ALC280_FIXUP_HP_GPIO4,
6261        ALC286_FIXUP_HP_GPIO_LED,
6262        ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY,
6263        ALC280_FIXUP_HP_DOCK_PINS,
6264        ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED,
6265        ALC280_FIXUP_HP_9480M,
6266        ALC288_FIXUP_DELL_HEADSET_MODE,
6267        ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
6268        ALC288_FIXUP_DELL_XPS_13,
6269        ALC288_FIXUP_DISABLE_AAMIX,
6270        ALC292_FIXUP_DELL_E7X_AAMIX,
6271        ALC292_FIXUP_DELL_E7X,
6272        ALC292_FIXUP_DISABLE_AAMIX,
6273        ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK,
6274        ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
6275        ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
6276        ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
6277        ALC275_FIXUP_DELL_XPS,
6278        ALC293_FIXUP_LENOVO_SPK_NOISE,
6279        ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
6280        ALC255_FIXUP_DELL_SPK_NOISE,
6281        ALC225_FIXUP_DISABLE_MIC_VREF,
6282        ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
6283        ALC295_FIXUP_DISABLE_DAC3,
6284        ALC285_FIXUP_SPEAKER2_TO_DAC1,
6285        ALC280_FIXUP_HP_HEADSET_MIC,
6286        ALC221_FIXUP_HP_FRONT_MIC,
6287        ALC292_FIXUP_TPT460,
6288        ALC298_FIXUP_SPK_VOLUME,
6289        ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER,
6290        ALC269_FIXUP_ATIV_BOOK_8,
6291        ALC221_FIXUP_HP_MIC_NO_PRESENCE,
6292        ALC256_FIXUP_ASUS_HEADSET_MODE,
6293        ALC256_FIXUP_ASUS_MIC,
6294        ALC256_FIXUP_ASUS_AIO_GPIO2,
6295        ALC233_FIXUP_ASUS_MIC_NO_PRESENCE,
6296        ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE,
6297        ALC233_FIXUP_LENOVO_MULTI_CODECS,
6298        ALC233_FIXUP_ACER_HEADSET_MIC,
6299        ALC294_FIXUP_LENOVO_MIC_LOCATION,
6300        ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE,
6301        ALC225_FIXUP_S3_POP_NOISE,
6302        ALC700_FIXUP_INTEL_REFERENCE,
6303        ALC274_FIXUP_DELL_BIND_DACS,
6304        ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
6305        ALC298_FIXUP_TPT470_DOCK_FIX,
6306        ALC298_FIXUP_TPT470_DOCK,
6307        ALC255_FIXUP_DUMMY_LINEOUT_VERB,
6308        ALC255_FIXUP_DELL_HEADSET_MIC,
6309        ALC256_FIXUP_HUAWEI_MACH_WX9_PINS,
6310        ALC298_FIXUP_HUAWEI_MBX_STEREO,
6311        ALC295_FIXUP_HP_X360,
6312        ALC221_FIXUP_HP_HEADSET_MIC,
6313        ALC285_FIXUP_LENOVO_HEADPHONE_NOISE,
6314        ALC295_FIXUP_HP_AUTO_MUTE,
6315        ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
6316        ALC294_FIXUP_ASUS_MIC,
6317        ALC294_FIXUP_ASUS_HEADSET_MIC,
6318        ALC294_FIXUP_ASUS_SPK,
6319        ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
6320        ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
6321        ALC255_FIXUP_ACER_HEADSET_MIC,
6322        ALC295_FIXUP_CHROME_BOOK,
6323        ALC225_FIXUP_HEADSET_JACK,
6324        ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE,
6325        ALC225_FIXUP_WYSE_AUTO_MUTE,
6326        ALC225_FIXUP_WYSE_DISABLE_MIC_VREF,
6327        ALC286_FIXUP_ACER_AIO_HEADSET_MIC,
6328        ALC256_FIXUP_ASUS_HEADSET_MIC,
6329        ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
6330        ALC299_FIXUP_PREDATOR_SPK,
6331        ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE,
6332        ALC289_FIXUP_DELL_SPK2,
6333        ALC289_FIXUP_DUAL_SPK,
6334        ALC294_FIXUP_SPK2_TO_DAC1,
6335        ALC294_FIXUP_ASUS_DUAL_SPK,
6336        ALC285_FIXUP_THINKPAD_X1_GEN7,
6337        ALC285_FIXUP_THINKPAD_HEADSET_JACK,
6338        ALC294_FIXUP_ASUS_HPE,
6339        ALC294_FIXUP_ASUS_COEF_1B,
6340        ALC294_FIXUP_ASUS_GX502_HP,
6341        ALC294_FIXUP_ASUS_GX502_PINS,
6342        ALC294_FIXUP_ASUS_GX502_VERBS,
6343        ALC285_FIXUP_HP_GPIO_LED,
6344        ALC285_FIXUP_HP_MUTE_LED,
6345        ALC236_FIXUP_HP_MUTE_LED,
6346        ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
6347        ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
6348        ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS,
6349        ALC269VC_FIXUP_ACER_HEADSET_MIC,
6350        ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE,
6351        ALC289_FIXUP_ASUS_GA401,
6352        ALC289_FIXUP_ASUS_GA502,
6353        ALC256_FIXUP_ACER_MIC_NO_PRESENCE,
6354        ALC285_FIXUP_HP_GPIO_AMP_INIT,
6355        ALC269_FIXUP_CZC_B20,
6356        ALC269_FIXUP_CZC_TMI,
6357        ALC269_FIXUP_CZC_L101,
6358        ALC269_FIXUP_LEMOTE_A1802,
6359        ALC269_FIXUP_LEMOTE_A190X,
6360        ALC256_FIXUP_INTEL_NUC8_RUGGED,
6361        ALC255_FIXUP_XIAOMI_HEADSET_MIC,
6362        ALC274_FIXUP_HP_MIC,
6363        ALC274_FIXUP_HP_HEADSET_MIC,
6364        ALC256_FIXUP_ASUS_HPE,
6365        ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
6366        ALC287_FIXUP_HP_GPIO_LED,
6367        ALC256_FIXUP_HP_HEADSET_MIC,
6368        ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
6369};
6370
6371static const struct hda_fixup alc269_fixups[] = {
6372        [ALC269_FIXUP_GPIO2] = {
6373                .type = HDA_FIXUP_FUNC,
6374                .v.func = alc_fixup_gpio2,
6375        },
6376        [ALC269_FIXUP_SONY_VAIO] = {
6377                .type = HDA_FIXUP_PINCTLS,
6378                .v.pins = (const struct hda_pintbl[]) {
6379                        {0x19, PIN_VREFGRD},
6380                        {}
6381                }
6382        },
6383        [ALC275_FIXUP_SONY_VAIO_GPIO2] = {
6384                .type = HDA_FIXUP_FUNC,
6385                .v.func = alc275_fixup_gpio4_off,
6386                .chained = true,
6387                .chain_id = ALC269_FIXUP_SONY_VAIO
6388        },
6389        [ALC269_FIXUP_DELL_M101Z] = {
6390                .type = HDA_FIXUP_VERBS,
6391                .v.verbs = (const struct hda_verb[]) {
6392                        /* Enables internal speaker */
6393                        {0x20, AC_VERB_SET_COEF_INDEX, 13},
6394                        {0x20, AC_VERB_SET_PROC_COEF, 0x4040},
6395                        {}
6396                }
6397        },
6398        [ALC269_FIXUP_SKU_IGNORE] = {
6399                .type = HDA_FIXUP_FUNC,
6400                .v.func = alc_fixup_sku_ignore,
6401        },
6402        [ALC269_FIXUP_ASUS_G73JW] = {
6403                .type = HDA_FIXUP_PINS,
6404                .v.pins = (const struct hda_pintbl[]) {
6405                        { 0x17, 0x99130111 }, /* subwoofer */
6406                        { }
6407                }
6408        },
6409        [ALC269_FIXUP_LENOVO_EAPD] = {
6410                .type = HDA_FIXUP_VERBS,
6411                .v.verbs = (const struct hda_verb[]) {
6412                        {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
6413                        {}
6414                }
6415        },
6416        [ALC275_FIXUP_SONY_HWEQ] = {
6417                .type = HDA_FIXUP_FUNC,
6418                .v.func = alc269_fixup_hweq,
6419                .chained = true,
6420                .chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
6421        },
6422        [ALC275_FIXUP_SONY_DISABLE_AAMIX] = {
6423                .type = HDA_FIXUP_FUNC,
6424                .v.func = alc_fixup_disable_aamix,
6425                .chained = true,
6426                .chain_id = ALC269_FIXUP_SONY_VAIO
6427        },
6428        [ALC271_FIXUP_DMIC] = {
6429                .type = HDA_FIXUP_FUNC,
6430                .v.func = alc271_fixup_dmic,
6431        },
6432        [ALC269_FIXUP_PCM_44K] = {
6433                .type = HDA_FIXUP_FUNC,
6434                .v.func = alc269_fixup_pcm_44k,
6435                .chained = true,
6436                .chain_id = ALC269_FIXUP_QUANTA_MUTE
6437        },
6438        [ALC269_FIXUP_STEREO_DMIC] = {
6439                .type = HDA_FIXUP_FUNC,
6440                .v.func = alc269_fixup_stereo_dmic,
6441        },
6442        [ALC269_FIXUP_HEADSET_MIC] = {
6443                .type = HDA_FIXUP_FUNC,
6444                .v.func = alc269_fixup_headset_mic,
6445        },
6446        [ALC269_FIXUP_QUANTA_MUTE] = {
6447                .type = HDA_FIXUP_FUNC,
6448                .v.func = alc269_fixup_quanta_mute,
6449        },
6450        [ALC269_FIXUP_LIFEBOOK] = {
6451                .type = HDA_FIXUP_PINS,
6452                .v.pins = (const struct hda_pintbl[]) {
6453                        { 0x1a, 0x2101103f }, /* dock line-out */
6454                        { 0x1b, 0x23a11040 }, /* dock mic-in */
6455                        { }
6456                },
6457                .chained = true,
6458                .chain_id = ALC269_FIXUP_QUANTA_MUTE
6459        },
6460        [ALC269_FIXUP_LIFEBOOK_EXTMIC] = {
6461                .type = HDA_FIXUP_PINS,
6462                .v.pins = (const struct hda_pintbl[]) {
6463                        { 0x19, 0x01a1903c }, /* headset mic, with jack detect */
6464                        { }
6465                },
6466        },
6467        [ALC269_FIXUP_LIFEBOOK_HP_PIN] = {
6468                .type = HDA_FIXUP_PINS,
6469                .v.pins = (const struct hda_pintbl[]) {
6470                        { 0x21, 0x0221102f }, /* HP out */
6471                        { }
6472                },
6473        },
6474        [ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT] = {
6475                .type = HDA_FIXUP_FUNC,
6476                .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
6477        },
6478        [ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC] = {
6479                .type = HDA_FIXUP_FUNC,
6480                .v.func = alc269_fixup_pincfg_U7x7_headset_mic,
6481        },
6482        [ALC269_FIXUP_AMIC] = {
6483                .type = HDA_FIXUP_PINS,
6484                .v.pins = (const struct hda_pintbl[]) {
6485                        { 0x14, 0x99130110 }, /* speaker */
6486                        { 0x15, 0x0121401f }, /* HP out */
6487                        { 0x18, 0x01a19c20 }, /* mic */
6488                        { 0x19, 0x99a3092f }, /* int-mic */
6489                        { }
6490                },
6491        },
6492        [ALC269_FIXUP_DMIC] = {
6493                .type = HDA_FIXUP_PINS,
6494                .v.pins = (const struct hda_pintbl[]) {
6495                        { 0x12, 0x99a3092f }, /* int-mic */
6496                        { 0x14, 0x99130110 }, /* speaker */
6497                        { 0x15, 0x0121401f }, /* HP out */
6498                        { 0x18, 0x01a19c20 }, /* mic */
6499                        { }
6500                },
6501        },
6502        [ALC269VB_FIXUP_AMIC] = {
6503                .type = HDA_FIXUP_PINS,
6504                .v.pins = (const struct hda_pintbl[]) {
6505                        { 0x14, 0x99130110 }, /* speaker */
6506                        { 0x18, 0x01a19c20 }, /* mic */
6507                        { 0x19, 0x99a3092f }, /* int-mic */
6508                        { 0x21, 0x0121401f }, /* HP out */
6509                        { }
6510                },
6511        },
6512        [ALC269VB_FIXUP_DMIC] = {
6513                .type = HDA_FIXUP_PINS,
6514                .v.pins = (const struct hda_pintbl[]) {
6515                        { 0x12, 0x99a3092f }, /* int-mic */
6516                        { 0x14, 0x99130110 }, /* speaker */
6517                        { 0x18, 0x01a19c20 }, /* mic */
6518                        { 0x21, 0x0121401f }, /* HP out */
6519                        { }
6520                },
6521        },
6522        [ALC269_FIXUP_HP_MUTE_LED] = {
6523                .type = HDA_FIXUP_FUNC,
6524                .v.func = alc269_fixup_hp_mute_led,
6525        },
6526        [ALC269_FIXUP_HP_MUTE_LED_MIC1] = {
6527                .type = HDA_FIXUP_FUNC,
6528                .v.func = alc269_fixup_hp_mute_led_mic1,
6529        },
6530        [ALC269_FIXUP_HP_MUTE_LED_MIC2] = {
6531                .type = HDA_FIXUP_FUNC,
6532                .v.func = alc269_fixup_hp_mute_led_mic2,
6533        },
6534        [ALC269_FIXUP_HP_MUTE_LED_MIC3] = {
6535                .type = HDA_FIXUP_FUNC,
6536                .v.func = alc269_fixup_hp_mute_led_mic3,
6537                .chained = true,
6538                .chain_id = ALC295_FIXUP_HP_AUTO_MUTE
6539        },
6540        [ALC269_FIXUP_HP_GPIO_LED] = {
6541                .type = HDA_FIXUP_FUNC,
6542                .v.func = alc269_fixup_hp_gpio_led,
6543        },
6544        [ALC269_FIXUP_HP_GPIO_MIC1_LED] = {
6545                .type = HDA_FIXUP_FUNC,
6546                .v.func = alc269_fixup_hp_gpio_mic1_led,
6547        },
6548        [ALC269_FIXUP_HP_LINE1_MIC1_LED] = {
6549                .type = HDA_FIXUP_FUNC,
6550                .v.func = alc269_fixup_hp_line1_mic1_led,
6551        },
6552        [ALC269_FIXUP_INV_DMIC] = {
6553                .type = HDA_FIXUP_FUNC,
6554                .v.func = alc_fixup_inv_dmic,
6555        },
6556        [ALC269_FIXUP_NO_SHUTUP] = {
6557                .type = HDA_FIXUP_FUNC,
6558                .v.func = alc_fixup_no_shutup,
6559        },
6560        [ALC269_FIXUP_LENOVO_DOCK] = {
6561                .type = HDA_FIXUP_PINS,
6562                .v.pins = (const struct hda_pintbl[]) {
6563                        { 0x19, 0x23a11040 }, /* dock mic */
6564                        { 0x1b, 0x2121103f }, /* dock headphone */
6565                        { }
6566                },
6567                .chained = true,
6568                .chain_id = ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT
6569        },
6570        [ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST] = {
6571                .type = HDA_FIXUP_FUNC,
6572                .v.func = alc269_fixup_limit_int_mic_boost,
6573                .chained = true,
6574                .chain_id = ALC269_FIXUP_LENOVO_DOCK,
6575        },
6576        [ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT] = {
6577                .type = HDA_FIXUP_FUNC,
6578                .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
6579                .chained = true,
6580                .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
6581        },
6582        [ALC269_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6583                .type = HDA_FIXUP_PINS,
6584                .v.pins = (const struct hda_pintbl[]) {
6585                        { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6586                        { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6587                        { }
6588                },
6589                .chained = true,
6590                .chain_id = ALC269_FIXUP_HEADSET_MODE
6591        },
6592        [ALC269_FIXUP_DELL2_MIC_NO_PRESENCE] = {
6593                .type = HDA_FIXUP_PINS,
6594                .v.pins = (const struct hda_pintbl[]) {
6595                        { 0x16, 0x21014020 }, /* dock line out */
6596                        { 0x19, 0x21a19030 }, /* dock mic */
6597                        { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6598                        { }
6599                },
6600                .chained = true,
6601                .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
6602        },
6603        [ALC269_FIXUP_DELL3_MIC_NO_PRESENCE] = {
6604                .type = HDA_FIXUP_PINS,
6605                .v.pins = (const struct hda_pintbl[]) {
6606                        { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6607                        { }
6608                },
6609                .chained = true,
6610                .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
6611        },
6612        [ALC269_FIXUP_DELL4_MIC_NO_PRESENCE] = {
6613                .type = HDA_FIXUP_PINS,
6614                .v.pins = (const struct hda_pintbl[]) {
6615                        { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6616                        { 0x1b, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6617                        { }
6618                },
6619                .chained = true,
6620                .chain_id = ALC269_FIXUP_HEADSET_MODE
6621        },
6622        [ALC269_FIXUP_HEADSET_MODE] = {
6623                .type = HDA_FIXUP_FUNC,
6624                .v.func = alc_fixup_headset_mode,
6625                .chained = true,
6626                .chain_id = ALC255_FIXUP_MIC_MUTE_LED
6627        },
6628        [ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
6629                .type = HDA_FIXUP_FUNC,
6630                .v.func = alc_fixup_headset_mode_no_hp_mic,
6631        },
6632        [ALC269_FIXUP_ASPIRE_HEADSET_MIC] = {
6633                .type = HDA_FIXUP_PINS,
6634                .v.pins = (const struct hda_pintbl[]) {
6635                        { 0x19, 0x01a1913c }, /* headset mic w/o jack detect */
6636                        { }
6637                },
6638                .chained = true,
6639                .chain_id = ALC269_FIXUP_HEADSET_MODE,
6640        },
6641        [ALC286_FIXUP_SONY_MIC_NO_PRESENCE] = {
6642                .type = HDA_FIXUP_PINS,
6643                .v.pins = (const struct hda_pintbl[]) {
6644                        { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6645                        { }
6646                },
6647                .chained = true,
6648                .chain_id = ALC269_FIXUP_HEADSET_MIC
6649        },
6650        [ALC256_FIXUP_HUAWEI_MACH_WX9_PINS] = {
6651                .type = HDA_FIXUP_PINS,
6652                .v.pins = (const struct hda_pintbl[]) {
6653                        {0x12, 0x90a60130},
6654                        {0x13, 0x40000000},
6655                        {0x14, 0x90170110},
6656                        {0x18, 0x411111f0},
6657                        {0x19, 0x04a11040},
6658                        {0x1a, 0x411111f0},
6659                        {0x1b, 0x90170112},
6660                        {0x1d, 0x40759a05},
6661                        {0x1e, 0x411111f0},
6662                        {0x21, 0x04211020},
6663                        { }
6664                },
6665                .chained = true,
6666                .chain_id = ALC255_FIXUP_MIC_MUTE_LED
6667        },
6668        [ALC298_FIXUP_HUAWEI_MBX_STEREO] = {
6669                .type = HDA_FIXUP_FUNC,
6670                .v.func = alc298_fixup_huawei_mbx_stereo,
6671                .chained = true,
6672                .chain_id = ALC255_FIXUP_MIC_MUTE_LED
6673        },
6674        [ALC269_FIXUP_ASUS_X101_FUNC] = {
6675                .type = HDA_FIXUP_FUNC,
6676                .v.func = alc269_fixup_x101_headset_mic,
6677        },
6678        [ALC269_FIXUP_ASUS_X101_VERB] = {
6679                .type = HDA_FIXUP_VERBS,
6680                .v.verbs = (const struct hda_verb[]) {
6681                        {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6682                        {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
6683                        {0x20, AC_VERB_SET_PROC_COEF,  0x0310},
6684                        { }
6685                },
6686                .chained = true,
6687                .chain_id = ALC269_FIXUP_ASUS_X101_FUNC
6688        },
6689        [ALC269_FIXUP_ASUS_X101] = {
6690                .type = HDA_FIXUP_PINS,
6691                .v.pins = (const struct hda_pintbl[]) {
6692                        { 0x18, 0x04a1182c }, /* Headset mic */
6693                        { }
6694                },
6695                .chained = true,
6696                .chain_id = ALC269_FIXUP_ASUS_X101_VERB
6697        },
6698        [ALC271_FIXUP_AMIC_MIC2] = {
6699                .type = HDA_FIXUP_PINS,
6700                .v.pins = (const struct hda_pintbl[]) {
6701                        { 0x14, 0x99130110 }, /* speaker */
6702                        { 0x19, 0x01a19c20 }, /* mic */
6703                        { 0x1b, 0x99a7012f }, /* int-mic */
6704                        { 0x21, 0x0121401f }, /* HP out */
6705                        { }
6706                },
6707        },
6708        [ALC271_FIXUP_HP_GATE_MIC_JACK] = {
6709                .type = HDA_FIXUP_FUNC,
6710                .v.func = alc271_hp_gate_mic_jack,
6711                .chained = true,
6712                .chain_id = ALC271_FIXUP_AMIC_MIC2,
6713        },
6714        [ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572] = {
6715                .type = HDA_FIXUP_FUNC,
6716                .v.func = alc269_fixup_limit_int_mic_boost,
6717                .chained = true,
6718                .chain_id = ALC271_FIXUP_HP_GATE_MIC_JACK,
6719        },
6720        [ALC269_FIXUP_ACER_AC700] = {
6721                .type = HDA_FIXUP_PINS,
6722                .v.pins = (const struct hda_pintbl[]) {
6723                        { 0x12, 0x99a3092f }, /* int-mic */
6724                        { 0x14, 0x99130110 }, /* speaker */
6725                        { 0x18, 0x03a11c20 }, /* mic */
6726                        { 0x1e, 0x0346101e }, /* SPDIF1 */
6727                        { 0x21, 0x0321101f }, /* HP out */
6728                        { }
6729                },
6730                .chained = true,
6731                .chain_id = ALC271_FIXUP_DMIC,
6732        },
6733        [ALC269_FIXUP_LIMIT_INT_MIC_BOOST] = {
6734                .type = HDA_FIXUP_FUNC,
6735                .v.func = alc269_fixup_limit_int_mic_boost,
6736                .chained = true,
6737                .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
6738        },
6739        [ALC269VB_FIXUP_ASUS_ZENBOOK] = {
6740                .type = HDA_FIXUP_FUNC,
6741                .v.func = alc269_fixup_limit_int_mic_boost,
6742                .chained = true,
6743                .chain_id = ALC269VB_FIXUP_DMIC,
6744        },
6745        [ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A] = {
6746                .type = HDA_FIXUP_VERBS,
6747                .v.verbs = (const struct hda_verb[]) {
6748                        /* class-D output amp +5dB */
6749                        { 0x20, AC_VERB_SET_COEF_INDEX, 0x12 },
6750                        { 0x20, AC_VERB_SET_PROC_COEF, 0x2800 },
6751                        {}
6752                },
6753                .chained = true,
6754                .chain_id = ALC269VB_FIXUP_ASUS_ZENBOOK,
6755        },
6756        [ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED] = {
6757                .type = HDA_FIXUP_FUNC,
6758                .v.func = alc269_fixup_limit_int_mic_boost,
6759                .chained = true,
6760                .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC1,
6761        },
6762        [ALC269VB_FIXUP_ORDISSIMO_EVE2] = {
6763                .type = HDA_FIXUP_PINS,
6764                .v.pins = (const struct hda_pintbl[]) {
6765                        { 0x12, 0x99a3092f }, /* int-mic */
6766                        { 0x18, 0x03a11d20 }, /* mic */
6767                        { 0x19, 0x411111f0 }, /* Unused bogus pin */
6768                        { }
6769                },
6770        },
6771        [ALC283_FIXUP_CHROME_BOOK] = {
6772                .type = HDA_FIXUP_FUNC,
6773                .v.func = alc283_fixup_chromebook,
6774        },
6775        [ALC283_FIXUP_SENSE_COMBO_JACK] = {
6776                .type = HDA_FIXUP_FUNC,
6777                .v.func = alc283_fixup_sense_combo_jack,
6778                .chained = true,
6779                .chain_id = ALC283_FIXUP_CHROME_BOOK,
6780        },
6781        [ALC282_FIXUP_ASUS_TX300] = {
6782                .type = HDA_FIXUP_FUNC,
6783                .v.func = alc282_fixup_asus_tx300,
6784        },
6785        [ALC283_FIXUP_INT_MIC] = {
6786                .type = HDA_FIXUP_VERBS,
6787                .v.verbs = (const struct hda_verb[]) {
6788                        {0x20, AC_VERB_SET_COEF_INDEX, 0x1a},
6789                        {0x20, AC_VERB_SET_PROC_COEF, 0x0011},
6790                        { }
6791                },
6792                .chained = true,
6793                .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
6794        },
6795        [ALC290_FIXUP_SUBWOOFER_HSJACK] = {
6796                .type = HDA_FIXUP_PINS,
6797                .v.pins = (const struct hda_pintbl[]) {
6798                        { 0x17, 0x90170112 }, /* subwoofer */
6799                        { }
6800                },
6801                .chained = true,
6802                .chain_id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
6803        },
6804        [ALC290_FIXUP_SUBWOOFER] = {
6805                .type = HDA_FIXUP_PINS,
6806                .v.pins = (const struct hda_pintbl[]) {
6807                        { 0x17, 0x90170112 }, /* subwoofer */
6808                        { }
6809                },
6810                .chained = true,
6811                .chain_id = ALC290_FIXUP_MONO_SPEAKERS,
6812        },
6813        [ALC290_FIXUP_MONO_SPEAKERS] = {
6814                .type = HDA_FIXUP_FUNC,
6815                .v.func = alc290_fixup_mono_speakers,
6816        },
6817        [ALC290_FIXUP_MONO_SPEAKERS_HSJACK] = {
6818                .type = HDA_FIXUP_FUNC,
6819                .v.func = alc290_fixup_mono_speakers,
6820                .chained = true,
6821                .chain_id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
6822        },
6823        [ALC269_FIXUP_THINKPAD_ACPI] = {
6824                .type = HDA_FIXUP_FUNC,
6825                .v.func = alc_fixup_thinkpad_acpi,
6826                .chained = true,
6827                .chain_id = ALC269_FIXUP_SKU_IGNORE,
6828        },
6829        [ALC269_FIXUP_DMIC_THINKPAD_ACPI] = {
6830                .type = HDA_FIXUP_FUNC,
6831                .v.func = alc_fixup_inv_dmic,
6832                .chained = true,
6833                .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
6834        },
6835        [ALC255_FIXUP_ACER_MIC_NO_PRESENCE] = {
6836                .type = HDA_FIXUP_PINS,
6837                .v.pins = (const struct hda_pintbl[]) {
6838                        { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6839                        { }
6840                },
6841                .chained = true,
6842                .chain_id = ALC255_FIXUP_HEADSET_MODE
6843        },
6844        [ALC255_FIXUP_ASUS_MIC_NO_PRESENCE] = {
6845                .type = HDA_FIXUP_PINS,
6846                .v.pins = (const struct hda_pintbl[]) {
6847                        { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6848                        { }
6849                },
6850                .chained = true,
6851                .chain_id = ALC255_FIXUP_HEADSET_MODE
6852        },
6853        [ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6854                .type = HDA_FIXUP_PINS,
6855                .v.pins = (const struct hda_pintbl[]) {
6856                        { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6857                        { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6858                        { }
6859                },
6860                .chained = true,
6861                .chain_id = ALC255_FIXUP_HEADSET_MODE
6862        },
6863        [ALC255_FIXUP_DELL2_MIC_NO_PRESENCE] = {
6864                .type = HDA_FIXUP_PINS,
6865                .v.pins = (const struct hda_pintbl[]) {
6866                        { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6867                        { }
6868                },
6869                .chained = true,
6870                .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
6871        },
6872        [ALC255_FIXUP_HEADSET_MODE] = {
6873                .type = HDA_FIXUP_FUNC,
6874                .v.func = alc_fixup_headset_mode_alc255,
6875                .chained = true,
6876                .chain_id = ALC255_FIXUP_MIC_MUTE_LED
6877        },
6878        [ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
6879                .type = HDA_FIXUP_FUNC,
6880                .v.func = alc_fixup_headset_mode_alc255_no_hp_mic,
6881        },
6882        [ALC293_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6883                .type = HDA_FIXUP_PINS,
6884                .v.pins = (const struct hda_pintbl[]) {
6885                        { 0x18, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6886                        { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6887                        { }
6888                },
6889                .chained = true,
6890                .chain_id = ALC269_FIXUP_HEADSET_MODE
6891        },
6892        [ALC292_FIXUP_TPT440_DOCK] = {
6893                .type = HDA_FIXUP_FUNC,
6894                .v.func = alc_fixup_tpt440_dock,
6895                .chained = true,
6896                .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
6897        },
6898        [ALC292_FIXUP_TPT440] = {
6899                .type = HDA_FIXUP_FUNC,
6900                .v.func = alc_fixup_disable_aamix,
6901                .chained = true,
6902                .chain_id = ALC292_FIXUP_TPT440_DOCK,
6903        },
6904        [ALC283_FIXUP_HEADSET_MIC] = {
6905                .type = HDA_FIXUP_PINS,
6906                .v.pins = (const struct hda_pintbl[]) {
6907                        { 0x19, 0x04a110f0 },
6908                        { },
6909                },
6910        },
6911        [ALC255_FIXUP_MIC_MUTE_LED] = {
6912                .type = HDA_FIXUP_FUNC,
6913                .v.func = alc_fixup_micmute_led,
6914        },
6915        [ALC282_FIXUP_ASPIRE_V5_PINS] = {
6916                .type = HDA_FIXUP_PINS,
6917                .v.pins = (const struct hda_pintbl[]) {
6918                        { 0x12, 0x90a60130 },
6919                        { 0x14, 0x90170110 },
6920                        { 0x17, 0x40000008 },
6921                        { 0x18, 0x411111f0 },
6922                        { 0x19, 0x01a1913c },
6923                        { 0x1a, 0x411111f0 },
6924                        { 0x1b, 0x411111f0 },
6925                        { 0x1d, 0x40f89b2d },
6926                        { 0x1e, 0x411111f0 },
6927                        { 0x21, 0x0321101f },
6928                        { },
6929                },
6930        },
6931        [ALC280_FIXUP_HP_GPIO4] = {
6932                .type = HDA_FIXUP_FUNC,
6933                .v.func = alc280_fixup_hp_gpio4,
6934        },
6935        [ALC286_FIXUP_HP_GPIO_LED] = {
6936                .type = HDA_FIXUP_FUNC,
6937                .v.func = alc286_fixup_hp_gpio_led,
6938        },
6939        [ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY] = {
6940                .type = HDA_FIXUP_FUNC,
6941                .v.func = alc280_fixup_hp_gpio2_mic_hotkey,
6942        },
6943        [ALC280_FIXUP_HP_DOCK_PINS] = {
6944                .type = HDA_FIXUP_PINS,
6945                .v.pins = (const struct hda_pintbl[]) {
6946                        { 0x1b, 0x21011020 }, /* line-out */
6947                        { 0x1a, 0x01a1903c }, /* headset mic */
6948                        { 0x18, 0x2181103f }, /* line-in */
6949                        { },
6950                },
6951                .chained = true,
6952                .chain_id = ALC280_FIXUP_HP_GPIO4
6953        },
6954        [ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED] = {
6955                .type = HDA_FIXUP_PINS,
6956                .v.pins = (const struct hda_pintbl[]) {
6957                        { 0x1b, 0x21011020 }, /* line-out */
6958                        { 0x18, 0x2181103f }, /* line-in */
6959                        { },
6960                },
6961                .chained = true,
6962                .chain_id = ALC269_FIXUP_HP_GPIO_MIC1_LED
6963        },
6964        [ALC280_FIXUP_HP_9480M] = {
6965                .type = HDA_FIXUP_FUNC,
6966                .v.func = alc280_fixup_hp_9480m,
6967        },
6968        [ALC288_FIXUP_DELL_HEADSET_MODE] = {
6969                .type = HDA_FIXUP_FUNC,
6970                .v.func = alc_fixup_headset_mode_dell_alc288,
6971                .chained = true,
6972                .chain_id = ALC255_FIXUP_MIC_MUTE_LED
6973        },
6974        [ALC288_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6975                .type = HDA_FIXUP_PINS,
6976                .v.pins = (const struct hda_pintbl[]) {
6977                        { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6978                        { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6979                        { }
6980                },
6981                .chained = true,
6982                .chain_id = ALC288_FIXUP_DELL_HEADSET_MODE
6983        },
6984        [ALC288_FIXUP_DISABLE_AAMIX] = {
6985                .type = HDA_FIXUP_FUNC,
6986                .v.func = alc_fixup_disable_aamix,
6987                .chained = true,
6988                .chain_id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE
6989        },
6990        [ALC288_FIXUP_DELL_XPS_13] = {
6991                .type = HDA_FIXUP_FUNC,
6992                .v.func = alc_fixup_dell_xps13,
6993                .chained = true,
6994                .chain_id = ALC288_FIXUP_DISABLE_AAMIX
6995        },
6996        [ALC292_FIXUP_DISABLE_AAMIX] = {
6997                .type = HDA_FIXUP_FUNC,
6998                .v.func = alc_fixup_disable_aamix,
6999                .chained = true,
7000                .chain_id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE
7001        },
7002        [ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK] = {
7003                .type = HDA_FIXUP_FUNC,
7004                .v.func = alc_fixup_disable_aamix,
7005                .chained = true,
7006                .chain_id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE
7007        },
7008        [ALC292_FIXUP_DELL_E7X_AAMIX] = {
7009                .type = HDA_FIXUP_FUNC,
7010                .v.func = alc_fixup_dell_xps13,
7011                .chained = true,
7012                .chain_id = ALC292_FIXUP_DISABLE_AAMIX
7013        },
7014        [ALC292_FIXUP_DELL_E7X] = {
7015                .type = HDA_FIXUP_FUNC,
7016                .v.func = alc_fixup_micmute_led,
7017                /* micmute fixup must be applied at last */
7018                .chained_before = true,
7019                .chain_id = ALC292_FIXUP_DELL_E7X_AAMIX,
7020        },
7021        [ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE] = {
7022                .type = HDA_FIXUP_PINS,
7023                .v.pins = (const struct hda_pintbl[]) {
7024                        { 0x18, 0x01a1913c }, /* headset mic w/o jack detect */
7025                        { }
7026                },
7027                .chained_before = true,
7028                .chain_id = ALC269_FIXUP_HEADSET_MODE,
7029        },
7030        [ALC298_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7031                .type = HDA_FIXUP_PINS,
7032                .v.pins = (const struct hda_pintbl[]) {
7033                        { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7034                        { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7035                        { }
7036                },
7037                .chained = true,
7038                .chain_id = ALC269_FIXUP_HEADSET_MODE
7039        },
7040        [ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE] = {
7041                .type = HDA_FIXUP_PINS,
7042                .v.pins = (const struct hda_pintbl[]) {
7043                        { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7044                        { }
7045                },
7046                .chained = true,
7047                .chain_id = ALC269_FIXUP_HEADSET_MODE
7048        },
7049        [ALC275_FIXUP_DELL_XPS] = {
7050                .type = HDA_FIXUP_VERBS,
7051                .v.verbs = (const struct hda_verb[]) {
7052                        /* Enables internal speaker */
7053                        {0x20, AC_VERB_SET_COEF_INDEX, 0x1f},
7054                        {0x20, AC_VERB_SET_PROC_COEF, 0x00c0},
7055                        {0x20, AC_VERB_SET_COEF_INDEX, 0x30},
7056                        {0x20, AC_VERB_SET_PROC_COEF, 0x00b1},
7057                        {}
7058                }
7059        },
7060        [ALC293_FIXUP_LENOVO_SPK_NOISE] = {
7061                .type = HDA_FIXUP_FUNC,
7062                .v.func = alc_fixup_disable_aamix,
7063                .chained = true,
7064                .chain_id = ALC269_FIXUP_THINKPAD_ACPI
7065        },
7066        [ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY] = {
7067                .type = HDA_FIXUP_FUNC,
7068                .v.func = alc233_fixup_lenovo_line2_mic_hotkey,
7069        },
7070        [ALC255_FIXUP_DELL_SPK_NOISE] = {
7071                .type = HDA_FIXUP_FUNC,
7072                .v.func = alc_fixup_disable_aamix,
7073                .chained = true,
7074                .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
7075        },
7076        [ALC225_FIXUP_DISABLE_MIC_VREF] = {
7077                .type = HDA_FIXUP_FUNC,
7078                .v.func = alc_fixup_disable_mic_vref,
7079                .chained = true,
7080                .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
7081        },
7082        [ALC225_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7083                .type = HDA_FIXUP_VERBS,
7084                .v.verbs = (const struct hda_verb[]) {
7085                        /* Disable pass-through path for FRONT 14h */
7086                        { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
7087                        { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
7088                        {}
7089                },
7090                .chained = true,
7091                .chain_id = ALC225_FIXUP_DISABLE_MIC_VREF
7092        },
7093        [ALC280_FIXUP_HP_HEADSET_MIC] = {
7094                .type = HDA_FIXUP_FUNC,
7095                .v.func = alc_fixup_disable_aamix,
7096                .chained = true,
7097                .chain_id = ALC269_FIXUP_HEADSET_MIC,
7098        },
7099        [ALC221_FIXUP_HP_FRONT_MIC] = {
7100                .type = HDA_FIXUP_PINS,
7101                .v.pins = (const struct hda_pintbl[]) {
7102                        { 0x19, 0x02a19020 }, /* Front Mic */
7103                        { }
7104                },
7105        },
7106        [ALC292_FIXUP_TPT460] = {
7107                .type = HDA_FIXUP_FUNC,
7108                .v.func = alc_fixup_tpt440_dock,
7109                .chained = true,
7110                .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE,
7111        },
7112        [ALC298_FIXUP_SPK_VOLUME] = {
7113                .type = HDA_FIXUP_FUNC,
7114                .v.func = alc298_fixup_speaker_volume,
7115                .chained = true,
7116                .chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
7117        },
7118        [ALC295_FIXUP_DISABLE_DAC3] = {
7119                .type = HDA_FIXUP_FUNC,
7120                .v.func = alc295_fixup_disable_dac3,
7121        },
7122        [ALC285_FIXUP_SPEAKER2_TO_DAC1] = {
7123                .type = HDA_FIXUP_FUNC,
7124                .v.func = alc285_fixup_speaker2_to_dac1,
7125                .chained = true,
7126                .chain_id = ALC269_FIXUP_THINKPAD_ACPI
7127        },
7128        [ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {
7129                .type = HDA_FIXUP_PINS,
7130                .v.pins = (const struct hda_pintbl[]) {
7131                        { 0x1b, 0x90170151 },
7132                        { }
7133                },
7134                .chained = true,
7135                .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
7136        },
7137        [ALC269_FIXUP_ATIV_BOOK_8] = {
7138                .type = HDA_FIXUP_FUNC,
7139                .v.func = alc_fixup_auto_mute_via_amp,
7140                .chained = true,
7141                .chain_id = ALC269_FIXUP_NO_SHUTUP
7142        },
7143        [ALC221_FIXUP_HP_MIC_NO_PRESENCE] = {
7144                .type = HDA_FIXUP_PINS,
7145                .v.pins = (const struct hda_pintbl[]) {
7146                        { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7147                        { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7148                        { }
7149                },
7150                .chained = true,
7151                .chain_id = ALC269_FIXUP_HEADSET_MODE
7152        },
7153        [ALC256_FIXUP_ASUS_HEADSET_MODE] = {
7154                .type = HDA_FIXUP_FUNC,
7155                .v.func = alc_fixup_headset_mode,
7156        },
7157        [ALC256_FIXUP_ASUS_MIC] = {
7158                .type = HDA_FIXUP_PINS,
7159                .v.pins = (const struct hda_pintbl[]) {
7160                        { 0x13, 0x90a60160 }, /* use as internal mic */
7161                        { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
7162                        { }
7163                },
7164                .chained = true,
7165                .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7166        },
7167        [ALC256_FIXUP_ASUS_AIO_GPIO2] = {
7168                .type = HDA_FIXUP_FUNC,
7169                /* Set up GPIO2 for the speaker amp */
7170                .v.func = alc_fixup_gpio4,
7171        },
7172        [ALC233_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7173                .type = HDA_FIXUP_PINS,
7174                .v.pins = (const struct hda_pintbl[]) {
7175                        { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7176                        { }
7177                },
7178                .chained = true,
7179                .chain_id = ALC269_FIXUP_HEADSET_MIC
7180        },
7181        [ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE] = {
7182                .type = HDA_FIXUP_VERBS,
7183                .v.verbs = (const struct hda_verb[]) {
7184                        /* Enables internal speaker */
7185                        {0x20, AC_VERB_SET_COEF_INDEX, 0x40},
7186                        {0x20, AC_VERB_SET_PROC_COEF, 0x8800},
7187                        {}
7188                },
7189                .chained = true,
7190                .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
7191        },
7192        [ALC233_FIXUP_LENOVO_MULTI_CODECS] = {
7193                .type = HDA_FIXUP_FUNC,
7194                .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
7195                .chained = true,
7196                .chain_id = ALC269_FIXUP_GPIO2
7197        },
7198        [ALC233_FIXUP_ACER_HEADSET_MIC] = {
7199                .type = HDA_FIXUP_VERBS,
7200                .v.verbs = (const struct hda_verb[]) {
7201                        { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
7202                        { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
7203                        { }
7204                },
7205                .chained = true,
7206                .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
7207        },
7208        [ALC294_FIXUP_LENOVO_MIC_LOCATION] = {
7209                .type = HDA_FIXUP_PINS,
7210                .v.pins = (const struct hda_pintbl[]) {
7211                        /* Change the mic location from front to right, otherwise there are
7212                           two front mics with the same name, pulseaudio can't handle them.
7213                           This is just a temporary workaround, after applying this fixup,
7214                           there will be one "Front Mic" and one "Mic" in this machine.
7215                         */
7216                        { 0x1a, 0x04a19040 },
7217                        { }
7218                },
7219        },
7220        [ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE] = {
7221                .type = HDA_FIXUP_PINS,
7222                .v.pins = (const struct hda_pintbl[]) {
7223                        { 0x16, 0x0101102f }, /* Rear Headset HP */
7224                        { 0x19, 0x02a1913c }, /* use as Front headset mic, without its own jack detect */
7225                        { 0x1a, 0x01a19030 }, /* Rear Headset MIC */
7226                        { 0x1b, 0x02011020 },
7227                        { }
7228                },
7229                .chained = true,
7230                .chain_id = ALC225_FIXUP_S3_POP_NOISE
7231        },
7232        [ALC225_FIXUP_S3_POP_NOISE] = {
7233                .type = HDA_FIXUP_FUNC,
7234                .v.func = alc225_fixup_s3_pop_noise,
7235                .chained = true,
7236                .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7237        },
7238        [ALC700_FIXUP_INTEL_REFERENCE] = {
7239                .type = HDA_FIXUP_VERBS,
7240                .v.verbs = (const struct hda_verb[]) {
7241                        /* Enables internal speaker */
7242                        {0x20, AC_VERB_SET_COEF_INDEX, 0x45},
7243                        {0x20, AC_VERB_SET_PROC_COEF, 0x5289},
7244                        {0x20, AC_VERB_SET_COEF_INDEX, 0x4A},
7245                        {0x20, AC_VERB_SET_PROC_COEF, 0x001b},
7246                        {0x58, AC_VERB_SET_COEF_INDEX, 0x00},
7247                        {0x58, AC_VERB_SET_PROC_COEF, 0x3888},
7248                        {0x20, AC_VERB_SET_COEF_INDEX, 0x6f},
7249                        {0x20, AC_VERB_SET_PROC_COEF, 0x2c0b},
7250                        {}
7251                }
7252        },
7253        [ALC274_FIXUP_DELL_BIND_DACS] = {
7254                .type = HDA_FIXUP_FUNC,
7255                .v.func = alc274_fixup_bind_dacs,
7256                .chained = true,
7257                .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
7258        },
7259        [ALC274_FIXUP_DELL_AIO_LINEOUT_VERB] = {
7260                .type = HDA_FIXUP_PINS,
7261                .v.pins = (const struct hda_pintbl[]) {
7262                        { 0x1b, 0x0401102f },
7263                        { }
7264                },
7265                .chained = true,
7266                .chain_id = ALC274_FIXUP_DELL_BIND_DACS
7267        },
7268        [ALC298_FIXUP_TPT470_DOCK_FIX] = {
7269                .type = HDA_FIXUP_FUNC,
7270                .v.func = alc_fixup_tpt470_dock,
7271                .chained = true,
7272                .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE
7273        },
7274        [ALC298_FIXUP_TPT470_DOCK] = {
7275                .type = HDA_FIXUP_FUNC,
7276                .v.func = alc_fixup_tpt470_dacs,
7277                .chained = true,
7278                .chain_id = ALC298_FIXUP_TPT470_DOCK_FIX
7279        },
7280        [ALC255_FIXUP_DUMMY_LINEOUT_VERB] = {
7281                .type = HDA_FIXUP_PINS,
7282                .v.pins = (const struct hda_pintbl[]) {
7283                        { 0x14, 0x0201101f },
7284                        { }
7285                },
7286                .chained = true,
7287                .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
7288        },
7289        [ALC255_FIXUP_DELL_HEADSET_MIC] = {
7290                .type = HDA_FIXUP_PINS,
7291                .v.pins = (const struct hda_pintbl[]) {
7292                        { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7293                        { }
7294                },
7295                .chained = true,
7296                .chain_id = ALC269_FIXUP_HEADSET_MIC
7297        },
7298        [ALC295_FIXUP_HP_X360] = {
7299                .type = HDA_FIXUP_FUNC,
7300                .v.func = alc295_fixup_hp_top_speakers,
7301                .chained = true,
7302                .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC3
7303        },
7304        [ALC221_FIXUP_HP_HEADSET_MIC] = {
7305                .type = HDA_FIXUP_PINS,
7306                .v.pins = (const struct hda_pintbl[]) {
7307                        { 0x19, 0x0181313f},
7308                        { }
7309                },
7310                .chained = true,
7311                .chain_id = ALC269_FIXUP_HEADSET_MIC
7312        },
7313        [ALC285_FIXUP_LENOVO_HEADPHONE_NOISE] = {
7314                .type = HDA_FIXUP_FUNC,
7315                .v.func = alc285_fixup_invalidate_dacs,
7316                .chained = true,
7317                .chain_id = ALC269_FIXUP_THINKPAD_ACPI
7318        },
7319        [ALC295_FIXUP_HP_AUTO_MUTE] = {
7320                .type = HDA_FIXUP_FUNC,
7321                .v.func = alc_fixup_auto_mute_via_amp,
7322        },
7323        [ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE] = {
7324                .type = HDA_FIXUP_PINS,
7325                .v.pins = (const struct hda_pintbl[]) {
7326                        { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7327                        { }
7328                },
7329                .chained = true,
7330                .chain_id = ALC269_FIXUP_HEADSET_MIC
7331        },
7332        [ALC294_FIXUP_ASUS_MIC] = {
7333                .type = HDA_FIXUP_PINS,
7334                .v.pins = (const struct hda_pintbl[]) {
7335                        { 0x13, 0x90a60160 }, /* use as internal mic */
7336                        { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
7337                        { }
7338                },
7339                .chained = true,
7340                .chain_id = ALC269_FIXUP_HEADSET_MIC
7341        },
7342        [ALC294_FIXUP_ASUS_HEADSET_MIC] = {
7343                .type = HDA_FIXUP_PINS,
7344                .v.pins = (const struct hda_pintbl[]) {
7345                        { 0x19, 0x01a1103c }, /* use as headset mic */
7346                        { }
7347                },
7348                .chained = true,
7349                .chain_id = ALC269_FIXUP_HEADSET_MIC
7350        },
7351        [ALC294_FIXUP_ASUS_SPK] = {
7352                .type = HDA_FIXUP_VERBS,
7353                .v.verbs = (const struct hda_verb[]) {
7354                        /* Set EAPD high */
7355                        { 0x20, AC_VERB_SET_COEF_INDEX, 0x40 },
7356                        { 0x20, AC_VERB_SET_PROC_COEF, 0x8800 },
7357                        { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
7358                        { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
7359                        { }
7360                },
7361                .chained = true,
7362                .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
7363        },
7364        [ALC295_FIXUP_CHROME_BOOK] = {
7365                .type = HDA_FIXUP_FUNC,
7366                .v.func = alc295_fixup_chromebook,
7367                .chained = true,
7368                .chain_id = ALC225_FIXUP_HEADSET_JACK
7369        },
7370        [ALC225_FIXUP_HEADSET_JACK] = {
7371                .type = HDA_FIXUP_FUNC,
7372                .v.func = alc_fixup_headset_jack,
7373        },
7374        [ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
7375                .type = HDA_FIXUP_PINS,
7376                .v.pins = (const struct hda_pintbl[]) {
7377                        { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7378                        { }
7379                },
7380                .chained = true,
7381                .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7382        },
7383        [ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE] = {
7384                .type = HDA_FIXUP_VERBS,
7385                .v.verbs = (const struct hda_verb[]) {
7386                        /* Disable PCBEEP-IN passthrough */
7387                        { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
7388                        { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
7389                        { }
7390                },
7391                .chained = true,
7392                .chain_id = ALC285_FIXUP_LENOVO_HEADPHONE_NOISE
7393        },
7394        [ALC255_FIXUP_ACER_HEADSET_MIC] = {
7395                .type = HDA_FIXUP_PINS,
7396                .v.pins = (const struct hda_pintbl[]) {
7397                        { 0x19, 0x03a11130 },
7398                        { 0x1a, 0x90a60140 }, /* use as internal mic */
7399                        { }
7400                },
7401                .chained = true,
7402                .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
7403        },
7404        [ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE] = {
7405                .type = HDA_FIXUP_PINS,
7406                .v.pins = (const struct hda_pintbl[]) {
7407                        { 0x16, 0x01011020 }, /* Rear Line out */
7408                        { 0x19, 0x01a1913c }, /* use as Front headset mic, without its own jack detect */
7409                        { }
7410                },
7411                .chained = true,
7412                .chain_id = ALC225_FIXUP_WYSE_AUTO_MUTE
7413        },
7414        [ALC225_FIXUP_WYSE_AUTO_MUTE] = {
7415                .type = HDA_FIXUP_FUNC,
7416                .v.func = alc_fixup_auto_mute_via_amp,
7417                .chained = true,
7418                .chain_id = ALC225_FIXUP_WYSE_DISABLE_MIC_VREF
7419        },
7420        [ALC225_FIXUP_WYSE_DISABLE_MIC_VREF] = {
7421                .type = HDA_FIXUP_FUNC,
7422                .v.func = alc_fixup_disable_mic_vref,
7423                .chained = true,
7424                .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7425        },
7426        [ALC286_FIXUP_ACER_AIO_HEADSET_MIC] = {
7427                .type = HDA_FIXUP_VERBS,
7428                .v.verbs = (const struct hda_verb[]) {
7429                        { 0x20, AC_VERB_SET_COEF_INDEX, 0x4f },
7430                        { 0x20, AC_VERB_SET_PROC_COEF, 0x5029 },
7431                        { }
7432                },
7433                .chained = true,
7434                .chain_id = ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE
7435        },
7436        [ALC256_FIXUP_ASUS_HEADSET_MIC] = {
7437                .type = HDA_FIXUP_PINS,
7438                .v.pins = (const struct hda_pintbl[]) {
7439                        { 0x19, 0x03a11020 }, /* headset mic with jack detect */
7440                        { }
7441                },
7442                .chained = true,
7443                .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7444        },
7445        [ALC256_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7446                .type = HDA_FIXUP_PINS,
7447                .v.pins = (const struct hda_pintbl[]) {
7448                        { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
7449                        { }
7450                },
7451                .chained = true,
7452                .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7453        },
7454        [ALC299_FIXUP_PREDATOR_SPK] = {
7455                .type = HDA_FIXUP_PINS,
7456                .v.pins = (const struct hda_pintbl[]) {
7457                        { 0x21, 0x90170150 }, /* use as headset mic, without its own jack detect */
7458                        { }
7459                }
7460        },
7461        [ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE] = {
7462                .type = HDA_FIXUP_PINS,
7463                .v.pins = (const struct hda_pintbl[]) {
7464                        { 0x19, 0x04a11040 },
7465                        { 0x21, 0x04211020 },
7466                        { }
7467                },
7468                .chained = true,
7469                .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7470        },
7471        [ALC289_FIXUP_DELL_SPK2] = {
7472                .type = HDA_FIXUP_PINS,
7473                .v.pins = (const struct hda_pintbl[]) {
7474                        { 0x17, 0x90170130 }, /* bass spk */
7475                        { }
7476                },
7477                .chained = true,
7478                .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE
7479        },
7480        [ALC289_FIXUP_DUAL_SPK] = {
7481                .type = HDA_FIXUP_FUNC,
7482                .v.func = alc285_fixup_speaker2_to_dac1,
7483                .chained = true,
7484                .chain_id = ALC289_FIXUP_DELL_SPK2
7485        },
7486        [ALC294_FIXUP_SPK2_TO_DAC1] = {
7487                .type = HDA_FIXUP_FUNC,
7488                .v.func = alc285_fixup_speaker2_to_dac1,
7489                .chained = true,
7490                .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
7491        },
7492        [ALC294_FIXUP_ASUS_DUAL_SPK] = {
7493                .type = HDA_FIXUP_FUNC,
7494                /* The GPIO must be pulled to initialize the AMP */
7495                .v.func = alc_fixup_gpio4,
7496                .chained = true,
7497                .chain_id = ALC294_FIXUP_SPK2_TO_DAC1
7498        },
7499        [ALC285_FIXUP_THINKPAD_X1_GEN7] = {
7500                .type = HDA_FIXUP_FUNC,
7501                .v.func = alc285_fixup_thinkpad_x1_gen7,
7502                .chained = true,
7503                .chain_id = ALC269_FIXUP_THINKPAD_ACPI
7504        },
7505        [ALC285_FIXUP_THINKPAD_HEADSET_JACK] = {
7506                .type = HDA_FIXUP_FUNC,
7507                .v.func = alc_fixup_headset_jack,
7508                .chained = true,
7509                .chain_id = ALC285_FIXUP_THINKPAD_X1_GEN7
7510        },
7511        [ALC294_FIXUP_ASUS_HPE] = {
7512                .type = HDA_FIXUP_VERBS,
7513                .v.verbs = (const struct hda_verb[]) {
7514                        /* Set EAPD high */
7515                        { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
7516                        { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
7517                        { }
7518                },
7519                .chained = true,
7520                .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
7521        },
7522        [ALC294_FIXUP_ASUS_GX502_PINS] = {
7523                .type = HDA_FIXUP_PINS,
7524                .v.pins = (const struct hda_pintbl[]) {
7525                        { 0x19, 0x03a11050 }, /* front HP mic */
7526                        { 0x1a, 0x01a11830 }, /* rear external mic */
7527                        { 0x21, 0x03211020 }, /* front HP out */
7528                        { }
7529                },
7530                .chained = true,
7531                .chain_id = ALC294_FIXUP_ASUS_GX502_VERBS
7532        },
7533        [ALC294_FIXUP_ASUS_GX502_VERBS] = {
7534                .type = HDA_FIXUP_VERBS,
7535                .v.verbs = (const struct hda_verb[]) {
7536                        /* set 0x15 to HP-OUT ctrl */
7537                        { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
7538                        /* unmute the 0x15 amp */
7539                        { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
7540                        { }
7541                },
7542                .chained = true,
7543                .chain_id = ALC294_FIXUP_ASUS_GX502_HP
7544        },
7545        [ALC294_FIXUP_ASUS_GX502_HP] = {
7546                .type = HDA_FIXUP_FUNC,
7547                .v.func = alc294_fixup_gx502_hp,
7548        },
7549        [ALC294_FIXUP_ASUS_COEF_1B] = {
7550                .type = HDA_FIXUP_VERBS,
7551                .v.verbs = (const struct hda_verb[]) {
7552                        /* Set bit 10 to correct noisy output after reboot from
7553                         * Windows 10 (due to pop noise reduction?)
7554                         */
7555                        { 0x20, AC_VERB_SET_COEF_INDEX, 0x1b },
7556                        { 0x20, AC_VERB_SET_PROC_COEF, 0x4e4b },
7557                        { }
7558                },
7559        },
7560        [ALC285_FIXUP_HP_GPIO_LED] = {
7561                .type = HDA_FIXUP_FUNC,
7562                .v.func = alc285_fixup_hp_gpio_led,
7563        },
7564        [ALC285_FIXUP_HP_MUTE_LED] = {
7565                .type = HDA_FIXUP_FUNC,
7566                .v.func = alc285_fixup_hp_mute_led,
7567        },
7568        [ALC236_FIXUP_HP_MUTE_LED] = {
7569                .type = HDA_FIXUP_FUNC,
7570                .v.func = alc236_fixup_hp_mute_led,
7571        },
7572        [ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
7573                .type = HDA_FIXUP_VERBS,
7574                .v.verbs = (const struct hda_verb[]) {
7575                        { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc5 },
7576                        { }
7577                },
7578        },
7579        [ALC295_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7580                .type = HDA_FIXUP_PINS,
7581                .v.pins = (const struct hda_pintbl[]) {
7582                        { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7583                        { }
7584                },
7585                .chained = true,
7586                .chain_id = ALC269_FIXUP_HEADSET_MODE
7587        },
7588        [ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS] = {
7589                .type = HDA_FIXUP_PINS,
7590                .v.pins = (const struct hda_pintbl[]) {
7591                        { 0x14, 0x90100120 }, /* use as internal speaker */
7592                        { 0x18, 0x02a111f0 }, /* use as headset mic, without its own jack detect */
7593                        { 0x1a, 0x01011020 }, /* use as line out */
7594                        { },
7595                },
7596                .chained = true,
7597                .chain_id = ALC269_FIXUP_HEADSET_MIC
7598        },
7599        [ALC269VC_FIXUP_ACER_HEADSET_MIC] = {
7600                .type = HDA_FIXUP_PINS,
7601                .v.pins = (const struct hda_pintbl[]) {
7602                        { 0x18, 0x02a11030 }, /* use as headset mic */
7603                        { }
7604                },
7605                .chained = true,
7606                .chain_id = ALC269_FIXUP_HEADSET_MIC
7607        },
7608        [ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE] = {
7609                .type = HDA_FIXUP_PINS,
7610                .v.pins = (const struct hda_pintbl[]) {
7611                        { 0x18, 0x01a11130 }, /* use as headset mic, without its own jack detect */
7612                        { }
7613                },
7614                .chained = true,
7615                .chain_id = ALC269_FIXUP_HEADSET_MIC
7616        },
7617        [ALC289_FIXUP_ASUS_GA401] = {
7618                .type = HDA_FIXUP_FUNC,
7619                .v.func = alc289_fixup_asus_ga401,
7620                .chained = true,
7621                .chain_id = ALC289_FIXUP_ASUS_GA502,
7622        },
7623        [ALC289_FIXUP_ASUS_GA502] = {
7624                .type = HDA_FIXUP_PINS,
7625                .v.pins = (const struct hda_pintbl[]) {
7626                        { 0x19, 0x03a11020 }, /* headset mic with jack detect */
7627                        { }
7628                },
7629        },
7630        [ALC256_FIXUP_ACER_MIC_NO_PRESENCE] = {
7631                .type = HDA_FIXUP_PINS,
7632                .v.pins = (const struct hda_pintbl[]) {
7633                        { 0x19, 0x02a11120 }, /* use as headset mic, without its own jack detect */
7634                        { }
7635                },
7636                .chained = true,
7637                .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7638        },
7639        [ALC285_FIXUP_HP_GPIO_AMP_INIT] = {
7640                .type = HDA_FIXUP_FUNC,
7641                .v.func = alc285_fixup_hp_gpio_amp_init,
7642                .chained = true,
7643                .chain_id = ALC285_FIXUP_HP_GPIO_LED
7644        },
7645        [ALC269_FIXUP_CZC_B20] = {
7646                .type = HDA_FIXUP_PINS,
7647                .v.pins = (const struct hda_pintbl[]) {
7648                        { 0x12, 0x411111f0 },
7649                        { 0x14, 0x90170110 }, /* speaker */
7650                        { 0x15, 0x032f1020 }, /* HP out */
7651                        { 0x17, 0x411111f0 },
7652                        { 0x18, 0x03ab1040 }, /* mic */
7653                        { 0x19, 0xb7a7013f },
7654                        { 0x1a, 0x0181305f },
7655                        { 0x1b, 0x411111f0 },
7656                        { 0x1d, 0x411111f0 },
7657                        { 0x1e, 0x411111f0 },
7658                        { }
7659                },
7660                .chain_id = ALC269_FIXUP_DMIC,
7661        },
7662        [ALC269_FIXUP_CZC_TMI] = {
7663                .type = HDA_FIXUP_PINS,
7664                .v.pins = (const struct hda_pintbl[]) {
7665                        { 0x12, 0x4000c000 },
7666                        { 0x14, 0x90170110 }, /* speaker */
7667                        { 0x15, 0x0421401f }, /* HP out */
7668                        { 0x17, 0x411111f0 },
7669                        { 0x18, 0x04a19020 }, /* mic */
7670                        { 0x19, 0x411111f0 },
7671                        { 0x1a, 0x411111f0 },
7672                        { 0x1b, 0x411111f0 },
7673                        { 0x1d, 0x40448505 },
7674                        { 0x1e, 0x411111f0 },
7675                        { 0x20, 0x8000ffff },
7676                        { }
7677                },
7678                .chain_id = ALC269_FIXUP_DMIC,
7679        },
7680        [ALC269_FIXUP_CZC_L101] = {
7681                .type = HDA_FIXUP_PINS,
7682                .v.pins = (const struct hda_pintbl[]) {
7683                        { 0x12, 0x40000000 },
7684                        { 0x14, 0x01014010 }, /* speaker */
7685                        { 0x15, 0x411111f0 }, /* HP out */
7686                        { 0x16, 0x411111f0 },
7687                        { 0x18, 0x01a19020 }, /* mic */
7688                        { 0x19, 0x02a19021 },
7689                        { 0x1a, 0x0181302f },
7690                        { 0x1b, 0x0221401f },
7691                        { 0x1c, 0x411111f0 },
7692                        { 0x1d, 0x4044c601 },
7693                        { 0x1e, 0x411111f0 },
7694                        { }
7695                },
7696                .chain_id = ALC269_FIXUP_DMIC,
7697        },
7698        [ALC269_FIXUP_LEMOTE_A1802] = {
7699                .type = HDA_FIXUP_PINS,
7700                .v.pins = (const struct hda_pintbl[]) {
7701                        { 0x12, 0x40000000 },
7702                        { 0x14, 0x90170110 }, /* speaker */
7703                        { 0x17, 0x411111f0 },
7704                        { 0x18, 0x03a19040 }, /* mic1 */
7705                        { 0x19, 0x90a70130 }, /* mic2 */
7706                        { 0x1a, 0x411111f0 },
7707                        { 0x1b, 0x411111f0 },
7708                        { 0x1d, 0x40489d2d },
7709                        { 0x1e, 0x411111f0 },
7710                        { 0x20, 0x0003ffff },
7711                        { 0x21, 0x03214020 },
7712                        { }
7713                },
7714                .chain_id = ALC269_FIXUP_DMIC,
7715        },
7716        [ALC269_FIXUP_LEMOTE_A190X] = {
7717                .type = HDA_FIXUP_PINS,
7718                .v.pins = (const struct hda_pintbl[]) {
7719                        { 0x14, 0x99130110 }, /* speaker */
7720                        { 0x15, 0x0121401f }, /* HP out */
7721                        { 0x18, 0x01a19c20 }, /* rear  mic */
7722                        { 0x19, 0x99a3092f }, /* front mic */
7723                        { 0x1b, 0x0201401f }, /* front lineout */
7724                        { }
7725                },
7726                .chain_id = ALC269_FIXUP_DMIC,
7727        },
7728        [ALC256_FIXUP_INTEL_NUC8_RUGGED] = {
7729                .type = HDA_FIXUP_PINS,
7730                .v.pins = (const struct hda_pintbl[]) {
7731                        { 0x1b, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7732                        { }
7733                },
7734                .chained = true,
7735                .chain_id = ALC269_FIXUP_HEADSET_MODE
7736        },
7737        [ALC255_FIXUP_XIAOMI_HEADSET_MIC] = {
7738                .type = HDA_FIXUP_VERBS,
7739                .v.verbs = (const struct hda_verb[]) {
7740                        { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
7741                        { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
7742                        { }
7743                },
7744                .chained = true,
7745                .chain_id = ALC289_FIXUP_ASUS_GA502
7746        },
7747        [ALC274_FIXUP_HP_MIC] = {
7748                .type = HDA_FIXUP_VERBS,
7749                .v.verbs = (const struct hda_verb[]) {
7750                        { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
7751                        { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
7752                        { }
7753                },
7754        },
7755        [ALC274_FIXUP_HP_HEADSET_MIC] = {
7756                .type = HDA_FIXUP_FUNC,
7757                .v.func = alc274_fixup_hp_headset_mic,
7758                .chained = true,
7759                .chain_id = ALC274_FIXUP_HP_MIC
7760        },
7761        [ALC256_FIXUP_ASUS_HPE] = {
7762                .type = HDA_FIXUP_VERBS,
7763                .v.verbs = (const struct hda_verb[]) {
7764                        /* Set EAPD high */
7765                        { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
7766                        { 0x20, AC_VERB_SET_PROC_COEF, 0x7778 },
7767                        { }
7768                },
7769                .chained = true,
7770                .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
7771        },
7772        [ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK] = {
7773                .type = HDA_FIXUP_FUNC,
7774                .v.func = alc_fixup_headset_jack,
7775                .chained = true,
7776                .chain_id = ALC269_FIXUP_THINKPAD_ACPI
7777        },
7778        [ALC287_FIXUP_HP_GPIO_LED] = {
7779                .type = HDA_FIXUP_FUNC,
7780                .v.func = alc287_fixup_hp_gpio_led,
7781        },
7782        [ALC256_FIXUP_HP_HEADSET_MIC] = {
7783                .type = HDA_FIXUP_FUNC,
7784                .v.func = alc274_fixup_hp_headset_mic,
7785        },
7786        [ALC236_FIXUP_DELL_AIO_HEADSET_MIC] = {
7787                .type = HDA_FIXUP_FUNC,
7788                .v.func = alc_fixup_no_int_mic,
7789                .chained = true,
7790                .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
7791        },
7792};
7793
7794static const struct snd_pci_quirk alc269_fixup_tbl[] = {
7795        SND_PCI_QUIRK(0x1025, 0x0283, "Acer TravelMate 8371", ALC269_FIXUP_INV_DMIC),
7796        SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC),
7797        SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC),
7798        SND_PCI_QUIRK(0x1025, 0x047c, "Acer AC700", ALC269_FIXUP_ACER_AC700),
7799        SND_PCI_QUIRK(0x1025, 0x072d, "Acer Aspire V5-571G", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
7800        SND_PCI_QUIRK(0x1025, 0x080d, "Acer Aspire V5-122P", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
7801        SND_PCI_QUIRK(0x1025, 0x0740, "Acer AO725", ALC271_FIXUP_HP_GATE_MIC_JACK),
7802        SND_PCI_QUIRK(0x1025, 0x0742, "Acer AO756", ALC271_FIXUP_HP_GATE_MIC_JACK),
7803        SND_PCI_QUIRK(0x1025, 0x0762, "Acer Aspire E1-472", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
7804        SND_PCI_QUIRK(0x1025, 0x0775, "Acer Aspire E1-572", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
7805        SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS),
7806        SND_PCI_QUIRK(0x1025, 0x102b, "Acer Aspire C24-860", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE),
7807        SND_PCI_QUIRK(0x1025, 0x1065, "Acer Aspire C20-820", ALC269VC_FIXUP_ACER_HEADSET_MIC),
7808        SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK),
7809        SND_PCI_QUIRK(0x1025, 0x1099, "Acer Aspire E5-523G", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
7810        SND_PCI_QUIRK(0x1025, 0x110e, "Acer Aspire ES1-432", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
7811        SND_PCI_QUIRK(0x1025, 0x1246, "Acer Predator Helios 500", ALC299_FIXUP_PREDATOR_SPK),
7812        SND_PCI_QUIRK(0x1025, 0x1247, "Acer vCopperbox", ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS),
7813        SND_PCI_QUIRK(0x1025, 0x1248, "Acer Veriton N4660G", ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE),
7814        SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
7815        SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
7816        SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
7817        SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
7818        SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", ALC233_FIXUP_ACER_HEADSET_MIC),
7819        SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC),
7820        SND_PCI_QUIRK(0x1025, 0x1430, "Acer TravelMate B311R-31", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
7821        SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
7822        SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS),
7823        SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X),
7824        SND_PCI_QUIRK(0x1028, 0x05be, "Dell Latitude E6540", ALC292_FIXUP_DELL_E7X),
7825        SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X),
7826        SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X),
7827        SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER),
7828        SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
7829        SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
7830        SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
7831        SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
7832        SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
7833        SND_PCI_QUIRK(0x1028, 0x062c, "Dell Latitude E5550", ALC292_FIXUP_DELL_E7X),
7834        SND_PCI_QUIRK(0x1028, 0x062e, "Dell Latitude E7450", ALC292_FIXUP_DELL_E7X),
7835        SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),
7836        SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
7837        SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
7838        SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13),
7839        SND_PCI_QUIRK(0x1028, 0x0669, "Dell Optiplex 9020m", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
7840        SND_PCI_QUIRK(0x1028, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK),
7841        SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
7842        SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
7843        SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
7844        SND_PCI_QUIRK(0x1028, 0x06db, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
7845        SND_PCI_QUIRK(0x1028, 0x06dd, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
7846        SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
7847        SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
7848        SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
7849        SND_PCI_QUIRK(0x1028, 0x0706, "Dell Inspiron 7559", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
7850        SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE),
7851        SND_PCI_QUIRK(0x1028, 0x0738, "Dell Precision 5820", ALC269_FIXUP_NO_SHUTUP),
7852        SND_PCI_QUIRK(0x1028, 0x075c, "Dell XPS 27 7760", ALC298_FIXUP_SPK_VOLUME),
7853        SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME),
7854        SND_PCI_QUIRK(0x1028, 0x07b0, "Dell Precision 7520", ALC295_FIXUP_DISABLE_DAC3),
7855        SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
7856        SND_PCI_QUIRK(0x1028, 0x080c, "Dell WYSE", ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE),
7857        SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
7858        SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
7859        SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
7860        SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
7861        SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB),
7862        SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE),
7863        SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE),
7864        SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
7865        SND_PCI_QUIRK(0x1028, 0x097e, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
7866        SND_PCI_QUIRK(0x1028, 0x097d, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
7867        SND_PCI_QUIRK(0x1028, 0x098d, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
7868        SND_PCI_QUIRK(0x1028, 0x09bf, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
7869        SND_PCI_QUIRK(0x1028, 0x0a2e, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
7870        SND_PCI_QUIRK(0x1028, 0x0a30, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
7871        SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
7872        SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
7873        SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
7874        SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),
7875        SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED),
7876        SND_PCI_QUIRK(0x103c, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY),
7877        /* ALC282 */
7878        SND_PCI_QUIRK(0x103c, 0x21f9, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7879        SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7880        SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7881        SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
7882        SND_PCI_QUIRK(0x103c, 0x2237, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
7883        SND_PCI_QUIRK(0x103c, 0x2238, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
7884        SND_PCI_QUIRK(0x103c, 0x2239, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
7885        SND_PCI_QUIRK(0x103c, 0x224b, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
7886        SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7887        SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7888        SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7889        SND_PCI_QUIRK(0x103c, 0x226e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7890        SND_PCI_QUIRK(0x103c, 0x2271, "HP", ALC286_FIXUP_HP_GPIO_LED),
7891        SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC280_FIXUP_HP_DOCK_PINS),
7892        SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC280_FIXUP_HP_DOCK_PINS),
7893        SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7894        SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7895        SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7896        SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7897        SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7898        SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC280_FIXUP_HP_9480M),
7899        SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7900        SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7901        /* ALC290 */
7902        SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7903        SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7904        SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7905        SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7906        SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7907        SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7908        SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7909        SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7910        SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7911        SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED),
7912        SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7913        SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7914        SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7915        SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7916        SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7917        SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7918        SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7919        SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7920        SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7921        SND_PCI_QUIRK(0x103c, 0x228b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7922        SND_PCI_QUIRK(0x103c, 0x228e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7923        SND_PCI_QUIRK(0x103c, 0x22c5, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7924        SND_PCI_QUIRK(0x103c, 0x22c7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7925        SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7926        SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7927        SND_PCI_QUIRK(0x103c, 0x2334, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7928        SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7929        SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7930        SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7931        SND_PCI_QUIRK(0x103c, 0x221c, "HP EliteBook 755 G2", ALC280_FIXUP_HP_HEADSET_MIC),
7932        SND_PCI_QUIRK(0x103c, 0x802e, "HP Z240 SFF", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
7933        SND_PCI_QUIRK(0x103c, 0x802f, "HP Z240", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
7934        SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
7935        SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC),
7936        SND_PCI_QUIRK(0x103c, 0x827e, "HP x360", ALC295_FIXUP_HP_X360),
7937        SND_PCI_QUIRK(0x103c, 0x827f, "HP x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
7938        SND_PCI_QUIRK(0x103c, 0x82bf, "HP G3 mini", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
7939        SND_PCI_QUIRK(0x103c, 0x82c0, "HP G3 mini premium", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
7940        SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
7941        SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
7942        SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
7943        SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED),
7944        SND_PCI_QUIRK(0x103c, 0x8729, "HP", ALC285_FIXUP_HP_GPIO_LED),
7945        SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_AMP_INIT),
7946        SND_PCI_QUIRK(0x103c, 0x8760, "HP", ALC285_FIXUP_HP_MUTE_LED),
7947        SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED),
7948        SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED),
7949        SND_PCI_QUIRK(0x103c, 0x87f4, "HP", ALC287_FIXUP_HP_GPIO_LED),
7950        SND_PCI_QUIRK(0x103c, 0x87f5, "HP", ALC287_FIXUP_HP_GPIO_LED),
7951        SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
7952        SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
7953        SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
7954        SND_PCI_QUIRK(0x1043, 0x10a1, "ASUS UX391UA", ALC294_FIXUP_ASUS_SPK),
7955        SND_PCI_QUIRK(0x1043, 0x10c0, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
7956        SND_PCI_QUIRK(0x1043, 0x10d0, "ASUS X540LA/X540LJ", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
7957        SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
7958        SND_PCI_QUIRK(0x1043, 0x11c0, "ASUS X556UR", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
7959        SND_PCI_QUIRK(0x1043, 0x1290, "ASUS X441SA", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
7960        SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
7961        SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC),
7962        SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),
7963        SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
7964        SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
7965        SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
7966        SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
7967        SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_DUAL_SPK),
7968        SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC),
7969        SND_PCI_QUIRK(0x1043, 0x18f1, "Asus FX505DT", ALC256_FIXUP_ASUS_HEADSET_MIC),
7970        SND_PCI_QUIRK(0x1043, 0x194e, "ASUS UX563FD", ALC294_FIXUP_ASUS_HPE),
7971        SND_PCI_QUIRK(0x1043, 0x19ce, "ASUS B9450FA", ALC294_FIXUP_ASUS_HPE),
7972        SND_PCI_QUIRK(0x1043, 0x19e1, "ASUS UX581LV", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE),
7973        SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
7974        SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC),
7975        SND_PCI_QUIRK(0x1043, 0x1b11, "ASUS UX431DA", ALC294_FIXUP_ASUS_COEF_1B),
7976        SND_PCI_QUIRK(0x1043, 0x1b13, "Asus U41SV", ALC269_FIXUP_INV_DMIC),
7977        SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
7978        SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
7979        SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
7980        SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE),
7981        SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502),
7982        SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401),
7983        SND_PCI_QUIRK(0x1043, 0x1881, "ASUS Zephyrus S/M", ALC294_FIXUP_ASUS_GX502_PINS),
7984        SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
7985        SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
7986        SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
7987        SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
7988        SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
7989        SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
7990        SND_PCI_QUIRK(0x104d, 0x90b5, "Sony VAIO Pro 11", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
7991        SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
7992        SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
7993        SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
7994        SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
7995        SND_PCI_QUIRK(0x104d, 0x9099, "Sony VAIO S13", ALC275_FIXUP_SONY_DISABLE_AAMIX),
7996        SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),
7997        SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT),
7998        SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN),
7999        SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN),
8000        SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC),
8001        SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),
8002        SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE),
8003        SND_PCI_QUIRK(0x10ec, 0x1230, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
8004        SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-SZ6", ALC269_FIXUP_HEADSET_MODE),
8005        SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
8006        SND_PCI_QUIRK(0x144d, 0xc169, "Samsung Notebook 9 Pen (NP930SBE-K01US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
8007        SND_PCI_QUIRK(0x144d, 0xc176, "Samsung Notebook 9 Pro (NP930MBE-K04US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
8008        SND_PCI_QUIRK(0x144d, 0xc189, "Samsung Galaxy Flex Book (NT950QCG-X716)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
8009        SND_PCI_QUIRK(0x144d, 0xc18a, "Samsung Galaxy Book Ion (NP930XCJ-K01US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
8010        SND_PCI_QUIRK(0x144d, 0xc830, "Samsung Galaxy Book Ion (NT950XCJ-X716A)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
8011        SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
8012        SND_PCI_QUIRK(0x144d, 0xc812, "Samsung Notebook Pen S (NT950SBE-X58)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
8013        SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
8014        SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),
8015        SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC),
8016        SND_PCI_QUIRK(0x1558, 0x1323, "Clevo N130ZU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8017        SND_PCI_QUIRK(0x1558, 0x1325, "System76 Darter Pro (darp5)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8018        SND_PCI_QUIRK(0x1558, 0x1401, "Clevo L140[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8019        SND_PCI_QUIRK(0x1558, 0x1403, "Clevo N140CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8020        SND_PCI_QUIRK(0x1558, 0x1404, "Clevo N150CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8021        SND_PCI_QUIRK(0x1558, 0x14a1, "Clevo L141MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8022        SND_PCI_QUIRK(0x1558, 0x4018, "Clevo NV40M[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8023        SND_PCI_QUIRK(0x1558, 0x4019, "Clevo NV40MZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8024        SND_PCI_QUIRK(0x1558, 0x4020, "Clevo NV40MB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8025        SND_PCI_QUIRK(0x1558, 0x40a1, "Clevo NL40GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8026        SND_PCI_QUIRK(0x1558, 0x40c1, "Clevo NL40[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8027        SND_PCI_QUIRK(0x1558, 0x40d1, "Clevo NL41DU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8028        SND_PCI_QUIRK(0x1558, 0x50a3, "Clevo NJ51GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8029        SND_PCI_QUIRK(0x1558, 0x50b3, "Clevo NK50S[BEZ]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8030        SND_PCI_QUIRK(0x1558, 0x50b6, "Clevo NK50S5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8031        SND_PCI_QUIRK(0x1558, 0x50b8, "Clevo NK50SZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8032        SND_PCI_QUIRK(0x1558, 0x50d5, "Clevo NP50D5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8033        SND_PCI_QUIRK(0x1558, 0x50f0, "Clevo NH50A[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8034        SND_PCI_QUIRK(0x1558, 0x50f3, "Clevo NH58DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8035        SND_PCI_QUIRK(0x1558, 0x5101, "Clevo S510WU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8036        SND_PCI_QUIRK(0x1558, 0x5157, "Clevo W517GU1", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8037        SND_PCI_QUIRK(0x1558, 0x51a1, "Clevo NS50MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8038        SND_PCI_QUIRK(0x1558, 0x70a1, "Clevo NB70T[HJK]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8039        SND_PCI_QUIRK(0x1558, 0x70b3, "Clevo NK70SB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8040        SND_PCI_QUIRK(0x1558, 0x8228, "Clevo NR40BU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8041        SND_PCI_QUIRK(0x1558, 0x8520, "Clevo NH50D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8042        SND_PCI_QUIRK(0x1558, 0x8521, "Clevo NH77D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8043        SND_PCI_QUIRK(0x1558, 0x8535, "Clevo NH50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8044        SND_PCI_QUIRK(0x1558, 0x8536, "Clevo NH79D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8045        SND_PCI_QUIRK(0x1558, 0x8550, "System76 Gazelle (gaze14)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8046        SND_PCI_QUIRK(0x1558, 0x8551, "System76 Gazelle (gaze14)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8047        SND_PCI_QUIRK(0x1558, 0x8560, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
8048        SND_PCI_QUIRK(0x1558, 0x8561, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
8049        SND_PCI_QUIRK(0x1558, 0x8668, "Clevo NP50B[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8050        SND_PCI_QUIRK(0x1558, 0x8680, "Clevo NJ50LU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8051        SND_PCI_QUIRK(0x1558, 0x8686, "Clevo NH50[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8052        SND_PCI_QUIRK(0x1558, 0x8a20, "Clevo NH55DCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8053        SND_PCI_QUIRK(0x1558, 0x8a51, "Clevo NH70RCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8054        SND_PCI_QUIRK(0x1558, 0x8d50, "Clevo NH55RCQ-M", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8055        SND_PCI_QUIRK(0x1558, 0x951d, "Clevo N950T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8056        SND_PCI_QUIRK(0x1558, 0x961d, "Clevo N960S[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8057        SND_PCI_QUIRK(0x1558, 0x971d, "Clevo N970T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8058        SND_PCI_QUIRK(0x1558, 0xa500, "Clevo NL53RU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
8059        SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
8060        SND_PCI_QUIRK(0x17aa, 0x1048, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
8061        SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
8062        SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
8063        SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
8064        SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
8065        SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
8066        SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST),
8067        SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK),
8068        SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),
8069        SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),
8070        SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK),
8071        SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK),
8072        SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440),
8073        SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK),
8074        SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK),
8075        SND_PCI_QUIRK(0x17aa, 0x2211, "Thinkpad W541", ALC292_FIXUP_TPT440_DOCK),
8076        SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK),
8077        SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK),
8078        SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
8079        SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK),
8080        SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK),
8081        SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK),
8082        SND_PCI_QUIRK(0x17aa, 0x222d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
8083        SND_PCI_QUIRK(0x17aa, 0x222e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
8084        SND_PCI_QUIRK(0x17aa, 0x2231, "Thinkpad T560", ALC292_FIXUP_TPT460),
8085        SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460),
8086        SND_PCI_QUIRK(0x17aa, 0x2245, "Thinkpad T470", ALC298_FIXUP_TPT470_DOCK),
8087        SND_PCI_QUIRK(0x17aa, 0x2246, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
8088        SND_PCI_QUIRK(0x17aa, 0x2247, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
8089        SND_PCI_QUIRK(0x17aa, 0x2249, "Thinkpad", ALC292_FIXUP_TPT460),
8090        SND_PCI_QUIRK(0x17aa, 0x224b, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
8091        SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
8092        SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
8093        SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
8094        SND_PCI_QUIRK(0x17aa, 0x2292, "Thinkpad X1 Carbon 7th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
8095        SND_PCI_QUIRK(0x17aa, 0x22be, "Thinkpad X1 Carbon 8th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
8096        SND_PCI_QUIRK(0x17aa, 0x22c1, "Thinkpad P1 Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
8097        SND_PCI_QUIRK(0x17aa, 0x22c2, "Thinkpad X1 Extreme Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
8098        SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
8099        SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
8100        SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
8101        SND_PCI_QUIRK(0x17aa, 0x3111, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
8102        SND_PCI_QUIRK(0x17aa, 0x312a, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
8103        SND_PCI_QUIRK(0x17aa, 0x312f, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
8104        SND_PCI_QUIRK(0x17aa, 0x313c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
8105        SND_PCI_QUIRK(0x17aa, 0x3151, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
8106        SND_PCI_QUIRK(0x17aa, 0x3176, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
8107        SND_PCI_QUIRK(0x17aa, 0x3178, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
8108        SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
8109        SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
8110        SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
8111        SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
8112        SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC),
8113        SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK),
8114        SND_PCI_QUIRK(0x17aa, 0x5026, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
8115        SND_PCI_QUIRK(0x17aa, 0x5034, "Thinkpad T450", ALC292_FIXUP_TPT440_DOCK),
8116        SND_PCI_QUIRK(0x17aa, 0x5036, "Thinkpad T450s", ALC292_FIXUP_TPT440_DOCK),
8117        SND_PCI_QUIRK(0x17aa, 0x503c, "Thinkpad L450", ALC292_FIXUP_TPT440_DOCK),
8118        SND_PCI_QUIRK(0x17aa, 0x504a, "ThinkPad X260", ALC292_FIXUP_TPT440_DOCK),
8119        SND_PCI_QUIRK(0x17aa, 0x504b, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
8120        SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460),
8121        SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460),
8122        SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460),
8123        SND_PCI_QUIRK(0x17aa, 0x505d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
8124        SND_PCI_QUIRK(0x17aa, 0x505f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
8125        SND_PCI_QUIRK(0x17aa, 0x5062, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
8126        SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
8127        SND_PCI_QUIRK(0x17aa, 0x511e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
8128        SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
8129        SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
8130        SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
8131        SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS),
8132        SND_PCI_QUIRK(0x1b35, 0x1235, "CZC B20", ALC269_FIXUP_CZC_B20),
8133        SND_PCI_QUIRK(0x1b35, 0x1236, "CZC TMI", ALC269_FIXUP_CZC_TMI),
8134        SND_PCI_QUIRK(0x1b35, 0x1237, "CZC L101", ALC269_FIXUP_CZC_L101),
8135        SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */
8136        SND_PCI_QUIRK(0x1d72, 0x1602, "RedmiBook", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
8137        SND_PCI_QUIRK(0x1d72, 0x1901, "RedmiBook 14", ALC256_FIXUP_ASUS_HEADSET_MIC),
8138        SND_PCI_QUIRK(0x10ec, 0x118c, "Medion EE4254 MD62100", ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE),
8139        SND_PCI_QUIRK(0x1c06, 0x2013, "Lemote A1802", ALC269_FIXUP_LEMOTE_A1802),
8140        SND_PCI_QUIRK(0x1c06, 0x2015, "Lemote A190X", ALC269_FIXUP_LEMOTE_A190X),
8141        SND_PCI_QUIRK(0x8086, 0x2080, "Intel NUC 8 Rugged", ALC256_FIXUP_INTEL_NUC8_RUGGED),
8142
8143#if 0
8144        /* Below is a quirk table taken from the old code.
8145         * Basically the device should work as is without the fixup table.
8146         * If BIOS doesn't give a proper info, enable the corresponding
8147         * fixup entry.
8148         */
8149        SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
8150                      ALC269_FIXUP_AMIC),
8151        SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC),
8152        SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC),
8153        SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC),
8154        SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC),
8155        SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269_FIXUP_AMIC),
8156        SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269_FIXUP_AMIC),
8157        SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269_FIXUP_AMIC),
8158        SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_FIXUP_AMIC),
8159        SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269_FIXUP_AMIC),
8160        SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_FIXUP_AMIC),
8161        SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_FIXUP_AMIC),
8162        SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_FIXUP_AMIC),
8163        SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_FIXUP_AMIC),
8164        SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_FIXUP_AMIC),
8165        SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_FIXUP_AMIC),
8166        SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_FIXUP_AMIC),
8167        SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_FIXUP_AMIC),
8168        SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_FIXUP_AMIC),
8169        SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_FIXUP_AMIC),
8170        SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_FIXUP_AMIC),
8171        SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_FIXUP_AMIC),
8172        SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_FIXUP_AMIC),
8173        SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_FIXUP_AMIC),
8174        SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_FIXUP_AMIC),
8175        SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_FIXUP_AMIC),
8176        SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_FIXUP_AMIC),
8177        SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_FIXUP_AMIC),
8178        SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_FIXUP_AMIC),
8179        SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_FIXUP_AMIC),
8180        SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_FIXUP_AMIC),
8181        SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_FIXUP_AMIC),
8182        SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_FIXUP_AMIC),
8183        SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_FIXUP_AMIC),
8184        SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_FIXUP_AMIC),
8185        SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_FIXUP_DMIC),
8186        SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_FIXUP_AMIC),
8187        SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_AMIC),
8188        SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_FIXUP_DMIC),
8189        SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_FIXUP_DMIC),
8190#endif
8191        {}
8192};
8193
8194static const struct snd_pci_quirk alc269_fixup_vendor_tbl[] = {
8195        SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
8196        SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED),
8197        SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
8198        SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", ALC269_FIXUP_THINKPAD_ACPI),
8199        SND_PCI_QUIRK_VENDOR(0x19e5, "Huawei Matebook", ALC255_FIXUP_MIC_MUTE_LED),
8200        {}
8201};
8202
8203static const struct hda_model_fixup alc269_fixup_models[] = {
8204        {.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"},
8205        {.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"},
8206        {.id = ALC269_FIXUP_STEREO_DMIC, .name = "alc269-dmic"},
8207        {.id = ALC271_FIXUP_DMIC, .name = "alc271-dmic"},
8208        {.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"},
8209        {.id = ALC269_FIXUP_HEADSET_MIC, .name = "headset-mic"},
8210        {.id = ALC269_FIXUP_HEADSET_MODE, .name = "headset-mode"},
8211        {.id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, .name = "headset-mode-no-hp-mic"},
8212        {.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
8213        {.id = ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST, .name = "lenovo-dock-limit-boost"},
8214        {.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
8215        {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic1-led"},
8216        {.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
8217        {.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
8218        {.id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, .name = "dell-headset3"},
8219        {.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, .name = "dell-headset4"},
8220        {.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},
8221        {.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"},
8222        {.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
8223        {.id = ALC292_FIXUP_TPT440, .name = "tpt440"},
8224        {.id = ALC292_FIXUP_TPT460, .name = "tpt460"},
8225        {.id = ALC298_FIXUP_TPT470_DOCK_FIX, .name = "tpt470-dock-fix"},
8226        {.id = ALC298_FIXUP_TPT470_DOCK, .name = "tpt470-dock"},
8227        {.id = ALC233_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
8228        {.id = ALC700_FIXUP_INTEL_REFERENCE, .name = "alc700-ref"},
8229        {.id = ALC269_FIXUP_SONY_VAIO, .name = "vaio"},
8230        {.id = ALC269_FIXUP_DELL_M101Z, .name = "dell-m101z"},
8231        {.id = ALC269_FIXUP_ASUS_G73JW, .name = "asus-g73jw"},
8232        {.id = ALC269_FIXUP_LENOVO_EAPD, .name = "lenovo-eapd"},
8233        {.id = ALC275_FIXUP_SONY_HWEQ, .name = "sony-hweq"},
8234        {.id = ALC269_FIXUP_PCM_44K, .name = "pcm44k"},
8235        {.id = ALC269_FIXUP_LIFEBOOK, .name = "lifebook"},
8236        {.id = ALC269_FIXUP_LIFEBOOK_EXTMIC, .name = "lifebook-extmic"},
8237        {.id = ALC269_FIXUP_LIFEBOOK_HP_PIN, .name = "lifebook-hp-pin"},
8238        {.id = ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC, .name = "lifebook-u7x7"},
8239        {.id = ALC269VB_FIXUP_AMIC, .name = "alc269vb-amic"},
8240        {.id = ALC269VB_FIXUP_DMIC, .name = "alc269vb-dmic"},
8241        {.id = ALC269_FIXUP_HP_MUTE_LED_MIC1, .name = "hp-mute-led-mic1"},
8242        {.id = ALC269_FIXUP_HP_MUTE_LED_MIC2, .name = "hp-mute-led-mic2"},
8243        {.id = ALC269_FIXUP_HP_MUTE_LED_MIC3, .name = "hp-mute-led-mic3"},
8244        {.id = ALC269_FIXUP_HP_GPIO_MIC1_LED, .name = "hp-gpio-mic1"},
8245        {.id = ALC269_FIXUP_HP_LINE1_MIC1_LED, .name = "hp-line1-mic1"},
8246        {.id = ALC269_FIXUP_NO_SHUTUP, .name = "noshutup"},
8247        {.id = ALC286_FIXUP_SONY_MIC_NO_PRESENCE, .name = "sony-nomic"},
8248        {.id = ALC269_FIXUP_ASPIRE_HEADSET_MIC, .name = "aspire-headset-mic"},
8249        {.id = ALC269_FIXUP_ASUS_X101, .name = "asus-x101"},
8250        {.id = ALC271_FIXUP_HP_GATE_MIC_JACK, .name = "acer-ao7xx"},
8251        {.id = ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572, .name = "acer-aspire-e1"},
8252        {.id = ALC269_FIXUP_ACER_AC700, .name = "acer-ac700"},
8253        {.id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST, .name = "limit-mic-boost"},
8254        {.id = ALC269VB_FIXUP_ASUS_ZENBOOK, .name = "asus-zenbook"},
8255        {.id = ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A, .name = "asus-zenbook-ux31a"},
8256        {.id = ALC269VB_FIXUP_ORDISSIMO_EVE2, .name = "ordissimo"},
8257        {.id = ALC282_FIXUP_ASUS_TX300, .name = "asus-tx300"},
8258        {.id = ALC283_FIXUP_INT_MIC, .name = "alc283-int-mic"},
8259        {.id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK, .name = "mono-speakers"},
8260        {.id = ALC290_FIXUP_SUBWOOFER_HSJACK, .name = "alc290-subwoofer"},
8261        {.id = ALC269_FIXUP_THINKPAD_ACPI, .name = "thinkpad"},
8262        {.id = ALC269_FIXUP_DMIC_THINKPAD_ACPI, .name = "dmic-thinkpad"},
8263        {.id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE, .name = "alc255-acer"},
8264        {.id = ALC255_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc255-asus"},
8265        {.id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc255-dell1"},
8266        {.id = ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "alc255-dell2"},
8267        {.id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc293-dell1"},
8268        {.id = ALC283_FIXUP_HEADSET_MIC, .name = "alc283-headset"},
8269        {.id = ALC255_FIXUP_MIC_MUTE_LED, .name = "alc255-dell-mute"},
8270        {.id = ALC282_FIXUP_ASPIRE_V5_PINS, .name = "aspire-v5"},
8271        {.id = ALC280_FIXUP_HP_GPIO4, .name = "hp-gpio4"},
8272        {.id = ALC286_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
8273        {.id = ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY, .name = "hp-gpio2-hotkey"},
8274        {.id = ALC280_FIXUP_HP_DOCK_PINS, .name = "hp-dock-pins"},
8275        {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic"},
8276        {.id = ALC280_FIXUP_HP_9480M, .name = "hp-9480m"},
8277        {.id = ALC288_FIXUP_DELL_HEADSET_MODE, .name = "alc288-dell-headset"},
8278        {.id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc288-dell1"},
8279        {.id = ALC288_FIXUP_DELL_XPS_13, .name = "alc288-dell-xps13"},
8280        {.id = ALC292_FIXUP_DELL_E7X, .name = "dell-e7x"},
8281        {.id = ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK, .name = "alc293-dell"},
8282        {.id = ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc298-dell1"},
8283        {.id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, .name = "alc298-dell-aio"},
8284        {.id = ALC275_FIXUP_DELL_XPS, .name = "alc275-dell-xps"},
8285        {.id = ALC293_FIXUP_LENOVO_SPK_NOISE, .name = "lenovo-spk-noise"},
8286        {.id = ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, .name = "lenovo-hotkey"},
8287        {.id = ALC255_FIXUP_DELL_SPK_NOISE, .name = "dell-spk-noise"},
8288        {.id = ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc225-dell1"},
8289        {.id = ALC295_FIXUP_DISABLE_DAC3, .name = "alc295-disable-dac3"},
8290        {.id = ALC285_FIXUP_SPEAKER2_TO_DAC1, .name = "alc285-speaker2-to-dac1"},
8291        {.id = ALC280_FIXUP_HP_HEADSET_MIC, .name = "alc280-hp-headset"},
8292        {.id = ALC221_FIXUP_HP_FRONT_MIC, .name = "alc221-hp-mic"},
8293        {.id = ALC298_FIXUP_SPK_VOLUME, .name = "alc298-spk-volume"},
8294        {.id = ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER, .name = "dell-inspiron-7559"},
8295        {.id = ALC269_FIXUP_ATIV_BOOK_8, .name = "ativ-book"},
8296        {.id = ALC221_FIXUP_HP_MIC_NO_PRESENCE, .name = "alc221-hp-mic"},
8297        {.id = ALC256_FIXUP_ASUS_HEADSET_MODE, .name = "alc256-asus-headset"},
8298        {.id = ALC256_FIXUP_ASUS_MIC, .name = "alc256-asus-mic"},
8299        {.id = ALC256_FIXUP_ASUS_AIO_GPIO2, .name = "alc256-asus-aio"},
8300        {.id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc233-asus"},
8301        {.id = ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE, .name = "alc233-eapd"},
8302        {.id = ALC294_FIXUP_LENOVO_MIC_LOCATION, .name = "alc294-lenovo-mic"},
8303        {.id = ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE, .name = "alc225-wyse"},
8304        {.id = ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, .name = "alc274-dell-aio"},
8305        {.id = ALC255_FIXUP_DUMMY_LINEOUT_VERB, .name = "alc255-dummy-lineout"},
8306        {.id = ALC255_FIXUP_DELL_HEADSET_MIC, .name = "alc255-dell-headset"},
8307        {.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"},
8308        {.id = ALC225_FIXUP_HEADSET_JACK, .name = "alc-headset-jack"},
8309        {.id = ALC295_FIXUP_CHROME_BOOK, .name = "alc-chrome-book"},
8310        {.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"},
8311        {.id = ALC298_FIXUP_HUAWEI_MBX_STEREO, .name = "huawei-mbx-stereo"},
8312        {.id = ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, .name = "alc256-medion-headset"},
8313        {.id = ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET, .name = "alc298-samsung-headphone"},
8314        {.id = ALC255_FIXUP_XIAOMI_HEADSET_MIC, .name = "alc255-xiaomi-headset"},
8315        {.id = ALC274_FIXUP_HP_MIC, .name = "alc274-hp-mic-detect"},
8316        {}
8317};
8318#define ALC225_STANDARD_PINS \
8319        {0x21, 0x04211020}
8320
8321#define ALC256_STANDARD_PINS \
8322        {0x12, 0x90a60140}, \
8323        {0x14, 0x90170110}, \
8324        {0x21, 0x02211020}
8325
8326#define ALC282_STANDARD_PINS \
8327        {0x14, 0x90170110}
8328
8329#define ALC290_STANDARD_PINS \
8330        {0x12, 0x99a30130}
8331
8332#define ALC292_STANDARD_PINS \
8333        {0x14, 0x90170110}, \
8334        {0x15, 0x0221401f}
8335
8336#define ALC295_STANDARD_PINS \
8337        {0x12, 0xb7a60130}, \
8338        {0x14, 0x90170110}, \
8339        {0x21, 0x04211020}
8340
8341#define ALC298_STANDARD_PINS \
8342        {0x12, 0x90a60130}, \
8343        {0x21, 0x03211020}
8344
8345static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
8346        SND_HDA_PIN_QUIRK(0x10ec0221, 0x103c, "HP Workstation", ALC221_FIXUP_HP_HEADSET_MIC,
8347                {0x14, 0x01014020},
8348                {0x17, 0x90170110},
8349                {0x18, 0x02a11030},
8350                {0x19, 0x0181303F},
8351                {0x21, 0x0221102f}),
8352        SND_HDA_PIN_QUIRK(0x10ec0255, 0x1025, "Acer", ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
8353                {0x12, 0x90a601c0},
8354                {0x14, 0x90171120},
8355                {0x21, 0x02211030}),
8356        SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
8357                {0x14, 0x90170110},
8358                {0x1b, 0x90a70130},
8359                {0x21, 0x03211020}),
8360        SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
8361                {0x1a, 0x90a70130},
8362                {0x1b, 0x90170110},
8363                {0x21, 0x03211020}),
8364        SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
8365                ALC225_STANDARD_PINS,
8366                {0x12, 0xb7a60130},
8367                {0x14, 0x901701a0}),
8368        SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
8369                ALC225_STANDARD_PINS,
8370                {0x12, 0xb7a60130},
8371                {0x14, 0x901701b0}),
8372        SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
8373                ALC225_STANDARD_PINS,
8374                {0x12, 0xb7a60150},
8375                {0x14, 0x901701a0}),
8376        SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
8377                ALC225_STANDARD_PINS,
8378                {0x12, 0xb7a60150},
8379                {0x14, 0x901701b0}),
8380        SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
8381                ALC225_STANDARD_PINS,
8382                {0x12, 0xb7a60130},
8383                {0x1b, 0x90170110}),
8384        SND_HDA_PIN_QUIRK(0x10ec0233, 0x8086, "Intel NUC Skull Canyon", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
8385                {0x1b, 0x01111010},
8386                {0x1e, 0x01451130},
8387                {0x21, 0x02211020}),
8388        SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
8389                {0x12, 0x90a60140},
8390                {0x14, 0x90170110},
8391                {0x19, 0x02a11030},
8392                {0x21, 0x02211020}),
8393        SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
8394                {0x14, 0x90170110},
8395                {0x19, 0x02a11030},
8396                {0x1a, 0x02a11040},
8397                {0x1b, 0x01014020},
8398                {0x21, 0x0221101f}),
8399        SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
8400                {0x14, 0x90170110},
8401                {0x19, 0x02a11030},
8402                {0x1a, 0x02a11040},
8403                {0x1b, 0x01011020},
8404                {0x21, 0x0221101f}),
8405        SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
8406                {0x14, 0x90170110},
8407                {0x19, 0x02a11020},
8408                {0x1a, 0x02a11030},
8409                {0x21, 0x0221101f}),
8410        SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
8411                {0x21, 0x02211010}),
8412        SND_HDA_PIN_QUIRK(0x10ec0236, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
8413                {0x14, 0x90170110},
8414                {0x19, 0x02a11020},
8415                {0x21, 0x02211030}),
8416        SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
8417                {0x14, 0x90170110},
8418                {0x21, 0x02211020}),
8419        SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8420                {0x14, 0x90170130},
8421                {0x21, 0x02211040}),
8422        SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8423                {0x12, 0x90a60140},
8424                {0x14, 0x90170110},
8425                {0x21, 0x02211020}),
8426        SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8427                {0x12, 0x90a60160},
8428                {0x14, 0x90170120},
8429                {0x21, 0x02211030}),
8430        SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8431                {0x14, 0x90170110},
8432                {0x1b, 0x02011020},
8433                {0x21, 0x0221101f}),
8434        SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8435                {0x14, 0x90170110},
8436                {0x1b, 0x01011020},
8437                {0x21, 0x0221101f}),
8438        SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8439                {0x14, 0x90170130},
8440                {0x1b, 0x01014020},
8441                {0x21, 0x0221103f}),
8442        SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8443                {0x14, 0x90170130},
8444                {0x1b, 0x01011020},
8445                {0x21, 0x0221103f}),
8446        SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8447                {0x14, 0x90170130},
8448                {0x1b, 0x02011020},
8449                {0x21, 0x0221103f}),
8450        SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8451                {0x14, 0x90170150},
8452                {0x1b, 0x02011020},
8453                {0x21, 0x0221105f}),
8454        SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8455                {0x14, 0x90170110},
8456                {0x1b, 0x01014020},
8457                {0x21, 0x0221101f}),
8458        SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8459                {0x12, 0x90a60160},
8460                {0x14, 0x90170120},
8461                {0x17, 0x90170140},
8462                {0x21, 0x0321102f}),
8463        SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8464                {0x12, 0x90a60160},
8465                {0x14, 0x90170130},
8466                {0x21, 0x02211040}),
8467        SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8468                {0x12, 0x90a60160},
8469                {0x14, 0x90170140},
8470                {0x21, 0x02211050}),
8471        SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8472                {0x12, 0x90a60170},
8473                {0x14, 0x90170120},
8474                {0x21, 0x02211030}),
8475        SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8476                {0x12, 0x90a60170},
8477                {0x14, 0x90170130},
8478                {0x21, 0x02211040}),
8479        SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8480                {0x12, 0x90a60170},
8481                {0x14, 0x90171130},
8482                {0x21, 0x02211040}),
8483        SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8484                {0x12, 0x90a60170},
8485                {0x14, 0x90170140},
8486                {0x21, 0x02211050}),
8487        SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5548", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8488                {0x12, 0x90a60180},
8489                {0x14, 0x90170130},
8490                {0x21, 0x02211040}),
8491        SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5565", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8492                {0x12, 0x90a60180},
8493                {0x14, 0x90170120},
8494                {0x21, 0x02211030}),
8495        SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8496                {0x1b, 0x01011020},
8497                {0x21, 0x02211010}),
8498        SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
8499                {0x14, 0x90170110},
8500                {0x1b, 0x90a70130},
8501                {0x21, 0x04211020}),
8502        SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
8503                {0x14, 0x90170110},
8504                {0x1b, 0x90a70130},
8505                {0x21, 0x03211020}),
8506        SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
8507                {0x12, 0x90a60130},
8508                {0x14, 0x90170110},
8509                {0x21, 0x03211020}),
8510        SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
8511                {0x12, 0x90a60130},
8512                {0x14, 0x90170110},
8513                {0x21, 0x04211020}),
8514        SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
8515                {0x1a, 0x90a70130},
8516                {0x1b, 0x90170110},
8517                {0x21, 0x03211020}),
8518       SND_HDA_PIN_QUIRK(0x10ec0256, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
8519                {0x14, 0x90170110},
8520                {0x19, 0x02a11020},
8521                {0x21, 0x0221101f}),
8522       SND_HDA_PIN_QUIRK(0x10ec0274, 0x103c, "HP", ALC274_FIXUP_HP_HEADSET_MIC,
8523                {0x17, 0x90170110},
8524                {0x19, 0x03a11030},
8525                {0x21, 0x03211020}),
8526        SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
8527                {0x12, 0x90a60130},
8528                {0x14, 0x90170110},
8529                {0x15, 0x0421101f},
8530                {0x1a, 0x04a11020}),
8531        SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED,
8532                {0x12, 0x90a60140},
8533                {0x14, 0x90170110},
8534                {0x15, 0x0421101f},
8535                {0x18, 0x02811030},
8536                {0x1a, 0x04a1103f},
8537                {0x1b, 0x02011020}),
8538        SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP 15 Touchsmart", ALC269_FIXUP_HP_MUTE_LED_MIC1,
8539                ALC282_STANDARD_PINS,
8540                {0x12, 0x99a30130},
8541                {0x19, 0x03a11020},
8542                {0x21, 0x0321101f}),
8543        SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
8544                ALC282_STANDARD_PINS,
8545                {0x12, 0x99a30130},
8546                {0x19, 0x03a11020},
8547                {0x21, 0x03211040}),
8548        SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
8549                ALC282_STANDARD_PINS,
8550                {0x12, 0x99a30130},
8551                {0x19, 0x03a11030},
8552                {0x21, 0x03211020}),
8553        SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
8554                ALC282_STANDARD_PINS,
8555                {0x12, 0x99a30130},
8556                {0x19, 0x04a11020},
8557                {0x21, 0x0421101f}),
8558        SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED,
8559                ALC282_STANDARD_PINS,
8560                {0x12, 0x90a60140},
8561                {0x19, 0x04a11030},
8562                {0x21, 0x04211020}),
8563        SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
8564                ALC282_STANDARD_PINS,
8565                {0x12, 0x90a60130},
8566                {0x21, 0x0321101f}),
8567        SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
8568                {0x12, 0x90a60160},
8569                {0x14, 0x90170120},
8570                {0x21, 0x02211030}),
8571        SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
8572                ALC282_STANDARD_PINS,
8573                {0x12, 0x90a60130},
8574                {0x19, 0x03a11020},
8575                {0x21, 0x0321101f}),
8576        SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
8577                {0x12, 0x90a60130},
8578                {0x14, 0x90170110},
8579                {0x19, 0x04a11040},
8580                {0x21, 0x04211020}),
8581        SND_HDA_PIN_QUIRK(0x10ec0286, 0x1025, "Acer", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
8582                {0x12, 0x90a60130},
8583                {0x17, 0x90170110},
8584                {0x21, 0x02211020}),
8585        SND_HDA_PIN_QUIRK(0x10ec0288, 0x1028, "Dell", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
8586                {0x12, 0x90a60120},
8587                {0x14, 0x90170110},
8588                {0x21, 0x0321101f}),
8589        SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
8590                ALC290_STANDARD_PINS,
8591                {0x15, 0x04211040},
8592                {0x18, 0x90170112},
8593                {0x1a, 0x04a11020}),
8594        SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
8595                ALC290_STANDARD_PINS,
8596                {0x15, 0x04211040},
8597                {0x18, 0x90170110},
8598                {0x1a, 0x04a11020}),
8599        SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
8600                ALC290_STANDARD_PINS,
8601                {0x15, 0x0421101f},
8602                {0x1a, 0x04a11020}),
8603        SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
8604                ALC290_STANDARD_PINS,
8605                {0x15, 0x04211020},
8606                {0x1a, 0x04a11040}),
8607        SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
8608                ALC290_STANDARD_PINS,
8609                {0x14, 0x90170110},
8610                {0x15, 0x04211020},
8611                {0x1a, 0x04a11040}),
8612        SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
8613                ALC290_STANDARD_PINS,
8614                {0x14, 0x90170110},
8615                {0x15, 0x04211020},
8616                {0x1a, 0x04a11020}),
8617        SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
8618                ALC290_STANDARD_PINS,
8619                {0x14, 0x90170110},
8620                {0x15, 0x0421101f},
8621                {0x1a, 0x04a11020}),
8622        SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
8623                ALC292_STANDARD_PINS,
8624                {0x12, 0x90a60140},
8625                {0x16, 0x01014020},
8626                {0x19, 0x01a19030}),
8627        SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
8628                ALC292_STANDARD_PINS,
8629                {0x12, 0x90a60140},
8630                {0x16, 0x01014020},
8631                {0x18, 0x02a19031},
8632                {0x19, 0x01a1903e}),
8633        SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
8634                ALC292_STANDARD_PINS,
8635                {0x12, 0x90a60140}),
8636        SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
8637                ALC292_STANDARD_PINS,
8638                {0x13, 0x90a60140},
8639                {0x16, 0x21014020},
8640                {0x19, 0x21a19030}),
8641        SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
8642                ALC292_STANDARD_PINS,
8643                {0x13, 0x90a60140}),
8644        SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_HPE,
8645                {0x17, 0x90170110},
8646                {0x21, 0x04211020}),
8647        SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_MIC,
8648                {0x14, 0x90170110},
8649                {0x1b, 0x90a70130},
8650                {0x21, 0x04211020}),
8651        SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
8652                {0x12, 0x90a60130},
8653                {0x17, 0x90170110},
8654                {0x21, 0x03211020}),
8655        SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
8656                {0x12, 0x90a60130},
8657                {0x17, 0x90170110},
8658                {0x21, 0x04211020}),
8659        SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
8660                {0x12, 0x90a60130},
8661                {0x17, 0x90170110},
8662                {0x21, 0x03211020}),
8663        SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
8664                {0x12, 0x90a60120},
8665                {0x17, 0x90170110},
8666                {0x21, 0x04211030}),
8667        SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
8668                {0x12, 0x90a60130},
8669                {0x17, 0x90170110},
8670                {0x21, 0x03211020}),
8671        SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
8672                {0x12, 0x90a60130},
8673                {0x17, 0x90170110},
8674                {0x21, 0x03211020}),
8675        SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
8676                {0x14, 0x90170110},
8677                {0x21, 0x04211020}),
8678        SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
8679                {0x14, 0x90170110},
8680                {0x21, 0x04211030}),
8681        SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
8682                ALC295_STANDARD_PINS,
8683                {0x17, 0x21014020},
8684                {0x18, 0x21a19030}),
8685        SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
8686                ALC295_STANDARD_PINS,
8687                {0x17, 0x21014040},
8688                {0x18, 0x21a19050}),
8689        SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
8690                ALC295_STANDARD_PINS),
8691        SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
8692                ALC298_STANDARD_PINS,
8693                {0x17, 0x90170110}),
8694        SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
8695                ALC298_STANDARD_PINS,
8696                {0x17, 0x90170140}),
8697        SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
8698                ALC298_STANDARD_PINS,
8699                {0x17, 0x90170150}),
8700        SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_SPK_VOLUME,
8701                {0x12, 0xb7a60140},
8702                {0x13, 0xb7a60150},
8703                {0x17, 0x90170110},
8704                {0x1a, 0x03011020},
8705                {0x21, 0x03211030}),
8706        SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
8707                {0x12, 0xb7a60140},
8708                {0x17, 0x90170110},
8709                {0x1a, 0x03a11030},
8710                {0x21, 0x03211020}),
8711        SND_HDA_PIN_QUIRK(0x10ec0299, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
8712                ALC225_STANDARD_PINS,
8713                {0x12, 0xb7a60130},
8714                {0x17, 0x90170110}),
8715        SND_HDA_PIN_QUIRK(0x10ec0623, 0x17aa, "Lenovo", ALC283_FIXUP_HEADSET_MIC,
8716                {0x14, 0x01014010},
8717                {0x17, 0x90170120},
8718                {0x18, 0x02a11030},
8719                {0x19, 0x02a1103f},
8720                {0x21, 0x0221101f}),
8721        {}
8722};
8723
8724/* This is the fallback pin_fixup_tbl for alc269 family, to make the tbl match
8725 * more machines, don't need to match all valid pins, just need to match
8726 * all the pins defined in the tbl. Just because of this reason, it is possible
8727 * that a single machine matches multiple tbls, so there is one limitation:
8728 *   at most one tbl is allowed to define for the same vendor and same codec
8729 */
8730static const struct snd_hda_pin_quirk alc269_fallback_pin_fixup_tbl[] = {
8731        SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
8732                {0x19, 0x40000000},
8733                {0x1b, 0x40000000}),
8734        SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8735                {0x19, 0x40000000},
8736                {0x1a, 0x40000000}),
8737        SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8738                {0x19, 0x40000000},
8739                {0x1a, 0x40000000}),
8740        SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
8741                {0x19, 0x40000000},
8742                {0x1a, 0x40000000}),
8743        {}
8744};
8745
8746static void alc269_fill_coef(struct hda_codec *codec)
8747{
8748        struct alc_spec *spec = codec->spec;
8749        int val;
8750
8751        if (spec->codec_variant != ALC269_TYPE_ALC269VB)
8752                return;
8753
8754        if ((alc_get_coef0(codec) & 0x00ff) < 0x015) {
8755                alc_write_coef_idx(codec, 0xf, 0x960b);
8756                alc_write_coef_idx(codec, 0xe, 0x8817);
8757        }
8758
8759        if ((alc_get_coef0(codec) & 0x00ff) == 0x016) {
8760                alc_write_coef_idx(codec, 0xf, 0x960b);
8761                alc_write_coef_idx(codec, 0xe, 0x8814);
8762        }
8763
8764        if ((alc_get_coef0(codec) & 0x00ff) == 0x017) {
8765                /* Power up output pin */
8766                alc_update_coef_idx(codec, 0x04, 0, 1<<11);
8767        }
8768
8769        if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {
8770                val = alc_read_coef_idx(codec, 0xd);
8771                if (val != -1 && (val & 0x0c00) >> 10 != 0x1) {
8772                        /* Capless ramp up clock control */
8773                        alc_write_coef_idx(codec, 0xd, val | (1<<10));
8774                }
8775                val = alc_read_coef_idx(codec, 0x17);
8776                if (val != -1 && (val & 0x01c0) >> 6 != 0x4) {
8777                        /* Class D power on reset */
8778                        alc_write_coef_idx(codec, 0x17, val | (1<<7));
8779                }
8780        }
8781
8782        /* HP */
8783        alc_update_coef_idx(codec, 0x4, 0, 1<<11);
8784}
8785
8786/*
8787 */
8788static int patch_alc269(struct hda_codec *codec)
8789{
8790        struct alc_spec *spec;
8791        int err;
8792
8793        err = alc_alloc_spec(codec, 0x0b);
8794        if (err < 0)
8795                return err;
8796
8797        spec = codec->spec;
8798        spec->gen.shared_mic_vref_pin = 0x18;
8799        codec->power_save_node = 0;
8800
8801#ifdef CONFIG_PM
8802        codec->patch_ops.suspend = alc269_suspend;
8803        codec->patch_ops.resume = alc269_resume;
8804#endif
8805        spec->shutup = alc_default_shutup;
8806        spec->init_hook = alc_default_init;
8807
8808        switch (codec->core.vendor_id) {
8809        case 0x10ec0269:
8810                spec->codec_variant = ALC269_TYPE_ALC269VA;
8811                switch (alc_get_coef0(codec) & 0x00f0) {
8812                case 0x0010:
8813                        if (codec->bus->pci &&
8814                            codec->bus->pci->subsystem_vendor == 0x1025 &&
8815                            spec->cdefine.platform_type == 1)
8816                                err = alc_codec_rename(codec, "ALC271X");
8817                        spec->codec_variant = ALC269_TYPE_ALC269VB;
8818                        break;
8819                case 0x0020:
8820                        if (codec->bus->pci &&
8821                            codec->bus->pci->subsystem_vendor == 0x17aa &&
8822                            codec->bus->pci->subsystem_device == 0x21f3)
8823                                err = alc_codec_rename(codec, "ALC3202");
8824                        spec->codec_variant = ALC269_TYPE_ALC269VC;
8825                        break;
8826                case 0x0030:
8827                        spec->codec_variant = ALC269_TYPE_ALC269VD;
8828                        break;
8829                default:
8830                        alc_fix_pll_init(codec, 0x20, 0x04, 15);
8831                }
8832                if (err < 0)
8833                        goto error;
8834                spec->shutup = alc269_shutup;
8835                spec->init_hook = alc269_fill_coef;
8836                alc269_fill_coef(codec);
8837                break;
8838
8839        case 0x10ec0280:
8840        case 0x10ec0290:
8841                spec->codec_variant = ALC269_TYPE_ALC280;
8842                break;
8843        case 0x10ec0282:
8844                spec->codec_variant = ALC269_TYPE_ALC282;
8845                spec->shutup = alc282_shutup;
8846                spec->init_hook = alc282_init;
8847                break;
8848        case 0x10ec0233:
8849        case 0x10ec0283:
8850                spec->codec_variant = ALC269_TYPE_ALC283;
8851                spec->shutup = alc283_shutup;
8852                spec->init_hook = alc283_init;
8853                break;
8854        case 0x10ec0284:
8855        case 0x10ec0292:
8856                spec->codec_variant = ALC269_TYPE_ALC284;
8857                break;
8858        case 0x10ec0293:
8859                spec->codec_variant = ALC269_TYPE_ALC293;
8860                break;
8861        case 0x10ec0286:
8862        case 0x10ec0288:
8863                spec->codec_variant = ALC269_TYPE_ALC286;
8864                break;
8865        case 0x10ec0298:
8866                spec->codec_variant = ALC269_TYPE_ALC298;
8867                break;
8868        case 0x10ec0235:
8869        case 0x10ec0255:
8870                spec->codec_variant = ALC269_TYPE_ALC255;
8871                spec->shutup = alc256_shutup;
8872                spec->init_hook = alc256_init;
8873                break;
8874        case 0x10ec0236:
8875        case 0x10ec0256:
8876                spec->codec_variant = ALC269_TYPE_ALC256;
8877                spec->shutup = alc256_shutup;
8878                spec->init_hook = alc256_init;
8879                spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */
8880                break;
8881        case 0x10ec0257:
8882                spec->codec_variant = ALC269_TYPE_ALC257;
8883                spec->shutup = alc256_shutup;
8884                spec->init_hook = alc256_init;
8885                spec->gen.mixer_nid = 0;
8886                break;
8887        case 0x10ec0215:
8888        case 0x10ec0245:
8889        case 0x10ec0285:
8890        case 0x10ec0287:
8891        case 0x10ec0289:
8892                spec->codec_variant = ALC269_TYPE_ALC215;
8893                spec->shutup = alc225_shutup;
8894                spec->init_hook = alc225_init;
8895                spec->gen.mixer_nid = 0;
8896                break;
8897        case 0x10ec0225:
8898        case 0x10ec0295:
8899        case 0x10ec0299:
8900                spec->codec_variant = ALC269_TYPE_ALC225;
8901                spec->shutup = alc225_shutup;
8902                spec->init_hook = alc225_init;
8903                spec->gen.mixer_nid = 0; /* no loopback on ALC225, ALC295 and ALC299 */
8904                break;
8905        case 0x10ec0234:
8906        case 0x10ec0274:
8907        case 0x10ec0294:
8908                spec->codec_variant = ALC269_TYPE_ALC294;
8909                spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */
8910                alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */
8911                spec->init_hook = alc294_init;
8912                break;
8913        case 0x10ec0300:
8914                spec->codec_variant = ALC269_TYPE_ALC300;
8915                spec->gen.mixer_nid = 0; /* no loopback on ALC300 */
8916                break;
8917        case 0x10ec0623:
8918                spec->codec_variant = ALC269_TYPE_ALC623;
8919                break;
8920        case 0x10ec0700:
8921        case 0x10ec0701:
8922        case 0x10ec0703:
8923        case 0x10ec0711:
8924                spec->codec_variant = ALC269_TYPE_ALC700;
8925                spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */
8926                alc_update_coef_idx(codec, 0x4a, 1 << 15, 0); /* Combo jack auto trigger control */
8927                spec->init_hook = alc294_init;
8928                break;
8929
8930        }
8931
8932        if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) {
8933                spec->has_alc5505_dsp = 1;
8934                spec->init_hook = alc5505_dsp_init;
8935        }
8936
8937        alc_pre_init(codec);
8938
8939        snd_hda_pick_fixup(codec, alc269_fixup_models,
8940                       alc269_fixup_tbl, alc269_fixups);
8941        snd_hda_pick_pin_fixup(codec, alc269_pin_fixup_tbl, alc269_fixups, true);
8942        snd_hda_pick_pin_fixup(codec, alc269_fallback_pin_fixup_tbl, alc269_fixups, false);
8943        snd_hda_pick_fixup(codec, NULL, alc269_fixup_vendor_tbl,
8944                           alc269_fixups);
8945        snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
8946
8947        alc_auto_parse_customize_define(codec);
8948
8949        if (has_cdefine_beep(codec))
8950                spec->gen.beep_nid = 0x01;
8951
8952        /* automatic parse from the BIOS config */
8953        err = alc269_parse_auto_config(codec);
8954        if (err < 0)
8955                goto error;
8956
8957        if (!spec->gen.no_analog && spec->gen.beep_nid && spec->gen.mixer_nid) {
8958                err = set_beep_amp(spec, spec->gen.mixer_nid, 0x04, HDA_INPUT);
8959                if (err < 0)
8960                        goto error;
8961        }
8962
8963        snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
8964
8965        return 0;
8966
8967 error:
8968        alc_free(codec);
8969        return err;
8970}
8971
8972/*
8973 * ALC861
8974 */
8975
8976static int alc861_parse_auto_config(struct hda_codec *codec)
8977{
8978        static const hda_nid_t alc861_ignore[] = { 0x1d, 0 };
8979        static const hda_nid_t alc861_ssids[] = { 0x0e, 0x0f, 0x0b, 0 };
8980        return alc_parse_auto_config(codec, alc861_ignore, alc861_ssids);
8981}
8982
8983/* Pin config fixes */
8984enum {
8985        ALC861_FIXUP_FSC_AMILO_PI1505,
8986        ALC861_FIXUP_AMP_VREF_0F,
8987        ALC861_FIXUP_NO_JACK_DETECT,
8988        ALC861_FIXUP_ASUS_A6RP,
8989        ALC660_FIXUP_ASUS_W7J,
8990};
8991
8992/* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */
8993static void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec,
8994                        const struct hda_fixup *fix, int action)
8995{
8996        struct alc_spec *spec = codec->spec;
8997        unsigned int val;
8998
8999        if (action != HDA_FIXUP_ACT_INIT)
9000                return;
9001        val = snd_hda_codec_get_pin_target(codec, 0x0f);
9002        if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)))
9003                val |= AC_PINCTL_IN_EN;
9004        val |= AC_PINCTL_VREF_50;
9005        snd_hda_set_pin_ctl(codec, 0x0f, val);
9006        spec->gen.keep_vref_in_automute = 1;
9007}
9008
9009/* suppress the jack-detection */
9010static void alc_fixup_no_jack_detect(struct hda_codec *codec,
9011                                     const struct hda_fixup *fix, int action)
9012{
9013        if (action == HDA_FIXUP_ACT_PRE_PROBE)
9014                codec->no_jack_detect = 1;
9015}
9016
9017static const struct hda_fixup alc861_fixups[] = {
9018        [ALC861_FIXUP_FSC_AMILO_PI1505] = {
9019                .type = HDA_FIXUP_PINS,
9020                .v.pins = (const struct hda_pintbl[]) {
9021                        { 0x0b, 0x0221101f }, /* HP */
9022                        { 0x0f, 0x90170310 }, /* speaker */
9023                        { }
9024                }
9025        },
9026        [ALC861_FIXUP_AMP_VREF_0F] = {
9027                .type = HDA_FIXUP_FUNC,
9028                .v.func = alc861_fixup_asus_amp_vref_0f,
9029        },
9030        [ALC861_FIXUP_NO_JACK_DETECT] = {
9031                .type = HDA_FIXUP_FUNC,
9032                .v.func = alc_fixup_no_jack_detect,
9033        },
9034        [ALC861_FIXUP_ASUS_A6RP] = {
9035                .type = HDA_FIXUP_FUNC,
9036                .v.func = alc861_fixup_asus_amp_vref_0f,
9037                .chained = true,
9038                .chain_id = ALC861_FIXUP_NO_JACK_DETECT,
9039        },
9040        [ALC660_FIXUP_ASUS_W7J] = {
9041                .type = HDA_FIXUP_VERBS,
9042                .v.verbs = (const struct hda_verb[]) {
9043                        /* ASUS W7J needs a magic pin setup on unused NID 0x10
9044                         * for enabling outputs
9045                         */
9046                        {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
9047                        { }
9048                },
9049        }
9050};
9051
9052static const struct snd_pci_quirk alc861_fixup_tbl[] = {
9053        SND_PCI_QUIRK(0x1043, 0x1253, "ASUS W7J", ALC660_FIXUP_ASUS_W7J),
9054        SND_PCI_QUIRK(0x1043, 0x1263, "ASUS Z35HL", ALC660_FIXUP_ASUS_W7J),
9055        SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP),
9056        SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", ALC861_FIXUP_AMP_VREF_0F),
9057        SND_PCI_QUIRK(0x1462, 0x7254, "HP DX2200", ALC861_FIXUP_NO_JACK_DETECT),
9058        SND_PCI_QUIRK(0x1584, 0x2b01, "Haier W18", ALC861_FIXUP_AMP_VREF_0F),
9059        SND_PCI_QUIRK(0x1584, 0x0000, "Uniwill ECS M31EI", ALC861_FIXUP_AMP_VREF_0F),
9060        SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", ALC861_FIXUP_FSC_AMILO_PI1505),
9061        {}
9062};
9063
9064/*
9065 */
9066static int patch_alc861(struct hda_codec *codec)
9067{
9068        struct alc_spec *spec;
9069        int err;
9070
9071        err = alc_alloc_spec(codec, 0x15);
9072        if (err < 0)
9073                return err;
9074
9075        spec = codec->spec;
9076        if (has_cdefine_beep(codec))
9077                spec->gen.beep_nid = 0x23;
9078
9079#ifdef CONFIG_PM
9080        spec->power_hook = alc_power_eapd;
9081#endif
9082
9083        alc_pre_init(codec);
9084
9085        snd_hda_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);
9086        snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
9087
9088        /* automatic parse from the BIOS config */
9089        err = alc861_parse_auto_config(codec);
9090        if (err < 0)
9091                goto error;
9092
9093        if (!spec->gen.no_analog) {
9094                err = set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
9095                if (err < 0)
9096                        goto error;
9097        }
9098
9099        snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
9100
9101        return 0;
9102
9103 error:
9104        alc_free(codec);
9105        return err;
9106}
9107
9108/*
9109 * ALC861-VD support
9110 *
9111 * Based on ALC882
9112 *
9113 * In addition, an independent DAC
9114 */
9115static int alc861vd_parse_auto_config(struct hda_codec *codec)
9116{
9117        static const hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
9118        static const hda_nid_t alc861vd_ssids[] = { 0x15, 0x1b, 0x14, 0 };
9119        return alc_parse_auto_config(codec, alc861vd_ignore, alc861vd_ssids);
9120}
9121
9122enum {
9123        ALC660VD_FIX_ASUS_GPIO1,
9124        ALC861VD_FIX_DALLAS,
9125};
9126
9127/* exclude VREF80 */
9128static void alc861vd_fixup_dallas(struct hda_codec *codec,
9129                                  const struct hda_fixup *fix, int action)
9130{
9131        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
9132                snd_hda_override_pin_caps(codec, 0x18, 0x00000734);
9133                snd_hda_override_pin_caps(codec, 0x19, 0x0000073c);
9134        }
9135}
9136
9137/* reset GPIO1 */
9138static void alc660vd_fixup_asus_gpio1(struct hda_codec *codec,
9139                                      const struct hda_fixup *fix, int action)
9140{
9141        struct alc_spec *spec = codec->spec;
9142
9143        if (action == HDA_FIXUP_ACT_PRE_PROBE)
9144                spec->gpio_mask |= 0x02;
9145        alc_fixup_gpio(codec, action, 0x01);
9146}
9147
9148static const struct hda_fixup alc861vd_fixups[] = {
9149        [ALC660VD_FIX_ASUS_GPIO1] = {
9150                .type = HDA_FIXUP_FUNC,
9151                .v.func = alc660vd_fixup_asus_gpio1,
9152        },
9153        [ALC861VD_FIX_DALLAS] = {
9154                .type = HDA_FIXUP_FUNC,
9155                .v.func = alc861vd_fixup_dallas,
9156        },
9157};
9158
9159static const struct snd_pci_quirk alc861vd_fixup_tbl[] = {
9160        SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_FIX_DALLAS),
9161        SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
9162        SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_FIX_DALLAS),
9163        {}
9164};
9165
9166/*
9167 */
9168static int patch_alc861vd(struct hda_codec *codec)
9169{
9170        struct alc_spec *spec;
9171        int err;
9172
9173        err = alc_alloc_spec(codec, 0x0b);
9174        if (err < 0)
9175                return err;
9176
9177        spec = codec->spec;
9178        if (has_cdefine_beep(codec))
9179                spec->gen.beep_nid = 0x23;
9180
9181        spec->shutup = alc_eapd_shutup;
9182
9183        alc_pre_init(codec);
9184
9185        snd_hda_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);
9186        snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
9187
9188        /* automatic parse from the BIOS config */
9189        err = alc861vd_parse_auto_config(codec);
9190        if (err < 0)
9191                goto error;
9192
9193        if (!spec->gen.no_analog) {
9194                err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
9195                if (err < 0)
9196                        goto error;
9197        }
9198
9199        snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
9200
9201        return 0;
9202
9203 error:
9204        alc_free(codec);
9205        return err;
9206}
9207
9208/*
9209 * ALC662 support
9210 *
9211 * ALC662 is almost identical with ALC880 but has cleaner and more flexible
9212 * configuration.  Each pin widget can choose any input DACs and a mixer.
9213 * Each ADC is connected from a mixer of all inputs.  This makes possible
9214 * 6-channel independent captures.
9215 *
9216 * In addition, an independent DAC for the multi-playback (not used in this
9217 * driver yet).
9218 */
9219
9220/*
9221 * BIOS auto configuration
9222 */
9223
9224static int alc662_parse_auto_config(struct hda_codec *codec)
9225{
9226        static const hda_nid_t alc662_ignore[] = { 0x1d, 0 };
9227        static const hda_nid_t alc663_ssids[] = { 0x15, 0x1b, 0x14, 0x21 };
9228        static const hda_nid_t alc662_ssids[] = { 0x15, 0x1b, 0x14, 0 };
9229        const hda_nid_t *ssids;
9230
9231        if (codec->core.vendor_id == 0x10ec0272 || codec->core.vendor_id == 0x10ec0663 ||
9232            codec->core.vendor_id == 0x10ec0665 || codec->core.vendor_id == 0x10ec0670 ||
9233            codec->core.vendor_id == 0x10ec0671)
9234                ssids = alc663_ssids;
9235        else
9236                ssids = alc662_ssids;
9237        return alc_parse_auto_config(codec, alc662_ignore, ssids);
9238}
9239
9240static void alc272_fixup_mario(struct hda_codec *codec,
9241                               const struct hda_fixup *fix, int action)
9242{
9243        if (action != HDA_FIXUP_ACT_PRE_PROBE)
9244                return;
9245        if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
9246                                      (0x3b << AC_AMPCAP_OFFSET_SHIFT) |
9247                                      (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |
9248                                      (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |
9249                                      (0 << AC_AMPCAP_MUTE_SHIFT)))
9250                codec_warn(codec, "failed to override amp caps for NID 0x2\n");
9251}
9252
9253static const struct snd_pcm_chmap_elem asus_pcm_2_1_chmaps[] = {
9254        { .channels = 2,
9255          .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
9256        { .channels = 4,
9257          .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
9258                   SNDRV_CHMAP_NA, SNDRV_CHMAP_LFE } }, /* LFE only on right */
9259        { }
9260};
9261
9262/* override the 2.1 chmap */
9263static void alc_fixup_bass_chmap(struct hda_codec *codec,
9264                                    const struct hda_fixup *fix, int action)
9265{
9266        if (action == HDA_FIXUP_ACT_BUILD) {
9267                struct alc_spec *spec = codec->spec;
9268                spec->gen.pcm_rec[0]->stream[0].chmap = asus_pcm_2_1_chmaps;
9269        }
9270}
9271
9272/* avoid D3 for keeping GPIO up */
9273static unsigned int gpio_led_power_filter(struct hda_codec *codec,
9274                                          hda_nid_t nid,
9275                                          unsigned int power_state)
9276{
9277        struct alc_spec *spec = codec->spec;
9278        if (nid == codec->core.afg && power_state == AC_PWRST_D3 && spec->gpio_data)
9279                return AC_PWRST_D0;
9280        return power_state;
9281}
9282
9283static void alc662_fixup_led_gpio1(struct hda_codec *codec,
9284                                   const struct hda_fixup *fix, int action)
9285{
9286        struct alc_spec *spec = codec->spec;
9287
9288        alc_fixup_hp_gpio_led(codec, action, 0x01, 0);
9289        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
9290                spec->mute_led_polarity = 1;
9291                codec->power_filter = gpio_led_power_filter;
9292        }
9293}
9294
9295static void alc662_usi_automute_hook(struct hda_codec *codec,
9296                                         struct hda_jack_callback *jack)
9297{
9298        struct alc_spec *spec = codec->spec;
9299        int vref;
9300        msleep(200);
9301        snd_hda_gen_hp_automute(codec, jack);
9302
9303        vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
9304        msleep(100);
9305        snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
9306                            vref);
9307}
9308
9309static void alc662_fixup_usi_headset_mic(struct hda_codec *codec,
9310                                     const struct hda_fixup *fix, int action)
9311{
9312        struct alc_spec *spec = codec->spec;
9313        if (action == HDA_FIXUP_ACT_PRE_PROBE) {
9314                spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
9315                spec->gen.hp_automute_hook = alc662_usi_automute_hook;
9316        }
9317}
9318
9319static void alc662_aspire_ethos_mute_speakers(struct hda_codec *codec,
9320                                        struct hda_jack_callback *cb)
9321{
9322        /* surround speakers at 0x1b already get muted automatically when
9323         * headphones are plugged in, but we have to mute/unmute the remaining
9324         * channels manually:
9325         * 0x15 - front left/front right
9326         * 0x18 - front center/ LFE
9327         */
9328        if (snd_hda_jack_detect_state(codec, 0x1b) == HDA_JACK_PRESENT) {
9329                snd_hda_set_pin_ctl_cache(codec, 0x15, 0);
9330                snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
9331        } else {
9332                snd_hda_set_pin_ctl_cache(codec, 0x15, PIN_OUT);
9333                snd_hda_set_pin_ctl_cache(codec, 0x18, PIN_OUT);
9334        }
9335}
9336
9337static void alc662_fixup_aspire_ethos_hp(struct hda_codec *codec,
9338                                        const struct hda_fixup *fix, int action)
9339{
9340    /* Pin 0x1b: shared headphones jack and surround speakers */
9341        if (!is_jack_detectable(codec, 0x1b))
9342                return;
9343
9344        switch (action) {
9345        case HDA_FIXUP_ACT_PRE_PROBE:
9346                snd_hda_jack_detect_enable_callback(codec, 0x1b,
9347                                alc662_aspire_ethos_mute_speakers);
9348                /* subwoofer needs an extra GPIO setting to become audible */
9349                alc_setup_gpio(codec, 0x02);
9350                break;
9351        case HDA_FIXUP_ACT_INIT:
9352                /* Make sure to start in a correct state, i.e. if
9353                 * headphones have been plugged in before powering up the system
9354                 */
9355                alc662_aspire_ethos_mute_speakers(codec, NULL);
9356                break;
9357        }
9358}
9359
9360static void alc671_fixup_hp_headset_mic2(struct hda_codec *codec,
9361                                             const struct hda_fixup *fix, int action)
9362{
9363        struct alc_spec *spec = codec->spec;
9364
9365        static const struct hda_pintbl pincfgs[] = {
9366                { 0x19, 0x02a11040 }, /* use as headset mic, with its own jack detect */
9367                { 0x1b, 0x0181304f },
9368                { }
9369        };
9370
9371        switch (action) {
9372        case HDA_FIXUP_ACT_PRE_PROBE:
9373                spec->gen.mixer_nid = 0;
9374                spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
9375                snd_hda_apply_pincfgs(codec, pincfgs);
9376                break;
9377        case HDA_FIXUP_ACT_INIT:
9378                alc_write_coef_idx(codec, 0x19, 0xa054);
9379                break;
9380        }
9381}
9382
9383static const struct coef_fw alc668_coefs[] = {
9384        WRITE_COEF(0x01, 0xbebe), WRITE_COEF(0x02, 0xaaaa), WRITE_COEF(0x03,    0x0),
9385        WRITE_COEF(0x04, 0x0180), WRITE_COEF(0x06,    0x0), WRITE_COEF(0x07, 0x0f80),
9386        WRITE_COEF(0x08, 0x0031), WRITE_COEF(0x0a, 0x0060), WRITE_COEF(0x0b,    0x0),
9387        WRITE_COEF(0x0c, 0x7cf7), WRITE_COEF(0x0d, 0x1080), WRITE_COEF(0x0e, 0x7f7f),
9388        WRITE_COEF(0x0f, 0xcccc), WRITE_COEF(0x10, 0xddcc), WRITE_COEF(0x11, 0x0001),
9389        WRITE_COEF(0x13,    0x0), WRITE_COEF(0x14, 0x2aa0), WRITE_COEF(0x17, 0xa940),
9390        WRITE_COEF(0x19,    0x0), WRITE_COEF(0x1a,    0x0), WRITE_COEF(0x1b,    0x0),
9391        WRITE_COEF(0x1c,    0x0), WRITE_COEF(0x1d,    0x0), WRITE_COEF(0x1e, 0x7418),
9392        WRITE_COEF(0x1f, 0x0804), WRITE_COEF(0x20, 0x4200), WRITE_COEF(0x21, 0x0468),
9393        WRITE_COEF(0x22, 0x8ccc), WRITE_COEF(0x23, 0x0250), WRITE_COEF(0x24, 0x7418),
9394        WRITE_COEF(0x27,    0x0), WRITE_COEF(0x28, 0x8ccc), WRITE_COEF(0x2a, 0xff00),
9395        WRITE_COEF(0x2b, 0x8000), WRITE_COEF(0xa7, 0xff00), WRITE_COEF(0xa8, 0x8000),
9396        WRITE_COEF(0xaa, 0x2e17), WRITE_COEF(0xab, 0xa0c0), WRITE_COEF(0xac,    0x0),
9397        WRITE_COEF(0xad,    0x0), WRITE_COEF(0xae, 0x2ac6), WRITE_COEF(0xaf, 0xa480),
9398        WRITE_COEF(0xb0,    0x0), WRITE_COEF(0xb1,    0x0), WRITE_COEF(0xb2,    0x0),
9399        WRITE_COEF(0xb3,    0x0), WRITE_COEF(0xb4,    0x0), WRITE_COEF(0xb5, 0x1040),
9400        WRITE_COEF(0xb6, 0xd697), WRITE_COEF(0xb7, 0x902b), WRITE_COEF(0xb8, 0xd697),
9401        WRITE_COEF(0xb9, 0x902b), WRITE_COEF(0xba, 0xb8ba), WRITE_COEF(0xbb, 0xaaab),
9402        WRITE_COEF(0xbc, 0xaaaf), WRITE_COEF(0xbd, 0x6aaa), WRITE_COEF(0xbe, 0x1c02),
9403        WRITE_COEF(0xc0, 0x00ff), WRITE_COEF(0xc1, 0x0fa6),
9404        {}
9405};
9406
9407static void alc668_restore_default_value(struct hda_codec *codec)
9408{
9409        alc_process_coef_fw(codec, alc668_coefs);
9410}
9411
9412enum {
9413        ALC662_FIXUP_ASPIRE,
9414        ALC662_FIXUP_LED_GPIO1,
9415        ALC662_FIXUP_IDEAPAD,
9416        ALC272_FIXUP_MARIO,
9417        ALC662_FIXUP_CZC_ET26,
9418        ALC662_FIXUP_CZC_P10T,
9419        ALC662_FIXUP_SKU_IGNORE,
9420        ALC662_FIXUP_HP_RP5800,
9421        ALC662_FIXUP_ASUS_MODE1,
9422        ALC662_FIXUP_ASUS_MODE2,
9423        ALC662_FIXUP_ASUS_MODE3,
9424        ALC662_FIXUP_ASUS_MODE4,
9425        ALC662_FIXUP_ASUS_MODE5,
9426        ALC662_FIXUP_ASUS_MODE6,
9427        ALC662_FIXUP_ASUS_MODE7,
9428        ALC662_FIXUP_ASUS_MODE8,
9429        ALC662_FIXUP_NO_JACK_DETECT,
9430        ALC662_FIXUP_ZOTAC_Z68,
9431        ALC662_FIXUP_INV_DMIC,
9432        ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
9433        ALC668_FIXUP_DELL_MIC_NO_PRESENCE,
9434        ALC662_FIXUP_HEADSET_MODE,
9435        ALC668_FIXUP_HEADSET_MODE,
9436        ALC662_FIXUP_BASS_MODE4_CHMAP,
9437        ALC662_FIXUP_BASS_16,
9438        ALC662_FIXUP_BASS_1A,
9439        ALC662_FIXUP_BASS_CHMAP,
9440        ALC668_FIXUP_AUTO_MUTE,
9441        ALC668_FIXUP_DELL_DISABLE_AAMIX,
9442        ALC668_FIXUP_DELL_XPS13,
9443        ALC662_FIXUP_ASUS_Nx50,
9444        ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
9445        ALC668_FIXUP_ASUS_Nx51,
9446        ALC668_FIXUP_MIC_COEF,
9447        ALC668_FIXUP_ASUS_G751,
9448        ALC891_FIXUP_HEADSET_MODE,
9449        ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
9450        ALC662_FIXUP_ACER_VERITON,
9451        ALC892_FIXUP_ASROCK_MOBO,
9452        ALC662_FIXUP_USI_FUNC,
9453        ALC662_FIXUP_USI_HEADSET_MODE,
9454        ALC662_FIXUP_LENOVO_MULTI_CODECS,
9455        ALC669_FIXUP_ACER_ASPIRE_ETHOS,
9456        ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET,
9457        ALC671_FIXUP_HP_HEADSET_MIC2,
9458        ALC662_FIXUP_ACER_X2660G_HEADSET_MODE,
9459        ALC662_FIXUP_ACER_NITRO_HEADSET_MODE,
9460};
9461
9462static const struct hda_fixup alc662_fixups[] = {
9463        [ALC662_FIXUP_ASPIRE] = {
9464                .type = HDA_FIXUP_PINS,
9465                .v.pins = (const struct hda_pintbl[]) {
9466                        { 0x15, 0x99130112 }, /* subwoofer */
9467                        { }
9468                }
9469        },
9470        [ALC662_FIXUP_LED_GPIO1] = {
9471                .type = HDA_FIXUP_FUNC,
9472                .v.func = alc662_fixup_led_gpio1,
9473        },
9474        [ALC662_FIXUP_IDEAPAD] = {
9475                .type = HDA_FIXUP_PINS,
9476                .v.pins = (const struct hda_pintbl[]) {
9477                        { 0x17, 0x99130112 }, /* subwoofer */
9478                        { }
9479                },
9480                .chained = true,
9481                .chain_id = ALC662_FIXUP_LED_GPIO1,
9482        },
9483        [ALC272_FIXUP_MARIO] = {
9484                .type = HDA_FIXUP_FUNC,
9485                .v.func = alc272_fixup_mario,
9486        },
9487        [ALC662_FIXUP_CZC_ET26] = {
9488                .type = HDA_FIXUP_PINS,
9489                .v.pins = (const struct hda_pintbl[]) {
9490                        {0x12, 0x403cc000},
9491                        {0x14, 0x90170110}, /* speaker */
9492                        {0x15, 0x411111f0},
9493                        {0x16, 0x411111f0},
9494                        {0x18, 0x01a19030}, /* mic */
9495                        {0x19, 0x90a7013f}, /* int-mic */
9496                        {0x1a, 0x01014020},
9497                        {0x1b, 0x0121401f},
9498                        {0x1c, 0x411111f0},
9499                        {0x1d, 0x411111f0},
9500                        {0x1e, 0x40478e35},
9501                        {}
9502                },
9503                .chained = true,
9504                .chain_id = ALC662_FIXUP_SKU_IGNORE
9505        },
9506        [ALC662_FIXUP_CZC_P10T] = {
9507                .type = HDA_FIXUP_VERBS,
9508                .v.verbs = (const struct hda_verb[]) {
9509                        {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
9510                        {}
9511                }
9512        },
9513        [ALC662_FIXUP_SKU_IGNORE] = {
9514                .type = HDA_FIXUP_FUNC,
9515                .v.func = alc_fixup_sku_ignore,
9516        },
9517        [ALC662_FIXUP_HP_RP5800] = {
9518                .type = HDA_FIXUP_PINS,
9519                .v.pins = (const struct hda_pintbl[]) {
9520                        { 0x14, 0x0221201f }, /* HP out */
9521                        { }
9522                },
9523                .chained = true,
9524                .chain_id = ALC662_FIXUP_SKU_IGNORE
9525        },
9526        [ALC662_FIXUP_ASUS_MODE1] = {
9527                .type = HDA_FIXUP_PINS,
9528                .v.pins = (const struct hda_pintbl[]) {
9529                        { 0x14, 0x99130110 }, /* speaker */
9530                        { 0x18, 0x01a19c20 }, /* mic */
9531                        { 0x19, 0x99a3092f }, /* int-mic */
9532                        { 0x21, 0x0121401f }, /* HP out */
9533                        { }
9534                },
9535                .chained = true,
9536                .chain_id = ALC662_FIXUP_SKU_IGNORE
9537        },
9538        [ALC662_FIXUP_ASUS_MODE2] = {
9539                .type = HDA_FIXUP_PINS,
9540                .v.pins = (const struct hda_pintbl[]) {
9541                        { 0x14, 0x99130110 }, /* speaker */
9542                        { 0x18, 0x01a19820 }, /* mic */
9543                        { 0x19, 0x99a3092f }, /* int-mic */
9544                        { 0x1b, 0x0121401f }, /* HP out */
9545                        { }
9546                },
9547                .chained = true,
9548                .chain_id = ALC662_FIXUP_SKU_IGNORE
9549        },
9550        [ALC662_FIXUP_ASUS_MODE3] = {
9551                .type = HDA_FIXUP_PINS,
9552                .v.pins = (const struct hda_pintbl[]) {
9553                        { 0x14, 0x99130110 }, /* speaker */
9554                        { 0x15, 0x0121441f }, /* HP */
9555                        { 0x18, 0x01a19840 }, /* mic */
9556                        { 0x19, 0x99a3094f }, /* int-mic */
9557                        { 0x21, 0x01211420 }, /* HP2 */
9558                        { }
9559                },
9560                .chained = true,
9561                .chain_id = ALC662_FIXUP_SKU_IGNORE
9562        },
9563        [ALC662_FIXUP_ASUS_MODE4] = {
9564                .type = HDA_FIXUP_PINS,
9565                .v.pins = (const struct hda_pintbl[]) {
9566                        { 0x14, 0x99130110 }, /* speaker */
9567                        { 0x16, 0x99130111 }, /* speaker */
9568                        { 0x18, 0x01a19840 }, /* mic */
9569                        { 0x19, 0x99a3094f }, /* int-mic */
9570                        { 0x21, 0x0121441f }, /* HP */
9571                        { }
9572                },
9573                .chained = true,
9574                .chain_id = ALC662_FIXUP_SKU_IGNORE
9575        },
9576        [ALC662_FIXUP_ASUS_MODE5] = {
9577                .type = HDA_FIXUP_PINS,
9578                .v.pins = (const struct hda_pintbl[]) {
9579                        { 0x14, 0x99130110 }, /* speaker */
9580                        { 0x15, 0x0121441f }, /* HP */
9581                        { 0x16, 0x99130111 }, /* speaker */
9582                        { 0x18, 0x01a19840 }, /* mic */
9583                        { 0x19, 0x99a3094f }, /* int-mic */
9584                        { }
9585                },
9586                .chained = true,
9587                .chain_id = ALC662_FIXUP_SKU_IGNORE
9588        },
9589        [ALC662_FIXUP_ASUS_MODE6] = {
9590                .type = HDA_FIXUP_PINS,
9591                .v.pins = (const struct hda_pintbl[]) {
9592                        { 0x14, 0x99130110 }, /* speaker */
9593                        { 0x15, 0x01211420 }, /* HP2 */
9594                        { 0x18, 0x01a19840 }, /* mic */
9595                        { 0x19, 0x99a3094f }, /* int-mic */
9596                        { 0x1b, 0x0121441f }, /* HP */
9597                        { }
9598                },
9599                .chained = true,
9600                .chain_id = ALC662_FIXUP_SKU_IGNORE
9601        },
9602        [ALC662_FIXUP_ASUS_MODE7] = {
9603                .type = HDA_FIXUP_PINS,
9604                .v.pins = (const struct hda_pintbl[]) {
9605                        { 0x14, 0x99130110 }, /* speaker */
9606                        { 0x17, 0x99130111 }, /* speaker */
9607                        { 0x18, 0x01a19840 }, /* mic */
9608                        { 0x19, 0x99a3094f }, /* int-mic */
9609                        { 0x1b, 0x01214020 }, /* HP */
9610                        { 0x21, 0x0121401f }, /* HP */
9611                        { }
9612                },
9613                .chained = true,
9614                .chain_id = ALC662_FIXUP_SKU_IGNORE
9615        },
9616        [ALC662_FIXUP_ASUS_MODE8] = {
9617                .type = HDA_FIXUP_PINS,
9618                .v.pins = (const struct hda_pintbl[]) {
9619                        { 0x14, 0x99130110 }, /* speaker */
9620                        { 0x12, 0x99a30970 }, /* int-mic */
9621                        { 0x15, 0x01214020 }, /* HP */
9622                        { 0x17, 0x99130111 }, /* speaker */
9623                        { 0x18, 0x01a19840 }, /* mic */
9624                        { 0x21, 0x0121401f }, /* HP */
9625                        { }
9626                },
9627                .chained = true,
9628                .chain_id = ALC662_FIXUP_SKU_IGNORE
9629        },
9630        [ALC662_FIXUP_NO_JACK_DETECT] = {
9631                .type = HDA_FIXUP_FUNC,
9632                .v.func = alc_fixup_no_jack_detect,
9633        },
9634        [ALC662_FIXUP_ZOTAC_Z68] = {
9635                .type = HDA_FIXUP_PINS,
9636                .v.pins = (const struct hda_pintbl[]) {
9637                        { 0x1b, 0x02214020 }, /* Front HP */
9638                        { }
9639                }
9640        },
9641        [ALC662_FIXUP_INV_DMIC] = {
9642                .type = HDA_FIXUP_FUNC,
9643                .v.func = alc_fixup_inv_dmic,
9644        },
9645        [ALC668_FIXUP_DELL_XPS13] = {
9646                .type = HDA_FIXUP_FUNC,
9647                .v.func = alc_fixup_dell_xps13,
9648                .chained = true,
9649                .chain_id = ALC668_FIXUP_DELL_DISABLE_AAMIX
9650        },
9651        [ALC668_FIXUP_DELL_DISABLE_AAMIX] = {
9652                .type = HDA_FIXUP_FUNC,
9653                .v.func = alc_fixup_disable_aamix,
9654                .chained = true,
9655                .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
9656        },
9657        [ALC668_FIXUP_AUTO_MUTE] = {
9658                .type = HDA_FIXUP_FUNC,
9659                .v.func = alc_fixup_auto_mute_via_amp,
9660                .chained = true,
9661                .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
9662        },
9663        [ALC662_FIXUP_DELL_MIC_NO_PRESENCE] = {
9664                .type = HDA_FIXUP_PINS,
9665                .v.pins = (const struct hda_pintbl[]) {
9666                        { 0x19, 0x03a1113c }, /* use as headset mic, without its own jack detect */
9667                        /* headphone mic by setting pin control of 0x1b (headphone out) to in + vref_50 */
9668                        { }
9669                },
9670                .chained = true,
9671                .chain_id = ALC662_FIXUP_HEADSET_MODE
9672        },
9673        [ALC662_FIXUP_HEADSET_MODE] = {
9674                .type = HDA_FIXUP_FUNC,
9675                .v.func = alc_fixup_headset_mode_alc662,
9676        },
9677        [ALC668_FIXUP_DELL_MIC_NO_PRESENCE] = {
9678                .type = HDA_FIXUP_PINS,
9679                .v.pins = (const struct hda_pintbl[]) {
9680                        { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
9681                        { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
9682                        { }
9683                },
9684                .chained = true,
9685                .chain_id = ALC668_FIXUP_HEADSET_MODE
9686        },
9687        [ALC668_FIXUP_HEADSET_MODE] = {
9688                .type = HDA_FIXUP_FUNC,
9689                .v.func = alc_fixup_headset_mode_alc668,
9690        },
9691        [ALC662_FIXUP_BASS_MODE4_CHMAP] = {
9692                .type = HDA_FIXUP_FUNC,
9693                .v.func = alc_fixup_bass_chmap,
9694                .chained = true,
9695                .chain_id = ALC662_FIXUP_ASUS_MODE4
9696        },
9697        [ALC662_FIXUP_BASS_16] = {
9698                .type = HDA_FIXUP_PINS,
9699                .v.pins = (const struct hda_pintbl[]) {
9700                        {0x16, 0x80106111}, /* bass speaker */
9701                        {}
9702                },
9703                .chained = true,
9704                .chain_id = ALC662_FIXUP_BASS_CHMAP,
9705        },
9706        [ALC662_FIXUP_BASS_1A] = {
9707                .type = HDA_FIXUP_PINS,
9708                .v.pins = (const struct hda_pintbl[]) {
9709                        {0x1a, 0x80106111}, /* bass speaker */
9710                        {}
9711                },
9712                .chained = true,
9713                .chain_id = ALC662_FIXUP_BASS_CHMAP,
9714        },
9715        [ALC662_FIXUP_BASS_CHMAP] = {
9716                .type = HDA_FIXUP_FUNC,
9717                .v.func = alc_fixup_bass_chmap,
9718        },
9719        [ALC662_FIXUP_ASUS_Nx50] = {
9720                .type = HDA_FIXUP_FUNC,
9721                .v.func = alc_fixup_auto_mute_via_amp,
9722                .chained = true,
9723                .chain_id = ALC662_FIXUP_BASS_1A
9724        },
9725        [ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE] = {
9726                .type = HDA_FIXUP_FUNC,
9727                .v.func = alc_fixup_headset_mode_alc668,
9728                .chain_id = ALC662_FIXUP_BASS_CHMAP
9729        },
9730        [ALC668_FIXUP_ASUS_Nx51] = {
9731                .type = HDA_FIXUP_PINS,
9732                .v.pins = (const struct hda_pintbl[]) {
9733                        { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
9734                        { 0x1a, 0x90170151 }, /* bass speaker */
9735                        { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
9736                        {}
9737                },
9738                .chained = true,
9739                .chain_id = ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
9740        },
9741        [ALC668_FIXUP_MIC_COEF] = {
9742                .type = HDA_FIXUP_VERBS,
9743                .v.verbs = (const struct hda_verb[]) {
9744                        { 0x20, AC_VERB_SET_COEF_INDEX, 0xc3 },
9745                        { 0x20, AC_VERB_SET_PROC_COEF, 0x4000 },
9746                        {}
9747                },
9748        },
9749        [ALC668_FIXUP_ASUS_G751] = {
9750                .type = HDA_FIXUP_PINS,
9751                .v.pins = (const struct hda_pintbl[]) {
9752                        { 0x16, 0x0421101f }, /* HP */
9753                        {}
9754                },
9755                .chained = true,
9756                .chain_id = ALC668_FIXUP_MIC_COEF
9757        },
9758        [ALC891_FIXUP_HEADSET_MODE] = {
9759                .type = HDA_FIXUP_FUNC,
9760                .v.func = alc_fixup_headset_mode,
9761        },
9762        [ALC891_FIXUP_DELL_MIC_NO_PRESENCE] = {
9763                .type = HDA_FIXUP_PINS,
9764                .v.pins = (const struct hda_pintbl[]) {
9765                        { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
9766                        { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
9767                        { }
9768                },
9769                .chained = true,
9770                .chain_id = ALC891_FIXUP_HEADSET_MODE
9771        },
9772        [ALC662_FIXUP_ACER_VERITON] = {
9773                .type = HDA_FIXUP_PINS,
9774                .v.pins = (const struct hda_pintbl[]) {
9775                        { 0x15, 0x50170120 }, /* no internal speaker */
9776                        { }
9777                }
9778        },
9779        [ALC892_FIXUP_ASROCK_MOBO] = {
9780                .type = HDA_FIXUP_PINS,
9781                .v.pins = (const struct hda_pintbl[]) {
9782                        { 0x15, 0x40f000f0 }, /* disabled */
9783                        { 0x16, 0x40f000f0 }, /* disabled */
9784                        { }
9785                }
9786        },
9787        [ALC662_FIXUP_USI_FUNC] = {
9788                .type = HDA_FIXUP_FUNC,
9789                .v.func = alc662_fixup_usi_headset_mic,
9790        },
9791        [ALC662_FIXUP_USI_HEADSET_MODE] = {
9792                .type = HDA_FIXUP_PINS,
9793                .v.pins = (const struct hda_pintbl[]) {
9794                        { 0x19, 0x02a1913c }, /* use as headset mic, without its own jack detect */
9795                        { 0x18, 0x01a1903d },
9796                        { }
9797                },
9798                .chained = true,
9799                .chain_id = ALC662_FIXUP_USI_FUNC
9800        },
9801        [ALC662_FIXUP_LENOVO_MULTI_CODECS] = {
9802                .type = HDA_FIXUP_FUNC,
9803                .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
9804        },
9805        [ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET] = {
9806                .type = HDA_FIXUP_FUNC,
9807                .v.func = alc662_fixup_aspire_ethos_hp,
9808        },
9809        [ALC669_FIXUP_ACER_ASPIRE_ETHOS] = {
9810                .type = HDA_FIXUP_PINS,
9811                .v.pins = (const struct hda_pintbl[]) {
9812                        { 0x15, 0x92130110 }, /* front speakers */
9813                        { 0x18, 0x99130111 }, /* center/subwoofer */
9814                        { 0x1b, 0x11130012 }, /* surround plus jack for HP */
9815                        { }
9816                },
9817                .chained = true,
9818                .chain_id = ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET
9819        },
9820        [ALC671_FIXUP_HP_HEADSET_MIC2] = {
9821                .type = HDA_FIXUP_FUNC,
9822                .v.func = alc671_fixup_hp_headset_mic2,
9823        },
9824        [ALC662_FIXUP_ACER_X2660G_HEADSET_MODE] = {
9825                .type = HDA_FIXUP_PINS,
9826                .v.pins = (const struct hda_pintbl[]) {
9827                        { 0x1a, 0x02a1113c }, /* use as headset mic, without its own jack detect */
9828                        { }
9829                },
9830                .chained = true,
9831                .chain_id = ALC662_FIXUP_USI_FUNC
9832        },
9833        [ALC662_FIXUP_ACER_NITRO_HEADSET_MODE] = {
9834                .type = HDA_FIXUP_PINS,
9835                .v.pins = (const struct hda_pintbl[]) {
9836                        { 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */
9837                        { 0x1b, 0x0221144f },
9838                        { }
9839                },
9840                .chained = true,
9841                .chain_id = ALC662_FIXUP_USI_FUNC
9842        },
9843};
9844
9845static const struct snd_pci_quirk alc662_fixup_tbl[] = {
9846        SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2),
9847        SND_PCI_QUIRK(0x1025, 0x022f, "Acer Aspire One", ALC662_FIXUP_INV_DMIC),
9848        SND_PCI_QUIRK(0x1025, 0x0241, "Packard Bell DOTS", ALC662_FIXUP_INV_DMIC),
9849        SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
9850        SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),
9851        SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC),
9852        SND_PCI_QUIRK(0x1025, 0x034a, "Gateway LT27", ALC662_FIXUP_INV_DMIC),
9853        SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
9854        SND_PCI_QUIRK(0x1025, 0x123c, "Acer Nitro N50-600", ALC662_FIXUP_ACER_NITRO_HEADSET_MODE),
9855        SND_PCI_QUIRK(0x1025, 0x124e, "Acer 2660G", ALC662_FIXUP_ACER_X2660G_HEADSET_MODE),
9856        SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
9857        SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
9858        SND_PCI_QUIRK(0x1028, 0x05fe, "Dell XPS 15", ALC668_FIXUP_DELL_XPS13),
9859        SND_PCI_QUIRK(0x1028, 0x060a, "Dell XPS 13", ALC668_FIXUP_DELL_XPS13),
9860        SND_PCI_QUIRK(0x1028, 0x060d, "Dell M3800", ALC668_FIXUP_DELL_XPS13),
9861        SND_PCI_QUIRK(0x1028, 0x0625, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
9862        SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
9863        SND_PCI_QUIRK(0x1028, 0x0696, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
9864        SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
9865        SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
9866        SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
9867        SND_PCI_QUIRK(0x103c, 0x873e, "HP", ALC671_FIXUP_HP_HEADSET_MIC2),
9868        SND_PCI_QUIRK(0x1043, 0x1080, "Asus UX501VW", ALC668_FIXUP_HEADSET_MODE),
9869        SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_ASUS_Nx50),
9870        SND_PCI_QUIRK(0x1043, 0x13df, "Asus N550JX", ALC662_FIXUP_BASS_1A),
9871        SND_PCI_QUIRK(0x1043, 0x129d, "Asus N750", ALC662_FIXUP_ASUS_Nx50),
9872        SND_PCI_QUIRK(0x1043, 0x12ff, "ASUS G751", ALC668_FIXUP_ASUS_G751),
9873        SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
9874        SND_PCI_QUIRK(0x1043, 0x15a7, "ASUS UX51VZH", ALC662_FIXUP_BASS_16),
9875        SND_PCI_QUIRK(0x1043, 0x177d, "ASUS N551", ALC668_FIXUP_ASUS_Nx51),
9876        SND_PCI_QUIRK(0x1043, 0x17bd, "ASUS N751", ALC668_FIXUP_ASUS_Nx51),
9877        SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71SL", ALC662_FIXUP_ASUS_MODE8),
9878        SND_PCI_QUIRK(0x1043, 0x1b73, "ASUS N55SF", ALC662_FIXUP_BASS_16),
9879        SND_PCI_QUIRK(0x1043, 0x1bf3, "ASUS N76VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
9880        SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),
9881        SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
9882        SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
9883        SND_PCI_QUIRK(0x14cd, 0x5003, "USI", ALC662_FIXUP_USI_HEADSET_MODE),
9884        SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC662_FIXUP_LENOVO_MULTI_CODECS),
9885        SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
9886        SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
9887        SND_PCI_QUIRK(0x1849, 0x5892, "ASRock B150M", ALC892_FIXUP_ASROCK_MOBO),
9888        SND_PCI_QUIRK(0x19da, 0xa130, "Zotac Z68", ALC662_FIXUP_ZOTAC_Z68),
9889        SND_PCI_QUIRK(0x1b0a, 0x01b8, "ACER Veriton", ALC662_FIXUP_ACER_VERITON),
9890        SND_PCI_QUIRK(0x1b35, 0x1234, "CZC ET26", ALC662_FIXUP_CZC_ET26),
9891        SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
9892        SND_PCI_QUIRK(0x1025, 0x0566, "Acer Aspire Ethos 8951G", ALC669_FIXUP_ACER_ASPIRE_ETHOS),
9893
9894#if 0
9895        /* Below is a quirk table taken from the old code.
9896         * Basically the device should work as is without the fixup table.
9897         * If BIOS doesn't give a proper info, enable the corresponding
9898         * fixup entry.
9899         */
9900        SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1),
9901        SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3),
9902        SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1),
9903        SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC662_FIXUP_ASUS_MODE3),
9904        SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
9905        SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9906        SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
9907        SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC662_FIXUP_ASUS_MODE1),
9908        SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC662_FIXUP_ASUS_MODE1),
9909        SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9910        SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC662_FIXUP_ASUS_MODE7),
9911        SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC662_FIXUP_ASUS_MODE7),
9912        SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC662_FIXUP_ASUS_MODE8),
9913        SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC662_FIXUP_ASUS_MODE3),
9914        SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC662_FIXUP_ASUS_MODE1),
9915        SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9916        SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_FIXUP_ASUS_MODE2),
9917        SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC662_FIXUP_ASUS_MODE1),
9918        SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9919        SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
9920        SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
9921        SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9922        SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC662_FIXUP_ASUS_MODE1),
9923        SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC662_FIXUP_ASUS_MODE3),
9924        SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_FIXUP_ASUS_MODE2),
9925        SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9926        SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC662_FIXUP_ASUS_MODE5),
9927        SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
9928        SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9929        SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC662_FIXUP_ASUS_MODE1),
9930        SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9931        SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9932        SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC662_FIXUP_ASUS_MODE3),
9933        SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC662_FIXUP_ASUS_MODE3),
9934        SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC662_FIXUP_ASUS_MODE1),
9935        SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC662_FIXUP_ASUS_MODE1),
9936        SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC662_FIXUP_ASUS_MODE1),
9937        SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC662_FIXUP_ASUS_MODE1),
9938        SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC662_FIXUP_ASUS_MODE1),
9939        SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9940        SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_FIXUP_ASUS_MODE2),
9941        SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC662_FIXUP_ASUS_MODE1),
9942        SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
9943        SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC662_FIXUP_ASUS_MODE3),
9944        SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC662_FIXUP_ASUS_MODE1),
9945        SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC662_FIXUP_ASUS_MODE1),
9946        SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC662_FIXUP_ASUS_MODE1),
9947        SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_FIXUP_ASUS_MODE2),
9948        SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
9949        SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE4),
9950#endif
9951        {}
9952};
9953
9954static const struct hda_model_fixup alc662_fixup_models[] = {
9955        {.id = ALC662_FIXUP_ASPIRE, .name = "aspire"},
9956        {.id = ALC662_FIXUP_IDEAPAD, .name = "ideapad"},
9957        {.id = ALC272_FIXUP_MARIO, .name = "mario"},
9958        {.id = ALC662_FIXUP_HP_RP5800, .name = "hp-rp5800"},
9959        {.id = ALC662_FIXUP_ASUS_MODE1, .name = "asus-mode1"},
9960        {.id = ALC662_FIXUP_ASUS_MODE2, .name = "asus-mode2"},
9961        {.id = ALC662_FIXUP_ASUS_MODE3, .name = "asus-mode3"},
9962        {.id = ALC662_FIXUP_ASUS_MODE4, .name = "asus-mode4"},
9963        {.id = ALC662_FIXUP_ASUS_MODE5, .name = "asus-mode5"},
9964        {.id = ALC662_FIXUP_ASUS_MODE6, .name = "asus-mode6"},
9965        {.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},
9966        {.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},
9967        {.id = ALC662_FIXUP_ZOTAC_Z68, .name = "zotac-z68"},
9968        {.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"},
9969        {.id = ALC662_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc662-headset-multi"},
9970        {.id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
9971        {.id = ALC662_FIXUP_HEADSET_MODE, .name = "alc662-headset"},
9972        {.id = ALC668_FIXUP_HEADSET_MODE, .name = "alc668-headset"},
9973        {.id = ALC662_FIXUP_BASS_16, .name = "bass16"},
9974        {.id = ALC662_FIXUP_BASS_1A, .name = "bass1a"},
9975        {.id = ALC668_FIXUP_AUTO_MUTE, .name = "automute"},
9976        {.id = ALC668_FIXUP_DELL_XPS13, .name = "dell-xps13"},
9977        {.id = ALC662_FIXUP_ASUS_Nx50, .name = "asus-nx50"},
9978        {.id = ALC668_FIXUP_ASUS_Nx51, .name = "asus-nx51"},
9979        {.id = ALC668_FIXUP_ASUS_G751, .name = "asus-g751"},
9980        {.id = ALC891_FIXUP_HEADSET_MODE, .name = "alc891-headset"},
9981        {.id = ALC891_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc891-headset-multi"},
9982        {.id = ALC662_FIXUP_ACER_VERITON, .name = "acer-veriton"},
9983        {.id = ALC892_FIXUP_ASROCK_MOBO, .name = "asrock-mobo"},
9984        {.id = ALC662_FIXUP_USI_HEADSET_MODE, .name = "usi-headset"},
9985        {.id = ALC662_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
9986        {.id = ALC669_FIXUP_ACER_ASPIRE_ETHOS, .name = "aspire-ethos"},
9987        {}
9988};
9989
9990static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = {
9991        SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
9992                {0x17, 0x02211010},
9993                {0x18, 0x01a19030},
9994                {0x1a, 0x01813040},
9995                {0x21, 0x01014020}),
9996        SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
9997                {0x16, 0x01813030},
9998                {0x17, 0x02211010},
9999                {0x18, 0x01a19040},
10000                {0x21, 0x01014020}),
10001        SND_HDA_PIN_QUIRK(0x10ec0662, 0x1028, "Dell", ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
10002                {0x14, 0x01014010},
10003                {0x18, 0x01a19020},
10004                {0x1a, 0x0181302f},
10005                {0x1b, 0x0221401f}),
10006        SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
10007                {0x12, 0x99a30130},
10008                {0x14, 0x90170110},
10009                {0x15, 0x0321101f},
10010                {0x16, 0x03011020}),
10011        SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
10012                {0x12, 0x99a30140},
10013                {0x14, 0x90170110},
10014                {0x15, 0x0321101f},
10015                {0x16, 0x03011020}),
10016        SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
10017                {0x12, 0x99a30150},
10018                {0x14, 0x90170110},
10019                {0x15, 0x0321101f},
10020                {0x16, 0x03011020}),
10021        SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
10022                {0x14, 0x90170110},
10023                {0x15, 0x0321101f},
10024                {0x16, 0x03011020}),
10025        SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell XPS 15", ALC668_FIXUP_AUTO_MUTE,
10026                {0x12, 0x90a60130},
10027                {0x14, 0x90170110},
10028                {0x15, 0x0321101f}),
10029        SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
10030                {0x14, 0x01014010},
10031                {0x17, 0x90170150},
10032                {0x19, 0x02a11060},
10033                {0x1b, 0x01813030},
10034                {0x21, 0x02211020}),
10035        SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
10036                {0x14, 0x01014010},
10037                {0x18, 0x01a19040},
10038                {0x1b, 0x01813030},
10039                {0x21, 0x02211020}),
10040        SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
10041                {0x14, 0x01014020},
10042                {0x17, 0x90170110},
10043                {0x18, 0x01a19050},
10044                {0x1b, 0x01813040},
10045                {0x21, 0x02211030}),
10046        {}
10047};
10048
10049/*
10050 */
10051static int patch_alc662(struct hda_codec *codec)
10052{
10053        struct alc_spec *spec;
10054        int err;
10055
10056        err = alc_alloc_spec(codec, 0x0b);
10057        if (err < 0)
10058                return err;
10059
10060        spec = codec->spec;
10061
10062        spec->shutup = alc_eapd_shutup;
10063
10064        /* handle multiple HPs as is */
10065        spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
10066
10067        alc_fix_pll_init(codec, 0x20, 0x04, 15);
10068
10069        switch (codec->core.vendor_id) {
10070        case 0x10ec0668:
10071                spec->init_hook = alc668_restore_default_value;
10072                break;
10073        }
10074
10075        alc_pre_init(codec);
10076
10077        snd_hda_pick_fixup(codec, alc662_fixup_models,
10078                       alc662_fixup_tbl, alc662_fixups);
10079        snd_hda_pick_pin_fixup(codec, alc662_pin_fixup_tbl, alc662_fixups, true);
10080        snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
10081
10082        alc_auto_parse_customize_define(codec);
10083
10084        if (has_cdefine_beep(codec))
10085                spec->gen.beep_nid = 0x01;
10086
10087        if ((alc_get_coef0(codec) & (1 << 14)) &&
10088            codec->bus->pci && codec->bus->pci->subsystem_vendor == 0x1025 &&
10089            spec->cdefine.platform_type == 1) {
10090                err = alc_codec_rename(codec, "ALC272X");
10091                if (err < 0)
10092                        goto error;
10093        }
10094
10095        /* automatic parse from the BIOS config */
10096        err = alc662_parse_auto_config(codec);
10097        if (err < 0)
10098                goto error;
10099
10100        if (!spec->gen.no_analog && spec->gen.beep_nid) {
10101                switch (codec->core.vendor_id) {
10102                case 0x10ec0662:
10103                        err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
10104                        break;
10105                case 0x10ec0272:
10106                case 0x10ec0663:
10107                case 0x10ec0665:
10108                case 0x10ec0668:
10109                        err = set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
10110                        break;
10111                case 0x10ec0273:
10112                        err = set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
10113                        break;
10114                }
10115                if (err < 0)
10116                        goto error;
10117        }
10118
10119        snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
10120
10121        return 0;
10122
10123 error:
10124        alc_free(codec);
10125        return err;
10126}
10127
10128/*
10129 * ALC680 support
10130 */
10131
10132static int alc680_parse_auto_config(struct hda_codec *codec)
10133{
10134        return alc_parse_auto_config(codec, NULL, NULL);
10135}
10136
10137/*
10138 */
10139static int patch_alc680(struct hda_codec *codec)
10140{
10141        int err;
10142
10143        /* ALC680 has no aa-loopback mixer */
10144        err = alc_alloc_spec(codec, 0);
10145        if (err < 0)
10146                return err;
10147
10148        /* automatic parse from the BIOS config */
10149        err = alc680_parse_auto_config(codec);
10150        if (err < 0) {
10151                alc_free(codec);
10152                return err;
10153        }
10154
10155        return 0;
10156}
10157
10158/*
10159 * patch entries
10160 */
10161static const struct hda_device_id snd_hda_id_realtek[] = {
10162        HDA_CODEC_ENTRY(0x10ec0215, "ALC215", patch_alc269),
10163        HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269),
10164        HDA_CODEC_ENTRY(0x10ec0222, "ALC222", patch_alc269),
10165        HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269),
10166        HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269),
10167        HDA_CODEC_ENTRY(0x10ec0233, "ALC233", patch_alc269),
10168        HDA_CODEC_ENTRY(0x10ec0234, "ALC234", patch_alc269),
10169        HDA_CODEC_ENTRY(0x10ec0235, "ALC233", patch_alc269),
10170        HDA_CODEC_ENTRY(0x10ec0236, "ALC236", patch_alc269),
10171        HDA_CODEC_ENTRY(0x10ec0245, "ALC245", patch_alc269),
10172        HDA_CODEC_ENTRY(0x10ec0255, "ALC255", patch_alc269),
10173        HDA_CODEC_ENTRY(0x10ec0256, "ALC256", patch_alc269),
10174        HDA_CODEC_ENTRY(0x10ec0257, "ALC257", patch_alc269),
10175        HDA_CODEC_ENTRY(0x10ec0260, "ALC260", patch_alc260),
10176        HDA_CODEC_ENTRY(0x10ec0262, "ALC262", patch_alc262),
10177        HDA_CODEC_ENTRY(0x10ec0267, "ALC267", patch_alc268),
10178        HDA_CODEC_ENTRY(0x10ec0268, "ALC268", patch_alc268),
10179        HDA_CODEC_ENTRY(0x10ec0269, "ALC269", patch_alc269),
10180        HDA_CODEC_ENTRY(0x10ec0270, "ALC270", patch_alc269),
10181        HDA_CODEC_ENTRY(0x10ec0272, "ALC272", patch_alc662),
10182        HDA_CODEC_ENTRY(0x10ec0274, "ALC274", patch_alc269),
10183        HDA_CODEC_ENTRY(0x10ec0275, "ALC275", patch_alc269),
10184        HDA_CODEC_ENTRY(0x10ec0276, "ALC276", patch_alc269),
10185        HDA_CODEC_ENTRY(0x10ec0280, "ALC280", patch_alc269),
10186        HDA_CODEC_ENTRY(0x10ec0282, "ALC282", patch_alc269),
10187        HDA_CODEC_ENTRY(0x10ec0283, "ALC283", patch_alc269),
10188        HDA_CODEC_ENTRY(0x10ec0284, "ALC284", patch_alc269),
10189        HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269),
10190        HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269),
10191        HDA_CODEC_ENTRY(0x10ec0287, "ALC287", patch_alc269),
10192        HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269),
10193        HDA_CODEC_ENTRY(0x10ec0289, "ALC289", patch_alc269),
10194        HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269),
10195        HDA_CODEC_ENTRY(0x10ec0292, "ALC292", patch_alc269),
10196        HDA_CODEC_ENTRY(0x10ec0293, "ALC293", patch_alc269),
10197        HDA_CODEC_ENTRY(0x10ec0294, "ALC294", patch_alc269),
10198        HDA_CODEC_ENTRY(0x10ec0295, "ALC295", patch_alc269),
10199        HDA_CODEC_ENTRY(0x10ec0298, "ALC298", patch_alc269),
10200        HDA_CODEC_ENTRY(0x10ec0299, "ALC299", patch_alc269),
10201        HDA_CODEC_ENTRY(0x10ec0300, "ALC300", patch_alc269),
10202        HDA_CODEC_ENTRY(0x10ec0623, "ALC623", patch_alc269),
10203        HDA_CODEC_REV_ENTRY(0x10ec0861, 0x100340, "ALC660", patch_alc861),
10204        HDA_CODEC_ENTRY(0x10ec0660, "ALC660-VD", patch_alc861vd),
10205        HDA_CODEC_ENTRY(0x10ec0861, "ALC861", patch_alc861),
10206        HDA_CODEC_ENTRY(0x10ec0862, "ALC861-VD", patch_alc861vd),
10207        HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100002, "ALC662 rev2", patch_alc882),
10208        HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100101, "ALC662 rev1", patch_alc662),
10209        HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100300, "ALC662 rev3", patch_alc662),
10210        HDA_CODEC_ENTRY(0x10ec0663, "ALC663", patch_alc662),
10211        HDA_CODEC_ENTRY(0x10ec0665, "ALC665", patch_alc662),
10212        HDA_CODEC_ENTRY(0x10ec0667, "ALC667", patch_alc662),
10213        HDA_CODEC_ENTRY(0x10ec0668, "ALC668", patch_alc662),
10214        HDA_CODEC_ENTRY(0x10ec0670, "ALC670", patch_alc662),
10215        HDA_CODEC_ENTRY(0x10ec0671, "ALC671", patch_alc662),
10216        HDA_CODEC_ENTRY(0x10ec0680, "ALC680", patch_alc680),
10217        HDA_CODEC_ENTRY(0x10ec0700, "ALC700", patch_alc269),
10218        HDA_CODEC_ENTRY(0x10ec0701, "ALC701", patch_alc269),
10219        HDA_CODEC_ENTRY(0x10ec0703, "ALC703", patch_alc269),
10220        HDA_CODEC_ENTRY(0x10ec0711, "ALC711", patch_alc269),
10221        HDA_CODEC_ENTRY(0x10ec0867, "ALC891", patch_alc662),
10222        HDA_CODEC_ENTRY(0x10ec0880, "ALC880", patch_alc880),
10223        HDA_CODEC_ENTRY(0x10ec0882, "ALC882", patch_alc882),
10224        HDA_CODEC_ENTRY(0x10ec0883, "ALC883", patch_alc882),
10225        HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100101, "ALC889A", patch_alc882),
10226        HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100103, "ALC889A", patch_alc882),
10227        HDA_CODEC_ENTRY(0x10ec0885, "ALC885", patch_alc882),
10228        HDA_CODEC_ENTRY(0x10ec0887, "ALC887", patch_alc882),
10229        HDA_CODEC_REV_ENTRY(0x10ec0888, 0x100101, "ALC1200", patch_alc882),
10230        HDA_CODEC_ENTRY(0x10ec0888, "ALC888", patch_alc882),
10231        HDA_CODEC_ENTRY(0x10ec0889, "ALC889", patch_alc882),
10232        HDA_CODEC_ENTRY(0x10ec0892, "ALC892", patch_alc662),
10233        HDA_CODEC_ENTRY(0x10ec0897, "ALC897", patch_alc662),
10234        HDA_CODEC_ENTRY(0x10ec0899, "ALC898", patch_alc882),
10235        HDA_CODEC_ENTRY(0x10ec0900, "ALC1150", patch_alc882),
10236        HDA_CODEC_ENTRY(0x10ec0b00, "ALCS1200A", patch_alc882),
10237        HDA_CODEC_ENTRY(0x10ec1168, "ALC1220", patch_alc882),
10238        HDA_CODEC_ENTRY(0x10ec1220, "ALC1220", patch_alc882),
10239        {} /* terminator */
10240};
10241MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_realtek);
10242
10243MODULE_LICENSE("GPL");
10244MODULE_DESCRIPTION("Realtek HD-audio codec");
10245
10246static struct hda_codec_driver realtek_driver = {
10247        .id = snd_hda_id_realtek,
10248};
10249
10250module_hda_codec_driver(realtek_driver);
10251