cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

patch_realtek.c (372704B)


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